bsw/jbe@1309: function model.has_rendered_content(class, rendered_class, content_field_name, primary_key) bsw@279: bsw@279: local content_field_name = content_field_name or 'content' bsw@279: bsw@279: -- render content to html, save it as rendered_class and return it bsw@397: function class.object:render_content(force_rendering) bsw@279: -- local draft for update bsw@879: bsw@879: local selector = class:new_selector() bsw@879: bsw@895: if type(class.primary_key) == "table" then bsw@879: for i, key in ipairs(class.primary_key) do bsw@879: selector:add_where{ "$ = ?", { key }, self[key] } bsw@879: end bsw/jbe@1309: elseif class.primary_key then bsw/jbe@1309: selector:add_where{ "$ = ?", { class.primary_key }, self[class.primary_key] } bsw@879: else bsw@879: selector:add_where{ "id = ?", self.id } bsw@879: end bsw@879: bsw@879: local lock = selector:single_object_mode():for_update():exec() bsw@879: bsw@279: -- check if there is already a rendered content bsw@879: local selector = rendered_class:new_selector() bsw@879: if type(class.primary_key) == "table" then bsw@879: for i, key in ipairs(class.primary_key) do bsw@879: selector:add_where{ "$.$ = ?", { rendered_class.table }, { key }, self[key] } bsw@879: end bsw/jbe@1309: elseif class.primary_key then bsw/jbe@1309: selector:add_where{ "$." .. primary_key .. " = ?", { rendered_class.table }, self[class.primary_key] } bsw@879: else bsw@895: selector:add_where{ "$." .. class.table .. "_id = ?", { rendered_class.table }, self.id } bsw@879: end bsw@879: local rendered = selector:add_where{ "format = 'html'" } bsw@279: :optional_object_mode() bsw@279: :exec() bsw@279: if rendered then bsw@397: if force_rendering then bsw@397: rendered:destroy() bsw@397: else bsw@397: return rendered bsw@397: end bsw@279: end bsw@279: -- create rendered_class record bsw@279: local rendered = rendered_class:new() bsw@879: if type(class.primary_key) == "table" then bsw@879: for i, key in ipairs(class.primary_key) do bsw@879: rendered[key] = self[key] bsw@879: end bsw/jbe@1309: elseif class.primary_key then bsw/jbe@1309: rendered[primary_key] = self[class.primary_key] bsw@879: else bsw@879: rendered[class.table .. "_id"] = self.id bsw@879: end bsw@279: rendered.format = "html" bsw@1045: if self.formatting_engine then bsw@1045: rendered.content = format.wiki_text(self[content_field_name], self.formatting_engine) bsw@1045: else bsw@1045: rendered.content = self[content_field_name] bsw@1045: end bsw@279: rendered:save() bsw@279: -- and return it bsw@279: return rendered bsw@279: end bsw@279: bsw@279: -- returns rendered version for specific format bsw@279: function class.object:get_content(format) bsw@279: -- Fetch rendered_class record for specified format bsw@879: local selector = rendered_class:new_selector() bsw@879: if type(class.primary_key) == "table" then bsw@879: for i, key in ipairs(class.primary_key) do bsw@879: selector:add_where{ "$.$ = ?", { rendered_class.table }, { key }, self.id } bsw@879: end bsw/jbe@1309: elseif class.primary_key then bsw/jbe@1309: selector:add_where{ primary_key .. " = ?", self[class.primary_key] } bsw@879: else bsw@879: selector:add_where{ class.table .. "_id = ?", self.id } bsw@879: end bsw@879: local rendered = selector:add_where{ "format = ?", format } bsw@279: :optional_object_mode() bsw@279: :exec() bsw@279: -- If this format isn't rendered yet, render it bsw@279: if not rendered then bsw@279: rendered = self:render_content() bsw@279: end bsw@279: -- return rendered content bsw@279: return rendered.content bsw@279: end bsw@279: bsw/jbe@1309: end