liquid_feedback_frontend

annotate model/initiative.lua @ 558:18e8de7a2b6a

Show notifications on start page as ulli list with links instead of tabs
author bsw
date Tue Jun 19 21:20:46 2012 +0200 (2012-06-19)
parents c1dc3b14a4f3
children 701a5cf6b067
rev   line source
bsw/jbe@0 1 Initiative = mondelefant.new_class()
bsw/jbe@0 2 Initiative.table = 'initiative'
bsw/jbe@0 3
bsw/jbe@0 4 Initiative:add_reference{
bsw/jbe@0 5 mode = 'm1',
bsw/jbe@0 6 to = "Issue",
bsw/jbe@0 7 this_key = 'issue_id',
bsw/jbe@0 8 that_key = 'id',
bsw/jbe@0 9 ref = 'issue',
bsw/jbe@0 10 }
bsw/jbe@0 11
bsw/jbe@0 12 Initiative:add_reference{
bsw/jbe@0 13 mode = '1m',
bsw/jbe@0 14 to = "Draft",
bsw/jbe@0 15 this_key = 'id',
bsw/jbe@0 16 that_key = 'initiative_id',
bsw/jbe@0 17 ref = 'drafts',
bsw/jbe@0 18 back_ref = 'initiative',
bsw/jbe@19 19 default_order = '"id" DESC'
bsw/jbe@0 20 }
bsw/jbe@0 21
bsw/jbe@0 22 Initiative:add_reference{
bsw/jbe@0 23 mode = '1m',
bsw/jbe@0 24 to = "Suggestion",
bsw/jbe@0 25 this_key = 'id',
bsw/jbe@0 26 that_key = 'initiative_id',
bsw/jbe@0 27 ref = 'suggestions',
bsw/jbe@0 28 back_ref = 'initiative',
bsw/jbe@0 29 }
bsw/jbe@0 30
bsw/jbe@0 31 Initiative:add_reference{
bsw/jbe@0 32 mode = '1m',
bsw/jbe@0 33 to = "Initiator",
bsw/jbe@0 34 this_key = 'id',
bsw/jbe@0 35 that_key = 'initiative_id',
bsw/jbe@0 36 ref = 'initiators',
bsw@10 37 back_ref = 'initiative'
bsw/jbe@0 38 }
bsw/jbe@0 39
bsw/jbe@0 40 Initiative:add_reference{
bsw/jbe@0 41 mode = '1m',
bsw/jbe@0 42 to = "Supporter",
bsw/jbe@0 43 this_key = 'id',
bsw/jbe@0 44 that_key = 'initiative_id',
bsw/jbe@0 45 ref = 'supporters',
bsw/jbe@0 46 back_ref = 'initiative',
bsw/jbe@0 47 default_order = '"id"'
bsw/jbe@0 48 }
bsw/jbe@0 49
bsw/jbe@0 50 Initiative:add_reference{
bsw/jbe@0 51 mode = '1m',
bsw/jbe@0 52 to = "Opinion",
bsw/jbe@0 53 this_key = 'id',
bsw/jbe@0 54 that_key = 'initiative_id',
bsw/jbe@0 55 ref = 'opinions',
bsw/jbe@0 56 back_ref = 'initiative',
bsw/jbe@0 57 default_order = '"id"'
bsw/jbe@0 58 }
bsw/jbe@0 59
bsw/jbe@0 60 Initiative:add_reference{
bsw/jbe@0 61 mode = '1m',
bsw/jbe@0 62 to = "Vote",
bsw/jbe@0 63 this_key = 'id',
bsw/jbe@0 64 that_key = 'initiative_id',
bsw/jbe@0 65 ref = 'votes',
bsw/jbe@0 66 back_ref = 'initiative',
bsw/jbe@0 67 default_order = '"member_id"'
bsw/jbe@0 68 }
bsw/jbe@0 69
bsw/jbe@0 70 Initiative:add_reference{
bsw@10 71 mode = 'm1',
bsw@10 72 to = "Initiative",
bsw@10 73 this_key = 'suggested_initiative_id',
bsw@10 74 that_key = 'id',
bsw@10 75 ref = 'suggested_initiative',
bsw@10 76 }
bsw@10 77
bsw@10 78 Initiative: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 = '"initiator"',
bsw/jbe@0 84 connected_by_this_key = 'initiative_id',
bsw/jbe@0 85 connected_by_that_key = 'member_id',
bsw/jbe@0 86 ref = 'initiating_members'
bsw/jbe@0 87 }
bsw/jbe@0 88
bsw/jbe@0 89 Initiative:add_reference{
bsw/jbe@0 90 mode = 'mm',
bsw/jbe@0 91 to = "Member",
bsw/jbe@0 92 this_key = 'id',
bsw/jbe@0 93 that_key = 'id',
bsw/jbe@0 94 connected_by_table = '"supporter"',
bsw/jbe@0 95 connected_by_this_key = 'initiative_id',
bsw/jbe@0 96 connected_by_that_key = 'member_id',
bsw/jbe@0 97 ref = 'supporting_members'
bsw/jbe@0 98 }
bsw/jbe@0 99
bsw@3 100 Initiative:add_reference{
bsw@3 101 mode = 'mm',
bsw@3 102 to = "Member",
bsw@3 103 this_key = 'id',
bsw@3 104 that_key = 'id',
bsw@3 105 connected_by_table = 'direct_supporter_snapshot',
bsw@3 106 connected_by_this_key = 'initiative_id',
bsw@3 107 connected_by_that_key = 'member_id',
bsw@3 108 ref = 'supporting_members_snapshot'
bsw@3 109 }
bsw@3 110
bsw@551 111 Initiative:add_reference{
bsw@551 112 mode = "11",
bsw@551 113 to = mondelefant.class_prototype,
bsw@551 114 this_key = "id",
bsw@551 115 that_key = "initiative_id",
bsw@551 116 ref = "member_info",
bsw@551 117 back_ref = "initiative",
bsw@551 118 selector_generator = function(list, options)
bsw@551 119 assert(options.member_id, "member_id mandatory for member_info")
bsw@551 120 local ids = { sep = ", " }
bsw@551 121 local issue_ids = { sep = ", " }
bsw@551 122 for i, object in ipairs(list) do
bsw@551 123 local id = object.id
bsw@551 124 if id ~= nil then
bsw@551 125 ids[#ids+1] = {"?", id}
bsw@551 126 issue_ids[#issue_ids+1] = { "?", object.issue_id }
bsw@551 127 end
bsw@551 128 end
bsw@551 129
bsw@551 130 local sub_selector = Issue:get_db_conn():new_selector()
bsw@551 131 if #ids == 0 then
bsw@551 132 return sub_selector:empty_list_mode()
bsw@551 133 end
bsw@551 134 sub_selector:from("issue")
bsw@551 135 sub_selector:add_field("issue.id", "issue_id")
bsw@551 136 sub_selector:add_field{ '(delegation_info(?, null, null, issue.id, ?)).*', options.member_id, options.trustee_id }
bsw@551 137 sub_selector:add_where{ 'issue.id IN ($)', issue_ids }
bsw@551 138
bsw@551 139 local selector = Initiative:get_db_conn():new_selector()
bsw@551 140 selector:add_from("initiative")
bsw@551 141 selector:add_field("initiative.id", "initiative_id")
bsw@551 142 selector:join("issue", nil, "issue.id = initiative.issue_id")
bsw@551 143 selector:join(sub_selector, "delegation_info", "delegation_info.issue_id = issue.id")
bsw@551 144 selector:add_field("delegation_info.*")
bsw@551 145
bsw@551 146 selector:left_join("supporter", nil, "supporter.initiative_id = initiative.id AND supporter.member_id = delegation_info.participating_member_id")
bsw@551 147
bsw@551 148 selector:left_join("delegating_interest_snapshot", "delegating_interest_s", { "delegating_interest_s.event = issue.latest_snapshot_event AND delegating_interest_s.issue_id = issue.id AND delegating_interest_s.member_id = ?", options.member_id })
bsw@551 149
bsw@551 150 selector:left_join("direct_supporter_snapshot", "supporter_s", { "supporter_s.event = issue.latest_snapshot_event AND supporter_s.initiative_id = initiative.id AND (supporter_s.member_id = ? OR supporter_s.member_id = delegating_interest_s.delegate_member_ids[array_upper(delegating_interest_s.delegate_member_ids, 1)])", options.member_id })
bsw@551 151
bsw@551 152 selector:add_field("CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN supporter.member_id NOTNULL ELSE supporter_s.member_id NOTNULL END", "supported")
bsw@551 153 selector:add_field({ "CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN delegation_info.own_participation AND supporter.member_id NOTNULL ELSE supporter_s.member_id = ? END", options.member_id }, "directly_supported")
bsw@551 154
bsw@551 155 selector:add_field("CASE WHEN issue.fully_frozen ISNULL AND issue.closed ISNULL THEN supporter.member_id NOTNULL AND NOT EXISTS(SELECT 1 FROM critical_opinion WHERE critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = delegation_info.participating_member_id) ELSE supporter_s.satisfied NOTNULL END", "satisfied")
bsw@551 156
bsw@551 157
bsw@551 158 --selector:add_field("", "informed")
bsw@551 159 selector:left_join("initiator", nil, { "initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted", options.member_id })
bsw@551 160 selector:add_field("initiator.member_id NOTNULL", "initiated")
bsw@551 161
bsw@551 162 return selector
bsw@551 163 end
bsw@551 164 }
bsw@551 165
bsw@551 166 function Initiative.list:load_everything_for_member_id(member_id)
bsw@551 167 if member_id then
bsw@551 168 self:load("member_info", { member_id = member_id })
bsw@551 169 end
bsw@551 170 end
bsw@551 171
bsw@551 172 function Initiative.object:load_everything_for_member_id(member_id)
bsw@551 173 if member_id then
bsw@551 174 self:load("member_info", { member_id = member_id })
bsw@551 175 end
bsw@551 176 end
bsw@551 177
bsw@551 178
bsw@551 179
bsw/jbe@6 180
bsw@2 181 function Initiative:get_search_selector(search_string)
bsw/jbe@0 182 return self:new_selector()
bsw/jbe@6 183 :join("draft", nil, "draft.initiative_id = initiative.id")
bsw@2 184 :add_field( {'"highlight"("initiative"."name", ?)', search_string }, "name_highlighted")
bsw/jbe@6 185 :add_where{ '"initiative"."text_search_data" @@ "text_search_query"(?) OR "draft"."text_search_data" @@ "text_search_query"(?)', search_string, search_string }
bsw/jbe@6 186 :add_group_by('"initiative"."id"')
bsw/jbe@6 187 :add_group_by('"initiative"."issue_id"')
bsw/jbe@6 188 :add_group_by('"initiative"."name"')
bsw/jbe@6 189 :add_group_by('"initiative"."discussion_url"')
bsw/jbe@6 190 :add_group_by('"initiative"."created"')
bsw/jbe@6 191 :add_group_by('"initiative"."revoked"')
bsw@481 192 :add_group_by('"initiative"."revoked_by_member_id"')
bsw/jbe@6 193 :add_group_by('"initiative"."admitted"')
bsw/jbe@6 194 :add_group_by('"initiative"."supporter_count"')
bsw/jbe@6 195 :add_group_by('"initiative"."informed_supporter_count"')
bsw/jbe@6 196 :add_group_by('"initiative"."satisfied_supporter_count"')
bsw/jbe@6 197 :add_group_by('"initiative"."satisfied_informed_supporter_count"')
bsw/jbe@6 198 :add_group_by('"initiative"."positive_votes"')
bsw/jbe@6 199 :add_group_by('"initiative"."negative_votes"')
bsw@482 200 :add_group_by('"initiative"."direct_majority"')
bsw@482 201 :add_group_by('"initiative"."indirect_majority"')
bsw@482 202 :add_group_by('"initiative"."schulze_rank"')
bsw@482 203 :add_group_by('"initiative"."better_than_status_quo"')
bsw@482 204 :add_group_by('"initiative"."worse_than_status_quo"')
bsw@482 205 :add_group_by('"initiative"."reverse_beat_path"')
bsw@482 206 :add_group_by('"initiative"."multistage_majority"')
bsw@482 207 :add_group_by('"initiative"."eligible"')
bsw@482 208 :add_group_by('"initiative"."winner"')
bsw/jbe@6 209 :add_group_by('"initiative"."rank"')
bsw/jbe@19 210 :add_group_by('"initiative"."suggested_initiative_id"')
bsw/jbe@6 211 :add_group_by('"initiative"."text_search_data"')
bsw/jbe@6 212 :add_group_by('"issue"."population"')
bsw/jbe@19 213 :add_group_by("_initiator.member_id")
bsw/jbe@19 214 :add_group_by("_supporter.member_id")
bsw@361 215 :add_group_by("_direct_supporter_snapshot.member_id")
bsw/jbe@0 216 end
bsw/jbe@0 217
bsw@558 218 function Initiative:selector_for_updated_drafts(member_id)
bsw@558 219 return Initiative:new_selector()
bsw@558 220 :join("issue", "_issue_state", "_issue_state.id = initiative.issue_id AND _issue_state.closed ISNULL AND _issue_state.fully_frozen ISNULL")
bsw@558 221 :join("current_draft", "_current_draft", "_current_draft.initiative_id = initiative.id")
bsw@558 222 :join("supporter", "supporter", { "supporter.member_id = ? AND supporter.initiative_id = initiative.id AND supporter.draft_id < _current_draft.id", member_id })
bsw@558 223 :add_where("initiative.revoked ISNULL")
bsw@558 224 end
bsw@2 225
bsw@2 226
bsw/jbe@0 227 function Initiative.object_get:current_draft()
bsw/jbe@0 228 return Draft:new_selector()
bsw/jbe@0 229 :add_where{ '"initiative_id" = ?', self.id }
bsw/jbe@0 230 :add_order_by('"id" DESC')
bsw/jbe@0 231 :single_object_mode()
bsw/jbe@0 232 :exec()
bsw/jbe@0 233 end
bsw/jbe@0 234
bsw/jbe@0 235 function Initiative.object_get:shortened_name()
bsw/jbe@0 236 local name = self.name
bsw/jbe@0 237 if #name > 100 then
bsw/jbe@0 238 name = name:sub(1,100) .. "..."
bsw/jbe@0 239 end
bsw/jbe@0 240 return name
bsw/jbe@0 241 end
bsw/jbe@52 242
bsw/jbe@52 243 function Initiative.object_get:initiator_names()
bsw/jbe@52 244 local members = Member:new_selector()
bsw/jbe@52 245 :join("initiator", nil, "initiator.member_id = member.id")
bsw/jbe@52 246 :add_where{ "initiator.initiative_id = ?", self.id }
bsw/jbe@52 247 :add_where{ "initiator.accepted" }
bsw/jbe@52 248 :exec()
bsw/jbe@52 249
bsw/jbe@52 250 local member_names = {}
bsw/jbe@52 251 for i, member in ipairs(members) do
bsw/jbe@52 252 member_names[#member_names+1] = member.name
bsw/jbe@52 253 end
bsw/jbe@52 254 return member_names
bsw/jbe@52 255 end
bsw/jbe@52 256

Impressum / About Us