liquid_feedback_frontend
annotate app/main/vote/_action/update.lua @ 124:f740026b1518
add initiator support in delegation
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Mon Sep 20 20:32:04 2010 +0200 (2010-09-20) |
parents | 3036f2732b83 |
children | ec86db506312 |
rev | line source |
---|---|
bsw/jbe@5 | 1 local issue = Issue:new_selector():add_where{ "id = ?", param.get("issue_id", atom.integer) }:for_share():single_object_mode():exec() |
bsw/jbe@5 | 2 |
bsw/jbe@5 | 3 if issue.closed then |
bsw/jbe@5 | 4 slot.put_into("error", _"This issue is already closed.") |
bsw/jbe@5 | 5 return false |
bsw/jbe@5 | 6 end |
bsw/jbe@5 | 7 |
bsw/jbe@5 | 8 if issue.state ~= "voting" then |
bsw/jbe@5 | 9 slot.put_into("error", _"Voting has not started yet.") |
bsw/jbe@5 | 10 return false |
bsw/jbe@5 | 11 end |
bsw/jbe@5 | 12 |
bsw@26 | 13 |
bsw@26 | 14 |
bsw/jbe@19 | 15 local move_up = param.get("move_up", atom.integer) |
bsw/jbe@19 | 16 local move_down = param.get("move_down", atom.integer) |
bsw/jbe@19 | 17 |
bsw/jbe@19 | 18 if not move_down and not move_up then |
bsw/jbe@19 | 19 local direct_voter = DirectVoter:by_pk(issue.id, app.session.member_id) |
bsw/jbe@19 | 20 |
bsw@26 | 21 if param.get("discard", atom.boolean) then |
bsw@26 | 22 if direct_voter then |
bsw@26 | 23 direct_voter:destroy() |
bsw@26 | 24 end |
bsw@26 | 25 slot.put_into("notice", _"Your vote has been discarded. Delegation rules apply if set.") |
bsw@26 | 26 return |
bsw@26 | 27 end |
bsw@26 | 28 |
bsw/jbe@19 | 29 if not direct_voter then |
bsw/jbe@19 | 30 direct_voter = DirectVoter:new() |
bsw/jbe@19 | 31 direct_voter.issue_id = issue.id |
bsw/jbe@19 | 32 direct_voter.member_id = app.session.member_id |
bsw/jbe@19 | 33 end |
bsw/jbe@19 | 34 |
bsw/jbe@19 | 35 direct_voter.autoreject = false |
bsw/jbe@19 | 36 direct_voter:save() |
bsw/jbe@19 | 37 |
bsw/jbe@19 | 38 local scoring = param.get("scoring") |
bsw/jbe@5 | 39 |
bsw/jbe@19 | 40 for initiative_id, grade in scoring:gmatch("([^:;]+):([^:;]+)") do |
bsw/jbe@19 | 41 local initiative_id = tonumber(initiative_id) |
bsw/jbe@19 | 42 local grade = tonumber(grade) |
bsw/jbe@19 | 43 local initiative = Initiative:by_id(initiative_id) |
bsw/jbe@19 | 44 if initiative.issue.id ~= issue.id then |
bsw/jbe@19 | 45 error("initiative from wrong issue") |
bsw/jbe@19 | 46 end |
bsw/jbe@19 | 47 local vote = Vote:by_pk(initiative_id, app.session.member.id) |
bsw/jbe@19 | 48 if not vote then |
bsw/jbe@19 | 49 vote = Vote:new() |
bsw/jbe@19 | 50 vote.issue_id = issue.id |
bsw/jbe@19 | 51 vote.initiative_id = initiative.id |
bsw/jbe@19 | 52 vote.member_id = app.session.member.id |
bsw/jbe@19 | 53 end |
bsw/jbe@19 | 54 vote.grade = grade |
bsw/jbe@19 | 55 vote:save() |
bsw/jbe@19 | 56 end |
bsw/jbe@19 | 57 |
bsw/jbe@19 | 58 else |
bsw/jbe@19 | 59 |
bsw/jbe@19 | 60 local tempvoting_string = param.get("scoring") |
bsw/jbe@5 | 61 |
bsw/jbe@19 | 62 local tempvotings = {} |
bsw/jbe@19 | 63 for match in tempvoting_string:gmatch("([^;]+)") do |
bsw/jbe@19 | 64 for initiative_id, grade in match:gmatch("([^:;]+):([^:;]+)") do |
bsw/jbe@19 | 65 tempvotings[tonumber(initiative_id)] = tonumber(grade) |
bsw/jbe@19 | 66 end |
bsw/jbe@19 | 67 end |
bsw/jbe@19 | 68 |
bsw/jbe@19 | 69 local current_initiative_id = move_up or move_down |
bsw/jbe@5 | 70 |
bsw/jbe@19 | 71 local current_grade = tempvotings[current_initiative_id] or 0 |
bsw/jbe@19 | 72 local is_alone = true |
bsw/jbe@19 | 73 if current_grade == 0 then |
bsw/jbe@19 | 74 is_alone = false |
bsw/jbe@19 | 75 else |
bsw/jbe@19 | 76 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 77 if current_initiative_id ~= initiative_id and grade == current_grade then |
bsw/jbe@19 | 78 is_alone = false |
bsw/jbe@19 | 79 break |
bsw/jbe@19 | 80 end |
bsw/jbe@19 | 81 end |
bsw/jbe@19 | 82 end |
bsw/jbe@5 | 83 |
bsw/jbe@19 | 84 if move_up and current_grade >= 0 and is_alone then |
bsw/jbe@19 | 85 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 86 if grade > current_grade then |
bsw/jbe@19 | 87 tempvotings[initiative_id] = grade - 1 |
bsw/jbe@19 | 88 end |
bsw/jbe@19 | 89 end |
bsw/jbe@5 | 90 |
bsw/jbe@19 | 91 elseif move_up and current_grade >= 0 and not is_alone then |
bsw/jbe@19 | 92 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 93 if grade > current_grade then |
bsw/jbe@19 | 94 tempvotings[initiative_id] = grade + 1 |
bsw/jbe@19 | 95 end |
bsw/jbe@19 | 96 end |
bsw/jbe@19 | 97 tempvotings[current_initiative_id] = current_grade + 1 |
bsw/jbe@19 | 98 |
bsw/jbe@19 | 99 elseif move_up and current_grade < 0 and is_alone then |
bsw/jbe@19 | 100 tempvotings[current_initiative_id] = current_grade + 1 |
bsw/jbe@19 | 101 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 102 if grade < current_grade then |
bsw/jbe@19 | 103 tempvotings[initiative_id] = grade + 1 |
bsw/jbe@19 | 104 end |
bsw/jbe@19 | 105 end |
bsw/jbe@19 | 106 |
bsw/jbe@19 | 107 elseif move_up and current_grade < 0 and not is_alone then |
bsw/jbe@19 | 108 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 109 if grade <= current_grade then |
bsw/jbe@19 | 110 tempvotings[initiative_id] = grade - 1 |
bsw/jbe@19 | 111 end |
bsw/jbe@19 | 112 end |
bsw/jbe@19 | 113 tempvotings[current_initiative_id] = current_grade |
bsw/jbe@19 | 114 |
bsw/jbe@19 | 115 elseif move_down and current_grade <= 0 and is_alone then |
bsw/jbe@19 | 116 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 117 if grade < current_grade then |
bsw/jbe@19 | 118 tempvotings[initiative_id] = grade + 1 |
bsw/jbe@19 | 119 end |
bsw/jbe@19 | 120 end |
bsw/jbe@19 | 121 |
bsw/jbe@19 | 122 elseif move_down and current_grade <= 0 and not is_alone then |
bsw/jbe@19 | 123 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 124 if grade < current_grade then |
bsw/jbe@19 | 125 tempvotings[initiative_id] = grade - 1 |
bsw/jbe@19 | 126 end |
bsw/jbe@19 | 127 end |
bsw/jbe@19 | 128 tempvotings[current_initiative_id] = current_grade - 1 |
bsw/jbe@19 | 129 |
bsw/jbe@19 | 130 elseif move_down and current_grade > 0 and is_alone then |
bsw/jbe@19 | 131 tempvotings[current_initiative_id] = current_grade - 1 |
bsw/jbe@19 | 132 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 133 if grade > current_grade then |
bsw/jbe@19 | 134 tempvotings[initiative_id] = grade - 1 |
bsw/jbe@19 | 135 end |
bsw/jbe@19 | 136 end |
bsw/jbe@19 | 137 |
bsw/jbe@19 | 138 elseif move_down and current_grade > 0 and not is_alone then |
bsw/jbe@19 | 139 for initiative_id, grade in pairs(tempvotings) do |
bsw/jbe@19 | 140 if grade >= current_grade then |
bsw/jbe@19 | 141 tempvotings[initiative_id] = grade + 1 |
bsw/jbe@19 | 142 end |
bsw/jbe@19 | 143 end |
bsw/jbe@19 | 144 tempvotings[current_initiative_id] = current_grade |
bsw/jbe@19 | 145 |
bsw/jbe@5 | 146 end |
bsw/jbe@19 | 147 |
bsw/jbe@19 | 148 local tempvotings_list = {} |
bsw/jbe@19 | 149 for key, val in pairs(tempvotings) do |
bsw/jbe@19 | 150 tempvotings_list[#tempvotings_list+1] = tostring(key) .. ":" .. tostring(val) |
bsw/jbe@5 | 151 end |
bsw/jbe@19 | 152 |
bsw/jbe@19 | 153 tempvoting_string = table.concat(tempvotings_list, ";") |
bsw/jbe@19 | 154 |
bsw/jbe@19 | 155 request.redirect{ |
bsw/jbe@19 | 156 module = "vote", |
bsw/jbe@19 | 157 view = "list", |
bsw/jbe@19 | 158 params = { |
bsw/jbe@19 | 159 issue_id = issue.id, |
bsw/jbe@19 | 160 scoring = tempvoting_string |
bsw/jbe@19 | 161 } |
bsw/jbe@19 | 162 } |
bsw/jbe@19 | 163 |
bsw/jbe@5 | 164 end |