decidim-plans 0.16.4 → 0.16.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 741276c73f6d1054bf091d66981cb44f86587445f09f7a85ba2ff7cac995a1f1
4
- data.tar.gz: c4fca20be4d12d149653fe12fd4cee859ada4833bac442b39a3968b7f64419f6
3
+ metadata.gz: '08d56d238a66eca983dbe996717bb9387525e974336ce65ab9f8943e1e3afe5e'
4
+ data.tar.gz: fe1204b85350bdea566562b75956c7eed3e989b793669b35b25be08b85cabe07
5
5
  SHA512:
6
- metadata.gz: 6c9816cbe7feb9125c40f88c39430ab9a6d23cce821180e5088dc5aa382ddca815cc3f9c8f030a243c695e92c7a27a74a8f9ad9a5beb2a52d230992b3e053c7f
7
- data.tar.gz: 67cf49151de0ee6d2415933531877fadae8ad50dbd16444ba8c4d7eddeae177f8084fadc9f6837524b3f42d1b4cac7ac995b14a9ee2d5eeb6a427d295d4bf8f0
6
+ metadata.gz: f8ac917fa65cc0f67ae41541ee8d9af242ecff01ed3b3936bba4f1dfe3b6de3d771dc830a6b9522596ab57a73d378b0ffe2be76454e9b96f530a3eb947144ed4
7
+ data.tar.gz: 17df9cff118e3dc9be17afb6408a247e600da2018cef3220078bf5885a0ebbc3da04780e14fe074935e4cbfc4966f379f4e37a6c035b65986002b1e5a4428a1a
@@ -28,9 +28,9 @@ $(function() {
28
28
  renderItem: function (item, search) {
29
29
  let sanitizedSearch = search.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
30
30
  let re = new RegExp(`(${sanitizedSearch.split(" ").join("|")})`, "gi");
31
- let title = item[0];
31
+ let title = item[0].replace(/"/g, """);
32
32
  let modelId = item[1];
33
- return `<div class="autocomplete-suggestion" data-model-id="${modelId}" data-val ="${title}">${title.replace(re, "<b>$1</b>")}</div>`;
33
+ return `<div class="autocomplete-suggestion" data-model-id="${modelId}" data-val="${title}">${title.replace(re, "<b>$1</b>")}</div>`;
34
34
  },
35
35
  onSelect: function(event, term, item) {
36
36
  let choose = $("#proposal-picker-choose");
@@ -28,7 +28,7 @@ module Decidim
28
28
  end
29
29
 
30
30
  def resource_path
31
- resource_locator(model).path
31
+ resource_locator(model).path + request_params_query
32
32
  end
33
33
 
34
34
  def current_participatory_space
@@ -14,6 +14,10 @@ module Decidim
14
14
 
15
15
  private
16
16
 
17
+ def resource_path
18
+ resource_locator(model).path + request_params_query
19
+ end
20
+
17
21
  def title
18
22
  present(model).title
19
23
  end
@@ -6,6 +6,8 @@ module Decidim
6
6
  # A command with all the business logic when an admin exports plans to a
7
7
  # single budget component.
8
8
  class ExportPlansToBudgets < Rectify::Command
9
+ include ActionView::Helpers::TextHelper
10
+
9
11
  # Public: Initializes the command.
10
12
  #
11
13
  # form - A form object with the params.
@@ -35,7 +37,7 @@ module Decidim
35
37
  next if plan_already_copied?(original_plan, target_component)
36
38
 
37
39
  project = Decidim::Budgets::Project.new
38
- project.title = original_plan.title
40
+ project.title = sanitize_localized(original_plan.title)
39
41
  project.description = project_description(original_plan)
40
42
  project.budget = form.default_budget
41
43
  project.category = original_plan.category
@@ -83,20 +85,13 @@ module Decidim
83
85
  original_plan.sections.each do |section|
84
86
  content = original_plan.contents.find_by(section: section)
85
87
  content.body.each do |locale, body_text|
86
- title = section.body[locale]
88
+ title = sanitize(section.body[locale])
87
89
  pr_desc[locale] ||= ""
88
90
  pr_desc[locale] += "<h3>#{title}</h3>\n"
89
91
 
90
- # In case the text is already HTML, append as is.
91
92
  # Wrap non-HTML strings within a <p> tag and replace newlines with
92
- # <br>.
93
- pr_desc[locale] += (
94
- if body_text =~ %r{<\/?[^>]*>}
95
- "#{body_text}\n"
96
- else
97
- "<p>#{body_text.gsub(/\n/, "<br>")}</p>\n"
98
- end
99
- )
93
+ # <br>. This also takes care of sanitization.
94
+ pr_desc[locale] += simple_format(body_text)
100
95
  end
101
96
  end
102
97
 
@@ -105,6 +100,12 @@ module Decidim
105
100
 
106
101
  pr_desc
107
102
  end
103
+
104
+ def sanitize_localized(hash)
105
+ hash.each do |locale, value|
106
+ hash[locale] = sanitize(value)
107
+ end
108
+ end
108
109
  end
109
110
  end
110
111
  end
@@ -160,22 +160,6 @@ module Decidim
160
160
  end
161
161
  end
162
162
 
163
- def reopen
164
- enforce_permission_to :close, :plan, plan: @plan
165
-
166
- ReopenPlan.call(@plan, current_user) do
167
- on(:ok) do |plan|
168
- flash[:notice] = I18n.t("reopen.success", scope: "decidim.plans.plans.plan")
169
- redirect_to Decidim::ResourceLocatorPresenter.new(plan).path
170
- end
171
-
172
- on(:invalid) do
173
- flash.now[:alert] = t("reopen.error", scope: "decidim.plans.plans.plan")
174
- redirect_to Decidim::ResourceLocatorPresenter.new(@plan).path
175
- end
176
- end
177
- end
178
-
179
163
  private
180
164
 
181
165
  def check_draft
@@ -5,6 +5,7 @@ module Decidim
5
5
  # Custom helpers, scoped to the plans engine.
6
6
  #
7
7
  module ApplicationHelper
8
+ include Decidim::Plans::LinksHelper
8
9
  include Decidim::Comments::CommentsHelper
9
10
  include PaginateHelper
10
11
  include Decidim::MapHelper
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Plans
5
+ module LinksHelper
6
+ # This is for generating the links so that they maintain the search status
7
+ def request_params(extra_params={}, exclude_params=[])
8
+ @request_params ||= request.params.except(
9
+ *(exclude_params + [
10
+ :action,
11
+ :component_id,
12
+ :controller,
13
+ :assembly_slug,
14
+ :participatory_process_slug,
15
+ :id
16
+ ])
17
+ ).merge(prepare_extra_params(extra_params))
18
+ end
19
+
20
+ def request_params_query(extra_params={}, exclude_params=[])
21
+ return "" unless request_params(extra_params, exclude_params).any?
22
+
23
+ "?#{request_params.to_query}"
24
+ end
25
+
26
+ private
27
+
28
+ # Adds the random seed to the extra parameters to maintain the ordering
29
+ # correctly across the requests.
30
+ def prepare_extra_params(extra_params)
31
+ return extra_params unless controller
32
+ return extra_params unless controller.respond_to?(:order, true)
33
+ return extra_params unless controller.respond_to?(:random_seed, true)
34
+
35
+ order = controller.send(:order)
36
+ return extra_params unless order == "random"
37
+
38
+ seed = controller.send(:random_seed)
39
+ return extra_params unless seed
40
+
41
+ extra_params.merge(random_seed: seed)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Plans
5
+ module RichPresenter
6
+ extend ActiveSupport::Concern
7
+ include ActionView::Helpers::TextHelper
8
+
9
+ def rich_content(content)
10
+ simple_format(content, wrapper_tag: nil)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,17 +8,18 @@ module Decidim
8
8
  class ContentPresenter < SimpleDelegator
9
9
  include Rails.application.routes.mounted_helpers
10
10
  include TranslatableAttributes
11
+ include Plans::RichPresenter
11
12
 
12
13
  def content
13
14
  __getobj__
14
15
  end
15
16
 
16
17
  def title
17
- translated_attribute(content.title).html_safe
18
+ sanitize(translated_attribute(content.title))
18
19
  end
19
20
 
20
21
  def body
21
- translated_attribute(content.body).html_safe
22
+ rich_content(translated_attribute(content.body))
22
23
  end
23
24
  end
24
25
  end
@@ -9,6 +9,7 @@ module Decidim
9
9
  include Rails.application.routes.mounted_helpers
10
10
  include ActionView::Helpers::UrlHelper
11
11
  include TranslatableAttributes
12
+ include Plans::RichPresenter
12
13
 
13
14
  def author
14
15
  coauthorship = coauthorships.first
@@ -28,7 +29,7 @@ module Decidim
28
29
  end
29
30
 
30
31
  def title
31
- translated_attribute(plan.title).html_safe
32
+ sanitize(translated_attribute(plan.title))
32
33
  end
33
34
 
34
35
  def body
@@ -36,9 +37,9 @@ module Decidim
36
37
  content = plan.contents.find_by(section: section)
37
38
  next if content.nil?
38
39
 
39
- title = translated_attribute(content.title)
40
- body = translated_attribute(content.body)
41
- "<dt>#{title}</dt> <dd>#{body}</dd>"
40
+ section_title = sanitize(translated_attribute(content.title))
41
+ section_body = sanitize(translated_attribute(content.body))
42
+ "<dt>#{section_title}</dt> <dd>#{section_body}</dd>"
42
43
  end
43
44
 
44
45
  "<dl>#{fields.join("\n")}</dl>".html_safe
@@ -23,12 +23,16 @@ form.multipart = true
23
23
  <div class="row column">
24
24
  <%= remaining_characters("plans_title", component_settings.plan_title_length) do |opts| %>
25
25
  <% if component_settings.multilingual_answers? %>
26
- <%= form.translated :text_field, :title, opts.merge(tabs_id: "title-tabs") %>
26
+ <%= form.translated :text_field, :title, opts.merge(
27
+ tabs_id: "title-tabs",
28
+ help_text: translated_attribute(component_settings.title_help)
29
+ ) %>
27
30
  <% else %>
28
31
  <%= form.text_field(
29
32
  "title_#{current_locale}".to_sym,
30
33
  {
31
- label: form.label_for(:title)
34
+ label: form.label_for(:title),
35
+ help_text: translated_attribute(component_settings.title_help)
32
36
  }.merge(opts)
33
37
  ) %>
34
38
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <div class="plan-contents">
2
2
  <% @plan.sections.each do |section| %>
3
- <%=
3
+ <%=
4
4
  render partial: "content",
5
5
  object: @plan.contents.find_by(section: section)
6
6
  %>
@@ -23,12 +23,15 @@ form.multipart = true
23
23
  <div class="field">
24
24
  <%= remaining_characters("plans_title", component_settings.plan_title_length) do |opts| %>
25
25
  <% if component_settings.multilingual_answers? %>
26
- <%= form.translated :text_field, :title, opts %>
26
+ <%= form.translated :text_field, :title, opts.merge(
27
+ help_text: translated_attribute(component_settings.title_help)
28
+ ) %>
27
29
  <% else %>
28
30
  <%= form.text_field(
29
31
  "title_#{current_locale}".to_sym,
30
32
  {
31
- label: form.label_for(:title)
33
+ label: form.label_for(:title),
34
+ help_text: translated_attribute(component_settings.title_help)
32
35
  }.merge(opts)
33
36
  ) %>
34
37
  <% end %>
@@ -12,10 +12,12 @@
12
12
  <% end %>
13
13
 
14
14
  <div class="row column view-header">
15
- <%= link_to plans_path do %>
16
- <%= icon "chevron-left", class: "icon--small" %>
17
- <%= t(".back") %>
18
- <% end %>
15
+ <p class="h5">
16
+ <%= link_to plans_path(request_params) do %>
17
+ <%= icon "chevron-left", class: "icon--small" %>
18
+ <%= t(".back") %>
19
+ <% end %>
20
+ </p>
19
21
 
20
22
  <h2 class="heading2">
21
23
  <%= present(@plan).title %>
@@ -45,12 +47,8 @@
45
47
  <% if allowed_to?(:edit, :plan, plan: @plan) %>
46
48
  <%= link_to t("edit", scope:"decidim.plans.plans.show"), edit_plan_path(@plan), class: "button secondary hollow expanded button--sc mt-s", id: "plan_edit" %>
47
49
  <% end %>
48
- <% if allowed_to?(:close, :plan, plan: @plan) %>
49
- <% if @plan.closed? %>
50
- <%= link_to t("reopen", scope:"decidim.plans.plans.show"), reopen_plan_path(@plan), method: :post, class: "button secondary hollow expanded button--sc mt-s", id: "plan_reopen", data: { confirm: t("reopen_confirm", scope:"decidim.plans.plans.show") } %>
51
- <% else %>
52
- <%= link_to t("close", scope:"decidim.plans.plans.show"), close_plan_path(@plan), method: :post, class: "button secondary hollow expanded button--sc mt-s", id: "plan_close", data: { confirm: t("close_confirm", scope:"decidim.plans.plans.show") } %>
53
- <% end %>
50
+ <% if allowed_to?(:close, :plan, plan: @plan) && !@plan.closed? %>
51
+ <%= link_to t("close", scope:"decidim.plans.plans.show"), close_plan_path(@plan), method: :post, class: "button secondary hollow expanded button--sc mt-s", id: "plan_close", data: { confirm: t("close_confirm", scope:"decidim.plans.plans.show") } %>
54
52
  <% end %>
55
53
 
56
54
  <%= render "request_access_form" %>
@@ -1,3 +1,5 @@
1
+ <% help_text = translated_attribute(component_settings.attachment_help).strip %>
2
+
1
3
  <div class="card multifield-field" id="<%= id %>-field">
2
4
  <div class="card-divider multifield-field-divider">
3
5
  <h3 class="heading6 card-title">
@@ -21,6 +23,10 @@
21
23
 
22
24
  <div class="card-section">
23
25
  <div class="row column">
26
+ <% if help_text && help_text.length > 0 %>
27
+ <p class="help-text"><%= help_text %></p>
28
+ <% end %>
29
+
24
30
  <div class="field">
25
31
  <% if form.send(:attribute_required?, :title) %>
26
32
  <%= form.text_field :title %>
@@ -34,6 +34,7 @@ en:
34
34
  global:
35
35
  announcement: Announcement
36
36
  attachments_allowed: Attachments allowed
37
+ attachment_help: Attachment help text
37
38
  categories_enabled: Categories enabled
38
39
  comments_enabled: Comments enabled
39
40
  multilingual_answers: Multilingual answers
@@ -41,6 +42,7 @@ en:
41
42
  plan_title_length: Title length
42
43
  proposal_linking_enabled: Proposal linking enabled
43
44
  scopes_enabled: Scopes enabled
45
+ title_help: Title help text
44
46
  step:
45
47
  announcement: Announcement
46
48
  comments_blocked: Comments blocked
@@ -330,57 +332,57 @@ en:
330
332
  events:
331
333
  plans:
332
334
  plan_access_accepted:
333
- email_intro: '%{requester_name} has been accepted to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.'
334
- email_outro: You have received this notification because you are a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
335
+ email_intro: '%{requester_name} has been accepted to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.'
336
+ email_outro: You have received this notification because you are a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
335
337
  email_subject: "%{requester_name} has been accepted to access as a contributor of %{resource_title}."
336
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>accepted to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
338
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>accepted to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
337
339
  plan_access_rejected:
338
- email_intro: '%{requester_name} has been rejected to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.'
339
- email_outro: You have received this notification because you are a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
340
+ email_intro: '%{requester_name} has been rejected to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.'
341
+ email_outro: You have received this notification because you are a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
340
342
  email_subject: "%{requester_name} has been rejected to access as a contributor of %{resource_title}."
341
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>rejected to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
343
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>rejected to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
342
344
  plan_access_requested:
343
- email_intro: '%{requester_name} requested access as a contributor. You can <strong>accept or reject the request</strong> from the <a href="%{resource_path}">%{resource_title}</a> page.'
344
- email_outro: You have received this notification because you are a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
345
+ email_intro: '%{requester_name} requested access as a contributor. You can <strong>accept or reject the request</strong> from the <a href="%{resource_url}">%{resource_title}</a> page.'
346
+ email_outro: You have received this notification because you are a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
345
347
  email_subject: "%{requester_name} requested access to contribute to %{resource_title}."
346
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> requested access to contribute to <a href="%{resource_path}">%{resource_title}</a>. Please <strong>accept or reject the request</strong>.
348
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> requested access to contribute to <a href="%{resource_url}">%{resource_title}</a>. Please <strong>accept or reject the request</strong>.
347
349
  plan_access_requester_accepted:
348
- email_intro: You have been accepted to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.
349
- email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
350
+ email_intro: You have been accepted to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.
351
+ email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
350
352
  email_subject: You have been accepted as a contributor of %{resource_title}.
351
- notification_title: You have been <strong>accepted to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
353
+ notification_title: You have been <strong>accepted to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
352
354
  plan_access_requester_rejected:
353
- email_intro: You have been rejected to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.
354
- email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
355
+ email_intro: You have been rejected to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.
356
+ email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
355
357
  email_subject: You have been rejected as a contributor of %{resource_title}.
356
- notification_title: You have been <strong>rejected to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
358
+ notification_title: You have been <strong>rejected to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
357
359
  plan_accepted:
358
360
  email_intro: '"%{resource_title}" has been accepted. You can read the answer in this page:'
359
361
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
360
362
  email_subject: A resource you're following has been accepted
361
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been accepted.
363
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been accepted.
362
364
  plan_evaluating:
363
365
  email_intro: '"%{resource_title}" is currently being evaluated. You can check for an answer in this page:'
364
366
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
365
367
  email_subject: A resource you're following is being evaluated
366
- notification_title: <a href="%{resource_path}">%{resource_title}</a> is being evaluated.
368
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> is being evaluated.
367
369
  plan_published:
368
370
  email_intro: '"%{resource_title}" has been published. You can see it here:'
369
371
  email_outro: You have received this notification because you are following the author of "%{resource_title}". You can unfollow it from the previous link.
370
372
  email_subject: A user you're following has published a resource
371
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been published.
373
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been published.
372
374
  plan_published_for_proposals:
373
375
  email_intro: 'A proposal you have authored has been linked to "%{resource_title}". You can see it here:'
374
376
  email_outro: You have received this notification because you are following "%{resource_title}" through the authored proposals. You can unfollow it from the previous link.
375
377
  email_subject: A proposal you have authored has been linked to new content
376
- notification_title: A proposal you have authored has been linked to <a href="%{resource_path}">%{resource_title}</a>.
378
+ notification_title: A proposal you have authored has been linked to <a href="%{resource_url}">%{resource_title}</a>.
377
379
  plan_published_for_space:
378
380
  email_intro: '"%{resource_title}" has been published. You can see it here:'
379
381
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
380
382
  email_subject: A resource you're following has been published
381
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been published.
383
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been published.
382
384
  plan_rejected:
383
385
  email_intro: '"%{resource_title}" has been rejected. You can read the answer in this page:'
384
386
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
385
387
  email_subject: A resource you're following has been rejected
386
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been rejected.
388
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been rejected.
@@ -323,57 +323,57 @@ fi:
323
323
  events:
324
324
  plans:
325
325
  plan_access_accepted:
326
- email_intro: '%{requester_name} on annettu oikeus muokata sisältöä <a href="%{resource_path}">%{resource_title}</a> osallistujana.'
327
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_path}">%{resource_title}</a> muokkaukseen.
326
+ email_intro: '%{requester_name} on annettu oikeus muokata sisältöä <a href="%{resource_url}">%{resource_title}</a> osallistujana.'
327
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_url}">%{resource_title}</a> muokkaukseen.
328
328
  email_subject: "%{requester_name} on hyväksytty muokkaajaksi sisältöön %{resource_title}."
329
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> on <strong>hyväksytty muokkaajaksi</strong> sisältöön <a href="%{resource_path}">%{resource_title}</a>.
329
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> on <strong>hyväksytty muokkaajaksi</strong> sisältöön <a href="%{resource_url}">%{resource_title}</a>.
330
330
  plan_access_rejected:
331
- email_intro: 'Käyttäjän %{requester_name} muokkausoikeudet sisältöön <a href="%{resource_path}">%{resource_title} </a> on estetty.'
332
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_path}">%{resource_title}</a> muokkaukseen.
331
+ email_intro: 'Käyttäjän %{requester_name} muokkausoikeudet sisältöön <a href="%{resource_url}">%{resource_title} </a> on estetty.'
332
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_url}">%{resource_title}</a> muokkaukseen.
333
333
  email_subject: "%{requester_name} hakemus osallistua kohteen %{resource_title} muokkaukseen on hylätty."
