decidim-assemblies 0.10.1 → 0.11.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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