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@216
|
239 Issue:add_reference{
|
bsw@216
|
240 mode = 'mm',
|
bsw@216
|
241 to = "Member",
|
bsw@216
|
242 this_key = 'id',
|
bsw@216
|
243 that_key = 'mm_ref_',
|
bsw@216
|
244 ref = 'trusters_for_member',
|
bsw@216
|
245 back_ref = 'issue',
|
bsw@216
|
246 selector_generator = function(list, options)
|
bsw@216
|
247
|
bsw@216
|
248 local member_id = assert(options.member_id)
|
bsw@216
|
249
|
bsw@216
|
250 -- build list of issue ids
|
bsw@216
|
251 local ids = { sep = ", " }
|
bsw@216
|
252 for i, object in ipairs(list) do
|
bsw@216
|
253 local id = object.id
|
bsw@216
|
254 if id ~= nil then
|
bsw@216
|
255 ids[#ids+1] = {"?", id}
|
bsw@216
|
256 end
|
bsw@216
|
257 end
|
bsw@216
|
258
|
bsw@216
|
259 if #ids == 0 then
|
bsw@216
|
260 return Delegation:new_selector():empty_list_mode()
|
bsw@216
|
261 end
|
bsw@216
|
262
|
bsw@216
|
263 local selector = Member:new_selector()
|
bsw@216
|
264 selector:join("delegating_interest_snapshot", nil, { "delegating_interest_snapshot.delegate_member_ids[1] = ? AND delegating_interest_snapshot.member_id = member.id", member_id })
|
bsw@216
|
265 selector:join("issue", nil, "delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.event = issue.latest_snapshot_event")
|
bsw@216
|
266 selector:add_where{ 'delegating_interest_snapshot.issue_id IN ($)', ids }
|
bsw@216
|
267 selector:add_field("delegating_interest_snapshot.issue_id", "mm_ref_")
|
bsw@216
|
268 selector:add_field("delegating_interest_snapshot.weight", "weight")
|
bsw@216
|
269 selector:add_order_by("delegating_interest_snapshot.weight DESC, member.id")
|
bsw@216
|
270 return selector
|
bsw@216
|
271
|
bsw@216
|
272 end
|
bsw@216
|
273 }
|
bsw@216
|
274
|
bsw/jbe@6
|
275
|
bsw/jbe@6
|
276
|
bsw/jbe@0
|
277 function Issue:get_state_name_for_state(value)
|
bsw@2
|
278 local state_name_table = {
|
bsw@218
|
279 admission = _"New",
|
bsw@3
|
280 accepted = _"Discussion",
|
bsw@2
|
281 frozen = _"Frozen",
|
bsw@2
|
282 voting = _"Voting",
|
bsw@2
|
283 finished = _"Finished",
|
bsw@218
|
284 cancelled = _"Cancelled",
|
bsw@218
|
285 canceled_issue_not_accepted = _"Cancelled"
|
bsw@2
|
286 }
|
bsw@10
|
287 return state_name_table[value] or value or ''
|
bsw/jbe@0
|
288 end
|
bsw/jbe@0
|
289
|
bsw@2
|
290 function Issue:get_search_selector(search_string)
|
bsw/jbe@0
|
291 return self:new_selector()
|
bsw/jbe@0
|
292 :join('"initiative"', nil, '"initiative"."issue_id" = "issue"."id"')
|
bsw/jbe@6
|
293 :join('"draft"', nil, '"draft"."initiative_id" = "initiative"."id"')
|
bsw/jbe@6
|
294 :add_where{ '"initiative"."text_search_data" @@ "text_search_query"(?) OR "draft"."text_search_data" @@ "text_search_query"(?)', search_string, search_string }
|
bsw/jbe@6
|
295 :add_group_by('"issue"."id"')
|
bsw/jbe@6
|
296 :add_group_by('"issue"."area_id"')
|
bsw/jbe@6
|
297 :add_group_by('"issue"."policy_id"')
|
bsw/jbe@6
|
298 :add_group_by('"issue"."created"')
|
bsw/jbe@6
|
299 :add_group_by('"issue"."accepted"')
|
bsw/jbe@6
|
300 :add_group_by('"issue"."half_frozen"')
|
bsw/jbe@6
|
301 :add_group_by('"issue"."fully_frozen"')
|
bsw/jbe@6
|
302 :add_group_by('"issue"."closed"')
|
bsw/jbe@6
|
303 :add_group_by('"issue"."ranks_available"')
|
poelzi@140
|
304 :add_group_by('"issue"."cleaned"')
|
bsw/jbe@6
|
305 :add_group_by('"issue"."snapshot"')
|
bsw/jbe@6
|
306 :add_group_by('"issue"."latest_snapshot_event"')
|
bsw/jbe@6
|
307 :add_group_by('"issue"."population"')
|
bsw/jbe@6
|
308 :add_group_by('"issue"."vote_now"')
|
bsw/jbe@6
|
309 :add_group_by('"issue"."vote_later"')
|
bsw/jbe@6
|
310 :add_group_by('"issue"."voter_count"')
|
bsw@75
|
311 :add_group_by('"issue"."admission_time"')
|
bsw@75
|
312 :add_group_by('"issue"."discussion_time"')
|
bsw@75
|
313 :add_group_by('"issue"."verification_time"')
|
bsw@75
|
314 :add_group_by('"issue"."voting_time"')
|
bsw/jbe@19
|
315 :add_group_by('"_interest"."member_id"')
|
bsw/jbe@6
|
316 --:set_distinct()
|
bsw/jbe@0
|
317 end
|
bsw/jbe@0
|
318
|
bsw@75
|
319 function Issue:modify_selector_for_state(initiatives_selector, state)
|
bsw@51
|
320 if state == "new" then
|
bsw@75
|
321 initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
|
bsw@51
|
322 elseif state == "accepted" then
|
bsw@75
|
323 initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
|
bsw@51
|
324 elseif state == "frozen" then
|
bsw@75
|
325 initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
|
bsw@51
|
326 elseif state == "voting" then
|
bsw@75
|
327 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
|
bsw@51
|
328 elseif state == "finished" then
|
bsw@75
|
329 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL")
|
bsw@51
|
330 elseif state == "cancelled" then
|
bsw@75
|
331 initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL")
|
bsw@75
|
332 else
|
bsw@75
|
333 error("Invalid state")
|
bsw@51
|
334 end
|
bsw@51
|
335 end
|
bsw@51
|
336
|
bsw@211
|
337 function Issue:build_selector(args)
|
bsw@211
|
338 local selector = self:new_selector()
|
bsw@217
|
339 if args.unit_id then
|
bsw@217
|
340 selector:join("area", nil, "area.id = issue.area_id")
|
bsw@217
|
341 selector:add_where{ "area.unit_id = ?", args.unit_id }
|
bsw@217
|
342 end
|
bsw@211
|
343 if args.area_id then
|
bsw@211
|
344 selector:add_where{ "issue.area_id = ?", args.area_id }
|
bsw@211
|
345 end
|
bsw@215
|
346 if args.phase == "closed" then
|
bsw@211
|
347 selector:add_where("issue.closed NOTNULL")
|
bsw@215
|
348 elseif args.phase == "voting" then
|
bsw@211
|
349 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
|
bsw@215
|
350 elseif args.phase == "frozen" then
|
bsw@211
|
351 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
|
bsw@215
|
352 elseif args.phase == "discussion" then
|
bsw@211
|
353 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
|
bsw@215
|
354 elseif args.phase == "new" then
|
bsw@211
|
355 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
|
bsw@211
|
356 end
|
bsw@211
|
357 if args.order == "time_left" then
|
bsw@211
|
358 selector:add_order_by("issue.closed DESC")
|
bsw@211
|
359 elseif args.order == "last_change" then
|
bsw@211
|
360 selector:add_order_by("issue.closed DESC")
|
bsw@211
|
361 elseif args.order == "interest" then
|
bsw@211
|
362 selector:add_order_by("issue.population DESC")
|
bsw@211
|
363 end
|
bsw@211
|
364
|
bsw@211
|
365 return selector
|
bsw@211
|
366 end
|
bsw@211
|
367
|
bsw@218
|
368 --[[
|
bsw/jbe@0
|
369 function Issue.object_get:state()
|
bsw/jbe@52
|
370 if self.closed then
|
bsw/jbe@52
|
371 if self.fully_frozen then
|
bsw/jbe@5
|
372 return "finished"
|
bsw/jbe@0
|
373 else
|
bsw/jbe@52
|
374 return "cancelled"
|
bsw/jbe@0
|
375 end
|
bsw/jbe@52
|
376 elseif self.fully_frozen then
|
bsw/jbe@52
|
377 return "voting"
|
bsw/jbe@52
|
378 elseif self.half_frozen then
|
bsw/jbe@52
|
379 return "frozen"
|
bsw/jbe@52
|
380 elseif self.accepted then
|
bsw/jbe@52
|
381 return "accepted"
|
bsw/jbe@0
|
382 else
|
bsw/jbe@52
|
383 return "new"
|
bsw/jbe@0
|
384 end
|
bsw/jbe@52
|
385
|
bsw@2
|
386 end
|
bsw@218
|
387 --]]
|
bsw@2
|
388
|
bsw@215
|
389 function Issue.object_get:phase()
|
bsw@215
|
390 local state = self.state
|
bsw@215
|
391 if state == "finished" or state == "cancelled" then
|
bsw@215
|
392 return "closed"
|
bsw@215
|
393 else
|
bsw@215
|
394 return state
|
bsw@215
|
395 end
|
bsw@215
|
396 end
|
bsw@215
|
397
|
bsw@2
|
398 function Issue.object_get:state_name()
|
bsw@2
|
399 return Issue:get_state_name_for_state(self.state)
|
bsw@2
|
400 end
|
bsw@2
|
401
|
bsw@2
|
402 function Issue.object_get:state_time_left()
|
bsw@2
|
403 local state = self.state
|
bsw@2
|
404 local last_event_time
|
bsw@2
|
405 local duration
|
bsw@218
|
406 if state == "admission" then
|
bsw@2
|
407 last_event_time = self.created
|
bsw@25
|
408 duration = self.admission_time
|
bsw@2
|
409 elseif state == "accepted" then
|
bsw@2
|
410 last_event_time = self.accepted
|
bsw@25
|
411 duration = self.discussion_time
|
bsw@2
|
412 elseif state == "frozen" then
|
bsw@2
|
413 last_event_time = self.half_frozen
|
bsw@25
|
414 duration = self.verification_time
|
bsw@2
|
415 elseif state == "voting" then
|
bsw@2
|
416 last_event_time = self.fully_frozen
|
bsw@25
|
417 duration = self.voting_time
|
bsw@2
|
418 end
|
poelzi@125
|
419 return db:query{ "SELECT ?::timestamp + ?::interval - CURRENT_TIMESTAMP(0) as time_left", last_event_time, duration }[1].time_left
|
bsw@2
|
420 end
|
bsw@2
|
421
|
bsw@2
|
422 function Issue.object_get:next_states()
|
bsw@2
|
423 local state = self.state
|
bsw@2
|
424 local next_states
|
bsw@2
|
425 if state == "new" then
|
bsw@2
|
426 next_states = { "accepted", "cancelled" }
|
bsw@2
|
427 elseif state == "accepted" then
|
bsw@2
|
428 next_states = { "frozen" }
|
bsw@2
|
429 elseif state == "frozen" then
|
bsw@2
|
430 next_states = { "voting" }
|
bsw@2
|
431 elseif state == "voting" then
|
bsw@2
|
432 next_states = { "finished" }
|
bsw@2
|
433 end
|
bsw@2
|
434 return next_states
|
bsw@2
|
435 end
|
bsw@2
|
436
|
bsw@2
|
437 function Issue.object_get:next_states_names()
|
bsw@2
|
438 local next_states = self.next_states
|
bsw@2
|
439 if not next_states then
|
bsw@2
|
440 return
|
bsw@2
|
441 end
|
bsw@2
|
442 local state_names = {}
|
bsw@2
|
443 for i, state in ipairs(self.next_states) do
|
bsw@2
|
444 state_names[#state_names+1] = Issue:get_state_name_for_state(state)
|
bsw@2
|
445 end
|
bsw@2
|
446 return table.concat(state_names, ", ")
|
bsw/jbe@0
|
447 end |