decidim-assemblies 0.28.1 → 0.29.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/assemblies/content_blocks/highlighted_assemblies_cell.rb +0 -4
  3. data/app/cells/decidim/assemblies/content_blocks/stats_cell.rb +1 -1
  4. data/app/commands/decidim/assemblies/admin/create_assemblies_type.rb +3 -31
  5. data/app/commands/decidim/assemblies/admin/create_assembly.rb +30 -89
  6. data/app/commands/decidim/assemblies/admin/create_assembly_member.rb +14 -66
  7. data/app/commands/decidim/assemblies/admin/destroy_assembly_member.rb +5 -37
  8. data/app/commands/decidim/assemblies/admin/import_assembly.rb +1 -1
  9. data/app/commands/decidim/assemblies/admin/update_assemblies_type.rb +2 -35
  10. data/app/commands/decidim/assemblies/admin/update_assembly.rb +22 -99
  11. data/app/commands/decidim/assemblies/admin/update_assembly_member.rb +8 -69
  12. data/app/controllers/decidim/assemblies/admin/assemblies_controller.rb +1 -1
  13. data/app/controllers/decidim/assemblies/admin/assemblies_types_controller.rb +4 -4
  14. data/app/controllers/decidim/assemblies/admin/assembly_members_controller.rb +1 -1
  15. data/app/controllers/decidim/assemblies/admin/participatory_space_private_users_controller.rb +1 -1
  16. data/app/controllers/decidim/assemblies/admin/participatory_space_private_users_csv_imports_controller.rb +1 -1
  17. data/app/controllers/decidim/assemblies/application_controller.rb +4 -1
  18. data/app/controllers/decidim/assemblies/assemblies_controller.rb +0 -3
  19. data/app/controllers/decidim/assemblies/assembly_members_controller.rb +0 -2
  20. data/app/forms/decidim/assemblies/admin/assembly_form.rb +0 -1
  21. data/app/helpers/decidim/assemblies/assemblies_helper.rb +0 -26
  22. data/app/permissions/decidim/assemblies/permissions.rb +1 -1
  23. data/app/presenters/decidim/assemblies/admin_log/assembly_presenter.rb +0 -1
  24. data/app/serializers/decidim/assemblies/assembly_importer.rb +0 -1
  25. data/app/serializers/decidim/assemblies/assembly_serializer.rb +1 -2
  26. data/app/views/decidim/assemblies/admin/assemblies/_form.html.erb +5 -9
  27. data/app/views/decidim/assemblies/admin/assemblies/index.html.erb +2 -0
  28. data/app/views/decidim/assemblies/admin/assembly_members/index.html.erb +1 -1
  29. data/app/views/decidim/assemblies/admin/assembly_user_roles/_form.html.erb +1 -1
  30. data/app/views/decidim/assemblies/admin/assembly_user_roles/index.html.erb +1 -1
  31. data/app/views/decidim/assemblies/assemblies/show.html.erb +21 -17
  32. data/app/views/decidim/assemblies/assembly_members/index.html.erb +2 -1
  33. data/config/locales/ar.yml +0 -7
  34. data/config/locales/bg.yml +441 -4
  35. data/config/locales/ca.yml +2 -7
  36. data/config/locales/cs.yml +2 -7
  37. data/config/locales/de.yml +3 -8
  38. data/config/locales/el.yml +0 -7
  39. data/config/locales/en.yml +3 -8
  40. data/config/locales/es-MX.yml +6 -11
  41. data/config/locales/es-PY.yml +5 -10
  42. data/config/locales/es.yml +6 -11
  43. data/config/locales/eu.yml +3 -8
  44. data/config/locales/fi-plain.yml +2 -7
  45. data/config/locales/fi.yml +2 -7
  46. data/config/locales/fr-CA.yml +3 -8
  47. data/config/locales/fr.yml +3 -8
  48. data/config/locales/ga-IE.yml +0 -3
  49. data/config/locales/gl.yml +0 -7
  50. data/config/locales/he-IL.yml +0 -4
  51. data/config/locales/hu.yml +1 -8
  52. data/config/locales/id-ID.yml +0 -6
  53. data/config/locales/is-IS.yml +0 -4
  54. data/config/locales/it.yml +1 -7
  55. data/config/locales/ja.yml +3 -8
  56. data/config/locales/lb.yml +0 -6
  57. data/config/locales/lt.yml +0 -7
  58. data/config/locales/lv.yml +0 -6
  59. data/config/locales/nl.yml +0 -7
  60. data/config/locales/no.yml +0 -7
  61. data/config/locales/pl.yml +2 -7
  62. data/config/locales/pt-BR.yml +0 -7
  63. data/config/locales/pt.yml +0 -7
  64. data/config/locales/ro-RO.yml +0 -7
  65. data/config/locales/ru.yml +0 -6
  66. data/config/locales/sk.yml +0 -3
  67. data/config/locales/sl.yml +0 -2
  68. data/config/locales/sq-AL.yml +323 -1
  69. data/config/locales/sv.yml +0 -7
  70. data/config/locales/tr-TR.yml +0 -6
  71. data/config/locales/uk.yml +0 -6
  72. data/config/locales/zh-CN.yml +0 -6
  73. data/config/locales/zh-TW.yml +0 -7
  74. data/db/migrate/20240712061153_change_show_statistics_from_decidim_assemblies.rb +11 -0
  75. data/decidim-assemblies.gemspec +1 -1
  76. data/lib/decidim/api/assembly_type.rb +3 -4
  77. data/lib/decidim/assemblies/content_blocks/registry_manager.rb +1 -1
  78. data/lib/decidim/assemblies/engine.rb +1 -0
  79. data/lib/decidim/assemblies/menu.rb +11 -0
  80. data/lib/decidim/assemblies/seeds.rb +1 -11
  81. data/lib/decidim/assemblies/test/factories.rb +0 -1
  82. data/lib/decidim/assemblies/version.rb +1 -1
  83. metadata +20 -21
  84. data/app/commands/decidim/assemblies/admin/destroy_assemblies_type.rb +0 -45
  85. data/app/views/layouts/decidim/assembly.html.erb +0 -18
