bsw/jbe@5: local issue = Issue:new_selector():add_where{ "id = ?", param.get("issue_id", atom.integer) }:for_share():single_object_mode():exec() bsw/jbe@5: bsw/jbe@5: if issue.closed then bsw/jbe@5: slot.put_into("error", _"This issue is already closed.") bsw/jbe@5: return false bsw/jbe@5: end bsw/jbe@5: bsw/jbe@5: if issue.state ~= "voting" then bsw/jbe@5: slot.put_into("error", _"Voting has not started yet.") bsw/jbe@5: return false bsw/jbe@5: end bsw/jbe@5: bsw@26: bsw@26: bsw/jbe@19: local move_up = param.get("move_up", atom.integer) bsw/jbe@19: local move_down = param.get("move_down", atom.integer) bsw/jbe@19: bsw/jbe@19: if not move_down and not move_up then bsw/jbe@19: local direct_voter = DirectVoter:by_pk(issue.id, app.session.member_id) bsw/jbe@19: bsw@26: if param.get("discard", atom.boolean) then bsw@26: if direct_voter then bsw@26: direct_voter:destroy() bsw@26: end bsw@26: slot.put_into("notice", _"Your vote has been discarded. Delegation rules apply if set.") bsw@26: return bsw@26: end bsw@26: bsw/jbe@19: if not direct_voter then bsw/jbe@19: direct_voter = DirectVoter:new() bsw/jbe@19: direct_voter.issue_id = issue.id bsw/jbe@19: direct_voter.member_id = app.session.member_id bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: direct_voter:save() bsw/jbe@19: bsw/jbe@19: local scoring = param.get("scoring") bsw/jbe@5: bsw/jbe@19: for initiative_id, grade in scoring:gmatch("([^:;]+):([^:;]+)") do bsw/jbe@19: local initiative_id = tonumber(initiative_id) bsw/jbe@19: local grade = tonumber(grade) bsw/jbe@19: local initiative = Initiative:by_id(initiative_id) bsw/jbe@19: if initiative.issue.id ~= issue.id then bsw/jbe@19: error("initiative from wrong issue") bsw/jbe@19: end bsw/jbe@19: local vote = Vote:by_pk(initiative_id, app.session.member.id) bsw/jbe@19: if not vote then bsw/jbe@19: vote = Vote:new() bsw/jbe@19: vote.issue_id = issue.id bsw/jbe@19: vote.initiative_id = initiative.id bsw/jbe@19: vote.member_id = app.session.member.id bsw/jbe@19: end bsw/jbe@19: vote.grade = grade bsw/jbe@19: vote:save() bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: else bsw/jbe@19: bsw/jbe@19: local tempvoting_string = param.get("scoring") bsw/jbe@5: bsw/jbe@19: local tempvotings = {} bsw/jbe@19: for match in tempvoting_string:gmatch("([^;]+)") do bsw/jbe@19: for initiative_id, grade in match:gmatch("([^:;]+):([^:;]+)") do bsw/jbe@19: tempvotings[tonumber(initiative_id)] = tonumber(grade) bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: local current_initiative_id = move_up or move_down bsw/jbe@5: bsw/jbe@19: local current_grade = tempvotings[current_initiative_id] or 0 bsw/jbe@19: local is_alone = true bsw/jbe@19: if current_grade == 0 then bsw/jbe@19: is_alone = false bsw/jbe@19: else bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if current_initiative_id ~= initiative_id and grade == current_grade then bsw/jbe@19: is_alone = false bsw/jbe@19: break bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@5: bsw/jbe@19: if move_up and current_grade >= 0 and is_alone then bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade > current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade - 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@5: bsw/jbe@19: elseif move_up and current_grade >= 0 and not is_alone then bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade > current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade + 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: tempvotings[current_initiative_id] = current_grade + 1 bsw/jbe@19: bsw/jbe@19: elseif move_up and current_grade < 0 and is_alone then bsw/jbe@19: tempvotings[current_initiative_id] = current_grade + 1 bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade < current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade + 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: elseif move_up and current_grade < 0 and not is_alone then bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade <= current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade - 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: tempvotings[current_initiative_id] = current_grade bsw/jbe@19: bsw/jbe@19: elseif move_down and current_grade <= 0 and is_alone then bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade < current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade + 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: elseif move_down and current_grade <= 0 and not is_alone then bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade < current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade - 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: tempvotings[current_initiative_id] = current_grade - 1 bsw/jbe@19: bsw/jbe@19: elseif move_down and current_grade > 0 and is_alone then bsw/jbe@19: tempvotings[current_initiative_id] = current_grade - 1 bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade > current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade - 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: elseif move_down and current_grade > 0 and not is_alone then bsw/jbe@19: for initiative_id, grade in pairs(tempvotings) do bsw/jbe@19: if grade >= current_grade then bsw/jbe@19: tempvotings[initiative_id] = grade + 1 bsw/jbe@19: end bsw/jbe@19: end bsw/jbe@19: tempvotings[current_initiative_id] = current_grade bsw/jbe@19: bsw/jbe@5: end bsw/jbe@19: bsw/jbe@19: local tempvotings_list = {} bsw/jbe@19: for key, val in pairs(tempvotings) do bsw/jbe@19: tempvotings_list[#tempvotings_list+1] = tostring(key) .. ":" .. tostring(val) bsw/jbe@5: end bsw/jbe@19: bsw/jbe@19: tempvoting_string = table.concat(tempvotings_list, ";") bsw/jbe@19: bsw/jbe@19: request.redirect{ bsw/jbe@19: module = "vote", bsw/jbe@19: view = "list", bsw/jbe@19: params = { bsw/jbe@19: issue_id = issue.id, bsw/jbe@19: scoring = tempvoting_string bsw/jbe@19: } bsw/jbe@19: } bsw/jbe@19: bsw/jbe@5: end