liquid_feedback_frontend

changeset 75:733f65c0c0a0 beta19

Bugfixes, feature enhancements, code-cleanup, and major work on API

Details:
- API
-- Allow relation name to be passed to helper function util.autoapi{...}
-- Added area API
-- Bugfixes in API
--- Correctly return initiatives (bug #162)
--- Correctly process "id" parameter for initiative API
--- Bugfix related to "state" parameter (bug #165)
--- Changed constant "discussion" to "accepted" (in model/issue.lua, used by API)
--- Fixed JSON encoding in auto_api (bug #181)
--- Ignore list filter "voted" in case of public access
--- Enable access to API without session
- Work on RSS feed (incomplete yet)
- Other bugfixes
-- Handle empty browser identification string
-- Handle invalid date in member/update.lua (bugs #24 #109 #115 #136)
-- Better handle errors while converting uploaded images. (bug #79 +5 duplicates)
-- Don't display revoked initiatives in list of new drafts (bug #134)
-- Fixed syntax error in app/main/member/_action/update_name.lua throwing unexpected error, when new name was too short
-- Do not display refresh support button for revoked initiatives
-- Repaired issue search (bug #150)
-- Fixed typos in german translation files
--- "initi(i)erte"
--- "Er(g)eignisse" (bug #161)
- Code cleanup
-- Removed deprecated motd files locale/motd/de.txt and locale/motd/de_public.txt
-- Removed redundant code in app/main/index/_updated_drafts.lua
- New features and (optical) enhancements
-- Support change of notify email; notification of not approved address added to start page
-- Settings dialog splitted into single pages
-- Mark deactivated members
-- Calendar for birthday selection in profile
-- Policy list public readable when public access is enabled
author bsw
date Thu Jul 08 18:44:02 2010 +0200 (2010-07-08)
parents e40051909836
children 06984568801f
files app/main/_filter/21_auth.lua app/main/_filter_view/34_stylesheet.lua app/main/api/area.lua app/main/api/initiative.lua app/main/index/_action/confirm_notify_email.lua app/main/index/_updated_drafts.lua app/main/initiative/_show.lua app/main/initiative/list_rss.lua app/main/initiative/show.rss.lua app/main/issue/_list.lua app/main/member/_action/update.lua app/main/member/_action/update_email.lua app/main/member/_action/update_images.lua app/main/member/_action/update_name.lua app/main/member/_email_unconfirmed.lua app/main/member/_show_thumb.lua app/main/member/developer_settings.lua app/main/member/edit.lua app/main/member/settings.lua app/main/member/settings_display.lua app/main/member/settings_email.lua app/main/member/settings_login.lua app/main/member/settings_name.lua app/main/member/settings_password.lua app/main/member/show.lua app/main/member/show_tab.lua config/default.lua env/util/autoapi.lua locale/help/member.settings.email_address.de.txt locale/motd/de.txt locale/motd/de_public.txt locale/translations.de.lua locale/translations.en.lua locale/translations.eo.lua locale/translations.fr.lua model/issue.lua model/member.lua static/style.css
line diff
     1.1 --- a/app/main/_filter/21_auth.lua	Wed May 26 15:47:52 2010 +0200
     1.2 +++ b/app/main/_filter/21_auth.lua	Thu Jul 08 18:44:02 2010 +0200
     1.3 @@ -24,11 +24,13 @@
     1.4       or request.get_view() == "show_tab"
     1.5      )
     1.6      or request.get_module() == "policy" and request.get_view() == "show"
     1.7 +    or request.get_module() == "policy" and request.get_view() == "list"
     1.8      or request.get_module() == "issue" and request.get_view() == "show"
     1.9      or request.get_module() == "issue" and request.get_view() == "show_tab"
    1.10      or request.get_module() == "initiative" and request.get_view() == "show"
    1.11      or request.get_module() == "initiative" and request.get_view() == "show_partial"
    1.12      or request.get_module() == "initiative" and request.get_view() == "show_tab"
    1.13 +    or request.get_module() == "initiative" and request.get_view() == "show.rss"
    1.14      or request.get_module() == "suggestion" and request.get_view() == "show"
    1.15      or request.get_module() == "draft" and request.get_view() == "diff"
    1.16    then
    1.17 @@ -37,6 +39,10 @@
    1.18  
    1.19  end
    1.20  
    1.21 +if config.api_enabled and request.get_module() == "api" then
    1.22 +  auth_needed = false
    1.23 +end
    1.24 +
    1.25  if config.public_access and not app.session.member_id and auth_needed and request.get_module() == "index" and request.get_view() == "index" then
    1.26    request.redirect{ module = "area", view = "list" }
    1.27    return
     2.1 --- a/app/main/_filter_view/34_stylesheet.lua	Wed May 26 15:47:52 2010 +0200
     2.2 +++ b/app/main/_filter_view/34_stylesheet.lua	Thu Jul 08 18:44:02 2010 +0200
     2.3 @@ -11,7 +11,7 @@
     2.4    slot.put_into("stylesheet_url", config.absolute_base_url .. "static/style.css")
     2.5  end
     2.6  
     2.7 -if os.getenv("HTTP_USER_AGENT"):find("Android.*AppleWebKit.*Mobile Safari") then
     2.8 +if os.getenv("HTTP_USER_AGENT") and os.getenv("HTTP_USER_AGENT"):find("Android.*AppleWebKit.*Mobile Safari") then
     2.9    slot.select("html_head", function()
    2.10      ui.tag{
    2.11        tag = "style",
    2.12 @@ -52,4 +52,4 @@
    2.13    }
    2.14  else
    2.15    execute.inner()
    2.16 -end
    2.17 \ No newline at end of file
    2.18 +end
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/app/main/api/area.lua	Thu Jul 08 18:44:02 2010 +0200
     3.3 @@ -0,0 +1,54 @@
     3.4 +local id     = param.get("id")
     3.5 +local min_id = param.get("min_id")
     3.6 +local max_id = param.get("max_id")
     3.7 +local order  = param.get("order")
     3.8 +local limit  = param.get("limit", atom.integer)
     3.9 +
    3.10 +local areas_selector = Area:new_selector()
    3.11 +
    3.12 +if id then
    3.13 +  areas_selector:add_where{"area.id = ?", id}
    3.14 +end
    3.15 +
    3.16 +if min_id then
    3.17 +  areas_selector:add_where{"area.id >= ?", min_id}
    3.18 +end
    3.19 +
    3.20 +if max_id then
    3.21 +  areas_selector:add_where{"area.id <= ?", max_id}
    3.22 +end
    3.23 +
    3.24 +if order == "name" then
    3.25 +  areas_selector:add_order_by("area.name")
    3.26 +end
    3.27 +
    3.28 +if order == "member_weight" then
    3.29 +  areas_selector:add_order_by("area.member_weight DESC")
    3.30 +end
    3.31 +
    3.32 +areas_selector:add_order_by("area.id")
    3.33 +
    3.34 +if limit then
    3.35 +  initiatives_selector:limit(limit)
    3.36 +end
    3.37 +
    3.38 +local api_engine = param.get("api_engine") or "xml"
    3.39 +
    3.40 +local fields = {
    3.41 +
    3.42 +  { name = "id",                   field = "area.id" },
    3.43 +  { name = "name",                 field = "area.name" },
    3.44 +  { name = "description",          field = "area.description" },
    3.45 +  { name = "direct_member_count",  field = "area.direct_member_count" },
    3.46 +  { name = "member_weight",        field = "area.member_weight" },
    3.47 +  { name = "autoreject_weight",    field = "area.autoreject_weight" },
    3.48 +  { name = "active",               field = "area.active" },
    3.49 +
    3.50 +}
    3.51 +
    3.52 +util.autoapi{
    3.53 +  relation_name = "area",
    3.54 +  selector      = areas_selector,
    3.55 +  fields        = fields,
    3.56 +  api_engine    = api_engine
    3.57 +}
    3.58 \ No newline at end of file
     4.1 --- a/app/main/api/initiative.lua	Wed May 26 15:47:52 2010 +0200
     4.2 +++ b/app/main/api/initiative.lua	Thu Jul 08 18:44:02 2010 +0200
     4.3 @@ -1,4 +1,4 @@
     4.4 -local id             = param.get_id()
     4.5 +local id             = param.get("id")
     4.6  local min_id         = param.get("min_id")
     4.7  local max_id         = param.get("max_id")
     4.8  local area_id        = param.get("area_id", atom.integer)
     4.9 @@ -13,7 +13,7 @@
    4.10  local order          = param.get("order")
    4.11  
    4.12  local initiatives_selector = Initiative:new_selector()
    4.13 -  :join("issue", nil, "issue.id = initiative.id")
    4.14 +  :join("issue", nil, "issue.id = initiative.issue_id")
    4.15    :join("area", nil, "area.id = issue.area_id")
    4.16    :join("policy", nil, "policy.id = issue.policy_id")
    4.17  
    4.18 @@ -42,7 +42,7 @@
    4.19  end
    4.20  
    4.21  if state then
    4.22 -  Issue:modify_selector_for_state(state)
    4.23 +  Issue:modify_selector_for_state(initiatives_selector, state)
    4.24  end
    4.25  
    4.26  if agreed then
    4.27 @@ -187,6 +187,7 @@
    4.28  }
    4.29  
    4.30  util.autoapi{
    4.31 +  relation_name = "initiative",
    4.32    selector = initiatives_selector,
    4.33    fields = fields,
    4.34    api_engine = api_engine
     5.1 --- a/app/main/index/_action/confirm_notify_email.lua	Wed May 26 15:47:52 2010 +0200
     5.2 +++ b/app/main/index/_action/confirm_notify_email.lua	Thu Jul 08 18:44:02 2010 +0200
     5.3 @@ -8,8 +8,10 @@
     5.4  
     5.5  if member then
     5.6    member.notify_email = member.notify_email_unconfirmed
     5.7 -  member.notify_email_unconfirmed = nil
     5.8 -  member.notify_email_secret = nil
     5.9 +  member.notify_email_unconfirmed   = nil
    5.10 +  member.notify_email_secret        = nil
    5.11 +  member.notify_email_secret_expiry = nil
    5.12 +  member.notify_email_lock_expiry   = nil
    5.13    member:save()
    5.14    slot.put_into("notice", _"Email address is confirmed now")
    5.15  else
     6.1 --- a/app/main/index/_updated_drafts.lua	Wed May 26 15:47:52 2010 +0200
     6.2 +++ b/app/main/index/_updated_drafts.lua	Thu Jul 08 18:44:02 2010 +0200
     6.3 @@ -1,8 +1,4 @@
     6.4 -local initiatives_selector = Initiative:new_selector()
     6.5 -  :join("issue", "_issue_state", "_issue_state.id = initiative.issue_id AND _issue_state.closed ISNULL AND _issue_state.fully_frozen ISNULL")
     6.6 -  :join("current_draft", "_current_draft", "_current_draft.initiative_id = initiative.id")
     6.7 -  :join("supporter", "supporter", { "supporter.member_id = ? AND supporter.initiative_id = initiative.id AND supporter.draft_id < _current_draft.id", app.session.member_id })
     6.8 -
     6.9 +local initiatives_selector = param.get("initiatives_selector", "table")
    6.10  if initiatives_selector:count() > 0 then
    6.11    ui.container{
    6.12      attr = { style = "font-weight: bold;" },
     7.1 --- a/app/main/initiative/_show.lua	Wed May 26 15:47:52 2010 +0200
     7.2 +++ b/app/main/initiative/_show.lua	Thu Jul 08 18:44:02 2010 +0200
     7.3 @@ -147,21 +147,23 @@
     7.4              new_draft_id = new_draft_id
     7.5            }
     7.6          }
     7.7 -        slot.put(" ")
     7.8 -        ui.link{
     7.9 -          text   = _"Refresh support to current draft",
    7.10 -          module = "initiative",
    7.11 -          action = "add_support",
    7.12 -          id     = initiative.id,
    7.13 -          routing = {
    7.14 -            default = {
    7.15 -              mode = "redirect",
    7.16 -              module = "initiative",
    7.17 -              view = "show",
    7.18 -              id = initiative.id
    7.19 +        if not initiative.revoked then
    7.20 +          slot.put(" ")
    7.21 +          ui.link{
    7.22 +            text   = _"Refresh support to current draft",
    7.23 +            module = "initiative",
    7.24 +            action = "add_support",
    7.25 +            id     = initiative.id,
    7.26 +            routing = {
    7.27 +              default = {
    7.28 +                mode = "redirect",
    7.29 +                module = "initiative",
    7.30 +                view = "show",
    7.31 +                id = initiative.id
    7.32 +              }
    7.33              }
    7.34            }
    7.35 -        }
    7.36 +        end
    7.37        end
    7.38      }
    7.39    end
     8.1 --- a/app/main/initiative/list_rss.lua	Wed May 26 15:47:52 2010 +0200
     8.2 +++ b/app/main/initiative/list_rss.lua	Thu Jul 08 18:44:02 2010 +0200
     8.3 @@ -79,13 +79,15 @@
     8.4  
     8.5  ui.tag{
     8.6    tag = "id",
     8.7 -  content = "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6"
     8.8 +--  content = "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6"
     8.9  }
    8.10  
    8.11 +--[[
    8.12  ui.tag{
    8.13    tag = "updated",
    8.14    content = "2003-12-14T10:20:09Z"
    8.15  }
    8.16 +--]]
    8.17  
    8.18  for i, initiative in ipairs(initiatives) do
    8.19    ui.tag{
     9.1 --- a/app/main/initiative/show.rss.lua	Wed May 26 15:47:52 2010 +0200
     9.2 +++ b/app/main/initiative/show.rss.lua	Thu Jul 08 18:44:02 2010 +0200
     9.3 @@ -14,19 +14,16 @@
     9.4    slot.put("</item>")
     9.5  end
     9.6  
     9.7 -
     9.8  local initiative = Initiative:by_id(param.get_id())
     9.9  
    9.10  rss_channel{
    9.11    title = initiative.name,
    9.12    description = initiative.current_draft.content,
    9.13    language = "de",
    9.14 -  copyright = initiative.current_draft.author.name,
    9.15 -  pubDate = "Tue, 8 Jul 2008 2:43:19"
    9.16  }
    9.17  
    9.18  for i, suggestion in ipairs(initiative.suggestions) do
    9.19 -  
    9.20 +
    9.21    local text = suggestion.name
    9.22  
    9.23    text = text .. " ("
    9.24 @@ -40,10 +37,7 @@
    9.25    rss_item{
    9.26      title = text,
    9.27      description = suggestion.content,
    9.28 -    link = "http://localhost/lf/suggestion/show/" .. tostring(suggestion.id) .. ".html",
    9.29 -    author = "",
    9.30 -    guid = "guid",
    9.31 -    pubDate = "Tue, 8 Jul 2008 2:43:19"
    9.32 +    link = request.get_base_url() .. "/lf/suggestion/show/" .. tostring(suggestion.id) .. ".html",
    9.33    }
    9.34  
    9.35  end
    9.36 \ No newline at end of file
    10.1 --- a/app/main/issue/_list.lua	Wed May 26 15:47:52 2010 +0200
    10.2 +++ b/app/main/issue/_list.lua	Thu Jul 08 18:44:02 2010 +0200
    10.3 @@ -76,7 +76,7 @@
    10.4  }
    10.5  
    10.6  
    10.7 -if param.get("filter") == "frozen" then
    10.8 +if app.session.member and param.get("filter") == "frozen" then
    10.9    filters[#filters+1] = {
   10.10      label = _"Filter",
   10.11      name = "filter_voting",
    11.1 --- a/app/main/member/_action/update.lua	Wed May 26 15:47:52 2010 +0200
    11.2 +++ b/app/main/member/_action/update.lua	Thu Jul 08 18:44:02 2010 +0200
    11.3 @@ -15,6 +15,12 @@
    11.4    "statement"
    11.5  )
    11.6  
    11.7 +if tostring(app.session.member.birthday) == "invalid_date" then
    11.8 +  app.session.member.birthday = nil
    11.9 +  slot.put_into("error", _"Date format is not valid. Please use following format: YYYY-MM-DD")
   11.10 +  return false
   11.11 +end
   11.12 +
   11.13  app.session.member:save()
   11.14  
   11.15  
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/app/main/member/_action/update_email.lua	Thu Jul 08 18:44:02 2010 +0200
    12.3 @@ -0,0 +1,33 @@
    12.4 +local resend = param.get("resend", atom.boolean)
    12.5 +
    12.6 +if app.session.member.notify_email_locked then
    12.7 +  if resend then
    12.8 +    slot.put_into("error", _"We have sent an email with activation link already in the last hour. Please try again later.")
    12.9 +  else
   12.10 +    slot.put_into("error", _"You can change your email address only once per hour. Please try again later.")
   12.11 +  end
   12.12 +  return false
   12.13 +end
   12.14 +
   12.15 +local email
   12.16 +if resend then
   12.17 +  email = app.session.member.notify_email_unconfirmed
   12.18 +else
   12.19 +  email = param.get("email")
   12.20 +end
   12.21 +
   12.22 +email = util.trim(email)
   12.23 +
   12.24 +if #email < 3 then 
   12.25 +  slot.put_into("error", _"This email address is too short!")
   12.26 +  return false
   12.27 +end
   12.28 +
   12.29 +local success = app.session.member:set_notify_email(email)
   12.30 +
   12.31 +if not success then
   12.32 +  slot.put_into("error", _"We couldn't deliver a confirmation mail to this address. Please check entered email address.")
   12.33 +  return false
   12.34 +end
   12.35 +
   12.36 +slot.put_into("notice", _"Your email address has been changed, please check for confirmation email with activation link!")
    13.1 --- a/app/main/member/_action/update_images.lua	Wed May 26 15:47:52 2010 +0200
    13.2 +++ b/app/main/member/_action/update_images.lua	Thu Jul 08 18:44:02 2010 +0200
    13.3 @@ -23,7 +23,8 @@
    13.4        local convert_func = config.member_image_convert_func[image_type]
    13.5        local data_scaled, err, status = convert_func(data)
    13.6        if status ~= 0 or data_scaled == nil then
    13.7 -      error("error while converting image")
    13.8 +        slot.put_into("error", _"Error while converting image. Please note, that only JPG files are supported!")
    13.9 +        return false
   13.10        end
   13.11  
   13.12        if not member_image then
    14.1 --- a/app/main/member/_action/update_name.lua	Wed May 26 15:47:52 2010 +0200
    14.2 +++ b/app/main/member/_action/update_name.lua	Thu Jul 08 18:44:02 2010 +0200
    14.3 @@ -2,11 +2,11 @@
    14.4  
    14.5  name = util.trim(name)
    14.6  
    14.7 -if #name < 3 then 
    14.8 -  slot.put_into(_error, _"This name is too short!")
    14.9 +if #name < 3 then
   14.10 +  slot.put_into("error", _"This name is too short!")
   14.11 +  return false
   14.12  end
   14.13  
   14.14 -
   14.15  app.session.member.name = name
   14.16  
   14.17  local db_error = app.session.member:try_save()
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/app/main/member/_email_unconfirmed.lua	Thu Jul 08 18:44:02 2010 +0200
    15.3 @@ -0,0 +1,49 @@
    15.4 +if app.session.member.notify_email_unconfirmed then
    15.5 +
    15.6 +  local current = Member:new_selector()
    15.7 +    :add_where{ "id = ?", app.session.member_id }
    15.8 +    :add_where("notify_email_unconfirmed NOTNULL")
    15.9 +    :add_where("notify_email_secret_expiry > now()")
   15.10 +    :optional_object_mode()
   15.11 +    :exec()
   15.12 +
   15.13 +  ui.heading{ level = 2, content = _"Notification address unconfirmed" }
   15.14 +
   15.15 +  if current then
   15.16 +    ui.tag{
   15.17 +      tag = "div",
   15.18 +      content = _("You didn't confirmed your email address '#{email}'. You have received an email with an activation link.", { email = app.session.member.notify_email_unconfirmed })
   15.19 +    }
   15.20 +  else
   15.21 +    ui.tag{
   15.22 +      tag = "div",
   15.23 +      content = _("You didn't confirmed your email address '#{email}' within 7 days.", { email = app.session.member.notify_email_unconfirmed })
   15.24 +    }
   15.25 +  end
   15.26 +  slot.put("<br />")
   15.27 +
   15.28 +  ui.link{
   15.29 +    text = _"Change email address",
   15.30 +    module = "member",
   15.31 +    view = "settings_email",
   15.32 +  }
   15.33 +  slot.put("<br />")
   15.34 +  slot.put("<br />")
   15.35 +
   15.36 +  ui.link{
   15.37 +    text = _("Resend activation email to '#{email}'", { email = app.session.member.notify_email_unconfirmed }),
   15.38 +    module = "member",
   15.39 +    action = "update_email",
   15.40 +    params = {
   15.41 +      resend = true
   15.42 +    },
   15.43 +    routing = {
   15.44 +      default = {
   15.45 +        mode = "redirect",
   15.46 +        module = "index",
   15.47 +        view = "index"
   15.48 +      }
   15.49 +    }
   15.50 +  }
   15.51 +
   15.52 +end
    16.1 --- a/app/main/member/_show_thumb.lua	Wed May 26 15:47:52 2010 +0200
    16.2 +++ b/app/main/member/_show_thumb.lua	Thu Jul 08 18:44:02 2010 +0200
    16.3 @@ -28,6 +28,14 @@
    16.4        attr = { class = "flags" },
    16.5        content = function()
    16.6  
    16.7 +        if not member.active then
    16.8 +          local text = _"Member is deactivated"
    16.9 +          ui.image{
   16.10 +            attr = { alt = text, title = text },
   16.11 +            static = "icons/16/cross.png"
   16.12 +          }
   16.13 +        end
   16.14 +
   16.15          if member.grade then
   16.16            ui.link{
   16.17              module = "vote",
    17.1 --- a/app/main/member/developer_settings.lua	Wed May 26 15:47:52 2010 +0200
    17.2 +++ b/app/main/member/developer_settings.lua	Thu Jul 08 18:44:02 2010 +0200
    17.3 @@ -1,4 +1,4 @@
    17.4 -slot.put_into("title", _"Developer features")
    17.5 +slot.put_into("title", _"Developer settings")
    17.6  
    17.7  slot.select("actions", function()
    17.8    ui.link{
    18.1 --- a/app/main/member/edit.lua	Wed May 26 15:47:52 2010 +0200
    18.2 +++ b/app/main/member/edit.lua	Thu Jul 08 18:44:02 2010 +0200
    18.3 @@ -29,7 +29,9 @@
    18.4      ui.field.text{ label = _"Organizational unit", name = "organizational_unit" }
    18.5      ui.field.text{ label = _"Internal posts", name = "internal_posts" }
    18.6      ui.field.text{ label = _"Real name", name = "realname" }
    18.7 -    ui.field.text{ label = _"Birthday" .. " YYYY-MM-DD ", name = "birthday" }
    18.8 +    ui.field.text{ label = _"Birthday" .. " YYYY-MM-DD ", name = "birthday", attr = { id = "profile_birthday" } }
    18.9 +    ui.script{ static = "gregor.js/gregor.js" }
   18.10 +    util.gregor("profile_birthday", "document.getElementById('timeline_search_date').form.submit();")
   18.11      ui.field.text{ label = _"Address", name = "address", multiline = true }
   18.12      ui.field.text{ label = _"email", name = "email" }
   18.13      ui.field.text{ label = _"xmpp", name = "xmpp_address" }
    19.1 --- a/app/main/member/settings.lua	Wed May 26 15:47:52 2010 +0200
    19.2 +++ b/app/main/member/settings.lua	Thu Jul 08 18:44:02 2010 +0200
    19.3 @@ -1,4 +1,3 @@
    19.4 -
    19.5  slot.put_into("title", _"Settings")
    19.6  
    19.7  slot.select("actions", function()
    19.8 @@ -10,125 +9,36 @@
    19.9      module = "index",
   19.10      view = "index"
   19.11    }
   19.12 -
   19.13 -  ui.link{
   19.14 -    content = function()
   19.15 -        ui.image{ static = "icons/16/wrench.png" }
   19.16 -        slot.put(_"Developer features")
   19.17 -    end,
   19.18 -    module = "member",
   19.19 -    view = "developer_settings"
   19.20 -  }
   19.21 -
   19.22  end)
   19.23  
   19.24 -ui.heading{ content = _"Display settings" }
   19.25 -util.help("member.settings.display", _"Display settings")
   19.26 +ui.tag{
   19.27 +  tag = "div",
   19.28 +  content = _"You can change the following settings:"
   19.29 +}
   19.30  
   19.31 -ui.form{
   19.32 -  attr = { class = "vertical" },
   19.33 -  module = "member",
   19.34 -  action = "update_display",
   19.35 -  routing = {
   19.36 -    ok = {
   19.37 -      mode = "redirect",
   19.38 -      module = "index",
   19.39 -      view = "index"
   19.40 -    }
   19.41 -  },
   19.42 -  content = function()
   19.43 -    ui.field.select{
   19.44 -      label = _"Type of tabs",
   19.45 -      foreign_records = {
   19.46 -        { id = "tabs",                     name = _"Tabs" },
   19.47 -        { id = "accordeon",                name = _"Accordion (none expanded)" .. " === " .. _"EXPERIMENTAL FEATURE" .. " ===" },
   19.48 -        { id = "accordeon_first_expanded", name = _"Accordion (first expanded)" .. " === " .. _"EXPERIMENTAL FEATURE" .. " ===" },
   19.49 ---        { id = "accordeon_all_expanded",   name = _"Accordion (all expanded)" }
   19.50 -      },
   19.51 -      foreign_id = "id",
   19.52 -      foreign_name = "name",
   19.53 -      name = "tab_mode",
   19.54 -      value = app.session.member:get_setting_value("tab_mode")
   19.55 -    }
   19.56 -    ui.field.select{
   19.57 -      label = _"Number of initiatives to preview",
   19.58 -      foreign_records = {
   19.59 -        { id =  3, name = "3" },
   19.60 -        { id =  4, name = "4" },
   19.61 -        { id =  5, name = "5" },
   19.62 -        { id =  6, name = "6" },
   19.63 -        { id =  7, name = "7" },
   19.64 -        { id =  8, name = "8" },
   19.65 -        { id =  9, name = "9" },
   19.66 -        { id = 10, name = "10" },
   19.67 -      },
   19.68 -      foreign_id = "id",
   19.69 -      foreign_name = "name",
   19.70 -      name = "initiatives_preview_limit",
   19.71 -      value = app.session.member:get_setting_value("initiatives_preview_limit")
   19.72 -    }
   19.73 -    ui.submit{ value = _"Change display settings" }
   19.74 -  end
   19.75 +local pages = {
   19.76 +  { view = "settings_display",   text = _"Display settings" },
   19.77 +  { view = "settings_email",     text = _"Change your notification email address" },
   19.78 +  { view = "settings_name",      text = _"Change your name" },
   19.79 +  { view = "settings_login",     text = _"Change your login" },
   19.80 +  { view = "settings_password",  text = _"Change your password" },
   19.81 +  { view = "developer_settings", text = _"Developer settings" },
   19.82  }
   19.83  
   19.84 -ui.heading{ content = _"Change your name" }
   19.85 -util.help("member.settings.name", _"Change name")
   19.86 -
   19.87 -ui.form{
   19.88 -  attr = { class = "vertical" },
   19.89 -  module = "member",
   19.90 -  action = "update_name",
   19.91 -  routing = {
   19.92 -    ok = {
   19.93 -      mode = "redirect",
   19.94 -      module = "index",
   19.95 -      view = "index"
   19.96 +ui.list{
   19.97 +  attr = { class = "menu_list" },
   19.98 +  style = "ulli",
   19.99 +  records = pages,
  19.100 +  columns = {
  19.101 +    {
  19.102 +      content = function(page)
  19.103 +        ui.link{
  19.104 +          module = "member",
  19.105 +          view = page.view,
  19.106 +          text = page.text
  19.107 +        }
  19.108 +      end
  19.109      }
  19.110 -  },
  19.111 -  content = function()
  19.112 -    ui.field.text{ label = _"Name", name = "name", value = app.session.member.name }
  19.113 -    ui.submit{ value = _"Change name" }
  19.114 -  end
  19.115 +  }
  19.116  }
  19.117  
  19.118 -ui.heading{ content = _"Change your login" }
  19.119 -util.help("member.settings.login", _"Change login")
  19.120 -
  19.121 -ui.form{
  19.122 -  attr = { class = "vertical" },
  19.123 -  module = "member",
  19.124 -  action = "update_login",
  19.125 -  routing = {
  19.126 -    ok = {
  19.127 -      mode = "redirect",
  19.128 -      module = "index",
  19.129 -      view = "index"
  19.130 -    }
  19.131 -  },
  19.132 -  content = function()
  19.133 -    ui.field.text{ label = _"Login", name = "login", value = app.session.member.login }
  19.134 -    ui.submit{ value = _"Change login" }
  19.135 -  end
  19.136 -}
  19.137 -
  19.138 -ui.heading{ content = _"Change your password" }
  19.139 -util.help("member.settings.password", _"Change password")
  19.140 -
  19.141 -ui.form{
  19.142 -  attr = { class = "vertical" },
  19.143 -  module = "member",
  19.144 -  action = "update_password",
  19.145 -  routing = {
  19.146 -    ok = {
  19.147 -      mode = "redirect",
  19.148 -      module = "index",
  19.149 -      view = "index"
  19.150 -    }
  19.151 -  },
  19.152 -  content = function()
  19.153 -    ui.field.password{ label = _"Old password", name = "old_password" }
  19.154 -    ui.field.password{ label = _"New password", name = "new_password1" }
  19.155 -    ui.field.password{ label = _"Repeat new password", name = "new_password2" }
  19.156 -    ui.submit{ value = _"Change password" }
  19.157 -  end
  19.158 -}
  19.159 \ No newline at end of file
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/app/main/member/settings_display.lua	Thu Jul 08 18:44:02 2010 +0200
    20.3 @@ -0,0 +1,61 @@
    20.4 +slot.put_into("title", _"Display settings")
    20.5 +
    20.6 +slot.select("actions", function()
    20.7 +  ui.link{
    20.8 +    content = function()
    20.9 +        ui.image{ static = "icons/16/cancel.png" }
   20.10 +        slot.put(_"Cancel")
   20.11 +    end,
   20.12 +    module = "member",
   20.13 +    view = "settings"
   20.14 +  }
   20.15 +end)
   20.16 +
   20.17 +
   20.18 +util.help("member.settings.display", _"Display settings")
   20.19 +
   20.20 +ui.form{
   20.21 +  attr = { class = "vertical" },
   20.22 +  module = "member",
   20.23 +  action = "update_display",
   20.24 +  routing = {
   20.25 +    ok = {
   20.26 +      mode = "redirect",
   20.27 +      module = "index",
   20.28 +      view = "index"
   20.29 +    }
   20.30 +  },
   20.31 +  content = function()
   20.32 +    ui.field.select{
   20.33 +      label = _"Type of tabs",
   20.34 +      foreign_records = {
   20.35 +        { id = "tabs",                     name = _"Tabs" },
   20.36 +        { id = "accordeon",                name = _"Accordion (none expanded)" .. " === " .. _"EXPERIMENTAL FEATURE" .. " ===" },
   20.37 +        { id = "accordeon_first_expanded", name = _"Accordion (first expanded)" .. " === " .. _"EXPERIMENTAL FEATURE" .. " ===" },
   20.38 +--        { id = "accordeon_all_expanded",   name = _"Accordion (all expanded)" }
   20.39 +      },
   20.40 +      foreign_id = "id",
   20.41 +      foreign_name = "name",
   20.42 +      name = "tab_mode",
   20.43 +      value = app.session.member:get_setting_value("tab_mode")
   20.44 +    }
   20.45 +    ui.field.select{
   20.46 +      label = _"Number of initiatives to preview",
   20.47 +      foreign_records = {
   20.48 +        { id =  3, name = "3" },
   20.49 +        { id =  4, name = "4" },
   20.50 +        { id =  5, name = "5" },
   20.51 +        { id =  6, name = "6" },
   20.52 +        { id =  7, name = "7" },
   20.53 +        { id =  8, name = "8" },
   20.54 +        { id =  9, name = "9" },
   20.55 +        { id = 10, name = "10" },
   20.56 +      },
   20.57 +      foreign_id = "id",
   20.58 +      foreign_name = "name",
   20.59 +      name = "initiatives_preview_limit",
   20.60 +      value = app.session.member:get_setting_value("initiatives_preview_limit")
   20.61 +    }
   20.62 +    ui.submit{ value = _"Change display settings" }
   20.63 +  end
   20.64 +}
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/app/main/member/settings_email.lua	Thu Jul 08 18:44:02 2010 +0200
    21.3 @@ -0,0 +1,38 @@
    21.4 +slot.put_into("title", _"Change your notification email address")
    21.5 +
    21.6 +slot.select("actions", function()
    21.7 +  ui.link{
    21.8 +    content = function()
    21.9 +        ui.image{ static = "icons/16/cancel.png" }
   21.10 +        slot.put(_"Cancel")
   21.11 +    end,
   21.12 +    module = "member",
   21.13 +    view = "settings"
   21.14 +  }
   21.15 +end)
   21.16 +
   21.17 +util.help("member.settings.email_address", _"Change email")
   21.18 +
   21.19 +ui.form{
   21.20 +  attr = { class = "vertical" },
   21.21 +  module = "member",
   21.22 +  action = "update_email",
   21.23 +  routing = {
   21.24 +    ok = {
   21.25 +      mode = "redirect",
   21.26 +      module = "index",
   21.27 +      view = "index"
   21.28 +    }
   21.29 +  },
   21.30 +  content = function()
   21.31 +    if app.session.member.notify_email then
   21.32 +      ui.field.text{ label = _"Confirmed address", value = app.session.member.notify_email, readonly = true }
   21.33 +    end
   21.34 +    if app.session.member.notify_email_unconfirmed then
   21.35 +      ui.field.text{ label = _"Unconfirmed address", value = app.session.member.notify_email_unconfirmed, readonly = true }
   21.36 +    end
   21.37 +    ui.field.text{ label = _"New address", name = "email" }
   21.38 +    ui.submit{ value = _"Change email" }
   21.39 +  end
   21.40 +}
   21.41 +
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/app/main/member/settings_login.lua	Thu Jul 08 18:44:02 2010 +0200
    22.3 @@ -0,0 +1,32 @@
    22.4 +slot.put_into("title", _"Change your login")
    22.5 +
    22.6 +slot.select("actions", function()
    22.7 +  ui.link{
    22.8 +    content = function()
    22.9 +        ui.image{ static = "icons/16/cancel.png" }
   22.10 +        slot.put(_"Cancel")
   22.11 +    end,
   22.12 +    module = "member",
   22.13 +    view = "settings"
   22.14 +  }
   22.15 +end)
   22.16 +
   22.17 +util.help("member.settings.login", _"Change login")
   22.18 +
   22.19 +ui.form{
   22.20 +  attr = { class = "vertical" },
   22.21 +  module = "member",
   22.22 +  action = "update_login",
   22.23 +  routing = {
   22.24 +    ok = {
   22.25 +      mode = "redirect",
   22.26 +      module = "index",
   22.27 +      view = "index"
   22.28 +    }
   22.29 +  },
   22.30 +  content = function()
   22.31 +    ui.field.text{ label = _"Login", name = "login", value = app.session.member.login }
   22.32 +    ui.submit{ value = _"Change login" }
   22.33 +  end
   22.34 +}
   22.35 +
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/app/main/member/settings_name.lua	Thu Jul 08 18:44:02 2010 +0200
    23.3 @@ -0,0 +1,31 @@
    23.4 +slot.put_into("title", _"Change your name")
    23.5 +
    23.6 +slot.select("actions", function()
    23.7 +  ui.link{
    23.8 +    content = function()
    23.9 +        ui.image{ static = "icons/16/cancel.png" }
   23.10 +        slot.put(_"Cancel")
   23.11 +    end,
   23.12 +    module = "member",
   23.13 +    view = "settings"
   23.14 +  }
   23.15 +end)
   23.16 +
   23.17 +util.help("member.settings.name", _"Change name")
   23.18 +
   23.19 +ui.form{
   23.20 +  attr = { class = "vertical" },
   23.21 +  module = "member",
   23.22 +  action = "update_name",
   23.23 +  routing = {
   23.24 +    ok = {
   23.25 +      mode = "redirect",
   23.26 +      module = "index",
   23.27 +      view = "index"
   23.28 +    }
   23.29 +  },
   23.30 +  content = function()
   23.31 +    ui.field.text{ label = _"Name", name = "name", value = app.session.member.name }
   23.32 +    ui.submit{ value = _"Change name" }
   23.33 +  end
   23.34 +}
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/app/main/member/settings_password.lua	Thu Jul 08 18:44:02 2010 +0200
    24.3 @@ -0,0 +1,33 @@
    24.4 +slot.put_into("title", _"Change your password")
    24.5 +
    24.6 +slot.select("actions", function()
    24.7 +  ui.link{
    24.8 +    content = function()
    24.9 +        ui.image{ static = "icons/16/cancel.png" }
   24.10 +        slot.put(_"Cancel")
   24.11 +    end,
   24.12 +    module = "member",
   24.13 +    view = "settings"
   24.14 +  }
   24.15 +end)
   24.16 +
   24.17 +util.help("member.settings.password", _"Change password")
   24.18 +
   24.19 +ui.form{
   24.20 +  attr = { class = "vertical" },
   24.21 +  module = "member",
   24.22 +  action = "update_password",
   24.23 +  routing = {
   24.24 +    ok = {
   24.25 +      mode = "redirect",
   24.26 +      module = "index",
   24.27 +      view = "index"
   24.28 +    }
   24.29 +  },
   24.30 +  content = function()
   24.31 +    ui.field.password{ label = _"Old password", name = "old_password" }
   24.32 +    ui.field.password{ label = _"New password", name = "new_password1" }
   24.33 +    ui.field.password{ label = _"Repeat new password", name = "new_password2" }
   24.34 +    ui.submit{ value = _"Change password" }
   24.35 +  end
   24.36 +}
   24.37 \ No newline at end of file
    25.1 --- a/app/main/member/show.lua	Wed May 26 15:47:52 2010 +0200
    25.2 +++ b/app/main/member/show.lua	Thu Jul 08 18:44:02 2010 +0200
    25.3 @@ -14,8 +14,15 @@
    25.4  slot.put_into("title", encode.html(_"Member '#{member}'":gsub("#{member}", member.name)))
    25.5  
    25.6  slot.select("actions", function()
    25.7 -  if member.id == app.session.member.id then
    25.8 -  else
    25.9 +  if not (member.id == app.session.member.id) then
   25.10 +if not member.active then
   25.11 +  ui.tag{
   25.12 +    tag = "div",
   25.13 +    attr = { class = "interest deactivated_member_info" },
   25.14 +    content = _"This member is deactivated."
   25.15 +  }
   25.16 +  slot.put(" ")
   25.17 +end
   25.18      --TODO performance
   25.19      local contact = Contact:by_pk(app.session.member.id, member.id)
   25.20      if contact then
   25.21 @@ -39,7 +46,7 @@
   25.22            }
   25.23          }
   25.24        }
   25.25 -    else
   25.26 +    elseif member.active then
   25.27        ui.link{
   25.28          image   = { static = "icons/16/book_add.png" },
   25.29          text    = _"Add to my contacts",
    26.1 --- a/app/main/member/show_tab.lua	Wed May 26 15:47:52 2010 +0200
    26.2 +++ b/app/main/member/show_tab.lua	Thu Jul 08 18:44:02 2010 +0200
    26.3 @@ -19,6 +19,18 @@
    26.4  
    26.5  if show_as_homepage and app.session.member_id == member.id then
    26.6  
    26.7 +  if app.session.member.notify_email_unconfirmed then
    26.8 +    tabs[#tabs+1] = {
    26.9 +      class = "yellow",
   26.10 +      name = "email_unconfirmed",
   26.11 +      label = _"Email unconfirmed",
   26.12 +      icon = { static = "icons/16/bell.png" },
   26.13 +      module = "member",
   26.14 +      view = "_email_unconfirmed",
   26.15 +      params = {}
   26.16 +    }
   26.17 +  end
   26.18 +
   26.19    if config.motd_intern then
   26.20      tabs[#tabs+1] = {
   26.21        class = "yellow",
   26.22 @@ -93,6 +105,7 @@
   26.23      :join("issue", "_issue_state", "_issue_state.id = initiative.issue_id AND _issue_state.closed ISNULL AND _issue_state.fully_frozen ISNULL")
   26.24      :join("current_draft", "_current_draft", "_current_draft.initiative_id = initiative.id")
   26.25      :join("supporter", "supporter", { "supporter.member_id = ? AND supporter.initiative_id = initiative.id AND supporter.draft_id < _current_draft.id", app.session.member_id })
   26.26 +    :add_where("initiative.revoked ISNULL")
   26.27  
   26.28    if updated_drafts_selector:count() > 0 then
   26.29      tabs[#tabs+1] = {
    27.1 --- a/config/default.lua	Wed May 26 15:47:52 2010 +0200
    27.2 +++ b/config/default.lua	Thu Jul 08 18:44:02 2010 +0200
    27.3 @@ -1,5 +1,5 @@
    27.4  config.app_name = "LiquidFeedback"
    27.5 -config.app_version = "beta18"
    27.6 +config.app_version = "beta19"
    27.7  
    27.8  config.app_title = config.app_name .. " (" .. request.get_config_name() .. " environment)"
    27.9  
   27.10 @@ -32,7 +32,7 @@
   27.11  
   27.12  config.api_enabled = false
   27.13  
   27.14 -config.feature_rss_enabled = true
   27.15 +config.feature_rss_enabled = false -- feature is broken
   27.16  
   27.17  -- OpenID authentication is not fully implemented yet, DO NOT USE BEFORE THIS NOTICE HAS BEEN REMOVED!
   27.18  config.auth_openid_enabled = false
    28.1 --- a/env/util/autoapi.lua	Wed May 26 15:47:52 2010 +0200
    28.2 +++ b/env/util/autoapi.lua	Thu Jul 08 18:44:02 2010 +0200
    28.3 @@ -1,11 +1,12 @@
    28.4  function util.autoapi_xml(args)
    28.5 +  local relation_name = assert(args.relation_name)
    28.6    local selector = assert(args.selector)
    28.7    local fields = assert(args.fields)
    28.8    local rows = selector:exec()
    28.9 -  slot.set_layout("xml")
   28.10 -  slot.put("<initiative_list>\n")
   28.11 +  slot.set_layout("xml", "application/xml")
   28.12 +  slot.put("<", relation_name, "_list>\n")
   28.13    for i_row, row in ipairs(rows) do
   28.14 -    slot.put("  <initiative>\n")
   28.15 +    slot.put("  <", relation_name, ">\n")
   28.16      for i_field, field in ipairs(fields) do
   28.17        slot.put("    <", field.name, ">")
   28.18        local value
   28.19 @@ -21,36 +22,44 @@
   28.20        end
   28.21        slot.put("</", field.name, ">\n")
   28.22      end
   28.23 -    slot.put("  </initiative>\n")
   28.24 +    slot.put("  </", relation_name, ">\n")
   28.25    end
   28.26 -  slot.put("</initiative_list>\n")
   28.27 +  slot.put("</", relation_name, "_list>\n")
   28.28  end
   28.29  
   28.30  function util.autoapi_json(args)
   28.31 -  slot.set_layout("blank")
   28.32 +  slot.set_layout("blank", "application/json")
   28.33    local selector = assert(args.selector)
   28.34    local fields = assert(args.fields)
   28.35    local rows = selector:exec()
   28.36 -  slot.put("{\n")
   28.37 +  slot.put("[\n")
   28.38    for i_row, row in ipairs(rows) do
   28.39      slot.put("  {\n")
   28.40      for i_field, field in ipairs(fields) do
   28.41 -      slot.put("    ", field.name, ": ")
   28.42 +      slot.put("    \"", field.name, "\": ")
   28.43        local value
   28.44        if field.func then
   28.45          value = field.func(row)
   28.46        elseif field.field then
   28.47          value = row[field.name]
   28.48        end
   28.49 -        slot.put(encode.json(value))
   28.50 -      slot.put(",\n")
   28.51 +      slot.put(encode.json(value))
   28.52 +      if i_field < #fields then
   28.53 +        slot.put(",")
   28.54 +      end
   28.55 +      slot.put("\n")
   28.56      end
   28.57 -    slot.put("  },\n")
   28.58 +    slot.put("  }")
   28.59 +    if i_row < #rows then
   28.60 +      slot.put(",")
   28.61 +    end
   28.62 +    slot.put("\n")
   28.63    end
   28.64 -  slot.put("}\n")
   28.65 +  slot.put("]\n")
   28.66  end
   28.67  
   28.68  function util.autoapi(args)
   28.69 +  local relation_name = assert(args.relation_name)
   28.70    local selector = assert(args.selector)
   28.71    local fields = assert(args.fields)
   28.72    local api_engine = assert(args.api_engine)
   28.73 @@ -65,6 +74,7 @@
   28.74  
   28.75    if api_engine == "xml" then
   28.76      util.autoapi_xml{
   28.77 +      relation_name = relation_name,
   28.78        selector = selector,
   28.79        fields = fields
   28.80      }
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/locale/help/member.settings.email_address.de.txt	Thu Jul 08 18:44:02 2010 +0200
    29.3 @@ -0,0 +1,1 @@
    29.4 +Diese E-Mail-Adresse kann für automatische Nachrichten des Systems sowie für die Kontaktaufnahme durch die Administratoren verwendet werden und wird anderen Benutzern nicht angezeigt. Wenn Du die Adresse änderst, erhälts Du eine E-Mail mit einem Bestätigungslink, den du anklicken musst.
    32.1 --- a/locale/translations.de.lua	Wed May 26 15:47:52 2010 +0200
    32.2 +++ b/locale/translations.de.lua	Thu Jul 08 18:44:02 2010 +0200
    32.3 @@ -77,6 +77,8 @@
    32.4  ["Change API key"] = "API-Schlüssel ändern";
    32.5  ["Change area delegation"] = "Delegation für Themenbereich ändern";
    32.6  ["Change display settings"] = "Anzeige-Einstellungen ändern";
    32.7 +["Change email"] = "E-Mail-Adresse ändern";
    32.8 +["Change email address"] = "E-Mail-Adresse ändern";
    32.9  ["Change filters and order"] = "Filter und Sortierung ändern";
   32.10  ["Change global delegation"] = "Globale Delegation ändern";
   32.11  ["Change issue delegation"] = "Delegation für Thema ändern";
   32.12 @@ -87,6 +89,7 @@
   32.13  ["Change vote"] = "Abstimmung ändern";
   32.14  ["Change your login"] = "Deinen Anmeldenamen ändern";
   32.15  ["Change your name"] = "Deinen Namen ändern";
   32.16 +["Change your notification email address"] = "Deine E-Mail-Adresse für Benachrichtigungen ändern";
   32.17  ["Change your password"] = "Dein Kennwort ändern";
   32.18  ["Choose initiator"] = "Initiator auswählen";
   32.19  ["Choose member"] = "Mitglied auswählen";
   32.20 @@ -98,6 +101,7 @@
   32.21  ["Confirm"] = "Bestätigen";
   32.22  ["Confirmation code"] = "Bestätigungscode";
   32.23  ["Confirmation code invalid!"] = "Bestätigungscode ist ungültig!";
   32.24 +["Confirmed address"] = "Bestätigte E-Mail";
   32.25  ["Contacts"] = "Kontakte";
   32.26  ["Content"] = "Inhalt";
   32.27  ["Counting of votes"] = "Auszählung";
   32.28 @@ -109,13 +113,14 @@
   32.29  ["Current votings in areas you are member of and issues you are interested in:"] = "Jetzt laufende Abstimmungen zu Themen aus Deinen Themenbereichen oder solchen an denen Du interessiert bist:";
   32.30  ["Currently no API key is set."] = "Zur Zeit ist kein API-Schlüssel festgelegt.";
   32.31  ["Date"] = "Datum";
   32.32 +["Date format is not valid. Please use following format: YYYY-MM-DD"] = "Datumsformat nicht korrekt. Bitte verwende: JJJJ-MM-TT, also z.B. 1945-05-23";
   32.33  ["Degree"] = "Grad";
   32.34  ["Delegations"] = "Delegationen";
   32.35  ["Delete API key"] = "API-Schlüssel löschen";
   32.36  ["Delete filter"] = "Filter löschen";
   32.37  ["Description"] = "Beschreibung";
   32.38  ["Details"] = "Details";
   32.39 -["Developer features"] = "Entwicklerfunktionen";
   32.40 +["Developer settings"] = "Einstellungen für Entwickler";
   32.41  ["Diff"] = "Differenz";
   32.42  ["Direct member count"] = "Anzahl Direktmitglieder";
   32.43  ["Direct membership"] = "Direkte Mitgliedschaft";
   32.44 @@ -149,7 +154,9 @@
   32.45  ["Email address is confirmed now"] = "E-Mail-Adresse ist jetzt bestätigt";
   32.46  ["Email address too short!"] = "E-Mail-Adresse ist zu kurz!";
   32.47  ["Email confirmation request"] = "Bestätigung Deiner E-Mail-Adresse";
   32.48 +["Email unconfirmed"] = "Unbestätigte E-Mail-Adresse";
   32.49  ["Empty help text: #{id}.#{lang}.txt"] = "Leerer Hilfe-Text: #{id}.#{lang}.txt";
   32.50 +["Error while converting image. Please note, that only JPG files are supported!"] = "Fehler beim Konvertieren des Bilds. Bitte beachte, dass nur JPG-Dateien unterstützt werden.";
   32.51  ["Error while resolving openid. Internal message: '#{errmsg}'"] = "Fehler beim Auflösen der OpenID. Interne Fehlermeldung: '#{errmsg}'";
   32.52  ["Error while updating member, database reported:<br /><br /> (#{errormessage})"] = "Fehler beim aktualisieren des Mitglieds, die Datenbank berichtet folgenden Fehler:<br /><br /> (#{errormessage})";
   32.53  ["External memberships"] = "Externe Mitgliedschaften";
   32.54 @@ -180,8 +187,8 @@
   32.55  ["In discussion"] = "In Diskussion";
   32.56  ["Incoming delegations"] = "Eingehende Delegationen";
   32.57  ["Information about the available policies"] = "Informationen zu den verfügbaren Regelwerken";
   32.58 -["Initiated"] = "Initiert";
   32.59 -["Initiated initiatives"] = "Initierte Initiativen";
   32.60 +["Initiated"] = "Initiiert";
   32.61 +["Initiated initiatives"] = "Initiierte Initiativen";
   32.62  ["Initiative events"] = "Initiativen-Ereignisse";
   32.63  ["Initiative is revoked now"] = "Initiative ist jetzt zurückgezogen";
   32.64  ["Initiative quorum"] = "Quorum Inititive";
   32.65 @@ -216,7 +223,7 @@
   32.66  ["Issue canceled"] = "Thema abgebrochen";
   32.67  ["Issue delegation"] = "Issue-Delegation";
   32.68  ["Issue delegation active"] = "Delegation für Thema aktiv";
   32.69 -["Issue events"] = "Themen-Ergeignisse";
   32.70 +["Issue events"] = "Themen-Ereignisse";
   32.71  ["Issue finished"] = "Thema abgeschlossen";
   32.72  ["Issue finished without voting"] = "Thema ohne Abstimmung abgeschlossen";
   32.73  ["Issue frozen"] = "Thema eingefroren";
   32.74 @@ -250,6 +257,7 @@
   32.75  ["Member has not approved latest draft"] = "Mitglied hat den letzten Entwurf noch nicht angenommen";
   32.76  ["Member is administrator"] = "Mitglied ist Administrator";
   32.77  ["Member is already saved in your contacts!"] = "Mitglied ist schon in Deinen Kontakten!";
   32.78 +["Member is deactivated"] = "Mitglied ist deaktiviert";
   32.79  ["Member is now invited to be initiator"] = "Mitglied ist jetzt als Initiator eingeladen";
   32.80  ["Member list"] = "Mitgliederliste";
   32.81  ["Member name"] = "Mitglied Name";
   32.82 @@ -275,6 +283,7 @@
   32.83  ["My opinion"] = "Meine Meinung";
   32.84  ["Name"] = "Name";
   32.85  ["New"] = "Neu";
   32.86 +["New address"] = "Neue E-Mail-Adresse";
   32.87  ["New draft"] = "Neuer Entwurf";
   32.88  ["New draft has been added to initiative"] = "Neuer Entwurf wurde der Initiative hinzugefügt";
   32.89  ["New draft revision"] = "Neue Revision des Entwurfs";
   32.90 @@ -302,6 +311,7 @@
   32.91  ["Not voted (revoked from initiator)"] = "Nicht abgestimmt (durch Initiator zurückgezogen)";
   32.92  ["Not voted issues"] = "Nicht abgestimmt";
   32.93  ["Not yet voted"] = "Noch abzustimmen";
   32.94 +["Notification address unconfirmed"] = "E-Mail-Adresse für Benachrichtigungen unbestätigt";
   32.95  ["Number of incoming delegations, follow link to see more details"] = "Anzahl eingehender Delegationen, Link folgen für mehr Details";
   32.96  ["Number of initiatives to preview"] = "Anzahl der Initiativen in der Vorschau";
   32.97  ["OK"] = "OK";
   32.98 @@ -378,6 +388,7 @@
   32.99  ["Remove my support from this initiative"] = "Meine Unterstützung der Initiative entziehen";
  32.100  ["Repeat new password"] = "Neues Kennwort wiederholen";
  32.101  ["Request password reset link"] = "Link zum Rücksetzen des Kennworts anfordern";
  32.102 +["Resend activation email to '#{email}'"] = "E-Mail mit Aktivierungslink erneut an '#{email}' senden";
  32.103  ["Reset code"] = "Rücksetzcode";
  32.104  ["Reset code is invalid!"] = "Rücksetzcode ist ungültig";
  32.105  ["Reset link has been send for this member"] = "Rücksetz-Link wurde versendet";
  32.106 @@ -457,6 +468,7 @@
  32.107  ["The initiators suggest to support the following initiative:"] = "Die Initiatoren empfehlen folgende Initiative zu unterstützen:";
  32.108  ["There are no more alternative initiatives currently."] = "Es gibt zur Zeit keine weiteren alternative Initiative.";
  32.109  ["There were no more alternative initiatives."] = "Es gab keine weiteren alternativen Initiativen.";
  32.110 +["This email address is too short!"] = "Diese E-Mail-Adresse ist zu kurz!";
  32.111  ["This identifier is not allowed for this instance."] = "Dieser Identifier ist für diese Instanz nicht zugelassen.";
  32.112  ["This initiative"] = "Diese Initiative";
  32.113  ["This initiative compared to alternative initiatives"] = "Diese Initiative im Vergleich zu alternativen Initiativen";
  32.114 @@ -475,6 +487,7 @@
  32.115  ["This member has rejected to become initiator of this initiative"] = "Dieses Mitglied hat die Einladung, Initiator zu werden, abgelehnt";
  32.116  ["This member is already initiator of this initiative"] = "Dieses Mitglied ist bereits Initiator dieser Initiative";
  32.117  ["This member is already invited to become initiator of this initiative"] = "Dieses Mitglied ist bereits eingeladen Initiator dieser Initiative zu werden";
  32.118 +["This member is deactivated."] = "Dieses Mitglied ist deaktiviert.";
  32.119  ["This member is participating, the rest of delegation chain is suspended while discussing"] = "Dieses Mitglied partizipiert, Rest der Delegationskette während der Diskussion ausgesetzt.";
  32.120  ["This name is already taken, please choose another one!"] = "Dieser Name ist bereits vergeben, bitte wähle einen anderen!";
  32.121  ["This name is really too short!"] = "Dieser Name ist wirklich zu kurz!";
  32.122 @@ -493,6 +506,7 @@
  32.123  ["Trustee"] = "Bevollmächtigter";
  32.124  ["Tuesday"] = "Dienstag";
  32.125  ["Type of tabs"] = "Tabulatortyp";
  32.126 +["Unconfirmed address"] = "Unbestätigte E-Mail";
  32.127  ["Unknown author"] = "Unbekannter Autor";
  32.128  ["Updated drafts"] = "Neue Entwürfe";
  32.129  ["Upload images"] = "Bilder hochladen";
  32.130 @@ -515,6 +529,8 @@
  32.131  ["Voting request updated"] = "Abstimmungswunsch aktualisiert";
  32.132  ["Voting started"] = "Abstimmung begonnen";
  32.133  ["Voting time"] = "Zeit für die Abstimmung";
  32.134 +["We couldn't deliver a confirmation mail to this address. Please check entered email address."] = "Wir konnten keine Bestätigungs-E-Mail versenden. Bitte überprüfe die E-Mail-Adresse.";
  32.135 +["We have sent an email with activation link already in the last hour. Please try again later."] = "Wir haben bereits innerhalb der letzten Stunde eine E-Mail mit Bestätigungslink gesendet. Bitte versuche es später erneut.";
  32.136  ["Website"] = "Webseite";
  32.137  ["Wednesday"] = "Mittwoch";
  32.138  ["Wiki engine"] = "Wiki engine";
  32.139 @@ -531,7 +547,11 @@
  32.140  ["You are now initiator of this initiative"] = "Du bist jetzt Initiator dieser Initiative";
  32.141  ["You are potential supporter of this initiative"] = "Du bist potentieller Unterstützer dieser Initiative";
  32.142  ["You are supporting this initiative"] = "Du unterstützt diese Initiative";
  32.143 +["You can change the following settings:"] = "Du kannst die folgenden Einstellungen vornehmen:";
  32.144 +["You can change your email address only once per hour. Please try again later."] = "Du kannst die E-Mail-Adresse nur einmal in der Stunde ändern, bitte versuche es später erneut.";
  32.145  ["You can't suggest the initiative you are revoking"] = "Du kannst nicht die Initiative empfehlen, die Du löschen möchtest";
  32.146 +["You didn't confirmed your email address '#{email}' within 7 days."] = "Du hast die E-Mail-Adresse '#{email}' nicht innerhalb von 7 Tagen bestätigt.";
  32.147 +["You didn't confirmed your email address '#{email}'. You have received an email with an activation link."] = "Du hast die E-Mail-Adresse '#{email}' nicht bestätigt. Du hast hierzu eine E-Mail mit einem Aktivierungslink erhalten.";
  32.148  ["You didn't saved any member as contact yet."] = "Du hast noch kein Mitglied als Kontakt gespeichert!";
  32.149  ["You have saved this member as contact"] = "Du hast das Mitglied als Kontakt gespeichert";
  32.150  ["You have saved this member as contact."] = "Du hast das Mitglied als Kontakt gespeichert.";
  32.151 @@ -549,6 +569,7 @@
  32.152  ["Your delegation for this issue has been deleted."] = "Deine Delegation für dieses Thema wurde gelöscht";
  32.153  ["Your delegation for this issue has been updated."] = "Deine Delegation für dieses Thema wurde geändert";
  32.154  ["Your display settings have been updated"] = "Deine Anzeige-Einstellungen wurden aktualisiert";
  32.155 +["Your email address has been changed, please check for confirmation email with activation link!"] = "Deine E-Mail-Adresse wurde geändert, du hast eine Bestätigungs-E-Mail mit Aktivierungslink erhalten.";
  32.156  ["Your global delegation has been deleted."] = "Deine globale Delegation wurde gelöscht";
  32.157  ["Your global delegation has been updated."] = "Deine globale Delegation wurde geändert";
  32.158  ["Your login has been changed to '#{login}'"] = "Dein Anmeldename wurde auf '#{login}' geändert";
    33.1 --- a/locale/translations.en.lua	Wed May 26 15:47:52 2010 +0200
    33.2 +++ b/locale/translations.en.lua	Thu Jul 08 18:44:02 2010 +0200
    33.3 @@ -77,6 +77,8 @@
    33.4  ["Change API key"] = false;
    33.5  ["Change area delegation"] = false;
    33.6  ["Change display settings"] = false;
    33.7 +["Change email"] = false;
    33.8 +["Change email address"] = false;
    33.9  ["Change filters and order"] = false;
   33.10  ["Change global delegation"] = false;
   33.11  ["Change issue delegation"] = false;
   33.12 @@ -87,6 +89,7 @@
   33.13  ["Change vote"] = false;
   33.14  ["Change your login"] = false;
   33.15  ["Change your name"] = false;
   33.16 +["Change your notification email address"] = false;
   33.17  ["Change your password"] = false;
   33.18  ["Choose initiator"] = false;
   33.19  ["Choose member"] = false;
   33.20 @@ -98,6 +101,7 @@
   33.21  ["Confirm"] = false;
   33.22  ["Confirmation code"] = false;
   33.23  ["Confirmation code invalid!"] = false;
   33.24 +["Confirmed address"] = false;
   33.25  ["Contacts"] = false;
   33.26  ["Content"] = false;
   33.27  ["Counting of votes"] = false;
   33.28 @@ -109,13 +113,14 @@
   33.29  ["Current votings in areas you are member of and issues you are interested in:"] = false;
   33.30  ["Currently no API key is set."] = false;
   33.31  ["Date"] = false;
   33.32 +["Date format is not valid. Please use following format: YYYY-MM-DD"] = false;
   33.33  ["Degree"] = false;
   33.34  ["Delegations"] = false;
   33.35  ["Delete API key"] = false;
   33.36  ["Delete filter"] = false;
   33.37  ["Description"] = false;
   33.38  ["Details"] = false;
   33.39 -["Developer features"] = false;
   33.40 +["Developer settings"] = false;
   33.41  ["Diff"] = false;
   33.42  ["Direct member count"] = false;
   33.43  ["Direct membership"] = false;
   33.44 @@ -149,7 +154,9 @@
   33.45  ["Email address is confirmed now"] = false;
   33.46  ["Email address too short!"] = false;
   33.47  ["Email confirmation request"] = false;
   33.48 +["Email unconfirmed"] = false;
   33.49  ["Empty help text: #{id}.#{lang}.txt"] = false;
   33.50 +["Error while converting image. Please note, that only JPG files are supported!"] = false;
   33.51  ["Error while resolving openid. Internal message: '#{errmsg}'"] = false;
   33.52  ["Error while updating member, database reported:<br /><br /> (#{errormessage})"] = false;
   33.53  ["External memberships"] = false;
   33.54 @@ -250,6 +257,7 @@
   33.55  ["Member has not approved latest draft"] = false;
   33.56  ["Member is administrator"] = false;
   33.57  ["Member is already saved in your contacts!"] = false;
   33.58 +["Member is deactivated"] = false;
   33.59  ["Member is now invited to be initiator"] = false;
   33.60  ["Member list"] = false;
   33.61  ["Member name"] = false;
   33.62 @@ -275,6 +283,7 @@
   33.63  ["My opinion"] = false;
   33.64  ["Name"] = false;
   33.65  ["New"] = false;
   33.66 +["New address"] = false;
   33.67  ["New draft"] = false;
   33.68  ["New draft has been added to initiative"] = false;
   33.69  ["New draft revision"] = false;
   33.70 @@ -302,6 +311,7 @@
   33.71  ["Not voted (revoked from initiator)"] = false;
   33.72  ["Not voted issues"] = false;
   33.73  ["Not yet voted"] = false;
   33.74 +["Notification address unconfirmed"] = false;
   33.75  ["Number of incoming delegations, follow link to see more details"] = false;
   33.76  ["Number of initiatives to preview"] = false;
   33.77  ["OK"] = false;
   33.78 @@ -378,6 +388,7 @@
   33.79  ["Remove my support from this initiative"] = false;
   33.80  ["Repeat new password"] = false;
   33.81  ["Request password reset link"] = false;
   33.82 +["Resend activation email to '#{email}'"] = false;
   33.83  ["Reset code"] = false;
   33.84  ["Reset code is invalid!"] = false;
   33.85  ["Reset link has been send for this member"] = false;
   33.86 @@ -457,6 +468,7 @@
   33.87  ["The initiators suggest to support the following initiative:"] = false;
   33.88  ["There are no more alternative initiatives currently."] = false;
   33.89  ["There were no more alternative initiatives."] = false;
   33.90 +["This email address is too short!"] = false;
   33.91  ["This identifier is not allowed for this instance."] = false;
   33.92  ["This initiative"] = false;
   33.93  ["This initiative compared to alternative initiatives"] = false;
   33.94 @@ -475,6 +487,7 @@
   33.95  ["This member has rejected to become initiator of this initiative"] = false;
   33.96  ["This member is already initiator of this initiative"] = false;
   33.97  ["This member is already invited to become initiator of this initiative"] = false;
   33.98 +["This member is deactivated."] = false;
   33.99  ["This member is participating, the rest of delegation chain is suspended while discussing"] = false;
  33.100  ["This name is already taken, please choose another one!"] = false;
  33.101  ["This name is really too short!"] = false;
  33.102 @@ -493,6 +506,7 @@
  33.103  ["Trustee"] = false;
  33.104  ["Tuesday"] = false;
  33.105  ["Type of tabs"] = false;
  33.106 +["Unconfirmed address"] = false;
  33.107  ["Unknown author"] = false;
  33.108  ["Updated drafts"] = false;
  33.109  ["Upload images"] = false;
  33.110 @@ -515,6 +529,8 @@
  33.111  ["Voting request updated"] = false;
  33.112  ["Voting started"] = false;
  33.113  ["Voting time"] = false;
  33.114 +["We couldn't deliver a confirmation mail to this address. Please check entered email address."] = false;
  33.115 +["We have sent an email with activation link already in the last hour. Please try again later."] = false;
  33.116  ["Website"] = false;
  33.117  ["Wednesday"] = false;
  33.118  ["Wiki engine"] = false;
  33.119 @@ -531,7 +547,11 @@
  33.120  ["You are now initiator of this initiative"] = false;
  33.121  ["You are potential supporter of this initiative"] = false;
  33.122  ["You are supporting this initiative"] = false;
  33.123 +["You can change the following settings:"] = false;
  33.124 +["You can change your email address only once per hour. Please try again later."] = false;
  33.125  ["You can't suggest the initiative you are revoking"] = false;
  33.126 +["You didn't confirmed your email address '#{email}' within 7 days."] = false;
  33.127 +["You didn't confirmed your email address '#{email}'. You have received an email with an activation link."] = false;
  33.128  ["You didn't saved any member as contact yet."] = false;
  33.129  ["You have saved this member as contact"] = false;
  33.130  ["You have saved this member as contact."] = false;
  33.131 @@ -549,6 +569,7 @@
  33.132  ["Your delegation for this issue has been deleted."] = false;
  33.133  ["Your delegation for this issue has been updated."] = false;
  33.134  ["Your display settings have been updated"] = false;
  33.135 +["Your email address has been changed, please check for confirmation email with activation link!"] = false;
  33.136  ["Your global delegation has been deleted."] = false;
  33.137  ["Your global delegation has been updated."] = false;
  33.138  ["Your login has been changed to '#{login}'"] = false;
    34.1 --- a/locale/translations.eo.lua	Wed May 26 15:47:52 2010 +0200
    34.2 +++ b/locale/translations.eo.lua	Thu Jul 08 18:44:02 2010 +0200
    34.3 @@ -77,6 +77,8 @@
    34.4  ["Change API key"] = "Ŝanĝi API-ŝlosilon";
    34.5  ["Change area delegation"] = "Ŝanĝi delegacion por temaro";
    34.6  ["Change display settings"] = "Ŝanĝi afiŝajn agordojn";
    34.7 +["Change email"] = false;
    34.8 +["Change email address"] = false;
    34.9  ["Change filters and order"] = "Ŝanĝi filtrojn kaj ordon";
   34.10  ["Change global delegation"] = "Ŝanĝi ĝeneralan delegacion";
   34.11  ["Change issue delegation"] = "Ŝanĝi delegacion por la temo";
   34.12 @@ -87,6 +89,7 @@
   34.13  ["Change vote"] = "Sangi baloton";
   34.14  ["Change your login"] = "Ŝanĝi vian salutnomon";
   34.15  ["Change your name"] = "Ŝanĝi vian nomon";
   34.16 +["Change your notification email address"] = false;
   34.17  ["Change your password"] = "Ŝanĝi vian pasvorton";
   34.18  ["Choose initiator"] = "Elekti inicianton";
   34.19  ["Choose member"] = "Elekti membron";
   34.20 @@ -98,6 +101,7 @@
   34.21  ["Confirm"] = "Konfirmi";
   34.22  ["Confirmation code"] = "Konfirmokodon";
   34.23  ["Confirmation code invalid!"] = "La konfirmokodo estas malvalida!";
   34.24 +["Confirmed address"] = false;
   34.25  ["Contacts"] = "Kontaktoj";
   34.26  ["Content"] = "Enhavo";
   34.27  ["Counting of votes"] = "Nombrado de voĉoj";
   34.28 @@ -109,13 +113,14 @@
   34.29  ["Current votings in areas you are member of and issues you are interested in:"] = "Aktualaj voĉdonoj pri temoj en kiuj vi membras kaj kiuj vin interesas:";
   34.30  ["Currently no API key is set."] = "Nuntempe ne ekzistas API-ŝlosilo";
   34.31  ["Date"] = "Dato";
   34.32 +["Date format is not valid. Please use following format: YYYY-MM-DD"] = false;
   34.33  ["Degree"] = "Grado";
   34.34  ["Delegations"] = "Delegacioj";
   34.35  ["Delete API key"] = "Forviŝi API-ŝlosilon";
   34.36  ["Delete filter"] = "Forviŝi filtron";
   34.37  ["Description"] = "Priskribo";
   34.38  ["Details"] = "Detaloj";
   34.39 -["Developer features"] = "Porprogramistaj funkcioj";
   34.40 +["Developer settings"] = false;
   34.41  ["Diff"] = "Diferenco";
   34.42  ["Direct member count"] = "Nombro de la rektaj membroj";
   34.43  ["Direct membership"] = "Rekta membreco";
   34.44 @@ -149,7 +154,9 @@
   34.45  ["Email address is confirmed now"] = "Retadreso nun estas konfirmita";
   34.46  ["Email address too short!"] = "Retadreso estas tro mallonga!";
   34.47  ["Email confirmation request"] = "Konfirmopeto de via retadreso";
   34.48 +["Email unconfirmed"] = false;
   34.49  ["Empty help text: #{id}.#{lang}.txt"] = "Malplena helpoteksto: #{id}.#{lang}.txt";
   34.50 +["Error while converting image. Please note, that only JPG files are supported!"] = false;
   34.51  ["Error while resolving openid. Internal message: '#{errmsg}'"] = "Eraro dum trovado de openid. Interna mesaĝo: '#{errmsg}'";
   34.52  ["Error while updating member, database reported:<br /><br /> (#{errormessage})"] = "Eraro dum ĝisdatigo de la membro, la datumbazo raportas sekvan eraron:<br /><br /> (#{errormessage})";
   34.53  ["External memberships"] = "Eksteraj membrecoj";
   34.54 @@ -250,6 +257,7 @@
   34.55  ["Member has not approved latest draft"] = "La membro ne konsentis la plej novan skizon";
   34.56  ["Member is administrator"] = "La membro estas administranto";
   34.57  ["Member is already saved in your contacts!"] = "La membro estas jam konservita en viaj kontaktoj!";
   34.58 +["Member is deactivated"] = false;
   34.59  ["Member is now invited to be initiator"] = "La membro nun estas invitita kiel inicionto";
   34.60  ["Member list"] = "Membrolisto";
   34.61  ["Member name"] = "Membronomo";
   34.62 @@ -275,6 +283,7 @@
   34.63  ["My opinion"] = "Mia opinio";
   34.64  ["Name"] = "Nomo";
   34.65  ["New"] = "Nova";
   34.66 +["New address"] = false;
   34.67  ["New draft"] = "Nova skizo";
   34.68  ["New draft has been added to initiative"] = "La nova skizo estas aldonita al la iniciato";
   34.69  ["New draft revision"] = "Nova revizio de la skizo";
   34.70 @@ -302,6 +311,7 @@
   34.71  ["Not voted (revoked from initiator)"] = "Ne balotinta (retirita de la iniciinto)";
   34.72  ["Not voted issues"] = "Ne balotitaj";
   34.73  ["Not yet voted"] = "Ankoraŭ ne balotinta";
   34.74 +["Notification address unconfirmed"] = false;
   34.75  ["Number of incoming delegations, follow link to see more details"] = "Nombro de alvenantaj delegacioj, sekvu ligilon por pli da detaloj";
   34.76  ["Number of initiatives to preview"] = "Nombro de iniciatoj por antaŭmontri";
   34.77  ["OK"] = "Bone";
   34.78 @@ -378,6 +388,7 @@
   34.79  ["Remove my support from this initiative"] = "Forigi mian subtenon de la iniciato";
   34.80  ["Repeat new password"] = "Ripeti novan pasvorton";
   34.81  ["Request password reset link"] = "Demandi ligilon por remeti la pasvorton";
   34.82 +["Resend activation email to '#{email}'"] = false;
   34.83  ["Reset code"] = "Remetokodo";
   34.84  ["Reset code is invalid!"] = "La remetokodo estas malvalida!";
   34.85  ["Reset link has been send for this member"] = "Remetoligilo estas dissendita";
   34.86 @@ -457,6 +468,7 @@
   34.87  ["The initiators suggest to support the following initiative:"] = "La iniciintoj rekomendas subteni sekvan iniciaton:";
   34.88  ["There are no more alternative initiatives currently."] = "Aktuale ne ekzistas pliajn alternativajn iniciatojn.";
   34.89  ["There were no more alternative initiatives."] = "Ne ekzistis pliajn alternativajn iniciatojn.";
   34.90 +["This email address is too short!"] = false;
   34.91  ["This identifier is not allowed for this instance."] = "Tiu identigilo ne estas permesita por ĉi tiu instanco.";
   34.92  ["This initiative"] = "Tiu iniciato";
   34.93  ["This initiative compared to alternative initiatives"] = "Tiu iniciato komparata al la alternativajn iniciatojn";
   34.94 @@ -475,6 +487,7 @@
   34.95  ["This member has rejected to become initiator of this initiative"] = "Tiu membro rifuzis inviton por esti inicionto";
   34.96  ["This member is already initiator of this initiative"] = "Tiu membro estas jam iniciinto de tiu iniciato";
   34.97  ["This member is already invited to become initiator of this initiative"] = "Tiu membro estis jam invitita por esti inicionto de tiu iniciato";
   34.98 +["This member is deactivated."] = false;
   34.99  ["This member is participating, the rest of delegation chain is suspended while discussing"] = "Tiu membro partoprenas, la resta delegaciĉeno estas blokita dum la diskuto";
  34.100  ["This name is already taken, please choose another one!"] = "Tiu nomo estas jam prenita, bonvolu elekti alian!";
  34.101  ["This name is really too short!"] = "Tiu nomo estas vere tro mallonga!";
  34.102 @@ -493,6 +506,7 @@
  34.103  ["Trustee"] = "Fidulo mastrumanta";
  34.104  ["Tuesday"] = "Mardo";
  34.105  ["Type of tabs"] = "Tipo de langetoj";
  34.106 +["Unconfirmed address"] = false;
  34.107  ["Unknown author"] = "Aŭtoro nekonata";
  34.108  ["Updated drafts"] = "Skizoj ĝisdatigitaj";
  34.109  ["Upload images"] = "Alŝuti bildojn";
  34.110 @@ -515,6 +529,8 @@
  34.111  ["Voting request updated"] = "Voĉdono-peto ĝisdatigita";
  34.112  ["Voting started"] = "Voĉdono komenciĝis";
  34.113  ["Voting time"] = "Tempo por la voĉdono";
  34.114 +["We couldn't deliver a confirmation mail to this address. Please check entered email address."] = false;
  34.115 +["We have sent an email with activation link already in the last hour. Please try again later."] = false;
  34.116  ["Website"] = "Retpaĝo";
  34.117  ["Wednesday"] = "Merkredo";
  34.118  ["Wiki engine"] = "Viki-modulo";
  34.119 @@ -522,7 +538,7 @@
  34.120  ["You are already initator"] = "Vi estas jam iniciinto";
  34.121  ["You are already not supporting this initiative"] = "Vi ankoraŭ ne subtenas tiun iniciaton";
  34.122  ["You are already supporting the latest draft"] = "Vi jam subtenas la plej novan skizon";
  34.123 -["You are currently not invited to any initiative."] = "Vi aktuale estas invitita al neniu iniciato."; 
  34.124 +["You are currently not invited to any initiative."] = "Vi aktuale estas invitita al neniu iniciato.";
  34.125  ["You are currently not supporting this initiative. By adding suggestions to this initiative you will automatically become a potential supporter."] = "Vi aktuale ne subtenas tiun iniciaton. Se vi aldonas sugeston al tiu iniciato vi estos aŭtomate eventuala subtenonto!";
  34.126  ["You are iniator of this initiative"] = "Vi estas iniciinto de tiu iniciato";
  34.127  ["You are interested in this issue"] = "Vin interesas tiu temo";
  34.128 @@ -531,7 +547,11 @@
  34.129  ["You are now initiator of this initiative"] = "Vi nun estas iniciinto de tiu iniciato";
  34.130  ["You are potential supporter of this initiative"] = "Vi estas eventuala subtenanto de tiu iniciato";
  34.131  ["You are supporting this initiative"] = "Vi subtenas tiun iniciaton";
  34.132 +["You can change the following settings:"] = false;
  34.133 +["You can change your email address only once per hour. Please try again later."] = false;
  34.134  ["You can't suggest the initiative you are revoking"] = "Vi ne povas rekomendi la iniciaton, kiun vi nuligas";
  34.135 +["You didn't confirmed your email address '#{email}' within 7 days."] = false;
  34.136 +["You didn't confirmed your email address '#{email}'. You have received an email with an activation link."] = false;
  34.137  ["You didn't saved any member as contact yet."] = "Vi ankoraŭ ne konservis membron kiel kontakton!";
  34.138  ["You have saved this member as contact"] = "Vi konservis membron kiel kontakton";
  34.139  ["You have saved this member as contact."] = "Vi konservis membron kiel kontakton.";
  34.140 @@ -549,6 +569,7 @@
  34.141  ["Your delegation for this issue has been deleted."] = "Via delegacio por tiu temo estas viŝita";
  34.142  ["Your delegation for this issue has been updated."] = "Via delegacio por tiu temo estas ĝisdatigita";
  34.143  ["Your display settings have been updated"] = "Viaj afiŝaj-agordoj estas ĝisdatigitaj";
  34.144 +["Your email address has been changed, please check for confirmation email with activation link!"] = false;
  34.145  ["Your global delegation has been deleted."] = "Via ĝenerala delegacio estas viŝita";
  34.146  ["Your global delegation has been updated."] = "Via ĝenerala delegacio estas ĝisdatigita";
  34.147  ["Your login has been changed to '#{login}'"] = "Via salutnomo estas ĝisdatigita al '#{login}'";
    35.1 --- a/locale/translations.fr.lua	Wed May 26 15:47:52 2010 +0200
    35.2 +++ b/locale/translations.fr.lua	Thu Jul 08 18:44:02 2010 +0200
    35.3 @@ -77,6 +77,8 @@
    35.4  ["Change API key"] = false;
    35.5  ["Change area delegation"] = false;
    35.6  ["Change display settings"] = false;
    35.7 +["Change email"] = false;
    35.8 +["Change email address"] = false;
    35.9  ["Change filters and order"] = false;
   35.10  ["Change global delegation"] = false;
   35.11  ["Change issue delegation"] = false;
   35.12 @@ -87,6 +89,7 @@
   35.13  ["Change vote"] = false;
   35.14  ["Change your login"] = false;
   35.15  ["Change your name"] = false;
   35.16 +["Change your notification email address"] = false;
   35.17  ["Change your password"] = false;
   35.18  ["Choose initiator"] = false;
   35.19  ["Choose member"] = false;
   35.20 @@ -98,6 +101,7 @@
   35.21  ["Confirm"] = false;
   35.22  ["Confirmation code"] = false;
   35.23  ["Confirmation code invalid!"] = false;
   35.24 +["Confirmed address"] = false;
   35.25  ["Contacts"] = false;
   35.26  ["Content"] = false;
   35.27  ["Counting of votes"] = false;
   35.28 @@ -109,13 +113,14 @@
   35.29  ["Current votings in areas you are member of and issues you are interested in:"] = false;
   35.30  ["Currently no API key is set."] = false;
   35.31  ["Date"] = false;
   35.32 +["Date format is not valid. Please use following format: YYYY-MM-DD"] = false;
   35.33  ["Degree"] = false;
   35.34  ["Delegations"] = false;
   35.35  ["Delete API key"] = false;
   35.36  ["Delete filter"] = false;
   35.37  ["Description"] = false;
   35.38  ["Details"] = false;
   35.39 -["Developer features"] = false;
   35.40 +["Developer settings"] = false;
   35.41  ["Diff"] = false;
   35.42  ["Direct member count"] = false;
   35.43  ["Direct membership"] = false;
   35.44 @@ -149,7 +154,9 @@
   35.45  ["Email address is confirmed now"] = false;
   35.46  ["Email address too short!"] = false;
   35.47  ["Email confirmation request"] = false;
   35.48 +["Email unconfirmed"] = false;
   35.49  ["Empty help text: #{id}.#{lang}.txt"] = false;
   35.50 +["Error while converting image. Please note, that only JPG files are supported!"] = false;
   35.51  ["Error while resolving openid. Internal message: '#{errmsg}'"] = false;
   35.52  ["Error while updating member, database reported:<br /><br /> (#{errormessage})"] = false;
   35.53  ["External memberships"] = false;
   35.54 @@ -250,6 +257,7 @@
   35.55  ["Member has not approved latest draft"] = false;
   35.56  ["Member is administrator"] = false;
   35.57  ["Member is already saved in your contacts!"] = false;
   35.58 +["Member is deactivated"] = false;
   35.59  ["Member is now invited to be initiator"] = false;
   35.60  ["Member list"] = false;
   35.61  ["Member name"] = false;
   35.62 @@ -275,6 +283,7 @@
   35.63  ["My opinion"] = false;
   35.64  ["Name"] = false;
   35.65  ["New"] = false;
   35.66 +["New address"] = false;
   35.67  ["New draft"] = false;
   35.68  ["New draft has been added to initiative"] = false;
   35.69  ["New draft revision"] = false;
   35.70 @@ -302,6 +311,7 @@
   35.71  ["Not voted (revoked from initiator)"] = false;
   35.72  ["Not voted issues"] = false;
   35.73  ["Not yet voted"] = false;
   35.74 +["Notification address unconfirmed"] = false;
   35.75  ["Number of incoming delegations, follow link to see more details"] = false;
   35.76  ["Number of initiatives to preview"] = false;
   35.77  ["OK"] = false;
   35.78 @@ -378,6 +388,7 @@
   35.79  ["Remove my support from this initiative"] = false;
   35.80  ["Repeat new password"] = false;
   35.81  ["Request password reset link"] = false;
   35.82 +["Resend activation email to '#{email}'"] = false;
   35.83  ["Reset code"] = false;
   35.84  ["Reset code is invalid!"] = false;
   35.85  ["Reset link has been send for this member"] = false;
   35.86 @@ -457,6 +468,7 @@
   35.87  ["The initiators suggest to support the following initiative:"] = false;
   35.88  ["There are no more alternative initiatives currently."] = false;
   35.89  ["There were no more alternative initiatives."] = false;
   35.90 +["This email address is too short!"] = false;
   35.91  ["This identifier is not allowed for this instance."] = false;
   35.92  ["This initiative"] = false;
   35.93  ["This initiative compared to alternative initiatives"] = false;
   35.94 @@ -475,6 +487,7 @@
   35.95  ["This member has rejected to become initiator of this initiative"] = false;
   35.96  ["This member is already initiator of this initiative"] = false;
   35.97  ["This member is already invited to become initiator of this initiative"] = false;
   35.98 +["This member is deactivated."] = false;
   35.99  ["This member is participating, the rest of delegation chain is suspended while discussing"] = false;
  35.100  ["This name is already taken, please choose another one!"] = false;
  35.101  ["This name is really too short!"] = false;
  35.102 @@ -493,6 +506,7 @@
  35.103  ["Trustee"] = false;
  35.104  ["Tuesday"] = false;
  35.105  ["Type of tabs"] = false;
  35.106 +["Unconfirmed address"] = false;
  35.107  ["Unknown author"] = false;
  35.108  ["Updated drafts"] = false;
  35.109  ["Upload images"] = false;
  35.110 @@ -515,6 +529,8 @@
  35.111  ["Voting request updated"] = false;
  35.112  ["Voting started"] = false;
  35.113  ["Voting time"] = false;
  35.114 +["We couldn't deliver a confirmation mail to this address. Please check entered email address."] = false;
  35.115 +["We have sent an email with activation link already in the last hour. Please try again later."] = false;
  35.116  ["Website"] = false;
  35.117  ["Wednesday"] = false;
  35.118  ["Wiki engine"] = false;
  35.119 @@ -531,7 +547,11 @@
  35.120  ["You are now initiator of this initiative"] = false;
  35.121  ["You are potential supporter of this initiative"] = false;
  35.122  ["You are supporting this initiative"] = false;
  35.123 +["You can change the following settings:"] = false;
  35.124 +["You can change your email address only once per hour. Please try again later."] = false;
  35.125  ["You can't suggest the initiative you are revoking"] = false;
  35.126 +["You didn't confirmed your email address '#{email}' within 7 days."] = false;
  35.127 +["You didn't confirmed your email address '#{email}'. You have received an email with an activation link."] = false;
  35.128  ["You didn't saved any member as contact yet."] = false;
  35.129  ["You have saved this member as contact"] = false;
  35.130  ["You have saved this member as contact."] = false;
  35.131 @@ -549,6 +569,7 @@
  35.132  ["Your delegation for this issue has been deleted."] = false;
  35.133  ["Your delegation for this issue has been updated."] = false;
  35.134  ["Your display settings have been updated"] = false;
  35.135 +["Your email address has been changed, please check for confirmation email with activation link!"] = false;
  35.136  ["Your global delegation has been deleted."] = false;
  35.137  ["Your global delegation has been updated."] = false;
  35.138  ["Your login has been changed to '#{login}'"] = false;
    36.1 --- a/model/issue.lua	Wed May 26 15:47:52 2010 +0200
    36.2 +++ b/model/issue.lua	Thu Jul 08 18:44:02 2010 +0200
    36.3 @@ -142,23 +142,29 @@
    36.4      :add_group_by('"issue"."vote_now"')
    36.5      :add_group_by('"issue"."vote_later"')
    36.6      :add_group_by('"issue"."voter_count"')
    36.7 +    :add_group_by('"issue"."admission_time"')
    36.8 +    :add_group_by('"issue"."discussion_time"')
    36.9 +    :add_group_by('"issue"."verification_time"')
   36.10 +    :add_group_by('"issue"."voting_time"')
   36.11      :add_group_by('"_interest"."member_id"')
   36.12      --:set_distinct()
   36.13  end
   36.14  
   36.15 -function Issue:modify_selector_for_state(state)
   36.16 +function Issue:modify_selector_for_state(initiatives_selector, state)
   36.17    if state == "new" then
   36.18 -    initiatives_selector:add_where("issue.accepted ISNULL AND issue.cancelled ISNULL")
   36.19 +    initiatives_selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
   36.20    elseif state == "accepted" then
   36.21 -    initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.cancelled ISNULL")
   36.22 +    initiatives_selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
   36.23    elseif state == "frozen" then
   36.24 -    initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND cancelled ISNULL")
   36.25 +    initiatives_selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL")
   36.26    elseif state == "voting" then
   36.27 -    initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.finished ISNULL AND issue.cancelled ISNULL")
   36.28 +    initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
   36.29    elseif state == "finished" then
   36.30 -    initiatives_selector:add_where("issue.finished NOTNULL")
   36.31 +    initiatives_selector:add_where("issue.fully_frozen NOTNULL AND issue.closed NOTNULL")
   36.32    elseif state == "cancelled" then
   36.33 -    initiatives_selector:add_where("issue.cancelled NOTNULL")
   36.34 +    initiatives_selector:add_where("issue.fully_frozen ISNULL AND issue.closed NOTNULL")
   36.35 +  else
   36.36 +    error("Invalid state")
   36.37    end
   36.38  end
   36.39  
    37.1 --- a/model/member.lua	Wed May 26 15:47:52 2010 +0200
    37.2 +++ b/model/member.lua	Thu Jul 08 18:44:02 2010 +0200
    37.3 @@ -308,6 +308,11 @@
    37.4      content_type  = "text/plain; charset=UTF-8",
    37.5      content       = content
    37.6    }
    37.7 +  if success then
    37.8 +    local lock_expiry = db:query("SELECT now() + '1 hour'::interval AS lock_expiry", "object").lock_expiry
    37.9 +    self.notify_email_lock_expiry = lock_expiry
   37.10 +  end
   37.11 +  self:save()
   37.12    return success
   37.13  end
   37.14  
   37.15 @@ -354,3 +359,12 @@
   37.16  function Member.object:set_setting_map(key, subkey, value)
   37.17    
   37.18  end
   37.19 +
   37.20 +function Member.object_get:notify_email_locked()
   37.21 +  return(
   37.22 +    Member:new_selector()
   37.23 +      :add_where{ "id = ?", app.session.member.id }
   37.24 +      :add_where("notify_email_lock_expiry > now()")
   37.25 +      :count() == 1
   37.26 +  )
   37.27 +end
   37.28 \ No newline at end of file
    38.1 --- a/static/style.css	Wed May 26 15:47:52 2010 +0200
    38.2 +++ b/static/style.css	Thu Jul 08 18:44:02 2010 +0200
    38.3 @@ -1081,6 +1081,16 @@
    38.4    margin-top: 0;
    38.5  }
    38.6  
    38.7 +.menu_list li {
    38.8 +  padding-top: 1ex;
    38.9 +  padding-bottom: 1ex;
   38.10 +}
   38.11 +
   38.12 +.deactivated_member_info {
   38.13 +  background-color: #a00;
   38.14 +  color: #fff;
   38.15 +}
   38.16 +
   38.17  /*************************************************************************
   38.18   * Voting
   38.19   */

Impressum / About Us