@@ -5,84 +5,23 @@ module Decidim
5
5
  module Admin
6
6
  # A command with all the business logic when updating an assembly
7
7
  # member in the system.
8
- class UpdateAssemblyMember < Decidim::Command
9
- include ::Decidim::AttachmentAttributesMethods
8
+ class UpdateAssemblyMember < Decidim::Commands::UpdateResource
9
+ fetch_file_attributes :non_user_avatar
10
10
 
11
- # Public: Initializes the command.
12
- #
13
- # form - A form object with the params.
14
- # assembly_member - The AssemblyMember to update
15
- def initialize(form, assembly_member)
16
- @form = form
17
- @assembly_member = assembly_member
18
- end
19
-
20
- # Executes the command. Broadcasts these events:
21
- #
22
- # - :ok when everything is valid.
23
- # - :invalid if the form was not valid and we could not proceed.
24
- #
25
- # Returns nothing.
26
- def call
27
- return broadcast(:invalid) if form.invalid?
28
- return broadcast(:invalid) unless assembly_member
29
-
30
- assembly_member.assign_attributes(attributes)
31
-
32
- if assembly_member.valid?
33
- assembly_member.reload
34
- update_assembly_member!
35
- broadcast(:ok)
36
- else
37
- if assembly_member.errors.include? :non_user_avatar
38
- form.errors.add(
39
- :non_user_avatar,
40
- assembly_member.errors[:non_user_avatar]
41
- )
42
- end
43
-
44
- broadcast(:invalid)
45
- end
46
- end
11
+ fetch_form_attributes :full_name, :gender, :birthday, :birthplace, :ceased_date, :designation_date,
12
+ :position, :position_other, :weight, :user
47
13
 
48
14
  private
49
15
 
50
- attr_reader :form, :assembly_member
51
-
52
- def attributes
53
- form.attributes.slice(
54
- "full_name",
55
- "gender",
56
- "birthday",
57
- "birthplace",
58
- "ceased_date",
59
- "designation_date",
60
- "position",
61
- "position_other",
62
- "weight"
63
- ).symbolize_keys.merge(
64
- user: form.user
65
- ).merge(
66
- attachment_attributes(:non_user_avatar)
67
- )
68
- end
69
-
70
- def update_assembly_member!
71
- log_info = {
16
+ def extra_params
17
+ {
72
18
  resource: {
73
- title: assembly_member.full_name
19
+ title: resource.full_name
74
20
  },
75
21
  participatory_space: {
76
- title: assembly_member.assembly.title
22
+ title: resource.assembly.title
77
23
  }
78
24
  }
79
-
80
- Decidim.traceability.update!(
81
- assembly_member,
82
- form.current_user,
83
- attributes,
84
- log_info
85
- )
86
25
  end
87
26
  end
88
27
  end
@@ -52,7 +52,7 @@ module Decidim
52
52
  assembly_id: current_assembly.id
53
53
  )
