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