334
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> <strong>pyyntö muokata sisältöä on hylätty</strong> kohteelle <a href="%{resource_path}">%{resource_title}</a>.
334
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> <strong>pyyntö muokata sisältöä on hylätty</strong> kohteelle <a href="%{resource_url}">%{resource_title}</a>.
335
335
  plan_access_requested:
336
- email_intro: '%{requester_name} pyysi pääsyä osallistujaksi. Voit <strong>hyväksyä tai hylätä pyynnön</strong> sivulla <a href="%{resource_path}">%{resource_title}</a>.'
337
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistuja kohteessa <a href="%{resource_path}">%{resource_title}</a>.
336
+ email_intro: '%{requester_name} pyysi pääsyä osallistujaksi. Voit <strong>hyväksyä tai hylätä pyynnön</strong> sivulla <a href="%{resource_url}">%{resource_title}</a>.'
337
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistuja kohteessa <a href="%{resource_url}">%{resource_title}</a>.
338
338
  email_subject: "%{requester_name} pyysi osallistumisoikeutta kohteeseen %{resource_title}."
339
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> pyysi saada muokata sisältöä <a href="%{resource_path}">%{resource_title}</a>. <strong>Hyväksy tai hylkää pyyntö</strong>.
339
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> pyysi saada muokata sisältöä <a href="%{resource_url}">%{resource_title}</a>. <strong>Hyväksy tai hylkää pyyntö</strong>.
340
340
  plan_access_requester_accepted:
