bsw@279: function model.has_rendered_content(class, rendered_class, content_field_name) 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@279: local lock = class:new_selector() bsw@279: :add_where{ "id = ?", self.id } bsw@279: :single_object_mode() bsw@279: :for_update() bsw@279: :exec() bsw@279: -- check if there is already a rendered content bsw@279: local rendered = rendered_class:new_selector() bsw@279: :add_where{ class.table .. "_id = ?", self.id } bsw@279: :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@279: rendered[class.table .. "_id"] = self.id bsw@279: rendered.format = "html" bsw@279: rendered.content = format.wiki_text(self[content_field_name], self.formatting_engine) 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@279: local rendered = rendered_class:new_selector() bsw@279: :add_where{ class.table .. "_id = ?", self.id } bsw@279: :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@279: end