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