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.
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

Impressum / About Us