54
54
 
55
- UpdateAssembly.call(current_assembly, @form) do
55
+ UpdateAssembly.call(@form, current_assembly) do
56
56
  on(:ok) do |assembly|
57
57
  flash[:notice] = I18n.t("assemblies.update.success", scope: "decidim.admin")
58
58
  redirect_to edit_assembly_path(assembly)
@@ -5,8 +5,8 @@ module Decidim
5
5
  module Admin
6
6
  # Controller used to manage the available assemblies types for the current
7
7
  # organization.
8
- # As this substitues former i18n simple hash we need to keep these i18n keys for migrations
9
- # and rollbakcs. So let i18n-tasks know about:
8
+ # As this substitutes former i18n simple hash we need to keep these i18n keys for migrations
9
+ # and rollbacks. So let i18n-tasks know about:
10
10
  # i18n-tasks-use t('decidim.assemblies.assembly_types.government')
11
11
  # i18n-tasks-use t('decidim.assemblies.assembly_types.commission')
12
12
  # i18n-tasks-use t('decidim.assemblies.assembly_types.consultative_advisory')
@@ -63,7 +63,7 @@ module Decidim
63
63
  @form = assembly_type_form
64
64
  .from_params(params, assembly_type: current_assembly_type)
65
65
 
66
- UpdateAssembliesType.call(current_assembly_type, @form) do
66
+ UpdateAssembliesType.call(@form, current_assembly_type) do
67
67
  on(:ok) do
68
68
  flash[:notice] = I18n.t("assemblies_types.update.success", scope: "decidim.admin")
69
69
  redirect_to assemblies_types_path
@@ -80,7 +80,7 @@ module Decidim
80
80
  def destroy
81
81
  enforce_permission_to :destroy, :assembly_type, assembly_type: current_assembly_type
82
82
 
83
- DestroyAssembliesType.call(current_assembly_type, current_user) do
83
+ Decidim::Commands::DestroyResource.call(current_assembly_type, current_user) do
84
84
  on(:ok) do
85
85
  flash[:notice] = I18n.t("assemblies_types.destroy.success", scope: "decidim.admin")
86
86
  redirect_to assemblies_types_path
@@ -23,7 +23,7 @@ module Decidim
23
23
  enforce_permission_to :create, :assembly_member
24
24
  @form = form(AssemblyMemberForm).from_params(params)
25
25
 
26
- CreateAssemblyMember.call(@form, current_user, current_assembly) do
26
+ CreateAssemblyMember.call(@form) do
27
27
  on(:ok) do
28
28
  flash[:notice] = I18n.t("assembly_members.create.success", scope: "decidim.admin")
29
29
  redirect_to assembly_members_path(current_assembly)
@@ -4,7 +4,7 @@ module Decidim
4
4
  module Assemblies
5
5
  module Admin
6
6
  # Controller that allows managing assembly private users
7
- # on assembies
7
+ # on assemblies
8
8
  class ParticipatorySpacePrivateUsersController < Decidim::Assemblies::Admin::ApplicationController
9
9
  include Concerns::AssemblyAdmin
10
10
  include Decidim::Admin::Concerns::HasPrivateUsers
@@ -4,7 +4,7 @@ module Decidim
4
4
  module Assemblies
5
5
  module Admin
6
6
  # Controller that allows importing assembly private users
7
- # on assembies
7
+ # on assemblies
8
8
  class ParticipatorySpacePrivateUsersCsvImportsController < Decidim::Admin::ApplicationController
9
9
  include Concerns::AssemblyAdmin
10
10
  include Decidim::Admin::Concerns::HasPrivateUsersCsvImport
@@ -2,7 +2,10 @@
2
2
 
3
3
  module Decidim
4
4
  module Assemblies
