liquid_feedback_frontend

annotate 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
rev   line source
bsw@414 1 local for_unit = param.get("for_unit", atom.boolean)
bsw@414 2 local for_area = param.get("for_area", atom.boolean)
bsw@851 3 local for_events = param.get("for_events", atom.boolean)
bsw@1045 4 local for_member = param.get("for_member", "table")
bsw@1045 5 local member = param.get("member", "table")
bsw@1180 6 local phase = request.get_param{ name = "phase" }
bsw@851 7
bsw@1700 8 local selected_unit_id = config.single_unit_id or request.get_param{ name = "unit" } or app.single_unit_id
bsw@1570 9 if selected_unit_id == "all" then
bsw@1570 10 selected_unit_id = nil
bsw@1570 11 end
bsw@1570 12 local selected_unit = Unit:by_id(selected_unit_id)
bsw@1570 13
poelzi@127 14 local filters = {}
poelzi@127 15
bsw@1045 16 local admission_order_field = "filter_issue_order.order_in_unit"
bsw@1045 17 if for_area then
bsw@1045 18 admission_order_field = "filter_issue_order.order_in_area"
bsw@525 19 end
bsw@525 20
bsw/jbe@1309 21 local filter = { class = "filter_mode", name = "mode", label = _"mode" }
bsw/jbe@1309 22
bsw/jbe@1309 23 filter[#filter+1] = {
bsw/jbe@1309 24 name = "issue",
bsw/jbe@1309 25 label = _"issue list",
bsw/jbe@1309 26 selector_modifier = function() end
bsw/jbe@1309 27 }
bsw/jbe@1309 28
bsw/jbe@1309 29 filter[#filter+1] = {
bsw/jbe@1309 30 name = "timeline",
bsw/jbe@1309 31 label = _"timeline",
bsw/jbe@1309 32 selector_modifier = function() end
bsw/jbe@1309 33 }
bsw/jbe@1309 34
bsw/jbe@1309 35 --filters[#filters+1] = filter
bsw/jbe@1309 36
bsw@1045 37 if not for_issue and not for_member then
bsw@1045 38
bsw/jbe@1309 39 -- units
bsw@1045 40
bsw@1696 41 if not app.single_unit_id then
bsw@1504 42
bsw@1504 43 local units_selector
bsw@1504 44
bsw/jbe@1309 45 if app.session.member then
bsw@1504 46 units_selector = app.session.member:get_reference_selector("units")
bsw@1504 47 :add_order_by("name")
bsw/jbe@1309 48 else
bsw@1504 49 units_selector = Unit:new_selector()
bsw@1504 50 :add_order_by("name")
bsw@1045 51 end
bsw@1045 52
bsw@1504 53 local units = units_selector
bsw@1504 54 :add_where("attr->'hidden' ISNULL OR NOT (attr->'hidden' = 'true')")
bsw@1504 55 :add_where("active")
bsw@1504 56 :exec()
bsw@1504 57
bsw/jbe@1309 58 units:load_delegation_info_once_for_member_id(app.session.member_id)
bsw@1045 59
bsw/jbe@1309 60
bsw/jbe@1309 61 local filter = { class = "filter_unit", name = "unit", label = _"unit" }
bsw@1045 62
bsw@1045 63 filter[#filter+1] = {
bsw/jbe@1309 64 name = "all",
bsw@1389 65 label = _"All units",
bsw@1429 66 selector_modifier = function(selector)
bsw@1427 67 if app.session.member then
bsw@1434 68 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
bsw@1432 69 selector:join("unit", "__filter_unit", "__filter_unit.id = __filter_area.unit_id AND __filter_unit.active")
bsw@1429 70 selector:join("privilege", "__filter_privilege", { "__filter_privilege.unit_id = __filter_area.unit_id AND __filter_privilege.member_id = ?", app.session.member_id })
bsw@1427 71 end
bsw@1427 72 end
bsw@1045 73 }
bsw/jbe@1309 74
bsw@1570 75 local selected_unit_found = false
bsw@1570 76
bsw/jbe@1309 77 for i, unit in ipairs(units) do
bsw@1570 78 if selected_unit and unit.id == selected_unit.id then
bsw@1570 79 selected_unit_found = true
bsw@1570 80 end
bsw/jbe@1309 81 filter[#filter+1] = {
bsw/jbe@1309 82 name = tostring(unit.id),
bsw/jbe@1309 83 label = unit.name,
bsw/jbe@1309 84 selector_modifier = function(selector)
bsw@1435 85 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
bsw/jbe@1309 86 selector:add_where{ "__filter_area.unit_id = ?", unit.id }
bsw/jbe@1309 87 end
bsw/jbe@1309 88 }
bsw/jbe@1309 89 end
bsw/jbe@1309 90
bsw@1570 91 if not selected_unit_found and selected_unit then
bsw@1570 92 filter[#filter+1] = {
bsw@1570 93 name = tostring(selected_unit.id),
bsw@1570 94 label = selected_unit.name,
bsw@1570 95 selector_modifier = function(selector)
bsw@1570 96 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
bsw@1570 97 selector:add_where{ "__filter_area.unit_id = ?", selected_unit.id }
bsw@1570 98 end
bsw@1570 99 }
bsw@1570 100 end
bsw@1570 101
bsw@1570 102 --[[
bsw@1570 103 filter.selector_modifier = function(selector)
bsw@1570 104 selector:join("area", "__filter_area", "__filter_area.id = issue.area_id AND __filter_area.active")
bsw@1570 105 selector:add_where{ "__filter_area.unit_id = ?", 81 }
bsw@1570 106 end
bsw@1570 107 --]]
bsw@1570 108
bsw/jbe@1309 109 filters[#filters+1] = filter
bsw/jbe@1309 110
bsw@1045 111 end
bsw@1045 112
bsw/jbe@1309 113 -- areas
bsw/jbe@1309 114
bsw/jbe@1309 115 if not config.single_area_id and selected_unit then
bsw/jbe@1309 116
bsw/jbe@1309 117 local filter = { class = "filter_unit", name = "area", label = _"area" }
bsw/jbe@1309 118
bsw/jbe@1309 119 filter[#filter+1] = {
bsw/jbe@1309 120 name = "all",
bsw/jbe@1309 121 label = _"all subject areas",
bsw/jbe@1309 122 selector_modifier = function() end
bsw/jbe@1309 123 }
bsw@1045 124
bsw/jbe@1309 125 local areas = selected_unit.areas
bsw/jbe@1309 126 if config.area_reverse_order then
bsw/jbe@1309 127 areas = {}
bsw/jbe@1309 128 for i, area in ipairs(selected_unit.areas) do
bsw/jbe@1309 129 table.insert(areas, 1, area)
bsw/jbe@1309 130 end
bsw/jbe@1309 131 end
bsw/jbe@1309 132
bsw/jbe@1309 133 for i, area in ipairs(areas) do
bsw/jbe@1309 134 if area.active then
bsw/jbe@1309 135 filter[#filter+1] = {
bsw/jbe@1309 136 name = tostring(area.id),
bsw/jbe@1309 137 label = area.name,
bsw/jbe@1309 138 selector_modifier = function(selector)
bsw/jbe@1309 139 if area.unit_id == selected_unit.id then
bsw/jbe@1309 140 selector:add_where{ "issue.area_id = ?", area.id }
bsw/jbe@1309 141 end
bsw/jbe@1309 142 end
bsw/jbe@1309 143 }
bsw/jbe@1309 144 end
bsw/jbe@1309 145 end
bsw/jbe@1309 146
bsw/jbe@1309 147 filters[#filters+1] = filter
bsw@1489 148
bsw@1489 149 --[[
bsw@1489 150 else
bsw@1489 151
bsw@1489 152 local filter = { class = "filter_unit", name = "area", label = _"area" }
bsw@1489 153
bsw@1489 154 filter[#filter+1] = {
bsw@1489 155 name = "all",
bsw@1489 156 label = _"all subject areas",
bsw@1489 157 selector_modifier = function() end
bsw@1489 158 }
bsw@1489 159 filter[#filter+1] = {
bsw@1489 160 name = "_dummy",
bsw@1489 161 label = _"Select unit first",
bsw@1489 162 selector_modifier = function(selector) end
bsw@1489 163 }
bsw@1489 164 filters[#filters+1] = filter
bsw@1489 165 --]]
bsw/jbe@1309 166 end
bsw/jbe@1309 167
bsw/jbe@1309 168 if app.session.member_id then
bsw/jbe@1309 169
bsw/jbe@1309 170 -- interest
bsw/jbe@1309 171
bsw/jbe@1309 172 local filter = { class = "filter_filter", name = "filter", label = _"interest" }
bsw/jbe@1309 173
bsw@1045 174 filter[#filter+1] = {
bsw/jbe@1309 175 name = "all",
bsw/jbe@1309 176 label = _"all issues",
bsw/jbe@1309 177 selector_modifier = function() end
bsw@1045 178 }
bsw/jbe@1309 179
bsw@1696 180 if member and not for_unit and not for_area and not app.single_unit_id then
bsw/jbe@1309 181 filter[#filter+1] = {
bsw/jbe@1309 182 name = "my_units",
bsw/jbe@1309 183 label = _"in my units",
bsw/jbe@1309 184 selector_modifier = function ( selector )
bsw/jbe@1309 185 selector:join ( "area", "filter_area", "filter_area.id = issue.area_id" )
bsw/jbe@1309 186 selector:join ( "privilege", "filter_privilege", {
bsw/jbe@1309 187 "filter_privilege.unit_id = filter_area.unit_id AND filter_privilege.member_id = ?", member.id
bsw/jbe@1309 188 })
bsw/jbe@1309 189 end
bsw/jbe@1309 190 }
bsw/jbe@1309 191 end
bsw/jbe@1309 192
bsw/jbe@1309 193 if member then
bsw/jbe@1309 194 filter[#filter+1] = {
bsw/jbe@1309 195 name = "my_issues",
bsw/jbe@1309 196 label = _"my issues",
bsw/jbe@1309 197 selector_modifier = function ( selector )
bsw/jbe@1309 198 selector:left_join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id })
bsw/jbe@1309 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 })
bsw/jbe@1309 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 })
bsw/jbe@1309 201 end
bsw/jbe@1309 202 }
bsw/jbe@1309 203 end
bsw/jbe@1309 204
bsw/jbe@1309 205 if not config.voting_only then
bsw/jbe@1309 206 filters[#filters+1] = filter
bsw/jbe@1309 207 end
bsw/jbe@1309 208
bsw/jbe@1309 209 -- my issues
bsw/jbe@1309 210
bsw/jbe@1309 211 if request.get_param{ name = "filter" } == "my_issues" then
bsw/jbe@1309 212
bsw/jbe@1309 213 local delegation = request.get_param{ name = "delegation" }
bsw/jbe@1309 214
bsw/jbe@1309 215 local filter = { class = "filter_interest subfilter", name = "interest", label = _"delegation" }
bsw/jbe@1309 216
bsw/jbe@1309 217 filter[#filter+1] = {
bsw/jbe@1309 218 name = "all",
bsw/jbe@1309 219 label = _"interested directly or via delegation",
bsw/jbe@1309 220 selector_modifier = function ( selector )
bsw/jbe@1309 221 selector:add_where ( "filter_interest.issue_id NOTNULL OR filter_d_interest_s.issue_id NOTNULL" )
bsw/jbe@1309 222 end
bsw/jbe@1309 223 }
bsw/jbe@1309 224
bsw/jbe@1309 225 filter[#filter+1] = {
bsw/jbe@1309 226 name = "direct",
bsw/jbe@1309 227 label = _"direct interest",
bsw/jbe@1309 228 selector_modifier = function ( selector )
bsw/jbe@1309 229 selector:add_where ( "filter_interest.issue_id NOTNULL" )
bsw/jbe@1309 230 end
bsw/jbe@1309 231 }
bsw/jbe@1309 232
bsw/jbe@1309 233 filter[#filter+1] = {
bsw/jbe@1309 234 name = "via_delegation",
bsw/jbe@1309 235 label = _"interest via delegation",
bsw/jbe@1309 236 selector_modifier = function ( selector )
bsw/jbe@1309 237 selector:add_where ( "filter_d_interest_s.issue_id NOTNULL" )
bsw/jbe@1309 238 end
bsw/jbe@1309 239 }
bsw/jbe@1309 240
bsw/jbe@1309 241 filter[#filter+1] = {
bsw/jbe@1309 242 name = "initiated",
bsw/jbe@1309 243 label = _"initiated by me",
bsw/jbe@1309 244 selector_modifier = function ( selector )
bsw/jbe@1309 245 selector:add_where ( "filter_interest.issue_id NOTNULL" )
bsw/jbe@1309 246 end
bsw/jbe@1309 247 }
bsw/jbe@1309 248
bsw/jbe@1309 249 filters[#filters+1] = filter
bsw/jbe@1309 250
bsw/jbe@1309 251 end
bsw/jbe@1309 252
bsw@1045 253 end
bsw@1045 254
bsw@1045 255 -- phase
bsw@1045 256
bsw/jbe@1309 257 local filter = { name = "phase", label = _"phase" }
bsw@1045 258
bsw@1045 259 filter[#filter+1] = {
bsw@1045 260 name = "all",
bsw@1045 261 label = _"in all phases",
bsw@1045 262 selector_modifier = function ( selector )
bsw@1045 263 if not for_events then
bsw@1045 264 selector:left_join ( "issue_order_in_admission_state", "filter_issue_order", "filter_issue_order.id = issue.id" )
bsw@1045 265 selector:add_order_by ( "issue.closed DESC NULLS FIRST" )
bsw@1045 266 selector:add_order_by ( "issue.accepted ISNULL" )
bsw@1234 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" )
bsw@1045 268 selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN " .. admission_order_field .. " ELSE NULL END" )
bsw@1045 269 selector:add_order_by ( "id" )
bsw@851 270 end
bsw@525 271 end
bsw@525 272 }
bsw@525 273
bsw@525 274 filter[#filter+1] = {
bsw@1045 275 name = "admission",
bsw/jbe@1309 276 label = _"Admission",
bsw@1045 277 selector_modifier = function ( selector )
bsw@1045 278 selector:add_where { "issue.state = ?", "admission" }
bsw@1045 279 if not for_events then
bsw@1045 280 selector:left_join ( "issue_order_in_admission_state", "filter_issue_order", "filter_issue_order.id = issue.id" )
bsw@1045 281 selector:add_order_by ( admission_order_field )
bsw@1045 282 selector:add_order_by ( "id" )
bsw@851 283 end
bsw@525 284 end
bsw@525 285 }
bsw@1045 286
bsw@525 287 filter[#filter+1] = {
bsw@1045 288 name = "discussion",
bsw/jbe@1309 289 label = _"Discussion",
bsw@1045 290 selector_modifier = function ( selector )
bsw@1045 291 selector:add_where { "issue.state = ?", "discussion" }
bsw@1045 292 if not for_events then
bsw@1045 293 selector:add_order_by ( "issue.accepted + issue.discussion_time - now()" )
bsw@1045 294 selector:add_order_by ( "id" )
bsw@851 295 end
bsw@525 296 end
bsw@525 297 }
bsw@1045 298
bsw@525 299 filter[#filter+1] = {
bsw@1045 300 name = "verification",
bsw/jbe@1309 301 label = _"Verification",
bsw@1045 302 selector_modifier = function ( selector )
bsw@1045 303 selector:add_where { "issue.state = ?", "verification" }
bsw@1045 304 if not for_events then
bsw@1045 305 selector:add_order_by ( "issue.half_frozen + issue.verification_time - now()" )
bsw@1045 306 selector:add_order_by ( "id" )
bsw@1045 307 end
bsw@1045 308 end
bsw@1045 309 }
bsw@1045 310
bsw@1045 311 filter[#filter+1] = {
bsw@1045 312 name = "voting",
bsw/jbe@1309 313 label = _"Voting",
bsw@1045 314 selector_modifier = function ( selector )
bsw@1045 315 selector:add_where { "issue.state = ?", "voting" }
bsw@1045 316 if not for_events then
bsw@1045 317 selector:add_order_by ( "issue.fully_frozen + issue.voting_time - now()" )
bsw@1045 318 selector:add_order_by ( "id" )
bsw@851 319 end
bsw@525 320 end
bsw@525 321 }
bsw@525 322
bsw@525 323 filter[#filter+1] = {
bsw@1045 324 name = "closed",
bsw/jbe@1309 325 label = _"Results",
bsw@1045 326 selector_modifier = function ( selector )
bsw@1045 327 if not for_events then
bsw@1045 328 selector:add_where ( "issue.closed NOTNULL" )
bsw@1045 329 selector:add_order_by ( "issue.closed DESC" )
bsw@1045 330 selector:add_order_by ( "id" )
bsw@851 331 end
bsw@525 332 end
bsw@525 333 }
bsw@1045 334
bsw/jbe@1309 335 -- TODO
bsw/jbe@1309 336 if not config.voting_only then
bsw@1045 337 filters[#filters+1] = filter
bsw@1045 338 end
bsw@1045 339
bsw@1045 340 -- voting
bsw@1045 341
bsw@1045 342 if phase == "voting" and member then
bsw@1045 343
bsw/jbe@1309 344 local filter = { class = "subfilter", name = "voted", label = _"voted" }
bsw@1045 345
bsw@1045 346 filter[#filter+1] = {
bsw@1045 347 name = "all",
bsw@1045 348 label = _"voted and not voted by me",
bsw@1045 349 selector_modifier = function(selector) end
bsw@1045 350 }
bsw@1045 351
bsw@1045 352 filter[#filter+1] = {
bsw@1045 353 name = "voted",
bsw@1045 354 label = _"voted by me",
bsw@1045 355 selector_modifier = function(selector)
bsw@1045 356 selector:join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
bsw@851 357 end
bsw@1045 358 }
bsw@1045 359
bsw@1045 360 filter[#filter+1] = {
bsw@1045 361 name = "not_voted",
bsw@1045 362 label = _"not voted by me",
bsw@1045 363 selector_modifier = function(selector)
bsw@1045 364 selector:left_join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
bsw@1045 365 selector:add_where("filter_direct_voter.issue_id ISNULL")
bsw@851 366 end
bsw@1045 367 }
bsw@1045 368 filters[#filters+1] = filter
bsw@1045 369
bsw@1045 370
bsw@1045 371 end
bsw@1045 372
bsw@1045 373 -- closed
bsw@1045 374
bsw@1045 375 if phase == "closed" then
bsw@1045 376
bsw/jbe@1309 377 local filter = { class = "subfilter", name = "closed", label = _"closed" }
bsw@1045 378
bsw@1045 379 filter[#filter+1] = {
bsw/jbe@1309 380 name = "all",
bsw/jbe@1309 381 label = _"all results",
bsw/jbe@1309 382 selector_modifier = function ( selector ) end
bsw/jbe@1309 383 }
bsw/jbe@1309 384
bsw/jbe@1309 385 filter[#filter+1] = {
bsw@1045 386 name = "finished",
bsw@1045 387 label = _"finished",
bsw@1045 388 selector_modifier = function ( selector )
bsw@1045 389 selector:add_where ( "issue.state::text like 'finished_%'" )
bsw@1045 390 end
bsw@1045 391 }
bsw@1045 392
bsw@1045 393 filter[#filter+1] = {
bsw@1045 394 name = "canceled",
bsw@1045 395 label = _"canceled",
bsw@1045 396 selector_modifier = function ( selector )
bsw@1045 397 selector:add_where ( "issue.closed NOTNULL AND NOT issue.state::text like 'finished_%' AND issue.accepted NOTNULL" )
bsw@851 398 end
bsw@1045 399 }
bsw@1045 400
bsw@1045 401 filter[#filter+1] = {
bsw@1045 402 name = "not_accepted",
bsw@1045 403 label = _"not admitted",
bsw@1045 404 selector_modifier = function ( selector )
bsw@1045 405 selector:add_where ( "issue.closed NOTNULL AND issue.accepted ISNULL" )
bsw@1045 406 end
bsw@1045 407 }
bsw@525 408
bsw@1045 409 if member then
bsw@1045 410 filter[#filter+1] = {
bsw@1045 411 name = "voted",
bsw@1045 412 label = _"voted by me",
bsw@1045 413 selector_modifier = function(selector)
bsw@1045 414 selector:left_join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
bsw@1045 415 selector:left_join("delegating_voter", "filter_delegating_voter", { "filter_delegating_voter.issue_id = issue.id AND filter_delegating_voter.member_id = ?", member.id })
bsw@1045 416 selector:add_where("filter_direct_voter.issue_id NOTNULL or filter_delegating_voter.issue_id NOTNULL")
bsw@1045 417 end
bsw@1045 418 }
bsw@525 419
bsw@1045 420 filter[#filter+1] = {
bsw@1045 421 name = "voted_direct",
bsw@1045 422 label = _"voted directly by me",
bsw@1045 423 selector_modifier = function(selector)
bsw@1045 424 selector:join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
bsw@1045 425 end
bsw@1045 426 }
bsw@1045 427
bsw@459 428 filter[#filter+1] = {
bsw@1045 429 name = "voted_via_delegation",
bsw@1045 430 label = _"voted via delegation",
bsw@1045 431 selector_modifier = function(selector)
bsw@1045 432 selector:join("delegating_voter", "filter_delegating_voter", { "filter_delegating_voter.issue_id = issue.id AND filter_delegating_voter.member_id = ?", member.id })
bsw@1045 433 end
bsw@459 434 }
bsw@1045 435
bsw@459 436 filter[#filter+1] = {
bsw@1045 437 name = "not_voted",
bsw@1045 438 label = _"not voted by me",
bsw@459 439 selector_modifier = function(selector)
bsw@1045 440 selector:left_join("direct_voter", "filter_direct_voter", { "filter_direct_voter.issue_id = issue.id AND filter_direct_voter.member_id = ?", member.id })
bsw@1045 441 selector:left_join("delegating_voter", "filter_delegating_voter", { "filter_delegating_voter.issue_id = issue.id AND filter_delegating_voter.member_id = ?", member.id })
bsw@1045 442 selector:add_where("filter_direct_voter.issue_id ISNULL AND filter_delegating_voter.issue_id ISNULL")
bsw@459 443 end
bsw@459 444 }
bsw@459 445 end
bsw@1045 446
bsw@1045 447 filters[#filters+1] = filter
bsw@1045 448
bsw@1045 449
bsw@851 450 end
bsw@414 451
bsw@1045 452
bsw@414 453 end
poelzi@127 454
bsw@414 455
bsw@1045 456 return filters

Impressum / About Us