rev |
line source |
bsw/jbe@0
|
1 Draft = mondelefant.new_class()
|
bsw/jbe@0
|
2 Draft.table = 'draft'
|
bsw/jbe@0
|
3
|
bsw@81
|
4 -- Many drafts belonging to an initiative
|
bsw/jbe@0
|
5 Draft:add_reference{
|
bsw/jbe@0
|
6 mode = 'm1',
|
bsw/jbe@0
|
7 to = "Initiative",
|
bsw/jbe@0
|
8 this_key = 'initiative_id',
|
bsw/jbe@0
|
9 that_key = 'id',
|
bsw/jbe@0
|
10 ref = 'initiative',
|
bsw/jbe@0
|
11 }
|
bsw/jbe@0
|
12
|
bsw@81
|
13 -- Many drafts are authored by a member
|
bsw/jbe@0
|
14 Draft:add_reference{
|
bsw/jbe@0
|
15 mode = 'm1',
|
bsw/jbe@0
|
16 to = "Member",
|
bsw/jbe@0
|
17 this_key = 'author_id',
|
bsw/jbe@0
|
18 that_key = 'id',
|
bsw/jbe@0
|
19 ref = 'author',
|
bsw/jbe@0
|
20 }
|
bsw/jbe@0
|
21
|
bsw/jbe@0
|
22 function Draft.object_get:author_name()
|
bsw/jbe@0
|
23 return self.author and self.author.name or _"Unknown author"
|
bsw/jbe@0
|
24 end
|
bsw@81
|
25
|
bsw/jbe@1309
|
26 model.has_rendered_content(Draft, RenderedDraft, "content", "draft_id")
|
bsw@1208
|
27
|
bsw@1208
|
28 function Draft:update_content(member_id, initiative_id, p_formatting_engine, content, external_reference, preview)
|
bsw@1208
|
29 local initiative = Initiative:by_id(initiative_id)
|
bsw@1208
|
30
|
bsw@1208
|
31 -- TODO important m1 selectors returning result _SET_!
|
bsw@1208
|
32 local issue = initiative:get_reference_selector("issue"):for_share():single_object_mode():exec()
|
bsw@1208
|
33
|
bsw@1208
|
34 if issue.closed then
|
bsw@1208
|
35 slot.put_into("error", _"This issue is already closed.")
|
bsw@1208
|
36 return false
|
bsw@1208
|
37 elseif issue.half_frozen then
|
bsw@1208
|
38 slot.put_into("error", _"This issue is already frozen.")
|
bsw@1208
|
39 return false
|
bsw@1208
|
40 elseif issue.phase_finished then
|
bsw@1208
|
41 slot.put_into("error", _"Current phase is already closed.")
|
bsw@1208
|
42 return false
|
bsw@1208
|
43 end
|
bsw@1208
|
44
|
bsw@1208
|
45 local initiator = Initiator:by_pk(initiative.id, member_id)
|
bsw@1208
|
46 if not initiator or not initiator.accepted then
|
bsw/jbe@1309
|
47 return false
|
bsw@1208
|
48 end
|
bsw@1208
|
49
|
bsw@1208
|
50 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
|
51 if not tmp or tmp.text_entries_left < 1 then
|
bsw@1208
|
52 slot.put_into("error", _"Sorry, you have reached your personal flood limit. Please be slower...")
|
bsw@1208
|
53 return false
|
bsw@1208
|
54 end
|
bsw@1208
|
55
|
bsw@1208
|
56 local formatting_engine
|
bsw@1208
|
57 if config.enforce_formatting_engine then
|
bsw@1208
|
58 formatting_engine = config.enforce_formatting_engine
|
bsw@1208
|
59 else
|
bsw@1208
|
60 formatting_engine = p_formatting_engine
|
bsw@1208
|
61
|
bsw@1208
|
62 local formatting_engine_valid = false
|
bsw@1208
|
63 for i, fe in pairs(config.formatting_engines) do
|
bsw@1208
|
64 if formatting_engine == fe.id then
|
bsw@1208
|
65 formatting_engine_valid = true
|
bsw@1208
|
66 end
|
bsw@1208
|
67 end
|
bsw@1208
|
68 if not formatting_engine_valid then
|
bsw@1208
|
69 error("invalid formatting engine!")
|
bsw@1208
|
70 end
|
bsw@1208
|
71 end
|
bsw@1208
|
72
|
bsw@1208
|
73 if preview then
|
bsw@1208
|
74 return false
|
bsw@1208
|
75 end
|
bsw@1208
|
76
|
bsw@1208
|
77 local old_draft = initiative.current_draft
|
bsw@1208
|
78
|
bsw@1208
|
79 local draft = Draft:new()
|
bsw@1208
|
80 draft.author_id = member_id
|
bsw@1208
|
81 draft.initiative_id = initiative.id
|
bsw@1208
|
82 draft.formatting_engine = formatting_engine or old_draft and old_draft.formatting_engine or nil
|
bsw@1208
|
83 draft.content = content or old_draft and old_draft.content or nil
|
bsw@1208
|
84 if external_reference == false then
|
bsw@1208
|
85 draft.external_reference = nil
|
bsw@1208
|
86 else
|
bsw@1208
|
87 draft.external_reference = external_reference or old_draft and old_draft.external_reference or nil
|
bsw@1208
|
88 end
|
bsw@1208
|
89 draft:save()
|
bsw@1208
|
90
|
bsw@1208
|
91 local supporter = Supporter:by_pk(initiative.id, member_id)
|
bsw@1208
|
92
|
bsw@1208
|
93 if supporter then
|
bsw@1208
|
94 supporter.draft_id = draft.id
|
bsw@1208
|
95 supporter:save()
|
bsw@1208
|
96 end
|
bsw@1208
|
97
|
bsw@1208
|
98 draft:render_content()
|
bsw@1208
|
99
|
bsw@1495
|
100 local draft_attachments = DraftAttachment:new_selector()
|
bsw@1495
|
101 :add_where{ "draft_id = ?", old_draft.id }
|
bsw@1495
|
102 :exec()
|
bsw@1495
|
103
|
bsw@1495
|
104 for i, draft_attachment in ipairs(draft_attachments) do
|
bsw@1495
|
105 local new_draft_attachment = DraftAttachment:new()
|
bsw@1495
|
106 new_draft_attachment.draft_id = draft.id
|
bsw@1495
|
107 new_draft_attachment.file_id = draft_attachment.file_id
|
bsw@1495
|
108 new_draft_attachment.title = draft_attachment.title
|
bsw@1495
|
109 new_draft_attachment.description = draft_attachment.description
|
bsw@1495
|
110 new_draft_attachment:save()
|
bsw@1495
|
111 end
|
bsw@1495
|
112
|
bsw@1208
|
113 slot.put_into("notice", _"The initiative text has been updated")
|
bsw@1495
|
114 return draft.id
|
bsw@1208
|
115 end
|