liquid_feedback_frontend
view model/issue.lua @ 172:165f4bd02cf3
don't show the first draft of a new initiative as a new draft event in the timeline
new draft should only show changes of drafts drafts of new initiatives as they are handled by the new initiative event
new draft should only show changes of drafts drafts of new initiatives as they are handled by the new initiative event
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Sun Oct 10 19:40:32 2010 +0200 (2010-10-10) |
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