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@281
|
3 if not app.session.member:has_voting_right_for_unit_id(issue.area.unit_id) then
|
bsw@281
|
4 error("access denied")
|
bsw@281
|
5 end
|
bsw@281
|
6
|
bsw/jbe@5
|
7 if issue.closed then
|
bsw/jbe@5
|
8 slot.put_into("error", _"This issue is already closed.")
|
bsw/jbe@5
|
9 return false
|
bsw/jbe@5
|
10 end
|
bsw/jbe@5
|
11
|
bsw/jbe@5
|
12 if issue.state ~= "voting" then
|
bsw/jbe@5
|
13 slot.put_into("error", _"Voting has not started yet.")
|
bsw/jbe@5
|
14 return false
|
bsw/jbe@5
|
15 end
|
bsw/jbe@5
|
16
|
bsw@521
|
17 local direct_voter = DirectVoter:by_pk(issue.id, app.session.member_id)
|
bsw@521
|
18
|
bsw@521
|
19 if param.get("discard", atom.boolean) then
|
bsw@521
|
20 if direct_voter then
|
bsw@521
|
21 direct_voter:destroy()
|
bsw@521
|
22 end
|
bsw@521
|
23 slot.put_into("notice", _"Your vote has been discarded. Delegation rules apply if set.")
|
bsw@521
|
24 return
|
bsw@521
|
25 end
|
bsw@26
|
26
|
bsw@519
|
27 local move_up
|
bsw@519
|
28 local move_down
|
bsw@26
|
29
|
bsw@519
|
30 local tempvoting_string = param.get("scoring")
|
bsw@519
|
31
|
bsw@519
|
32 local tempvotings = {}
|
bsw@519
|
33 for match in tempvoting_string:gmatch("([^;]+)") do
|
bsw@519
|
34 for initiative_id, grade in match:gmatch("([^:;]+):([^:;]+)") do
|
bsw@519
|
35 tempvotings[tonumber(initiative_id)] = tonumber(grade)
|
bsw@519
|
36 if param.get("move_up_" .. initiative_id .. ".x", atom.integer) then
|
bsw@519
|
37 move_up = tonumber(initiative_id)
|
bsw@519
|
38 elseif param.get("move_down_" .. initiative_id .. ".x", atom.integer) then
|
bsw@519
|
39 move_down = tonumber(initiative_id)
|
bsw@519
|
40 end
|
bsw@519
|
41 end
|
bsw@519
|
42 end
|
bsw/jbe@19
|
43
|
bsw/jbe@19
|
44 if not move_down and not move_up then
|
bsw/jbe@19
|
45 if not direct_voter then
|
bsw/jbe@19
|
46 direct_voter = DirectVoter:new()
|
bsw/jbe@19
|
47 direct_voter.issue_id = issue.id
|
bsw/jbe@19
|
48 direct_voter.member_id = app.session.member_id
|
bsw/jbe@19
|
49 end
|
bsw/jbe@19
|
50
|
bsw/jbe@19
|
51 direct_voter:save()
|
bsw/jbe@19
|
52
|
bsw/jbe@19
|
53 local scoring = param.get("scoring")
|
bsw/jbe@5
|
54
|
bsw/jbe@19
|
55 for initiative_id, grade in scoring:gmatch("([^:;]+):([^:;]+)") do
|
bsw/jbe@19
|
56 local initiative_id = tonumber(initiative_id)
|
bsw/jbe@19
|
57 local grade = tonumber(grade)
|
bsw/jbe@19
|
58 local initiative = Initiative:by_id(initiative_id)
|
bsw/jbe@19
|
59 if initiative.issue.id ~= issue.id then
|
bsw/jbe@19
|
60 error("initiative from wrong issue")
|
bsw/jbe@19
|
61 end
|
bsw/jbe@19
|
62 local vote = Vote:by_pk(initiative_id, app.session.member.id)
|
bsw/jbe@19
|
63 if not vote then
|
bsw/jbe@19
|
64 vote = Vote:new()
|
bsw/jbe@19
|
65 vote.issue_id = issue.id
|
bsw/jbe@19
|
66 vote.initiative_id = initiative.id
|
bsw/jbe@19
|
67 vote.member_id = app.session.member.id
|
bsw/jbe@19
|
68 end
|
bsw/jbe@19
|
69 vote.grade = grade
|
bsw/jbe@19
|
70 vote:save()
|
bsw/jbe@19
|
71 end
|
bsw/jbe@19
|
72
|
bsw/jbe@19
|
73 else
|
bsw/jbe@19
|
74
|
bsw/jbe@19
|
75 local current_initiative_id = move_up or move_down
|
bsw/jbe@5
|
76
|
bsw/jbe@19
|
77 local current_grade = tempvotings[current_initiative_id] or 0
|
bsw/jbe@19
|
78 local is_alone = true
|
bsw/jbe@19
|
79 if current_grade == 0 then
|
bsw/jbe@19
|
80 is_alone = false
|
bsw/jbe@19
|
81 else
|
bsw/jbe@19
|
82 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
83 if current_initiative_id ~= initiative_id and grade == current_grade then
|
bsw/jbe@19
|
84 is_alone = false
|
bsw/jbe@19
|
85 break
|
bsw/jbe@19
|
86 end
|
bsw/jbe@19
|
87 end
|
bsw/jbe@19
|
88 end
|
bsw/jbe@5
|
89
|
bsw/jbe@19
|
90 if move_up and current_grade >= 0 and is_alone then
|
bsw/jbe@19
|
91 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
92 if grade > current_grade then
|
bsw/jbe@19
|
93 tempvotings[initiative_id] = grade - 1
|
bsw/jbe@19
|
94 end
|
bsw/jbe@19
|
95 end
|
bsw/jbe@5
|
96
|
bsw/jbe@19
|
97 elseif move_up and current_grade >= 0 and not is_alone then
|
bsw/jbe@19
|
98 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
99 if grade > current_grade then
|
bsw/jbe@19
|
100 tempvotings[initiative_id] = grade + 1
|
bsw/jbe@19
|
101 end
|
bsw/jbe@19
|
102 end
|
bsw/jbe@19
|
103 tempvotings[current_initiative_id] = current_grade + 1
|
bsw/jbe@19
|
104
|
bsw/jbe@19
|
105 elseif move_up and current_grade < 0 and is_alone then
|
bsw/jbe@19
|
106 tempvotings[current_initiative_id] = current_grade + 1
|
bsw/jbe@19
|
107 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
108 if grade < current_grade then
|
bsw/jbe@19
|
109 tempvotings[initiative_id] = grade + 1
|
bsw/jbe@19
|
110 end
|
bsw/jbe@19
|
111 end
|
bsw/jbe@19
|
112
|
bsw/jbe@19
|
113 elseif move_up and current_grade < 0 and not is_alone then
|
bsw/jbe@19
|
114 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
115 if grade <= current_grade then
|
bsw/jbe@19
|
116 tempvotings[initiative_id] = grade - 1
|
bsw/jbe@19
|
117 end
|
bsw/jbe@19
|
118 end
|
bsw/jbe@19
|
119 tempvotings[current_initiative_id] = current_grade
|
bsw/jbe@19
|
120
|
bsw/jbe@19
|
121 elseif move_down and current_grade <= 0 and is_alone then
|
bsw/jbe@19
|
122 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
123 if grade < current_grade then
|
bsw/jbe@19
|
124 tempvotings[initiative_id] = grade + 1
|
bsw/jbe@19
|
125 end
|
bsw/jbe@19
|
126 end
|
bsw/jbe@19
|
127
|
bsw/jbe@19
|
128 elseif move_down and current_grade <= 0 and not is_alone then
|
bsw/jbe@19
|
129 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
130 if grade < current_grade then
|
bsw/jbe@19
|
131 tempvotings[initiative_id] = grade - 1
|
bsw/jbe@19
|
132 end
|
bsw/jbe@19
|
133 end
|
bsw/jbe@19
|
134 tempvotings[current_initiative_id] = current_grade - 1
|
bsw/jbe@19
|
135
|
bsw/jbe@19
|
136 elseif move_down and current_grade > 0 and is_alone then
|
bsw/jbe@19
|
137 tempvotings[current_initiative_id] = current_grade - 1
|
bsw/jbe@19
|
138 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
139 if grade > current_grade then
|
bsw/jbe@19
|
140 tempvotings[initiative_id] = grade - 1
|
bsw/jbe@19
|
141 end
|
bsw/jbe@19
|
142 end
|
bsw/jbe@19
|
143
|
bsw/jbe@19
|
144 elseif move_down and current_grade > 0 and not is_alone then
|
bsw/jbe@19
|
145 for initiative_id, grade in pairs(tempvotings) do
|
bsw/jbe@19
|
146 if grade >= current_grade then
|
bsw/jbe@19
|
147 tempvotings[initiative_id] = grade + 1
|
bsw/jbe@19
|
148 end
|
bsw/jbe@19
|
149 end
|
bsw/jbe@19
|
150 tempvotings[current_initiative_id] = current_grade
|
bsw/jbe@19
|
151
|
bsw/jbe@5
|
152 end
|
bsw/jbe@19
|
153
|
bsw/jbe@19
|
154 local tempvotings_list = {}
|
bsw/jbe@19
|
155 for key, val in pairs(tempvotings) do
|
bsw/jbe@19
|
156 tempvotings_list[#tempvotings_list+1] = tostring(key) .. ":" .. tostring(val)
|
bsw/jbe@5
|
157 end
|
bsw/jbe@19
|
158
|
bsw/jbe@19
|
159 tempvoting_string = table.concat(tempvotings_list, ";")
|
bsw/jbe@19
|
160
|
bsw/jbe@19
|
161 request.redirect{
|
bsw/jbe@19
|
162 module = "vote",
|
bsw/jbe@19
|
163 view = "list",
|
bsw/jbe@19
|
164 params = {
|
bsw/jbe@19
|
165 issue_id = issue.id,
|
bsw/jbe@19
|
166 scoring = tempvoting_string
|
bsw/jbe@19
|
167 }
|
bsw/jbe@19
|
168 }
|
bsw/jbe@19
|
169
|
bsw/jbe@5
|
170 end
|