liquid_feedback_frontend
view model/issue.lua @ 266:aab7b0c5543f
Disabled next/prev initiative/issue links
author | bsw |
---|---|
date | Tue Feb 07 19:25:29 2012 +0100 (2012-02-07) |
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