liquid_feedback_frontend
annotate model/member.lua @ 11:77d58efe99fd
Version beta7
Important security fixes:
- Added missing HTML encoding to postal address of member
- Link to discussion URL only if it starts with http(s)://
Other bugfixes:
- Fixed wrong display of 2nd level delegating voters for an initiative
- Do not display invited initiators as initiators while voting
- Added missing translation
New features:
- Public message of the day
- Both direct and indirect supporter count is shown in tab heads
- Support shown in initiative lists
Language chooser at the login page has been added (again)
Important security fixes:
- Added missing HTML encoding to postal address of member
- Link to discussion URL only if it starts with http(s)://
Other bugfixes:
- Fixed wrong display of 2nd level delegating voters for an initiative
- Do not display invited initiators as initiators while voting
- Added missing translation
New features:
- Public message of the day
- Both direct and indirect supporter count is shown in tab heads
- Support shown in initiative lists
Language chooser at the login page has been added (again)
author | bsw |
---|---|
date | Fri Jan 22 12:00:00 2010 +0100 (2010-01-22) |
parents | 72c5e0ee7c98 |
children | 00d1004545f1 |
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@9 | 5 mode = "1m", |
bsw@9 | 6 to = "MemberHistory", |
bsw@9 | 7 this_key = 'id', |
bsw@9 | 8 that_key = 'member_id', |
bsw@9 | 9 ref = 'history_entries', |
bsw@9 | 10 back_ref = 'member' |
bsw@9 | 11 } |
bsw@9 | 12 |
bsw@9 | 13 Member:add_reference{ |
bsw/jbe@4 | 14 mode = '1m', |
bsw@2 | 15 to = "MemberImage", |
bsw@2 | 16 this_key = 'id', |
bsw@2 | 17 that_key = 'member_id', |
bsw/jbe@4 | 18 ref = 'images', |
bsw@2 | 19 back_ref = 'member' |
bsw@2 | 20 } |
bsw@2 | 21 |
bsw@2 | 22 Member:add_reference{ |
bsw/jbe@0 | 23 mode = '1m', |
bsw/jbe@0 | 24 to = "Contact", |
bsw/jbe@0 | 25 this_key = 'id', |
bsw/jbe@0 | 26 that_key = 'member_id', |
bsw/jbe@0 | 27 ref = 'contacts', |
bsw/jbe@0 | 28 back_ref = 'member', |
bsw/jbe@0 | 29 default_order = '"other_member_id"' |
bsw/jbe@0 | 30 } |
bsw/jbe@0 | 31 |
bsw/jbe@0 | 32 Member:add_reference{ |
bsw/jbe@0 | 33 mode = '1m', |
bsw/jbe@0 | 34 to = "Contact", |
bsw/jbe@0 | 35 this_key = 'id', |
bsw/jbe@0 | 36 that_key = 'member_id', |
bsw/jbe@0 | 37 ref = 'foreign_contacts', |
bsw/jbe@0 | 38 back_ref = 'other_member', |
bsw/jbe@0 | 39 default_order = '"member_id"' |
bsw/jbe@0 | 40 } |
bsw/jbe@0 | 41 |
bsw/jbe@0 | 42 Member:add_reference{ |
bsw/jbe@0 | 43 mode = '1m', |
bsw/jbe@0 | 44 to = "Session", |
bsw/jbe@0 | 45 this_key = 'id', |
bsw/jbe@0 | 46 that_key = 'member_id', |
bsw/jbe@0 | 47 ref = 'sessions', |
bsw/jbe@0 | 48 back_ref = 'member', |
bsw/jbe@0 | 49 default_order = '"ident"' |
bsw/jbe@0 | 50 } |
bsw/jbe@0 | 51 |
bsw/jbe@0 | 52 Member:add_reference{ |
bsw/jbe@0 | 53 mode = '1m', |
bsw/jbe@0 | 54 to = "Draft", |
bsw/jbe@0 | 55 this_key = 'id', |
bsw/jbe@0 | 56 that_key = 'author_id', |
bsw/jbe@0 | 57 ref = 'drafts', |
bsw/jbe@0 | 58 back_ref = 'author', |
bsw/jbe@0 | 59 default_order = '"id"' |
bsw/jbe@0 | 60 } |
bsw/jbe@0 | 61 |
bsw/jbe@0 | 62 Member:add_reference{ |
bsw/jbe@0 | 63 mode = '1m', |
bsw/jbe@0 | 64 to = "Suggestion", |
bsw/jbe@0 | 65 this_key = 'id', |
bsw/jbe@0 | 66 that_key = 'author_id', |
bsw/jbe@0 | 67 ref = 'suggestions', |
bsw/jbe@0 | 68 back_ref = 'author', |
bsw/jbe@0 | 69 default_order = '"id"' |
bsw/jbe@0 | 70 } |
bsw/jbe@0 | 71 |
bsw/jbe@0 | 72 Member:add_reference{ |
bsw/jbe@0 | 73 mode = '1m', |
bsw/jbe@0 | 74 to = "Membership", |
bsw/jbe@0 | 75 this_key = 'id', |
bsw/jbe@0 | 76 that_key = 'member_id', |
bsw/jbe@0 | 77 ref = 'memberships', |
bsw/jbe@0 | 78 back_ref = 'member', |
bsw/jbe@0 | 79 default_order = '"area_id"' |
bsw/jbe@0 | 80 } |
bsw/jbe@0 | 81 |
bsw/jbe@0 | 82 Member:add_reference{ |
bsw/jbe@0 | 83 mode = '1m', |
bsw/jbe@0 | 84 to = "Interest", |
bsw/jbe@0 | 85 this_key = 'id', |
bsw/jbe@0 | 86 that_key = 'member_id', |
bsw/jbe@0 | 87 ref = 'interests', |
bsw/jbe@0 | 88 back_ref = 'member', |
bsw/jbe@0 | 89 default_order = '"id"' |
bsw/jbe@0 | 90 } |
bsw/jbe@0 | 91 |
bsw/jbe@0 | 92 Member:add_reference{ |
bsw/jbe@0 | 93 mode = '1m', |
bsw/jbe@0 | 94 to = "Initiator", |
bsw/jbe@0 | 95 this_key = 'id', |
bsw/jbe@0 | 96 that_key = 'member_id', |
bsw/jbe@0 | 97 ref = 'initiators', |
bsw@10 | 98 back_ref = 'member' |
bsw/jbe@0 | 99 } |
bsw/jbe@0 | 100 |
bsw/jbe@0 | 101 Member:add_reference{ |
bsw/jbe@0 | 102 mode = '1m', |
bsw/jbe@0 | 103 to = "Supporter", |
bsw/jbe@0 | 104 this_key = 'id', |
bsw/jbe@0 | 105 that_key = 'member_id', |
bsw/jbe@0 | 106 ref = 'supporters', |
bsw@2 | 107 back_ref = 'member' |
bsw/jbe@0 | 108 } |
bsw/jbe@0 | 109 |
bsw/jbe@0 | 110 Member:add_reference{ |
bsw/jbe@0 | 111 mode = '1m', |
bsw/jbe@0 | 112 to = "Opinion", |
bsw/jbe@0 | 113 this_key = 'id', |
bsw/jbe@0 | 114 that_key = 'member_id', |
bsw/jbe@0 | 115 ref = 'opinions', |
bsw/jbe@0 | 116 back_ref = 'member', |
bsw/jbe@0 | 117 default_order = '"id"' |
bsw/jbe@0 | 118 } |
bsw/jbe@0 | 119 |
bsw/jbe@0 | 120 Member:add_reference{ |
bsw/jbe@0 | 121 mode = '1m', |
bsw/jbe@0 | 122 to = "Delegation", |
bsw/jbe@0 | 123 this_key = 'id', |
bsw/jbe@0 | 124 that_key = 'truster_id', |
bsw/jbe@0 | 125 ref = 'outgoing_delegations', |
bsw/jbe@0 | 126 back_ref = 'truster', |
bsw/jbe@0 | 127 default_order = '"id"' |
bsw/jbe@0 | 128 } |
bsw/jbe@0 | 129 |
bsw/jbe@0 | 130 Member:add_reference{ |
bsw/jbe@0 | 131 mode = '1m', |
bsw/jbe@0 | 132 to = "Delegation", |
bsw/jbe@0 | 133 this_key = 'id', |
bsw/jbe@0 | 134 that_key = 'trustee_id', |
bsw/jbe@0 | 135 ref = 'incoming_delegations', |
bsw/jbe@0 | 136 back_ref = 'trustee', |
bsw/jbe@0 | 137 default_order = '"id"' |
bsw/jbe@0 | 138 } |
bsw/jbe@0 | 139 |
bsw/jbe@0 | 140 Member:add_reference{ |
bsw/jbe@0 | 141 mode = '1m', |
bsw/jbe@0 | 142 to = "DirectVoter", |
bsw/jbe@0 | 143 this_key = 'id', |
bsw/jbe@0 | 144 that_key = 'member_id', |
bsw/jbe@0 | 145 ref = 'direct_voter', |
bsw/jbe@0 | 146 back_ref = 'member', |
bsw/jbe@0 | 147 default_order = '"issue_id"' |
bsw/jbe@0 | 148 } |
bsw/jbe@0 | 149 |
bsw/jbe@0 | 150 Member:add_reference{ |
bsw/jbe@0 | 151 mode = '1m', |
bsw/jbe@0 | 152 to = "Vote", |
bsw/jbe@0 | 153 this_key = 'id', |
bsw/jbe@0 | 154 that_key = 'member_id', |
bsw/jbe@0 | 155 ref = 'vote', |
bsw/jbe@0 | 156 back_ref = 'member', |
bsw/jbe@0 | 157 default_order = '"issue_id", "initiative_id"' |
bsw/jbe@0 | 158 } |
bsw/jbe@0 | 159 |
bsw/jbe@0 | 160 Member:add_reference{ |
bsw/jbe@0 | 161 mode = 'mm', |
bsw/jbe@0 | 162 to = "Member", |
bsw/jbe@0 | 163 this_key = 'id', |
bsw/jbe@0 | 164 that_key = 'id', |
bsw/jbe@0 | 165 connected_by_table = 'contact', |
bsw/jbe@0 | 166 connected_by_this_key = 'member_id', |
bsw/jbe@0 | 167 connected_by_that_key = 'other_member_id', |
bsw/jbe@0 | 168 ref = 'saved_members', |
bsw/jbe@0 | 169 } |
bsw/jbe@0 | 170 |
bsw/jbe@0 | 171 Member:add_reference{ |
bsw/jbe@0 | 172 mode = 'mm', |
bsw/jbe@0 | 173 to = "Member", |
bsw/jbe@0 | 174 this_key = 'id', |
bsw/jbe@0 | 175 that_key = 'id', |
bsw/jbe@0 | 176 connected_by_table = 'contact', |
bsw/jbe@0 | 177 connected_by_this_key = 'other_member_id', |
bsw/jbe@0 | 178 connected_by_that_key = 'member_id', |
bsw/jbe@0 | 179 ref = 'saved_by_members', |
bsw/jbe@0 | 180 } |
bsw/jbe@0 | 181 |
bsw/jbe@0 | 182 Member:add_reference{ |
bsw/jbe@0 | 183 mode = 'mm', |
bsw/jbe@0 | 184 to = "Area", |
bsw/jbe@0 | 185 this_key = 'id', |
bsw/jbe@0 | 186 that_key = 'id', |
bsw/jbe@0 | 187 connected_by_table = 'membership', |
bsw/jbe@0 | 188 connected_by_this_key = 'member_id', |
bsw/jbe@0 | 189 connected_by_that_key = 'area_id', |
bsw/jbe@0 | 190 ref = 'areas' |
bsw/jbe@0 | 191 } |
bsw/jbe@0 | 192 |
bsw/jbe@0 | 193 Member:add_reference{ |
bsw/jbe@0 | 194 mode = 'mm', |
bsw/jbe@0 | 195 to = "Issue", |
bsw/jbe@0 | 196 this_key = 'id', |
bsw/jbe@0 | 197 that_key = 'id', |
bsw/jbe@0 | 198 connected_by_table = 'interest', |
bsw/jbe@0 | 199 connected_by_this_key = 'member_id', |
bsw/jbe@0 | 200 connected_by_that_key = 'issue_id', |
bsw/jbe@0 | 201 ref = 'issues' |
bsw/jbe@0 | 202 } |
bsw/jbe@0 | 203 |
bsw/jbe@0 | 204 Member:add_reference{ |
bsw/jbe@0 | 205 mode = 'mm', |
bsw/jbe@0 | 206 to = "Initiative", |
bsw/jbe@0 | 207 this_key = 'id', |
bsw/jbe@0 | 208 that_key = 'id', |
bsw/jbe@0 | 209 connected_by_table = 'initiator', |
bsw/jbe@0 | 210 connected_by_this_key = 'member_id', |
bsw/jbe@0 | 211 connected_by_that_key = 'initiative_id', |
bsw/jbe@0 | 212 ref = 'initiated_initiatives' |
bsw/jbe@0 | 213 } |
bsw/jbe@0 | 214 |
bsw/jbe@0 | 215 Member:add_reference{ |
bsw/jbe@0 | 216 mode = 'mm', |
bsw/jbe@0 | 217 to = "Initiative", |
bsw/jbe@0 | 218 this_key = 'id', |
bsw/jbe@0 | 219 that_key = 'id', |
bsw/jbe@0 | 220 connected_by_table = 'supporter', |
bsw/jbe@0 | 221 connected_by_this_key = 'member_id', |
bsw/jbe@0 | 222 connected_by_that_key = 'initiative_id', |
bsw/jbe@0 | 223 ref = 'supported_initiatives' |
bsw/jbe@0 | 224 } |
bsw/jbe@0 | 225 |
bsw/jbe@0 | 226 function Member.object:set_password(password) |
bsw/jbe@0 | 227 local hash = os.crypt( |
bsw/jbe@0 | 228 password, |
bsw/jbe@0 | 229 "$1$" .. multirand.string( |
bsw/jbe@0 | 230 8, |
bsw/jbe@0 | 231 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./" |
bsw/jbe@0 | 232 ) |
bsw/jbe@0 | 233 ) |
bsw/jbe@0 | 234 assert(hash, "os.crypt failed") |
bsw/jbe@0 | 235 self.password = hash |
bsw/jbe@0 | 236 end |
bsw/jbe@0 | 237 |
bsw/jbe@0 | 238 function Member.object:check_password(password) |
bsw/jbe@0 | 239 if type(password) == "string" and type(self.password) == "string" then |
bsw/jbe@0 | 240 return os.crypt(password, self.password) == self.password |
bsw/jbe@0 | 241 else |
bsw/jbe@0 | 242 return false |
bsw/jbe@0 | 243 end |
bsw/jbe@0 | 244 end |
bsw/jbe@0 | 245 |
bsw/jbe@0 | 246 function Member.object_get:published_contacts() |
bsw/jbe@0 | 247 return Member:new_selector() |
bsw/jbe@0 | 248 :join('"contact"', nil, '"contact"."other_member_id" = "member"."id"') |
bsw/jbe@0 | 249 :add_where{ '"contact"."member_id" = ?', self.id } |
bsw/jbe@0 | 250 :add_where("public") |
bsw/jbe@0 | 251 :exec() |
bsw/jbe@0 | 252 end |
bsw/jbe@0 | 253 |
bsw/jbe@0 | 254 function Member:by_login_and_password(login, password) |
bsw/jbe@0 | 255 local selector = self:new_selector() |
bsw/jbe@5 | 256 selector:add_where{'"login" = ?', login } |
bsw/jbe@0 | 257 selector:add_where('"active"') |
bsw/jbe@0 | 258 selector:optional_object_mode() |
bsw/jbe@0 | 259 local member = selector:exec() |
bsw/jbe@0 | 260 if member and member:check_password(password) then |
bsw/jbe@0 | 261 return member |
bsw/jbe@0 | 262 else |
bsw/jbe@0 | 263 return nil |
bsw/jbe@0 | 264 end |
bsw/jbe@0 | 265 end |
bsw/jbe@0 | 266 |
bsw/jbe@5 | 267 function Member:by_login(login) |
bsw/jbe@5 | 268 local selector = self:new_selector() |
bsw/jbe@5 | 269 selector:add_where{'"login" = ?', login } |
bsw/jbe@5 | 270 selector:optional_object_mode() |
bsw/jbe@5 | 271 return selector:exec() |
bsw/jbe@5 | 272 end |
bsw/jbe@5 | 273 |
bsw/jbe@5 | 274 function Member:by_name(name) |
bsw/jbe@5 | 275 local selector = self:new_selector() |
bsw/jbe@5 | 276 selector:add_where{'"name" = ?', name } |
bsw/jbe@5 | 277 selector:optional_object_mode() |
bsw/jbe@5 | 278 return selector:exec() |
bsw/jbe@5 | 279 end |
bsw/jbe@5 | 280 |
bsw@2 | 281 function Member:get_search_selector(search_string) |
bsw/jbe@0 | 282 return self:new_selector() |
bsw@2 | 283 :add_field( {'"highlight"("member"."name", ?)', search_string }, "name_highlighted") |
bsw@2 | 284 :add_where{ '"member"."text_search_data" @@ "text_search_query"(?)', search_string } |
bsw/jbe@0 | 285 :add_where("active") |
bsw/jbe@0 | 286 end |
bsw@2 | 287 |
bsw/jbe@6 | 288 function Member.object:set_notify_email(notify_email) |
bsw/jbe@6 | 289 local expiry = db:query("SELECT now() + '7 days'::interval as expiry", "object").expiry |
bsw/jbe@6 | 290 self.notify_email_unconfirmed = notify_email |
bsw/jbe@6 | 291 self.notify_email_secret = multirand.string( 24, "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" ) |
bsw/jbe@6 | 292 self.notify_email_secret_expiry = expiry |
bsw/jbe@6 | 293 local content = slot.use_temporary(function() |
bsw/jbe@6 | 294 slot.put(_"Hello " .. self.name .. ",\n\n") |
bsw/jbe@6 | 295 slot.put(_"Please confirm your email address by clicking the following link:\n\n") |
bsw/jbe@6 | 296 slot.put(config.absolute_base_url .. "index/confirm_notify_email.html?secret=" .. self.notify_email_secret .. "\n\n") |
bsw/jbe@6 | 297 slot.put(_"If this link is not working, please open following url in your web browser:\n\n") |
bsw/jbe@6 | 298 slot.put(config.absolute_base_url .. "index/confirm_notify_email.html\n\n") |
bsw/jbe@6 | 299 slot.put(_"On that page please enter the confirmation code:\n\n") |
bsw/jbe@6 | 300 slot.put(self.notify_email_secret .. "\n\n") |
bsw/jbe@6 | 301 end) |
bsw/jbe@6 | 302 local success = net.send_mail{ |
bsw/jbe@6 | 303 envelope_from = config.mail_envelope_from, |
bsw/jbe@6 | 304 from = config.mail_from, |
bsw/jbe@6 | 305 reply_to = config.mail_reply_to, |
bsw/jbe@6 | 306 to = self.notify_email_unconfirmed, |
bsw/jbe@6 | 307 subject = config.mail_subject_prefix .. _"Email confirmation request", |
bsw/jbe@6 | 308 content_type = "text/plain; charset=UTF-8", |
bsw/jbe@6 | 309 content = content |
bsw/jbe@6 | 310 } |
bsw/jbe@6 | 311 return success |
bsw/jbe@6 | 312 end |
bsw@11 | 313 |
bsw@11 | 314 function Member.object:get_setting_by_key(key) |
bsw@11 | 315 end |
bsw@11 | 316 |
bsw@11 | 317 function Member.object:set_setting(key, value) |
bsw@11 | 318 end |
bsw@11 | 319 |
bsw@11 | 320 function Member.object:get_setting_maps_by_key(key) |
bsw@11 | 321 return SettingMap:new_selector() |
bsw@11 | 322 :add_where{ "member_id = ?", self.id } |
bsw@11 | 323 :add_where{ "key = ?", key } |
bsw@11 | 324 :add_order_by("subkey") |
bsw@11 | 325 :exec() |
bsw@11 | 326 end |
bsw@11 | 327 |
bsw@11 | 328 function Member.object:get_setting_map_by_key_and_subkey(key, subkey) |
bsw@11 | 329 return SettingMap:new_selector() |
bsw@11 | 330 :add_where{ "member_id = ?", self.id } |
bsw@11 | 331 :add_where{ "key = ?", key } |
bsw@11 | 332 :add_where{ "subkey = ?", subkey } |
bsw@11 | 333 :add_order_by("subkey") |
bsw@11 | 334 :optional_object_mode() |
bsw@11 | 335 :exec() |
bsw@11 | 336 end |
bsw@11 | 337 |
bsw@11 | 338 function Member.object:set_setting_map(key, subkey, value) |
bsw@11 | 339 |
bsw@11 | 340 end |