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