decidim-assemblies 0.10.1 → 0.11.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/config/decidim_assemblies_manifest.js +1 -0
  4. data/app/assets/javascripts/decidim/assemblies/admin/assemblies.js.es6 +57 -4
  5. data/app/assets/javascripts/decidim/assemblies/assemblies.js.es6 +18 -0
  6. data/app/commands/decidim/assemblies/admin/copy_assembly.rb +9 -9
  7. data/app/commands/decidim/assemblies/admin/create_assembly.rb +33 -1
  8. data/app/commands/decidim/assemblies/admin/create_assembly_admin.rb +2 -2
  9. data/app/commands/decidim/assemblies/admin/update_assembly.rb +31 -1
  10. data/app/constraints/decidim/assemblies/{current_feature.rb → current_component.rb} +7 -7
  11. data/app/controllers/decidim/assemblies/admin/assemblies_controller.rb +17 -6
  12. data/app/controllers/decidim/assemblies/admin/{feature_permissions_controller.rb → component_permissions_controller.rb} +2 -2
  13. data/app/controllers/decidim/assemblies/admin/{features_controller.rb → components_controller.rb} +2 -2
  14. data/app/controllers/decidim/assemblies/admin/participatory_space_private_users_controller.rb +26 -0
  15. data/app/controllers/decidim/assemblies/assemblies_controller.rb +10 -4
  16. data/app/controllers/decidim/assemblies/assembly_widgets_controller.rb +1 -1
  17. data/app/forms/decidim/assemblies/admin/assembly_copy_form.rb +1 -1
  18. data/app/forms/decidim/assemblies/admin/assembly_form.rb +63 -2
  19. data/app/helpers/decidim/assemblies/admin/assemblies_helper.rb +20 -0
  20. data/app/helpers/decidim/assemblies/assemblies_helper.rb +51 -0
  21. data/app/models/decidim/assemblies/abilities/admin/admin_ability.rb +1 -0
  22. data/app/models/decidim/assemblies/abilities/admin/assembly_admin_ability.rb +3 -3
  23. data/app/models/decidim/assemblies/abilities/admin/assembly_moderator_ability.rb +1 -1
  24. data/app/models/decidim/assembly.rb +102 -2
  25. data/app/presenters/decidim/assemblies/admin_log/assembly_presenter.rb +20 -1
  26. data/app/presenters/decidim/assemblies/assembly_stats_presenter.rb +9 -9
  27. data/app/presenters/decidim/log/value_types/assembly_presenter.rb +28 -0
  28. data/app/queries/decidim/assemblies/organization_prioritized_assemblies.rb +3 -2
  29. data/app/queries/decidim/assemblies/organization_published_assemblies.rb +3 -1
  30. data/app/queries/decidim/assemblies/visible_assemblies.rb +20 -0
  31. data/app/views/decidim/assemblies/_assembly.html.erb +1 -1
  32. data/app/views/decidim/assemblies/admin/assemblies/_form.html.erb +76 -1
  33. data/app/views/decidim/assemblies/admin/assemblies/edit.html.erb +3 -4
  34. data/app/views/decidim/assemblies/admin/assemblies/index.html.erb +20 -4
  35. data/app/views/decidim/assemblies/admin/assemblies/new.html.erb +2 -2
  36. data/app/views/decidim/assemblies/admin/assembly_copies/_form.html.erb +1 -1
  37. data/app/views/decidim/assemblies/admin/assembly_copies/new.html.erb +1 -1
  38. data/app/views/decidim/assemblies/admin/assembly_user_roles/edit.html.erb +1 -1
  39. data/app/views/decidim/assemblies/admin/assembly_user_roles/index.html.erb +1 -1
  40. data/app/views/decidim/assemblies/admin/assembly_user_roles/new.html.erb +1 -1
  41. data/app/views/decidim/assemblies/assemblies/_nav_breadcumb.html.erb +11 -0
  42. data/app/views/decidim/assemblies/assemblies/_promoted_assembly.html.erb +1 -1
  43. data/app/views/decidim/assemblies/assemblies/_statistics.html.erb +1 -1
  44. data/app/views/decidim/assemblies/assemblies/index.html.erb +1 -1
  45. data/app/views/decidim/assemblies/assemblies/show.html.erb +129 -7
  46. data/app/views/decidim/assemblies/assembly_widgets/show.html.erb +1 -1
  47. data/app/views/layouts/decidim/_assembly_header.html.erb +13 -13
  48. data/app/views/layouts/decidim/admin/assemblies.html.erb +1 -1
  49. data/app/views/layouts/decidim/admin/assembly.html.erb +15 -10
  50. data/app/views/layouts/decidim/assembly.html.erb +2 -2
  51. data/config/locales/ca.yml +71 -1
  52. data/config/locales/en.yml +71 -1
  53. data/config/locales/es.yml +71 -1
  54. data/config/locales/eu.yml +71 -1
  55. data/config/locales/fi.yml +71 -1
  56. data/config/locales/fr.yml +88 -18
  57. data/config/locales/gl.yml +71 -1
  58. data/config/locales/it.yml +71 -1
  59. data/config/locales/nl.yml +105 -35
  60. data/config/locales/pl.yml +71 -1
  61. data/config/locales/pt-BR.yml +71 -1
  62. data/config/locales/pt.yml +71 -1
  63. data/config/locales/ru.yml +0 -1
  64. data/config/locales/sv.yml +71 -1
  65. data/config/locales/uk.yml +0 -1
  66. data/db/migrate/20180124083729_add_private_to_assemblies.rb +7 -0
  67. data/db/migrate/20180226103942_add_parent_child_relation_to_assemblies.rb +22 -0
  68. data/db/migrate/20180302121116_add_fields_to_assemblies.rb +25 -0
  69. data/lib/decidim/assemblies/admin_engine.rb +11 -5
  70. data/lib/decidim/assemblies/engine.rb +7 -7
  71. data/lib/decidim/assemblies/participatory_space.rb +89 -34
  72. data/lib/decidim/assemblies/test/factories.rb +24 -0
  73. data/lib/decidim/assemblies/version.rb +1 -1
  74. metadata +23 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62cf8f50823ac57c77c02e3880695eb02ab0b8d5827c7907a0bed3004b10bf17
