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