5
- # The main admin application controller for assemblies
5
+ # The main application controller for assemblies
6
+ #
7
+ # This controller is the abstract class from which all other controllers of
8
+ # this engine inherit.
6
9
  class ApplicationController < Decidim::ApplicationController
7
10
  helper Decidim::ApplicationHelper
8
11
  helper Decidim::Assemblies::AssembliesHelper
@@ -6,9 +6,6 @@ module Decidim
6
6
  class AssembliesController < Decidim::Assemblies::ApplicationController
7
7
  include ParticipatorySpaceContext
8
8
  include AssemblyBreadcrumb
9
-
10
- participatory_space_layout only: :show
11
-
12
9
  include FilterResource
13
10
  include Paginable
14
11
  include HasParticipatorySpaceContentBlocks
@@ -6,8 +6,6 @@ module Decidim
6
6
  include ParticipatorySpaceContext
7
7
  include AssemblyBreadcrumb
8
8
 
9
- participatory_space_layout only: :index
10
-
11
9
  helper_method :collection
12
10
 
13
11
  def index
@@ -51,7 +51,6 @@ module Decidim
51
51
  attribute :is_transparent, Boolean
52
52
  attribute :promoted, Boolean
53
53
  attribute :private_space, Boolean
54
- attribute :show_statistics, Boolean
55
54
  attribute :scopes_enabled, Boolean
56
55
 
57
56
  attribute :closing_date, Decidim::Attributes::LocalizedDate
@@ -12,32 +12,6 @@ module Decidim
12
12
  include Decidim::FiltersHelper
13
13
  include FilterAssembliesHelper
14
14
 
