liquid_feedback_frontend
annotate 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 |
rev | line source |
---|---|
bsw/jbe@0 | 1 Issue = mondelefant.new_class() |
bsw/jbe@0 | 2 Issue.table = 'issue' |
bsw/jbe@0 | 3 |
bsw/jbe@0 | 4 Issue:add_reference{ |
bsw/jbe@0 | 5 mode = 'm1', |
bsw/jbe@0 | 6 to = "Area", |
bsw/jbe@0 | 7 this_key = 'area_id', |
bsw/jbe@0 | 8 that_key = 'id', |
bsw/jbe@0 | 9 ref = 'area', |
bsw/jbe@0 | 10 } |
bsw/jbe@0 | 11 |
bsw/jbe@0 | 12 Issue:add_reference{ |
bsw/jbe@0 | 13 mode = 'm1', |
bsw/jbe@0 | 14 to = "Policy", |
bsw/jbe@0 | 15 this_key = 'policy_id', |
bsw/jbe@0 | 16 that_key = 'id', |
bsw/jbe@0 | 17 ref = 'policy', |
bsw/jbe@0 | 18 } |
bsw/jbe@0 | 19 |
bsw/jbe@0 | 20 Issue:add_reference{ |
bsw/jbe@0 | 21 mode = '1m', |
bsw/jbe@0 | 22 to = "Initiative", |
bsw/jbe@0 | 23 this_key = 'id', |
bsw/jbe@0 | 24 that_key = 'issue_id', |
bsw/jbe@0 | 25 ref = 'initiatives', |
bsw/jbe@0 | 26 back_ref = 'issue' |
bsw/jbe@0 | 27 } |
bsw/jbe@0 | 28 |
bsw/jbe@0 | 29 Issue:add_reference{ |
bsw/jbe@0 | 30 mode = '1m', |
bsw/jbe@0 | 31 to = "Interest", |
bsw/jbe@0 | 32 this_key = 'id', |
bsw/jbe@0 | 33 that_key = 'issue_id', |
bsw/jbe@0 | 34 ref = 'interests', |
bsw/jbe@0 | 35 back_ref = 'issue', |
bsw/jbe@0 | 36 default_order = '"id"' |
bsw/jbe@0 | 37 } |
bsw/jbe@0 | 38 |
bsw/jbe@0 | 39 Issue:add_reference{ |
bsw/jbe@0 | 40 mode = '1m', |
bsw/jbe@0 | 41 to = "Supporter", |
bsw/jbe@0 | 42 this_key = 'id', |
bsw/jbe@0 | 43 that_key = 'issue_id', |
bsw/jbe@0 | 44 ref = 'supporters', |
bsw/jbe@0 | 45 back_ref = 'issue', |
bsw/jbe@0 | 46 default_order = '"id"' |
bsw/jbe@0 | 47 } |
bsw/jbe@0 | 48 |
bsw/jbe@0 | 49 Issue:add_reference{ |
bsw/jbe@0 | 50 mode = '1m', |
bsw/jbe@0 | 51 to = "DirectVoter", |
bsw/jbe@0 | 52 this_key = 'id', |
bsw/jbe@0 | 53 that_key = 'issue_id', |
bsw/jbe@0 | 54 ref = 'direct_voters', |
bsw/jbe@0 | 55 back_ref = 'issue', |
bsw/jbe@0 | 56 default_order = '"member_id"' |
bsw/jbe@0 | 57 } |
bsw/jbe@0 | 58 |
bsw/jbe@0 | 59 Issue:add_reference{ |
bsw/jbe@0 | 60 mode = '1m', |
bsw/jbe@0 | 61 to = "Vote", |
bsw/jbe@0 | 62 this_key = 'id', |
bsw/jbe@0 | 63 that_key = 'issue_id', |
bsw/jbe@0 | 64 ref = 'votes', |
bsw/jbe@0 | 65 back_ref = 'issue', |
bsw/jbe@0 | 66 default_order = '"member_id", "initiative_id"' |
bsw/jbe@0 | 67 } |
bsw/jbe@0 | 68 |
bsw/jbe@0 | 69 Issue:add_reference{ |
bsw@2 | 70 mode = '1m', |
bsw@2 | 71 to = "Delegation", |
bsw@2 | 72 this_key = 'id', |
bsw@2 | 73 that_key = 'issue_id', |
bsw@2 | 74 ref = 'delegations', |
bsw@2 | 75 back_ref = 'issue' |
bsw@2 | 76 } |
bsw@2 | 77 |
bsw@2 | 78 Issue:add_reference{ |
bsw/jbe@0 | 79 mode = 'mm', |
bsw/jbe@0 | 80 to = "Member", |
bsw/jbe@0 | 81 this_key = 'id', |
bsw/jbe@0 | 82 that_key = 'id', |
bsw/jbe@0 | 83 connected_by_table = 'interest', |
bsw/jbe@0 | 84 connected_by_this_key = 'issue_id', |
bsw/jbe@0 | 85 connected_by_that_key = 'member_id', |
bsw/jbe@0 | 86 ref = 'members' |
bsw/jbe@0 | 87 } |
bsw/jbe@0 | 88 |
bsw@3 | 89 Issue:add_reference{ |
bsw@3 | 90 mode = 'mm', |
bsw@3 | 91 to = "Member", |
bsw@3 | 92 this_key = 'id', |
bsw@3 | 93 that_key = 'id', |
bsw@3 | 94 connected_by_table = 'direct_interest_snapshot', |
bsw@3 | 95 connected_by_this_key = 'issue_id', |
bsw@3 | 96 connected_by_that_key = 'member_id', |
bsw@3 | 97 ref = 'interested_members_snapshot' |
bsw@3 | 98 } |
bsw@3 | 99 |
bsw/jbe@6 | 100 Issue:add_reference{ |
bsw/jbe@6 | 101 mode = 'mm', |
bsw/jbe@6 | 102 to = "Member", |
bsw/jbe@6 | 103 this_key = 'id', |
bsw/jbe@6 | 104 that_key = 'id', |
bsw/jbe@6 | 105 connected_by_table = 'direct_voter', |
bsw/jbe@6 | 106 connected_by_this_key = 'issue_id', |
bsw/jbe@6 | 107 connected_by_that_key = 'member_id', |
bsw/jbe@6 | 108 ref = 'direct_voters' |
bsw/jbe@6 | 109 } |
bsw/jbe@6 | 110 |
bsw/jbe@6 | 111 |
bsw/jbe@6 | 112 |
bsw/jbe@0 | 113 function Issue:get_state_name_for_state(value) |
bsw@2 | 114 local state_name_table = { |
bsw@2 | 115 new = _"New", |
bsw@3 | 116 accepted = _"Discussion", |
bsw@2 | 117 frozen = _"Frozen", |
bsw@2 | 118 voting = _"Voting", |
bsw@2 | 119 finished = _"Finished", |
bsw@2 | 120 cancelled = _"Cancelled" |
bsw@2 | 121 } |
bsw@10 | 122 return state_name_table[value] or value or '' |
bsw/jbe@0 | 123 end |
bsw/jbe@0 | 124 |
bsw@2 | 125 function Issue:get_search_selector(search_string) |
bsw/jbe@0 | 126 return self:new_selector() |
bsw/jbe@0 | 127 :join('"initiative"', nil, '"initiative"."issue_id" = "issue"."id"') |
bsw/jbe@6 | 128 :join('"draft"', nil, '"draft"."initiative_id" = "initiative"."id"') |
bsw/jbe@6 | 129 :add_where{ '"initiative"."text_search_data" @@ "text_search_query"(?) OR "draft"."text_search_data" @@ "text_search_query"(?)', search_string, search_string } |
bsw/jbe@6 | 130 :add_group_by('"issue"."id"') |
bsw/jbe@6 | 131 :add_group_by('"issue"."area_id"') |
bsw/jbe@6 | 132 :add_group_by('"issue"."policy_id"') |
bsw/jbe@6 | 133 :add_group_by('"issue"."created"') |
bsw/jbe@6 | 134 :add_group_by('"issue"."accepted"') |
bsw/jbe@6 | 135 :add_group_by('"issue"."half_frozen"') |
bsw/jbe@6 | 136 :add_group_by('"issue"."fully_frozen"') |
bsw/jbe@6 | 137 :add_group_by('"issue"."closed"') |
bsw/jbe@6 | 138 :add_group_by('"issue"."ranks_available"') |
poelzi@140 | 139 :add_group_by('"issue"."cleaned"') |
bsw/jbe@6 | 140 :add_group_by('"issue"."snapshot"') |
bsw/jbe@6 | 141 :add_group_by('"issue"."latest_snapshot_event"') |
bsw/jbe@6 | 142 :add_group_by('"issue"."population"') |
bsw/jbe@6 | 143 :add_group_by('"issue"."vote_now"') |
bsw/jbe@6 | 144 :add_group_by('"issue"."vote_later"') |
bsw/jbe@6 | 145 :add_group_by('"issue"."voter_count"') |
bsw@75 | 146 :add_group_by('"issue"."admission_time"') |
bsw@75 | 147 :add_group_by('"issue"."discussion_time"') |
bsw@75 | 148 :add_group_by('"issue"."verification_time"') |
bsw@75 | 149 :add_group_by('"issue"."voting_time"') |
bsw/jbe@19 | 150 :add_group_by('"_interest"."member_id"') |
bsw/jbe@6 | 151 --:set_distinct() |
bsw/jbe@0 | 152 end |
bsw/jbe@0 | 153 |
bsw@75 | 154 function Issue:modify_selector_for_state(initiatives_selector, state) |
bsw@51 | 155 if state == "new" then |
bsw@75 | 156 initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") |
bsw@51 | 157 elseif state == "accepted" then |
bsw@75 | 158 initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") |
bsw@51 | 159 elseif state == "frozen" then |
bsw@75 | 160 initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL") |
bsw@51 | 161 elseif state == "voting" then |
bsw@75 | 162 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") |
bsw@51 | 163 elseif state == "finished" then |
bsw@75 | 164 initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL") |
bsw@51 | 165 elseif state == "cancelled" then |
bsw@75 | 166 initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL") |
bsw@75 | 167 else |
bsw@75 | 168 error("Invalid state") |
bsw@51 | 169 end |
bsw@51 | 170 end |
bsw@51 | 171 |
bsw/jbe@0 | 172 function Issue.object_get:state() |
bsw/jbe@52 | 173 if self.closed then |
bsw/jbe@52 | 174 if self.fully_frozen then |
bsw/jbe@5 | 175 return "finished" |
bsw/jbe@0 | 176 else |
bsw/jbe@52 | 177 return "cancelled" |
bsw/jbe@0 | 178 end |
bsw/jbe@52 | 179 elseif self.fully_frozen then |
bsw/jbe@52 | 180 return "voting" |
bsw/jbe@52 | 181 elseif self.half_frozen then |
bsw/jbe@52 | 182 return "frozen" |
bsw/jbe@52 | 183 elseif self.accepted then |
bsw/jbe@52 | 184 return "accepted" |
bsw/jbe@0 | 185 else |
bsw/jbe@52 | 186 return "new" |
bsw/jbe@0 | 187 end |
bsw/jbe@52 | 188 |
bsw@2 | 189 end |
bsw@2 | 190 |
bsw@2 | 191 function Issue.object_get:state_name() |
bsw@2 | 192 return Issue:get_state_name_for_state(self.state) |
bsw@2 | 193 end |
bsw@2 | 194 |
bsw@2 | 195 function Issue.object_get:state_time_left() |
bsw@2 | 196 local state = self.state |
bsw@2 | 197 local last_event_time |
bsw@2 | 198 local duration |
bsw@2 | 199 if state == "new" then |
bsw@2 | 200 last_event_time = self.created |
bsw@25 | 201 duration = self.admission_time |
bsw@2 | 202 elseif state == "accepted" then |
bsw@2 | 203 last_event_time = self.accepted |
bsw@25 | 204 duration = self.discussion_time |
bsw@2 | 205 elseif state == "frozen" then |
bsw@2 | 206 last_event_time = self.half_frozen |
bsw@25 | 207 duration = self.verification_time |
bsw@2 | 208 elseif state == "voting" then |
bsw@2 | 209 last_event_time = self.fully_frozen |
bsw@25 | 210 duration = self.voting_time |
bsw@2 | 211 end |
poelzi@125 | 212 return db:query{ "SELECT ?::timestamp + ?::interval - CURRENT_TIMESTAMP(0) as time_left", last_event_time, duration }[1].time_left |
bsw@2 | 213 end |
bsw@2 | 214 |
bsw@2 | 215 function Issue.object_get:next_states() |
bsw@2 | 216 local state = self.state |
bsw@2 | 217 local next_states |
bsw@2 | 218 if state == "new" then |
bsw@2 | 219 next_states = { "accepted", "cancelled" } |
bsw@2 | 220 elseif state == "accepted" then |
bsw@2 | 221 next_states = { "frozen" } |
bsw@2 | 222 elseif state == "frozen" then |
bsw@2 | 223 next_states = { "voting" } |
bsw@2 | 224 elseif state == "voting" then |
bsw@2 | 225 next_states = { "finished" } |
bsw@2 | 226 end |
bsw@2 | 227 return next_states |
bsw@2 | 228 end |
bsw@2 | 229 |
bsw@2 | 230 function Issue.object_get:next_states_names() |
bsw@2 | 231 local next_states = self.next_states |
bsw@2 | 232 if not next_states then |
bsw@2 | 233 return |
bsw@2 | 234 end |
bsw@2 | 235 local state_names = {} |
bsw@2 | 236 for i, state in ipairs(self.next_states) do |
bsw@2 | 237 state_names[#state_names+1] = Issue:get_state_name_for_state(state) |
bsw@2 | 238 end |
bsw@2 | 239 return table.concat(state_names, ", ") |
bsw/jbe@0 | 240 end |