liquid_feedback_frontend
view model/member.lua @ 6:8d91bccab0bf
Version beta2
Possibility to browse voters of a closed issue
Registration with invite code
Email confirmation and password recovery
Download function (for database dumps) added
Critical bug solved, which made it impossible to select your opinion on other peoples suggestions
Catching error, when trying to set an opinion on a suggestion which has been meanwhile deleted
Fixed wrong sorting order for "supporters" or "potential supporters"
Added format info for birthday (Error when entering dates in wrong format is NOT fixed in this release)
Strip space characters from certain fields and ensure they contain at least 3 characters
Showing grade in opinion/list as clear text instead of integer value
More information on initiative is displayed while voting
Colored notification box shown on pages of issues or initiatives which are currently in voting state
Changed default filter for issues to "Open"
Back link on suggestion page
Some optical changes
Removed wrong space character in LICENSE file
Possibility to browse voters of a closed issue
Registration with invite code
Email confirmation and password recovery
Download function (for database dumps) added
Critical bug solved, which made it impossible to select your opinion on other peoples suggestions
Catching error, when trying to set an opinion on a suggestion which has been meanwhile deleted
Fixed wrong sorting order for "supporters" or "potential supporters"
Added format info for birthday (Error when entering dates in wrong format is NOT fixed in this release)
Strip space characters from certain fields and ensure they contain at least 3 characters
Showing grade in opinion/list as clear text instead of integer value
More information on initiative is displayed while voting
Colored notification box shown on pages of issues or initiatives which are currently in voting state
Changed default filter for issues to "Open"
Back link on suggestion page
Some optical changes
Removed wrong space character in LICENSE file
| author | bsw/jbe | 
|---|---|
| date | Sat Jan 02 12:00:00 2010 +0100 (2010-01-02) | 
| parents | afd9f769c7ae | 
| children | 0ee1e0c42d4c | 
 line source
     1 Member = mondelefant.new_class()
     2 Member.table = 'member'
     4 Member:add_reference{
     5   mode          = '1m',
     6   to            = "MemberImage",
     7   this_key      = 'id',
     8   that_key      = 'member_id',
     9   ref           = 'images',
    10   back_ref      = 'member'
    11 }
    13 Member:add_reference{
    14   mode          = '1m',
    15   to            = "Contact",
    16   this_key      = 'id',
    17   that_key      = 'member_id',
    18   ref           = 'contacts',
    19   back_ref      = 'member',
    20   default_order = '"other_member_id"'
    21 }
    23 Member:add_reference{
    24   mode          = '1m',
    25   to            = "Contact",
    26   this_key      = 'id',
    27   that_key      = 'member_id',
    28   ref           = 'foreign_contacts',
    29   back_ref      = 'other_member',
    30   default_order = '"member_id"'
    31 }
    33 Member:add_reference{
    34   mode          = '1m',
    35   to            = "Session",
    36   this_key      = 'id',
    37   that_key      = 'member_id',
    38   ref           = 'sessions',
    39   back_ref      = 'member',
    40   default_order = '"ident"'
    41 }
    43 Member:add_reference{
    44   mode          = '1m',
    45   to            = "Draft",
    46   this_key      = 'id',
    47   that_key      = 'author_id',
    48   ref           = 'drafts',
    49   back_ref      = 'author',
    50   default_order = '"id"'
    51 }
    53 Member:add_reference{
    54   mode          = '1m',
    55   to            = "Suggestion",
    56   this_key      = 'id',
    57   that_key      = 'author_id',
    58   ref           = 'suggestions',
    59   back_ref      = 'author',
    60   default_order = '"id"'
    61 }
    63 Member:add_reference{
    64   mode          = '1m',
    65   to            = "Membership",
    66   this_key      = 'id',
    67   that_key      = 'member_id',
    68   ref           = 'memberships',
    69   back_ref      = 'member',
    70   default_order = '"area_id"'
    71 }
    73 Member:add_reference{
    74   mode          = '1m',
    75   to            = "Interest",
    76   this_key      = 'id',
    77   that_key      = 'member_id',
    78   ref           = 'interests',
    79   back_ref      = 'member',
    80   default_order = '"id"'
    81 }
    83 Member:add_reference{
    84   mode          = '1m',
    85   to            = "Initiator",
    86   this_key      = 'id',
    87   that_key      = 'member_id',
    88   ref           = 'initiators',
    89   back_ref      = 'member',
    90   default_order = '"id"'
    91 }
    93 Member:add_reference{
    94   mode          = '1m',
    95   to            = "Supporter",
    96   this_key      = 'id',
    97   that_key      = 'member_id',
    98   ref           = 'supporters',
    99   back_ref      = 'member'
   100 }
   102 Member:add_reference{
   103   mode          = '1m',
   104   to            = "Opinion",
   105   this_key      = 'id',
   106   that_key      = 'member_id',
   107   ref           = 'opinions',
   108   back_ref      = 'member',
   109   default_order = '"id"'
   110 }
   112 Member:add_reference{
   113   mode          = '1m',
   114   to            = "Delegation",
   115   this_key      = 'id',
   116   that_key      = 'truster_id',
   117   ref           = 'outgoing_delegations',
   118   back_ref      = 'truster',
   119   default_order = '"id"'
   120 }
   122 Member:add_reference{
   123   mode          = '1m',
   124   to            = "Delegation",
   125   this_key      = 'id',
   126   that_key      = 'trustee_id',
   127   ref           = 'incoming_delegations',
   128   back_ref      = 'trustee',
   129   default_order = '"id"'
   130 }
   132 Member:add_reference{
   133   mode          = '1m',
   134   to            = "DirectVoter",
   135   this_key      = 'id',
   136   that_key      = 'member_id',
   137   ref           = 'direct_voter',
   138   back_ref      = 'member',
   139   default_order = '"issue_id"'
   140 }
   142 Member:add_reference{
   143   mode          = '1m',
   144   to            = "Vote",
   145   this_key      = 'id',
   146   that_key      = 'member_id',
   147   ref           = 'vote',
   148   back_ref      = 'member',
   149   default_order = '"issue_id", "initiative_id"'
   150 }
   152 Member:add_reference{
   153   mode                  = 'mm',
   154   to                    = "Member",
   155   this_key              = 'id',
   156   that_key              = 'id',
   157   connected_by_table    = 'contact',
   158   connected_by_this_key = 'member_id',
   159   connected_by_that_key = 'other_member_id',
   160   ref                   = 'saved_members',
   161 }
   163 Member:add_reference{
   164   mode                  = 'mm',
   165   to                    = "Member",
   166   this_key              = 'id',
   167   that_key              = 'id',
   168   connected_by_table    = 'contact',
   169   connected_by_this_key = 'other_member_id',
   170   connected_by_that_key = 'member_id',
   171   ref                   = 'saved_by_members',
   172 }
   174 Member:add_reference{
   175   mode                  = 'mm',
   176   to                    = "Area",
   177   this_key              = 'id',
   178   that_key              = 'id',
   179   connected_by_table    = 'membership',
   180   connected_by_this_key = 'member_id',
   181   connected_by_that_key = 'area_id',
   182   ref                   = 'areas'
   183 }
   185 Member:add_reference{
   186   mode                  = 'mm',
   187   to                    = "Issue",
   188   this_key              = 'id',
   189   that_key              = 'id',
   190   connected_by_table    = 'interest',
   191   connected_by_this_key = 'member_id',
   192   connected_by_that_key = 'issue_id',
   193   ref                   = 'issues'
   194 }
   196 Member:add_reference{
   197   mode                  = 'mm',
   198   to                    = "Initiative",
   199   this_key              = 'id',
   200   that_key              = 'id',
   201   connected_by_table    = 'initiator',
   202   connected_by_this_key = 'member_id',
   203   connected_by_that_key = 'initiative_id',
   204   ref                   = 'initiated_initiatives'
   205 }
   207 Member:add_reference{
   208   mode                  = 'mm',
   209   to                    = "Initiative",
   210   this_key              = 'id',
   211   that_key              = 'id',
   212   connected_by_table    = 'supporter',
   213   connected_by_this_key = 'member_id',
   214   connected_by_that_key = 'initiative_id',
   215   ref                   = 'supported_initiatives'
   216 }
   218 function Member.object:set_password(password)
   219   local hash = os.crypt(
   220     password,
   221     "$1$" .. multirand.string(
   222       8,
   223       "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./"
   224     )
   225   )
   226   assert(hash, "os.crypt failed")
   227   self.password = hash
   228 end
   230 function Member.object:check_password(password)
   231   if type(password) == "string" and type(self.password) == "string" then
   232     return os.crypt(password, self.password) == self.password
   233   else
   234     return false
   235   end
   236 end
   238 function Member.object_get:published_contacts()
   239   return Member:new_selector()
   240     :join('"contact"', nil, '"contact"."other_member_id" = "member"."id"')
   241     :add_where{ '"contact"."member_id" = ?', self.id }
   242     :add_where("public")
   243     :exec()
   244 end
   246 function Member:by_login_and_password(login, password)
   247   local selector = self:new_selector()
   248   selector:add_where{'"login" = ?', login }
   249   selector:add_where('"active"')
   250   selector:optional_object_mode()
   251   local member = selector:exec()
   252   if member and member:check_password(password) then
   253     return member
   254   else
   255     return nil
   256   end
   257 end
   259 function Member:by_login(login)
   260   local selector = self:new_selector()
   261   selector:add_where{'"login" = ?', login }
   262   selector:optional_object_mode()
   263   return selector:exec()
   264 end
   266 function Member:by_name(name)
   267   local selector = self:new_selector()
   268   selector:add_where{'"name" = ?', name }
   269   selector:optional_object_mode()
   270   return selector:exec()
   271 end
   273 function Member:get_search_selector(search_string)
   274   return self:new_selector()
   275     :add_field( {'"highlight"("member"."name", ?)', search_string }, "name_highlighted")
   276     :add_where{ '"member"."text_search_data" @@ "text_search_query"(?)', search_string }
   277     :add_where("active")
   278 end
   280 function Member.object:set_notify_email(notify_email)
   281   local expiry = db:query("SELECT now() + '7 days'::interval as expiry", "object").expiry
   282   self.notify_email_unconfirmed = notify_email
   283   self.notify_email_secret = multirand.string( 24, "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" )
   284   self.notify_email_secret_expiry = expiry
   285   local content = slot.use_temporary(function()
   286     slot.put(_"Hello " .. self.name .. ",\n\n")
   287     slot.put(_"Please confirm your email address by clicking the following link:\n\n")
   288     slot.put(config.absolute_base_url .. "index/confirm_notify_email.html?secret=" .. self.notify_email_secret .. "\n\n")
   289     slot.put(_"If this link is not working, please open following url in your web browser:\n\n")
   290     slot.put(config.absolute_base_url .. "index/confirm_notify_email.html\n\n")
   291     slot.put(_"On that page please enter the confirmation code:\n\n")
   292     slot.put(self.notify_email_secret .. "\n\n")
   293   end)
   294   local success = net.send_mail{
   295     envelope_from = config.mail_envelope_from,
   296     from          = config.mail_from,
   297     reply_to      = config.mail_reply_to,
   298     to            = self.notify_email_unconfirmed,
   299     subject       = config.mail_subject_prefix .. _"Email confirmation request",
   300     content_type  = "text/plain; charset=UTF-8",
   301     content       = content
   302   }
   303   return success
   304 end
