liquid_feedback_frontend
view model/issue.lua @ 157:24e47baf5f9b
strip html from fallback title
if the slot is used for title, make sure the html is stripped from it
if the slot is used for title, make sure the html is stripped from it
| author | Daniel Poelzleithner <poelzi@poelzi.org> | 
|---|---|
| date | Fri Oct 08 20:31:09 2010 +0200 (2010-10-08) | 
| parents | 21ddb78dd09d | 
| children | 4993b71b383f f460555c9896 | 
 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"."cleaned"')
   140     :add_group_by('"issue"."snapshot"')
   141     :add_group_by('"issue"."latest_snapshot_event"')
   142     :add_group_by('"issue"."population"')
   143     :add_group_by('"issue"."vote_now"')
   144     :add_group_by('"issue"."vote_later"')
   145     :add_group_by('"issue"."voter_count"')
   146     :add_group_by('"issue"."admission_time"')
   147     :add_group_by('"issue"."discussion_time"')
   148     :add_group_by('"issue"."verification_time"')
   149     :add_group_by('"issue"."voting_time"')
   150     :add_group_by('"_interest"."member_id"')
   151     --:set_distinct()
   152 end
   154 function Issue:modify_selector_for_state(initiatives_selector, state)
   155   if state == "new" then
   156     initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
   157   elseif state == "accepted" then
   158     initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
   159   elseif state == "frozen" then
   160     initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
   161   elseif state == "voting" then
   162     initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
   163   elseif state == "finished" then
   164     initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL")
   165   elseif state == "cancelled" then
   166     initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL")
   167   else
   168     error("Invalid state")
   169   end
   170 end
   172 function Issue.object_get:state()
   173   if self.closed then
   174     if self.fully_frozen then
   175       return "finished"
   176     else
   177       return "cancelled"
   178     end
   179   elseif self.fully_frozen then
   180     return "voting"
   181   elseif self.half_frozen then
   182     return "frozen"
   183   elseif self.accepted then
   184     return "accepted"
   185   else
   186     return "new"
   187   end
   189 end
   191 function Issue.object_get:state_name()
   192   return Issue:get_state_name_for_state(self.state)
   193 end
   195 function Issue.object_get:state_time_left()
   196   local state = self.state
   197   local last_event_time
   198   local duration
   199   if state == "new" then
   200     last_event_time = self.created
   201     duration = self.admission_time
   202   elseif state == "accepted" then
   203     last_event_time = self.accepted
   204     duration =  self.discussion_time
   205   elseif state == "frozen" then
   206     last_event_time = self.half_frozen
   207     duration = self.verification_time
   208   elseif state == "voting" then
   209     last_event_time = self.fully_frozen
   210     duration = self.voting_time
   211   end
   212   return db:query{ "SELECT ?::timestamp + ?::interval - CURRENT_TIMESTAMP(0) as time_left", last_event_time, duration }[1].time_left
   213 end
   215 function Issue.object_get:next_states()
   216   local state = self.state
   217   local next_states
   218   if state == "new" then
   219     next_states = { "accepted", "cancelled" }
   220   elseif state == "accepted" then
   221     next_states = { "frozen" }
   222   elseif state == "frozen" then
   223     next_states = { "voting" }
   224   elseif state == "voting" then
   225     next_states = { "finished" }
   226   end
   227   return next_states
   228 end
   230 function Issue.object_get:next_states_names()
   231   local next_states = self.next_states
   232   if not next_states then
   233     return
   234   end
   235   local state_names = {}
   236   for i, state in ipairs(self.next_states) do
   237     state_names[#state_names+1] = Issue:get_state_name_for_state(state)
   238   end
   239   return table.concat(state_names, ", ")
   240 end
