# HG changeset patch
# User bsw
# Date 1345154603 -7200
# Node ID 82f13fbbc05aa7c03e14da06a6bbfeac32b3ebb3
# Parent 7102c66b05f38235fd5a9064229f063eeff94d84
Added issue filters to event list, added voted filter
diff -r 7102c66b05f3 -r 82f13fbbc05a app/main/event/_list.lua
--- a/app/main/event/_list.lua Sun Aug 12 22:14:06 2012 +0200
+++ b/app/main/event/_list.lua Fri Aug 17 00:03:23 2012 +0200
@@ -1,4 +1,4 @@
-local global = param.get("global", atom.boolean)
+--local global = param.get("global", atom.boolean)
local for_member = param.get("for_member", "table")
local for_unit = param.get("for_unit", "table")
local for_area = param.get("for_area", "table")
@@ -20,8 +20,8 @@
event_selector:add_where{ "area.unit_id = ?", for_unit.id }
elseif for_area then
event_selector:add_where{ "issue.area_id = ?", for_area.id }
-elseif not global then
- event_selector:join("event_seen_by_member", nil, { "event_seen_by_member.id = event.id AND event_seen_by_member.seen_by_member_id = ?", app.session.member_id })
+--elseif not global then
+-- event_selector:join("event_seen_by_member", nil, { "event_seen_by_member.id = event.id AND event_seen_by_member.seen_by_member_id = ?", app.session.member_id })
end
if app.session.member_id then
@@ -34,176 +34,192 @@
:add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length")
end
-local last_event_id
+local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = {
+ for_events = true,
+ member = app.session.member, for_member = for_member, state = for_state, for_unit = for_unit and true or false, for_area = for_area and true or false
+}}
-local events = event_selector:exec()
+filters.opened = true
+filters.selector = event_selector
+
+filters.content = function()
+
-local issues = events:load("issue")
-issues:load_everything_for_member_id(app.session.member_id)
+ local last_event_id
+
+ local events = event_selector:exec()
-events:load("initiative")
-events:load("suggestion")
-events:load("member")
+ local issues = events:load("issue")
+ issues:load_everything_for_member_id(app.session.member_id)
+
+ events:load("initiative")
+ events:load("suggestion")
+ events:load("member")
-ui.container{ attr = { class = "issues events" }, content = function()
+ ui.container{ attr = { class = "issues events" }, content = function()
- local last_event_date
- for i, event in ipairs(events) do
- last_event_id = event.id
+ local last_event_date
+ for i, event in ipairs(events) do
+ last_event_id = event.id
- ui.container{ attr = { class = "event_info" }, content = function()
- local event_name = event.event_name
- local event_image
- if event.event == "issue_state_changed" then
- if event.state == "discussion" then
- event_name = _"Discussion started"
- event_image = "comments.png"
- elseif event.state == "verification" then
- event_name = _"Verification started"
- event_image = "lock.png"
- elseif event.state == "voting" then
- event_name = _"Voting started"
- event_image = "email_open.png"
- elseif event.state == "finished_with_winner" then
- event_name = event.state_name
- event_image = "award_star_gold_2.png"
- elseif event.state == "finished_without_winner" then
- event_name = event.state_name
- event_image = "cross.png"
- else
- event_name = event.state_name
- end
- if event_image then
- ui.image{ static = "icons/16/" .. event_image }
- slot.put(" ")
+ ui.container{ attr = { class = "event_info" }, content = function()
+ local event_name = event.event_name
+ local event_image
+ if event.event == "issue_state_changed" then
+ if event.state == "discussion" then
+ event_name = _"Discussion started"
+ event_image = "comments.png"
+ elseif event.state == "verification" then
+ event_name = _"Verification started"
+ event_image = "lock.png"
+ elseif event.state == "voting" then
+ event_name = _"Voting started"
+ event_image = "email_open.png"
+ elseif event.state == "finished_with_winner" then
+ event_name = event.state_name
+ event_image = "award_star_gold_2.png"
+ elseif event.state == "finished_without_winner" then
+ event_name = event.state_name
+ event_image = "cross.png"
+ else
+ event_name = event.state_name
+ end
+ if event_image then
+ ui.image{ static = "icons/16/" .. event_image }
+ slot.put(" ")
+ end
end
- end
- local days_ago_text
- if event.time_ago == 0 then
- days_ago_text = _("Today at #{time}", { time = format.time(event.occurrence) })
- elseif event.time_ago == 1 then
- days_ago_text = _("Yesterday at #{time}", { time = format.time(event.occurrence) })
- else
- days_ago_text = _("#{date} at #{time}", { date = format.date(event.occurrence.date), time = format.time(event.occurrence) })
- end
- ui.tag{ attr = { class = "event_name" }, content = event_name }
- slot.put("
")
- ui.tag{ content = days_ago_text }
---[[ if event.time_ago > 1 then
- slot.put("
(")
- ui.tag{ content = _("#{count} days ago", { count = event.time_ago }) }
- slot.put(")")
- end
- --]]
- if app.session:has_access("authors_pseudonymous") and event.member_id then
+ local days_ago_text
+ if event.time_ago == 0 then
+ days_ago_text = _("Today at #{time}", { time = format.time(event.occurrence) })
+ elseif event.time_ago == 1 then
+ days_ago_text = _("Yesterday at #{time}", { time = format.time(event.occurrence) })
+ else
+ days_ago_text = _("#{date} at #{time}", { date = format.date(event.occurrence.date), time = format.time(event.occurrence) })
+ end
+ ui.tag{ attr = { class = "event_name" }, content = event_name }
slot.put("
")
- slot.put("
")
- if app.session.member_id then
+ ui.tag{ content = days_ago_text }
+ --[[ if event.time_ago > 1 then
+ slot.put("
(")
+ ui.tag{ content = _("#{count} days ago", { count = event.time_ago }) }
+ slot.put(")")
+ end
+ --]]
+ if app.session:has_access("authors_pseudonymous") and event.member_id then
+ slot.put("
")
+ slot.put("
")
+ if app.session.member_id then
+ ui.link{
+ content = function()
+ execute.view{
+ module = "member_image",
+ view = "_show",
+ params = {
+ member = event.member,
+ image_type = "avatar",
+ show_dummy = true,
+ class = "micro_avatar",
+ popup_text = text
+ }
+ }
+ end,
+ module = "member", view = "show", id = event.member_id
+ }
+ slot.put(" ")
+ end
ui.link{
- content = function()
- execute.view{
- module = "member_image",
- view = "_show",
- params = {
- member = event.member,
- image_type = "avatar",
- show_dummy = true,
- class = "micro_avatar",
- popup_text = text
- }
- }
- end,
+ text = event.member.name,
module = "member", view = "show", id = event.member_id
}
- slot.put(" ")
- end
- ui.link{
- text = event.member.name,
- module = "member", view = "show", id = event.member_id
- }
- end
- end }
-
- ui.container{ attr = { class = "issue" }, content = function()
-
- execute.view{ module = "delegation", view = "_info", params = { issue = event.issue } }
-
- ui.container{ attr = { class = "content" }, content = function()
- ui.link{
- module = "unit", view = "show", id = event.issue.area.unit_id,
- attr = { class = "unit_link" }, text = event.issue.area.unit.name
- }
- slot.put(" ")
- ui.link{
- module = "area", view = "show", id = event.issue.area_id,
- attr = { class = "area_link" }, text = event.issue.area.name
- }
- end }
-
- ui.container{ attr = { class = "title" }, content = function()
- ui.link{
- attr = { class = "issue_id" },
- text = _("#{policy} ##{id}", { policy = event.issue.policy.name, id = event.issue_id }),
- module = "issue",
- view = "show",
- id = event.issue_id
- }
- end }
-
- ui.container{ attr = { class = "initiative_list" }, content = function()
- if not event.initiative_id then
- local initiatives_selector = Initiative:new_selector()
- :add_where{ "initiative.issue_id = ?", event.issue_id }
- :add_order_by("initiative.rank, initiative.supporter_count DESC")
- execute.view{ module = "initiative", view = "_list", params = {
- issue = event.issue,
- initiatives_selector = initiatives_selector,
- no_sort = true,
- limit = 5
- } }
- else
- local initiatives_selector = Initiative:new_selector()
- :add_where{ "initiative.id = ?", event.initiative_id }
- execute.view{ module = "initiative", view = "_list", params = {
- initiatives_selector = initiatives_selector,
- no_sort = true,
- hide_more_initiatives = true
- } }
end
end }
- ui.container{ attr = { class = "content suggestion" }, content = function()
- if event.suggestion_id then
+ ui.container{ attr = { class = "issue" }, content = function()
+
+ execute.view{ module = "delegation", view = "_info", params = { issue = event.issue } }
+
+ ui.container{ attr = { class = "content" }, content = function()
+ ui.link{
+ module = "unit", view = "show", id = event.issue.area.unit_id,
+ attr = { class = "unit_link" }, text = event.issue.area.unit.name
+ }
+ slot.put(" ")
+ ui.link{
+ module = "area", view = "show", id = event.issue.area_id,
+ attr = { class = "area_link" }, text = event.issue.area.name
+ }
+ end }
+
+ ui.container{ attr = { class = "title" }, content = function()
ui.link{
- text = event.suggestion.name,
- module = "suggestion", view = "show", id = event.suggestion_id
+ attr = { class = "issue_id" },
+ text = _("#{policy} ##{id}", { policy = event.issue.policy.name, id = event.issue_id }),
+ module = "issue",
+ view = "show",
+ id = event.issue_id
}
- end
+ end }
+
+ ui.container{ attr = { class = "initiative_list" }, content = function()
+ if not event.initiative_id then
+ local initiatives_selector = Initiative:new_selector()
+ :add_where{ "initiative.issue_id = ?", event.issue_id }
+ :add_order_by("initiative.rank, initiative.supporter_count DESC")
+ execute.view{ module = "initiative", view = "_list", params = {
+ issue = event.issue,
+ initiatives_selector = initiatives_selector,
+ no_sort = true,
+ limit = 5
+ } }
+ else
+ local initiatives_selector = Initiative:new_selector()
+ :add_where{ "initiative.id = ?", event.initiative_id }
+ execute.view{ module = "initiative", view = "_list", params = {
+ initiatives_selector = initiatives_selector,
+ no_sort = true,
+ hide_more_initiatives = true
+ } }
+ end
+ end }
+
+ ui.container{ attr = { class = "content suggestion" }, content = function()
+ if event.suggestion_id then
+ ui.link{
+ text = event.suggestion.name,
+ module = "suggestion", view = "show", id = event.suggestion_id
+ }
+ end
+ end }
end }
- end }
+ end
+
+ end }
+
+ slot.put("
")
+
+ if #events > 0 then
+ ui.link{
+ attr = { class = "more_events_links" },
+ text = _"Show older events",
+ module = request.get_module(),
+ view = request.get_view(),
+ id = for_unit and for_unit.id or for_area and for_area.id,
+ params = {
+ tab = param.get_all_cgi()["tab"],
+ events = param.get_all_cgi()["events"],
+ event_max_id = last_event_id
+ }
+ }
+ else
+ ui.tag{ content = _"No more events available" }
end
-end }
-
-slot.put("
")
+ slot.put("
")
+ slot.put("
")
-if #events > 0 then
- ui.link{
- attr = { class = "more_events_links" },
- text = _"Show older events",
- module = request.get_module(),
- view = request.get_view(),
- id = for_unit and for_unit.id or for_area and for_area.id,
- params = {
- tab = param.get_all_cgi()["tab"],
- events = param.get_all_cgi()["events"],
- event_max_id = last_event_id
- }
- }
-else
- ui.tag{ content = _"No more events available" }
end
-slot.put("
")
-slot.put("
")
+
+ui.filters(filters)
\ No newline at end of file
diff -r 7102c66b05f3 -r 82f13fbbc05a app/main/index/_index_member.lua
--- a/app/main/index/_index_member.lua Sun Aug 12 22:14:06 2012 +0200
+++ b/app/main/index/_index_member.lua Fri Aug 17 00:03:23 2012 +0200
@@ -16,8 +16,8 @@
tabs[#tabs+1] = {
name = "timeline",
label = _"Latest events",
- module = "member",
- view = "_event_list",
+ module = "event",
+ view = "_list",
params = { }
}
diff -r 7102c66b05f3 -r 82f13fbbc05a app/main/issue/_filters.lua
--- a/app/main/issue/_filters.lua Sun Aug 12 22:14:06 2012 +0200
+++ b/app/main/issue/_filters.lua Fri Aug 17 00:03:23 2012 +0200
@@ -4,6 +4,8 @@
local for_unit = param.get("for_unit", atom.boolean)
local for_area = param.get("for_area", atom.boolean)
+local for_events = param.get("for_events", atom.boolean)
+
local filters = {}
local filter = { name = "filter" }
@@ -21,7 +23,11 @@
name = "open",
label = _"Open",
selector_modifier = function(selector)
- selector:add_where("issue.closed ISNULL")
+ if for_events then
+ selector:add_where("event.state in ('admission', 'discussion', 'verification', 'voting')")
+ else
+ selector:add_where("issue.closed ISNULL")
+ end
end
}
end
@@ -31,28 +37,44 @@
name = "new",
label = _"New",
selector_modifier = function(selector)
- selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
+ if for_events then
+ selector:add_where("event.state = 'admission'")
+ else
+ selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
+ end
end
}
filter[#filter+1] = {
name = "accepted",
label = _"Discussion",
selector_modifier = function(selector)
- selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
+ if for_events then
+ selector:add_where("event.state = 'discussion'")
+ else
+ selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
+ end
end
}
filter[#filter+1] = {
name = "half_frozen",
label = _"Frozen",
selector_modifier = function(selector)
- selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL")
+ if for_events then
+ selector:add_where("event.state = 'verification'")
+ else
+ selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL")
+ end
end
}
filter[#filter+1] = {
name = "frozen",
label = _"Voting",
selector_modifier = function(selector)
- selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
+ if for_events then
+ selector:add_where("event.state = 'voting'")
+ else
+ selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
+ end
filter_voting = true
end
}
@@ -63,14 +85,23 @@
name = "finished",
label = _"Finished",
selector_modifier = function(selector)
- selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL")
+ if for_events then
+ selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')")
+ else
+ selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL")
+ end
end
}
filter[#filter+1] = {
name = "cancelled",
label = _"Cancelled",
selector_modifier = function(selector)
- selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL")
+
+ if for_events then
+ selector:add_where("event.state IN ('canceled_revoked_before_accepted', 'canceled_issue_not_accepted', 'canceled_after_revocation_during_discussion', 'canceled_after_revocation_during_verification')")
+ else
+ selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL")
+ end
end
}
end
@@ -86,28 +117,44 @@
name = "finished",
label = _"Finished",
selector_modifier = function(selector)
- selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')")
+ if for_events then
+ selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')")
+ else
+ selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')")
+ end
end
}
filter[#filter+1] = {
name = "finished_with_winner",
label = _"with winner",
selector_modifier = function(selector)
- selector:add_where("issue.state = 'finished_with_winner'")
+ if for_events then
+ selector:add_where("event.state = 'finished_with_winner'")
+ else
+ selector:add_where("issue.state = 'finished_with_winner'")
+ end
end
}
filter[#filter+1] = {
name = "finished_without_winner",
label = _"without winner",
selector_modifier = function(selector)
- selector:add_where("issue.state = 'finished_without_winner'")
+ if for_events then
+ selector:add_where("event.state = 'finished_without_winner'")
+ else
+ selector:add_where("issue.state = 'finished_without_winner'")
+ end
end
}
filter[#filter+1] = {
name = "cancelled",
label = _"Cancelled",
selector_modifier = function(selector)
- selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')")
+ if for_events then
+ selector:add_where("event.state NOT IN ('finished_with_winner', 'finished_without_winner')")
+ else
+ selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')")
+ end
end
}
end
@@ -165,6 +212,13 @@
selector_modifier = function() end
}
filter[#filter+1] = {
+ name = "initiated",
+ label = _"Initiated",
+ selector_modifier = function(selector)
+ selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted WHERE initiative.issue_id = issue.id)", member.id })
+ end
+ }
+ filter[#filter+1] = {
name = "supported",
label = _"Supported",
selector_modifier = function() end
@@ -174,13 +228,13 @@
label = _"Potentially supported",
selector_modifier = function() end
}
- filter[#filter+1] = {
- name = "initiated",
- label = _"Initiated",
- selector_modifier = function(selector)
- selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted WHERE initiative.issue_id = issue.id)", member.id })
- end
- }
+ if state == 'closed' or for_events then
+ filter[#filter+1] = {
+ name = "voted",
+ label = _"Voted",
+ selector_modifier = function() end
+ }
+ end
filters[#filters+1] = filter
end
@@ -192,7 +246,7 @@
local filter_interest = param.get_all_cgi()["filter_interest"]
if filter_interest ~= "any" and filter_interest ~= nil and (
- filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported"
+ filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" or filter_interest == 'voted'
) then
local function add_default_joins(selector)
@@ -225,6 +279,9 @@
"EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND NOT direct_supporter_snapshot.satisfied) " ..
"END OR EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND NOT direct_supporter_snapshot.satisfied)", member.id, member.id, member.id })
+ elseif filter_interest == "voted" then
+ selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) OR EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id, member.id })
+
end
end
@@ -251,6 +308,8 @@
"ELSE " ..
"EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND NOT direct_supporter_snapshot.satisfied) " ..
"END", member.id, member.id })
+ elseif filter_interest == "voted" then
+ selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) ", member.id })
end
end
@@ -269,6 +328,8 @@
elseif filter_interest == "potentially_supported" then
selector:add_where({
"EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND NOT direct_supporter_snapshot.satisfied)", member.id })
+ elseif filter_interest == "voted" then
+ selector:add_where({ "EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id })
end
end