341
- email_intro: Sinut on hyväksytty osallistujaksi sisältöön <a href="%{resource_path}">%{resource_title}</a>.
342
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet hakenut muokkausoikeuksia sisältöön <a href="%{resource_path}">%{resource_title}</a>.
341
+ email_intro: Sinut on hyväksytty osallistujaksi sisältöön <a href="%{resource_url}">%{resource_title}</a>.
342
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet hakenut muokkausoikeuksia sisältöön <a href="%{resource_url}">%{resource_title}</a>.
343
343
  email_subject: Sinut on hyväksytty osallistujaksi sisältöön %{resource_title}.
344
- notification_title: Sinut on <strong>hyväksytty osallistujaksi </strong> sisältöön <a href="%{resource_path}">%{resource_title}</a>.
344
+ notification_title: Sinut on <strong>hyväksytty osallistujaksi </strong> sisältöön <a href="%{resource_url}">%{resource_title}</a>.
345
345
  plan_access_requester_rejected:
346
- email_intro: Sinua ei ole hyväksytty osallistujaksi sisältöön <a href="%{resource_path}">%{resource_title}</a>.
347
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet pyytänyt pääsyä osallistujaksi sisältöön <a href="%{resource_path}">%{resource_title}</a>.
346
+ email_intro: Sinua ei ole hyväksytty osallistujaksi sisältöön <a href="%{resource_url}">%{resource_title}</a>.
347
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet pyytänyt pääsyä osallistujaksi sisältöön <a href="%{resource_url}">%{resource_title}</a>.
348
348
  email_subject: Sinua ei ole hyväksytty osallistujaksi sisältöön %{resource_title}.
