liquid_feedback_frontend
view model/issue.lua @ 118:93f4e465b50d
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