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