| 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@279 | 50     rendered.content = format.wiki_text(self[content_field_name], self.formatting_engine) | 
| bsw@279 | 51     rendered:save() | 
| bsw@279 | 52     -- and return it | 
| bsw@279 | 53     return rendered | 
| bsw@279 | 54   end | 
| bsw@279 | 55 | 
| bsw@279 | 56   -- returns rendered version for specific format | 
| bsw@279 | 57   function class.object:get_content(format) | 
| bsw@279 | 58     -- Fetch rendered_class record for specified format | 
| bsw@879 | 59     local selector = rendered_class:new_selector() | 
| bsw@879 | 60     if type(class.primary_key) == "table" then | 
| bsw@879 | 61       for i, key in ipairs(class.primary_key) do | 
| bsw@879 | 62         selector:add_where{ "$.$ = ?", { rendered_class.table }, { key }, self.id } | 
| bsw@879 | 63       end | 
| bsw@879 | 64     else | 
| bsw@879 | 65       selector:add_where{ class.table .. "_id = ?", self.id } | 
| bsw@879 | 66     end | 
| bsw@879 | 67     local rendered = selector:add_where{ "format = ?", format } | 
| bsw@279 | 68       :optional_object_mode() | 
| bsw@279 | 69       :exec() | 
| bsw@279 | 70     -- If this format isn't rendered yet, render it | 
| bsw@279 | 71     if not rendered then | 
| bsw@279 | 72       rendered = self:render_content() | 
| bsw@279 | 73     end | 
| bsw@279 | 74     -- return rendered content | 
| bsw@279 | 75     return rendered.content | 
| bsw@279 | 76   end | 
| bsw@279 | 77 | 
| bsw@279 | 78 end |