liquid_feedback_frontend

view model/issue.lua @ 51:0849be391140

Public read access; Read-only API for initiatives; Prepared integration of OpenID
author bsw
date Sun Apr 04 22:05:11 2010 +0200 (2010-04-04)
parents 4b2af207cefa
children 88ac7798b562
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('"_interest"."member_id"')
146 --:set_distinct()
147 end
149 function Issue:modify_selector_for_state(state)
150 if state == "new" then
151 initiatives_selector:add_where("issue.accepted ISNULL AND issue.cancelled ISNULL")
152 elseif state == "accepted" then
153 initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.cancelled ISNULL")
154 elseif state == "frozen" then
155 initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND cancelled ISNULL")
156 elseif state == "voting" then
157 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.finished ISNULL AND issue.cancelled ISNULL")
158 elseif state == "finished" then
159 initiatives_selector:add_where("issue.finished NOTNULL")
160 elseif state == "cancelled" then
161 initiatives_selector:add_where("issue.cancelled NOTNULL")
162 end
163 end
165 function Issue.object_get:state()
166 if self.accepted then
167 if self.closed then
168 return "finished"
169 elseif self.fully_frozen then
170 return "voting"
171 elseif self.half_frozen then
172 return "frozen"
173 else
174 return "accepted"
175 end
176 else
177 if self.closed then
178 return "cancelled"
179 else
180 return "new"
181 end
182 end
183 end
185 function Issue.object_get:state_name()
186 return Issue:get_state_name_for_state(self.state)
187 end
189 function Issue.object_get:state_time_left()
190 local state = self.state
191 local last_event_time
192 local duration
193 if state == "new" then
194 last_event_time = self.created
195 duration = self.admission_time
196 elseif state == "accepted" then
197 last_event_time = self.accepted
198 duration = self.discussion_time
199 elseif state == "frozen" then
200 last_event_time = self.half_frozen
201 duration = self.verification_time
202 elseif state == "voting" then
203 last_event_time = self.fully_frozen
204 duration = self.voting_time
205 end
206 return db:query{ "SELECT ?::timestamp + ?::interval - now() as time_left", last_event_time, duration }[1].time_left
207 end
209 function Issue.object_get:next_states()
210 local state = self.state
211 local next_states
212 if state == "new" then
213 next_states = { "accepted", "cancelled" }
214 elseif state == "accepted" then
215 next_states = { "frozen" }
216 elseif state == "frozen" then
217 next_states = { "voting" }
218 elseif state == "voting" then
219 next_states = { "finished" }
220 end
221 return next_states
222 end
224 function Issue.object_get:next_states_names()
225 local next_states = self.next_states
226 if not next_states then
227 return
228 end
229 local state_names = {}
230 for i, state in ipairs(self.next_states) do
231 state_names[#state_names+1] = Issue:get_state_name_for_state(state)
232 end
233 return table.concat(state_names, ", ")
234 end

Impressum / About Us