liquid_feedback_frontend
annotate app/main/issue/_list.lua @ 81:134fce4bede3
Cache for rendered wiki texts; Accountless API keys; Reverse id order for initiative API
- Support for caching html version of drafts
- Using pre-rendered html versions of help messages
- Added Support for api keys not connected to an account
- Added order option "id_desc" to initiative API
- Support for caching html version of drafts
- Using pre-rendered html versions of help messages
- Added Support for api keys not connected to an account
- Added order option "id_desc" to initiative API
author | bsw |
---|---|
date | Sat Jul 24 17:22:05 2010 +0200 (2010-07-24) |
parents | 733f65c0c0a0 |
children | 4fb486bce608 |
rev | line source |
---|---|
bsw/jbe@0 | 1 local issues_selector = param.get("issues_selector", "table") |
bsw/jbe@0 | 2 |
bsw@51 | 3 if app.session.member_id then |
bsw@51 | 4 issues_selector |
bsw@51 | 5 :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id} ) |
bsw@51 | 6 :add_field("(_interest.member_id NOTNULL)", "is_interested") |
bsw@51 | 7 end |
bsw@11 | 8 |
bsw/jbe@19 | 9 ui.add_partial_param_names{ |
bsw/jbe@19 | 10 "filter", |
bsw/jbe@19 | 11 "filter_open", |
bsw/jbe@19 | 12 "filter_voting", |
bsw/jbe@19 | 13 "filter_interest", |
bsw/jbe@19 | 14 "issue_list" |
bsw/jbe@19 | 15 } |
bsw/jbe@0 | 16 |
bsw/jbe@19 | 17 local filters = {} |
bsw@10 | 18 |
bsw/jbe@19 | 19 filters[#filters+1] = { |
bsw/jbe@19 | 20 label = _"Filter", |
bsw/jbe@19 | 21 { |
bsw/jbe@19 | 22 name = "open", |
bsw/jbe@19 | 23 label = _"Open", |
bsw/jbe@19 | 24 selector_modifier = function(selector) |
bsw/jbe@19 | 25 selector:add_where("issue.closed ISNULL") |
bsw/jbe@19 | 26 end |
bsw/jbe@19 | 27 }, |
bsw/jbe@19 | 28 { |
bsw/jbe@19 | 29 name = "new", |
bsw/jbe@19 | 30 label = _"New", |
bsw/jbe@19 | 31 selector_modifier = function(selector) |
bsw/jbe@19 | 32 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") |
bsw/jbe@19 | 33 end |
bsw/jbe@19 | 34 }, |
bsw/jbe@19 | 35 { |
bsw/jbe@19 | 36 name = "accepted", |
bsw/jbe@19 | 37 label = _"In discussion", |
bsw/jbe@19 | 38 selector_modifier = function(selector) |
bsw/jbe@19 | 39 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") |
bsw/jbe@19 | 40 end |
bsw/jbe@19 | 41 }, |
bsw/jbe@19 | 42 { |
bsw/jbe@19 | 43 name = "half_frozen", |
bsw/jbe@19 | 44 label = _"Frozen", |
bsw/jbe@19 | 45 selector_modifier = function(selector) |
bsw/jbe@19 | 46 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") |
bsw/jbe@19 | 47 end |
bsw/jbe@19 | 48 }, |
bsw/jbe@19 | 49 { |
bsw/jbe@19 | 50 name = "frozen", |
bsw/jbe@19 | 51 label = _"Voting", |
bsw/jbe@19 | 52 selector_modifier = function(selector) |
bsw/jbe@19 | 53 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") |
bsw/jbe@19 | 54 filter_voting = true |
bsw/jbe@19 | 55 end |
bsw/jbe@19 | 56 }, |
bsw/jbe@19 | 57 { |
bsw/jbe@19 | 58 name = "finished", |
bsw/jbe@19 | 59 label = _"Finished", |
bsw/jbe@19 | 60 selector_modifier = function(selector) |
bsw/jbe@19 | 61 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") |
bsw/jbe@19 | 62 end |
bsw/jbe@19 | 63 }, |
bsw/jbe@19 | 64 { |
bsw/jbe@19 | 65 name = "cancelled", |
bsw/jbe@19 | 66 label = _"Cancelled", |
bsw/jbe@19 | 67 selector_modifier = function(selector) |
bsw/jbe@52 | 68 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") |
bsw/jbe@19 | 69 end |
bsw/jbe@19 | 70 }, |
bsw/jbe@19 | 71 { |
bsw/jbe@19 | 72 name = "any", |
bsw/jbe@19 | 73 label = _"Any", |
bsw/jbe@19 | 74 selector_modifier = function(selector) end |
bsw/jbe@19 | 75 }, |
bsw/jbe@19 | 76 } |
bsw/jbe@19 | 77 |
bsw/jbe@19 | 78 |
bsw@75 | 79 if app.session.member and param.get("filter") == "frozen" then |
bsw/jbe@19 | 80 filters[#filters+1] = { |
bsw/jbe@19 | 81 label = _"Filter", |
bsw/jbe@19 | 82 name = "filter_voting", |
bsw@2 | 83 { |
bsw/jbe@19 | 84 name = "any", |
bsw/jbe@19 | 85 label = _"Any", |
bsw/jbe@19 | 86 selector_modifier = function() end |
bsw@2 | 87 }, |
bsw/jbe@0 | 88 { |
bsw/jbe@19 | 89 name = "not_voted", |
bsw/jbe@19 | 90 label = _"Not voted", |
bsw/jbe@19 | 91 selector_modifier = function(selector) |
bsw/jbe@19 | 92 selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) |
bsw/jbe@19 | 93 selector:add_where("direct_voter.member_id ISNULL") |
bsw@2 | 94 end |
bsw@2 | 95 }, |
bsw@2 | 96 { |
bsw/jbe@19 | 97 name = "voted", |
bsw/jbe@19 | 98 label = _"Voted", |
bsw/jbe@19 | 99 selector_modifier = function(selector) |
bsw/jbe@19 | 100 selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) |
bsw@2 | 101 end |
bsw@2 | 102 }, |
bsw/jbe@19 | 103 } |
bsw/jbe@19 | 104 end |
bsw/jbe@19 | 105 |
bsw/jbe@19 | 106 |
bsw/jbe@19 | 107 filters[#filters+1] = { |
bsw/jbe@19 | 108 label = _"Filter", |
bsw/jbe@19 | 109 name = "filter_interest", |
bsw/jbe@19 | 110 { |
bsw/jbe@19 | 111 name = "any", |
bsw/jbe@19 | 112 label = _"Any", |
bsw/jbe@19 | 113 selector_modifier = function() end |
bsw/jbe@19 | 114 }, |
bsw/jbe@19 | 115 { |
bsw/jbe@19 | 116 name = "my", |
bsw/jbe@19 | 117 label = _"Interested", |
bsw/jbe@19 | 118 selector_modifier = function(selector) |
bsw/jbe@19 | 119 selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id }) |
bsw/jbe@19 | 120 end |
bsw/jbe@19 | 121 }, |
bsw/jbe@19 | 122 { |
bsw/jbe@19 | 123 name = "supported", |
bsw/jbe@19 | 124 label = _"Supported", |
bsw/jbe@19 | 125 selector_modifier = function(selector) |
bsw/jbe@19 | 126 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id AND opinion.member_id ISNULL LIMIT 1)", app.session.member.id, app.session.member.id }) |
bsw/jbe@19 | 127 end |
bsw/jbe@19 | 128 }, |
bsw/jbe@19 | 129 { |
bsw/jbe@19 | 130 name = "potentially_supported", |
bsw/jbe@19 | 131 label = _"Potential supported", |
bsw/jbe@19 | 132 selector_modifier = function(selector) |
bsw/jbe@19 | 133 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id LIMIT 1)", app.session.member.id, app.session.member.id }) |
bsw/jbe@19 | 134 end |
bsw/jbe@19 | 135 }, |
bsw/jbe@19 | 136 { |
bsw/jbe@19 | 137 name = "initiated", |
bsw/jbe@19 | 138 label = _"Initiated", |
bsw/jbe@19 | 139 selector_modifier = function(selector) |
bsw/jbe@19 | 140 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? WHERE initiative.issue_id = issue.id)", app.session.member.id }) |
bsw/jbe@19 | 141 end |
bsw/jbe@19 | 142 }, |
bsw/jbe@19 | 143 } |
bsw/jbe@19 | 144 |
bsw/jbe@19 | 145 if not param.get("no_sort", atom.boolean) then |
bsw/jbe@19 | 146 filters[#filters+1] = { |
bsw/jbe@19 | 147 label = _"Order by", |
bsw/jbe@19 | 148 name = "issue_list", |
bsw@2 | 149 { |
bsw/jbe@19 | 150 name = "max_potential_support", |
bsw/jbe@19 | 151 label = _"Max potential support", |
bsw/jbe@19 | 152 selector_modifier = function(selector) |
bsw/jbe@19 | 153 selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") |
bsw@2 | 154 end |
bsw@2 | 155 }, |
bsw@2 | 156 { |
bsw/jbe@19 | 157 name = "max_support", |
bsw/jbe@19 | 158 label = _"Max support", |
bsw/jbe@19 | 159 selector_modifier = function(selector) |
bsw/jbe@19 | 160 selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") |
bsw/jbe@19 | 161 end |
bsw/jbe@19 | 162 }, |
bsw/jbe@19 | 163 { |
bsw/jbe@19 | 164 name = "population", |
bsw/jbe@19 | 165 label = _"Population", |
bsw/jbe@19 | 166 selector_modifier = function(selector) |
bsw/jbe@19 | 167 selector:add_order_by("issue.population DESC") |
bsw/jbe@19 | 168 end |
bsw/jbe@19 | 169 }, |
bsw/jbe@19 | 170 { |
bsw/jbe@19 | 171 name = "newest", |
bsw/jbe@19 | 172 label = _"Newest", |
bsw/jbe@19 | 173 selector_modifier = function(selector) |
bsw/jbe@19 | 174 selector:add_order_by("issue.created DESC") |
bsw@2 | 175 end |
bsw@2 | 176 }, |
bsw/jbe@19 | 177 { |
bsw/jbe@19 | 178 name = "oldest", |
bsw/jbe@19 | 179 label = _"Oldest", |
bsw/jbe@19 | 180 selector_modifier = function(selector) |
bsw/jbe@19 | 181 selector:add_order_by("issue.created") |
bsw/jbe@19 | 182 end |
bsw/jbe@19 | 183 } |
bsw/jbe@19 | 184 } |
bsw/jbe@19 | 185 end |
bsw/jbe@19 | 186 |
bsw/jbe@19 | 187 filters.content = function() |
bsw/jbe@19 | 188 local ui_paginate = ui.paginate |
bsw/jbe@19 | 189 if param.get("per_page") == "all" then |
bsw/jbe@19 | 190 ui_paginate = function(args) args.content() end |
bsw/jbe@19 | 191 end |
bsw/jbe@19 | 192 ui_paginate{ |
bsw/jbe@19 | 193 per_page = tonumber(param.get("per_page")), |
bsw/jbe@19 | 194 selector = issues_selector, |
bsw/jbe@19 | 195 content = function() |
bsw/jbe@19 | 196 local highlight_string = param.get("highlight_string", "string") |
bsw/jbe@19 | 197 local issues = issues or issues_selector:exec() |
bsw/jbe@19 | 198 -- issues:load(initiatives) |
bsw/jbe@19 | 199 ui.list{ |
bsw/jbe@19 | 200 attr = { class = "issues" }, |
bsw/jbe@19 | 201 records = issues, |
bsw/jbe@19 | 202 columns = { |
bsw/jbe@19 | 203 { |
bsw/jbe@19 | 204 label = _"Issue", |
bsw/jbe@19 | 205 content = function(record) |
bsw/jbe@19 | 206 if not param.get("for_area_list", atom.boolean) then |
bsw/jbe@19 | 207 ui.field.text{ |
bsw/jbe@19 | 208 value = record.area.name |
bsw/jbe@19 | 209 } |
bsw/jbe@19 | 210 slot.put("<br />") |
bsw@11 | 211 end |
bsw/jbe@19 | 212 if record.is_interested then |
bsw/jbe@19 | 213 local label = _"You are interested in this issue", |
bsw/jbe@19 | 214 ui.image{ |
bsw/jbe@19 | 215 attr = { alt = label, title = label }, |
bsw/jbe@19 | 216 static = "icons/16/eye.png" |
bsw/jbe@5 | 217 } |
bsw/jbe@19 | 218 slot.put(" ") |
bsw/jbe@19 | 219 end |
bsw/jbe@19 | 220 ui.link{ |
bsw/jbe@19 | 221 text = _("Issue ##{id}", { id = tostring(record.id) }), |
bsw/jbe@19 | 222 module = "issue", |
bsw/jbe@19 | 223 view = "show", |
bsw/jbe@19 | 224 id = record.id |
bsw/jbe@19 | 225 } |
bsw/jbe@19 | 226 if record.state == "new" then |
bsw/jbe@19 | 227 ui.image{ |
bsw/jbe@19 | 228 static = "icons/16/new.png" |
bsw/jbe@5 | 229 } |
bsw/jbe@5 | 230 end |
bsw/jbe@19 | 231 slot.put("<br />") |
bsw/jbe@19 | 232 slot.put("<br />") |
bsw/jbe@19 | 233 if record.old_state then |
bsw/jbe@19 | 234 ui.field.text{ value = format.time(record.sort) } |
bsw/jbe@19 | 235 ui.field.text{ value = Issue:get_state_name_for_state(record.old_state) .. " > " .. Issue:get_state_name_for_state(record.new_state) } |
bsw/jbe@19 | 236 else |
bsw/jbe@19 | 237 end |
bsw/jbe@19 | 238 end |
bsw/jbe@19 | 239 }, |
bsw/jbe@19 | 240 { |
bsw/jbe@19 | 241 label = _"State", |
bsw/jbe@19 | 242 content = function(record) |
bsw/jbe@19 | 243 if record.state == "voting" then |
bsw/jbe@19 | 244 ui.link{ |
bsw/jbe@19 | 245 content = _"Voting", |
bsw/jbe@19 | 246 module = "vote", |
bsw/jbe@19 | 247 view = "list", |
bsw/jbe@19 | 248 params = { issue_id = record.id } |
bsw/jbe@19 | 249 } |
bsw/jbe@19 | 250 else |
bsw/jbe@19 | 251 ui.field.issue_state{ value = record.state } |
bsw/jbe@19 | 252 end |
bsw/jbe@19 | 253 end |
bsw/jbe@19 | 254 }, |
bsw/jbe@19 | 255 { |
bsw/jbe@19 | 256 label = _"Initiatives", |
bsw/jbe@19 | 257 content = function(record) |
bsw/jbe@19 | 258 local initiatives_selector = record:get_reference_selector("initiatives") |
bsw/jbe@19 | 259 local highlight_string = param.get("highlight_string") |
bsw/jbe@19 | 260 if highlight_string then |
bsw/jbe@19 | 261 initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted") |
bsw/jbe@19 | 262 end |
bsw/jbe@19 | 263 execute.view{ |
bsw/jbe@19 | 264 module = "initiative", |
bsw/jbe@19 | 265 view = "_list", |
bsw/jbe@19 | 266 params = { |
bsw/jbe@19 | 267 issue = record, |
bsw/jbe@19 | 268 initiatives_selector = initiatives_selector, |
bsw/jbe@19 | 269 highlight_string = highlight_string, |
bsw@51 | 270 per_page = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3, |
bsw/jbe@19 | 271 no_sort = true, |
bsw@51 | 272 limit = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3 |
bsw/jbe@19 | 273 } |
bsw/jbe@19 | 274 } |
bsw/jbe@19 | 275 end |
bsw/jbe@19 | 276 }, |
bsw/jbe@0 | 277 } |
bsw/jbe@19 | 278 } |
bsw/jbe@19 | 279 end |
bsw/jbe@19 | 280 } |
bsw/jbe@19 | 281 end |
bsw/jbe@19 | 282 |
bsw/jbe@19 | 283 filters.selector = issues_selector |
bsw/jbe@19 | 284 filters.label = _"Change filters and order" |
bsw/jbe@19 | 285 |
bsw/jbe@19 | 286 if param.get("no_filter", atom.boolean) then |
bsw/jbe@19 | 287 filters.content() |
bsw/jbe@19 | 288 else |
bsw/jbe@19 | 289 ui.filters(filters) |
bsw/jbe@19 | 290 end |
bsw/jbe@19 | 291 |
bsw/jbe@19 | 292 if param.get("legend", atom.boolean) ~= false then |
bsw/jbe@19 | 293 local filter = param.get_all_cgi().filter |
bsw/jbe@19 | 294 if not filter or filter == "any" or filter ~= "finished" then |
bsw/jbe@19 | 295 ui.bargraph_legend{ |
bsw/jbe@19 | 296 width = 25, |
bsw/jbe@19 | 297 bars = { |
bsw/jbe@19 | 298 { color = "#0a0", label = _"Supporter" }, |
bsw/jbe@19 | 299 { color = "#777", label = _"Potential supporter" }, |
bsw/jbe@19 | 300 { color = "#ddd", label = _"No support at all" }, |
bsw/jbe@19 | 301 } |
bsw/jbe@0 | 302 } |
bsw/jbe@0 | 303 end |
bsw/jbe@19 | 304 if not filter or filter == "any" or filter == "finished" then |
bsw/jbe@19 | 305 ui.bargraph_legend{ |
bsw/jbe@19 | 306 width = 25, |
bsw/jbe@19 | 307 bars = { |
bsw/jbe@19 | 308 { color = "#0a0", label = _"Yes" }, |
bsw/jbe@19 | 309 { color = "#aaa", label = _"Abstention" }, |
bsw/jbe@19 | 310 { color = "#a00", label = _"No" }, |
bsw/jbe@19 | 311 } |
bsw/jbe@19 | 312 } |
bsw/jbe@19 | 313 end |
bsw/jbe@19 | 314 end |
bsw/jbe@19 | 315 |