4
- data.tar.gz: 71a68528d91250c06c5c03f12a3c97a9567c132eccc50fbdeb8a308070ff9bae
3
+ metadata.gz: f603662b1e867eeeae60d0a92dfef0f6e7d9acf6211cf525e3e93c4f55c326ce
4
+ data.tar.gz: 1369941b9f64beecb271a3585cb2e4b68f99c6d0ad04feaed4c00393675f8547
5
5
  SHA512:
6
- metadata.gz: 38f12236b4ce9f4dc7d01567db2347abfb412bcac46c260db1eb7cdfdc5cd0972df43935ecbf0238f81532da931bacbd507c9192979bfe78e12b392424640a13
7
- data.tar.gz: 227dacddc5cbbca82cd6d30fca2dfa42702aac0338d28d3d64158cf046f1809ad53009521a2b799cecaaed24ee1fe2309c38cf7b8ca0d50e42b1a98f4797f172
6
+ metadata.gz: 7f557e56dcc33cb61bd9ff15a400b8b8b2161ffcf19e2e1a06dc340d527187e6b88e97850d71422491eab482c0d6057503fb34d556f589a32719ed9d1bb45aff
7
+ data.tar.gz: ea07f1a489fb86c07cfb386cae72629a4a6d871f1a3d20330d2c99f92cb899b79c5d10b2add9a2b3f0917cabf6a04cbe401cc4a632be4557d5ae351c7ac17047
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Assemblies are the permanent Decidim's participatory space. They are always
4
4
  "active" so unlike participatory processes, they have no steps or phases.
5
5
 
6
- A assembly can get different features (such as meetings or proposals) attached.
6
+ A assembly can get different components (such as meetings or proposals) attached.
7
7
  It can also have attachments, be associated to custom categories or scopes, and
8
8
  can be fully managed via an administration UI.
9
9
 
@@ -1 +1,2 @@
1
1
  //= link_directory ../images/decidim/assemblies