349
- notification_title: Sinua <strong>ei ole hyväksytty osallistujaksi</strong> sisältöön <a href="%{resource_path}">%{resource_title}</a>.
349
+ notification_title: Sinua <strong>ei ole hyväksytty osallistujaksi</strong> sisältöön <a href="%{resource_url}">%{resource_title}</a>.
350
350
  plan_accepted:
351
351
  email_intro: '"%{resource_title}" on hyväksytty. Voit lukea vastauksen täältä:'
352
352
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
353
353
  email_subject: Seuraamasi kohde on hyväksytty
354
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on hyväksytty.
354
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on hyväksytty.
355
355
  plan_evaluating:
356
356
  email_intro: '"%{resource_title}" arvioidaan parhaillaan. Voit tarkistaa vastauksen tältä sivulla:'
357
357
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
358
358
  email_subject: Seuraamasi kohde on arvioitavana
359
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on arvioitavana.
359
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on arvioitavana.
360
360
  plan_published:
361
361
  email_intro: '"%{resource_title}" on julkaistu. Näet sen täältä:'
362
362
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohteen "%{resource_title}" laatijaa. Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
363
363
  email_subject: Seuraamasi käyttäjä on julkaissut uutta sisältöä
364
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on julkaistu.
364
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on julkaistu.
365
365
  plan_published_for_proposals:
366
366
  email_intro: 'Laatimasi ehdotus on linkitetty kohteeseen "%{resource_title}". Näet sen täältä:'
367
367
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}" laatimisesi ehdotusten kautta. Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
368
368
  email_subject: Laatimasi ehdotus on linkitetty uuteen sisältöön
369
- notification_title: Laatimasi ehdotus on linkitetty kohteeseen <a href="%{resource_path}">%{resource_title}</a>.
369
+ notification_title: Laatimasi ehdotus on linkitetty kohteeseen <a href="%{resource_url}">%{resource_title}</a>.
370
370
  plan_published_for_space:
371
371
  email_intro: '"%{resource_title}" on julkaistu. Näet sen täältä:'
372
372
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
373
373
  email_subject: Seuraamasi kohde on julkaistu
374
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on julkaistu.
374
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on julkaistu.
375
375
  plan_rejected:
376
376
  email_intro: '"%{resource_title}" on hylätty. Voit lukea vastauksen tällä sivulla:'
377
377
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
378
378
  email_subject: Seuraamasi kohde on hylätty
379
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on hylätty.
379
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on hylätty.