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