liquid_feedback_frontend
annotate model/member.lua @ 144:7c3e8a1678fc
fix timeline saved filters
add Members:set_setting_map code
check for empty name
update settings when saved under same name
fixes bug #305
add Members:set_setting_map code
check for empty name
update settings when saved under same name
fixes bug #305
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Wed Oct 06 18:15:23 2010 +0200 (2010-10-06) |
parents | de6b80867eb7 |
children | 46351752814f |
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@75 | 311 if success then |
bsw@75 | 312 local lock_expiry = db:query("SELECT now() + '1 hour'::interval AS lock_expiry", "object").lock_expiry |
bsw@75 | 313 self.notify_email_lock_expiry = lock_expiry |
bsw@75 | 314 end |
bsw@75 | 315 self:save() |
bsw/jbe@6 | 316 return success |
bsw/jbe@6 | 317 end |
bsw@11 | 318 |
bsw/jbe@19 | 319 function Member.object:get_setting(key) |
bsw@79 | 320 return Setting:by_pk(self.id, key) |
bsw/jbe@19 | 321 end |
bsw/jbe@19 | 322 |
bsw/jbe@19 | 323 function Member.object:get_setting_value(key) |
bsw@79 | 324 local setting = Setting:by_pk(self.id, key) |
bsw/jbe@19 | 325 if setting then |
bsw/jbe@19 | 326 return setting.value |
bsw/jbe@19 | 327 end |
bsw@11 | 328 end |
bsw@11 | 329 |
bsw@11 | 330 function Member.object:set_setting(key, value) |
bsw/jbe@19 | 331 local setting = self:get_setting(key) |
bsw/jbe@19 | 332 if not setting then |
bsw/jbe@19 | 333 setting = Setting:new() |
bsw@79 | 334 setting.member_id = self.id |
bsw/jbe@19 | 335 setting.key = key |
bsw/jbe@19 | 336 end |
bsw/jbe@19 | 337 setting.value = value |
bsw/jbe@19 | 338 setting:save() |
bsw@11 | 339 end |
bsw@11 | 340 |
bsw@11 | 341 function Member.object:get_setting_maps_by_key(key) |
bsw@11 | 342 return SettingMap:new_selector() |
bsw@11 | 343 :add_where{ "member_id = ?", self.id } |
bsw@11 | 344 :add_where{ "key = ?", key } |
bsw@11 | 345 :add_order_by("subkey") |
bsw@11 | 346 :exec() |
bsw@11 | 347 end |
bsw@11 | 348 |
bsw@11 | 349 function Member.object:get_setting_map_by_key_and_subkey(key, subkey) |
bsw@11 | 350 return SettingMap:new_selector() |
bsw@11 | 351 :add_where{ "member_id = ?", self.id } |
bsw@11 | 352 :add_where{ "key = ?", key } |
bsw@11 | 353 :add_where{ "subkey = ?", subkey } |
bsw@11 | 354 :add_order_by("subkey") |
bsw@11 | 355 :optional_object_mode() |
bsw@11 | 356 :exec() |
bsw@11 | 357 end |
bsw@11 | 358 |
bsw@11 | 359 function Member.object:set_setting_map(key, subkey, value) |
poelzi@144 | 360 setting_map = self:get_setting_map_by_key_and_subkey(key, subkey) |
poelzi@144 | 361 if not setting_map then |
poelzi@144 | 362 setting_map = SettingMap:new() |
poelzi@144 | 363 setting_map.member_id = self.id |
poelzi@144 | 364 setting_map.key = key |
poelzi@144 | 365 setting_map.subkey = subkey |
poelzi@144 | 366 end |
poelzi@144 | 367 setting_map.value = value |
poelzi@144 | 368 setting_map:save() |
bsw@11 | 369 end |
bsw@75 | 370 |
bsw@75 | 371 function Member.object_get:notify_email_locked() |
bsw@75 | 372 return( |
bsw@75 | 373 Member:new_selector() |
bsw@75 | 374 :add_where{ "id = ?", app.session.member.id } |
bsw@75 | 375 :add_where("notify_email_lock_expiry > now()") |
bsw@75 | 376 :count() == 1 |
bsw@75 | 377 ) |
poelzi@134 | 378 end |
poelzi@134 | 379 |
poelzi@134 | 380 function Member.object:ui_field_text(args) |
poelzi@134 | 381 args = args or {} |
poelzi@134 | 382 if app.session.member_id or config.public_access == "pseudonym" then |
poelzi@134 | 383 -- ugly workaround for getting html into a replaced string and to the user |
poelzi@134 | 384 ui.container{label = args.label, label_attr={class="ui_field_label"}, content = function() |
poelzi@134 | 385 slot.put(string.format('<span><a href="%s">%s</a></span>', |
poelzi@134 | 386 encode.url{ |
poelzi@134 | 387 module = "member", |
poelzi@134 | 388 view = "show", |
poelzi@134 | 389 id = self.id, |
poelzi@134 | 390 }, |
poelzi@134 | 391 encode.html(self.name))) |
poelzi@134 | 392 end |
poelzi@134 | 393 } |
poelzi@134 | 394 else |
poelzi@134 | 395 ui.field.text{ label = args.label, value = _"[not displayed public]" } |
poelzi@134 | 396 end |
poelzi@134 | 397 end |