liquid_feedback_frontend
view model/issue.lua @ 282:7f41f3c44fae
Changes in policy admin interface for core 2.0
author | bsw |
---|---|
date | Fri Feb 17 10:20:26 2012 +0100 (2012-02-17) |
parents | f460555c9896 |
children | af496baa9bda |
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"."voter_count"')
144 :add_group_by('"issue"."admission_time"')
145 :add_group_by('"issue"."discussion_time"')
146 :add_group_by('"issue"."verification_time"')
147 :add_group_by('"issue"."voting_time"')
148 :add_group_by('"_interest"."member_id"')
149 --:set_distinct()
150 end
152 function Issue:modify_selector_for_state(initiatives_selector, state)
153 if state == "new" then
154 initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
155 elseif state == "accepted" then
156 initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
157 elseif state == "frozen" then
158 initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
159 elseif state == "voting" then
160 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
161 elseif state == "finished" then
162 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL")
163 elseif state == "cancelled" then
164 initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL")
165 else
166 error("Invalid state")
167 end
168 end
170 function Issue.object_get:state()
171 if self.closed then
172 if self.fully_frozen then
173 return "finished"
174 else
175 return "cancelled"
176 end
177 elseif self.fully_frozen then
178 return "voting"
179 elseif self.half_frozen then
180 return "frozen"
181 elseif self.accepted then
182 return "accepted"
183 else
184 return "new"
185 end
187 end
189 function Issue.object_get:state_name()
190 return Issue:get_state_name_for_state(self.state)
191 end
193 function Issue.object_get:state_time_left()
194 local state = self.state
195 local last_event_time
196 local duration
197 if state == "new" then
198 last_event_time = self.created
199 duration = self.admission_time
200 elseif state == "accepted" then
201 last_event_time = self.accepted
202 duration = self.discussion_time
203 elseif state == "frozen" then
204 last_event_time = self.half_frozen
205 duration = self.verification_time
206 elseif state == "voting" then
207 last_event_time = self.fully_frozen
208 duration = self.voting_time
209 end
210 return db:query{ "SELECT ?::timestamp + ?::interval - CURRENT_TIMESTAMP(0) as time_left", last_event_time, duration }[1].time_left
211 end
213 function Issue.object_get:next_states()
214 local state = self.state
215 local next_states
216 if state == "new" then
217 next_states = { "accepted", "cancelled" }
218 elseif state == "accepted" then
219 next_states = { "frozen" }
220 elseif state == "frozen" then
221 next_states = { "voting" }
222 elseif state == "voting" then
223 next_states = { "finished" }
224 end
225 return next_states
226 end
228 function Issue.object_get:next_states_names()
229 local next_states = self.next_states
230 if not next_states then
231 return
232 end
233 local state_names = {}
234 for i, state in ipairs(self.next_states) do
235 state_names[#state_names+1] = Issue:get_state_name_for_state(state)
236 end
237 return table.concat(state_names, ", ")
238 end