liquid_feedback_frontend

annotate app/main/issue/_filters.lua @ 853:350218637753

Handle not existing filter options better
author bsw
date Fri Aug 17 00:23:08 2012 +0200 (2012-08-17)
parents 82f13fbbc05a
children 8b856ffeec2d
rev   line source
bsw@284 1 local member = param.get("member", "table")
bsw@459 2 local for_member = param.get("for_member", "table")
bsw@414 3 local state = param.get("state")
bsw@414 4 local for_unit = param.get("for_unit", atom.boolean)
bsw@414 5 local for_area = param.get("for_area", atom.boolean)
bsw@284 6
bsw@851 7 local for_events = param.get("for_events", atom.boolean)
bsw@851 8
poelzi@127 9 local filters = {}
poelzi@127 10
bsw@525 11 local filter = { name = "filter" }
bsw@525 12
bsw@525 13 if state ~= "closed" then
bsw@525 14 filter[#filter+1] = {
bsw@525 15 name = "any",
bsw@525 16 label = _"Any phase",
bsw@525 17 selector_modifier = function(selector) end
bsw@525 18 }
bsw@525 19 end
bsw@525 20
bsw@525 21 if not state then
bsw@525 22 filter[#filter+1] = {
bsw@525 23 name = "open",
bsw@525 24 label = _"Open",
bsw@525 25 selector_modifier = function(selector)
bsw@851 26 if for_events then
bsw@851 27 selector:add_where("event.state in ('admission', 'discussion', 'verification', 'voting')")
bsw@851 28 else
bsw@851 29 selector:add_where("issue.closed ISNULL")
bsw@851 30 end
bsw@525 31 end
bsw@525 32 }
bsw@525 33 end
bsw@525 34
bsw@525 35 if not state or state == "open" then
bsw@525 36 filter[#filter+1] = {
bsw@525 37 name = "new",
bsw@525 38 label = _"New",
bsw@525 39 selector_modifier = function(selector)
bsw@851 40 if for_events then
bsw@851 41 selector:add_where("event.state = 'admission'")
bsw@851 42 else
bsw@851 43 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
bsw@851 44 end
bsw@525 45 end
bsw@525 46 }
bsw@525 47 filter[#filter+1] = {
bsw@525 48 name = "accepted",
bsw@525 49 label = _"Discussion",
bsw@525 50 selector_modifier = function(selector)
bsw@851 51 if for_events then
bsw@851 52 selector:add_where("event.state = 'discussion'")
bsw@851 53 else
bsw@851 54 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
bsw@851 55 end
bsw@525 56 end
bsw@525 57 }
bsw@525 58 filter[#filter+1] = {
bsw@525 59 name = "half_frozen",
bsw@525 60 label = _"Frozen",
bsw@525 61 selector_modifier = function(selector)
bsw@851 62 if for_events then
bsw@851 63 selector:add_where("event.state = 'verification'")
bsw@851 64 else
bsw@851 65 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL")
bsw@851 66 end
bsw@525 67 end
bsw@525 68 }
bsw@525 69 filter[#filter+1] = {
bsw@525 70 name = "frozen",
bsw@525 71 label = _"Voting",
bsw@525 72 selector_modifier = function(selector)
bsw@851 73 if for_events then
bsw@851 74 selector:add_where("event.state = 'voting'")
bsw@851 75 else
bsw@851 76 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
bsw@851 77 end
bsw@525 78 filter_voting = true
bsw@525 79 end
bsw@525 80 }
bsw@525 81 end
bsw@525 82
bsw@525 83 if not state then
bsw@525 84 filter[#filter+1] = {
bsw@525 85 name = "finished",
bsw@525 86 label = _"Finished",
bsw@525 87 selector_modifier = function(selector)
bsw@851 88 if for_events then
bsw@851 89 selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')")
bsw@851 90 else
bsw@851 91 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL")
bsw@851 92 end
bsw@525 93 end
bsw@525 94 }
bsw@525 95 filter[#filter+1] = {
bsw@525 96 name = "cancelled",
bsw@525 97 label = _"Cancelled",
bsw@525 98 selector_modifier = function(selector)
bsw@851 99
bsw@851 100 if for_events then
bsw@851 101 selector:add_where("event.state IN ('canceled_revoked_before_accepted', 'canceled_issue_not_accepted', 'canceled_after_revocation_during_discussion', 'canceled_after_revocation_during_verification')")
bsw@851 102 else
bsw@851 103 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL")
bsw@851 104 end
bsw@525 105 end
bsw@525 106 }
bsw@525 107 end
bsw@525 108
bsw@525 109 if state == "closed" then
bsw@525 110 filter[#filter+1] = {
bsw@525 111 name = "any",
bsw@525 112 label = _"Any state",
bsw@525 113 selector_modifier = function(selector) end
bsw@525 114 }
bsw@525 115
bsw@525 116 filter[#filter+1] = {
bsw@525 117 name = "finished",
bsw@525 118 label = _"Finished",
bsw@525 119 selector_modifier = function(selector)
bsw@851 120 if for_events then
bsw@851 121 selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')")
bsw@851 122 else
bsw@851 123 selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')")
bsw@851 124 end
bsw@525 125 end
bsw@525 126 }
bsw@525 127 filter[#filter+1] = {
bsw@525 128 name = "finished_with_winner",
bsw@525 129 label = _"with winner",
bsw@525 130 selector_modifier = function(selector)
bsw@851 131 if for_events then
bsw@851 132 selector:add_where("event.state = 'finished_with_winner'")
bsw@851 133 else
bsw@851 134 selector:add_where("issue.state = 'finished_with_winner'")
bsw@851 135 end
bsw@525 136 end
bsw@525 137 }
bsw@525 138 filter[#filter+1] = {
bsw@525 139 name = "finished_without_winner",
bsw@525 140 label = _"without winner",
bsw@525 141 selector_modifier = function(selector)
bsw@851 142 if for_events then
bsw@851 143 selector:add_where("event.state = 'finished_without_winner'")
bsw@851 144 else
bsw@851 145 selector:add_where("issue.state = 'finished_without_winner'")
bsw@851 146 end
bsw@525 147 end
bsw@525 148 }
bsw@525 149 filter[#filter+1] = {
bsw@525 150 name = "cancelled",
bsw@525 151 label = _"Cancelled",
bsw@525 152 selector_modifier = function(selector)
bsw@851 153 if for_events then
bsw@851 154 selector:add_where("event.state NOT IN ('finished_with_winner', 'finished_without_winner')")
bsw@851 155 else
bsw@851 156 selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')")
bsw@851 157 end
bsw@525 158 end
bsw@525 159 }
bsw@525 160 end
bsw@525 161
bsw@525 162 filters[#filters+1] = filter
bsw@525 163
bsw@525 164
bsw@414 165 if member then
bsw@414 166 local filter = {
bsw@414 167 name = "filter_interest",
bsw@414 168 }
bsw@459 169 if not for_member then
bsw@459 170 if not for_unit and not for_area then
bsw@459 171 filter[#filter+1] = {
bsw@459 172 name = "any",
bsw@459 173 label = _"All units",
bsw@459 174 selector_modifier = function() end
bsw@459 175 }
bsw@459 176 filter[#filter+1] = {
bsw@459 177 name = "unit",
bsw@459 178 label = _"My units",
bsw@459 179 selector_modifier = function(selector)
bsw@459 180 selector:join("area", nil, "area.id = issue.area_id")
bsw@459 181 selector:join("privilege", nil, { "privilege.unit_id = area.unit_id AND privilege.member_id = ? AND privilege.voting_right", member.id })
bsw@459 182 end
bsw@459 183 }
bsw@459 184 end
bsw@459 185 if for_unit and not for_area then
bsw@414 186 filter[#filter+1] = {
bsw@459 187 name = "any",
bsw@459 188 label = _"All areas",
bsw@459 189 selector_modifier = function() end
bsw@459 190 }
bsw@459 191 end
bsw@459 192 if not for_area then
bsw@459 193 filter[#filter+1] = {
bsw@459 194 name = "area",
bsw@459 195 label = _"My areas",
bsw@459 196 selector_modifier = function(selector)
bsw@459 197 selector:join("membership", nil, { "membership.area_id = issue.area_id AND membership.member_id = ?", member.id })
bsw@459 198 end
bsw@459 199 }
bsw@459 200 end
bsw@459 201 if for_area then
bsw@414 202 filter[#filter+1] = {
bsw@459 203 name = "any",
bsw@459 204 label = _"All issues",
bsw@459 205 selector_modifier = function() end
bsw@459 206 }
bsw@459 207 end
bsw@414 208 end
bsw@414 209 filter[#filter+1] = {
bsw@414 210 name = "issue",
bsw@414 211 label = _"Interested",
bsw@414 212 selector_modifier = function() end
bsw@414 213 }
bsw@414 214 filter[#filter+1] = {
bsw@851 215 name = "initiated",
bsw@851 216 label = _"Initiated",
bsw@851 217 selector_modifier = function(selector)
bsw@851 218 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted WHERE initiative.issue_id = issue.id)", member.id })
bsw@851 219 end
bsw@851 220 }
bsw@851 221 filter[#filter+1] = {
bsw@414 222 name = "supported",
bsw@414 223 label = _"Supported",
bsw@414 224 selector_modifier = function() end
bsw@414 225 }
bsw@414 226 filter[#filter+1] = {
bsw@414 227 name = "potentially_supported",
bsw@414 228 label = _"Potentially supported",
bsw@414 229 selector_modifier = function() end
bsw@414 230 }
bsw@853 231 if state == 'closed' or (for_events) then
bsw@851 232 filter[#filter+1] = {
bsw@851 233 name = "voted",
bsw@851 234 label = _"Voted",
bsw@851 235 selector_modifier = function() end
bsw@851 236 }
bsw@851 237 end
bsw@414 238
bsw@414 239 filters[#filters+1] = filter
bsw@414 240 end
poelzi@127 241
bsw@414 242
bsw@414 243
bsw@414 244 if app.session.member then
bsw@414 245
bsw@414 246 local filter_interest = param.get_all_cgi()["filter_interest"]
bsw@414 247
bsw@414 248 if filter_interest ~= "any" and filter_interest ~= nil and (
bsw@853 249 filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" or
bsw@853 250 (filter_interest == 'voted' and state ~= 'open')
bsw@552 251 ) then
bsw@552 252
bsw@552 253 local function add_default_joins(selector)
bsw@552 254 selector:left_join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id })
bsw@552 255 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.event = issue.latest_snapshot_event", member.id })
bsw@552 256 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.event = issue.latest_snapshot_event", member.id })
bsw@552 257 end
bsw@552 258
bsw@414 259 filters[#filters+1] = {
bsw@414 260 name = "filter_delegation",
bsw@414 261 {
bsw@414 262 name = "any",
bsw@414 263 label = _"Direct and by delegation",
bsw@414 264 selector_modifier = function(selector)
bsw@552 265 add_default_joins(selector)
bsw@552 266 selector:add_where("CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN filter_interest.member_id NOTNULL ELSE filter_interest_s.member_id NOTNULL END OR filter_d_interest_s.member_id NOTNULL")
bsw@552 267 if filter_interest == "supported" then
bsw@552 268 selector:add_where({
bsw@552 269 "CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN " ..
bsw@552 270 "EXISTS(SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = supporter.member_id WHERE initiative.issue_id = issue.id AND critical_opinion.member_id ISNULL) " ..
bsw@552 271 "ELSE " ..
bsw@552 272 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND direct_supporter_snapshot.satisfied) " ..
bsw@552 273 "END OR EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND direct_supporter_snapshot.satisfied)", member.id, member.id, member.id })
bsw@552 274
bsw@414 275 elseif filter_interest == "potentially_supported" then
bsw@552 276 selector:add_where({
bsw@552 277 "CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN " ..
bsw@552 278 "EXISTS(SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = supporter.member_id WHERE initiative.issue_id = issue.id AND critical_opinion.member_id NOTNULL) " ..
bsw@552 279 "ELSE " ..
bsw@552 280 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND NOT direct_supporter_snapshot.satisfied) " ..
bsw@552 281 "END OR EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND NOT direct_supporter_snapshot.satisfied)", member.id, member.id, member.id })
bsw@552 282
bsw@851 283 elseif filter_interest == "voted" then
bsw@851 284 selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) OR EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id, member.id })
bsw@851 285
bsw@414 286 end
bsw@552 287
bsw@414 288 end
bsw@414 289 },
bsw@414 290 {
bsw@414 291 name = "direct",
bsw@414 292 label = _"Direct",
bsw@414 293 selector_modifier = function(selector)
bsw@552 294 add_default_joins(selector)
bsw@552 295 selector:add_where("CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN filter_interest.member_id NOTNULL ELSE filter_interest_s.member_id NOTNULL END")
bsw@552 296
bsw@552 297 if filter_interest == "supported" then
bsw@552 298 selector:add_where({
bsw@552 299 "CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN " ..
bsw@552 300 "EXISTS(SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = supporter.member_id WHERE initiative.issue_id = issue.id AND critical_opinion.member_id ISNULL) " ..
bsw@552 301 "ELSE " ..
bsw@552 302 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND direct_supporter_snapshot.satisfied) " ..
bsw@552 303 "END", member.id, member.id })
bsw@552 304
bsw@414 305 elseif filter_interest == "potentially_supported" then
bsw@552 306 selector:add_where({
bsw@552 307 "CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN " ..
bsw@552 308 "EXISTS(SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = supporter.member_id WHERE initiative.issue_id = issue.id AND critical_opinion.member_id NOTNULL) " ..
bsw@552 309 "ELSE " ..
bsw@552 310 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND NOT direct_supporter_snapshot.satisfied) " ..
bsw@552 311 "END", member.id, member.id })
bsw@851 312 elseif filter_interest == "voted" then
bsw@851 313 selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) ", member.id })
bsw@552 314
bsw@414 315 end
bsw@414 316 end
bsw@414 317 },
bsw@414 318 {
bsw@414 319 name = "delegated",
bsw@414 320 label = _"By delegation",
bsw@414 321 selector_modifier = function(selector)
bsw@552 322 add_default_joins(selector)
bsw@552 323 selector:add_where("filter_d_interest_s.member_id NOTNULL AND filter_interest.member_id ISNULL")
bsw@552 324
bsw@552 325 if filter_interest == "supported" then
bsw@552 326 selector:add_where({
bsw@552 327 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND direct_supporter_snapshot.satisfied)", member.id })
bsw@552 328
bsw@414 329 elseif filter_interest == "potentially_supported" then
bsw@552 330 selector:add_where({
bsw@552 331 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND NOT direct_supporter_snapshot.satisfied)", member.id })
bsw@851 332 elseif filter_interest == "voted" then
bsw@851 333 selector:add_where({ "EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id })
bsw@552 334
bsw@414 335 end
bsw@414 336 end
bsw@414 337 }
bsw@414 338 }
bsw@414 339 end
bsw@414 340
bsw@414 341 end
bsw@414 342
bsw@853 343 if not for_events and app.session.member and member.id == app.session.member_id and (param.get_all_cgi()["filter"] == "frozen") then
poelzi@127 344 filters[#filters+1] = {
bsw@275 345 name = "filter_voting",
poelzi@127 346 {
bsw@275 347 name = "any",
bsw@275 348 label = _"Any",
bsw@275 349 selector_modifier = function() end
poelzi@127 350 },
poelzi@127 351 {
bsw@275 352 name = "not_voted",
bsw@275 353 label = _"Not voted",
poelzi@127 354 selector_modifier = function(selector)
bsw@284 355 selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", member.id })
bsw@275 356 selector:add_where("direct_voter.member_id ISNULL")
poelzi@127 357 end
poelzi@127 358 },
poelzi@127 359 {
bsw@275 360 name = "voted",
bsw@275 361 label = _"Voted",
poelzi@127 362 selector_modifier = function(selector)
bsw@284 363 selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", member.id })
poelzi@127 364 end
poelzi@127 365 },
poelzi@127 366 }
poelzi@127 367 end
poelzi@127 368
bsw@414 369
bsw@414 370
bsw@309 371
poelzi@127 372 function filters:get_filter(group, name)
poelzi@127 373 for i,grp in ipairs(self) do
poelzi@127 374 if grp.name == group then
poelzi@127 375 for i,entry in ipairs(grp) do
poelzi@127 376 if entry.name == name then
poelzi@127 377 return entry
poelzi@127 378 end
poelzi@127 379 end
poelzi@127 380 end
poelzi@127 381 end
poelzi@127 382 end
poelzi@127 383
poelzi@127 384 return filters

Impressum / About Us