liquid_feedback_frontend

changeset 9:0ee1e0c42d4c beta5

Version beta5

Minor security fix: Added missing security filter for admin section. Reading of member listing including login names was possible for all users. Write access has not been possible though.

Changing of name and login is possible while a history of these changes is written and accessible by all users.

Statistics shown in area list

Trimming of user input also converts multiple whitespaces to single space character.
author bsw
date Mon Jan 04 12:00:00 2010 +0100 (2010-01-04)
parents 374bbc2ff102
children 72c5e0ee7c98
files app/main/admin/_filter/90_admin.lua app/main/area/_list.lua app/main/index/_action/update_password.lua app/main/index/change_password.lua app/main/index/index.lua app/main/index/register.lua app/main/member/_action/update_login.lua app/main/member/_action/update_name.lua app/main/member/_action/update_password.lua app/main/member/_show.lua app/main/member/history.lua app/main/member/settings.lua app/main/member/show.lua config/default.lua env/util/trim.lua locale/help/index.change_password.de.txt locale/help/member.edit.de.txt locale/help/member.settings.login.de.txt locale/help/member.settings.name.de.txt locale/help/member.settings.password.de.txt locale/translations.de.lua model/member.lua model/member_history.lua static/icons/16/clock_edit.png static/icons/16/wrench.png static/style.css
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/app/main/admin/_filter/90_admin.lua	Mon Jan 04 12:00:00 2010 +0100
     1.3 @@ -0,0 +1,5 @@
     1.4 +if request.get_module() == "admin" and not app.session.member.admin then
     1.5 +  error('access denied')
     1.6 +end
     1.7 +
     1.8 +execute.inner()
     2.1 --- a/app/main/area/_list.lua	Sat Jan 02 12:00:00 2010 +0100
     2.2 +++ b/app/main/area/_list.lua	Mon Jan 04 12:00:00 2010 +0100
     2.3 @@ -1,5 +1,17 @@
     2.4  local areas_selector = param.get("areas_selector", "table")
     2.5  
     2.6 +areas_selector
     2.7 +  :reset_fields()
     2.8 +  :add_field("area.id", nil, { "grouped" })
     2.9 +  :add_field("area.name", nil, { "grouped" })
    2.10 +  :add_field("member_weight", nil, { "grouped" })
    2.11 +  :add_field("direct_member_count", nil, { "grouped" })
    2.12 +  :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.accepted ISNULL AND issue.closed ISNULL)", "issues_new_count")
    2.13 +  :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL)", "issues_discussion_count")
    2.14 +  :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL)", "issues_frozen_count")
    2.15 +  :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.fully_frozen NOTNULL AND issue.closed ISNULL)", "issues_voting_count")
    2.16 +  :add_field({ "(SELECT COUNT(*) FROM issue LEFT JOIN direct_voter ON direct_voter.issue_id = issue.id AND direct_voter.member_id = ? WHERE issue.area_id = area.id AND issue.fully_frozen NOTNULL AND issue.closed ISNULL AND direct_voter.member_id ISNULL)", app.session.member.id }, "issues_to_vote_count")
    2.17 +
    2.18  ui.order{
    2.19    name = name,
    2.20    selector = areas_selector,
    2.21 @@ -54,6 +66,72 @@
    2.22                id = record.id
    2.23              }
    2.24            end
    2.25 +        },
    2.26 +        {
    2.27 +          label = _"New",
    2.28 +          field_attr = { style = "text-align: right;" },
    2.29 +          content = function(record)
    2.30 +            ui.link{
    2.31 +              text = tostring(record.issues_new_count),
    2.32 +              module = "area",
    2.33 +              view = "show",
    2.34 +              id = record.id,
    2.35 +              params = { filter = "new" }
    2.36 +            }
    2.37 +          end
    2.38 +        },
    2.39 +        {
    2.40 +          label = _"Discussion",
    2.41 +          field_attr = { style = "text-align: right;" },
    2.42 +          content = function(record)
    2.43 +            ui.link{
    2.44 +              text = tostring(record.issues_discussion_count),
    2.45 +              module = "area",
    2.46 +              view = "show",
    2.47 +              id = record.id,
    2.48 +              params = { filter = "accepted" }
    2.49 +            }
    2.50 +          end
    2.51 +        },
    2.52 +        {
    2.53 +          label = _"Frozen",
    2.54 +          field_attr = { style = "text-align: right;" },
    2.55 +          content = function(record)
    2.56 +            ui.link{
    2.57 +              text = tostring(record.issues_frozen_count),
    2.58 +              module = "area",
    2.59 +              view = "show",
    2.60 +              id = record.id,
    2.61 +              params = { filter = "half_frozen" }
    2.62 +            }
    2.63 +          end
    2.64 +        },
    2.65 +        {
    2.66 +          label = _"Voting",
    2.67 +          field_attr = { style = "text-align: right;" },
    2.68 +          content = function(record)
    2.69 +            ui.link{
    2.70 +              text = tostring(record.issues_voting_count),
    2.71 +              module = "area",
    2.72 +              view = "show",
    2.73 +              id = record.id,
    2.74 +              params = { filter = "frozen" }
    2.75 +            }
    2.76 +          end
    2.77 +        },
    2.78 +        {
    2.79 +          label = _"Not yet voted",
    2.80 +          field_attr = { style = "text-align: right;" },
    2.81 +          content = function(record)
    2.82 +            ui.link{
    2.83 +              attr = { class = record.issues_to_vote_count > 0 and "not_voted" or nil },
    2.84 +              text = tostring(record.issues_to_vote_count),
    2.85 +              module = "area",
    2.86 +              view = "show",
    2.87 +              id = record.id,
    2.88 +              params = { filter = "frozen", filter_voting = "not_voted" }
    2.89 +            }
    2.90 +          end
    2.91          }
    2.92        }
    2.93      }
     3.1 --- a/app/main/index/_action/update_password.lua	Sat Jan 02 12:00:00 2010 +0100
     3.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.3 @@ -1,23 +0,0 @@
     3.4 -local old_password = param.get("old_password")
     3.5 -local new_password1 = param.get("new_password1")
     3.6 -local new_password2 = param.get("new_password2")
     3.7 -
     3.8 -if not Member:by_login_and_password(app.session.member.login, old_password) then
     3.9 -  slot.put_into("error", _"Old password is wrong")
    3.10 -  return false
    3.11 -end
    3.12 -
    3.13 -if new_password1 ~= new_password2 then
    3.14 -  slot.put_into("error", _"New passwords does not match.")
    3.15 -  return false
    3.16 -end
    3.17 -
    3.18 -if #new_password1 < 8 then
    3.19 -  slot.put_into("error", _"New passwords is too short.")
    3.20 -  return false
    3.21 -end
    3.22 -
    3.23 -app.session.member:set_password(new_password1)
    3.24 -app.session.member:save()
    3.25 -
    3.26 -slot.put_into("notice", _"Your password has been updated successfully")
     4.1 --- a/app/main/index/change_password.lua	Sat Jan 02 12:00:00 2010 +0100
     4.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.3 @@ -1,34 +0,0 @@
     4.4 -
     4.5 -slot.put_into("title", _"Change password")
     4.6 -
     4.7 -slot.select("actions", function()
     4.8 -  ui.link{
     4.9 -    content = function()
    4.10 -        ui.image{ static = "icons/16/cancel.png" }
    4.11 -        slot.put(_"Cancel")
    4.12 -    end,
    4.13 -    module = "index",
    4.14 -    view = "index"
    4.15 -  }
    4.16 -end)
    4.17 -
    4.18 -util.help("index.change_password", _"Change password")
    4.19 -
    4.20 -ui.form{
    4.21 -  attr = { class = "vertical" },
    4.22 -  module = "index",
    4.23 -  action = "update_password",
    4.24 -  routing = {
    4.25 -    ok = {
    4.26 -      mode = "redirect",
    4.27 -      module = "index",
    4.28 -      view = "index"
    4.29 -    }
    4.30 -  },
    4.31 -  content = function()
    4.32 -    ui.field.password{ label = _"Old password", name = "old_password" }
    4.33 -    ui.field.password{ label = _"New password", name = "new_password1" }
    4.34 -    ui.field.password{ label = _"Repeat new password", name = "new_password2" }
    4.35 -    ui.submit{ value = _"Change password" }
    4.36 -  end
    4.37 -}
    4.38 \ No newline at end of file
     5.1 --- a/app/main/index/index.lua	Sat Jan 02 12:00:00 2010 +0100
     5.2 +++ b/app/main/index/index.lua	Mon Jan 04 12:00:00 2010 +0100
     5.3 @@ -68,11 +68,11 @@
     5.4  
     5.5    ui.link{
     5.6      content = function()
     5.7 -        ui.image{ static = "icons/16/key.png" }
     5.8 -        slot.put(_"Change password")
     5.9 +        ui.image{ static = "icons/16/wrench.png" }
    5.10 +        slot.put(_"Settings")
    5.11      end,
    5.12 -    module = "index",
    5.13 -    view = "change_password"
    5.14 +    module = "member",
    5.15 +    view = "settings"
    5.16    }
    5.17  
    5.18    if config.download_dir then
     6.1 --- a/app/main/index/register.lua	Sat Jan 02 12:00:00 2010 +0100
     6.2 +++ b/app/main/index/register.lua	Mon Jan 04 12:00:00 2010 +0100
     6.3 @@ -72,7 +72,7 @@
     6.4        end)
     6.5        ui.tag{
     6.6          tag = "p",
     6.7 -        content = _"Please choose a name, i.e. your real name or your nick name. This name will be shown to others to identify you. You CAN'T change this name later, so please choose it wisely!"
     6.8 +        content = _"Please choose a name, i.e. your real name or your nick name. This name will be shown to others to identify you."
     6.9        }
    6.10        ui.field.text{
    6.11          label     = _'Name',
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/app/main/member/_action/update_login.lua	Mon Jan 04 12:00:00 2010 +0100
     7.3 @@ -0,0 +1,21 @@
     7.4 +local login = param.get("login")
     7.5 +
     7.6 +login = util.trim(login)
     7.7 +
     7.8 +if #login < 3 then 
     7.9 +  slot.put_into(_error, _"This login is too short!")
    7.10 +end
    7.11 +
    7.12 +app.session.member.login = login
    7.13 +
    7.14 +local db_error = app.session.member:try_save()
    7.15 +
    7.16 +if db_error then
    7.17 +  if db_error:is_kind_of("IntegrityConstraintViolation.UniqueViolation") then
    7.18 +    slot.put_into("error", _"This login is already taken, please choose another one!")
    7.19 +  return false
    7.20 +  end
    7.21 +  db_error:escalate()
    7.22 +end
    7.23 +
    7.24 +slot.put_into("notice", _("Your login has been changed to '#{login}'", { login = login }))
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/app/main/member/_action/update_name.lua	Mon Jan 04 12:00:00 2010 +0100
     8.3 @@ -0,0 +1,22 @@
     8.4 +local name = param.get("name")
     8.5 +
     8.6 +name = util.trim(name)
     8.7 +
     8.8 +if #name < 3 then 
     8.9 +  slot.put_into(_error, _"This name is too short!")
    8.10 +end
    8.11 +
    8.12 +
    8.13 +app.session.member.name = name
    8.14 +
    8.15 +local db_error = app.session.member:try_save()
    8.16 +
    8.17 +if db_error then
    8.18 +  if db_error:is_kind_of("IntegrityConstraintViolation.UniqueViolation") then
    8.19 +    slot.put_into("error", _"This name is already taken, please choose another one!")
    8.20 +  return false
    8.21 +  end
    8.22 +  db_error:escalate()
    8.23 +end
    8.24 +
    8.25 +slot.put_into("notice", _"Your name has been changed")
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/app/main/member/_action/update_password.lua	Mon Jan 04 12:00:00 2010 +0100
     9.3 @@ -0,0 +1,23 @@
     9.4 +local old_password = param.get("old_password")
     9.5 +local new_password1 = param.get("new_password1")
     9.6 +local new_password2 = param.get("new_password2")
     9.7 +
     9.8 +if not Member:by_login_and_password(app.session.member.login, old_password) then
     9.9 +  slot.put_into("error", _"Old password is wrong")
    9.10 +  return false
    9.11 +end
    9.12 +
    9.13 +if new_password1 ~= new_password2 then
    9.14 +  slot.put_into("error", _"New passwords does not match.")
    9.15 +  return false
    9.16 +end
    9.17 +
    9.18 +if #new_password1 < 8 then
    9.19 +  slot.put_into("error", _"New passwords is too short.")
    9.20 +  return false
    9.21 +end
    9.22 +
    9.23 +app.session.member:set_password(new_password1)
    9.24 +app.session.member:save()
    9.25 +
    9.26 +slot.put_into("notice", _"Your password has been updated successfully")
    10.1 --- a/app/main/member/_show.lua	Sat Jan 02 12:00:00 2010 +0100
    10.2 +++ b/app/main/member/_show.lua	Mon Jan 04 12:00:00 2010 +0100
    10.3 @@ -24,11 +24,11 @@
    10.4                }
    10.5              }
    10.6  
    10.7 -              ui.container{
    10.8 -                attr = { class = "contact_data" },
    10.9 -                content = function()
   10.10 -                end
   10.11 -              }
   10.12 +            ui.container{
   10.13 +              attr = { class = "contact_data" },
   10.14 +              content = function()
   10.15 +              end
   10.16 +            }
   10.17  
   10.18              end
   10.19            }
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/app/main/member/history.lua	Mon Jan 04 12:00:00 2010 +0100
    11.3 @@ -0,0 +1,78 @@
    11.4 +local member = Member:by_id(param.get_id())
    11.5 +
    11.6 +slot.put_into("title", _("Member name history for '#{name}'", { name = member.name }))
    11.7 +
    11.8 +slot.select("actions", function()
    11.9 +  ui.link{
   11.10 +    content = function()
   11.11 +        ui.image{ static = "icons/16/cancel.png" }
   11.12 +        slot.put(_"Back")
   11.13 +    end,
   11.14 +    module = "member",
   11.15 +    view = "show",
   11.16 +    id = member.id
   11.17 +  }
   11.18 +end)
   11.19 +
   11.20 +local entries = member:get_reference_selector("history_entries"):add_order_by("id DESC"):exec()
   11.21 +
   11.22 +ui.tag{
   11.23 +  tag = "table",
   11.24 +  content = function()
   11.25 +    ui.tag{
   11.26 +      tag = "tr",
   11.27 +      content = function()
   11.28 +        ui.tag{
   11.29 +          tag = "th",
   11.30 +          content = _("Name")
   11.31 +        }
   11.32 +        ui.tag{
   11.33 +          tag = "th",
   11.34 +          content = _("Used until")
   11.35 +        }
   11.36 +      end
   11.37 +    }
   11.38 +    ui.tag{
   11.39 +      tag = "tr",
   11.40 +      content = function()
   11.41 +        ui.tag{
   11.42 +          tag = "td",
   11.43 +          content = member.name
   11.44 +        }
   11.45 +        ui.tag{
   11.46 +          tag = "td",
   11.47 +          content = _"continuing"
   11.48 +        }
   11.49 +      end
   11.50 +    }
   11.51 +    for i, entry in ipairs(entries) do
   11.52 +      local display = false
   11.53 +      if (i == 1) then
   11.54 +        if entry.name ~= member.name then
   11.55 +          display = true
   11.56 +        end
   11.57 +      elseif entry.name ~= entries[i-1].name then
   11.58 +        display = true
   11.59 +      end
   11.60 +      if display then
   11.61 +        ui.tag{
   11.62 +          tag = "tr",
   11.63 +          content = function()
   11.64 +            ui.tag{
   11.65 +              tag = "td",
   11.66 +              content = entry.name
   11.67 +            }
   11.68 +            ui.tag{
   11.69 +              tag = "td",
   11.70 +              content = format.timestamp(entry["until"])
   11.71 +            }
   11.72 +          end
   11.73 +        }
   11.74 +      end
   11.75 +    end
   11.76 +  end
   11.77 +}
   11.78 +slot.put("<br />")
   11.79 +ui.container{
   11.80 +  content = _("This member account has been created at #{created}", { created = format.timestamp(member.created)})
   11.81 +}
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/app/main/member/settings.lua	Mon Jan 04 12:00:00 2010 +0100
    12.3 @@ -0,0 +1,75 @@
    12.4 +
    12.5 +slot.put_into("title", _"Settings")
    12.6 +
    12.7 +slot.select("actions", function()
    12.8 +  ui.link{
    12.9 +    content = function()
   12.10 +        ui.image{ static = "icons/16/cancel.png" }
   12.11 +        slot.put(_"Cancel")
   12.12 +    end,
   12.13 +    module = "index",
   12.14 +    view = "index"
   12.15 +  }
   12.16 +end)
   12.17 +
   12.18 +ui.heading{ content = _"Change your name" }
   12.19 +util.help("member.settings.name", _"Change name")
   12.20 +
   12.21 +ui.form{
   12.22 +  attr = { class = "vertical" },
   12.23 +  module = "member",
   12.24 +  action = "update_name",
   12.25 +  routing = {
   12.26 +    ok = {
   12.27 +      mode = "redirect",
   12.28 +      module = "index",
   12.29 +      view = "index"
   12.30 +    }
   12.31 +  },
   12.32 +  content = function()
   12.33 +    ui.field.text{ label = _"Name", name = "name", value = app.session.member.name }
   12.34 +    ui.submit{ value = _"Change name" }
   12.35 +  end
   12.36 +}
   12.37 +
   12.38 +ui.heading{ content = _"Change your login" }
   12.39 +util.help("member.settings.login", _"Change login")
   12.40 +
   12.41 +ui.form{
   12.42 +  attr = { class = "vertical" },
   12.43 +  module = "member",
   12.44 +  action = "update_login",
   12.45 +  routing = {
   12.46 +    ok = {
   12.47 +      mode = "redirect",
   12.48 +      module = "index",
   12.49 +      view = "index"
   12.50 +    }
   12.51 +  },
   12.52 +  content = function()
   12.53 +    ui.field.text{ label = _"Login", name = "login", value = app.session.member.login }
   12.54 +    ui.submit{ value = _"Change login" }
   12.55 +  end
   12.56 +}
   12.57 +
   12.58 +ui.heading{ content = _"Change your password" }
   12.59 +util.help("member.settings.password", _"Change password")
   12.60 +
   12.61 +ui.form{
   12.62 +  attr = { class = "vertical" },
   12.63 +  module = "member",
   12.64 +  action = "update_password",
   12.65 +  routing = {
   12.66 +    ok = {
   12.67 +      mode = "redirect",
   12.68 +      module = "index",
   12.69 +      view = "index"
   12.70 +    }
   12.71 +  },
   12.72 +  content = function()
   12.73 +    ui.field.password{ label = _"Old password", name = "old_password" }
   12.74 +    ui.field.password{ label = _"New password", name = "new_password1" }
   12.75 +    ui.field.password{ label = _"Repeat new password", name = "new_password2" }
   12.76 +    ui.submit{ value = _"Change password" }
   12.77 +  end
   12.78 +}
    13.1 --- a/app/main/member/show.lua	Sat Jan 02 12:00:00 2010 +0100
    13.2 +++ b/app/main/member/show.lua	Mon Jan 04 12:00:00 2010 +0100
    13.3 @@ -13,9 +13,7 @@
    13.4  
    13.5  slot.put_into("title", encode.html(_"Member '#{member}'":gsub("#{member}", member.name)))
    13.6  
    13.7 -if member.id == app.session.member.id then
    13.8 -  slot.put_into("actions", _"That's me!")
    13.9 -else
   13.10 +if member.id ~= app.session.member.id then
   13.11    --TODO performance
   13.12    local contact = Contact:by_pk(app.session.member.id, member.id)
   13.13    if contact then
   13.14 @@ -67,6 +65,18 @@
   13.15    end
   13.16  end
   13.17  
   13.18 +slot.select("actions", function()
   13.19 +  ui.link{
   13.20 +    content = function()
   13.21 +      ui.image{ static = "icons/16/clock_edit.png" }
   13.22 +      slot.put(encode.html(_"Show name history"))
   13.23 +    end,
   13.24 +    module  = "member",
   13.25 +    view    = "history",
   13.26 +    id      = member.id
   13.27 +  }
   13.28 +end)
   13.29 +
   13.30  util.help("member.show", _"Member page")
   13.31  
   13.32  execute.view{
    14.1 --- a/config/default.lua	Sat Jan 02 12:00:00 2010 +0100
    14.2 +++ b/config/default.lua	Mon Jan 04 12:00:00 2010 +0100
    14.3 @@ -1,5 +1,5 @@
    14.4  config.app_name = "LiquidFeedback"
    14.5 -config.app_version = "beta4"
    14.6 +config.app_version = "beta5"
    14.7  
    14.8  config.app_title = config.app_name .. " (" .. request.get_config_name() .. " environment)"
    14.9  
    15.1 --- a/env/util/trim.lua	Sat Jan 02 12:00:00 2010 +0100
    15.2 +++ b/env/util/trim.lua	Mon Jan 04 12:00:00 2010 +0100
    15.3 @@ -1,3 +1,3 @@
    15.4  function util.trim(string)
    15.5 -  return (string:gsub("^%s*", ""):gsub("%s*$", ""))
    15.6 +  return (string:gsub("^%s*", ""):gsub("%s*$", ""):gsub("%s+", " "))
    15.7  end
    15.8 \ No newline at end of file
    16.1 --- a/locale/help/index.change_password.de.txt	Sat Jan 02 12:00:00 2010 +0100
    16.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.3 @@ -1,2 +0,0 @@
    16.4 -=Kennwort ändern=
    16.5 -Dein neues Kennwort muss mindestens 8 Zeichen lang sein.
    17.1 --- a/locale/help/member.edit.de.txt	Sat Jan 02 12:00:00 2010 +0100
    17.2 +++ b/locale/help/member.edit.de.txt	Mon Jan 04 12:00:00 2010 +0100
    17.3 @@ -1,2 +1,4 @@
    17.4  =Profil=
    17.5  Alle Angaben sind freiwillig. In Deinem Profil erscheinen nur die Felder, die nicht leer sind.
    17.6 +
    17.7 +Deinen Namen, Anmeldenamen sowie Kennwort kannst Du auf der Startseite unter Einstellungen ändern.
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/locale/help/member.settings.login.de.txt	Mon Jan 04 12:00:00 2010 +0100
    18.3 @@ -0,0 +1,1 @@
    18.4 +Bitte wähle einen Anmeldenamen. Dieser wird anderen nicht gezeigt und nur von Dir zum Anmelden verwendet. Groß- und Kleinschreibung wird berücksichtigt.
    18.5 \ No newline at end of file
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/locale/help/member.settings.name.de.txt	Mon Jan 04 12:00:00 2010 +0100
    19.3 @@ -0,0 +1,1 @@
    19.4 +Wähle einen Namen, z. B. Deinen Real- oder Nicknamen. Dieser wird anderen angezeigt um Dich zu identifizieren. Aus Gründen der Transparenz können alte Namen in Deiner Namenshistorie im Profil abgerufen werden.
    19.5 \ No newline at end of file
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/locale/help/member.settings.password.de.txt	Mon Jan 04 12:00:00 2010 +0100
    20.3 @@ -0,0 +1,1 @@
    20.4 +Dein neues Kennwort muss mindestens 8 Zeichen lang sein.
    21.1 --- a/locale/translations.de.lua	Sat Jan 02 12:00:00 2010 +0100
    21.2 +++ b/locale/translations.de.lua	Mon Jan 04 12:00:00 2010 +0100
    21.3 @@ -1,4 +1,4 @@
    21.4 -#!/usr/bin/env lua
    21.5 +-- #!/usr/bin/env lua
    21.6  return {
    21.7  ["#{interested_issues_to_vote_count} issue(s) you are interested in"] = "#{interested_issues_to_vote_count} Themen, die Dich interessieren";
    21.8  ["#{issues_to_vote_count} issue(s)"] = "#{issues_to_vote_count} Themen";
    21.9 @@ -39,7 +39,6 @@
   21.10  ["Back"] = "Zurück";
   21.11  ["Become a member"] = "Mitglied werden";
   21.12  ["Birthday"] = "Geburtstag";
   21.13 -["Bug report"] = "Fehlerbericht";
   21.14  ["Can't send confirmation email"] = "Bestätigungs-E-Mail kann nicht versendet werden.";
   21.15  ["Cancel"] = "Abbrechen";
   21.16  ["Cancel password reset"] = "Kennwort-Rücksetzung abbrechen";
   21.17 @@ -48,7 +47,12 @@
   21.18  ["Change area delegation"] = "Delegation für Themengebiet ändern";
   21.19  ["Change global delegation"] = "Globale Delegation ändern";
   21.20  ["Change issue delegation"] = "Delegation für Thema ändern";
   21.21 +["Change login"] = "Login ändern";
   21.22 +["Change name"] = "Name ändern";
   21.23  ["Change password"] = "Kennwort ändern";
   21.24 +["Change your login"] = "Deinen Anmeldenamen ändern";
   21.25 +["Change your name"] = "Deinen Namen ändern";
   21.26 +["Change your password"] = "Dein Kennwort ändern";
   21.27  ["Click for details"] = "Klicke für Details";
   21.28  ["Close"] = "Schließen";
   21.29  ["Closed"] = "geschlossen";
   21.30 @@ -77,6 +81,8 @@
   21.31  ["Discussion"] = "Diskussion";
   21.32  ["Discussion URL"] = "Diskussions-URL";
   21.33  ["Discussion time"] = "Zeit für die Diskussions";
   21.34 +["Download"] = "Download";
   21.35 +["Download database export"] = "Datenbankexport herunterladen";
   21.36  ["Draft"] = "Entwurf";
   21.37  ["Edit"] = "Bearbeiten";
   21.38  ["Edit draft"] = "Entwurf bearbeiten";
   21.39 @@ -96,7 +102,6 @@
   21.40  ["Finish voting"] = "Stimmabgabe abschließen";
   21.41  ["Finished"] = "Abgeschlossen";
   21.42  ["Frozen"] = "Eingefroren";
   21.43 -["Fulfilled"] = "Erfüllt";
   21.44  ["Fully frozen at"] = "Ganz eingefroren am/um";
   21.45  ["Global delegation"] = "Globale Delegation";
   21.46  ["Global delegation active"] = "Globale Delegation aktiv";
   21.47 @@ -158,8 +163,8 @@
   21.48  ["Member is administrator"] = "Mitglied ist Administrator";
   21.49  ["Member is already saved in your contacts!"] = "Mitglied ist schon in Deinen Kontakten!";
   21.50  ["Member list"] = "Mitgliederliste";
   21.51 -["Member login"] = "Mitglied Login";
   21.52  ["Member name"] = "Mitglied Name";
   21.53 +["Member name history for '#{name}'"] = "Namenshistorie für '#{name}'";
   21.54  ["Member page"] = "Mitgliederseite";
   21.55  ["Member successfully registered"] = "Mitglied erfolgreich registriert";
   21.56  ["Member successfully updated"] = "Mitglied erfolgreich aktualisert";
   21.57 @@ -189,6 +194,7 @@
   21.58  ["No support at all"] = "Gar keine Unterstützung";
   21.59  ["Not a member"] = "Kein Mitglied";
   21.60  ["Not voted"] = "Nicht abgestimmt";
   21.61 +["Not yet voted"] = "Noch abzustimmen";
   21.62  ["Number of incoming delegations, follow link to see more details"] = "Anzahl eingehender Delegationen, Link folgen für mehr Details";
   21.63  ["OK"] = "OK";
   21.64  ["Old draft revision"] = "Alte Revision des Entwurfs";
   21.65 @@ -214,7 +220,7 @@
   21.66  ["Phone"] = "Telefon";
   21.67  ["Photo"] = "Foto";
   21.68  ["Please choose a login name. This name will not be shown to others and is used only by you to login into the system. The login name is case sensitive."] = "Bitte wähle einen Anmeldenamen. Dieser wird anderen nicht gezeigt und nur von Dir zum Anmelden verwendet. Groß- und Kleinschreibung wird berücksichtigt.";
   21.69 -["Please choose a name, i.e. your real name or your nick name. This name will be shown to others to identify you. You CAN'T change this name later, so please choose it wisely!"] = "Bitte wähle einen Namen, z. B. Deinen Real- oder Nicknamen. Dieser wird anderen angezeigt um Dich zu identifizieren. Du kannst Deinen Namen später NICHT ändern, wähle ihn also weise!";
   21.70 +["Please choose a name, i.e. your real name or your nick name. This name will be shown to others to identify you."] = "Wähle einen Namen, z. B. Deinen Real- oder Nicknamen. Dieser wird anderen angezeigt um Dich zu identifizieren.";
   21.71  ["Please choose a password and enter it twice. The password is case sensitive."] = "Bitte wähle ein Kennwort und gebe es zweimal ein. Groß- und Kleinschreibung wird berücksichtigt.";
   21.72  ["Please confirm your email address by clicking the following link:\n\n"] = "Bitte bestätige Deine E-Mail-Adresse, indem Du den folgenden Link anklickst:\n\n";
   21.73  ["Please enter the email reset code you have received:"] = "Bitte gib den Rücksetzcode ein, den Du erhalten hast:";
   21.74 @@ -266,6 +272,7 @@
   21.75  ["Set global delegation"] = "Globale Delegation festlegen";
   21.76  ["Set issue delegation"] = "Delegation für Thema festlegen";
   21.77  ["Set new password"] = "Neues Kennwort setzen";
   21.78 +["Settings"] = "Einstellungen";
   21.79  ["Show"] = "Zeige";
   21.80  ["Show active members"] = "Zeige aktive Mitglieder";
   21.81  ["Show all initiatives"] = "Zeige alle Initiativen";
   21.82 @@ -274,6 +281,7 @@
   21.83  ["Show diff"] = "Änderungen anzeigen";
   21.84  ["Show locked members"] = "Zeige gesperrte Mitglieder";
   21.85  ["Show member"] = "Mitglied anzeigen";
   21.86 +["Show name history"] = "Namenshistorie zeigen";
   21.87  ["Software"] = "Software";
   21.88  ["Some JavaScript based functions (voting in particular) will not work.\nFor this beta, please use a current version of Firefox, Safari, Opera(?), Konqueror or another (more) standard compliant browser.\nAlternative access without JavaScript will be available soon."] = "Einige auf JavaScript basierende Funktionen (insbesondere der Abstimmung) sind nicht benutzbar.\nFür diese Beta verwende bitte eine aktuelle Version von Firefox, Safari, Opera(?), Konqueror oder einen anderen (mehr) den Standards entsprechenden Browser.\nEin alternativer Zugriff ohne JavaScript wird bald zur Verfügung stehen.";
   21.89  ["Sorry, but there is not confirmed email address for your account. Please contact the administrator or support."] = "Sorry, aber für diesen Account ist keine bestätigte E-Mail-Adresse hinterlegt. Bitte wende Dich an den Administrator oder den Support.";
   21.90 @@ -296,15 +304,16 @@
   21.91  ["Supported initiatives"] = "Unterstützte Initiativen";
   21.92  ["Supporter"] = "Unterstützer";
   21.93  ["Terms accepted"] = "Bedingungen akzeptiert";
   21.94 -["That's me!"] = "Das bin ich";
   21.95  ["The code you've entered is invalid"] = "Der Code, den Du eingeben hast, ist nicht gültig!";
   21.96  ["The drafts do not differ"] = "Die Entwürfe unterscheiden sich nicht";
   21.97  ["This issue is already closed."] = "Das Thema ist schon geschlossen.";
   21.98  ["This issue is already frozen."] = "Das Thema ist schon eingefroren";
   21.99  ["This login is already taken, please choose another one!"] = "Dieser Anmeldename ist bereits vergeben, bitte wähle einen anderen!";
  21.100  ["This login is too short!"] = "Dieser Anmeldename ist zu kurz!";
  21.101 +["This member account has been created at #{created}"] = "Dieser Mitgliedszugang wurde am/um #{created} angelegt.";
  21.102  ["This name is already taken, please choose another one!"] = "Dieser Name ist bereits vergeben, bitte wähle einen anderen!";
  21.103  ["This name is really too short!"] = "Dieser Name ist wirklich zu kurz!";
  21.104 +["This name is too short!"] = "Dieser Name ist zu kurz!";
  21.105  ["This suggestion has been meanwhile deleted"] = "Diese Anregung wurde zwischenzeitlich gelöscht";
  21.106  ["This title is really too short!"] = "Dieser Titel ist wirklich zu kurz!";
  21.107  ["This username is too short!"] = "Dieser Benutzername ist zu kurz!";
  21.108 @@ -314,6 +323,7 @@
  21.109  ["Trustee"] = "Bevollmächtigter";
  21.110  ["Unknown author"] = "Unbekannter Autor";
  21.111  ["Upload images"] = "Bilder hochladen";
  21.112 +["Used until"] = "Benutzt bis";
  21.113  ["Verification time"] = "Zeit für die Überprüfung";
  21.114  ["Version"] = "Version";
  21.115  ["Vote later"] = "Später abstimmen";
  21.116 @@ -353,6 +363,8 @@
  21.117  ["Your delegation for this issue has been updated."] = "Deine Delegation für dieses Thema wurde geändert";
  21.118  ["Your global delegation has been deleted."] = "Deine globale Delegation wurde gelöscht";
  21.119  ["Your global delegation has been updated."] = "Deine globale Delegation wurde geändert";
  21.120 +["Your login has been changed to '#{login}'"] = "Dein Anmeldename wurde auf '#{login}' geändert";
  21.121 +["Your name has been changed"] = "Dein Name wurde geändert";
  21.122  ["Your opinion has been deleted"] = "Deine Meinung wurde gelöscht";
  21.123  ["Your opinion has been updated"] = "Deine Meinung wurde aktualisiert";
  21.124  ["Your page has been updated"] = "Deine Seite wurde aktualisiert";
  21.125 @@ -364,6 +376,7 @@
  21.126  ["Your web browser is not fully supported yet."] = "Dein Web-Browser wird noch nicht vollständig unterstützt.";
  21.127  ["Z-A"] = "Z-A";
  21.128  ["all"] = "Alle";
  21.129 +["continuing"] = "andauernd";
  21.130  ["delete<br /><br />"] = "löschen<br /><br />";
  21.131  ["email"] = "E-Mail";
  21.132  ["login name"] = "Anmeldename";
    22.1 --- a/model/member.lua	Sat Jan 02 12:00:00 2010 +0100
    22.2 +++ b/model/member.lua	Mon Jan 04 12:00:00 2010 +0100
    22.3 @@ -2,6 +2,15 @@
    22.4  Member.table = 'member'
    22.5  
    22.6  Member:add_reference{
    22.7 +  mode          = "1m",
    22.8 +  to            = "MemberHistory",
    22.9 +  this_key      = 'id',
   22.10 +  that_key      = 'member_id',
   22.11 +  ref           = 'history_entries',
   22.12 +  back_ref      = 'member'
   22.13 +}
   22.14 +
   22.15 +Member:add_reference{
   22.16    mode          = '1m',
   22.17    to            = "MemberImage",
   22.18    this_key      = 'id',
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/model/member_history.lua	Mon Jan 04 12:00:00 2010 +0100
    23.3 @@ -0,0 +1,2 @@
    23.4 +MemberHistory = mondelefant.new_class()
    23.5 +MemberHistory.table = 'member_history'
    24.1 Binary file static/icons/16/clock_edit.png has changed
    25.1 Binary file static/icons/16/wrench.png has changed
    26.1 --- a/static/style.css	Sat Jan 02 12:00:00 2010 +0100
    26.2 +++ b/static/style.css	Mon Jan 04 12:00:00 2010 +0100
    26.3 @@ -53,6 +53,16 @@
    26.4    vertical-align: middle;
    26.5  }
    26.6  
    26.7 +h1 {
    26.8 +  font-size: 150%;
    26.9 +}
   26.10 +
   26.11 +h2 {
   26.12 +  font-size: 125%;
   26.13 +}
   26.14 +
   26.15 +
   26.16 +
   26.17  /*************************************************************************
   26.18   * Notices, warnings and errors
   26.19   */
   26.20 @@ -871,6 +881,11 @@
   26.21    padding: 1ex;
   26.22  }
   26.23  
   26.24 +a.not_voted {
   26.25 +  display: block;
   26.26 +  background-color: #fec;
   26.27 +  color: #000;
   26.28 +}
   26.29  
   26.30  /*************************************************************************
   26.31   * Voting

Impressum / About Us