rev |
line source |
bsw@279
|
1 function model.has_rendered_content(class, rendered_class, content_field_name)
|
bsw@279
|
2
|
bsw@279
|
3 local content_field_name = content_field_name or 'content'
|
bsw@279
|
4
|
bsw@279
|
5 -- render content to html, save it as rendered_class and return it
|
bsw@397
|
6 function class.object:render_content(force_rendering)
|
bsw@279
|
7 -- local draft for update
|
bsw@879
|
8
|
bsw@879
|
9 local selector = class:new_selector()
|
bsw@879
|
10
|
bsw@895
|
11 if type(class.primary_key) == "table" then
|
bsw@879
|
12 for i, key in ipairs(class.primary_key) do
|
bsw@879
|
13 selector:add_where{ "$ = ?", { key }, self[key] }
|
bsw@879
|
14 end
|
bsw@879
|
15 else
|
bsw@879
|
16 selector:add_where{ "id = ?", self.id }
|
bsw@879
|
17 end
|
bsw@879
|
18
|
bsw@879
|
19 local lock = selector:single_object_mode():for_update():exec()
|
bsw@879
|
20
|
bsw@279
|
21 -- check if there is already a rendered content
|
bsw@879
|
22 local selector = rendered_class:new_selector()
|
bsw@879
|
23 if type(class.primary_key) == "table" then
|
bsw@879
|
24 for i, key in ipairs(class.primary_key) do
|
bsw@879
|
25 selector:add_where{ "$.$ = ?", { rendered_class.table }, { key }, self[key] }
|
bsw@879
|
26 end
|
bsw@879
|
27 else
|
bsw@895
|
28 selector:add_where{ "$." .. class.table .. "_id = ?", { rendered_class.table }, self.id }
|
bsw@879
|
29 end
|
bsw@879
|
30 local rendered = selector:add_where{ "format = 'html'" }
|
bsw@279
|
31 :optional_object_mode()
|
bsw@279
|
32 :exec()
|
bsw@279
|
33 if rendered then
|
bsw@397
|
34 if force_rendering then
|
bsw@397
|
35 rendered:destroy()
|
bsw@397
|
36 else
|
bsw@397
|
37 return rendered
|
bsw@397
|
38 end
|
bsw@279
|
39 end
|
bsw@279
|
40 -- create rendered_class record
|
bsw@279
|
41 local rendered = rendered_class:new()
|
bsw@879
|
42 if type(class.primary_key) == "table" then
|
bsw@879
|
43 for i, key in ipairs(class.primary_key) do
|
bsw@879
|
44 rendered[key] = self[key]
|
bsw@879
|
45 end
|
bsw@879
|
46 else
|
bsw@879
|
47 rendered[class.table .. "_id"] = self.id
|
bsw@879
|
48 end
|
bsw@279
|
49 rendered.format = "html"
|
bsw@1045
|
50 if self.formatting_engine then
|
bsw@1045
|
51 rendered.content = format.wiki_text(self[content_field_name], self.formatting_engine)
|
bsw@1045
|
52 else
|
bsw@1045
|
53 rendered.content = self[content_field_name]
|
bsw@1045
|
54 end
|
bsw@279
|
55 rendered:save()
|
bsw@279
|
56 -- and return it
|
bsw@279
|
57 return rendered
|
bsw@279
|
58 end
|
bsw@279
|
59
|
bsw@279
|
60 -- returns rendered version for specific format
|
bsw@279
|
61 function class.object:get_content(format)
|
bsw@279
|
62 -- Fetch rendered_class record for specified format
|
bsw@879
|
63 local selector = rendered_class:new_selector()
|
bsw@879
|
64 if type(class.primary_key) == "table" then
|
bsw@879
|
65 for i, key in ipairs(class.primary_key) do
|
bsw@879
|
66 selector:add_where{ "$.$ = ?", { rendered_class.table }, { key }, self.id }
|
bsw@879
|
67 end
|
bsw@879
|
68 else
|
bsw@879
|
69 selector:add_where{ class.table .. "_id = ?", self.id }
|
bsw@879
|
70 end
|
bsw@879
|
71 local rendered = selector:add_where{ "format = ?", format }
|
bsw@279
|
72 :optional_object_mode()
|
bsw@279
|
73 :exec()
|
bsw@279
|
74 -- If this format isn't rendered yet, render it
|
bsw@279
|
75 if not rendered then
|
bsw@279
|
76 rendered = self:render_content()
|
bsw@279
|
77 end
|
bsw@279
|
78 -- return rendered content
|
bsw@279
|
79 return rendered.content
|
bsw@279
|
80 end
|
bsw@279
|
81
|
bsw@279
|
82 end |