rev |
line source |
bsw/jbe@0
|
1 Issue = mondelefant.new_class()
|
bsw/jbe@0
|
2 Issue.table = 'issue'
|
bsw/jbe@0
|
3
|
bsw/jbe@0
|
4 Issue:add_reference{
|
bsw/jbe@0
|
5 mode = 'm1',
|
bsw/jbe@0
|
6 to = "Area",
|
bsw/jbe@0
|
7 this_key = 'area_id',
|
bsw/jbe@0
|
8 that_key = 'id',
|
bsw/jbe@0
|
9 ref = 'area',
|
bsw/jbe@0
|
10 }
|
bsw/jbe@0
|
11
|
bsw/jbe@0
|
12 Issue:add_reference{
|
bsw/jbe@0
|
13 mode = 'm1',
|
bsw/jbe@0
|
14 to = "Policy",
|
bsw/jbe@0
|
15 this_key = 'policy_id',
|
bsw/jbe@0
|
16 that_key = 'id',
|
bsw/jbe@0
|
17 ref = 'policy',
|
bsw/jbe@0
|
18 }
|
bsw/jbe@0
|
19
|
bsw/jbe@0
|
20 Issue:add_reference{
|
bsw/jbe@0
|
21 mode = '1m',
|
bsw/jbe@0
|
22 to = "Initiative",
|
bsw/jbe@0
|
23 this_key = 'id',
|
bsw/jbe@0
|
24 that_key = 'issue_id',
|
bsw/jbe@0
|
25 ref = 'initiatives',
|
bsw@211
|
26 back_ref = 'issue',
|
bsw@211
|
27 default_order = 'initiative.rank, initiative.admitted ISNULL, initiative.admitted DESC, initiative.positive_votes::float / initiative.negative_votes::float DESC, initiative.supporter_count DESC'
|
bsw/jbe@0
|
28 }
|
bsw/jbe@0
|
29
|
bsw/jbe@0
|
30 Issue:add_reference{
|
bsw/jbe@0
|
31 mode = '1m',
|
bsw/jbe@0
|
32 to = "Interest",
|
bsw/jbe@0
|
33 this_key = 'id',
|
bsw/jbe@0
|
34 that_key = 'issue_id',
|
bsw/jbe@0
|
35 ref = 'interests',
|
bsw/jbe@0
|
36 back_ref = 'issue',
|
bsw/jbe@0
|
37 default_order = '"id"'
|
bsw/jbe@0
|
38 }
|
bsw/jbe@0
|
39
|
bsw/jbe@0
|
40 Issue:add_reference{
|
bsw/jbe@0
|
41 mode = '1m',
|
bsw/jbe@0
|
42 to = "Supporter",
|
bsw/jbe@0
|
43 this_key = 'id',
|
bsw/jbe@0
|
44 that_key = 'issue_id',
|
bsw/jbe@0
|
45 ref = 'supporters',
|
bsw/jbe@0
|
46 back_ref = 'issue',
|
bsw/jbe@0
|
47 default_order = '"id"'
|
bsw/jbe@0
|
48 }
|
bsw/jbe@0
|
49
|
bsw/jbe@0
|
50 Issue:add_reference{
|
bsw/jbe@0
|
51 mode = '1m',
|
bsw/jbe@0
|
52 to = "DirectVoter",
|
bsw/jbe@0
|
53 this_key = 'id',
|
bsw/jbe@0
|
54 that_key = 'issue_id',
|
bsw/jbe@0
|
55 ref = 'direct_voters',
|
bsw/jbe@0
|
56 back_ref = 'issue',
|
bsw/jbe@0
|
57 default_order = '"member_id"'
|
bsw/jbe@0
|
58 }
|
bsw/jbe@0
|
59
|
bsw/jbe@0
|
60 Issue:add_reference{
|
bsw/jbe@0
|
61 mode = '1m',
|
bsw/jbe@0
|
62 to = "Vote",
|
bsw/jbe@0
|
63 this_key = 'id',
|
bsw/jbe@0
|
64 that_key = 'issue_id',
|
bsw/jbe@0
|
65 ref = 'votes',
|
bsw/jbe@0
|
66 back_ref = 'issue',
|
bsw/jbe@0
|
67 default_order = '"member_id", "initiative_id"'
|
bsw/jbe@0
|
68 }
|
bsw/jbe@0
|
69
|
bsw/jbe@0
|
70 Issue:add_reference{
|
bsw@2
|
71 mode = '1m',
|
bsw@2
|
72 to = "Delegation",
|
bsw@2
|
73 this_key = 'id',
|
bsw@2
|
74 that_key = 'issue_id',
|
bsw@2
|
75 ref = 'delegations',
|
bsw@2
|
76 back_ref = 'issue'
|
bsw@2
|
77 }
|
bsw@2
|
78
|
bsw@2
|
79 Issue:add_reference{
|
bsw/jbe@0
|
80 mode = 'mm',
|
bsw/jbe@0
|
81 to = "Member",
|
bsw/jbe@0
|
82 this_key = 'id',
|
bsw/jbe@0
|
83 that_key = 'id',
|
bsw/jbe@0
|
84 connected_by_table = 'interest',
|
bsw/jbe@0
|
85 connected_by_this_key = 'issue_id',
|
bsw/jbe@0
|
86 connected_by_that_key = 'member_id',
|
bsw/jbe@0
|
87 ref = 'members'
|
bsw/jbe@0
|
88 }
|
bsw@211
|
89 --[[
|
bsw@3
|
90 Issue:add_reference{
|
bsw@3
|
91 mode = 'mm',
|
bsw@3
|
92 to = "Member",
|
bsw@3
|
93 this_key = 'id',
|
bsw@3
|
94 that_key = 'id',
|
bsw@3
|
95 connected_by_table = 'direct_interest_snapshot',
|
bsw@3
|
96 connected_by_this_key = 'issue_id',
|
bsw@3
|
97 connected_by_that_key = 'member_id',
|
bsw@3
|
98 ref = 'interested_members_snapshot'
|
bsw@3
|
99 }
|
bsw@211
|
100 --]]
|
bsw/jbe@6
|
101 Issue:add_reference{
|
bsw/jbe@6
|
102 mode = 'mm',
|
bsw/jbe@6
|
103 to = "Member",
|
bsw/jbe@6
|
104 this_key = 'id',
|
bsw/jbe@6
|
105 that_key = 'id',
|
bsw/jbe@6
|
106 connected_by_table = 'direct_voter',
|
bsw/jbe@6
|
107 connected_by_this_key = 'issue_id',
|
bsw/jbe@6
|
108 connected_by_that_key = 'member_id',
|
bsw/jbe@6
|
109 ref = 'direct_voters'
|
bsw/jbe@6
|
110 }
|
bsw/jbe@6
|
111
|
bsw@211
|
112 Issue:add_reference{
|
bsw@211
|
113 mode = 'mm',
|
bsw@211
|
114 to = "Member",
|
bsw@211
|
115 this_key = 'id',
|
bsw@211
|
116 that_key = 'id',
|
bsw@211
|
117 connected_by_table = 'direct_interest_snapshot',
|
bsw@211
|
118 connected_by_this_key = 'issue_id',
|
bsw@211
|
119 connected_by_that_key = 'member_id',
|
bsw@211
|
120 ref = 'interested_members_snapshot',
|
bsw@211
|
121 selector_generator = function(list, options)
|
bsw@211
|
122 -- build list of issue ids
|
bsw@211
|
123 local ids = { sep = ", " }
|
bsw@211
|
124 for i, object in ipairs(list) do
|
bsw@211
|
125 local id = object.id
|
bsw@211
|
126 if id ~= nil then
|
bsw@211
|
127 ids[#ids+1] = {"?", id}
|
bsw@211
|
128 end
|
bsw@211
|
129 end
|
bsw@211
|
130
|
bsw@211
|
131 if #ids == 0 then
|
bsw@211
|
132 return Member:new_selector():empty_list_mode()
|
bsw@211
|
133 end
|
bsw@211
|
134
|
bsw@211
|
135 local selector = Member:new_selector()
|
bsw@211
|
136 selector:join("direct_interest_snapshot", nil, { "direct_interest_snapshot.member_id = member.id AND direct_interest_snapshot.issue_id IN ($)", ids })
|
bsw@211
|
137 selector:join("issue", nil, "direct_interest_snapshot.issue_id = issue.id AND direct_interest_snapshot.event = issue.latest_snapshot_event")
|
bsw@211
|
138 selector:add_order_by('direct_interest_snapshot.weight DESC')
|
bsw@211
|
139 return selector
|
bsw@211
|
140 end
|
bsw@211
|
141 }
|
bsw@211
|
142
|
bsw@211
|
143 Issue:add_reference{
|
bsw@211
|
144 mode = '11',
|
bsw@211
|
145 to = "DelegatingInterestSnapshot",
|
bsw@211
|
146 this_key = 'id',
|
bsw@211
|
147 that_key = 'issue_id',
|
bsw@211
|
148 ref = 'delegating_interest_snapshot_for_member',
|
bsw@211
|
149 back_ref = 'issue',
|
bsw@211
|
150 selector_generator = function(list, options)
|
bsw@211
|
151 local member_id = assert(options.member_id)
|
bsw@211
|
152
|
bsw@211
|
153 -- build list of issue ids
|
bsw@211
|
154 local ids = { sep = ", " }
|
bsw@211
|
155 for i, object in ipairs(list) do
|
bsw@211
|
156 local id = object.id
|
bsw@211
|
157 if id ~= nil then
|
bsw@211
|
158 ids[#ids+1] = {"?", id}
|
bsw@211
|
159 end
|
bsw@211
|
160 end
|
bsw@211
|
161
|
bsw@211
|
162 if #ids == 0 then
|
bsw@211
|
163 return DelegatingInterestSnapshot:new_selector():empty_list_mode()
|
bsw@211
|
164 end
|
bsw@211
|
165
|
bsw@211
|
166 local selector = DelegatingInterestSnapshot:new_selector()
|
bsw@211
|
167 selector:join("issue", nil, "delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.event = issue.latest_snapshot_event")
|
bsw@211
|
168 selector:add_where{ 'delegating_interest_snapshot.issue_id IN ($)', ids }
|
bsw@212
|
169 selector:add_where{ 'delegating_interest_snapshot.member_id = ?', member_id }
|
bsw@211
|
170
|
bsw@211
|
171 return selector
|
bsw@211
|
172 end
|
bsw@211
|
173 }
|
bsw@211
|
174
|
bsw@211
|
175 Issue:add_reference{
|
bsw@211
|
176 mode = '11',
|
bsw@211
|
177 to = "Interest",
|
bsw@211
|
178 this_key = 'id',
|
bsw@211
|
179 that_key = 'issue_id',
|
bsw@211
|
180 ref = 'interest_for_member',
|
bsw@211
|
181 back_ref = 'issue',
|
bsw@211
|
182 selector_generator = function(list, options)
|
bsw@211
|
183
|
bsw@211
|
184 local member_id = assert(options.member_id)
|
bsw@211
|
185
|
bsw@211
|
186 -- build list of issue ids
|
bsw@211
|
187 local ids = { sep = ", " }
|
bsw@211
|
188 for i, object in ipairs(list) do
|
bsw@211
|
189 local id = object.id
|
bsw@211
|
190 if id ~= nil then
|
bsw@211
|
191 ids[#ids+1] = {"?", id}
|
bsw@211
|
192 end
|
bsw@211
|
193 end
|
bsw@211
|
194
|
bsw@211
|
195 if #ids == 0 then
|
bsw@211
|
196 return Interest:new_selector():empty_list_mode()
|
bsw@211
|
197 end
|
bsw@211
|
198
|
bsw@211
|
199 local selector = Interest:new_selector()
|
bsw@211
|
200 selector:add_where{ 'interest.issue_id IN ($)', ids }
|
bsw@211
|
201 selector:add_where{ 'interest.member_id = ?', member_id }
|
bsw@211
|
202 return selector
|
bsw@211
|
203
|
bsw@211
|
204 end
|
bsw@211
|
205 }
|
bsw@211
|
206
|
bsw@211
|
207 Issue:add_reference{
|
bsw@211
|
208 mode = '1m',
|
bsw@211
|
209 to = "Delegation",
|
bsw@211
|
210 this_key = 'id',
|
bsw@211
|
211 that_key = 'issue_id',
|
bsw@211
|
212 ref = 'outgoing_delegations_for_member',
|
bsw@211
|
213 back_ref = 'issue',
|
bsw@211
|
214 selector_generator = function(list, options)
|
bsw@211
|
215
|
bsw@211
|
216 local member_id = assert(options.member_id)
|
bsw@211
|
217
|
bsw@211
|
218 -- build list of issue ids
|
bsw@211
|
219 local ids = { sep = ", " }
|
bsw@211
|
220 for i, object in ipairs(list) do
|
bsw@211
|
221 local id = object.id
|
bsw@211
|
222 if id ~= nil then
|
bsw@211
|
223 ids[#ids+1] = {"?", id}
|
bsw@211
|
224 end
|
bsw@211
|
225 end
|
bsw@211
|
226
|
bsw@211
|
227 if #ids == 0 then
|
bsw@211
|
228 return Delegation:new_selector():empty_list_mode()
|
bsw@211
|
229 end
|
bsw@211
|
230
|
bsw@211
|
231 local selector = Delegation:new_selector()
|
bsw@211
|
232 selector:add_where{ 'delegation.issue_id IN ($)', ids }
|
bsw@211
|
233 selector:add_where{ 'delegation.truster_id = ?', member_id }
|
bsw@211
|
234 return selector
|
bsw@211
|
235
|
bsw@211
|
236 end
|
bsw@211
|
237 }
|
bsw@211
|
238
|
bsw/jbe@6
|
239
|
bsw/jbe@6
|
240
|
bsw/jbe@0
|
241 function Issue:get_state_name_for_state(value)
|
bsw@2
|
242 local state_name_table = {
|
bsw@2
|
243 new = _"New",
|
bsw@3
|
244 accepted = _"Discussion",
|
bsw@2
|
245 frozen = _"Frozen",
|
bsw@2
|
246 voting = _"Voting",
|
bsw@2
|
247 finished = _"Finished",
|
bsw@2
|
248 cancelled = _"Cancelled"
|
bsw@2
|
249 }
|
bsw@10
|
250 return state_name_table[value] or value or ''
|
bsw/jbe@0
|
251 end
|
bsw/jbe@0
|
252
|
bsw@2
|
253 function Issue:get_search_selector(search_string)
|
bsw/jbe@0
|
254 return self:new_selector()
|
bsw/jbe@0
|
255 :join('"initiative"', nil, '"initiative"."issue_id" = "issue"."id"')
|
bsw/jbe@6
|
256 :join('"draft"', nil, '"draft"."initiative_id" = "initiative"."id"')
|
bsw/jbe@6
|
257 :add_where{ '"initiative"."text_search_data" @@ "text_search_query"(?) OR "draft"."text_search_data" @@ "text_search_query"(?)', search_string, search_string }
|
bsw/jbe@6
|
258 :add_group_by('"issue"."id"')
|
bsw/jbe@6
|
259 :add_group_by('"issue"."area_id"')
|
bsw/jbe@6
|
260 :add_group_by('"issue"."policy_id"')
|
bsw/jbe@6
|
261 :add_group_by('"issue"."created"')
|
bsw/jbe@6
|
262 :add_group_by('"issue"."accepted"')
|
bsw/jbe@6
|
263 :add_group_by('"issue"."half_frozen"')
|
bsw/jbe@6
|
264 :add_group_by('"issue"."fully_frozen"')
|
bsw/jbe@6
|
265 :add_group_by('"issue"."closed"')
|
bsw/jbe@6
|
266 :add_group_by('"issue"."ranks_available"')
|
poelzi@140
|
267 :add_group_by('"issue"."cleaned"')
|
bsw/jbe@6
|
268 :add_group_by('"issue"."snapshot"')
|
bsw/jbe@6
|
269 :add_group_by('"issue"."latest_snapshot_event"')
|
bsw/jbe@6
|
270 :add_group_by('"issue"."population"')
|
bsw/jbe@6
|
271 :add_group_by('"issue"."vote_now"')
|
bsw/jbe@6
|
272 :add_group_by('"issue"."vote_later"')
|
bsw/jbe@6
|
273 :add_group_by('"issue"."voter_count"')
|
bsw@75
|
274 :add_group_by('"issue"."admission_time"')
|
bsw@75
|
275 :add_group_by('"issue"."discussion_time"')
|
bsw@75
|
276 :add_group_by('"issue"."verification_time"')
|
bsw@75
|
277 :add_group_by('"issue"."voting_time"')
|
bsw/jbe@19
|
278 :add_group_by('"_interest"."member_id"')
|
bsw/jbe@6
|
279 --:set_distinct()
|
bsw/jbe@0
|
280 end
|
bsw/jbe@0
|
281
|
bsw@75
|
282 function Issue:modify_selector_for_state(initiatives_selector, state)
|
bsw@51
|
283 if state == "new" then
|
bsw@75
|
284 initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
|
bsw@51
|
285 elseif state == "accepted" then
|
bsw@75
|
286 initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
|
bsw@51
|
287 elseif state == "frozen" then
|
bsw@75
|
288 initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
|
bsw@51
|
289 elseif state == "voting" then
|
bsw@75
|
290 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
|
bsw@51
|
291 elseif state == "finished" then
|
bsw@75
|
292 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL")
|
bsw@51
|
293 elseif state == "cancelled" then
|
bsw@75
|
294 initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL")
|
bsw@75
|
295 else
|
bsw@75
|
296 error("Invalid state")
|
bsw@51
|
297 end
|
bsw@51
|
298 end
|
bsw@51
|
299
|
bsw@211
|
300 function Issue:build_selector(args)
|
bsw@211
|
301 local selector = self:new_selector()
|
bsw@211
|
302 if args.area_id then
|
bsw@211
|
303 selector:add_where{ "issue.area_id = ?", args.area_id }
|
bsw@211
|
304 end
|
bsw@215
|
305 if args.phase == "closed" then
|
bsw@211
|
306 selector:add_where("issue.closed NOTNULL")
|
bsw@215
|
307 elseif args.phase == "voting" then
|
bsw@211
|
308 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
|
bsw@215
|
309 elseif args.phase == "frozen" then
|
bsw@211
|
310 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
|
bsw@215
|
311 elseif args.phase == "discussion" then
|
bsw@211
|
312 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
|
bsw@215
|
313 elseif args.phase == "new" then
|
bsw@211
|
314 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
|
bsw@211
|
315 end
|
bsw@211
|
316 if args.order == "time_left" then
|
bsw@211
|
317 selector:add_order_by("issue.closed DESC")
|
bsw@211
|
318 elseif args.order == "last_change" then
|
bsw@211
|
319 selector:add_order_by("issue.closed DESC")
|
bsw@211
|
320 elseif args.order == "interest" then
|
bsw@211
|
321 selector:add_order_by("issue.population DESC")
|
bsw@211
|
322 end
|
bsw@211
|
323
|
bsw@211
|
324 return selector
|
bsw@211
|
325 end
|
bsw@211
|
326
|
bsw/jbe@0
|
327 function Issue.object_get:state()
|
bsw/jbe@52
|
328 if self.closed then
|
bsw/jbe@52
|
329 if self.fully_frozen then
|
bsw/jbe@5
|
330 return "finished"
|
bsw/jbe@0
|
331 else
|
bsw/jbe@52
|
332 return "cancelled"
|
bsw/jbe@0
|
333 end
|
bsw/jbe@52
|
334 elseif self.fully_frozen then
|
bsw/jbe@52
|
335 return "voting"
|
bsw/jbe@52
|
336 elseif self.half_frozen then
|
bsw/jbe@52
|
337 return "frozen"
|
bsw/jbe@52
|
338 elseif self.accepted then
|
bsw/jbe@52
|
339 return "accepted"
|
bsw/jbe@0
|
340 else
|
bsw/jbe@52
|
341 return "new"
|
bsw/jbe@0
|
342 end
|
bsw/jbe@52
|
343
|
bsw@2
|
344 end
|
bsw@2
|
345
|
bsw@215
|
346 function Issue.object_get:phase()
|
bsw@215
|
347 local state = self.state
|
bsw@215
|
348 if state == "finished" or state == "cancelled" then
|
bsw@215
|
349 return "closed"
|
bsw@215
|
350 else
|
bsw@215
|
351 return state
|
bsw@215
|
352 end
|
bsw@215
|
353 end
|
bsw@215
|
354
|
bsw@2
|
355 function Issue.object_get:state_name()
|
bsw@2
|
356 return Issue:get_state_name_for_state(self.state)
|
bsw@2
|
357 end
|
bsw@2
|
358
|
bsw@2
|
359 function Issue.object_get:state_time_left()
|
bsw@2
|
360 local state = self.state
|
bsw@2
|
361 local last_event_time
|
bsw@2
|
362 local duration
|
bsw@2
|
363 if state == "new" then
|
bsw@2
|
364 last_event_time = self.created
|
bsw@25
|
365 duration = self.admission_time
|
bsw@2
|
366 elseif state == "accepted" then
|
bsw@2
|
367 last_event_time = self.accepted
|
bsw@25
|
368 duration = self.discussion_time
|
bsw@2
|
369 elseif state == "frozen" then
|
bsw@2
|
370 last_event_time = self.half_frozen
|
bsw@25
|
371 duration = self.verification_time
|
bsw@2
|
372 elseif state == "voting" then
|
bsw@2
|
373 last_event_time = self.fully_frozen
|
bsw@25
|
374 duration = self.voting_time
|
bsw@2
|
375 end
|
poelzi@125
|
376 return db:query{ "SELECT ?::timestamp + ?::interval - CURRENT_TIMESTAMP(0) as time_left", last_event_time, duration }[1].time_left
|
bsw@2
|
377 end
|
bsw@2
|
378
|
bsw@2
|
379 function Issue.object_get:next_states()
|
bsw@2
|
380 local state = self.state
|
bsw@2
|
381 local next_states
|
bsw@2
|
382 if state == "new" then
|
bsw@2
|
383 next_states = { "accepted", "cancelled" }
|
bsw@2
|
384 elseif state == "accepted" then
|
bsw@2
|
385 next_states = { "frozen" }
|
bsw@2
|
386 elseif state == "frozen" then
|
bsw@2
|
387 next_states = { "voting" }
|
bsw@2
|
388 elseif state == "voting" then
|
bsw@2
|
389 next_states = { "finished" }
|
bsw@2
|
390 end
|
bsw@2
|
391 return next_states
|
bsw@2
|
392 end
|
bsw@2
|
393
|
bsw@2
|
394 function Issue.object_get:next_states_names()
|
bsw@2
|
395 local next_states = self.next_states
|
bsw@2
|
396 if not next_states then
|
bsw@2
|
397 return
|
bsw@2
|
398 end
|
bsw@2
|
399 local state_names = {}
|
bsw@2
|
400 for i, state in ipairs(self.next_states) do
|
bsw@2
|
401 state_names[#state_names+1] = Issue:get_state_name_for_state(state)
|
bsw@2
|
402 end
|
bsw@2
|
403 return table.concat(state_names, ", ")
|
bsw/jbe@0
|
404 end |