bsw@75: local id = param.get("id") bsw@51: local min_id = param.get("min_id") bsw@51: local max_id = param.get("max_id") bsw@51: local area_id = param.get("area_id", atom.integer) bsw@51: local issue_id = param.get("issue_id", atom.integer) bsw@51: local policy_id = param.get("policy_id", atom.integer) bsw@51: local state = param.get("state") bsw@51: local agreed = param.get("agreed") bsw@51: local rank = param.get("rank") bsw@95: --local search = param.get("search") bsw@95: --local search_context = param.get("search_context") or "full" bsw@51: local limit = param.get("limit", atom.integer) bsw@51: local order = param.get("order") bsw@95: local render_draft = param.get("render_draft") bsw@95: bsw@95: if render_draft and render_draft ~= "html" then bsw@95: error("unsupported render target, only 'html' is supported right now") bsw@95: end bsw@51: bsw@51: local initiatives_selector = Initiative:new_selector() bsw@75: :join("issue", nil, "issue.id = initiative.issue_id") bsw@51: :join("area", nil, "area.id = issue.area_id") bsw@51: :join("policy", nil, "policy.id = issue.policy_id") bsw@51: bsw@51: if id then bsw@51: initiatives_selector:add_where{"initiative.id = ?", id} bsw@51: end bsw@51: bsw@51: if min_id then bsw@51: initiatives_selector:add_where{"initiative.id >= ?", min_id} bsw@51: end bsw@51: bsw@51: if max_id then bsw@51: initiatives_selector:add_where{"initiative.id <= ?", max_id} bsw@51: end bsw@51: bsw@51: if area_id then bsw@51: initiatives_selector:add_where{"area.id = ?", area_id} bsw@51: end bsw@51: bsw@51: if issue_id then bsw@51: initiatives_selector:add_where{"issue.id = ?", issue_id} bsw@51: end bsw@51: bsw@51: if policy_id then bsw@51: initiatives_selector:add_where{"policy.id = ?", policy_id} bsw@51: end bsw@51: bsw@51: if state then bsw@75: Issue:modify_selector_for_state(initiatives_selector, state) bsw@51: end bsw@51: bsw@51: if agreed then bsw@51: initiatives_selector:add_where("initiative.agreed") bsw@51: end bsw@51: bsw@51: if rank then bsw@51: initiatives_selector:add_where{ "initiative.rank = ?", rank } bsw@51: end bsw@51: bsw@95: --[[ bsw@51: if search then bsw@51: if search_context == "full" then bsw@51: elseif search_context == "title" then bsw@51: end bsw@51: end bsw@95: --]] bsw@51: bsw@51: if order == "supporter_count" then bsw@51: initiatives_selector:add_order_by("initiative.supporter_count") bsw@51: end bsw@51: bsw@81: if order == "id_desc" then bsw@81: initiatives_selector:add_order_by("initiative.id DESC") bsw@81: else bsw@81: initiatives_selector:add_order_by("initiative.id") bsw@81: end bsw@51: bsw@51: if limit then bsw@51: initiatives_selector:limit(limit) bsw@51: end bsw@51: bsw@51: local api_engine = param.get("api_engine") or "xml" bsw@51: bsw@51: local function format_timestamp(timestamp) bsw@51: if timestamp then bsw@51: return format.timestamp(timestamp) bsw@51: else bsw@51: return "" bsw@51: end bsw@51: end bsw@51: bsw@51: local fields = { bsw@51: bsw@51: { name = "area_id", field = "area.id" }, bsw@51: { name = "area_name", field = "area.name" }, bsw@51: { name = "issue_id", field = "issue.id" }, bsw@51: { bsw@51: name = "issue_state", bsw@51: func = function(record) bsw@51: return record.issue.state bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "issue_created", bsw@51: field = "issue.created", bsw@51: func = function(record) bsw@51: return format_timestamp(record.issue_created) bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "issue_accepted", bsw@51: field = "issue.accepted", bsw@51: func = function(record) bsw@51: return format_timestamp(record.issue_accepted) bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "issue_half_frozen", bsw@51: field = "issue.half_frozen", bsw@51: func = function(record) bsw@51: return format_timestamp(record.issue_half_frozen) bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "issue_fully_frozen", bsw@51: field = "issue.fully_frozen", bsw@51: func = function(record) bsw@51: return format_timestamp(record.issue_fully_frozen) bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "issue_closed", bsw@51: field = "issue.closed", bsw@51: func = function(record) bsw@51: return format_timestamp(record.issue_closed) bsw@51: end bsw@51: }, bsw@51: { name = "issue_admission_time", field = "issue.admission_time" }, bsw@51: { name = "issue_discussion_time", field = "issue.discussion_time" }, bsw@51: { name = "issue_verification_time", field = "issue.verification_time" }, bsw@51: { name = "issue_voting_time", field = "issue.voting_time" }, bsw@51: { name = "issue_ranks_available", field = "issue.ranks_available" }, bsw@51: bsw@51: { name = "policy_issue_quorum_num", field = "policy.issue_quorum_num" }, bsw@51: { name = "policy_issue_quorum_den", field = "policy.issue_quorum_den" }, bsw@51: { name = "policy_initiative_quorum_num", bsw@51: field = "policy.initiative_quorum_num" }, bsw@51: { name = "policy_initiative_quorum_den", bsw@51: field = "policy.initiative_quorum_den" }, bsw@51: { name = "policy_majority_num", field = "policy.majority_num" }, bsw@51: { name = "policy_majority_den", field = "policy.majority_den" }, bsw@51: { name = "policy_majority_strict", field = "policy.majority_strict" }, bsw@51: { name = "id", field = "initiative.id" }, bsw@51: { name = "name", field = "initiative.name" }, bsw@51: { name = "discussion_url", field = "initiative.discussion_url" }, bsw@51: { bsw@51: name = "created", bsw@51: field = "initiative.created", bsw@51: func = function(record) bsw@99: return format_timestamp(record.created) bsw@51: end bsw@51: }, bsw@95: { bsw@95: name = "revoked", bsw@95: field = "initiative.revoked", bsw@95: func = function(record) bsw@99: return format_timestamp(record.revoked) bsw@95: end bsw@95: }, bsw@51: { name = "suggested_initiative_id", field = "initiative.suggested_initiative_id" }, bsw@51: { name = "admitted", field = "initiative.admitted" }, bsw@51: { name = "issue_population", field = "issue.population" }, bsw@51: { name = "supporter_count", field = "initiative.supporter_count" }, bsw@51: { name = "informed_supporter_count", field = "initiative.informed_supporter_count" }, bsw@51: { name = "satisfied_supporter_count", field = "initiative.satisfied_supporter_count" }, bsw@51: { name = "satisfied_informed_supporter_count", bsw@51: field = "initiative.satisfied_informed_supporter_count" }, bsw@51: { name = "issue_vote_now", field = "issue.vote_now" }, bsw@51: { name = "issue_vote_later", field = "issue.vote_later" }, bsw@51: { name = "issue_voter_count", field = "issue.voter_count" }, bsw@51: { name = "positive_votes", field = "initiative.positive_votes" }, bsw@51: { name = "negative_votes", field = "initiative.negative_votes" }, bsw@51: { name = "agreed", field = "initiative.agreed" }, bsw@51: { name = "rank", field = "initiative.rank" }, bsw@51: { bsw@51: name = "current_draft_created", bsw@51: func = function(record) bsw@99: return format_timestamp(record.current_draft.created) bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "current_draft_formatting_engine", bsw@51: func = function(record) bsw@51: return record.current_draft.formatting_engine bsw@51: end bsw@51: }, bsw@51: { bsw@51: name = "current_draft_content", bsw@51: func = function(record) bsw@95: if render_draft then bsw@95: return record.current_draft:get_content(render_draft) bsw@95: else bsw@95: return record.current_draft.content bsw@95: end bsw@51: end bsw@51: } bsw@51: } bsw@51: bsw@51: util.autoapi{ bsw@75: relation_name = "initiative", bsw@95: selector = initiatives_selector, bsw@95: fields = fields, bsw@95: api_engine = api_engine bsw@51: }