| 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 |