liquid_feedback_frontend
diff model/issue.lua @ 211:4993b71b383f
First checkin of lf2 (frontend second generation) prototype
author | bsw |
---|---|
date | Wed Mar 02 20:06:26 2011 +0100 (2011-03-02) |
parents | 21ddb78dd09d |
children | 3e4ad069847a |
line diff
1.1 --- a/model/issue.lua Sat Feb 05 20:01:09 2011 +0100 1.2 +++ b/model/issue.lua Wed Mar 02 20:06:26 2011 +0100 1.3 @@ -23,7 +23,8 @@ 1.4 this_key = 'id', 1.5 that_key = 'issue_id', 1.6 ref = 'initiatives', 1.7 - back_ref = 'issue' 1.8 + back_ref = 'issue', 1.9 + default_order = 'initiative.rank, initiative.admitted ISNULL, initiative.admitted DESC, initiative.positive_votes::float / initiative.negative_votes::float DESC, initiative.supporter_count DESC' 1.10 } 1.11 1.12 Issue:add_reference{ 1.13 @@ -85,7 +86,7 @@ 1.14 connected_by_that_key = 'member_id', 1.15 ref = 'members' 1.16 } 1.17 - 1.18 +--[[ 1.19 Issue:add_reference{ 1.20 mode = 'mm', 1.21 to = "Member", 1.22 @@ -96,7 +97,7 @@ 1.23 connected_by_that_key = 'member_id', 1.24 ref = 'interested_members_snapshot' 1.25 } 1.26 - 1.27 +--]] 1.28 Issue:add_reference{ 1.29 mode = 'mm', 1.30 to = "Member", 1.31 @@ -108,6 +109,133 @@ 1.32 ref = 'direct_voters' 1.33 } 1.34 1.35 +Issue:add_reference{ 1.36 + mode = 'mm', 1.37 + to = "Member", 1.38 + this_key = 'id', 1.39 + that_key = 'id', 1.40 + connected_by_table = 'direct_interest_snapshot', 1.41 + connected_by_this_key = 'issue_id', 1.42 + connected_by_that_key = 'member_id', 1.43 + ref = 'interested_members_snapshot', 1.44 + selector_generator = function(list, options) 1.45 + -- build list of issue ids 1.46 + local ids = { sep = ", " } 1.47 + for i, object in ipairs(list) do 1.48 + local id = object.id 1.49 + if id ~= nil then 1.50 + ids[#ids+1] = {"?", id} 1.51 + end 1.52 + end 1.53 + 1.54 + if #ids == 0 then 1.55 + return Member:new_selector():empty_list_mode() 1.56 + end 1.57 + 1.58 + local selector = Member:new_selector() 1.59 + selector:join("direct_interest_snapshot", nil, { "direct_interest_snapshot.member_id = member.id AND direct_interest_snapshot.issue_id IN ($)", ids }) 1.60 + selector:join("issue", nil, "direct_interest_snapshot.issue_id = issue.id AND direct_interest_snapshot.event = issue.latest_snapshot_event") 1.61 + selector:add_order_by('direct_interest_snapshot.weight DESC') 1.62 + return selector 1.63 + end 1.64 +} 1.65 + 1.66 +Issue:add_reference{ 1.67 + mode = '11', 1.68 + to = "DelegatingInterestSnapshot", 1.69 + this_key = 'id', 1.70 + that_key = 'issue_id', 1.71 + ref = 'delegating_interest_snapshot_for_member', 1.72 + back_ref = 'issue', 1.73 + selector_generator = function(list, options) 1.74 + local member_id = assert(options.member_id) 1.75 + 1.76 + -- build list of issue ids 1.77 + local ids = { sep = ", " } 1.78 + for i, object in ipairs(list) do 1.79 + local id = object.id 1.80 + if id ~= nil then 1.81 + ids[#ids+1] = {"?", id} 1.82 + end 1.83 + end 1.84 + 1.85 + if #ids == 0 then 1.86 + return DelegatingInterestSnapshot:new_selector():empty_list_mode() 1.87 + end 1.88 + 1.89 + local selector = DelegatingInterestSnapshot:new_selector() 1.90 + selector:join("issue", nil, "delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.event = issue.latest_snapshot_event") 1.91 + selector:add_where{ 'delegating_interest_snapshot.issue_id IN ($)', ids } 1.92 + selector:add_where{ 'delegating_interest_snapshot.member_id = ?', options.member_id } 1.93 + 1.94 + return selector 1.95 + end 1.96 +} 1.97 + 1.98 +Issue:add_reference{ 1.99 + mode = '11', 1.100 + to = "Interest", 1.101 + this_key = 'id', 1.102 + that_key = 'issue_id', 1.103 + ref = 'interest_for_member', 1.104 + back_ref = 'issue', 1.105 + selector_generator = function(list, options) 1.106 + 1.107 + local member_id = assert(options.member_id) 1.108 + 1.109 + -- build list of issue ids 1.110 + local ids = { sep = ", " } 1.111 + for i, object in ipairs(list) do 1.112 + local id = object.id 1.113 + if id ~= nil then 1.114 + ids[#ids+1] = {"?", id} 1.115 + end 1.116 + end 1.117 + 1.118 + if #ids == 0 then 1.119 + return Interest:new_selector():empty_list_mode() 1.120 + end 1.121 + 1.122 + local selector = Interest:new_selector() 1.123 + selector:add_where{ 'interest.issue_id IN ($)', ids } 1.124 + selector:add_where{ 'interest.member_id = ?', member_id } 1.125 + return selector 1.126 + 1.127 + end 1.128 +} 1.129 + 1.130 +Issue:add_reference{ 1.131 + mode = '1m', 1.132 + to = "Delegation", 1.133 + this_key = 'id', 1.134 + that_key = 'issue_id', 1.135 + ref = 'outgoing_delegations_for_member', 1.136 + back_ref = 'issue', 1.137 + selector_generator = function(list, options) 1.138 + 1.139 + local member_id = assert(options.member_id) 1.140 + 1.141 + -- build list of issue ids 1.142 + local ids = { sep = ", " } 1.143 + for i, object in ipairs(list) do 1.144 + local id = object.id 1.145 + if id ~= nil then 1.146 + ids[#ids+1] = {"?", id} 1.147 + end 1.148 + end 1.149 + 1.150 + if #ids == 0 then 1.151 + return Delegation:new_selector():empty_list_mode() 1.152 + end 1.153 + 1.154 + local selector = Delegation:new_selector() 1.155 + selector:add_where{ 'delegation.issue_id IN ($)', ids } 1.156 + selector:add_where{ 'delegation.truster_id = ?', member_id } 1.157 + return selector 1.158 + 1.159 + end 1.160 +} 1.161 + 1.162 1.163 1.164 function Issue:get_state_name_for_state(value) 1.165 @@ -169,6 +297,33 @@ 1.166 end 1.167 end 1.168 1.169 +function Issue:build_selector(args) 1.170 + local selector = self:new_selector() 1.171 + if args.area_id then 1.172 + selector:add_where{ "issue.area_id = ?", args.area_id } 1.173 + end 1.174 + if args.state == "closed" then 1.175 + selector:add_where("issue.closed NOTNULL") 1.176 + elseif args.state == "voting" then 1.177 + selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") 1.178 + elseif args.state == "frozen" then 1.179 + selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL") 1.180 + elseif args.state == "discussion" then 1.181 + selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") 1.182 + elseif args.state == "new" then 1.183 + selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") 1.184 + end 1.185 + if args.order == "time_left" then 1.186 + selector:add_order_by("issue.closed DESC") 1.187 + elseif args.order == "last_change" then 1.188 + selector:add_order_by("issue.closed DESC") 1.189 + elseif args.order == "interest" then 1.190 + selector:add_order_by("issue.population DESC") 1.191 + end 1.192 + 1.193 + return selector 1.194 +end 1.195 + 1.196 function Issue.object_get:state() 1.197 if self.closed then 1.198 if self.fully_frozen then