15
- # Public: Returns the characteristics of an assembly in a readable format like
16
- # "title: close, no public, no transparent and is restricted to the members of the assembly"
17
- # deprecated
18
- def participatory_processes_for_assembly(assembly_participatory_processes)
19
- html = ""
20
- html += %( <div class="section"> ).html_safe
21
- html += %( <h4>#{t("assemblies.show.related_participatory_processes", scope: "decidim")}</h4> ).html_safe
22
- html += %( <div class="row small-up-1 medium-up-2 card-grid"> ).html_safe
23
- assembly_participatory_processes.each do |assembly_participatory_process|
24
- html += render partial: "decidim/participatory_processes/participatory_process", locals: { participatory_process: assembly_participatory_process }
25
- end
26
- html += %( </div> ).html_safe
27
- html += %( </div> ).html_safe
28
-
29
- html.html_safe
30
- end
31
-
32
- def assembly_features(assembly)
33
- html = "".html_safe
34
- html += "<strong>#{translated_attribute(assembly.title)}: </strong>".html_safe
35
- html += t("assemblies.show.private_space", scope: "decidim").to_s.html_safe
36
- html += ", #{t("assemblies.show.is_transparent.#{assembly.is_transparent}", scope: "decidim")}".html_safe if assembly.is_transparent?
37
- html += " #{decidim_sanitize_editor translated_attribute(assembly.special_features)}".html_safe
38
- html.html_safe
39
- end
40
-
41
15
  # Items to display in the navigation of an assembly
42
16
  def assembly_nav_items(participatory_space)
43
17
  components = participatory_space.components.published.or(Decidim::Component.where(id: try(:current_component)))
@@ -145,7 +145,7 @@ module Decidim
145
145
  end
146
146
 
147
147
  # All users with a relation to an assembly and organization admins can enter
148
- # the space area. The sapce area is considered to be the assemblies zone,
148
+ # the space area. The space area is considered to be the assemblies zone,
149
149
  # not the assembly groups one.
150
150
  def user_can_enter_space_area?
151
151
  return unless permission_action.action == :enter &&
@@ -31,7 +31,6 @@ module Decidim
31
31
  reference: :string,
32
32
  scopes_enabled: :boolean,
33
33
  short_description: :i18n,
34
- show_statistics: :boolean,
35
34
  slug: :default,
36
35
  subtitle: :i18n,
37
36
  target: :i18n,
@@ -36,7 +36,6 @@ module Decidim
36
36
  target: attributes["target"],
37
37
  participatory_scope: attributes["participatory_scope"],
38
38
  participatory_structure: attributes["participatory_structure"],
39
- show_statistics: attributes["show_statistics"],
40
39
  scopes_enabled: attributes["scopes_enabled"],
41
40
  private_space: attributes["private_space"],
42
41
  reference: attributes["reference"],
@@ -33,9 +33,8 @@ module Decidim
33
33
  local_area: assembly.local_area,
34
34
  target: assembly.target,
35
35
  decidim_scope_id: assembly.decidim_scope_id,
36
- paticipatory_scope: assembly.participatory_scope,
36
+ paticipatory_scope: assembly.participatory_scope, # intentionally misspelled
37
37
  participatory_structure: assembly.participatory_structure,
38
- show_statistics: assembly.show_statistics,
39
38
  scopes_enabled: assembly.scopes_enabled,
40
39
  private_space: assembly.private_space,
41
40
  reference: assembly.reference,
@@ -181,17 +181,17 @@
181
181
  </div>
182
182
  </div>
183
183
 
184
- <div class="card" data-component="accordion" id="accordion-visbility">
184
+ <div class="card" data-component="accordion" id="accordion-visibility">
185
185
  <div class="card-divider">
186
- <button class="card-divider-button" data-open="true" data-controls="panel-visbility" type="button">
186
+ <button class="card-divider-button" data-open="true" data-controls="panel-visibility" type="button">
187
187
  <%= icon "arrow-right-s-line" %>
188
- <h2 class="card-title" id="visbility">
189
- <%= t("visbility", scope: "decidim.assemblies.admin.assemblies.form") %>
188
+ <h2 class="card-title" id="visibility">
189
+ <%= t("visibility", scope: "decidim.assemblies.admin.assemblies.form") %>
190
190
  </h2>
191
191
  </button>
192
192
  </div>
193
193
 
194
- <div id="panel-visbility" class="card-section">
194
+ <div id="panel-visibility" class="card-section">
195
195
  <% if params[:parent_id].present? %>
196
196
  <%= form.hidden_field :parent_id, value: @form.parent_id %>
197
197
  <% else %>
@@ -273,10 +273,6 @@
273
273
  label: t("social_handlers",
274
274
  scope: "decidim.assemblies.admin.assemblies.form") %>
275
275
  </div>
276
-
277
- <div class="row column">
278
- <%= form.check_box :show_statistics %>
279
- </div>
280
276
  </div>
281
277
  </div>
282
278
  </div>
@@ -48,6 +48,8 @@
48
48
 
49
49
  <% if allowed_to? :update, :assembly, assembly: assembly %>
50
50
  <%= link_to translated_attribute(assembly.title), edit_assembly_path(assembly) %>
51
+ <% elsif allowed_to? :read, :component, assembly: assembly %>
52
+ <%= link_to translated_attribute(assembly.title), components_path(assembly) %><br>
51
53
  <% else %>
52
54
  <%= translated_attribute(assembly.title) %>
53
55
  <% end %>
@@ -18,7 +18,7 @@
18
18
  <th><%= t("models.assembly_member.fields.position", scope: "decidim.admin") %></th>
19
19
  <th><%= t("models.assembly_member.fields.designation_date", scope: "decidim.admin") %></th>
20
20
  <th><%= t("models.assembly_member.fields.ceased_date", scope: "decidim.admin") %></th>
21
- <th class="actions"></th>
21
+ <th></th>
22
22
  </tr>
23
23
  </thead>
24
24
  <tbody>
@@ -10,7 +10,7 @@
10
10
  </div>
11
11
  <div class="columns">
12
12
  <%= form.label :role %>
13
- <%= select :assembly_user_role, :role, @form.roles, include_blank: false %>
13
+ <%= select :assembly_user_role, :role, options_for_select(@form.roles, @user_role&.role) %>
14
14
  </div>
15
15
  </div>
16
16
  </div>
@@ -18,7 +18,7 @@
18
18
  <th><%= sort_link(query, :last_sign_in_at, t("models.user.fields.last_sign_in_at", scope: "decidim.admin"), default_order: :desc) %></th>
19
19
  <th><%= sort_link(query, :invitation_accepted_at, t("models.user.fields.invitation_accepted_at", scope: "decidim.admin"), default_order: :desc) %></th>
20
20
  <th><%= sort_link(query, :role, t("models.assembly_user_role.fields.role", scope: "decidim.admin"), default_order: :desc) %></th>
21
- <th class="actions"></th>
21
+ <th></th>
22
22
  </tr>
23
23
  </thead>
24
24
  <tbody>
@@ -1,8 +1,8 @@
1
1
  <% add_decidim_meta_tags({
2
+ title: translated_attribute(current_participatory_space.title),
2
3
  image_url: current_participatory_space.attached_uploader(:hero_image).path,
3
4
  description: translated_attribute(current_participatory_space.short_description),
4
- url: assembly_url(current_participatory_space),
5
- twitter_handler: current_organization.twitter_handler
5
+ url: assembly_url(current_participatory_space)
6
6
  }) %>
7
7
 
8
8
  <%
@@ -14,23 +14,27 @@ edit_link(
14
14
  )
15
15
  %>
16
16
 
17
- <% if current_participatory_space.private_space? %>
18
- <section class="participatory-space__block-reference alert">
19
- <%= t("private_space", scope: "decidim.assemblies.show") %>
20
- </section>
21
- <% end %>
17
+ <%= render partial: "layouts/decidim/header/follow_space_menu_bar_button", locals: { participatory_space: current_participatory_space } %>
22
18
 
23
- <div class="participatory-space__container">
19
+ <main>
20
+ <% if current_participatory_space.private_space? %>
21
+ <section class="participatory-space__block-reference alert">
22
+ <%= t("private_space", scope: "decidim.assemblies.show") %>
23
+ </section>
24
+ <% end %>
24
25
 
25
- <%= participatory_space_floating_help %>
26
+ <div class="participatory-space__container">
26
27
 
27
- <% active_content_blocks.each do |content_block| %>
28
- <% next unless content_block.manifest %>
29
- <%= cell content_block.manifest.cell, content_block %>
30
- <% end %>
28
+ <%= participatory_space_floating_help %>
31
29
 
32
- </div>
30
+ <% active_content_blocks.each do |content_block| %>
31
+ <% next unless content_block.manifest %>
32
+ <%= cell content_block.manifest.cell, content_block %>
33
+ <% end %>
33
34
 
34
- <section class="participatory-space__block-reference">
35
- <%= resource_reference(current_participatory_space) %>
36
- </section>
35
+ </div>
36
+
37
+ <section class="participatory-space__block-reference">
38
+ <%= resource_reference(current_participatory_space) %>
39
+ </section>
40
+ </main>
@@ -1,4 +1,5 @@
1
- <% add_decidim_meta_tags(title: t("assembly_members.index.title", scope: "decidim")) %>
1
+ <% add_decidim_page_title(t("assembly_members.index.title", scope: "decidim")) %>
2
+ <% add_decidim_page_title(translated_attribute(current_participatory_space.title)) %>
2
3
 
3
4
  <%
4
5
  edit_link(
@@ -51,7 +51,6 @@ ar:
51
51
  scope_id: نطاق
52
52
  scopes_enabled: النطاقات المُفعّلَة
53
53
  short_description: وصف قصير
54
- show_statistics: عرض الإحصائيات
55
54
  slug: سبيكة العنوان الشبكي
56
55
  special_features: مميزات خاصة
57
56
  subtitle: العنوان الفرعي
@@ -200,7 +199,6 @@ ar:
200
199
  categories: الفئات
201
200
  components: المكونات
202
201
  moderations: الإعتدال
203
- private_users: المستخدمون الخاصون
204
202
  assemblies_types: نوع التجمّعات
205
203
  models:
206
204
  assemblies_types:
@@ -291,7 +289,6 @@ ar:
291
289
  form:
292
290
  existing_user: المشارك الحالي
293
291
  explanation: 'إرشادات للصورة:'
294
- image_guide: يفضل أن تكون صورة لا تحتوي على أي نص.
295
292
  non_user: غير مشارك
296
293
  non_user_avatar_help: يجب أن تحصل على موافقة الأشخاص قبل نشرهم كأعضاء.
297
294
  select_a_position: اختر المنصب
@@ -350,11 +347,7 @@ ar:
350
347
  show:
351
348
  assembly_type: نوع الجمعية
352
349
  duration: المدة الزمنية
353
- is_transparent:
354
- 'false': مبهمة
355
- 'true': شفافة
356
350
  private_space: هذه جمعية خاصة
357
- related_participatory_processes: العمليات التشاركية ذات الصلة
358
351
  social_networks_title: زيارة التجمع على
359
352
  assembly_members:
360
353
  assembly_member: