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/jbe@19
|
314 function Member.object:get_setting(key)
|
bsw/jbe@19
|
315 return Setting:by_pk(app.session.member.id, key)
|
bsw/jbe@19
|
316 end
|
bsw/jbe@19
|
317
|
bsw/jbe@19
|
318 function Member.object:get_setting_value(key)
|
bsw/jbe@19
|
319 local setting = Setting:by_pk(app.session.member.id, key)
|
bsw/jbe@19
|
320 if setting then
|
bsw/jbe@19
|
321 return setting.value
|
bsw/jbe@19
|
322 end
|
bsw@11
|
323 end
|
bsw@11
|
324
|
bsw@11
|
325 function Member.object:set_setting(key, value)
|
bsw/jbe@19
|
326 local setting = self:get_setting(key)
|
bsw/jbe@19
|
327 if not setting then
|
bsw/jbe@19
|
328 setting = Setting:new()
|
bsw/jbe@19
|
329 setting.member_id = app.session.member_id
|
bsw/jbe@19
|
330 setting.key = key
|
bsw/jbe@19
|
331 end
|
bsw/jbe@19
|
332 setting.value = value
|
bsw/jbe@19
|
333 setting:save()
|
bsw@11
|
334 end
|
bsw@11
|
335
|
bsw@11
|
336 function Member.object:get_setting_maps_by_key(key)
|
bsw@11
|
337 return SettingMap:new_selector()
|
bsw@11
|
338 :add_where{ "member_id = ?", self.id }
|
bsw@11
|
339 :add_where{ "key = ?", key }
|
bsw@11
|
340 :add_order_by("subkey")
|
bsw@11
|
341 :exec()
|
bsw@11
|
342 end
|
bsw@11
|
343
|
bsw@11
|
344 function Member.object:get_setting_map_by_key_and_subkey(key, subkey)
|
bsw@11
|
345 return SettingMap:new_selector()
|
bsw@11
|
346 :add_where{ "member_id = ?", self.id }
|
bsw@11
|
347 :add_where{ "key = ?", key }
|
bsw@11
|
348 :add_where{ "subkey = ?", subkey }
|
bsw@11
|
349 :add_order_by("subkey")
|
bsw@11
|
350 :optional_object_mode()
|
bsw@11
|
351 :exec()
|
bsw@11
|
352 end
|
bsw@11
|
353
|
bsw@11
|
354 function Member.object:set_setting_map(key, subkey, value)
|
bsw@11
|
355
|
bsw@11
|
356 end
|