liquid_feedback_frontend

annotate model/issue.lua @ 111:bf885faf3452

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.
author Daniel Poelzleithner <poelzi@poelzi.org>
date Mon Sep 20 20:32:04 2010 +0200 (2010-09-20)
parents 733f65c0c0a0
children eb6509288d67
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"')
bsw/jbe@6 139 :add_group_by('"issue"."snapshot"')
bsw/jbe@6 140 :add_group_by('"issue"."latest_snapshot_event"')
bsw/jbe@6 141 :add_group_by('"issue"."population"')
bsw/jbe@6 142 :add_group_by('"issue"."vote_now"')
bsw/jbe@6 143 :add_group_by('"issue"."vote_later"')
bsw/jbe@6 144 :add_group_by('"issue"."voter_count"')
bsw@75 145 :add_group_by('"issue"."admission_time"')
bsw@75 146 :add_group_by('"issue"."discussion_time"')
bsw@75 147 :add_group_by('"issue"."verification_time"')
bsw@75 148 :add_group_by('"issue"."voting_time"')
bsw/jbe@19 149 :add_group_by('"_interest"."member_id"')
bsw/jbe@6 150 --:set_distinct()
bsw/jbe@0 151 end
bsw/jbe@0 152
bsw@75 153 function Issue:modify_selector_for_state(initiatives_selector, state)
bsw@51 154 if state == "new" then
bsw@75 155 initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
bsw@51 156 elseif state == "accepted" then
bsw@75 157 initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
bsw@51 158 elseif state == "frozen" then
bsw@75 159 initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
bsw@51 160 elseif state == "voting" then
bsw@75 161 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
bsw@51 162 elseif state == "finished" then
bsw@75 163 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL")
bsw@51 164 elseif state == "cancelled" then
bsw@75 165 initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL")
bsw@75 166 else
bsw@75 167 error("Invalid state")
bsw@51 168 end
bsw@51 169 end
bsw@51 170
bsw/jbe@0 171 function Issue.object_get:state()
bsw/jbe@52 172 if self.closed then
bsw/jbe@52 173 if self.fully_frozen then
bsw/jbe@5 174 return "finished"
bsw/jbe@0 175 else
bsw/jbe@52 176 return "cancelled"
bsw/jbe@0 177 end
bsw/jbe@52 178 elseif self.fully_frozen then
bsw/jbe@52 179 return "voting"
bsw/jbe@52 180 elseif self.half_frozen then
bsw/jbe@52 181 return "frozen"
bsw/jbe@52 182 elseif self.accepted then
bsw/jbe@52 183 return "accepted"
bsw/jbe@0 184 else
bsw/jbe@52 185 return "new"
bsw/jbe@0 186 end
bsw/jbe@52 187
bsw@2 188 end
bsw@2 189
bsw@2 190 function Issue.object_get:state_name()
bsw@2 191 return Issue:get_state_name_for_state(self.state)
bsw@2 192 end
bsw@2 193
bsw@2 194 function Issue.object_get:state_time_left()
bsw@2 195 local state = self.state
bsw@2 196 local last_event_time
bsw@2 197 local duration
bsw@2 198 if state == "new" then
bsw@2 199 last_event_time = self.created
bsw@25 200 duration = self.admission_time
bsw@2 201 elseif state == "accepted" then
bsw@2 202 last_event_time = self.accepted
bsw@25 203 duration = self.discussion_time
bsw@2 204 elseif state == "frozen" then
bsw@2 205 last_event_time = self.half_frozen
bsw@25 206 duration = self.verification_time
bsw@2 207 elseif state == "voting" then
bsw@2 208 last_event_time = self.fully_frozen
bsw@25 209 duration = self.voting_time
bsw@2 210 end
bsw@2 211 return db:query{ "SELECT ?::timestamp + ?::interval - now() as time_left", last_event_time, duration }[1].time_left
bsw@2 212 end
bsw@2 213
bsw@2 214 function Issue.object_get:next_states()
bsw@2 215 local state = self.state
bsw@2 216 local next_states
bsw@2 217 if state == "new" then
bsw@2 218 next_states = { "accepted", "cancelled" }
bsw@2 219 elseif state == "accepted" then
bsw@2 220 next_states = { "frozen" }
bsw@2 221 elseif state == "frozen" then
bsw@2 222 next_states = { "voting" }
bsw@2 223 elseif state == "voting" then
bsw@2 224 next_states = { "finished" }
bsw@2 225 end
bsw@2 226 return next_states
bsw@2 227 end
bsw@2 228
bsw@2 229 function Issue.object_get:next_states_names()
bsw@2 230 local next_states = self.next_states
bsw@2 231 if not next_states then
bsw@2 232 return
bsw@2 233 end
bsw@2 234 local state_names = {}
bsw@2 235 for i, state in ipairs(self.next_states) do
bsw@2 236 state_names[#state_names+1] = Issue:get_state_name_for_state(state)
bsw@2 237 end
bsw@2 238 return table.concat(state_names, ", ")
bsw/jbe@0 239 end

Impressum / About Us