liquid_feedback_frontend
annotate model/member.lua @ 5:afd9f769c7ae
Version beta1
Final voting with Schulze-Method is now possible
Many bug fixes and code cleanup
Registration with invite codes
More sort and filter options
Seperated display of "supporters" and "potential supporters"
Optical changes
Flood limit / initiative contigent is now checked by frontend
Neccessary changes to access core beta11
Final voting with Schulze-Method is now possible
Many bug fixes and code cleanup
Registration with invite codes
More sort and filter options
Seperated display of "supporters" and "potential supporters"
Optical changes
Flood limit / initiative contigent is now checked by frontend
Neccessary changes to access core beta11
| author | bsw/jbe | 
|---|---|
| date | Fri Dec 25 12:00:00 2009 +0100 (2009-12-25) | 
| parents | 80c215dbf076 | 
| children | 8d91bccab0bf | 
| rev | line source | 
|---|---|
| bsw/jbe@0 | 1 Member = mondelefant.new_class() | 
| bsw/jbe@0 | 2 Member.table = 'member' | 
| bsw/jbe@0 | 3 | 
| bsw/jbe@0 | 4 Member:add_reference{ | 
| bsw/jbe@4 | 5 mode = '1m', | 
| bsw@2 | 6 to = "MemberImage", | 
| bsw@2 | 7 this_key = 'id', | 
| bsw@2 | 8 that_key = 'member_id', | 
| bsw/jbe@4 | 9 ref = 'images', | 
| bsw@2 | 10 back_ref = 'member' | 
| bsw@2 | 11 } | 
| bsw@2 | 12 | 
| bsw@2 | 13 Member:add_reference{ | 
| bsw/jbe@0 | 14 mode = '1m', | 
| bsw/jbe@0 | 15 to = "Contact", | 
| bsw/jbe@0 | 16 this_key = 'id', | 
| bsw/jbe@0 | 17 that_key = 'member_id', | 
| bsw/jbe@0 | 18 ref = 'contacts', | 
| bsw/jbe@0 | 19 back_ref = 'member', | 
| bsw/jbe@0 | 20 default_order = '"other_member_id"' | 
| bsw/jbe@0 | 21 } | 
| bsw/jbe@0 | 22 | 
| bsw/jbe@0 | 23 Member:add_reference{ | 
| bsw/jbe@0 | 24 mode = '1m', | 
| bsw/jbe@0 | 25 to = "Contact", | 
| bsw/jbe@0 | 26 this_key = 'id', | 
| bsw/jbe@0 | 27 that_key = 'member_id', | 
| bsw/jbe@0 | 28 ref = 'foreign_contacts', | 
| bsw/jbe@0 | 29 back_ref = 'other_member', | 
| bsw/jbe@0 | 30 default_order = '"member_id"' | 
| bsw/jbe@0 | 31 } | 
| bsw/jbe@0 | 32 | 
| bsw/jbe@0 | 33 Member:add_reference{ | 
| bsw/jbe@0 | 34 mode = '1m', | 
| bsw/jbe@0 | 35 to = "Session", | 
| bsw/jbe@0 | 36 this_key = 'id', | 
| bsw/jbe@0 | 37 that_key = 'member_id', | 
| bsw/jbe@0 | 38 ref = 'sessions', | 
| bsw/jbe@0 | 39 back_ref = 'member', | 
| bsw/jbe@0 | 40 default_order = '"ident"' | 
| bsw/jbe@0 | 41 } | 
| bsw/jbe@0 | 42 | 
| bsw/jbe@0 | 43 Member:add_reference{ | 
| bsw/jbe@0 | 44 mode = '1m', | 
| bsw/jbe@0 | 45 to = "Draft", | 
| bsw/jbe@0 | 46 this_key = 'id', | 
| bsw/jbe@0 | 47 that_key = 'author_id', | 
| bsw/jbe@0 | 48 ref = 'drafts', | 
| bsw/jbe@0 | 49 back_ref = 'author', | 
| bsw/jbe@0 | 50 default_order = '"id"' | 
| bsw/jbe@0 | 51 } | 
| bsw/jbe@0 | 52 | 
| bsw/jbe@0 | 53 Member:add_reference{ | 
| bsw/jbe@0 | 54 mode = '1m', | 
| bsw/jbe@0 | 55 to = "Suggestion", | 
| bsw/jbe@0 | 56 this_key = 'id', | 
| bsw/jbe@0 | 57 that_key = 'author_id', | 
| bsw/jbe@0 | 58 ref = 'suggestions', | 
| bsw/jbe@0 | 59 back_ref = 'author', | 
| bsw/jbe@0 | 60 default_order = '"id"' | 
| bsw/jbe@0 | 61 } | 
| bsw/jbe@0 | 62 | 
| bsw/jbe@0 | 63 Member:add_reference{ | 
| bsw/jbe@0 | 64 mode = '1m', | 
| bsw/jbe@0 | 65 to = "Membership", | 
| bsw/jbe@0 | 66 this_key = 'id', | 
| bsw/jbe@0 | 67 that_key = 'member_id', | 
| bsw/jbe@0 | 68 ref = 'memberships', | 
| bsw/jbe@0 | 69 back_ref = 'member', | 
| bsw/jbe@0 | 70 default_order = '"area_id"' | 
| bsw/jbe@0 | 71 } | 
| bsw/jbe@0 | 72 | 
| bsw/jbe@0 | 73 Member:add_reference{ | 
| bsw/jbe@0 | 74 mode = '1m', | 
| bsw/jbe@0 | 75 to = "Interest", | 
| bsw/jbe@0 | 76 this_key = 'id', | 
| bsw/jbe@0 | 77 that_key = 'member_id', | 
| bsw/jbe@0 | 78 ref = 'interests', | 
| bsw/jbe@0 | 79 back_ref = 'member', | 
| bsw/jbe@0 | 80 default_order = '"id"' | 
| bsw/jbe@0 | 81 } | 
| bsw/jbe@0 | 82 | 
| bsw/jbe@0 | 83 Member:add_reference{ | 
| bsw/jbe@0 | 84 mode = '1m', | 
| bsw/jbe@0 | 85 to = "Initiator", | 
| bsw/jbe@0 | 86 this_key = 'id', | 
| bsw/jbe@0 | 87 that_key = 'member_id', | 
| bsw/jbe@0 | 88 ref = 'initiators', | 
| bsw/jbe@0 | 89 back_ref = 'member', | 
| bsw/jbe@0 | 90 default_order = '"id"' | 
| bsw/jbe@0 | 91 } | 
| bsw/jbe@0 | 92 | 
| bsw/jbe@0 | 93 Member:add_reference{ | 
| bsw/jbe@0 | 94 mode = '1m', | 
| bsw/jbe@0 | 95 to = "Supporter", | 
| bsw/jbe@0 | 96 this_key = 'id', | 
| bsw/jbe@0 | 97 that_key = 'member_id', | 
| bsw/jbe@0 | 98 ref = 'supporters', | 
| bsw@2 | 99 back_ref = 'member' | 
| bsw/jbe@0 | 100 } | 
| bsw/jbe@0 | 101 | 
| bsw/jbe@0 | 102 Member:add_reference{ | 
| bsw/jbe@0 | 103 mode = '1m', | 
| bsw/jbe@0 | 104 to = "Opinion", | 
| bsw/jbe@0 | 105 this_key = 'id', | 
| bsw/jbe@0 | 106 that_key = 'member_id', | 
| bsw/jbe@0 | 107 ref = 'opinions', | 
| bsw/jbe@0 | 108 back_ref = 'member', | 
| bsw/jbe@0 | 109 default_order = '"id"' | 
| bsw/jbe@0 | 110 } | 
| bsw/jbe@0 | 111 | 
| bsw/jbe@0 | 112 Member:add_reference{ | 
| bsw/jbe@0 | 113 mode = '1m', | 
| bsw/jbe@0 | 114 to = "Delegation", | 
| bsw/jbe@0 | 115 this_key = 'id', | 
| bsw/jbe@0 | 116 that_key = 'truster_id', | 
| bsw/jbe@0 | 117 ref = 'outgoing_delegations', | 
| bsw/jbe@0 | 118 back_ref = 'truster', | 
| bsw/jbe@0 | 119 default_order = '"id"' | 
| bsw/jbe@0 | 120 } | 
| bsw/jbe@0 | 121 | 
| bsw/jbe@0 | 122 Member:add_reference{ | 
| bsw/jbe@0 | 123 mode = '1m', | 
| bsw/jbe@0 | 124 to = "Delegation", | 
| bsw/jbe@0 | 125 this_key = 'id', | 
| bsw/jbe@0 | 126 that_key = 'trustee_id', | 
| bsw/jbe@0 | 127 ref = 'incoming_delegations', | 
| bsw/jbe@0 | 128 back_ref = 'trustee', | 
| bsw/jbe@0 | 129 default_order = '"id"' | 
| bsw/jbe@0 | 130 } | 
| bsw/jbe@0 | 131 | 
| bsw/jbe@0 | 132 Member:add_reference{ | 
| bsw/jbe@0 | 133 mode = '1m', | 
| bsw/jbe@0 | 134 to = "DirectVoter", | 
| bsw/jbe@0 | 135 this_key = 'id', | 
| bsw/jbe@0 | 136 that_key = 'member_id', | 
| bsw/jbe@0 | 137 ref = 'direct_voter', | 
| bsw/jbe@0 | 138 back_ref = 'member', | 
| bsw/jbe@0 | 139 default_order = '"issue_id"' | 
| bsw/jbe@0 | 140 } | 
| bsw/jbe@0 | 141 | 
| bsw/jbe@0 | 142 Member:add_reference{ | 
| bsw/jbe@0 | 143 mode = '1m', | 
| bsw/jbe@0 | 144 to = "Vote", | 
| bsw/jbe@0 | 145 this_key = 'id', | 
| bsw/jbe@0 | 146 that_key = 'member_id', | 
| bsw/jbe@0 | 147 ref = 'vote', | 
| bsw/jbe@0 | 148 back_ref = 'member', | 
| bsw/jbe@0 | 149 default_order = '"issue_id", "initiative_id"' | 
| bsw/jbe@0 | 150 } | 
| bsw/jbe@0 | 151 | 
| bsw/jbe@0 | 152 Member:add_reference{ | 
| bsw/jbe@0 | 153 mode = 'mm', | 
| bsw/jbe@0 | 154 to = "Member", | 
| bsw/jbe@0 | 155 this_key = 'id', | 
| bsw/jbe@0 | 156 that_key = 'id', | 
| bsw/jbe@0 | 157 connected_by_table = 'contact', | 
| bsw/jbe@0 | 158 connected_by_this_key = 'member_id', | 
| bsw/jbe@0 | 159 connected_by_that_key = 'other_member_id', | 
| bsw/jbe@0 | 160 ref = 'saved_members', | 
| bsw/jbe@0 | 161 } | 
| bsw/jbe@0 | 162 | 
| bsw/jbe@0 | 163 Member:add_reference{ | 
| bsw/jbe@0 | 164 mode = 'mm', | 
| bsw/jbe@0 | 165 to = "Member", | 
| bsw/jbe@0 | 166 this_key = 'id', | 
| bsw/jbe@0 | 167 that_key = 'id', | 
| bsw/jbe@0 | 168 connected_by_table = 'contact', | 
| bsw/jbe@0 | 169 connected_by_this_key = 'other_member_id', | 
| bsw/jbe@0 | 170 connected_by_that_key = 'member_id', | 
| bsw/jbe@0 | 171 ref = 'saved_by_members', | 
| bsw/jbe@0 | 172 } | 
| bsw/jbe@0 | 173 | 
| bsw/jbe@0 | 174 Member:add_reference{ | 
| bsw/jbe@0 | 175 mode = 'mm', | 
| bsw/jbe@0 | 176 to = "Area", | 
| bsw/jbe@0 | 177 this_key = 'id', | 
| bsw/jbe@0 | 178 that_key = 'id', | 
| bsw/jbe@0 | 179 connected_by_table = 'membership', | 
| bsw/jbe@0 | 180 connected_by_this_key = 'member_id', | 
| bsw/jbe@0 | 181 connected_by_that_key = 'area_id', | 
| bsw/jbe@0 | 182 ref = 'areas' | 
| bsw/jbe@0 | 183 } | 
| bsw/jbe@0 | 184 | 
| bsw/jbe@0 | 185 Member:add_reference{ | 
| bsw/jbe@0 | 186 mode = 'mm', | 
| bsw/jbe@0 | 187 to = "Issue", | 
| bsw/jbe@0 | 188 this_key = 'id', | 
| bsw/jbe@0 | 189 that_key = 'id', | 
| bsw/jbe@0 | 190 connected_by_table = 'interest', | 
| bsw/jbe@0 | 191 connected_by_this_key = 'member_id', | 
| bsw/jbe@0 | 192 connected_by_that_key = 'issue_id', | 
| bsw/jbe@0 | 193 ref = 'issues' | 
| bsw/jbe@0 | 194 } | 
| bsw/jbe@0 | 195 | 
| bsw/jbe@0 | 196 Member:add_reference{ | 
| bsw/jbe@0 | 197 mode = 'mm', | 
| bsw/jbe@0 | 198 to = "Initiative", | 
| bsw/jbe@0 | 199 this_key = 'id', | 
| bsw/jbe@0 | 200 that_key = 'id', | 
| bsw/jbe@0 | 201 connected_by_table = 'initiator', | 
| bsw/jbe@0 | 202 connected_by_this_key = 'member_id', | 
| bsw/jbe@0 | 203 connected_by_that_key = 'initiative_id', | 
| bsw/jbe@0 | 204 ref = 'initiated_initiatives' | 
| bsw/jbe@0 | 205 } | 
| bsw/jbe@0 | 206 | 
| bsw/jbe@0 | 207 Member:add_reference{ | 
| bsw/jbe@0 | 208 mode = 'mm', | 
| bsw/jbe@0 | 209 to = "Initiative", | 
| bsw/jbe@0 | 210 this_key = 'id', | 
| bsw/jbe@0 | 211 that_key = 'id', | 
| bsw/jbe@0 | 212 connected_by_table = 'supporter', | 
| bsw/jbe@0 | 213 connected_by_this_key = 'member_id', | 
| bsw/jbe@0 | 214 connected_by_that_key = 'initiative_id', | 
| bsw/jbe@0 | 215 ref = 'supported_initiatives' | 
| bsw/jbe@0 | 216 } | 
| bsw/jbe@0 | 217 | 
| bsw/jbe@0 | 218 function Member.object:set_password(password) | 
| bsw/jbe@0 | 219 local hash = os.crypt( | 
| bsw/jbe@0 | 220 password, | 
| bsw/jbe@0 | 221 "$1$" .. multirand.string( | 
| bsw/jbe@0 | 222 8, | 
| bsw/jbe@0 | 223 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./" | 
| bsw/jbe@0 | 224 ) | 
| bsw/jbe@0 | 225 ) | 
| bsw/jbe@0 | 226 assert(hash, "os.crypt failed") | 
| bsw/jbe@0 | 227 self.password = hash | 
| bsw/jbe@0 | 228 end | 
| bsw/jbe@0 | 229 | 
| bsw/jbe@0 | 230 function Member.object:check_password(password) | 
| bsw/jbe@0 | 231 if type(password) == "string" and type(self.password) == "string" then | 
| bsw/jbe@0 | 232 return os.crypt(password, self.password) == self.password | 
| bsw/jbe@0 | 233 else | 
| bsw/jbe@0 | 234 return false | 
| bsw/jbe@0 | 235 end | 
| bsw/jbe@0 | 236 end | 
| bsw/jbe@0 | 237 | 
| bsw/jbe@0 | 238 function Member.object_get:published_contacts() | 
| bsw/jbe@0 | 239 return Member:new_selector() | 
| bsw/jbe@0 | 240 :join('"contact"', nil, '"contact"."other_member_id" = "member"."id"') | 
| bsw/jbe@0 | 241 :add_where{ '"contact"."member_id" = ?', self.id } | 
| bsw/jbe@0 | 242 :add_where("public") | 
| bsw/jbe@0 | 243 :exec() | 
| bsw/jbe@0 | 244 end | 
| bsw/jbe@0 | 245 | 
| bsw/jbe@0 | 246 function Member:by_login_and_password(login, password) | 
| bsw/jbe@0 | 247 local selector = self:new_selector() | 
| bsw/jbe@5 | 248 selector:add_where{'"login" = ?', login } | 
| bsw/jbe@0 | 249 selector:add_where('"active"') | 
| bsw/jbe@0 | 250 selector:optional_object_mode() | 
| bsw/jbe@0 | 251 local member = selector:exec() | 
| bsw/jbe@0 | 252 if member and member:check_password(password) then | 
| bsw/jbe@0 | 253 return member | 
| bsw/jbe@0 | 254 else | 
| bsw/jbe@0 | 255 return nil | 
| bsw/jbe@0 | 256 end | 
| bsw/jbe@0 | 257 end | 
| bsw/jbe@0 | 258 | 
| bsw/jbe@5 | 259 function Member:by_login(login) | 
| bsw/jbe@5 | 260 local selector = self:new_selector() | 
| bsw/jbe@5 | 261 selector:add_where{'"login" = ?', login } | 
| bsw/jbe@5 | 262 selector:optional_object_mode() | 
| bsw/jbe@5 | 263 return selector:exec() | 
| bsw/jbe@5 | 264 end | 
| bsw/jbe@5 | 265 | 
| bsw/jbe@5 | 266 function Member:by_name(name) | 
| bsw/jbe@5 | 267 local selector = self:new_selector() | 
| bsw/jbe@5 | 268 selector:add_where{'"name" = ?', name } | 
| bsw/jbe@5 | 269 selector:optional_object_mode() | 
| bsw/jbe@5 | 270 return selector:exec() | 
| bsw/jbe@5 | 271 end | 
| bsw/jbe@5 | 272 | 
| bsw@2 | 273 function Member:get_search_selector(search_string) | 
| bsw/jbe@0 | 274 return self:new_selector() | 
| bsw@2 | 275 :add_field( {'"highlight"("member"."name", ?)', search_string }, "name_highlighted") | 
| bsw@2 | 276 :add_where{ '"member"."text_search_data" @@ "text_search_query"(?)', search_string } | 
| bsw/jbe@0 | 277 :add_where("active") | 
| bsw/jbe@0 | 278 end | 
| bsw@2 | 279 |