liquid_feedback_frontend

annotate model/issue.lua @ 159:5d797c6706d5

implement quorum display

show the initiative quorum as a small 1px line in bargraph
allow to update your support on the diff page
better linked title in diff page
show absolute quorum numbers in detail pages of issue and initiative
author Daniel Poelzleithner <poelzi@poelzi.org>
date Sat Oct 09 03:42:48 2010 +0200 (2010-10-09)
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

Impressum / About Us