liquid_feedback_frontend

view app/main/issue/_filters.lua @ 1858:3d1f0464a3ea

Handle missing ldap.member.allowed function
author bsw
date Tue Sep 20 17:35:29 2022 +0200 (20 months ago)
parents f7c42bcf1490
children
line source
1 local for_unit = param.get("for_unit", atom.boolean)
2 local for_area = param.get("for_area", atom.boolean)
3 local for_events = param.get("for_events", atom.boolean)
4 local for_member = param.get("for_member", "table")
5 local member = param.get("member", "table")
6 local phase = request.get_param{ name = "phase" }
8 local selected_unit_id = config.single_unit_id or request.get_param{ name = "unit" } or app.single_unit_id
9 if selected_unit_id == "all" then
10 selected_unit_id = nil
11 end
12 local selected_unit = Unit:by_id(selected_unit_id)
14 local filters = {}
16 local admission_order_field = "filter_issue_order.order_in_unit"
17 if for_area then
18 admission_order_field = "filter_issue_order.order_in_area"
19 end
21 local filter = { class = "filter_mode", name = "mode", label = _"mode" }
23 filter[#filter+1] = {
24 name = "issue",
25 label = _"issue list",
26 selector_modifier = function() end
27 }
29 filter[#filter+1] = {
30 name = "timeline",
31 label = _"timeline",
32 selector_modifier = function() end
33 }
35 --filters[#filters+1] = filter
37 if not for_issue and not for_member then
39 -- units
41 if not app.single_unit_id then
43 local units_selector
45 if app.session.member then
46 units_selector = app.session.member:get_reference_selector("units")
47 :add_order_by("name")
48 else
49 units_selector = Unit:new_selector()
50 :add_order_by("name")
51 end
53 local units = units_selector
54 :add_where("attr->'hidden' ISNULL OR NOT (attr->'hidden' = 'true')")
55 :add_where("active")
56 :exec()
58 units:load_delegation_info_once_for_member_id(app.session.member_id)
61 local filter = { class = "filter_unit", name = "unit", label = _"unit" }
63 filter[#filter+1] = {
64 name = "all",
65 label = _"All units",
66 selector_modifier = function(selector)
67 if app.session.member then
68 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
69 selector:join("unit", "__filter_unit", "__filter_unit.id = __filter_area.unit_id AND __filter_unit.active")
70 selector:join("privilege", "__filter_privilege", { "__filter_privilege.unit_id = __filter_area.unit_id AND __filter_privilege.member_id = ?", app.session.member_id })
71 end
72 end
73 }
75 local selected_unit_found = false
77 for i, unit in ipairs(units) do
78 if selected_unit and unit.id == selected_unit.id then
79 selected_unit_found = true
80 end
81 filter[#filter+1] = {
82 name = tostring(unit.id),
83 label = unit.name,
84 selector_modifier = function(selector)
85 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
86 selector:add_where{ "__filter_area.unit_id = ?", unit.id }
87 end
88 }
89 end
91 if not selected_unit_found and selected_unit then
92 filter[#filter+1] = {
93 name = tostring(selected_unit.id),
94 label = selected_unit.name,
95 selector_modifier = function(selector)
96 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
97 selector:add_where{ "__filter_area.unit_id = ?", selected_unit.id }
98 end
99 }
100 end
102 --[[
103 filter.selector_modifier = function(selector)
104 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
105 selector:add_where{ "__filter_area.unit_id = ?", 81 }
106 end
107 --]]
109 filters[#filters+1] = filter
111 end
113 -- areas
115 if not config.single_area_id and selected_unit then
117 local filter = { class = "filter_unit", name = "area", label = _"area" }
119 filter[#filter+1] = {
120 name = "all",
121 label = _"all subject areas",
122 selector_modifier = function() end
123 }
125 local areas = selected_unit.areas
126 if config.area_reverse_order then
127 areas = {}
128 for i, area in ipairs(selected_unit.areas) do
129 table.insert(areas, 1, area)
130 end
131 end
133 for i, area in ipairs(areas) do
134 if area.active then
135 filter[#filter+1] = {
136 name = tostring(area.id),
137 label = area.name,
138 selector_modifier = function(selector)
139 if area.unit_id == selected_unit.id then
140 selector:add_where{ "issue.area_id = ?", area.id }
141 end
142 end
143 }
144 end
145 end
147 filters[#filters+1] = filter
149 --[[
150 else
152 local filter = { class = "filter_unit", name = "area", label = _"area" }
154 filter[#filter+1] = {
155 name = "all",
156 label = _"all subject areas",
157 selector_modifier = function() end
158 }
159 filter[#filter+1] = {
160 name = "_dummy",
161 label = _"Select unit first",
162 selector_modifier = function(selector) end
163 }
164 filters[#filters+1] = filter
165 --]]
166 end
168 if app.session.member_id then
170 -- interest
172 local filter = { class = "filter_filter", name = "filter", label = _"interest" }
174 filter[#filter+1] = {
175 name = "all",
176 label = _"all issues",
177 selector_modifier = function() end
178 }
180 if member and not for_unit and not for_area and not app.single_unit_id then
181 filter[#filter+1] = {
182 name = "my_units",
183 label = _"in my units",
184 selector_modifier = function ( selector )
185 selector:join ( "area", "filter_area", "filter_area.id = issue.area_id" )
186 selector:join ( "privilege", "filter_privilege", {
187 "filter_privilege.unit_id = filter_area.unit_id AND filter_privilege.member_id = ?", member.id
188 })
189 end
190 }
191 end
193 if member then
194 filter[#filter+1] = {
195 name = "my_issues",
196 label = _"my issues",
197 selector_modifier = function ( selector )
198 selector:left_join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id })
199 selector:left_join("direct_interest_snapshot", "filter_interest_s", { "filter_interest_s.issue_id = issue.id AND filter_interest_s.member_id = ? AND filter_interest_s.snapshot_id = issue.latest_snapshot_id", member.id })
200 selector:left_join("delegating_interest_snapshot", "filter_d_interest_s", { "filter_d_interest_s.issue_id = issue.id AND filter_d_interest_s.member_id = ? AND filter_d_interest_s.snapshot_id = issue.latest_snapshot_id", member.id })
201 end
202 }
203 end
205 if not config.voting_only then
206 filters[#filters+1] = filter
207 end
209 -- my issues
211 if request.get_param{ name = "filter" } == "my_issues" then
213 local delegation = request.get_param{ name = "delegation" }
215 local filter = { class = "filter_interest subfilter", name = "interest", label = _"delegation" }
217 filter[#filter+1] = {
218 name = "all",
219 label = _"interested directly or via delegation",
220 selector_modifier = function ( selector )
221 selector:add_where ( "filter_interest.issue_id NOTNULL OR filter_d_interest_s.issue_id NOTNULL" )
222 end
223 }
225 filter[#filter+1] = {
226 name = "direct",
227 label = _"direct interest",
228 selector_modifier = function ( selector )
229 selector:add_where ( "filter_interest.issue_id NOTNULL" )
230 end
231 }
233 filter[#filter+1] = {
234 name = "via_delegation",
235 label = _"interest via delegation",
236 selector_modifier = function ( selector )
237 selector:add_where ( "filter_d_interest_s.issue_id NOTNULL" )
238 end
239 }
241 filter[#filter+1] = {
242 name = "initiated",
243 label = _"initiated by me",
244 selector_modifier = function ( selector )
245 selector:add_where ( "filter_interest.issue_id NOTNULL" )
246 end
247 }
249 filters[#filters+1] = filter
251 end
253 end
255 -- phase
257 local filter = { name = "phase", label = _"phase" }
259 filter[#filter+1] = {
260 name = "all",
261 label = _"in all phases",
262 selector_modifier = function ( selector )
263 if not for_events then
264 selector:left_join ( "issue_order_in_admission_state", "filter_issue_order", "filter_issue_order.id = issue.id" )
265 selector:add_order_by ( "issue.closed DESC NULLS FIRST" )
266 selector:add_order_by ( "issue.accepted ISNULL" )
267 selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN NULL ELSE justify_interval(coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.max_admission_time) - now()) END" )
268 selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN " .. admission_order_field .. " ELSE NULL END" )
269 selector:add_order_by ( "id" )
270 end
271 end
272 }
274 filter[#filter+1] = {
275 name = "admission",
276 label = _"Admission",
277 selector_modifier = function ( selector )
278 selector:add_where { "issue.state = ?", "admission" }
279 if not for_events then
280 selector:left_join ( "issue_order_in_admission_state", "filter_issue_order", "filter_issue_order.id = issue.id" )
281 selector:add_order_by ( admission_order_field )
282 selector:add_order_by ( "id" )
283 end
284 end
285 }
287 filter[#filter+1] = {
288 name = "discussion",
289 label = _"Discussion",
290 selector_modifier = function ( selector )
291 selector:add_where { "issue.state = ?", "discussion" }
292 if not for_events then
293 selector:add_order_by ( "issue.accepted + issue.discussion_time - now()" )
294 selector:add_order_by ( "id" )
295 end
296 end
297 }
299 filter[#filter+1] = {
300 name = "verification",
301 label = _"Verification",
302 selector_modifier = function ( selector )
303 selector:add_where { "issue.state = ?", "verification" }
304 if not for_events then
305 selector:add_order_by ( "issue.half_frozen + issue.verification_time - now()" )
306 selector:add_order_by ( "id" )
307 end
308 end
309 }
311 filter[#filter+1] = {
312 name = "voting",
313 label = _"Voting",
314 selector_modifier = function ( selector )
315 selector:add_where { "issue.state = ?", "voting" }
316 if not for_events then
317 selector:add_order_by ( "issue.fully_frozen + issue.voting_time - now()" )
318 selector:add_order_by ( "id" )
319 end
320 end
321 }
323 filter[#filter+1] = {
324 name = "closed",
325 label = _"Results",
326 selector_modifier = function ( selector )
327 if not for_events then
328 selector:add_where ( "issue.closed NOTNULL" )
329 selector:add_order_by ( "issue.closed DESC" )
330 selector:add_order_by ( "id" )
331 end
332 end
333 }
335 -- TODO
336 if not config.voting_only then
337 filters[#filters+1] = filter
338 end
340 -- voting
342 if phase == "voting" and member then
344 local filter = { class = "subfilter", name = "voted", label = _"voted" }
346 filter[#filter+1] = {
347 name = "all",
348 label = _"voted and not voted by me",
349 selector_modifier = function(selector) end
350 }
352 filter[#filter+1] = {
353 name = "voted",
354 label = _"voted by me",
355 selector_modifier = function(selector)
356 selector:join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
357 end
358 }
360 filter[#filter+1] = {
361 name = "not_voted",
362 label = _"not voted by me",
363 selector_modifier = function(selector)
364 selector:left_join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
365 selector:add_where("filter_direct_voter.issue_id ISNULL")
366 end
367 }
368 filters[#filters+1] = filter
371 end
373 -- closed
375 if phase == "closed" then
377 local filter = { class = "subfilter", name = "closed", label = _"closed" }
379 filter[#filter+1] = {
380 name = "all",
381 label = _"all results",
382 selector_modifier = function ( selector ) end
383 }
385 filter[#filter+1] = {
386 name = "finished",
387 label = _"finished",
388 selector_modifier = function ( selector )
389 selector:add_where ( "issue.state::text like 'finished_%'" )
390 end
391 }
393 filter[#filter+1] = {
394 name = "canceled",
395 label = _"canceled",
396 selector_modifier = function ( selector )
397 selector:add_where ( "issue.closed NOTNULL AND NOT issue.state::text like 'finished_%' AND issue.accepted NOTNULL" )
398 end
399 }
401 filter[#filter+1] = {
402 name = "not_accepted",
403 label = _"not admitted",
404 selector_modifier = function ( selector )
405 selector:add_where ( "issue.closed NOTNULL AND issue.accepted ISNULL" )
406 end
407 }
409 if member then
410 filter[#filter+1] = {
411 name = "voted",
412 label = _"voted by me",
413 selector_modifier = function(selector)
414 selector:left_join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
415 selector:left_join("delegating_voter", "filter_delegating_voter", { "filter_delegating_voter.issue_id = issue.id AND filter_delegating_voter.member_id = ?", member.id })
416 selector:add_where("filter_direct_voter.issue_id NOTNULL or filter_delegating_voter.issue_id NOTNULL")
417 end
418 }
420 filter[#filter+1] = {
421 name = "voted_direct",
422 label = _"voted directly by me",
423 selector_modifier = function(selector)
424 selector:join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
425 end
426 }
428 filter[#filter+1] = {
429 name = "voted_via_delegation",
430 label = _"voted via delegation",
431 selector_modifier = function(selector)
432 selector:join("delegating_voter", "filter_delegating_voter", { "filter_delegating_voter.issue_id = issue.id AND filter_delegating_voter.member_id = ?", member.id })
433 end
434 }
436 filter[#filter+1] = {
437 name = "not_voted",
438 label = _"not voted by me",
439 selector_modifier = function(selector)
440 selector:left_join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
441 selector:left_join("delegating_voter", "filter_delegating_voter", { "filter_delegating_voter.issue_id = issue.id AND filter_delegating_voter.member_id = ?", member.id })
442 selector:add_where("filter_direct_voter.issue_id ISNULL AND filter_delegating_voter.issue_id ISNULL")
443 end
444 }
445 end
447 filters[#filters+1] = filter
450 end
453 end
456 return filters

Impressum / About Us