| 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
 |