liquid_feedback_frontend

annotate model/issue.lua @ 6:8d91bccab0bf

Version beta2

Possibility to browse voters of a closed issue

Registration with invite code

Email confirmation and password recovery

Download function (for database dumps) added

Critical bug solved, which made it impossible to select your opinion on other peoples suggestions

Catching error, when trying to set an opinion on a suggestion which has been meanwhile deleted

Fixed wrong sorting order for "supporters" or "potential supporters"

Added format info for birthday (Error when entering dates in wrong format is NOT fixed in this release)

Strip space characters from certain fields and ensure they contain at least 3 characters

Showing grade in opinion/list as clear text instead of integer value

More information on initiative is displayed while voting

Colored notification box shown on pages of issues or initiatives which are currently in voting state

Changed default filter for issues to "Open"

Back link on suggestion page

Some optical changes

Removed wrong space character in LICENSE file
author bsw/jbe
date Sat Jan 02 12:00:00 2010 +0100 (2010-01-02)
parents afd9f769c7ae
children 72c5e0ee7c98
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/jbe@0 122 return state_name_table[value] or value
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"')
bsw/jbe@6 139 :add_group_by('"issue"."snapshot"')
bsw/jbe@6 140 :add_group_by('"issue"."latest_snapshot_event"')
bsw/jbe@6 141 :add_group_by('"issue"."population"')
bsw/jbe@6 142 :add_group_by('"issue"."vote_now"')
bsw/jbe@6 143 :add_group_by('"issue"."vote_later"')
bsw/jbe@6 144 :add_group_by('"issue"."voter_count"')
bsw/jbe@6 145 --:set_distinct()
bsw/jbe@0 146 end
bsw/jbe@0 147
bsw/jbe@0 148 function Issue.object_get:state()
bsw/jbe@0 149 if self.accepted then
bsw@3 150 if self.closed then
bsw/jbe@5 151 return "finished"
bsw@3 152 elseif self.fully_frozen then
bsw@3 153 return "voting"
bsw@3 154 elseif self.half_frozen then
bsw@3 155 return "frozen"
bsw/jbe@0 156 else
bsw/jbe@0 157 return "accepted"
bsw/jbe@0 158 end
bsw/jbe@0 159 else
bsw/jbe@0 160 if self.closed then
bsw@2 161 return "cancelled"
bsw/jbe@0 162 else
bsw/jbe@0 163 return "new"
bsw/jbe@0 164 end
bsw/jbe@0 165 end
bsw@2 166 end
bsw@2 167
bsw@2 168 function Issue.object_get:state_name()
bsw@2 169 return Issue:get_state_name_for_state(self.state)
bsw@2 170 end
bsw@2 171
bsw@2 172 function Issue.object_get:state_time_left()
bsw@2 173 local state = self.state
bsw@2 174 local last_event_time
bsw@2 175 local duration
bsw@2 176 if state == "new" then
bsw@2 177 last_event_time = self.created
bsw@2 178 duration = self.policy.admission_time
bsw@2 179 elseif state == "accepted" then
bsw@2 180 last_event_time = self.accepted
bsw@2 181 duration = self.policy.discussion_time
bsw@2 182 elseif state == "frozen" then
bsw@2 183 last_event_time = self.half_frozen
bsw@2 184 duration = self.policy.verification_time
bsw@2 185 elseif state == "voting" then
bsw@2 186 last_event_time = self.fully_frozen
bsw@2 187 duration = self.policy.voting_time
bsw@2 188 end
bsw@2 189 return db:query{ "SELECT ?::timestamp + ?::interval - now() as time_left", last_event_time, duration }[1].time_left
bsw@2 190 end
bsw@2 191
bsw@2 192 function Issue.object_get:next_states()
bsw@2 193 local state = self.state
bsw@2 194 local next_states
bsw@2 195 if state == "new" then
bsw@2 196 next_states = { "accepted", "cancelled" }
bsw@2 197 elseif state == "accepted" then
bsw@2 198 next_states = { "frozen" }
bsw@2 199 elseif state == "frozen" then
bsw@2 200 next_states = { "voting" }
bsw@2 201 elseif state == "voting" then
bsw@2 202 next_states = { "finished" }
bsw@2 203 end
bsw@2 204 return next_states
bsw@2 205 end
bsw@2 206
bsw@2 207 function Issue.object_get:next_states_names()
bsw@2 208 local next_states = self.next_states
bsw@2 209 if not next_states then
bsw@2 210 return
bsw@2 211 end
bsw@2 212 local state_names = {}
bsw@2 213 for i, state in ipairs(self.next_states) do
bsw@2 214 state_names[#state_names+1] = Issue:get_state_name_for_state(state)
bsw@2 215 end
bsw@2 216 return table.concat(state_names, ", ")
bsw/jbe@0 217 end

Impressum / About Us