| rev | line source | 
| bsw/jbe@0 | 1 Issue = mondelefant.new_class() | 
| bsw/jbe@0 | 2 Issue.table = 'issue' | 
| bsw/jbe@0 | 3 | 
| bsw/jbe@0 | 4 Issue:add_reference{ | 
| bsw/jbe@0 | 5   mode          = 'm1', | 
| bsw/jbe@0 | 6   to            = "Area", | 
| bsw/jbe@0 | 7   this_key      = 'area_id', | 
| bsw/jbe@0 | 8   that_key      = 'id', | 
| bsw/jbe@0 | 9   ref           = 'area', | 
| bsw/jbe@0 | 10 } | 
| bsw/jbe@0 | 11 | 
| bsw/jbe@0 | 12 Issue:add_reference{ | 
| bsw/jbe@0 | 13   mode          = 'm1', | 
| bsw/jbe@0 | 14   to            = "Policy", | 
| bsw/jbe@0 | 15   this_key      = 'policy_id', | 
| bsw/jbe@0 | 16   that_key      = 'id', | 
| bsw/jbe@0 | 17   ref           = 'policy', | 
| bsw/jbe@0 | 18 } | 
| bsw/jbe@0 | 19 | 
| bsw/jbe@0 | 20 Issue:add_reference{ | 
| bsw/jbe@0 | 21   mode          = '1m', | 
| bsw/jbe@0 | 22   to            = "Initiative", | 
| bsw/jbe@0 | 23   this_key      = 'id', | 
| bsw/jbe@0 | 24   that_key      = 'issue_id', | 
| bsw/jbe@0 | 25   ref           = 'initiatives', | 
| bsw/jbe@0 | 26   back_ref      = 'issue' | 
| bsw/jbe@0 | 27 } | 
| bsw/jbe@0 | 28 | 
| bsw/jbe@0 | 29 Issue:add_reference{ | 
| bsw/jbe@0 | 30   mode          = '1m', | 
| bsw/jbe@0 | 31   to            = "Interest", | 
| bsw/jbe@0 | 32   this_key      = 'id', | 
| bsw/jbe@0 | 33   that_key      = 'issue_id', | 
| bsw/jbe@0 | 34   ref           = 'interests', | 
| bsw/jbe@0 | 35   back_ref      = 'issue', | 
| bsw/jbe@0 | 36   default_order = '"id"' | 
| bsw/jbe@0 | 37 } | 
| bsw/jbe@0 | 38 | 
| bsw/jbe@0 | 39 Issue:add_reference{ | 
| bsw/jbe@0 | 40   mode          = '1m', | 
| bsw/jbe@0 | 41   to            = "Supporter", | 
| bsw/jbe@0 | 42   this_key      = 'id', | 
| bsw/jbe@0 | 43   that_key      = 'issue_id', | 
| bsw/jbe@0 | 44   ref           = 'supporters', | 
| bsw/jbe@0 | 45   back_ref      = 'issue', | 
| bsw/jbe@0 | 46   default_order = '"id"' | 
| bsw/jbe@0 | 47 } | 
| bsw/jbe@0 | 48 | 
| bsw/jbe@0 | 49 Issue:add_reference{ | 
| bsw/jbe@0 | 50   mode          = '1m', | 
| bsw/jbe@0 | 51   to            = "DirectVoter", | 
| bsw/jbe@0 | 52   this_key      = 'id', | 
| bsw/jbe@0 | 53   that_key      = 'issue_id', | 
| bsw/jbe@0 | 54   ref           = 'direct_voters', | 
| bsw/jbe@0 | 55   back_ref      = 'issue', | 
| bsw/jbe@0 | 56   default_order = '"member_id"' | 
| bsw/jbe@0 | 57 } | 
| bsw/jbe@0 | 58 | 
| bsw/jbe@0 | 59 Issue:add_reference{ | 
| bsw/jbe@0 | 60   mode          = '1m', | 
| bsw/jbe@0 | 61   to            = "Vote", | 
| bsw/jbe@0 | 62   this_key      = 'id', | 
| bsw/jbe@0 | 63   that_key      = 'issue_id', | 
| bsw/jbe@0 | 64   ref           = 'votes', | 
| bsw/jbe@0 | 65   back_ref      = 'issue', | 
| bsw/jbe@0 | 66   default_order = '"member_id", "initiative_id"' | 
| bsw/jbe@0 | 67 } | 
| bsw/jbe@0 | 68 | 
| bsw/jbe@0 | 69 Issue:add_reference{ | 
| bsw@2 | 70   mode          = '1m', | 
| bsw@2 | 71   to            = "Delegation", | 
| bsw@2 | 72   this_key      = 'id', | 
| bsw@2 | 73   that_key      = 'issue_id', | 
| bsw@2 | 74   ref           = 'delegations', | 
| bsw@2 | 75   back_ref      = 'issue' | 
| bsw@2 | 76 } | 
| bsw@2 | 77 | 
| bsw@2 | 78 Issue:add_reference{ | 
| bsw/jbe@0 | 79   mode                  = 'mm', | 
| bsw/jbe@0 | 80   to                    = "Member", | 
| bsw/jbe@0 | 81   this_key              = 'id', | 
| bsw/jbe@0 | 82   that_key              = 'id', | 
| bsw/jbe@0 | 83   connected_by_table    = 'interest', | 
| bsw/jbe@0 | 84   connected_by_this_key = 'issue_id', | 
| bsw/jbe@0 | 85   connected_by_that_key = 'member_id', | 
| bsw/jbe@0 | 86   ref                   = 'members' | 
| bsw/jbe@0 | 87 } | 
| bsw/jbe@0 | 88 | 
| bsw@3 | 89 Issue:add_reference{ | 
| bsw@3 | 90   mode                  = 'mm', | 
| bsw@3 | 91   to                    = "Member", | 
| bsw@3 | 92   this_key              = 'id', | 
| bsw@3 | 93   that_key              = 'id', | 
| bsw@3 | 94   connected_by_table    = 'direct_interest_snapshot', | 
| bsw@3 | 95   connected_by_this_key = 'issue_id', | 
| bsw@3 | 96   connected_by_that_key = 'member_id', | 
| bsw@3 | 97   ref                   = 'interested_members_snapshot' | 
| bsw@3 | 98 } | 
| bsw@3 | 99 | 
| bsw/jbe@6 | 100 Issue:add_reference{ | 
| bsw/jbe@6 | 101   mode                  = 'mm', | 
| bsw/jbe@6 | 102   to                    = "Member", | 
| bsw/jbe@6 | 103   this_key              = 'id', | 
| bsw/jbe@6 | 104   that_key              = 'id', | 
| bsw/jbe@6 | 105   connected_by_table    = 'direct_voter', | 
| bsw/jbe@6 | 106   connected_by_this_key = 'issue_id', | 
| bsw/jbe@6 | 107   connected_by_that_key = 'member_id', | 
| bsw/jbe@6 | 108   ref                   = 'direct_voters' | 
| bsw/jbe@6 | 109 } | 
| bsw/jbe@6 | 110 | 
| bsw/jbe@6 | 111 | 
| bsw/jbe@6 | 112 | 
| bsw/jbe@0 | 113 function Issue:get_state_name_for_state(value) | 
| bsw@2 | 114   local state_name_table = { | 
| bsw@2 | 115     new          = _"New", | 
| bsw@3 | 116     accepted     = _"Discussion", | 
| bsw@2 | 117     frozen       = _"Frozen", | 
| bsw@2 | 118     voting       = _"Voting", | 
| bsw@2 | 119     finished     = _"Finished", | 
| bsw@2 | 120     cancelled    = _"Cancelled" | 
| bsw@2 | 121   } | 
| bsw@10 | 122   return state_name_table[value] or value or '' | 
| bsw/jbe@0 | 123 end | 
| bsw/jbe@0 | 124 | 
| bsw@2 | 125 function Issue:get_search_selector(search_string) | 
| bsw/jbe@0 | 126   return self:new_selector() | 
| bsw/jbe@0 | 127     :join('"initiative"', nil, '"initiative"."issue_id" = "issue"."id"') | 
| bsw/jbe@6 | 128     :join('"draft"', nil, '"draft"."initiative_id" = "initiative"."id"') | 
| bsw/jbe@6 | 129     :add_where{ '"initiative"."text_search_data" @@ "text_search_query"(?) OR "draft"."text_search_data" @@ "text_search_query"(?)', search_string, search_string } | 
| bsw/jbe@6 | 130     :add_group_by('"issue"."id"') | 
| bsw/jbe@6 | 131     :add_group_by('"issue"."area_id"') | 
| bsw/jbe@6 | 132     :add_group_by('"issue"."policy_id"') | 
| bsw/jbe@6 | 133     :add_group_by('"issue"."created"') | 
| bsw/jbe@6 | 134     :add_group_by('"issue"."accepted"') | 
| bsw/jbe@6 | 135     :add_group_by('"issue"."half_frozen"') | 
| bsw/jbe@6 | 136     :add_group_by('"issue"."fully_frozen"') | 
| bsw/jbe@6 | 137     :add_group_by('"issue"."closed"') | 
| bsw/jbe@6 | 138     :add_group_by('"issue"."ranks_available"') | 
| poelzi@140 | 139     :add_group_by('"issue"."cleaned"') | 
| bsw/jbe@6 | 140     :add_group_by('"issue"."snapshot"') | 
| bsw/jbe@6 | 141     :add_group_by('"issue"."latest_snapshot_event"') | 
| bsw/jbe@6 | 142     :add_group_by('"issue"."population"') | 
| bsw/jbe@6 | 143     :add_group_by('"issue"."vote_now"') | 
| bsw/jbe@6 | 144     :add_group_by('"issue"."vote_later"') | 
| bsw/jbe@6 | 145     :add_group_by('"issue"."voter_count"') | 
| bsw@75 | 146     :add_group_by('"issue"."admission_time"') | 
| bsw@75 | 147     :add_group_by('"issue"."discussion_time"') | 
| bsw@75 | 148     :add_group_by('"issue"."verification_time"') | 
| bsw@75 | 149     :add_group_by('"issue"."voting_time"') | 
| bsw/jbe@19 | 150     :add_group_by('"_interest"."member_id"') | 
| bsw/jbe@6 | 151     --:set_distinct() | 
| bsw/jbe@0 | 152 end | 
| bsw/jbe@0 | 153 | 
| bsw@75 | 154 function Issue:modify_selector_for_state(initiatives_selector, state) | 
| bsw@51 | 155   if state == "new" then | 
| bsw@75 | 156     initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") | 
| bsw@51 | 157   elseif state == "accepted" then | 
| bsw@75 | 158     initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") | 
| bsw@51 | 159   elseif state == "frozen" then | 
| bsw@75 | 160     initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL") | 
| bsw@51 | 161   elseif state == "voting" then | 
| bsw@75 | 162     initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") | 
| bsw@51 | 163   elseif state == "finished" then | 
| bsw@75 | 164     initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL") | 
| bsw@51 | 165   elseif state == "cancelled" then | 
| bsw@75 | 166     initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL") | 
| bsw@75 | 167   else | 
| bsw@75 | 168     error("Invalid state") | 
| bsw@51 | 169   end | 
| bsw@51 | 170 end | 
| bsw@51 | 171 | 
| bsw/jbe@0 | 172 function Issue.object_get:state() | 
| bsw/jbe@52 | 173   if self.closed then | 
| bsw/jbe@52 | 174     if self.fully_frozen then | 
| bsw/jbe@5 | 175       return "finished" | 
| bsw/jbe@0 | 176     else | 
| bsw/jbe@52 | 177       return "cancelled" | 
| bsw/jbe@0 | 178     end | 
| bsw/jbe@52 | 179   elseif self.fully_frozen then | 
| bsw/jbe@52 | 180     return "voting" | 
| bsw/jbe@52 | 181   elseif self.half_frozen then | 
| bsw/jbe@52 | 182     return "frozen" | 
| bsw/jbe@52 | 183   elseif self.accepted then | 
| bsw/jbe@52 | 184     return "accepted" | 
| bsw/jbe@0 | 185   else | 
| bsw/jbe@52 | 186     return "new" | 
| bsw/jbe@0 | 187   end | 
| bsw/jbe@52 | 188 | 
| bsw@2 | 189 end | 
| bsw@2 | 190 | 
| bsw@2 | 191 function Issue.object_get:state_name() | 
| bsw@2 | 192   return Issue:get_state_name_for_state(self.state) | 
| bsw@2 | 193 end | 
| bsw@2 | 194 | 
| bsw@2 | 195 function Issue.object_get:state_time_left() | 
| bsw@2 | 196   local state = self.state | 
| bsw@2 | 197   local last_event_time | 
| bsw@2 | 198   local duration | 
| bsw@2 | 199   if state == "new" then | 
| bsw@2 | 200     last_event_time = self.created | 
| bsw@25 | 201     duration = self.admission_time | 
| bsw@2 | 202   elseif state == "accepted" then | 
| bsw@2 | 203     last_event_time = self.accepted | 
| bsw@25 | 204     duration =  self.discussion_time | 
| bsw@2 | 205   elseif state == "frozen" then | 
| bsw@2 | 206     last_event_time = self.half_frozen | 
| bsw@25 | 207     duration = self.verification_time | 
| bsw@2 | 208   elseif state == "voting" then | 
| bsw@2 | 209     last_event_time = self.fully_frozen | 
| bsw@25 | 210     duration = self.voting_time | 
| bsw@2 | 211   end | 
| poelzi@125 | 212   return db:query{ "SELECT ?::timestamp + ?::interval - CURRENT_TIMESTAMP(0) as time_left", last_event_time, duration }[1].time_left | 
| bsw@2 | 213 end | 
| bsw@2 | 214 | 
| bsw@2 | 215 function Issue.object_get:next_states() | 
| bsw@2 | 216   local state = self.state | 
| bsw@2 | 217   local next_states | 
| bsw@2 | 218   if state == "new" then | 
| bsw@2 | 219     next_states = { "accepted", "cancelled" } | 
| bsw@2 | 220   elseif state == "accepted" then | 
| bsw@2 | 221     next_states = { "frozen" } | 
| bsw@2 | 222   elseif state == "frozen" then | 
| bsw@2 | 223     next_states = { "voting" } | 
| bsw@2 | 224   elseif state == "voting" then | 
| bsw@2 | 225     next_states = { "finished" } | 
| bsw@2 | 226   end | 
| bsw@2 | 227   return next_states | 
| bsw@2 | 228 end | 
| bsw@2 | 229 | 
| bsw@2 | 230 function Issue.object_get:next_states_names() | 
| bsw@2 | 231   local next_states = self.next_states | 
| bsw@2 | 232   if not next_states then | 
| bsw@2 | 233     return | 
| bsw@2 | 234   end | 
| bsw@2 | 235   local state_names = {} | 
| bsw@2 | 236   for i, state in ipairs(self.next_states) do | 
| bsw@2 | 237     state_names[#state_names+1] = Issue:get_state_name_for_state(state) | 
| bsw@2 | 238   end | 
| bsw@2 | 239   return table.concat(state_names, ", ") | 
| bsw/jbe@0 | 240 end |