liquid_feedback_frontend

changeset 279:23c98752e697

Added wiki support for suggestions and member statements
author bsw
date Thu Feb 16 14:08:43 2012 +0100 (2012-02-16)
parents fecd4c13054a
children 808269b7f41c
files app/main/member/_profile.lua app/main/suggestion/_action/add.lua app/main/suggestion/_suggestion.lua app/main/suggestion/new.lua env/model/has_rendered_content.lua model/draft.lua model/member.lua model/rendered_member_statement.lua model/suggestion.lua
line diff
     1.1 --- a/app/main/member/_profile.lua	Mon Feb 13 01:53:41 2012 +0100
     1.2 +++ b/app/main/member/_profile.lua	Thu Feb 16 14:08:43 2012 +0100
     1.3 @@ -135,7 +135,7 @@
     1.4        ui.container{
     1.5          attr = { class = "member_statement wiki" },
     1.6          content = function()
     1.7 -          slot.put(format.wiki_text(member.statement))
     1.8 +          slot.put(member:get_content("html"))
     1.9          end
    1.10        }
    1.11      end
     2.1 --- a/app/main/suggestion/_action/add.lua	Mon Feb 13 01:53:41 2012 +0100
     2.2 +++ b/app/main/suggestion/_action/add.lua	Thu Feb 16 14:08:43 2012 +0100
     2.3 @@ -12,11 +12,28 @@
     2.4    return false
     2.5  end
     2.6  
     2.7 +local formatting_engine = param.get("formatting_engine")
     2.8 +
     2.9 +local formatting_engine_valid = false
    2.10 +for fe, dummy in pairs(config.formatting_engine_executeables) do
    2.11 +  if formatting_engine == fe then
    2.12 +    formatting_engine_valid = true
    2.13 +  end
    2.14 +end
    2.15 +if not formatting_engine_valid then
    2.16 +  error("invalid formatting engine!")
    2.17 +end
    2.18 +
    2.19 +if param.get("preview") then
    2.20 +  return
    2.21 +end
    2.22 +
    2.23  local suggestion = Suggestion:new()
    2.24  
    2.25  suggestion.author_id = app.session.member.id
    2.26  suggestion.name = name
    2.27 -param.update(suggestion, "description", "initiative_id")
    2.28 +suggestion.formatting_engine = formatting_engine
    2.29 +param.update(suggestion, "content", "initiative_id")
    2.30  suggestion:save()
    2.31  
    2.32  -- TODO important m1 selectors returning result _SET_!
     3.1 --- a/app/main/suggestion/_suggestion.lua	Mon Feb 13 01:53:41 2012 +0100
     3.2 +++ b/app/main/suggestion/_suggestion.lua	Thu Feb 16 14:08:43 2012 +0100
     3.3 @@ -12,7 +12,7 @@
     3.4      ui.container{
     3.5        attr = { class = "suggestion_content wiki" },
     3.6        content = function()
     3.7 -        slot.put(encode.html_newlines(encode.html(suggestion.description)))
     3.8 +        slot.put(suggestion:get_content("html"))
     3.9        end
    3.10      }
    3.11    end
     4.1 --- a/app/main/suggestion/new.lua	Mon Feb 13 01:53:41 2012 +0100
     4.2 +++ b/app/main/suggestion/new.lua	Thu Feb 16 14:08:43 2012 +0100
     4.3 @@ -37,8 +37,6 @@
     4.4          value = _"You are currently not supporting this initiative directly. By adding suggestions to this initiative you will automatically become a potential supporter."
     4.5        }
     4.6      end
     4.7 -    ui.field.text{ label = _"Title (80 chars max)",        name = "name" }
     4.8 -    ui.field.text{ label = _"Description", name = "description", multiline = true, attr={id="suggestion_description"}}
     4.9      ui.field.select{
    4.10        label = _"Degree",
    4.11        name = "degree",
    4.12 @@ -49,6 +47,57 @@
    4.13        foreign_id = "id",
    4.14        foreign_name = "name"
    4.15      }
    4.16 +    ui.field.text{ label = _"Title (80 chars max)", name = "name" }
    4.17 +    ui.field.select{
    4.18 +      label = _"Wiki engine",
    4.19 +      name = "formatting_engine",
    4.20 +      foreign_records = {
    4.21 +        { id = "rocketwiki", name = "RocketWiki" },
    4.22 +        { id = "compat", name = _"Traditional wiki syntax" }
    4.23 +      },
    4.24 +      attr = {id = "formatting_engine"},
    4.25 +      foreign_id = "id",
    4.26 +      foreign_name = "name",
    4.27 +      value = param.get("formatting_engine")
    4.28 +    }
    4.29 +    ui.tag{
    4.30 +      tag = "div",
    4.31 +      content = function()
    4.32 +        ui.tag{
    4.33 +          tag = "label",
    4.34 +          attr = { class = "ui_field_label" },
    4.35 +          content = function() slot.put(" ") end,
    4.36 +        }
    4.37 +        ui.tag{
    4.38 +          content = function()
    4.39 +            ui.link{
    4.40 +              text = _"Syntax help",
    4.41 +              module = "help",
    4.42 +              view = "show",
    4.43 +              id = "wikisyntax",
    4.44 +              attr = {onClick="this.href=this.href.replace(/wikisyntax[^.]*/g, 'wikisyntax_'+getElementById('formatting_engine').value)"}
    4.45 +            }
    4.46 +            slot.put(" ")
    4.47 +            ui.link{
    4.48 +              text = _"(new window)",
    4.49 +              module = "help",
    4.50 +              view = "show",
    4.51 +              id = "wikisyntax",
    4.52 +              attr = {target = "_blank", onClick="this.href=this.href.replace(/wikisyntax[^.]*/g, 'wikisyntax_'+getElementById('formatting_engine').value)"}
    4.53 +            }
    4.54 +          end
    4.55 +        }
    4.56 +      end
    4.57 +    }
    4.58 +    ui.field.text{
    4.59 +      label = _"Description",
    4.60 +      name = "content",
    4.61 +      multiline = true, 
    4.62 +      attr = { style = "height: 50ex;" },
    4.63 +      value = param.get("content")
    4.64 +    }
    4.65 +
    4.66 +    
    4.67      ui.submit{ text = _"Commit suggestion" }
    4.68    end
    4.69  }
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/env/model/has_rendered_content.lua	Thu Feb 16 14:08:43 2012 +0100
     5.3 @@ -0,0 +1,48 @@
     5.4 +function model.has_rendered_content(class, rendered_class, content_field_name)
     5.5 +
     5.6 +  local content_field_name = content_field_name or 'content'
     5.7 +  
     5.8 +  -- render content to html, save it as rendered_class and return it
     5.9 +  function class.object:render_content()
    5.10 +    -- local draft for update
    5.11 +    local lock = class:new_selector()
    5.12 +      :add_where{ "id = ?", self.id }
    5.13 +      :single_object_mode()
    5.14 +      :for_update()
    5.15 +      :exec()
    5.16 +    -- check if there is already a rendered content
    5.17 +    local rendered = rendered_class:new_selector()
    5.18 +      :add_where{ class.table .. "_id = ?", self.id }
    5.19 +      :add_where{ "format = 'html'" }
    5.20 +      :optional_object_mode()
    5.21 +      :exec()
    5.22 +    if rendered then
    5.23 +      return rendered
    5.24 +    end
    5.25 +    -- create rendered_class record
    5.26 +    local rendered = rendered_class:new()
    5.27 +    rendered[class.table .. "_id"] = self.id
    5.28 +    rendered.format = "html"
    5.29 +    rendered.content = format.wiki_text(self[content_field_name], self.formatting_engine)
    5.30 +    rendered:save()
    5.31 +    -- and return it
    5.32 +    return rendered
    5.33 +  end
    5.34 +
    5.35 +  -- returns rendered version for specific format
    5.36 +  function class.object:get_content(format)
    5.37 +    -- Fetch rendered_class record for specified format
    5.38 +    local rendered = rendered_class:new_selector()
    5.39 +      :add_where{ class.table .. "_id = ?", self.id }
    5.40 +      :add_where{ "format = ?", format }
    5.41 +      :optional_object_mode()
    5.42 +      :exec()
    5.43 +    -- If this format isn't rendered yet, render it
    5.44 +    if not rendered then
    5.45 +      rendered = self:render_content()
    5.46 +    end
    5.47 +    -- return rendered content
    5.48 +    return rendered.content
    5.49 +  end
    5.50 +
    5.51 +end
    5.52 \ No newline at end of file
     6.1 --- a/model/draft.lua	Mon Feb 13 01:53:41 2012 +0100
     6.2 +++ b/model/draft.lua	Thu Feb 16 14:08:43 2012 +0100
     6.3 @@ -23,45 +23,4 @@
     6.4    return self.author and self.author.name or _"Unknown author"
     6.5  end
     6.6  
     6.7 --- render draft to html, save it as rendered_draft and return it
     6.8 -function Draft.object:render_content()
     6.9 -  -- local draft for update
    6.10 -  local draft_lock = Draft:new_selector()
    6.11 -    :add_where{ "id = ?", self.id }
    6.12 -    :single_object_mode()
    6.13 -    :for_update()
    6.14 -    :exec()
    6.15 -  -- check if there is already a rendered draft
    6.16 -  local rendered_draft = RenderedDraft:new_selector()
    6.17 -    :add_where{ "draft_id = ?", self.id }
    6.18 -    :add_where{ "format = 'html'" }
    6.19 -    :optional_object_mode()
    6.20 -    :exec()
    6.21 -  if rendered_draft then
    6.22 -    return rendered_draft
    6.23 -  end
    6.24 -  -- create rendered_draft record
    6.25 -  local rendered_draft = RenderedDraft:new()
    6.26 -  rendered_draft.draft_id = self.id
    6.27 -  rendered_draft.format = "html"
    6.28 -  rendered_draft.content = format.wiki_text(self.content, self.formatting_engine)
    6.29 -  rendered_draft:save()
    6.30 -  -- and return it
    6.31 -  return rendered_draft
    6.32 -end
    6.33 -
    6.34 --- returns rendered version of draft for specific format
    6.35 -function Draft.object:get_content(format)
    6.36 -  -- Fetch rendered_draft record for specified format
    6.37 -  local rendered_draft = RenderedDraft:new_selector()
    6.38 -    :add_where{ "draft_id = ?", self.id }
    6.39 -    :add_where{ "format = ?", format }
    6.40 -    :optional_object_mode()
    6.41 -    :exec()
    6.42 -  -- If this format isn't rendered yet, render it
    6.43 -  if not rendered_draft then
    6.44 -    rendered_draft = self:render_content()
    6.45 -  end
    6.46 -  -- return rendered content
    6.47 -  return rendered_draft.content
    6.48 -end
    6.49 \ No newline at end of file
    6.50 +model.has_rendered_content(Draft, RenderedDraft)
     7.1 --- a/model/member.lua	Mon Feb 13 01:53:41 2012 +0100
     7.2 +++ b/model/member.lua	Thu Feb 16 14:08:43 2012 +0100
     7.3 @@ -223,6 +223,8 @@
     7.4    ref                   = 'supported_initiatives'
     7.5  }
     7.6  
     7.7 +model.has_rendered_content(Member, RenderedMemberStatement, "statement")
     7.8 +
     7.9  Member:new_selector()
    7.10    :add_order_by("member.name")
    7.11    :exec()
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/model/rendered_member_statement.lua	Thu Feb 16 14:08:43 2012 +0100
     8.3 @@ -0,0 +1,11 @@
     8.4 +RenderedMemberStatement = mondelefant.new_class()
     8.5 +RenderedMemberStatement.table = 'rendered_member_statement'
     8.6 +RenderedMemberStatement.primary_key = { "member_id", "format" }
     8.7 +
     8.8 +RenderedMemberStatement:add_reference{
     8.9 +  mode          = 'm1',
    8.10 +  to            = "Member",
    8.11 +  this_key      = 'member_id',
    8.12 +  that_key      = 'id',
    8.13 +  ref           = 'member',
    8.14 +}
     9.1 --- a/model/suggestion.lua	Mon Feb 13 01:53:41 2012 +0100
     9.2 +++ b/model/suggestion.lua	Thu Feb 16 14:08:43 2012 +0100
     9.3 @@ -26,3 +26,5 @@
     9.4    back_ref      = 'issue',
     9.5    default_order = '"id"'
     9.6  }
     9.7 +
     9.8 +model.has_rendered_content(Suggestion, RenderedSuggestion)

Impressum / About Us