# HG changeset patch # User bsw # Date 1437227919 -7200 # Node ID 24f4c23f76ffb8a51777b159b5640c5f0217d5f0 # Parent d361a7a03ac100ba347efb63157a08cead984bec Moved code from draft add action to Draft model diff -r d361a7a03ac1 -r 24f4c23f76ff app/main/draft/_action/add.lua --- a/app/main/draft/_action/add.lua Sun Jul 12 20:54:10 2015 +0200 +++ b/app/main/draft/_action/add.lua Sat Jul 18 15:58:39 2015 +0200 @@ -1,66 +1,8 @@ -local initiative = Initiative:by_id(param.get("initiative_id", atom.integer)) - --- TODO important m1 selectors returning result _SET_! -local issue = initiative:get_reference_selector("issue"):for_share():single_object_mode():exec() - -if issue.closed then - slot.put_into("error", _"This issue is already closed.") - return false -elseif issue.half_frozen then - slot.put_into("error", _"This issue is already frozen.") - return false -elseif issue.phase_finished then - slot.put_into("error", _"Current phase is already closed.") - return false -end - -local initiator = Initiator:by_pk(initiative.id, app.session.member.id) -if not initiator or not initiator.accepted then - error("access denied") -end - -local tmp = db:query({ "SELECT text_entries_left FROM member_contingent_left WHERE member_id = ? AND polling = ?", app.session.member.id, initiative.polling }, "opt_object") -if not tmp or tmp.text_entries_left < 1 then - slot.put_into("error", _"Sorry, you have reached your personal flood limit. Please be slower...") - return false -end - -local formatting_engine -if config.enforce_formatting_engine then - formatting_engine = config.enforce_formatting_engine -else - formatting_engine = param.get("formatting_engine") - - local formatting_engine_valid = false - for i, fe in pairs(config.formatting_engines) do - if formatting_engine == fe.id then - formatting_engine_valid = true - end - end - if not formatting_engine_valid then - error("invalid formatting engine!") - end -end - -if param.get("preview") or param.get("edit") then - return false -end - -local draft = Draft:new() -draft.author_id = app.session.member.id -draft.initiative_id = initiative.id -draft.formatting_engine = formatting_engine -draft.content = param.get("content") -draft:save() - -local supporter = Supporter:by_pk(initiative.id, app.session.member.id) - -if supporter then - supporter.draft_id = draft.id - supporter:save() -end - -draft:render_content() - -slot.put_into("notice", _"The initiative text has been updated") - +return Draft:update_content( + app.session.member.id, + param.get("initiative_id", atom.integer), + param.get("formatting_engine"), + param.get("content"), + nil, + param.get("preview") or param.get("edit") +) diff -r d361a7a03ac1 -r 24f4c23f76ff model/draft.lua --- a/model/draft.lua Sun Jul 12 20:54:10 2015 +0200 +++ b/model/draft.lua Sat Jul 18 15:58:39 2015 +0200 @@ -24,3 +24,78 @@ end model.has_rendered_content(Draft, RenderedDraft) + +function Draft:update_content(member_id, initiative_id, p_formatting_engine, content, external_reference, preview) + local initiative = Initiative:by_id(initiative_id) + + -- TODO important m1 selectors returning result _SET_! + local issue = initiative:get_reference_selector("issue"):for_share():single_object_mode():exec() + + if issue.closed then + slot.put_into("error", _"This issue is already closed.") + return false + elseif issue.half_frozen then + slot.put_into("error", _"This issue is already frozen.") + return false + elseif issue.phase_finished then + slot.put_into("error", _"Current phase is already closed.") + return false + end + + local initiator = Initiator:by_pk(initiative.id, member_id) + if not initiator or not initiator.accepted then + error("access denied") + end + + local tmp = db:query({ "SELECT text_entries_left FROM member_contingent_left WHERE member_id = ? AND polling = ?", member_id, initiative.polling }, "opt_object") + if not tmp or tmp.text_entries_left < 1 then + slot.put_into("error", _"Sorry, you have reached your personal flood limit. Please be slower...") + return false + end + + local formatting_engine + if config.enforce_formatting_engine then + formatting_engine = config.enforce_formatting_engine + else + formatting_engine = p_formatting_engine + + local formatting_engine_valid = false + for i, fe in pairs(config.formatting_engines) do + if formatting_engine == fe.id then + formatting_engine_valid = true + end + end + if not formatting_engine_valid then + error("invalid formatting engine!") + end + end + + if preview then + return false + end + + local old_draft = initiative.current_draft + + local draft = Draft:new() + draft.author_id = member_id + draft.initiative_id = initiative.id + draft.formatting_engine = formatting_engine or old_draft and old_draft.formatting_engine or nil + draft.content = content or old_draft and old_draft.content or nil + if external_reference == false then + draft.external_reference = nil + else + draft.external_reference = external_reference or old_draft and old_draft.external_reference or nil + end + draft:save() + + local supporter = Supporter:by_pk(initiative.id, member_id) + + if supporter then + supporter.draft_id = draft.id + supporter:save() + end + + draft:render_content() + + slot.put_into("notice", _"The initiative text has been updated") +end