bsw/jbe@0: Draft = mondelefant.new_class() bsw/jbe@0: Draft.table = 'draft' bsw/jbe@0: bsw@81: -- Many drafts belonging to an initiative bsw/jbe@0: Draft:add_reference{ bsw/jbe@0: mode = 'm1', bsw/jbe@0: to = "Initiative", bsw/jbe@0: this_key = 'initiative_id', bsw/jbe@0: that_key = 'id', bsw/jbe@0: ref = 'initiative', bsw/jbe@0: } bsw/jbe@0: bsw@81: -- Many drafts are authored by a member bsw/jbe@0: Draft:add_reference{ bsw/jbe@0: mode = 'm1', bsw/jbe@0: to = "Member", bsw/jbe@0: this_key = 'author_id', bsw/jbe@0: that_key = 'id', bsw/jbe@0: ref = 'author', bsw/jbe@0: } bsw/jbe@0: bsw/jbe@0: function Draft.object_get:author_name() bsw/jbe@0: return self.author and self.author.name or _"Unknown author" bsw/jbe@0: end bsw@81: bsw/jbe@1309: model.has_rendered_content(Draft, RenderedDraft, "content", "draft_id") bsw@1208: bsw@1208: function Draft:update_content(member_id, initiative_id, p_formatting_engine, content, external_reference, preview) bsw@1208: local initiative = Initiative:by_id(initiative_id) bsw@1208: bsw@1208: -- TODO important m1 selectors returning result _SET_! bsw@1208: local issue = initiative:get_reference_selector("issue"):for_share():single_object_mode():exec() bsw@1208: bsw@1208: if issue.closed then bsw@1208: slot.put_into("error", _"This issue is already closed.") bsw@1208: return false bsw@1208: elseif issue.half_frozen then bsw@1208: slot.put_into("error", _"This issue is already frozen.") bsw@1208: return false bsw@1208: elseif issue.phase_finished then bsw@1208: slot.put_into("error", _"Current phase is already closed.") bsw@1208: return false bsw@1208: end bsw@1208: bsw@1208: local initiator = Initiator:by_pk(initiative.id, member_id) bsw@1208: if not initiator or not initiator.accepted then bsw/jbe@1309: return false bsw@1208: end bsw@1208: bsw@1208: local tmp = db:query({ "SELECT text_entries_left FROM member_contingent_left WHERE member_id = ? AND polling = ?", member_id, initiative.polling }, "opt_object") bsw@1208: if not tmp or tmp.text_entries_left < 1 then bsw@1208: slot.put_into("error", _"Sorry, you have reached your personal flood limit. Please be slower...") bsw@1208: return false bsw@1208: end bsw@1208: bsw@1208: local formatting_engine bsw@1208: if config.enforce_formatting_engine then bsw@1208: formatting_engine = config.enforce_formatting_engine bsw@1208: else bsw@1208: formatting_engine = p_formatting_engine bsw@1208: bsw@1208: local formatting_engine_valid = false bsw@1208: for i, fe in pairs(config.formatting_engines) do bsw@1208: if formatting_engine == fe.id then bsw@1208: formatting_engine_valid = true bsw@1208: end bsw@1208: end bsw@1208: if not formatting_engine_valid then bsw@1208: error("invalid formatting engine!") bsw@1208: end bsw@1208: end bsw@1208: bsw@1208: if preview then bsw@1208: return false bsw@1208: end bsw@1208: bsw@1208: local old_draft = initiative.current_draft bsw@1208: bsw@1208: local draft = Draft:new() bsw@1208: draft.author_id = member_id bsw@1208: draft.initiative_id = initiative.id bsw@1208: draft.formatting_engine = formatting_engine or old_draft and old_draft.formatting_engine or nil bsw@1208: draft.content = content or old_draft and old_draft.content or nil bsw@1208: if external_reference == false then bsw@1208: draft.external_reference = nil bsw@1208: else bsw@1208: draft.external_reference = external_reference or old_draft and old_draft.external_reference or nil bsw@1208: end bsw@1208: draft:save() bsw@1208: bsw@1208: local supporter = Supporter:by_pk(initiative.id, member_id) bsw@1208: bsw@1208: if supporter then bsw@1208: supporter.draft_id = draft.id bsw@1208: supporter:save() bsw@1208: end bsw@1208: bsw@1208: draft:render_content() bsw@1208: bsw@1495: local draft_attachments = DraftAttachment:new_selector() bsw@1495: :add_where{ "draft_id = ?", old_draft.id } bsw@1495: :exec() bsw@1495: bsw@1495: for i, draft_attachment in ipairs(draft_attachments) do bsw@1495: local new_draft_attachment = DraftAttachment:new() bsw@1495: new_draft_attachment.draft_id = draft.id bsw@1495: new_draft_attachment.file_id = draft_attachment.file_id bsw@1495: new_draft_attachment.title = draft_attachment.title bsw@1495: new_draft_attachment.description = draft_attachment.description bsw@1495: new_draft_attachment:save() bsw@1495: end bsw@1495: bsw@1208: slot.put_into("notice", _"The initiative text has been updated") bsw@1495: return draft.id bsw@1208: end