2
+ //= link_directory ../javascripts/decidim/assemblies
@@ -1,14 +1,67 @@
1
1
  $(() => {
2
2
  ((exports) => {
3
- const $assemblyScopeEnabled = $('#assembly_scopes_enabled');
3
+ const $assemblyScopeEnabled = $("#assembly_scopes_enabled");
4
4
  const $assemblyScopeId = $("#assembly_scope_id");
5
5
 
6
- if ($('.edit_assembly, .new_assembly').length > 0) {
7
- $assemblyScopeEnabled.on('change', (event) => {
6
+ if ($(".edit_assembly, .new_assembly").length > 0) {
7
+ $assemblyScopeEnabled.on("change", (event) => {
8
8
  const checked = event.target.checked;
9
9
  exports.theDataPicker.enabled($assemblyScopeId, checked);
10
10
  })
11
- exports.theDataPicker.enabled($assemblyScopeId, $assemblyScopeEnabled.prop('checked'));
11
+ exports.theDataPicker.enabled($assemblyScopeId, $assemblyScopeEnabled.prop("checked"));
12
12
  }
13
+
14
+
15
+ const $form = $(".assembly_form_admin");
16
+
17
+ if ($form.length > 0) {
18
+
19
+ const $privateSpace = $form.find("#private_space");
20
+ const $isTransparent = $form.find("#is_transparent");
21
+ const $specialFeatures = $form.find("#special_features");
22
+
23
+
24
+ const toggleDisabledHiddenFields = () => {
25
+ const enabledPrivateSpace = $privateSpace.find("input[type='checkbox']").prop("checked");
26
+ $isTransparent.find("input[type='checkbox']").attr("disabled", "disabled");
27
+ $specialFeatures.hide();
28
+
29
+ if (enabledPrivateSpace) {
30
+ $isTransparent.find("input[type='checkbox']").attr("disabled", !enabledPrivateSpace);
31
+ $specialFeatures.show();
32
+ }
33
+ };
34
+
35
+ $privateSpace.on("change", toggleDisabledHiddenFields);
36
+ toggleDisabledHiddenFields();
37
+
38
+ const $assemblyType = $form.find("#assembly_assembly_type");
39
+ const $assemblyTypeOther = $form.find("#assembly_type_other");
40
+
41
+ const $assemblyCreatedBy = $form.find("#assembly_created_by");
42
+ const $assemblyCreatedByOther = $form.find("#created_by_other");
43
+
44
+ const toggleDependsOnSelect = ($target, $showDiv) => {
45
+ const value = $target.val();
46
+ $showDiv.hide();
47
+ if (value === "others") {
48
+ $showDiv.show();
49
+ }
50
+ };
51
+
52
+ $assemblyType.on("change", (ev) => {
53
+ const $target = $(ev.target);
54
+ toggleDependsOnSelect($target, $assemblyTypeOther);
55
+ });
56
+
57
+ $assemblyCreatedBy.on("change", (ev) => {
58
+ const $target = $(ev.target);
59
+ toggleDependsOnSelect($target, $assemblyCreatedByOther);
60
+ });
61
+
62
+ toggleDependsOnSelect($assemblyType, $assemblyTypeOther);
63
+ toggleDependsOnSelect($assemblyCreatedBy, $assemblyCreatedByOther);
64
+ }
65
+
13
66
  })(window);
14
67
  });
@@ -0,0 +1,18 @@
1
+ (function() {
2
+ $(() => {
3
+
4
+ $(".show-more").on("click", function() {
5
+ /* eslint-disable no-invalid-this */
6
+ $(this).hide();
7
+ $(".show-more-panel").removeClass("hide");
8
+ $(".hide-more").show();
9
+ });
10
+
11
+ $(".hide-more").on("click", function() {
12
+ $(this).hide();
13
+ $(".show-more-panel").addClass("hide");
14
+ $(".show-more").show();
15
+ });
16
+
17
+ })
18
+ }(window));
@@ -27,7 +27,7 @@ module Decidim
27
27
  Assembly.transaction do
28
28
  copy_assembly
29
29
  copy_assembly_categories if @form.copy_categories?
30
- copy_assembly_features if @form.copy_features?
30
+ copy_assembly_components if @form.copy_components?
31
31
  end
32
32
 
33
33
  broadcast(:ok, @copied_assembly)
@@ -70,16 +70,16 @@ module Decidim
70
70
  end
71
71
  end
72
72
 
73
- def copy_assembly_features
74
- @assembly.features.each do |feature|
75
- new_feature = Feature.create!(
76
- manifest_name: feature.manifest_name,
77
- name: feature.name,
73
+ def copy_assembly_components
74
+ @assembly.components.each do |component|
75
+ new_component = Component.create!(
76
+ manifest_name: component.manifest_name,
77
+ name: component.name,
78
78
  participatory_space: @copied_assembly,
79
- settings: feature.settings,
80
- step_settings: feature.step_settings
79
+ settings: component.settings,
80
+ step_settings: component.step_settings
81
81
  )
82
- feature.manifest.run_hooks(:copy, new_feature: new_feature, old_feature: feature)
82
+ component.manifest.run_hooks(:copy, new_component: new_component, old_component: component)
83
83
  end
84
84
  end
85
85
  end
@@ -24,6 +24,8 @@ module Decidim
24
24
 
25
25
  if assembly.persisted?
26
26
  add_admins_as_followers(assembly)
27
+ link_participatory_processes(assembly)
28
+
27
29
  broadcast(:ok, assembly)
28
30
  else
29
31
  form.errors.add(:hero_image, assembly.errors[:hero_image]) if assembly.errors.include? :hero_image
@@ -53,12 +55,34 @@ module Decidim
53
55
  scopes_enabled: form.scopes_enabled,
54
56
  scope: form.scope,
55
57
  area: form.area,
58
+ parent: form.parent,
59
+ private_space: form.private_space,
56
60
  developer_group: form.developer_group,
57
61
  local_area: form.local_area,
58
62
  target: form.target,
59
63
  participatory_scope: form.participatory_scope,
60
64
  participatory_structure: form.participatory_structure,
61
- meta_scope: form.meta_scope
65
+ meta_scope: form.meta_scope,
66
+ show_statistics: form.show_statistics,
67
+ purpose_of_action: form.purpose_of_action,
68
+ composition: form.composition,
69
+ assembly_type: form.assembly_type,
70
+ assembly_type_other: form.assembly_type_other,
71
+ creation_date: form.creation_date,
72
+ created_by: form.created_by,
73
+ created_by_other: form.created_by_other,
74
+ duration: form.duration,
75
+ included_at: form.included_at,
76
+ closing_date: form.closing_date,
77
+ closing_date_reason: form.closing_date_reason,
78
+ internal_organisation: form.internal_organisation,
79
+ is_transparent: form.is_transparent,
80
+ special_features: form.special_features,
81
+ twitter_handler: form.twitter_handler,
82
+ facebook_handler: form.facebook_handler,
83
+ instagram_handler: form.instagram_handler,
84
+ youtube_handler: form.youtube_handler,
85
+ github_handler: form.github_handler
62
86
  )
63
87
  end
64
88
 
@@ -74,6 +98,14 @@ module Decidim
74
98
  Decidim::CreateFollow.new(form, admin).call
75
99
  end
76
100
  end
101
+
102
+ def participatory_processes(assembly)
103
+ @participatory_processes ||= assembly.participatory_space_sibling_scope(:participatory_processes).where(id: @form.participatory_processes_ids)
104
+ end
105
+
106
+ def link_participatory_processes(assembly)
107
+ assembly.link_participatory_spaces_resources(participatory_processes(assembly), "included_participatory_processes")
108
+ end
77
109
  end
78
110
  end
79
111
  end
@@ -62,10 +62,10 @@ module Decidim
62
62
  def existing_user
63
63
  return @existing_user if defined?(@existing_user)
64
64
 
65
- @existing_user = User.where(
65
+ @existing_user = User.find_by(
66
66
  email: form.email,
67
67
  organization: assembly.organization
68
- ).first
68
+ )
69
69
 
70
70
  InviteUserAgain.call(@existing_user, invitation_instructions) if @existing_user && !@existing_user.invitation_accepted?
71
71
 
@@ -24,6 +24,7 @@ module Decidim
24
24
  def call
25
25
  return broadcast(:invalid) if form.invalid?
26
26
  update_assembly
27
+ link_participatory_processes(@assembly)
27
28
 
28
29
  if @assembly.valid?
29
30
  broadcast(:ok, @assembly)
@@ -68,15 +69,44 @@ module Decidim
68
69
  scopes_enabled: form.scopes_enabled,
69
70
  scope: form.scope,
70
71
  area: form.area,
72
+ parent: form.parent,
73
+ private_space: form.private_space,
71
74
  developer_group: form.developer_group,
72
75
  local_area: form.local_area,
73
76
  target: form.target,
74
77
  participatory_scope: form.participatory_scope,
75
78
  participatory_structure: form.participatory_structure,
76
79
  meta_scope: form.meta_scope,
77
- show_statistics: form.show_statistics
80
+ show_statistics: form.show_statistics,
81
+ purpose_of_action: form.purpose_of_action,
82
+ composition: form.composition,
83
+ assembly_type: form.assembly_type,
84
+ assembly_type_other: form.assembly_type_other,
85
+ creation_date: form.creation_date,
86
+ created_by: form.created_by,
87
+ created_by_other: form.created_by_other,
88
+ duration: form.duration,
89
+ included_at: form.included_at,
90
+ closing_date: form.closing_date,
91
+ closing_date_reason: form.closing_date_reason,
92
+ internal_organisation: form.internal_organisation,
93
+ is_transparent: form.is_transparent,
94
+ special_features: form.special_features,
95
+ twitter_handler: form.twitter_handler,
96
+ facebook_handler: form.facebook_handler,
97
+ instagram_handler: form.instagram_handler,
98
+ youtube_handler: form.youtube_handler,
99
+ github_handler: form.github_handler
78
100
  }
79
101
  end
102
+
103
+ def participatory_processes(assembly)
104
+ @participatory_processes ||= assembly.participatory_space_sibling_scope(:participatory_processes).where(id: @form.participatory_processes_ids)
105
+ end
106
+
107
+ def link_participatory_processes(assembly)
108
+ assembly.link_participatory_spaces_resources(participatory_processes(assembly), "included_participatory_processes")
109
+ end
80
110
  end
81
111
  end
82
112
  end
@@ -2,26 +2,26 @@
2
2
 
3
3
  module Decidim
4
4
  module Assemblies
5
- # This class infers the current feature on an assembly context
5
+ # This class infers the current component on an assembly context
6
6
  # request parameters and injects it into the environment.
7
- class CurrentFeature
7
+ class CurrentComponent
8
8
  # Public: Initializes the class.
9
9
  #
10
- # manifest - The manifest of the feature to check against.
10
+ # manifest - The manifest of the component to check against.
11
11
  def initialize(manifest)
12
12
  @manifest = manifest
13
13
  end
14
14
 
15
- # Public: Matches the request against a feature and injects it into the
15
+ # Public: Matches the request against a component and injects it into the
16
16
  # environment.
17
17
  #
18
- # request - The request that holds the current feature relevant information.
18
+ # request - The request that holds the current component relevant information.
19
19
  #
20
20
  # Returns a true if the request matches an assembly and a
21
- # feature belonging to that assembly, false otherwise
21
+ # component belonging to that assembly, false otherwise
22
22
  def matches?(request)
23
23
  CurrentAssembly.new.matches?(request) &&
24
- Decidim::CurrentFeature.new(@manifest).matches?(request)
24
+ Decidim::CurrentComponent.new(@manifest).matches?(request)
25
25
  end
26
26
  end
27
27
  end
@@ -6,7 +6,7 @@ module Decidim
6
6
  # Controller that allows managing assemblies.
7
7
  #
8
8
  class AssembliesController < Decidim::Admin::ApplicationController
9
- helper_method :current_assembly, :current_participatory_space
9
+ helper_method :current_assembly, :parent_assembly, :parent_assemblies, :current_participatory_space
10
10
  layout "decidim/admin/assemblies"
11
11
 
12
12
  def index
@@ -17,6 +17,7 @@ module Decidim
17
17
  def new
18
18
  authorize! :new, Decidim::Assembly
19
19
  @form = form(AssemblyForm).instance
20
+ @form.parent_id = params[:parent_id]
20
21
  end
21
22
 
22
23
  def create
@@ -24,9 +25,9 @@ module Decidim
24
25
  @form = form(AssemblyForm).from_params(params)
25
26
 
26
27
  CreateAssembly.call(@form) do
27
- on(:ok) do
28
+ on(:ok) do |assembly|
28
29
  flash[:notice] = I18n.t("assemblies.create.success", scope: "decidim.admin")
29
- redirect_to assemblies_path
30
+ redirect_to assemblies_path(parent_id: assembly.parent_id)
30
31
  end
31
32
 
32
33
  on(:invalid) do
@@ -78,15 +79,25 @@ module Decidim
78
79
  private
79
80
 
80
81
  def current_assembly
81
- @current_assembly ||= collection.where(slug: params[:slug]).or(
82
- collection.where(id: params[:slug])
82
+ scope = OrganizationAssemblies.new(current_user.organization).query
83
+ @current_assembly ||= scope.where(slug: params[:slug]).or(
84
+ scope.where(id: params[:slug])
83
85
  ).first
84
86
  end
85
87
 
86
88
  alias current_participatory_space current_assembly
87
89
 
90
+ def parent_assembly
91
+ @parent_assembly ||= OrganizationAssemblies.new(current_organization).query.find_by(id: params[:parent_id])
92
+ end
93
+
94
+ def parent_assemblies
95
+ @parent_assemblies ||= OrganizationAssemblies.new(current_user.organization).query.where(parent_id: nil)
96
+ end
97
+
88
98
  def collection
89
- @collection ||= OrganizationAssemblies.new(current_user.organization).query
99
+ parent_id = params[:parent_id].presence
100
+ @collection ||= OrganizationAssemblies.new(current_user.organization).query.where(parent_id: parent_id)
90
101
  end
91
102
 
92
103
  def ability_context
@@ -3,10 +3,10 @@
3
3
  module Decidim
4
4
  module Assemblies
5
5
  module Admin
6
- # Controller that allows managing the Assembly' Feature
6
+ # Controller that allows managing the Assembly' Component
7
7
  # permissions in the admin panel.
8
8
  #
9
- class FeaturePermissionsController < Decidim::Admin::FeaturePermissionsController
9
+ class ComponentPermissionsController < Decidim::Admin::ComponentPermissionsController
10
10
  include Concerns::AssemblyAdmin
11
11
  end
12
12
  end
@@ -3,10 +3,10 @@
3
3
  module Decidim
4
4
  module Assemblies
5
5
  module Admin
6
- # Controller that allows managing the Assembly' Features in the
6
+ # Controller that allows managing the Assembly' Components in the
7
7
  # admin panel.
8
8
  #
9
- class FeaturesController < Decidim::Admin::FeaturesController
9
+ class ComponentsController < Decidim::Admin::ComponentsController
10
10
  include Concerns::AssemblyAdmin
11
11
  end
12
12
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # Controller that allows managing assembly private users
7
+ # on assembies
8
+ class ParticipatorySpacePrivateUsersController < Decidim::Admin::ApplicationController
9
+ include Concerns::AssemblyAdmin
10
+ include Decidim::Admin::Concerns::HasPrivateUsers
11
+
12
+ def after_destroy_path
13
+ participatory_space_private_users_path(current_assembly)
14
+ end
15
+
16
+ def privatable_to
17
+ current_assembly
18
+ end
19
+
20
+ def authorization_object
21
+ @participatory_space_private_user || ParticipatorySpacePrivateUser
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -14,7 +14,7 @@ module Decidim
14
14
  helper Decidim::SanitizeHelper
15
15
  helper Decidim::ResourceReferenceHelper
16
16
 
17
- helper_method :collection, :promoted_assemblies, :assemblies, :stats
17
+ helper_method :collection, :promoted_assemblies, :assemblies, :stats, :assembly_participatory_processes
18
18
 
19
19
  def index
20
20
  redirect_to "/404" if published_assemblies.none?
@@ -22,7 +22,9 @@ module Decidim
22
22
  authorize! :read, Assembly
23
23
  end
24
24
 
25
- def show; end
25
+ def show
26
+ check_current_user_can_visit_space
27
+ end
26
28
 
27
29
  private
28
30
 
@@ -35,11 +37,11 @@ module Decidim
35
37
  end
36
38
 
37
39
  def published_assemblies
38
- @published_assemblies ||= OrganizationPublishedAssemblies.new(current_organization)
40
+ @published_assemblies ||= OrganizationPublishedAssemblies.new(current_organization, current_user)
39
41
  end
40
42
 
41
43
  def assemblies
42
- @assemblies ||= OrganizationPrioritizedAssemblies.new(current_organization)
44
+ @assemblies ||= OrganizationPrioritizedAssemblies.new(current_organization, current_user)
43
45
  end
44
46
 
45
47
  alias collection assemblies
@@ -51,6 +53,10 @@ module Decidim
51
53
  def stats
52
54
  @stats ||= AssemblyStatsPresenter.new(assembly: current_participatory_space)
53
55
  end
56
+
57
+ def assembly_participatory_processes
58
+ @assembly_participatory_processes ||= @current_participatory_space.linked_participatory_space_resources(:participatory_processes, "included_participatory_processes")
59
+ end
54
60
  end
55
61
  end
56
62
  end
@@ -8,7 +8,7 @@ module Decidim
8
8
  private
9
9
 
10
10
  def model
11
- @model ||= Assembly.where(slug: params[:assembly_slug]).first
11
+ @model ||= Assembly.find_by(slug: params[:assembly_slug])
12
12
  end
13
13
 
14
14
  def current_participatory_space
@@ -15,7 +15,7 @@ module Decidim
15
15
 
16
16
  attribute :slug, String
17
17
  attribute :copy_categories, Boolean
18
- attribute :copy_features, Boolean
18
+ attribute :copy_components, Boolean
19
19
 
20
20
  validates :slug, presence: true, format: { with: Decidim::Assembly.slug_format }
21
21
  validates :title, translatable_presence: true
@@ -9,6 +9,9 @@ module Decidim
9
9
  class AssemblyForm < Form
10
10
  include TranslatableAttributes
11
11
 
12
+ ASSEMBLY_TYPES = %w(government executive consultative_advisory participatory working_group commission others).freeze
13
+ CREATED_BY = %w(city_council public others).freeze
14
+
12
15
  translatable_attribute :title, String
13
16
  translatable_attribute :subtitle, String
14
17
  translatable_attribute :description, String
@@ -19,6 +22,13 @@ module Decidim
19
22
  translatable_attribute :target, String
20
23
  translatable_attribute :participatory_scope, String
21
24
  translatable_attribute :participatory_structure, String
25
+ translatable_attribute :purpose_of_action, String
26
+ translatable_attribute :composition, String
27
+ translatable_attribute :assembly_type_other, String
28
+ translatable_attribute :created_by_other, String
29
+ translatable_attribute :closing_date_reason, String
30
+ translatable_attribute :internal_organisation, String
31
+ translatable_attribute :special_features, String
22
32
 
23
33
  mimic :assembly
24
34
 
@@ -33,11 +43,30 @@ module Decidim
33
43
  attribute :remove_banner_image
34
44
  attribute :show_statistics, Boolean
35
45
  attribute :area_id, Integer
46
+ attribute :parent_id, Integer
47
+ attribute :participatory_processes_ids, Array[Integer]
48
+ attribute :private_space, Boolean
49
+ attribute :assembly_type, String
50
+ attribute :creation_date, Decidim::Attributes::TimeWithZone
51
+ attribute :created_by, String
52
+ attribute :duration, Decidim::Attributes::TimeWithZone
53
+ attribute :included_at, Decidim::Attributes::TimeWithZone
54
+ attribute :closing_date, Decidim::Attributes::TimeWithZone
55
+ attribute :is_transparent, Boolean
56
+ attribute :twitter_handler, String
57
+ attribute :facebook_handler, String
58
+ attribute :instagram_handler, String
59
+ attribute :youtube_handler, String
60
+ attribute :github_handler, String
36
61
 
37
62
  validates :slug, presence: true, format: { with: Decidim::Assembly.slug_format }
38
63
  validates :title, :subtitle, :description, :short_description, translatable_presence: true
39
64
  validates :scope, presence: true, if: proc { |object| object.scope_id.present? }
40
65
  validates :area, presence: true, if: proc { |object| object.area_id.present? }
66
+ validates :parent, presence: true, if: ->(form) { form.parent_id.present? }
67
+
68
+ validates :assembly_type_other, translatable_presence: true, if: ->(form) { form.assembly_type == "others" }
69
+ validates :created_by_other, translatable_presence: true, if: ->(form) { form.created_by == "others" }
41
70
 
42
71
  validate :slug_uniqueness
43
72
 
@@ -49,11 +78,43 @@ module Decidim
49
78
  end
50
79
 
51
80
  def scope
52
- @scope ||= current_organization.scopes.where(id: scope_id).first
81
+ @scope ||= current_organization.scopes.find_by(id: scope_id)
53
82
  end
54
83
 
55
84
  def area
56
- @area ||= current_organization.areas.where(id: area_id).first
85
+ @area ||= current_organization.areas.find_by(id: area_id)
86
+ end
87
+
88
+ def assembly_types_for_select
89
+ ASSEMBLY_TYPES.map do |type|
90
+ [
91
+ I18n.t("assembly_types.#{type}", scope: "decidim.assemblies"),
92
+ type
93
+ ]
94
+ end
95
+ end
96
+
97
+ def created_by_for_select
98
+ CREATED_BY.map do |by|
99
+ [
100
+ I18n.t("created_by.#{by}", scope: "decidim.assemblies"),
101
+ by
102
+ ]
103
+ end
104
+ end
105
+
106
+ def parent
107
+ @parent ||= OrganizationAssemblies.new(current_organization).query.find_by(id: parent_id)
108
+ end
109
+
110
+ def processes_for_select
111
+ @processes_for_select ||= Decidim.find_participatory_space_manifest(:participatory_processes)
112
+ .participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |process|
113
+ [
114
+ translated_attribute(process.title),
115
+ process.id
116
+ ]
117
+ end
57
118
  end
58
119
 
59
120
  private
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # This class contains helpers needed to format ParticipatoryProcesses
7
+ # in order to use them in select forms for AssemblyParticipatoryProcess.
8
+ #
9
+ module AssembliesHelper
10
+ # Public: A formatted collection of ParticipatoryProcesses to be used
11
+ # in forms.
12
+ def processes_selected
13
+ if current_assembly.present?
14
+ @processes_selected ||= current_assembly.linked_participatory_space_resources(:participatory_processes, "included_participatory_processes").pluck(:id)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ # Helpers related to the Assemblies layout.
6
+ module AssembliesHelper
7
+ include Decidim::ResourceHelper
8
+ # Public: Returns the characteristics of an assembly in a readable format like
9
+ # "title: close, no public, no transparent and is restricted to the members of the assembly"
10
+ def participatory_processes_for_assembly(assembly_participatory_processes)
11
+ html = ""
12
+ html += %( <div class="section"> ).html_safe
13
+ html += %( <h4 class="section-heading">#{t("assemblies.show.related_participatory_processes", scope: "decidim")}</h4> ).html_safe
14
+ html += %( <div class="row small-up-1 medium-up-2 card-grid"> ).html_safe
15
+ assembly_participatory_processes.each do |assembly_participatory_process|
16
+ html += render partial: "decidim/participatory_processes/participatory_process", locals: { participatory_process: assembly_participatory_process }
17
+ end
18
+ html += %( </div> ).html_safe
19
+ html += %( </div> ).html_safe
20
+
21
+ html.html_safe
22
+ end
23
+
24
+ def assembly_features(assembly)
25
+ html = "".html_safe
26
+ html += "<strong>#{translated_attribute(assembly.title)}: </strong>".html_safe
27
+ html += t("assemblies.show.private_space", scope: "decidim").to_s.html_safe
28
+ html += ", #{t("assemblies.show.is_transparent.#{assembly.is_transparent}", scope: "decidim")}".html_safe if assembly.is_transparent?
29
+ html += " #{decidim_sanitize translated_attribute(assembly.special_features)}".html_safe
30
+ html.html_safe
31
+ end
32
+
33
+ def social_handler_links(assembly)
34
+ html = "".html_safe
35
+ if Decidim::Assembly::SOCIAL_HANDLERS.any? { |h| assembly.try("#{h}_handler").present? }
36
+ html += "<div class='definition-data__item social_networks'>".html_safe
37
+ html += "<span class='definition-data__title'>#{t("assemblies.show.social_networks", scope: "decidim")}</span>".html_safe
38
+ Decidim::Assembly::SOCIAL_HANDLERS.each do |handler|
39
+ handler_name = "#{handler}_handler"
40
+ if assembly.send(handler_name).present?
41
+ html += link_to handler.capitalize, "https://#{handler}.com/#{assembly.send(handler_name)}", target: "_blank", class: "", title: handler.capitalize
42
+ end
43
+ end
44
+ html += "</div>".html_safe
45
+ end
46
+
47
+ html.html_safe
48
+ end
49
+ end
50
+ end
51
+ end