liquid_feedback_frontend
changeset 52:88ac7798b562
Several bugfixes (getpic.c, accepted but canceled issues, ...); Listing of available policies
- Bugfixes in fastpath/getpic.c (related to crashes since alpha5)
- Respect Content-Types of images in database
(needs database update, as Content-Type was incorrectly stored by previous versions)
- Typo fixed in help messages
- RSS-Feed (currently only after manual authentication while session is valid)
- Listing of available policies
- German translation fixed: "gebe" -> "gib" (Imperativ)
- Bugfixes related to issues which had been accepted but canceled afterwards
- Prohibit creation of initiatives in disabled areas or with disabled policies
- Bugfixes in fastpath/getpic.c (related to crashes since alpha5)
- Respect Content-Types of images in database
(needs database update, as Content-Type was incorrectly stored by previous versions)
- Typo fixed in help messages
- RSS-Feed (currently only after manual authentication while session is valid)
- Listing of available policies
- German translation fixed: "gebe" -> "gib" (Imperativ)
- Bugfixes related to issues which had been accepted but canceled afterwards
- Prohibit creation of initiatives in disabled areas or with disabled policies
line diff
1.1 --- a/app/main/_filter/21_auth.lua Sun Apr 04 22:05:11 2010 +0200 1.2 +++ b/app/main/_filter/21_auth.lua Thu Apr 15 19:58:25 2010 +0200 1.3 @@ -23,6 +23,7 @@ 1.4 or request.get_view() == "show" 1.5 or request.get_view() == "show_tab" 1.6 ) 1.7 + or request.get_module() == "policy" and request.get_view() == "show" 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"
2.1 --- a/app/main/_filter_view/34_stylesheet.lua Sun Apr 04 22:05:11 2010 +0200 2.2 +++ b/app/main/_filter_view/34_stylesheet.lua Thu Apr 15 19:58:25 2010 +0200 2.3 @@ -41,7 +41,7 @@ 2.4 slot.set_layout("blank") 2.5 end 2.6 2.7 -if request.get_module() ~= "api" then 2.8 +if request.get_module() ~= "api" and request.get_view() ~= "list_rss" then 2.9 ui.container{ 2.10 attr = { 2.11 class = web20 and "web20" or "web10"
3.1 --- a/app/main/_layout/atom.html Sun Apr 04 22:05:11 2010 +0200 3.2 +++ b/app/main/_layout/atom.html Thu Apr 15 19:58:25 2010 +0200 3.3 @@ -1,12 +1,5 @@ 3.4 <?xml version="1.0" encoding="utf-8"?> 3.5 3.6 <feed xmlns="http://www.w3.org/2005/Atom"> 3.7 - <author> 3.8 - <name>foo</name> 3.9 - </author> 3.10 - <title>LiquidFeedback</title> 3.11 - <subtitle>Initiatives</subtitle> 3.12 - <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id> 3.13 - <updated>2003-12-14T10:20:09Z</updated> 3.14 <!-- WEBMCP SLOTNODIV default --> 3.15 </feed>
4.1 --- a/app/main/area/show.lua Sun Apr 04 22:05:11 2010 +0200 4.2 +++ b/app/main/area/show.lua Thu Apr 15 19:58:25 2010 +0200 4.3 @@ -1,5 +1,10 @@ 4.4 local area = Area:new_selector():add_where{ "id = ?", param.get_id() }:single_object_mode():exec() 4.5 4.6 +if config.feature_rss_enabled then 4.7 + util.html_rss_head{ title = _"Initiatives in this area (last created first)", module = "initiative", view = "list_rss", params = { area_id = area.id } } 4.8 + util.html_rss_head{ title = _"Initiatives in this area (last updated first)", module = "initiative", view = "list_rss", params = { area_id = area.id } } 4.9 +end 4.10 + 4.11 slot.put_into("title", encode.html(_"Area '#{name}'":gsub("#{name}", area.name))) 4.12 4.13 ui.container{
5.1 --- a/app/main/initiative/_action/create.lua Sun Apr 04 22:05:11 2010 +0200 5.2 +++ b/app/main/initiative/_action/create.lua Thu Apr 15 19:58:25 2010 +0200 5.3 @@ -27,6 +27,10 @@ 5.4 else 5.5 local area_id = param.get("area_id", atom.integer) 5.6 area = Area:new_selector():add_where{"id=?",area_id}:single_object_mode():exec() 5.7 + if not area.active then 5.8 + slot.put_into("error", "Invalid area.") 5.9 + return false 5.10 + end 5.11 end 5.12 5.13 local policy_id = param.get("policy_id", atom.integer) 5.14 @@ -36,6 +40,13 @@ 5.15 return false 5.16 end 5.17 5.18 +local policy = Policy:by_id(policy_id) 5.19 + 5.20 +if not policy.active then 5.21 + slot.put_into("error", "Invalid policy.") 5.22 + return false 5.23 +end 5.24 + 5.25 local name = param.get("name") 5.26 5.27 local name = util.trim(name)
6.1 --- a/app/main/initiative/list_rss.lua Sun Apr 04 22:05:11 2010 +0200 6.2 +++ b/app/main/initiative/list_rss.lua Thu Apr 15 19:58:25 2010 +0200 6.3 @@ -1,19 +1,103 @@ 6.4 +if not config.feature_rss_enabled then 6.5 + error("feature not enabled") 6.6 +end 6.7 + 6.8 +local area_id = param.get("area_id", atom.integer) 6.9 +local issue_id = param.get("issue_id", atom.integer) 6.10 +local order = param.get("order") or "last_created" 6.11 + 6.12 +local initiatives_selector = Initiative:new_selector() 6.13 + 6.14 +local issue 6.15 +local area 6.16 + 6.17 +if issue_id then 6.18 + issue = Issue:by_id(issue_id) 6.19 + initiatives_selector:add_where{ "initiative.issue_id = ?", issue_id } 6.20 +elseif area_id then 6.21 + area = Area:by_id(area_id) 6.22 + initiatives_selector:join("issue", nil, "issue.id = initiative.issue_id") 6.23 + initiatives_selector:add_where{ "issue.area_id = ?", area_id } 6.24 +end 6.25 + 6.26 + 6.27 +if order == "last_created" then 6.28 + initiatives_selector:add_order_by("initiative.created DESC") 6.29 + initiatives_selector:add_field("initiative.created", "created_or_updated") 6.30 +elseif order == "last_updated" then 6.31 + initiatives_selector:add_field("(SELECT MAX(created) FROM draft WHERE initiative_id = initiative.id GROUP BY initiative_id)", "created_or_updated") 6.32 + initiatives_selector:add_order_by("(SELECT MAX(created) FROM draft WHERE initiative_id = initiative.id GROUP BY initiative_id) DESC") 6.33 +else 6.34 + error("Invalid order") 6.35 +end 6.36 + 6.37 +initiatives_selector:add_order_by("id DESC") 6.38 + 6.39 +initiatives_selector:limit(25) 6.40 + 6.41 +local initiatives = initiatives_selector:exec() 6.42 + 6.43 slot.set_layout("atom") 6.44 - 6.45 request.force_absolute_baseurl() 6.46 6.47 -local initiatives = Initiative:new_selector() 6.48 - :add_order_by("id DESC") 6.49 - :limit(25) 6.50 - :exec() 6.51 +ui.tag{ 6.52 + tag = "author", 6.53 + content = function() 6.54 + ui.tag{ 6.55 + tag = "name", 6.56 + content = "LiquidFeedback" 6.57 + } 6.58 + end 6.59 +} 6.60 + 6.61 +local title 6.62 + 6.63 +if issue then 6.64 + title = "#" .. tostring(issue.id) .. " " .. issue.area.name 6.65 +elseif area then 6.66 + title = area.name 6.67 +else 6.68 + title = config.app_title 6.69 +end 6.70 + 6.71 +ui.tag{ 6.72 + tag = "title", 6.73 + content = title 6.74 +} 6.75 + 6.76 +local subtitle 6.77 +if order == "last_created" then 6.78 + subtitle = "Initiatives (last created first)" 6.79 +elseif order == "last_updated" then 6.80 + subtitle = "Initiatives (last updated first)" 6.81 +end 6.82 + 6.83 +ui.tag{ 6.84 + tag = "subtitle", 6.85 + content = subtitle 6.86 +} 6.87 + 6.88 +ui.tag{ 6.89 + tag = "id", 6.90 + content = "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6" 6.91 +} 6.92 + 6.93 +ui.tag{ 6.94 + tag = "updated", 6.95 + content = "2003-12-14T10:20:09Z" 6.96 +} 6.97 6.98 for i, initiative in ipairs(initiatives) do 6.99 ui.tag{ 6.100 tag = "entry", 6.101 content = function() 6.102 - ui.tag{ tag = "category", attr = { term = initiative.issue.area.name } } 6.103 - ui.tag{ tag = "author", content = initiative.current_draft.author.name } 6.104 - ui.tag{ tag = "title", content = initiative.name } 6.105 + slot.put("\n") 6.106 + ui.tag{ tag = "category", attr = { term = encode.html(initiative.issue.area.name) } } 6.107 + slot.put("\n") 6.108 + ui.tag{ tag = "author", content = encode.html(initiative.current_draft.author.name) } 6.109 + slot.put("\n") 6.110 + ui.tag{ tag = "title", content = encode.html(initiative.shortened_name) } 6.111 + slot.put("\n") 6.112 ui.tag{ tag = "link", attr = { 6.113 href = encode.url{ 6.114 module = "initiative", 6.115 @@ -21,9 +105,14 @@ 6.116 id = initiative.id 6.117 } 6.118 } } 6.119 - ui.tag{ tag = "id", content = "initiative_" .. tostring(initiative_id) } 6.120 - ui.tag{ tag = "updated", content = tostring(initiative.created) } 6.121 - ui.tag{ tag = "content", content = initiative.current_draft.draft } 6.122 + slot.put("\n") 6.123 + ui.tag{ tag = "id", content = "initiative_" .. tostring(initiative.id) } 6.124 + slot.put("\n") 6.125 + ui.tag{ tag = "updated", content = tostring(initiative.created_or_updated) } 6.126 + slot.put("\n") 6.127 + ui.tag{ tag = "content", content = encode.html(initiative.current_draft.content or "") } 6.128 + slot.put("\n") 6.129 end 6.130 } 6.131 -end 6.132 \ No newline at end of file 6.133 + slot.put("\n") 6.134 +end
7.1 --- a/app/main/initiative/new.lua Sun Apr 04 22:05:11 2010 +0200 7.2 +++ b/app/main/initiative/new.lua Thu Apr 15 19:58:25 2010 +0200 7.3 @@ -27,6 +27,7 @@ 7.4 attr = { class = "vertical" }, 7.5 content = function() 7.6 ui.field.text{ label = _"Area", value = area.name } 7.7 + slot.put("<br />") 7.8 if issue_id then 7.9 ui.field.text{ label = _"Issue", value = issue_id } 7.10 else 7.11 @@ -43,7 +44,34 @@ 7.12 value = (area.default_policy or {}).id 7.13 } 7.14 end 7.15 - ui.field.text{ label = _"Name", name = "name" } 7.16 + ui.tag{ 7.17 + tag = "div", 7.18 + content = function() 7.19 + ui.tag{ 7.20 + tag = "label", 7.21 + attr = { class = "ui_field_label" }, 7.22 + content = function() slot.put(" ") end, 7.23 + } 7.24 + ui.tag{ 7.25 + content = function() 7.26 + ui.link{ 7.27 + text = _"Information about the available policies", 7.28 + module = "policy", 7.29 + view = "list" 7.30 + } 7.31 + slot.put(" ") 7.32 + ui.link{ 7.33 + attr = { target = "_blank" }, 7.34 + text = _"(new window)", 7.35 + module = "policy", 7.36 + view = "list" 7.37 + } 7.38 + end 7.39 + } 7.40 + end 7.41 + } 7.42 + slot.put("<br />") 7.43 + ui.field.text{ label = _"Title of initiative", name = "name" } 7.44 ui.field.text{ label = _"Discussion URL", name = "discussion_url" } 7.45 ui.field.select{ 7.46 label = _"Wiki engine",
8.1 --- a/app/main/issue/_list.lua Sun Apr 04 22:05:11 2010 +0200 8.2 +++ b/app/main/issue/_list.lua Thu Apr 15 19:58:25 2010 +0200 8.3 @@ -65,7 +65,7 @@ 8.4 name = "cancelled", 8.5 label = _"Cancelled", 8.6 selector_modifier = function(selector) 8.7 - selector:add_where("issue.closed NOTNULL AND issue.accepted ISNULL") 8.8 + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") 8.9 end 8.10 }, 8.11 {
9.1 --- a/app/main/issue/_show_box.lua Sun Apr 04 22:05:11 2010 +0200 9.2 +++ b/app/main/issue/_show_box.lua Thu Apr 15 19:58:25 2010 +0200 9.3 @@ -1,10 +1,28 @@ 9.4 local issue = param.get("issue", "table") 9.5 9.6 slot.select("issue_info", function() 9.7 - ui.field.text{ 9.8 - label = _"Policy", 9.9 - value = issue.policy.name 9.10 + ui.tag{ 9.11 + tag = "div", 9.12 + content = function() 9.13 + ui.tag{ 9.14 + tag = "label", 9.15 + attr = { class = "ui_field_label" }, 9.16 + content = _"Policy", 9.17 + } 9.18 + ui.tag{ 9.19 + content = function() 9.20 + ui.link{ 9.21 + text = issue.policy.name, 9.22 + module = "policy", 9.23 + view = "show", 9.24 + id = issue.policy.id 9.25 + } 9.26 + end 9.27 + } 9.28 + 9.29 + end 9.30 } 9.31 + 9.32 ui.field.text{ 9.33 label = _"State", 9.34 value = issue.state_name
10.1 --- a/app/main/issue/_show_head.lua Sun Apr 04 22:05:11 2010 +0200 10.2 +++ b/app/main/issue/_show_head.lua Thu Apr 15 19:58:25 2010 +0200 10.3 @@ -6,7 +6,10 @@ 10.4 direct_voter = DirectVoter:by_pk(issue.id, app.session.member.id) 10.5 end 10.6 10.7 -slot.put_into("html_head", '<link rel="alternate" type="application/rss+xml" title="RSS" href="../show/' .. tostring(issue.id) .. '.rss" />') 10.8 +if config.feature_rss_enabled then 10.9 + util.html_rss_head{ title = _"Initiatives in this issue (last created first)", module = "initiative", view = "list_rss", params = { issue_id = issue.id } } 10.10 + util.html_rss_head{ title = _"Initiatives in this issue (last updated first)", module = "initiative", view = "list_rss", params = { issue_id = issue.id, order = "last_updated" } } 10.11 +end 10.12 10.13 slot.select("path", function() 10.14 end)
11.1 --- a/app/main/issue/show.rss.lua Sun Apr 04 22:05:11 2010 +0200 11.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 11.3 @@ -1,35 +0,0 @@ 11.4 -slot.set_layout("rss") 11.5 - 11.6 -local function rss_channel(channel) 11.7 - for key, val in pairs(channel) do 11.8 - slot.put("<", key, ">", encode.html(val), "</", key, ">") 11.9 - end 11.10 -end 11.11 - 11.12 -local function rss_item(item) 11.13 - slot.put("<item>") 11.14 - for key, val in pairs(item) do 11.15 - slot.put("<", key, ">", encode.html(val), "</", key, ">") 11.16 - end 11.17 - slot.put("</item>") 11.18 -end 11.19 - 11.20 - 11.21 -local issue = Issue:by_id(param.get_id()) 11.22 - 11.23 -rss_channel{ 11.24 - title = issue.area.name .. " :: Issue #" .. tostring(issue.id), 11.25 - language = "de", 11.26 - pubDate = "Tue, 8 Jul 2008 2:43:19" 11.27 -} 11.28 - 11.29 -for i, initiative in ipairs(issue.initiatives) do 11.30 - rss_item{ 11.31 - title = initiative.name, 11.32 - description = initiative.current_draft.content, 11.33 - link = "http://localhost/lf/initiative/show/" .. tostring(initiative.id) .. ".html", 11.34 - author = initiative.current_draft.author.name, 11.35 - guid = "guid", 11.36 - pubDate = "Tue, 8 Jul 2008 2:43:19" 11.37 - } 11.38 -end 11.39 \ No newline at end of file
12.1 --- a/app/main/member/_action/update_images.lua Sun Apr 04 22:05:11 2010 +0200 12.2 +++ b/app/main/member/_action/update_images.lua Thu Apr 15 19:58:25 2010 +0200 12.3 @@ -31,6 +31,7 @@ 12.4 member_image.member_id = member_id 12.5 member_image.image_type = image_type 12.6 member_image.scaled = false 12.7 + member_image.content_type = cgi.post_types[image_type] or nil 12.8 member_image.data = "" 12.9 member_image:save() 12.10 end 12.11 @@ -40,7 +41,7 @@ 12.12 member_image_scaled.member_id = member_id 12.13 member_image_scaled.image_type = image_type 12.14 member_image_scaled.scaled = true 12.15 - member_image_scaled.content_type = true 12.16 + member_image_scaled.content_type = config.member_image_content_type 12.17 member_image_scaled.data = "" 12.18 member_image_scaled:save() 12.19 end
13.1 --- a/app/main/member_image/show.lua Sun Apr 04 22:05:11 2010 +0200 13.2 +++ b/app/main/member_image/show.lua Thu Apr 15 19:58:25 2010 +0200 13.3 @@ -11,11 +11,10 @@ 13.4 exit() 13.5 end 13.6 13.7 -print('Content-type: ' .. record.content_type .. '\n') 13.8 +assert(record.content_type, "No content-type set for image.") 13.9 + 13.10 +slot.set_layout(nil, record.content_type) 13.11 13.12 if record then 13.13 - io.stdout:write(record.data) 13.14 -else 13.15 + slot.put_into("data", record.data) 13.16 end 13.17 - 13.18 -exit()
14.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 14.2 +++ b/app/main/policy/list.lua Thu Apr 15 19:58:25 2010 +0200 14.3 @@ -0,0 +1,61 @@ 14.4 +slot.put_into("title", _"Policies") 14.5 + 14.6 +util.help("policy.list", _"Policies") 14.7 +local policies = Policy:new_selector() 14.8 + :add_where("active") 14.9 + :add_order_by("index") 14.10 + :exec() 14.11 + 14.12 +ui.list{ 14.13 + records = policies, 14.14 + columns = { 14.15 + { 14.16 + label_attr = { width = "500" }, 14.17 + label = _"Policy", 14.18 + content = function(policy) 14.19 + ui.tag{ 14.20 + tag = "div", 14.21 + attr = { style = "font-weight: bold" }, 14.22 + content = function() 14.23 + slot.put(encode.html(policy.name)) 14.24 + if not policy.active then 14.25 + slot.put(" (", _"disabled", ")") 14.26 + end 14.27 + end 14.28 + } 14.29 + ui.tag{ 14.30 + tag = "div", 14.31 + content = policy.description 14.32 + } 14.33 + end 14.34 + }, 14.35 + { 14.36 + label_attr = { width = "200" }, 14.37 + label = _"Phases", 14.38 + content = function(policy) 14.39 + ui.field.text{ label = _"New" .. ":", value = "≤ " .. policy.admission_time } 14.40 + ui.field.text{ label = _"Discussion" .. ":", value = policy.discussion_time } 14.41 + ui.field.text{ label = _"Frozen" .. ":", value = policy.verification_time } 14.42 + ui.field.text{ label = _"Voting" .. ":", value = policy.voting_time } 14.43 + end 14.44 + }, 14.45 + { 14.46 + label_attr = { width = "200" }, 14.47 + label = _"Quorum", 14.48 + content = function(policy) 14.49 + ui.field.text{ 14.50 + label = _"Issue quorum" .. ":", 14.51 + value = "≥ " .. tostring(policy.issue_quorum_num) .. "/" .. tostring(policy.issue_quorum_den) 14.52 + } 14.53 + ui.field.text{ 14.54 + label = _"Initiative quorum" .. ":", 14.55 + value = "≥ " .. tostring(policy.initiative_quorum_num) .. "/" .. tostring(policy.initiative_quorum_den) 14.56 + } 14.57 + ui.field.text{ 14.58 + label = _"Majority" .. ":", 14.59 + value = (policy.majority_strict and ">" or "≥" ) .. " " .. tostring(policy.majority_num) .. "/" .. tostring(policy.majority_den) 14.60 + } 14.61 + end 14.62 + }, 14.63 + } 14.64 +} 14.65 \ No newline at end of file
15.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 15.2 +++ b/app/main/policy/show.lua Thu Apr 15 19:58:25 2010 +0200 15.3 @@ -0,0 +1,40 @@ 15.4 +local policy = Policy:by_id(param.get_id()) 15.5 + 15.6 +slot.put_into("title", encode.html(_("Policy '#{name}'", { name = policy.name }))) 15.7 + 15.8 +ui.form{ 15.9 + attr = { class = "vertical" }, 15.10 + record = policy, 15.11 + content = function() 15.12 + ui.field.text{ label = _"Name", value = policy.name } 15.13 + 15.14 + ui.field.text{ label = _"New", value = "≤ " .. policy.admission_time } 15.15 + ui.field.text{ label = _"Discussion", value = policy.discussion_time } 15.16 + ui.field.text{ label = _"Frozen", value = policy.verification_time } 15.17 + ui.field.text{ label = _"Voting", value = policy.voting_time } 15.18 + 15.19 + ui.field.text{ 15.20 + label = _"Issue quorum", 15.21 + value = "≥ " .. tostring(policy.issue_quorum_num) .. "/" .. tostring(policy.issue_quorum_den) 15.22 + } 15.23 + ui.field.text{ 15.24 + label = _"Initiative quorum", 15.25 + value = "≥ " .. tostring(policy.initiative_quorum_num) .. "/" .. tostring(policy.initiative_quorum_den) 15.26 + } 15.27 + ui.field.text{ 15.28 + label = _"Majority", 15.29 + value = (policy.majority_strict and ">" or "≥" ) .. " " .. tostring(policy.majority_num) .. "/" .. tostring(policy.majority_den) 15.30 + } 15.31 + 15.32 + ui.container{ 15.33 + attr = { class = "suggestion_content wiki" }, 15.34 + content = function() 15.35 + ui.tag{ 15.36 + tag = "p", 15.37 + content = policy.description 15.38 + } 15.39 + end 15.40 + } 15.41 + 15.42 + end 15.43 +}
16.1 --- a/config/default.lua Sun Apr 04 22:05:11 2010 +0200 16.2 +++ b/config/default.lua Thu Apr 15 19:58:25 2010 +0200 16.3 @@ -9,6 +9,7 @@ 16.4 16.5 config.use_terms = "=== Nutzungsbedingungen ===\nAlles ist verboten" 16.6 16.7 +config.member_image_content_type = "image/jpeg" 16.8 config.member_image_convert_func = { 16.9 avatar = function(data) return os.pfilter(data, "convert", "jpeg:-", "-thumbnail", "48x48", "jpeg:-") end, 16.10 photo = function(data) return os.pfilter(data, "convert", "jpeg:-", "-thumbnail", "240x240", "jpeg:-") end 16.11 @@ -31,6 +32,8 @@ 16.12 16.13 config.api_enabled = false 16.14 16.15 +config.feature_rss_enabled = true 16.16 + 16.17 -- OpenID authentication is not fully implemented yet, DO NOT USE BEFORE THIS NOTICE HAS BEEN REMOVED! 16.18 config.auth_openid_enabled = false 16.19 config.auth_openid_https_as_default = true
17.1 --- a/config/development.lua Sun Apr 04 22:05:11 2010 +0200 17.2 +++ b/config/development.lua Thu Apr 15 19:58:25 2010 +0200 17.3 @@ -12,9 +12,11 @@ 17.4 17.5 config.issue_discussion_url_func = function(issue) return "http://example.com/issue_" .. tostring(issue.id) end 17.6 17.7 -config.auth_openid_enabled = true 17.8 +config.auth_openid_enabled = false 17.9 config.auth_openid_https_as_default = true 17.10 17.11 +config.api_enabled = true 17.12 + 17.13 config.auth_openid_identifier_check_func = function(uri) 17.14 local uri = uri:lower() 17.15 if uri:find("^https://") then
18.1 --- a/env/util/autoapi.lua Sun Apr 04 22:05:11 2010 +0200 18.2 +++ b/env/util/autoapi.lua Thu Apr 15 19:58:25 2010 +0200 18.3 @@ -14,8 +14,10 @@ 18.4 elseif field.field then 18.5 value = row[field.name] 18.6 end 18.7 - if value then 18.8 + if value ~= nil then 18.9 slot.put(encode.html(tostring(value))) 18.10 + else 18.11 + slot.put("NULL") 18.12 end 18.13 slot.put("</", field.name, ">\n") 18.14 end
19.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 19.2 +++ b/env/util/html_rss_head.lua Thu Apr 15 19:58:25 2010 +0200 19.3 @@ -0,0 +1,3 @@ 19.4 +function util.html_rss_head(args) 19.5 + slot.put_into("html_head", '<link rel="alternate" type="application/rss+xml" title="' .. encode.html(args.title) .. '" href="' .. encode.url{ module = args.module, view = args.view, id = args.id, params = args.params } .. '">') 19.6 +end
20.1 --- a/fastpath/getpic.c Sun Apr 04 22:05:11 2010 +0200 20.2 +++ b/fastpath/getpic.c Thu Apr 15 19:58:25 2010 +0200 20.3 @@ -20,14 +20,14 @@ 20.4 char *args_string; 20.5 char *member_id; 20.6 char *image_type; 20.7 - char *sql_member_image_params[2]; 20.8 + const char *sql_member_image_params[2]; 20.9 20.10 char *cookies; 20.11 regex_t session_ident_regex; 20.12 ssize_t start, length; 20.13 regmatch_t session_ident_regmatch[3]; 20.14 char *session_ident; 20.15 - char *sql_session_params[1]; 20.16 + const char *sql_session_params[1]; 20.17 20.18 PGconn *conn; 20.19 PGresult *dbr; 20.20 @@ -48,7 +48,7 @@ 20.21 // shouldn't happen 20.22 abort(); 20.23 } 20.24 - if (regexec(&session_ident_regex, cookies, 2, session_ident_regmatch, 0) != 0) { 20.25 + if (regexec(&session_ident_regex, cookies, 3, session_ident_regmatch, 0) != 0) { 20.26 fputs("Status: 403 Access Denied\n\n", stdout); 20.27 return 0; 20.28 } 20.29 @@ -125,10 +125,7 @@ 20.30 PQfinish(conn); 20.31 return 1; 20.32 } 20.33 - fputs("Content-Type: ", stdout); 20.34 - fprintf(stdout, "Content-Length: %i\n", PQgetlength(dbr, 0, 1)); 20.35 - fwrite(PQgetvalue(dbr, 0, 0), PQgetlength(dbr, 0, 0), 1, stdout); 20.36 - fputs("\n\n", stdout); 20.37 + fprintf(stdout, "Content-Type: %s\n\n", PQgetvalue(dbr, 0, 0)); 20.38 fwrite(PQgetvalue(dbr, 0, 1), PQgetlength(dbr, 0, 1), 1, stdout); 20.39 } 20.40 PQfinish(conn);
21.1 --- a/locale/help/area.show.de.txt Sun Apr 04 22:05:11 2010 +0200 21.2 +++ b/locale/help/area.show.de.txt Thu Apr 15 19:58:25 2010 +0200 21.3 @@ -1,7 +1,7 @@ 21.4 =Thema, Interesse= 21.5 Auf dieser Seite werden alle Initiativen zu diesem Thema aufgelistet. Wenn du ,,Interesse am Thema'' anmeldest, wirst du für dieses Thema den Mitgliedern des übergeordneten Themenbereichs gleichgestellt und erhöhst die Bemessungsgrundlage der von Initiativen zu erreichenden Unterstützerquoren. Sobald du eine Initiative dieses Themas unterstützt, wird dein Interesse auch automatisch angemeldet. Sofern du allen Initiativen die Unterstützung entziehst, bleibt dein Interesse dennoch bestehen bis du es abmeldest. 21.6 =Delegation, Auto-Ablehnung= 21.7 -Eine Delegation zu diesem Thema geht einer eventuell vorhandenen globalen Delegation und/oder Delegation für den übergeordneten Themenbereich vor. Eine eventuelle Weisung zur Auto-Ablehung gilt nur für den Fall, dass du nicht selbst an der Endabstimmung teilnimmst und es keine tatsächlich genutzte Delegation gibt. Bei angemeldetem Interesse werden ausgehende Delegationen während der Diskussionsphase ausgesetzt, gelten aber in der Endabstimmung. 21.8 +Eine Delegation zu diesem Thema geht einer eventuell vorhandenen globalen Delegation und/oder Delegation für den übergeordneten Themenbereich vor. Eine eventuelle Weisung zur Auto-Ablehnung gilt nur für den Fall, dass du nicht selbst an der Endabstimmung teilnimmst und es keine tatsächlich genutzte Delegation gibt. Bei angemeldetem Interesse werden ausgehende Delegationen während der Diskussionsphase ausgesetzt, gelten aber in der Endabstimmung. 21.9 =Diskussionsphase= 21.10 Während der Diskussionsphase (Zustände ,,Neu'' und ,,Diskussion'') solltest du **alle** Initiativen, die du grundsätzlich (oder unter bestimmten Bedingungen) für zustimmungsfähig hältst, unterstützen und Anregungen zur Verbesserung geben (Näheres dazu findest du auf der Initiativenseite). Hierdurch gibst du den Initiatoren die Chance, den Entwurf zu verbessern. Während dieser Phase hast du auch die Möglichkeit, eine eigene (konkurrierende) Initiative zu diesem Thema zu starten und um Unterstützung zu ringen. 21.11 =Endabstimmung=
22.1 --- a/locale/help/issue.show.de.txt Sun Apr 04 22:05:11 2010 +0200 22.2 +++ b/locale/help/issue.show.de.txt Thu Apr 15 19:58:25 2010 +0200 22.3 @@ -1,7 +1,7 @@ 22.4 =Thema, Interesse= 22.5 Auf dieser Seite werden alle Initiativen zu diesem Thema aufgelistet. Wenn du ,,Interesse am Thema'' anmeldest, wirst du für dieses Thema den Mitgliedern des übergeordneten Themenbereichs gleichgestellt. Sobald du eine Initiative dieses Themas unterstützt, wird dein Interesse auch automatisch angemeldet. Sofern du allen Initiativen die Unterstützung entziehst, bleibt dein Interesse dennoch bestehen bis du es abmeldest. 22.6 =Delegation, Auto-Ablehnung= 22.7 -Eine Delegation zu diesem Thema geht einer eventuell vorhandenen globalen Delegation und/oder Delegation für den übergeordneten Themenbereich vor. Eine eventuelle Weisung zur Auto-Ablehung gilt nur für den Fall, dass du nicht selbst an der Endabstimmung teilnimmst und es keine tatsächlich genutzte Delegation gibt. Bei angemeldetem Interesse werden ausgehende Delegationen während der Diskussionsphase ausgesetzt, gelten aber in der Endabstimmung. 22.8 +Eine Delegation zu diesem Thema geht einer eventuell vorhandenen globalen Delegation und/oder Delegation für den übergeordneten Themenbereich vor. Eine eventuelle Weisung zur Auto-Ablehnung gilt nur für den Fall, dass du nicht selbst an der Endabstimmung teilnimmst und es keine tatsächlich genutzte Delegation gibt. Bei angemeldetem Interesse werden ausgehende Delegationen während der Diskussionsphase ausgesetzt, gelten aber in der Endabstimmung. 22.9 =Diskussionsphase= 22.10 Während der Diskussionsphase (Zustände ,,Neu'' und ,,Diskussion'') solltest du **alle** Initiativen, die du grundsätzlich (oder unter bestimmten Bedingungen) für zustimmungsfähig hältst, unterstützen und Anregungen zur Verbesserung geben (Näheres dazu findest du auf der Initiativenseite). Hierdurch gibst du den Initiatoren die Chance, den Entwurf zu verbessern. Während dieser Phase hast du auch die Möglichkeit, eine eigene (konkurrierende) Initiative zu diesem Thema zu starten und um Unterstützung zu ringen. Deine Unterstützung für eine Initiative während der Diskussionsphase bedeutet keine Festlegung auf dein Verhalten in der Endabstimmung. 22.11 =Endabstimmung=
23.1 --- a/locale/translations.de.lua Sun Apr 04 22:05:11 2010 +0200 23.2 +++ b/locale/translations.de.lua Thu Apr 15 19:58:25 2010 +0200 23.3 @@ -11,9 +11,9 @@ 23.4 ["(new window)"] = "(neues Fenster)"; 23.5 ["+ #{weight}"] = "+ #{weight}"; 23.6 ["A-Z"] = "A-Z"; 23.7 -["API key"] = false; 23.8 -["API key has been deleted"] = false; 23.9 -["API key has been updated"] = false; 23.10 +["API key"] = "API-Schlüssel"; 23.11 +["API key has been deleted"] = "API-Schlüssel wurde gelöscht"; 23.12 +["API key has been updated"] = "API-Schlüssel wurde aktualisiert"; 23.13 ["About"] = "About"; 23.14 ["About / Impressum"] = false; 23.15 ["About LiquidFeedback"] = "Über LiquidFeedback"; 23.16 @@ -74,7 +74,7 @@ 23.17 ["Cancel refuse of invitation"] = "Ablehnung der Einladung aufheben"; 23.18 ["Cancel registration"] = "Registration abbrechen"; 23.19 ["Cancelled"] = "Abgebrochen"; 23.20 -["Change API key"] = false; 23.21 +["Change API key"] = "API-Schlüssel ändern"; 23.22 ["Change area delegation"] = "Delegation für Themenbereich ändern"; 23.23 ["Change display settings"] = "Anzeige-Einstellungen ändern"; 23.24 ["Change filters and order"] = "Filter und Sortierung ändern"; 23.25 @@ -107,11 +107,11 @@ 23.26 ["Created at"] = "Erzeugt am/um"; 23.27 ["Current draft"] = "Aktueller Entwurf"; 23.28 ["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:"; 23.29 -["Currently no API key is set."] = false; 23.30 +["Currently no API key is set."] = "Zur Zeit ist kein API-Schlüssel festgelegt."; 23.31 ["Date"] = "Datum"; 23.32 ["Degree"] = "Grad"; 23.33 ["Delegations"] = "Delegationen"; 23.34 -["Delete API key"] = false; 23.35 +["Delete API key"] = "API-Schlüssel löschen"; 23.36 ["Delete filter"] = "Filter löschen"; 23.37 ["Description"] = "Beschreibung"; 23.38 ["Details"] = "Details"; 23.39 @@ -150,7 +150,7 @@ 23.40 ["Email address too short!"] = "E-Mail-Adresse ist zu kurz!"; 23.41 ["Email confirmation request"] = "Bestätigung Deiner E-Mail-Adresse"; 23.42 ["Empty help text: #{id}.#{lang}.txt"] = "Leerer Hilfe-Text: #{id}.#{lang}.txt"; 23.43 -["Error while resolving openid. Internal message: '#{errmsg}'"] = false; 23.44 +["Error while resolving openid. Internal message: '#{errmsg}'"] = "Fehler beim Auflösen der OpenID. Interne Fehlermeldung: '#{errmsg}'"; 23.45 ["Error while updating member, database reported:<br /><br /> (#{errormessage})"] = "Fehler beim aktualisieren des Mitglieds, die Datenbank berichtet folgenden Fehler:<br /><br /> (#{errormessage})"; 23.46 ["External memberships"] = "Externe Mitgliedschaften"; 23.47 ["External posts"] = "Externe Ämter"; 23.48 @@ -160,8 +160,8 @@ 23.49 ["Friday"] = "Freitag"; 23.50 ["Frozen"] = "Eingefroren"; 23.51 ["Fully frozen at"] = "Ganz eingefroren am/um"; 23.52 -["Generate / change API key"] = false; 23.53 -["Generate API key"] = false; 23.54 +["Generate / change API key"] = "API-Schlüssel erzeugen/ändern"; 23.55 +["Generate API key"] = "API-Schlüssel erzeugen"; 23.56 ["Global delegation"] = "Globale Delegation"; 23.57 ["Global delegation active"] = "Globale Delegation aktiv"; 23.58 ["Go up"] = "Nach oben"; 23.59 @@ -179,6 +179,7 @@ 23.60 ["Images"] = "Bilder"; 23.61 ["In discussion"] = "In Diskussion"; 23.62 ["Incoming delegations"] = "Eingehende Delegationen"; 23.63 +["Information about the available policies"] = "Informationen zu den verfügbaren Regelwerken"; 23.64 ["Initiated"] = "Initiert"; 23.65 ["Initiated initiatives"] = "Initierte Initiativen"; 23.66 ["Initiative events"] = "Initiativen-Ereignisse"; 23.67 @@ -189,6 +190,10 @@ 23.68 ["Initiative successfully updated"] = "Initiative erfolgreich aktualisiert"; 23.69 ["Initiative: '#{name}'"] = "Initiative: '#{name}'"; 23.70 ["Initiatives"] = "Initiativen"; 23.71 +["Initiatives in this area (last created first)"] = "Initiativen in diesem Themenbereich (zuletzt angelegte zuerst)"; 23.72 +["Initiatives in this area (last updated first)"] = "Initiativen in diesem Themenbereich (zuletzt aktualisierte zuerst)"; 23.73 +["Initiatives in this issue (last created first)"] = "Initiativen in diesem Thema (zuletzt angelegte zuerst)"; 23.74 +["Initiatives in this issue (last updated first)"] = "Initiativen in diesem Thema (zuletzt aktualisierte zuerst)"; 23.75 ["Initiatives that invited you to become initiator:"] = "Initiative, die Dich eingeladen haben, Initiator zu werden:"; 23.76 ["Initiator"] = "Initiator"; 23.77 ["Initiators"] = "Initiatoren"; 23.78 @@ -228,6 +233,7 @@ 23.79 ["Login successful!"] = "Anmeldung erfolgreich"; 23.80 ["Logout"] = "Abmelden"; 23.81 ["Logout successful"] = "Abmeldung erfolgreich"; 23.82 +["Majority"] = "Mehrheit"; 23.83 ["Manage filter"] = "Filter verwalten"; 23.84 ["Manage timeline filters"] = "Zeitachsen-Filter verwalten"; 23.85 ["Mark suggestion as implemented and express dissatisfaction"] = "Anregung als umgesetzt markieren und Unzufriedenheit ausdrücken"; 23.86 @@ -300,8 +306,8 @@ 23.87 ["Old password"] = "Altes Kennwort"; 23.88 ["Old password is wrong"] = "Das alte Kennwort ist falsch"; 23.89 ["Oldest"] = "Älteste"; 23.90 -["On that page please enter the confirmation code:\n\n"] = "Auf dieser Seite gebe bitte folgenden Bestätigungscode ein:\n\n"; 23.91 -["On that page please enter the reset code:\n\n"] = "Auf dieser Seite gebe bitte den folgenden Rücksetzcode ein:\n\n"; 23.92 +["On that page please enter the confirmation code:\n\n"] = "Auf dieser Seite gib bitte folgenden Bestätigungscode ein:\n\n"; 23.93 +["On that page please enter the reset code:\n\n"] = "Auf dieser Seite gib bitte den folgenden Rücksetzcode ein:\n\n"; 23.94 ["One issue"] = "Ein Thema"; 23.95 ["One issue you are interested in"] = "Ein Thema, das Dich interessiert"; 23.96 ["One step back"] = "Ein Schritt zurück"; 23.97 @@ -318,12 +324,13 @@ 23.98 ["Password reset request"] = "Kennwort-Rücksetzung anfordern"; 23.99 ["Passwords don't match!"] = "Kennwörter stimmen nicht überein!"; 23.100 ["Passwords must consist of at least 8 characters!"] = "Das Kennwort muß zumindest 8 Zeichen lang sein!"; 23.101 +["Phases"] = "Phasen"; 23.102 ["Phone"] = "Telefon"; 23.103 ["Photo"] = "Foto"; 23.104 ["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."; 23.105 ["Please choose a member"] = "Bitte wähle ein Mitglied"; 23.106 ["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."; 23.107 -["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."; 23.108 +["Please choose a password and enter it twice. The password is case sensitive."] = "Bitte wähle ein Kennwort und gib es zweimal ein. Groß- und Kleinschreibung wird berücksichtigt."; 23.109 ["Please choose a policy"] = "Bitte wähle ein Regelwerk"; 23.110 ["Please choose two different versions of the draft to compare"] = "Bitte wähle zwei verschiedene Versionen des Drafts, um sie zu vergleichen."; 23.111 ["Please choose two versions of the draft to compare"] = "Bitte wähle zwei Versionen des Drafts, um sie zu vergleichen."; 23.112 @@ -333,7 +340,9 @@ 23.113 ["Please enter your email address. This address will be used for automatic notifications (if you request them) and in case you've lost your password. This address will not be published. After registration you will receive an email with a confirmation link."] = "Bitte gib Deine E-Mail-Adresse ein. Diese Adresse wird für automatische Benachrichtigungen (wenn Du diese anforderst) sowie zum Zurücksetzen des Kennworts verwendet. Diese Adresse wird nicht veröffentlicht. Nach Abschluß der Registration wirst Du eine E-Mail mit einem Link zum Bestätigen der Adresse erhalten."; 23.114 ["Please enter your login name. You will receive an email with a link to reset your password."] = "Bitte gib Deinen Anmeldenamen ein. Du wirst eine E-Mail mit einem Link zum Zurücksetzen des Kennworts erhalten."; 23.115 ["Please enter your new password twice."] = "Bitte gib Dein neues Kennwort zweimal ein:"; 23.116 +["Policies"] = "Regelwerke"; 23.117 ["Policy"] = "Regelwerk"; 23.118 +["Policy '#{name}'"] = "Regelwerk '#{name}'"; 23.119 ["Population"] = "Grundgesamtheit"; 23.120 ["Posts"] = "Ämter"; 23.121 ["Potential support"] = "Potentielle Unterstützung"; 23.122 @@ -345,6 +354,7 @@ 23.123 ["Profile"] = "Profil"; 23.124 ["Publish"] = "Veröffentlichen"; 23.125 ["Published"] = "veröffentlicht"; 23.126 +["Quorum"] = false; 23.127 ["Rank"] = "Rang"; 23.128 ["Real name"] = "Realname"; 23.129 ["Refresh support to current draft"] = "Unterstützung auf aktuellen Entwurf aktualisieren"; 23.130 @@ -381,7 +391,7 @@ 23.131 ["Search issues"] = "Suche Themen"; 23.132 ["Search members"] = "Suche Mitglieder"; 23.133 ["Search results for: '#{search}'"] = "Suchergebnisse für: '#{search}'"; 23.134 -["Select language \"#{langcode}\""] = false; 23.135 +["Select language \"#{langcode}\""] = "Sprache \"#{langcode}\" wählen"; 23.136 ["Set URL"] = "URL setzen"; 23.137 ["Set area delegation"] = "Delegation für Themenbereich festlegen"; 23.138 ["Set autoreject"] = "Auto-Ablehnen anschalten"; 23.139 @@ -408,7 +418,7 @@ 23.140 ["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."; 23.141 ["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."; 23.142 ["Sorry, but you are currently not invited"] = "Sorry, aber Du bist zur Zeit nicht eingeladen"; 23.143 -["Sorry, it was not possible to verify your OpenID."] = false; 23.144 +["Sorry, it was not possible to verify your OpenID."] = "Sorry, es war nicht möglich deine OpenID zu verifizieren."; 23.145 ["Sorry, you have reached your personal flood limit. Please be slower..."] = "Sorry, Du hast Dein persönliches Flood-Limit erreicht. Bitte sei langsamer..."; 23.146 ["Sorry, your contingent for creating initiatives has been used up. Please try again later."] = "Sorry, Dein Antragskontingent ist zur Zeit ausgeschöpft. Bitte versuche es später erneut!"; 23.147 ["State"] = "Zustand"; 23.148 @@ -436,14 +446,14 @@ 23.149 ["Tabs"] = "Registerkarten"; 23.150 ["Terms accepted"] = "Bedingungen akzeptiert"; 23.151 ["Terms of use"] = "Nutzungsbedingungen"; 23.152 -["The API key has been changed too fast."] = false; 23.153 +["The API key has been changed too fast."] = "Der API-Schlüssel wurde zu schnell geändert."; 23.154 ["The code you've entered is invalid"] = "Der Code, den Du eingeben hast, ist nicht gültig!"; 23.155 ["The draft of this initiative has been updated!"] = "Der Entwurfstext der Initiative wurde aktualisiert!"; 23.156 ["The drafts do not differ"] = "Die Entwürfe unterscheiden sich nicht"; 23.157 ["The initiators suggest to support the following initiative:"] = "Die Initiatoren empfehlen folgende Initiative zu unterstützen:"; 23.158 ["There are no more alternative initiatives currently."] = "Es gibt zur Zeit keine weiteren alternative Initiative."; 23.159 ["There were no more alternative initiatives."] = "Es gab keine weiteren alternativen Initiativen."; 23.160 -["This identifier is not allowed for this instance."] = false; 23.161 +["This identifier is not allowed for this instance."] = "Dieser Identifier ist für diese Instanz nicht zugelassen."; 23.162 ["This initiative"] = "Diese Initiative"; 23.163 ["This initiative compared to alternative initiatives"] = "Diese Initiative im Vergleich zu alternativen Initiativen"; 23.164 ["This initiative has been revoked at #{revoked}"] = "Diese Initiative wurde am/um #{revoked} zurückgezogen"; 23.165 @@ -474,6 +484,7 @@ 23.166 ["Timeline"] = "Zeitachse"; 23.167 ["Title"] = "Titel"; 23.168 ["Title (80 chars max)"] = "Titel (max. 80 Zeichen)"; 23.169 +["Title of initiative"] = "Titel der Initiative"; 23.170 ["Traditional wiki syntax"] = "Traditionelle Wiki-Syntax"; 23.171 ["Trustee"] = "Bevollmächtigter"; 23.172 ["Tuesday"] = "Dienstag"; 23.173 @@ -520,10 +531,10 @@ 23.174 ["You have saved this member as contact."] = "Du hast das Mitglied als Kontakt gespeichert."; 23.175 ["You have to accept the terms of use to complete registration."] = "Du musst die Nutzungsbedingungen akzeptieren um die Registration abzuschliessen."; 23.176 ["You have to mark 'Are you sure' to revoke!"] = "Zum Zurückziehen musst Du 'Sicher?' auswählen"; 23.177 -["You need to be logged in, to use all features of this system."] = false; 23.178 +["You need to be logged in, to use all features of this system."] = "Du musst eingeloggt sein, um alle Funktionen dieses Systems nutzen zu können."; 23.179 ["You want to vote later"] = "Du willst später abstimmen"; 23.180 ["You've successfully registered and you can login now with your login and password!"] = "Du hast Dich erfolgreich registriert und kannst Dich jetzt mit Deinen Benutzernamen und Kennwort anmelden!"; 23.181 -["Your API key:"] = false; 23.182 +["Your API key:"] = "Dein API-Schlüssel:"; 23.183 ["Your are interested"] = "Du bist interessiert"; 23.184 ["Your are potential supporter"] = "Du bist potentieller Unterstützer"; 23.185 ["Your are supporter"] = "Du bist Unterstützer"; 23.186 @@ -547,11 +558,12 @@ 23.187 ["Your vote has been discarded. Delegation rules apply if set."] = "Deine Abstimmung wurde zurückgezogen. Delegationsregeln gelten sofern gesetzt."; 23.188 ["Your web browser is not fully supported yet."] = "Dein Web-Browser wird noch nicht vollständig unterstützt."; 23.189 ["Z-A"] = "Z-A"; 23.190 -["[Registered members only]"] = false; 23.191 -["[not displayed public]"] = false; 23.192 +["[Registered members only]"] = "[nur für Registrierte]"; 23.193 +["[not displayed public]"] = "[nicht öffentlich]"; 23.194 ["and #{count} more initiatives"] = "und #{count} weitere Initiativen"; 23.195 ["continuing"] = "andauernd"; 23.196 ["delete<br /><br />"] = "löschen<br /><br />"; 23.197 +["disabled"] = "ausgeschaltet"; 23.198 ["email"] = "E-Mail"; 23.199 ["last 24 hours"] = "letzte 24 Stunden"; 23.200 ["login name"] = "Anmeldename";
24.1 --- a/locale/translations.en.lua Sun Apr 04 22:05:11 2010 +0200 24.2 +++ b/locale/translations.en.lua Thu Apr 15 19:58:25 2010 +0200 24.3 @@ -179,6 +179,7 @@ 24.4 ["Images"] = false; 24.5 ["In discussion"] = false; 24.6 ["Incoming delegations"] = false; 24.7 +["Information about the available policies"] = false; 24.8 ["Initiated"] = false; 24.9 ["Initiated initiatives"] = false; 24.10 ["Initiative events"] = false; 24.11 @@ -189,6 +190,10 @@ 24.12 ["Initiative successfully updated"] = false; 24.13 ["Initiative: '#{name}'"] = false; 24.14 ["Initiatives"] = false; 24.15 +["Initiatives in this area (last created first)"] = false; 24.16 +["Initiatives in this area (last updated first)"] = false; 24.17 +["Initiatives in this issue (last created first)"] = false; 24.18 +["Initiatives in this issue (last updated first)"] = false; 24.19 ["Initiatives that invited you to become initiator:"] = false; 24.20 ["Initiator"] = false; 24.21 ["Initiators"] = false; 24.22 @@ -228,6 +233,7 @@ 24.23 ["Login successful!"] = false; 24.24 ["Logout"] = false; 24.25 ["Logout successful"] = false; 24.26 +["Majority"] = false; 24.27 ["Manage filter"] = false; 24.28 ["Manage timeline filters"] = false; 24.29 ["Mark suggestion as implemented and express dissatisfaction"] = false; 24.30 @@ -318,6 +324,7 @@ 24.31 ["Password reset request"] = false; 24.32 ["Passwords don't match!"] = false; 24.33 ["Passwords must consist of at least 8 characters!"] = false; 24.34 +["Phases"] = false; 24.35 ["Phone"] = false; 24.36 ["Photo"] = false; 24.37 ["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."] = false; 24.38 @@ -333,7 +340,9 @@ 24.39 ["Please enter your email address. This address will be used for automatic notifications (if you request them) and in case you've lost your password. This address will not be published. After registration you will receive an email with a confirmation link."] = false; 24.40 ["Please enter your login name. You will receive an email with a link to reset your password."] = false; 24.41 ["Please enter your new password twice."] = false; 24.42 +["Policies"] = false; 24.43 ["Policy"] = false; 24.44 +["Policy '#{name}'"] = false; 24.45 ["Population"] = false; 24.46 ["Posts"] = false; 24.47 ["Potential support"] = false; 24.48 @@ -345,6 +354,7 @@ 24.49 ["Profile"] = false; 24.50 ["Publish"] = false; 24.51 ["Published"] = false; 24.52 +["Quorum"] = false; 24.53 ["Rank"] = false; 24.54 ["Real name"] = false; 24.55 ["Refresh support to current draft"] = false; 24.56 @@ -474,6 +484,7 @@ 24.57 ["Timeline"] = false; 24.58 ["Title"] = false; 24.59 ["Title (80 chars max)"] = false; 24.60 +["Title of initiative"] = false; 24.61 ["Traditional wiki syntax"] = false; 24.62 ["Trustee"] = false; 24.63 ["Tuesday"] = false; 24.64 @@ -552,6 +563,7 @@ 24.65 ["and #{count} more initiatives"] = false; 24.66 ["continuing"] = false; 24.67 ["delete<br /><br />"] = false; 24.68 +["disabled"] = false; 24.69 ["email"] = false; 24.70 ["last 24 hours"] = false; 24.71 ["login name"] = false;
25.1 --- a/locale/translations.eo.lua Sun Apr 04 22:05:11 2010 +0200 25.2 +++ b/locale/translations.eo.lua Thu Apr 15 19:58:25 2010 +0200 25.3 @@ -179,6 +179,7 @@ 25.4 ["Images"] = "Bildoj"; 25.5 ["In discussion"] = "En diskuton"; 25.6 ["Incoming delegations"] = "Alvenantaj delegacioj"; 25.7 +["Information about the available policies"] = false; 25.8 ["Initiated"] = "Lanĉita"; 25.9 ["Initiated initiatives"] = "Lanĉitaj iniciatoj"; 25.10 ["Initiative events"] = "Iniciato-eventoj"; 25.11 @@ -189,6 +190,10 @@ 25.12 ["Initiative successfully updated"] = "Iniciato sukcese ĝisdatigita"; 25.13 ["Initiative: '#{name}'"] = "Iniciato: '#{name}'"; 25.14 ["Initiatives"] = "Iniciatoj"; 25.15 +["Initiatives in this area (last created first)"] = false; 25.16 +["Initiatives in this area (last updated first)"] = false; 25.17 +["Initiatives in this issue (last created first)"] = false; 25.18 +["Initiatives in this issue (last updated first)"] = false; 25.19 ["Initiatives that invited you to become initiator:"] = "Iniciatoj, kiuj vin invitis esti iniciatinto:"; 25.20 ["Initiator"] = "Iniciatinto"; 25.21 ["Initiators"] = "Iniciatintoj"; 25.22 @@ -228,6 +233,7 @@ 25.23 ["Login successful!"] = "Saluto sukcesa!"; 25.24 ["Logout"] = "Adiaŭi"; 25.25 ["Logout successful"] = "Adiaŭo sukcesa"; 25.26 +["Majority"] = false; 25.27 ["Manage filter"] = "Administri filtrilojn"; 25.28 ["Manage timeline filters"] = "Administri tempolinio-filtrilojn"; 25.29 ["Mark suggestion as implemented and express dissatisfaction"] = "Marki sugeston kiel realigitan kaj esprimi malkontentecon"; 25.30 @@ -318,6 +324,7 @@ 25.31 ["Password reset request"] = "Demando de rimetopasvorton"; 25.32 ["Passwords don't match!"] = "La pasvortoj ne estas samaj!"; 25.33 ["Passwords must consist of at least 8 characters!"] = "La pasvorto devas havi almenaŭ 8 literojn!"; 25.34 +["Phases"] = false; 25.35 ["Phone"] = "Telefono"; 25.36 ["Photo"] = "Foto"; 25.37 ["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."] = "Bonvolu elekti salutonomon! Tiu nomo ne estas montrita al aliaj kaj nur vi uzas tiun nomon por la saluto. La uskleco (granda/malgranda) gravas"; 25.38 @@ -333,7 +340,9 @@ 25.39 ["Please enter your email address. This address will be used for automatic notifications (if you request them) and in case you've lost your password. This address will not be published. After registration you will receive an email with a confirmation link."] = "Bonvolu enigi vian retadreson. Tiu adreso estas uzita por aŭtomataj sciigoj (se vi petas tiajn) kaj por remeti la pasvorton. Tiu adreso ne estos publikigita. Post la fino de la registrado, vi ricevos retpoŝton kun ligilo al la konfirmo de la adreso."; 25.40 ["Please enter your login name. You will receive an email with a link to reset your password."] = "Bonvolu enigi vian salutnomon. Vi ricevos retpoŝton kun ligilo al la remeto de la pasvorto."; 25.41 ["Please enter your new password twice."] = "Bonvolu enigi dufoje vian novan pasvorton:"; 25.42 +["Policies"] = false; 25.43 ["Policy"] = "Regularo"; 25.44 +["Policy '#{name}'"] = false; 25.45 ["Population"] = "Loĝantaro"; 25.46 ["Posts"] = "Postenoj"; 25.47 ["Potential support"] = "Eventuala subteno"; 25.48 @@ -345,6 +354,7 @@ 25.49 ["Profile"] = "Profilo"; 25.50 ["Publish"] = "Publikigi"; 25.51 ["Published"] = "Publikigita"; 25.52 +["Quorum"] = false; 25.53 ["Rank"] = "Rango"; 25.54 ["Real name"] = "Vera nomo"; 25.55 ["Refresh support to current draft"] = "Refreŝigi subtenon por la aktuala skizo"; 25.56 @@ -474,6 +484,7 @@ 25.57 ["Timeline"] = "Tempolinio"; 25.58 ["Title"] = "Titolo"; 25.59 ["Title (80 chars max)"] = "Titolo (maksimume 80 literoj)"; 25.60 +["Title of initiative"] = false; 25.61 ["Traditional wiki syntax"] = "Tradicia Viki-sintakso"; 25.62 ["Trustee"] = "Fidulo mastrumanta"; 25.63 ["Tuesday"] = "Mardo"; 25.64 @@ -552,6 +563,7 @@ 25.65 ["and #{count} more initiatives"] = "kaj #{count} pliaj iniciatoj"; 25.66 ["continuing"] = "kontinue"; 25.67 ["delete<br /><br />"] = "forviŝi<br /><br />"; 25.68 +["disabled"] = false; 25.69 ["email"] = "Retpoŝto"; 25.70 ["last 24 hours"] = "lastaj 24 horoj"; 25.71 ["login name"] = "Salutnomo";
26.1 --- a/locale/translations.fr.lua Sun Apr 04 22:05:11 2010 +0200 26.2 +++ b/locale/translations.fr.lua Thu Apr 15 19:58:25 2010 +0200 26.3 @@ -179,6 +179,7 @@ 26.4 ["Images"] = false; 26.5 ["In discussion"] = false; 26.6 ["Incoming delegations"] = false; 26.7 +["Information about the available policies"] = false; 26.8 ["Initiated"] = false; 26.9 ["Initiated initiatives"] = false; 26.10 ["Initiative events"] = false; 26.11 @@ -189,6 +190,10 @@ 26.12 ["Initiative successfully updated"] = false; 26.13 ["Initiative: '#{name}'"] = false; 26.14 ["Initiatives"] = false; 26.15 +["Initiatives in this area (last created first)"] = false; 26.16 +["Initiatives in this area (last updated first)"] = false; 26.17 +["Initiatives in this issue (last created first)"] = false; 26.18 +["Initiatives in this issue (last updated first)"] = false; 26.19 ["Initiatives that invited you to become initiator:"] = false; 26.20 ["Initiator"] = false; 26.21 ["Initiators"] = false; 26.22 @@ -228,6 +233,7 @@ 26.23 ["Login successful!"] = false; 26.24 ["Logout"] = false; 26.25 ["Logout successful"] = false; 26.26 +["Majority"] = false; 26.27 ["Manage filter"] = false; 26.28 ["Manage timeline filters"] = false; 26.29 ["Mark suggestion as implemented and express dissatisfaction"] = false; 26.30 @@ -318,6 +324,7 @@ 26.31 ["Password reset request"] = false; 26.32 ["Passwords don't match!"] = false; 26.33 ["Passwords must consist of at least 8 characters!"] = false; 26.34 +["Phases"] = false; 26.35 ["Phone"] = false; 26.36 ["Photo"] = false; 26.37 ["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."] = false; 26.38 @@ -333,7 +340,9 @@ 26.39 ["Please enter your email address. This address will be used for automatic notifications (if you request them) and in case you've lost your password. This address will not be published. After registration you will receive an email with a confirmation link."] = false; 26.40 ["Please enter your login name. You will receive an email with a link to reset your password."] = false; 26.41 ["Please enter your new password twice."] = false; 26.42 +["Policies"] = false; 26.43 ["Policy"] = false; 26.44 +["Policy '#{name}'"] = false; 26.45 ["Population"] = false; 26.46 ["Posts"] = false; 26.47 ["Potential support"] = false; 26.48 @@ -345,6 +354,7 @@ 26.49 ["Profile"] = false; 26.50 ["Publish"] = false; 26.51 ["Published"] = false; 26.52 +["Quorum"] = false; 26.53 ["Rank"] = false; 26.54 ["Real name"] = false; 26.55 ["Refresh support to current draft"] = false; 26.56 @@ -474,6 +484,7 @@ 26.57 ["Timeline"] = false; 26.58 ["Title"] = false; 26.59 ["Title (80 chars max)"] = false; 26.60 +["Title of initiative"] = false; 26.61 ["Traditional wiki syntax"] = false; 26.62 ["Trustee"] = false; 26.63 ["Tuesday"] = false; 26.64 @@ -552,6 +563,7 @@ 26.65 ["and #{count} more initiatives"] = false; 26.66 ["continuing"] = false; 26.67 ["delete<br /><br />"] = false; 26.68 +["disabled"] = false; 26.69 ["email"] = false; 26.70 ["last 24 hours"] = false; 26.71 ["login name"] = false;
27.1 --- a/model/initiative.lua Sun Apr 04 22:05:11 2010 +0200 27.2 +++ b/model/initiative.lua Thu Apr 15 19:58:25 2010 +0200 27.3 @@ -157,3 +157,18 @@ 27.4 end 27.5 return name 27.6 end 27.7 + 27.8 +function Initiative.object_get:initiator_names() 27.9 + local members = Member:new_selector() 27.10 + :join("initiator", nil, "initiator.member_id = member.id") 27.11 + :add_where{ "initiator.initiative_id = ?", self.id } 27.12 + :add_where{ "initiator.accepted" } 27.13 + :exec() 27.14 + 27.15 + local member_names = {} 27.16 + for i, member in ipairs(members) do 27.17 + member_names[#member_names+1] = member.name 27.18 + end 27.19 + return member_names 27.20 +end 27.21 +
28.1 --- a/model/issue.lua Sun Apr 04 22:05:11 2010 +0200 28.2 +++ b/model/issue.lua Thu Apr 15 19:58:25 2010 +0200 28.3 @@ -163,23 +163,22 @@ 28.4 end 28.5 28.6 function Issue.object_get:state() 28.7 - if self.accepted then 28.8 - if self.closed then 28.9 + if self.closed then 28.10 + if self.fully_frozen then 28.11 return "finished" 28.12 - elseif self.fully_frozen then 28.13 - return "voting" 28.14 - elseif self.half_frozen then 28.15 - return "frozen" 28.16 else 28.17 - return "accepted" 28.18 + return "cancelled" 28.19 end 28.20 + elseif self.fully_frozen then 28.21 + return "voting" 28.22 + elseif self.half_frozen then 28.23 + return "frozen" 28.24 + elseif self.accepted then 28.25 + return "accepted" 28.26 else 28.27 - if self.closed then 28.28 - return "cancelled" 28.29 - else 28.30 - return "new" 28.31 - end 28.32 + return "new" 28.33 end 28.34 + 28.35 end 28.36 28.37 function Issue.object_get:state_name()