liquid_feedback_frontend

annotate app/main/initiative/show.lua @ 9:0ee1e0c42d4c

Version beta5

Minor security fix: Added missing security filter for admin section. Reading of member listing including login names was possible for all users. Write access has not been possible though.

Changing of name and login is possible while a history of these changes is written and accessible by all users.

Statistics shown in area list

Trimming of user input also converts multiple whitespaces to single space character.
author bsw
date Mon Jan 04 12:00:00 2010 +0100 (2010-01-04)
parents 8d91bccab0bf
children 72c5e0ee7c98
rev   line source
bsw/jbe@0 1 local initiative = Initiative:new_selector():add_where{ "id = ?", param.get_id()}:single_object_mode():exec()
bsw/jbe@0 2
bsw/jbe@5 3 slot.select("actions", function()
bsw/jbe@5 4 ui.link{
bsw/jbe@5 5 content = function()
bsw/jbe@5 6 ui.image{ static = "icons/16/script.png" }
bsw/jbe@5 7 slot.put(_"Show all initiatives")
bsw/jbe@5 8 end,
bsw/jbe@5 9 module = "issue",
bsw/jbe@5 10 view = "show",
bsw/jbe@5 11 id = initiative.issue.id
bsw/jbe@5 12 }
bsw/jbe@5 13 end)
bsw/jbe@4 14
bsw/jbe@4 15 execute.view{
bsw/jbe@4 16 module = "issue",
bsw/jbe@4 17 view = "_show_head",
bsw/jbe@4 18 params = { issue = initiative.issue }
bsw/jbe@4 19 }
bsw/jbe@4 20
bsw/jbe@4 21 local initiator = Initiator:by_pk(initiative.id, app.session.member.id)
bsw/jbe@4 22
bsw@3 23 --slot.put_into("html_head", '<link rel="alternate" type="application/rss+xml" title="RSS" href="../show/' .. tostring(initiative.id) .. '.rss" />')
bsw/jbe@0 24
bsw/jbe@0 25 execute.view{
bsw/jbe@0 26 module = "supporter",
bsw/jbe@0 27 view = "_show_box",
bsw/jbe@0 28 params = { initiative = initiative }
bsw/jbe@0 29 }
bsw/jbe@0 30
bsw/jbe@4 31 slot.put_into("sub_title", encode.html(_"Initiative: '#{name}'":gsub("#{name}", initiative.shortened_name) ))
bsw/jbe@0 32
bsw/jbe@0 33 slot.select("actions", function()
bsw/jbe@4 34 if not initiative.issue.fully_frozen and not initiative.issue.closed then
bsw@2 35 ui.link{
bsw@3 36 attr = { class = "action" },
bsw@3 37 content = function()
bsw@3 38 ui.image{ static = "icons/16/script_add.png" }
bsw/jbe@4 39 slot.put(_"Create alternative initiative")
bsw@3 40 end,
bsw@3 41 module = "initiative",
bsw@3 42 view = "new",
bsw@3 43 params = { issue_id = initiative.issue.id }
bsw@3 44 }
bsw@3 45 end
bsw/jbe@4 46 end)
bsw/jbe@4 47
bsw/jbe@4 48
bsw/jbe@4 49 util.help("initiative.show")
bsw/jbe@4 50
bsw/jbe@4 51
bsw/jbe@4 52 ui.container{
bsw/jbe@4 53 attr = { class = "vertical" },
bsw/jbe@4 54 content = function()
bsw/jbe@4 55 ui.container{
bsw/jbe@4 56 attr = { class = "ui_field_label" },
bsw/jbe@4 57 content = _"Discussion URL"
bsw/jbe@4 58 }
bsw/jbe@4 59 ui.tag{
bsw/jbe@4 60 tag = "span",
bsw@3 61 content = function()
bsw/jbe@4 62 if initiative.discussion_url and #initiative.discussion_url > 0 then
bsw/jbe@4 63 ui.link{
bsw/jbe@4 64 attr = {
bsw/jbe@4 65 class = "actions",
bsw/jbe@5 66 target = "_blank",
bsw/jbe@4 67 title = initiative.discussion_url
bsw/jbe@4 68 },
bsw/jbe@4 69 content = function()
bsw/jbe@4 70 slot.put(encode.html(initiative.discussion_url))
bsw/jbe@4 71 end,
bsw/jbe@4 72 external = initiative.discussion_url
bsw/jbe@4 73 }
bsw/jbe@4 74 end
bsw/jbe@4 75 slot.put(" ")
bsw/jbe@4 76 if initiator then
bsw/jbe@4 77 ui.link{
bsw/jbe@4 78 attr = { class = "actions" },
bsw/jbe@4 79 content = _"(change URL)",
bsw/jbe@4 80 module = "initiative",
bsw/jbe@4 81 view = "edit",
bsw/jbe@4 82 id = initiative.id
bsw/jbe@4 83 }
bsw/jbe@4 84 end
bsw/jbe@4 85 end
bsw@3 86 }
bsw@3 87 end
bsw/jbe@4 88 }
bsw/jbe@4 89
bsw/jbe@0 90
bsw/jbe@0 91
bsw/jbe@0 92 ui.container{
bsw/jbe@0 93 attr = { id = "add_suggestion_form", class = "hidden_inline_form" },
bsw/jbe@0 94 content = function()
bsw/jbe@0 95
bsw/jbe@0 96 ui.link{
bsw/jbe@0 97 content = _"Close",
bsw/jbe@0 98 attr = {
bsw/jbe@0 99 onclick = "document.getElementById('add_suggestion_form').style.display='none';return(false)",
bsw/jbe@0 100 style = "float: right;"
bsw/jbe@0 101 }
bsw/jbe@0 102 }
bsw/jbe@0 103
bsw/jbe@0 104 ui.field.text{ attr = { class = "head" }, value = _"Add new suggestion" }
bsw/jbe@0 105
bsw/jbe@0 106
bsw/jbe@0 107 ui.form{
bsw/jbe@0 108 module = "suggestion",
bsw/jbe@0 109 action = "add",
bsw/jbe@0 110 params = { initiative_id = initiative.id },
bsw/jbe@0 111 routing = {
bsw/jbe@0 112 default = {
bsw/jbe@0 113 mode = "redirect",
bsw/jbe@0 114 module = "initiative",
bsw/jbe@0 115 view = "show",
bsw/jbe@0 116 id = initiative.id,
bsw/jbe@0 117 params = { tab = "suggestion" }
bsw/jbe@0 118 }
bsw/jbe@0 119 },
bsw/jbe@0 120 attr = { class = "vertical" },
bsw/jbe@0 121 content = function()
bsw/jbe@4 122 local supported = Supporter:by_pk(initiative.id, app.session.member.id) and true or false
bsw/jbe@4 123 if not supported then
bsw/jbe@4 124 ui.field.text{
bsw/jbe@4 125 attr = { class = "warning" },
bsw/jbe@4 126 value = _"You are currently not supporting this initiative. By adding suggestions to this initiative you will automatically become a potential supporter."
bsw/jbe@4 127 }
bsw/jbe@4 128 end
bsw/jbe@4 129 ui.field.text{ label = _"Title (80 chars max)", name = "name" }
bsw/jbe@0 130 ui.field.text{ label = _"Description", name = "description", multiline = true }
bsw/jbe@0 131 ui.field.select{
bsw/jbe@0 132 label = _"Degree",
bsw/jbe@0 133 name = "degree",
bsw/jbe@0 134 foreign_records = {
bsw/jbe@0 135 { id = 1, name = _"should"},
bsw/jbe@0 136 { id = 2, name = _"must"},
bsw/jbe@0 137 },
bsw/jbe@0 138 foreign_id = "id",
bsw/jbe@0 139 foreign_name = "name"
bsw/jbe@0 140 }
bsw/jbe@0 141 ui.submit{ text = _"Commit suggestion" }
bsw/jbe@0 142 end
bsw/jbe@0 143 }
bsw/jbe@0 144 end
bsw/jbe@0 145 }
bsw/jbe@0 146
bsw@2 147 local supporter = app.session.member:get_reference_selector("supporters")
bsw@2 148 :add_where{ "initiative_id = ?", initiative.id }
bsw@2 149 :optional_object_mode()
bsw@2 150 :exec()
bsw@2 151
bsw@2 152 if supporter then
bsw@2 153 local old_draft_id = supporter.draft_id
bsw@2 154 local new_draft_id = initiative.current_draft.id
bsw@2 155 if old_draft_id ~= new_draft_id then
bsw@2 156 ui.container{
bsw@2 157 attr = { class = "draft_updated_info" },
bsw@2 158 content = function()
bsw@2 159 slot.put("The draft of this initiative has been updated!")
bsw@2 160 slot.put(" ")
bsw@2 161 ui.link{
bsw@2 162 content = _"Show diff",
bsw@2 163 module = "draft",
bsw@2 164 view = "diff",
bsw@2 165 params = {
bsw@2 166 old_draft_id = old_draft_id,
bsw@2 167 new_draft_id = new_draft_id
bsw@2 168 }
bsw@2 169 }
bsw@2 170 slot.put(" ")
bsw@2 171 ui.link{
bsw@2 172 content = _"Refresh support to current draft",
bsw@2 173 module = "initiative",
bsw@2 174 action = "add_support",
bsw@2 175 id = initiative.id,
bsw@2 176 routing = {
bsw@2 177 default = {
bsw@2 178 mode = "redirect",
bsw@2 179 module = "initiative",
bsw@2 180 view = "show",
bsw@2 181 id = initiative.id
bsw@2 182 }
bsw@2 183 }
bsw@2 184 }
bsw@2 185 end
bsw@2 186 }
bsw@2 187 end
bsw@2 188 end
bsw/jbe@0 189
bsw/jbe@4 190
bsw/jbe@6 191 local current_draft_name = _"Current draft"
bsw/jbe@6 192 if initiative.issue.half_frozen then
bsw/jbe@6 193 current_draft_name = _"Voting proposal"
bsw/jbe@6 194 end
bsw/jbe@6 195
bsw/jbe@6 196 if initiative.issue.state == "finished" then
bsw/jbe@6 197 current_draft_name = _"Voted proposal"
bsw/jbe@6 198 end
bsw/jbe@6 199
bsw/jbe@6 200 local tabs = {
bsw/jbe@0 201 {
bsw/jbe@0 202 name = "current_draft",
bsw/jbe@6 203 label = current_draft_name,
bsw/jbe@0 204 content = function()
bsw/jbe@4 205 if initiator then
bsw/jbe@4 206 ui.link{
bsw/jbe@4 207 content = function()
bsw/jbe@4 208 ui.image{ static = "icons/16/script_add.png" }
bsw/jbe@4 209 slot.put(_"Edit draft")
bsw/jbe@4 210 end,
bsw/jbe@4 211 module = "draft",
bsw/jbe@4 212 view = "new",
bsw/jbe@4 213 params = { initiative_id = initiative.id }
bsw/jbe@4 214 }
bsw/jbe@4 215 end
bsw/jbe@0 216 execute.view{ module = "draft", view = "_show", params = { draft = initiative.current_draft } }
bsw/jbe@0 217 end
bsw/jbe@6 218 }
bsw/jbe@6 219 }
bsw/jbe@6 220
bsw/jbe@6 221 if initiative.issue.ranks_available then
bsw/jbe@6 222 tabs[#tabs+1] = {
bsw/jbe@6 223 name = "voter",
bsw/jbe@6 224 label = _"Voter",
bsw/jbe@0 225 content = function()
bsw@3 226 execute.view{
bsw@3 227 module = "member",
bsw@3 228 view = "_list",
bsw@3 229 params = {
bsw@3 230 initiative = initiative,
bsw/jbe@6 231 members_selector = initiative.issue:get_reference_selector("direct_voters")
bsw/jbe@6 232 :left_join("vote", nil, { "vote.initiative_id = ? AND vote.member_id = member.id", initiative.id })
bsw/jbe@6 233 :add_field("direct_voter.weight as voter_weight")
bsw/jbe@6 234 :add_field("coalesce(vote.grade, 0) as grade")
bsw@3 235 }
bsw@3 236 }
bsw/jbe@0 237 end
bsw/jbe@6 238 }
bsw/jbe@6 239 end
bsw/jbe@6 240
bsw/jbe@6 241 tabs[#tabs+1] = {
bsw/jbe@6 242 name = "suggestion",
bsw/jbe@6 243 label = _"Suggestions",
bsw/jbe@6 244 content = function()
bsw/jbe@6 245 execute.view{
bsw/jbe@6 246 module = "suggestion",
bsw/jbe@6 247 view = "_list",
bsw/jbe@6 248 params = {
bsw/jbe@6 249 initiative = initiative,
bsw/jbe@6 250 suggestions_selector = initiative:get_reference_selector("suggestions")
bsw/jbe@6 251 }
bsw/jbe@6 252 }
bsw/jbe@6 253 slot.put("<br />")
bsw/jbe@6 254 if not initiative.issue.fully_frozen and not initiative.issue.closed then
bsw/jbe@6 255 ui.link{
bsw@2 256 content = function()
bsw/jbe@6 257 ui.image{ static = "icons/16/comment_add.png" }
bsw/jbe@6 258 slot.put(_"Add new suggestion")
bsw/jbe@6 259 end,
bsw/jbe@6 260 attr = { onclick = "document.getElementById('add_suggestion_form').style.display='block';return(false)" },
bsw/jbe@6 261 static = "#"
bsw@2 262 }
bsw@2 263 end
bsw/jbe@6 264 end
bsw/jbe@6 265 }
bsw/jbe@6 266
bsw/jbe@6 267 tabs[#tabs+1] = {
bsw/jbe@6 268 name = "satisfied_supporter",
bsw/jbe@6 269 label = _"Supporter",
bsw/jbe@6 270 content = function()
bsw/jbe@6 271 execute.view{
bsw/jbe@6 272 module = "member",
bsw/jbe@6 273 view = "_list",
bsw/jbe@6 274 params = {
bsw/jbe@6 275 initiative = initiative,
bsw/jbe@6 276 members_selector = initiative:get_reference_selector("supporting_members_snapshot")
bsw/jbe@6 277 :join("issue", nil, "issue.id = direct_supporter_snapshot.issue_id")
bsw/jbe@6 278 :join("direct_interest_snapshot", nil, "direct_interest_snapshot.event = issue.latest_snapshot_event AND direct_interest_snapshot.issue_id = issue.id AND direct_interest_snapshot.member_id = member.id")
bsw/jbe@6 279 :add_field("direct_interest_snapshot.weight")
bsw/jbe@6 280 :add_where("direct_supporter_snapshot.event = issue.latest_snapshot_event")
bsw/jbe@6 281 :add_where("direct_supporter_snapshot.satisfied")
bsw/jbe@6 282 }
bsw/jbe@6 283 }
bsw/jbe@6 284 end
bsw/jbe@6 285 }
bsw/jbe@6 286
bsw/jbe@6 287 tabs[#tabs+1] = {
bsw/jbe@6 288 name = "supporter",
bsw/jbe@6 289 label = _"Potential supporter",
bsw/jbe@6 290 content = function()
bsw/jbe@6 291 execute.view{
bsw/jbe@6 292 module = "member",
bsw/jbe@6 293 view = "_list",
bsw/jbe@6 294 params = {
bsw/jbe@6 295 initiative = initiative,
bsw/jbe@6 296 members_selector = initiative:get_reference_selector("supporting_members_snapshot")
bsw/jbe@6 297 :join("issue", nil, "issue.id = direct_supporter_snapshot.issue_id")
bsw/jbe@6 298 :join("direct_interest_snapshot", nil, "direct_interest_snapshot.event = issue.latest_snapshot_event AND direct_interest_snapshot.issue_id = issue.id AND direct_interest_snapshot.member_id = member.id")
bsw/jbe@6 299 :add_field("direct_interest_snapshot.weight")
bsw/jbe@6 300 :add_where("direct_supporter_snapshot.event = issue.latest_snapshot_event")
bsw/jbe@6 301 :add_where("NOT direct_supporter_snapshot.satisfied")
bsw/jbe@6 302 }
bsw/jbe@6 303 }
bsw/jbe@6 304 end
bsw/jbe@6 305 }
bsw/jbe@6 306
bsw/jbe@6 307 tabs[#tabs+1] = {
bsw/jbe@6 308 name = "initiators",
bsw/jbe@6 309 label = _"Initiators",
bsw/jbe@6 310 content = function()
bsw/jbe@6 311 execute.view{ module = "member", view = "_list", params = { members_selector = initiative:get_reference_selector("initiating_members") } }
bsw/jbe@6 312 end
bsw/jbe@6 313 }
bsw/jbe@6 314
bsw/jbe@6 315 tabs[#tabs+1] = {
bsw/jbe@6 316 name = "drafts",
bsw/jbe@6 317 label = _"Old drafts",
bsw/jbe@6 318 content = function()
bsw/jbe@6 319 execute.view{ module = "draft", view = "_list", params = { drafts = initiative.drafts } }
bsw/jbe@6 320 end
bsw/jbe@6 321 }
bsw/jbe@6 322
bsw/jbe@6 323 tabs[#tabs+1] = {
bsw/jbe@6 324 name = "details",
bsw/jbe@6 325 label = _"Details",
bsw/jbe@6 326 content = function()
bsw/jbe@6 327 ui.form{
bsw/jbe@6 328 attr = { class = "vertical" },
bsw/jbe@6 329 record = initiative,
bsw/jbe@6 330 readonly = true,
bsw/jbe@6 331 content = function()
bsw/jbe@6 332 ui.field.text{ label = _"Issue policy", value = initiative.issue.policy.name }
bsw/jbe@6 333 ui.field.text{
bsw/jbe@6 334 label = _"Created at",
bsw/jbe@6 335 value = tostring(initiative.created)
bsw/jbe@6 336 }
bsw/jbe@6 337 ui.field.text{
bsw/jbe@6 338 label = _"Created at",
bsw/jbe@6 339 value = format.timestamp(initiative.created)
bsw/jbe@6 340 }
bsw/jbe@6 341 ui.field.date{ label = _"Revoked at", name = "revoked" }
bsw/jbe@6 342 ui.field.boolean{ label = _"Admitted", name = "admitted" }
bsw/jbe@6 343 end
bsw/jbe@6 344 }
bsw/jbe@6 345 end
bsw/jbe@0 346 }
bsw/jbe@0 347
bsw/jbe@0 348
bsw/jbe@6 349 ui.tabs(tabs)
bsw/jbe@6 350

Impressum / About Us