liquid_feedback_frontend

annotate model/issue.lua @ 10:72c5e0ee7c98

Version beta6

Bugfixes:
- Security fix: Every user was able to change the discussion URL of an initiative
- Creation of new issues in areas without default policies is now possible
- Members can now be sorted in different ways
- No error when trying to compare a draft with itself
- Added missing local statement to variable initialization in app/main/delegation/new.lua
- CSS flaw in initiative action bar fixed

New features:
- Possiblity to invite other users to become initiator
- Revokation of initiatives implemented
- Number of suggestions, supporters, etc. is shown on corresponding tabs of initiative view
- Members can now be sorted by account creation (default sorting is "newest first")
- Configuration option to create an automatic discussion link for all issues
- First draft of global timeline feature (not accessible via link yet)
- Custom stylesheet URL for users marked as developers

In area listing the number of closed issues is shown too

Renamed "author" field of initiative to "last author"

Removed wrongly included file app/main/member/_show_thumb.lua.orig in the distribution

Help texts updated
author bsw
date Sun Jan 10 12:00:00 2010 +0100 (2010-01-10)
parents 8d91bccab0bf
children 00d1004545f1
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"')
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