decidim-core 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -0
  3. data/app/assets/stylesheets/decidim/modules/_modules.scss +1 -0
  4. data/app/assets/stylesheets/decidim/modules/_navbar.scss +3 -3
  5. data/app/assets/stylesheets/decidim/modules/_pagination.scss +5 -0
  6. data/app/commands/decidim/authorize_user.rb +1 -0
  7. data/app/commands/decidim/create_omniauth_registration.rb +1 -0
  8. data/app/commands/decidim/create_registration.rb +1 -0
  9. data/app/commands/decidim/create_report.rb +1 -0
  10. data/app/commands/decidim/invite_user.rb +1 -0
  11. data/app/commands/decidim/invite_user_again.rb +1 -0
  12. data/app/commands/decidim/remove_user_role.rb +1 -0
  13. data/app/commands/decidim/update_account.rb +1 -0
  14. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  15. data/app/constraints/decidim/current_feature.rb +1 -0
  16. data/app/controllers/concerns/decidim/action_authorization.rb +1 -0
  17. data/app/controllers/concerns/decidim/devise_controllers.rb +3 -0
  18. data/app/controllers/concerns/decidim/feature_settings.rb +1 -0
  19. data/app/controllers/concerns/decidim/filter_resource.rb +1 -0
  20. data/app/controllers/concerns/decidim/needs_organization.rb +1 -1
  21. data/app/controllers/concerns/decidim/user_profile.rb +1 -0
  22. data/app/controllers/decidim/account_controller.rb +1 -0
  23. data/app/controllers/decidim/application_controller.rb +2 -0
  24. data/app/controllers/decidim/authorizations_controller.rb +1 -0
  25. data/app/controllers/decidim/cookie_policy_controller.rb +1 -0
  26. data/app/controllers/decidim/devise/confirmations_controller.rb +1 -0
  27. data/app/controllers/decidim/devise/invitations_controller.rb +1 -0
  28. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -0
  29. data/app/controllers/decidim/devise/passwords_controller.rb +1 -0
  30. data/app/controllers/decidim/devise/registrations_controller.rb +1 -0
  31. data/app/controllers/decidim/devise/sessions_controller.rb +2 -1
  32. data/app/controllers/decidim/locales_controller.rb +1 -0
  33. data/app/controllers/decidim/notifications_settings_controller.rb +1 -0
  34. data/app/controllers/decidim/own_user_groups_controller.rb +1 -0
  35. data/app/controllers/decidim/pages_controller.rb +2 -1
  36. data/app/controllers/decidim/participatory_process_groups_controller.rb +1 -0
  37. data/app/controllers/decidim/participatory_process_steps_controller.rb +1 -0
  38. data/app/controllers/decidim/participatory_processes_controller.rb +6 -5
  39. data/app/controllers/decidim/static_map_controller.rb +1 -0
  40. data/app/forms/decidim/form.rb +1 -0
  41. data/app/forms/decidim/report_form.rb +1 -0
  42. data/app/helpers/decidim/action_authorization_helper.rb +1 -1
  43. data/app/helpers/decidim/application_helper.rb +1 -1
  44. data/app/helpers/decidim/aria_selected_link_to_helper.rb +1 -0
  45. data/app/helpers/decidim/attachments_helper.rb +1 -0
  46. data/app/helpers/decidim/authorization_form_helper.rb +1 -0
  47. data/app/helpers/decidim/cookies_helper.rb +1 -1
  48. data/app/helpers/decidim/decidim_form_helper.rb +1 -0
  49. data/app/helpers/decidim/feature_reference_helper.rb +1 -0
  50. data/app/helpers/decidim/filters_helper.rb +1 -0
  51. data/app/helpers/decidim/humanize_booleans_helper.rb +1 -0
  52. data/app/helpers/decidim/language_chooser_helper.rb +1 -0
  53. data/app/helpers/decidim/layout_helper.rb +1 -0
  54. data/app/helpers/decidim/localized_locales_helper.rb +1 -0
  55. data/app/helpers/decidim/map_helper.rb +1 -0
  56. data/app/helpers/decidim/menu_helper.rb +16 -0
  57. data/app/helpers/decidim/meta_tags_helper.rb +1 -0
  58. data/app/helpers/decidim/omniauth_helper.rb +1 -0
  59. data/app/helpers/decidim/orders_helper.rb +1 -0
  60. data/app/helpers/decidim/organization_scopes_helper.rb +1 -0
  61. data/app/helpers/decidim/paginate_helper.rb +1 -0
  62. data/app/helpers/decidim/participatory_process_helper.rb +1 -0
  63. data/app/helpers/decidim/participatory_process_steps_helper.rb +1 -0
  64. data/app/helpers/decidim/replace_buttons_helper.rb +1 -0
  65. data/app/helpers/decidim/resource_helper.rb +1 -0
  66. data/app/helpers/decidim/translations_helper.rb +1 -0
  67. data/app/helpers/decidim/user_profile_helper.rb +1 -0
  68. data/app/helpers/decidim/widget_urls_helper.rb +1 -0
  69. data/app/jobs/decidim/application_job.rb +1 -0
  70. data/app/jobs/decidim/export_job.rb +22 -0
  71. data/app/mailers/decidim/application_mailer.rb +1 -0
  72. data/app/mailers/decidim/decidim_devise_mailer.rb +2 -1
  73. data/app/mailers/decidim/export_mailer.rb +1 -0
  74. data/app/mailers/decidim/newsletter_mailer.rb +1 -0
  75. data/app/mailers/decidim/reported_mailer.rb +1 -0
  76. data/app/middleware/decidim/current_organization.rb +1 -0
  77. data/app/models/decidim/abilities/everyone.rb +1 -0
  78. data/app/models/decidim/ability.rb +1 -0
  79. data/app/models/decidim/application_record.rb +1 -0
  80. data/app/models/decidim/attachment.rb +1 -0
  81. data/app/models/decidim/authorization.rb +2 -1
  82. data/app/models/decidim/category.rb +4 -3
  83. data/app/models/decidim/component.rb +1 -0
  84. data/app/models/decidim/feature.rb +1 -0
  85. data/app/models/decidim/identity.rb +2 -2
  86. data/app/models/decidim/moderation.rb +2 -1
  87. data/app/models/decidim/newsletter.rb +2 -1
  88. data/app/models/decidim/organization.rb +7 -6
  89. data/app/models/decidim/participatory_process.rb +7 -20
  90. data/app/models/decidim/participatory_process_group.rb +3 -2
  91. data/app/models/decidim/participatory_process_step.rb +2 -1
  92. data/app/models/decidim/report.rb +3 -2
  93. data/app/models/decidim/resource_link.rb +1 -0
  94. data/app/models/decidim/scope.rb +2 -1
  95. data/app/models/decidim/static_page.rb +2 -1
  96. data/app/models/decidim/user.rb +6 -5
  97. data/app/models/decidim/user_group.rb +23 -7
  98. data/app/models/decidim/user_group_membership.rb +2 -2
  99. data/app/presenters/decidim/home_stats_presenter.rb +2 -1
  100. data/app/presenters/decidim/menu_item_presenter.rb +57 -0
  101. data/app/presenters/decidim/menu_presenter.rb +47 -0
  102. data/app/queries/decidim/highlighted_participatory_processes.rb +1 -0
  103. data/app/queries/decidim/organization_participatory_processes.rb +1 -0
  104. data/app/queries/decidim/organization_prioritized_participatory_processes.rb +18 -0
  105. data/app/queries/decidim/{public_participatory_processes.rb → prioritized_participatory_processes.rb} +4 -3
  106. data/app/queries/decidim/promoted_participatory_processes.rb +1 -0
  107. data/app/queries/decidim/stats_users_count.rb +1 -0
  108. data/app/services/decidim/action_authorizer.rb +1 -0
  109. data/app/services/decidim/authorization_handler.rb +1 -0
  110. data/app/services/decidim/resource_search.rb +1 -0
  111. data/app/services/decidim/static_map_generator.rb +1 -0
  112. data/app/uploaders/decidim/application_uploader.rb +1 -0
  113. data/app/uploaders/decidim/banner_image_uploader.rb +1 -0
  114. data/app/uploaders/decidim/hero_image_uploader.rb +1 -0
  115. data/app/uploaders/decidim/homepage_image_uploader.rb +1 -0
  116. data/app/uploaders/decidim/image_uploader.rb +1 -0
  117. data/app/uploaders/decidim/official_image_footer_uploader.rb +1 -0
  118. data/app/uploaders/decidim/official_image_header_uploader.rb +1 -0
  119. data/app/uploaders/decidim/organization_favicon_uploader.rb +1 -0
  120. data/app/uploaders/decidim/organization_logo_uploader.rb +1 -0
  121. data/app/validators/etiquette_validator.rb +3 -3
  122. data/app/validators/geocoding_validator.rb +1 -1
  123. data/app/views/decidim/own_user_groups/index.html.erb +8 -6
  124. data/app/views/decidim/participatory_processes/index.html.erb +1 -1
  125. data/app/views/decidim/shared/_orders.html.erb +4 -3
  126. data/app/views/layouts/decidim/_language_chooser.html.erb +1 -1
  127. data/app/views/layouts/decidim/_wrapper.html.erb +2 -2
  128. data/config/i18n-tasks.yml +5 -5
  129. data/config/initializers/devise.rb +1 -0
  130. data/config/initializers/foundation_rails_helper.rb +1 -0
  131. data/config/initializers/invisible_captcha.rb +1 -0
  132. data/config/initializers/mail_previews.rb +1 -0
  133. data/config/locales/ca.yml +3 -2
  134. data/config/locales/en.yml +3 -2
  135. data/config/locales/es.yml +4 -3
  136. data/config/locales/eu.yml +23 -1
  137. data/config/locales/fi.yml +0 -1
  138. data/config/locales/fr.yml +1 -2
  139. data/config/locales/nl.yml +0 -1
  140. data/config/routes.rb +1 -0
  141. data/db/migrate/20170529150743_add_rejected_at_to_user_groups.rb +5 -0
  142. data/db/seeds.rb +1 -0
  143. data/lib/decidim/attributes.rb +1 -0
  144. data/lib/decidim/attributes/time_with_zone.rb +1 -0
  145. data/lib/decidim/authorable.rb +1 -0
  146. data/lib/decidim/authorization_form_builder.rb +1 -0
  147. data/lib/decidim/core.rb +13 -0
  148. data/lib/decidim/core/api.rb +1 -0
  149. data/lib/decidim/core/api/author_interface.rb +1 -0
  150. data/lib/decidim/core/api/decidim_type.rb +1 -0
  151. data/lib/decidim/core/api/localized_string_type.rb +1 -0
  152. data/lib/decidim/core/api/process_step_type.rb +1 -0
  153. data/lib/decidim/core/api/process_type.rb +1 -0
  154. data/lib/decidim/core/api/session_type.rb +1 -0
  155. data/lib/decidim/core/api/translated_field_type.rb +1 -0
  156. data/lib/decidim/core/api/user_group_type.rb +1 -0
  157. data/lib/decidim/core/api/user_type.rb +1 -0
  158. data/lib/decidim/core/engine.rb +21 -1
  159. data/lib/decidim/core/test.rb +1 -0
  160. data/lib/decidim/core/test/factories.rb +9 -1
  161. data/lib/decidim/core/test/shared_examples/authorable.rb +1 -0
  162. data/lib/decidim/core/test/shared_examples/comments_examples.rb +1 -0
  163. data/lib/decidim/core/test/shared_examples/has_attachments.rb +1 -0
  164. data/lib/decidim/core/test/shared_examples/has_category.rb +1 -0
  165. data/lib/decidim/core/test/shared_examples/has_feature.rb +1 -0
  166. data/lib/decidim/core/test/shared_examples/has_reference.rb +1 -0
  167. data/lib/decidim/core/test/shared_examples/has_scope.rb +1 -0
  168. data/lib/decidim/core/test/shared_examples/localised_email.rb +1 -0
  169. data/lib/decidim/core/test/shared_examples/manage_moderations_examples.rb +1 -0
  170. data/lib/decidim/core/test/shared_examples/reportable.rb +1 -0
  171. data/lib/decidim/core/test/shared_examples/reports_examples.rb +1 -0
  172. data/lib/decidim/core/version.rb +2 -1
  173. data/lib/decidim/devise_failure_app.rb +0 -1
  174. data/lib/decidim/exporters.rb +2 -0
  175. data/lib/decidim/exporters/csv.rb +1 -0
  176. data/lib/decidim/exporters/export_data.rb +1 -0
  177. data/lib/decidim/exporters/exporter.rb +1 -0
  178. data/lib/decidim/exporters/json.rb +1 -0
  179. data/lib/decidim/exporters/serializer.rb +30 -0
  180. data/lib/decidim/faker/localized.rb +1 -0
  181. data/lib/decidim/feature_manifest.rb +37 -0
  182. data/lib/decidim/feature_validator.rb +1 -0
  183. data/lib/decidim/features.rb +1 -0
  184. data/lib/decidim/features/export_manifest.rb +52 -0
  185. data/lib/decidim/features/settings_manifest.rb +1 -0
  186. data/lib/decidim/file_zipper.rb +1 -0
  187. data/lib/decidim/filter_form_builder.rb +1 -0
  188. data/lib/decidim/form_builder.rb +2 -1
  189. data/lib/decidim/has_attachments.rb +4 -3
  190. data/lib/decidim/has_category.rb +2 -1
  191. data/lib/decidim/has_feature.rb +1 -0
  192. data/lib/decidim/has_reference.rb +1 -0
  193. data/lib/decidim/has_scope.rb +2 -1
  194. data/lib/decidim/i18n_exceptions.rb +1 -0
  195. data/lib/decidim/menu.rb +61 -0
  196. data/lib/decidim/menu_item.rb +31 -0
  197. data/lib/decidim/menu_registry.rb +65 -0
  198. data/lib/decidim/page_finder.rb +1 -0
  199. data/lib/decidim/query_extensions.rb +1 -0
  200. data/lib/decidim/reportable.rb +1 -0
  201. data/lib/decidim/resource_manifest.rb +1 -0
  202. data/lib/decidim/resourceable.rb +1 -0
  203. data/lib/decidim/stats_registry.rb +1 -0
  204. data/lib/decidim/translatable_attributes.rb +1 -0
  205. data/lib/devise/models/decidim_validatable.rb +2 -1
  206. data/lib/tasks/decidim_tasks.rake +1 -0
  207. data/lib/tasks/factory_girl.rake +1 -0
  208. metadata +33 -29
  209. data/app/services/decidim/public_processes.rb +0 -44
  210. data/app/views/layouts/decidim/_main_nav.html.erb +0 -11
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # A ParticipatoryProcess is composed of many steps that hold different
4
5
  # features that will show up in the depending on what step is currently
5
6
  # active.
6
7
  class ParticipatoryProcessStep < ApplicationRecord
7
- belongs_to :participatory_process, foreign_key: "decidim_participatory_process_id", class_name: Decidim::ParticipatoryProcess
8
+ belongs_to :participatory_process, foreign_key: "decidim_participatory_process_id", class_name: "Decidim::ParticipatoryProcess"
8
9
  has_one :organization, through: :participatory_process
9
10
 
10
11
  validates :start_date, date: { before: :end_date, allow_blank: true, if: proc { |obj| obj.end_date.present? } }
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # A reportable can be reported one time for each user.
4
5
  class Report < ApplicationRecord
5
6
  REASONS = %w(spam offensive does_not_belong).freeze
6
7
 
7
- belongs_to :moderation, foreign_key: "decidim_moderation_id", class_name: Decidim::Moderation
8
- belongs_to :user, foreign_key: "decidim_user_id", class_name: Decidim::User
8
+ belongs_to :moderation, foreign_key: "decidim_moderation_id", class_name: "Decidim::Moderation"
9
+ belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
9
10
 
10
11
  validates :moderation, :user, :reason, presence: true
11
12
  validates :user, uniqueness: { scope: :decidim_moderation_id }
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # A ResourceLink allows linking resources (other entities in Decidim) between
4
5
  # them without them having to know each other.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # Scopes are used in some entities through Decidim to help users know which is
4
5
  # the scope of a participatory process.
@@ -6,7 +7,7 @@ module Decidim
6
7
  class Scope < ApplicationRecord
7
8
  belongs_to :organization,
8
9
  foreign_key: "decidim_organization_id",
9
- class_name: Decidim::Organization,
10
+ class_name: "Decidim::Organization",
10
11
  inverse_of: :scopes
11
12
 
12
13
  validates :name, presence: true, uniqueness: { scope: :organization }
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # A page is used to add static content to the website, it can be useful so
4
5
  # organization can add their own terms and conditions, privacy policy or
@@ -7,7 +8,7 @@ module Decidim
7
8
  # Pages with a default slug cannot be destroyed and its slug cannot be
8
9
  # modified.
9
10
  class StaticPage < ApplicationRecord
10
- belongs_to :organization, foreign_key: "decidim_organization_id", class_name: Decidim::Organization, inverse_of: :static_pages
11
+ belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization", inverse_of: :static_pages
11
12
 
12
13
  validates :slug, :organization, presence: true
13
14
  validates :slug, uniqueness: { scope: :organization }
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_dependency "devise/models/decidim_validatable"
3
4
 
4
5
  module Decidim
@@ -11,11 +12,11 @@ module Decidim
11
12
  :omniauthable, omniauth_providers: [:facebook, :twitter, :google_oauth2],
12
13
  request_keys: [:env], reset_password_keys: [:decidim_organization_id, :email]
13
14
 
14
- belongs_to :organization, foreign_key: "decidim_organization_id", class_name: Decidim::Organization
15
- has_many :authorizations, foreign_key: "decidim_user_id", class_name: Decidim::Authorization, inverse_of: :user
16
- has_many :identities, foreign_key: "decidim_user_id", class_name: Decidim::Identity
17
- has_many :user_groups, through: :memberships, class_name: Decidim::UserGroup, foreign_key: :decidim_user_group_id
18
- has_many :memberships, class_name: Decidim::UserGroupMembership, foreign_key: :decidim_user_id
15
+ belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization"
16
+ has_many :authorizations, foreign_key: "decidim_user_id", class_name: "Decidim::Authorization", inverse_of: :user
17
+ has_many :identities, foreign_key: "decidim_user_id", class_name: "Decidim::Identity"
18
+ has_many :user_groups, through: :memberships, class_name: "Decidim::UserGroup", foreign_key: :decidim_user_group_id
19
+ has_many :memberships, class_name: "Decidim::UserGroupMembership", foreign_key: :decidim_user_id
19
20
 
20
21
  ROLES = %w(admin moderator collaborator official).freeze
21
22
 
@@ -3,25 +3,41 @@
3
3
  module Decidim
4
4
  # A UserGroup is an organization of citizens
5
5
  class UserGroup < ApplicationRecord
6
- has_many :users, through: :memberships, class_name: Decidim::User, foreign_key: :decidim_user_id
7
- has_many :memberships, class_name: Decidim::UserGroupMembership, foreign_key: :decidim_user_group_id
6
+ has_many :users, through: :memberships, class_name: "Decidim::User", foreign_key: :decidim_user_id
7
+ has_many :memberships, class_name: "Decidim::UserGroupMembership", foreign_key: :decidim_user_group_id
8
8
 
9
9
  validates :name, presence: true
10
10
  validates :document_number, presence: true
11
11
  validates :phone, presence: true
12
12
  validates :avatar, file_size: { less_than_or_equal_to: 5.megabytes }
13
+
14
+ validate :correct_state
15
+
13
16
  mount_uploader :avatar, Decidim::AvatarUploader
14
17
 
15
18
  scope :verified, -> { where.not(verified_at: nil) }
16
-
17
- # Public: Mark the user group as verified
18
- def verify!
19
- update_attribute(:verified_at, Time.current)
20
- end
19
+ scope :rejected, -> { where.not(rejected_at: nil) }
21
20
 
22
21
  # Public: Checks if the user group is verified.
23
22
  def verified?
24
23
  verified_at.present?
25
24
  end
25
+
26
+ # Public: Checks if the user group is rejected.
27
+ def rejected?
28
+ rejected_at.present?
29
+ end
30
+
31
+ # Public: Checks if the user group is pending.
32
+ def pending?
33
+ verified_at.blank? && rejected_at.blank?
34
+ end
35
+
36
+ private
37
+
38
+ # Private: Checks if the state user group is correct.
39
+ def correct_state
40
+ errors.add(:base, :invalid) if verified? && rejected?
41
+ end
26
42
  end
27
43
  end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # A UserGroupMembership associate user with user groups
5
5
  class UserGroupMembership < ApplicationRecord
6
- belongs_to :user, class_name: Decidim::User, foreign_key: :decidim_user_id
7
- belongs_to :user_group, class_name: Decidim::UserGroup, foreign_key: :decidim_user_group_id
6
+ belongs_to :user, class_name: "Decidim::User", foreign_key: :decidim_user_id
7
+ belongs_to :user_group, class_name: "Decidim::UserGroup", foreign_key: :decidim_user_group_id
8
8
  end
9
9
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # A presenter to render statistics in the homepage.
4
5
  class HomeStatsPresenter < Rectify::Presenter
@@ -62,7 +63,7 @@ module Decidim
62
63
  content_tag :div, "", class: "home-pam__data" do
63
64
  safe_join([
64
65
  content_tag(:h4, I18n.t(name, scope: "pages.home.statistics"), class: "home-pam__title"),
65
- content_tag(:span, " #{data}", class: "home-pam__number #{name}")
66
+ content_tag(:span, " #{number_with_delimiter(data)}", class: "home-pam__number #{name}")
66
67
  ])
67
68
  end
68
69
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A presenter to render menu items
5
+ class MenuItemPresenter
6
+ #
7
+ # Initializes a menu item for presentation
8
+ #
9
+ # @param menu_item [MenuItem] The menu item itself
10
+ # @param view [ActionView::Base] The view instance to help rendering the item
11
+ # @param options [Hash] The rendering options for the item
12
+ #
13
+ # @option options [String] :element_class
14
+ # The CSS class to be used for the item
15
+ #
16
+ # @option options [String] :active_class
17
+ # The CSS class to be used for the active item
18
+ #
19
+ def initialize(menu_item, view, options = {})
20
+ @menu_item = menu_item
21
+ @view = view
22
+ @element_class = options[:element_class]
23
+ @active_class = options[:active_class]
24
+ end
25
+
26
+ delegate :label, :url, :active, :icon_name, to: :@menu_item
27
+ delegate :content_tag, :link_to, :active_link_to_class, :is_active_link?, :icon, to: :@view
28
+
29
+ def render
30
+ content_tag :li, class: link_wrapper_classes do
31
+ if icon_name
32
+ link_to(url) { icon(icon_name) + label }
33
+ else
34
+ link_to label, url
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :element_class
42
+
43
+ def link_wrapper_classes
44
+ return element_class unless is_active_link?(url, active)
45
+
46
+ [element_class, active_class].compact.join(" ")
47
+ end
48
+
49
+ def active_class
50
+ active_link_to_class(
51
+ url,
52
+ active: active,
53
+ class_active: @active_class
54
+ )
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A presenter to render menus
5
+ class MenuPresenter
6
+ #
7
+ # Initializes a menu for presentation
8
+ #
9
+ # @param name [Symbol] The name of the menu registry to be rendered
10
+ # @param view [ActionView::Base] The view scope to render the menu
11
+ # @param options [Hash] The rendering options for the menu entries
12
+ #
13
+ def initialize(name, view, options = {})
14
+ @name = name
15
+ @view = view
16
+
17
+ @options = options
18
+ end
19
+
20
+ delegate :items, to: :evaluated_menu
21
+ delegate :content_tag, :safe_join, to: :@view
22
+
23
+ def evaluated_menu
24
+ @evaluated_menu ||= begin
25
+ menu = Menu.new(@name)
26
+ menu.build_for(@view)
27
+ menu
28
+ end
29
+ end
30
+
31
+ def render
32
+ content_tag :nav, class: "main-nav" do
33
+ content_tag :ul do
34
+ safe_join(menu_items)
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def menu_items
42
+ items.map do |menu_item|
43
+ MenuItemPresenter.new(menu_item, @view, @options).render
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This query adds some scopes so the processes are ready to be showed in a
4
5
  # public view.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This query class returns the visible Participatory Processes given an
4
5
  # Organization.
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This query class returns the public Participatory Processes given an
5
+ # Organization in a meaningful order.
6
+ class OrganizationPrioritizedParticipatoryProcesses < Rectify::Query
7
+ def initialize(organization)
8
+ @organization = organization
9
+ end
10
+
11
+ def query
12
+ Rectify::Query.merge(
13
+ OrganizationParticipatoryProcesses.new(@organization),
14
+ PrioritizedParticipatoryProcesses.new
15
+ ).query
16
+ end
17
+ end
18
+ end
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
- # This query adds some scopes so the processes are ready to be showed in a
4
- # public view.
5
- class PublicParticipatoryProcesses < Rectify::Query
4
+ # This query orders processes by importance, prioritizing promoted processes
5
+ # first, and closest to finalization date second.
6
+ class PrioritizedParticipatoryProcesses < Rectify::Query
6
7
  def query
7
8
  Decidim::ParticipatoryProcess.order("promoted DESC").includes(:active_step).order("decidim_participatory_process_steps.end_date ASC")
8
9
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This query filters processes so only promoted ones are returned.
4
5
  class PromotedParticipatoryProcesses < Rectify::Query
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This query counts registered users from a collection of organizations
4
5
  # in an optional interval of time.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class is used to authorize a user against an action in the context of a
4
5
  # feature.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This is the base class for authorization handlers, all implementations
4
5
  # should inherit from it.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This is the base class to be used by other search services.
4
5
  # Searchlight documentation: https://github.com/nathanl/searchlight
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "httparty"
3
4
 
4
5
  module Decidim
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading images to Decidim It is intended to just
4
5
  # hold the uploads configuration, so you should inherit from this class and
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading banner images to ParticipatoryProcesses.
4
5
  class BannerImageUploader < ImageUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading hero images to ParticipatoryProcesses.
4
5
  class HeroImageUploader < ImageUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading hero images to ParticipatoryProcesses.
4
5
  class HomepageImageUploader < ImageUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading hero images to ParticipatoryProcesses.
4
5
  class ImageUploader < ApplicationUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading hero images to ParticipatoryProcesses.
4
5
  class OfficialImageFooterUploader < ImageUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading hero images to ParticipatoryProcesses.
4
5
  class OfficialImageHeaderUploader < ImageUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading an organization's favicon.
4
5
  class OrganizationFaviconUploader < ImageUploader
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Decidim
3
4
  # This class deals with uploading the organization's logo.
4
5
  class OrganizationLogoUploader < ImageUploader
@@ -1,5 +1,5 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
2
+
3
3
  # This validator takes care of ensuring the validated content is
4
4
  # respectful, doesn't use caps, and overall is meaningful.
5
5
  class EtiquetteValidator < ActiveModel::EachValidator
@@ -16,7 +16,7 @@ class EtiquetteValidator < ActiveModel::EachValidator
16
16
  private
17
17
 
18
18
  def validate_caps(record, attribute, value)
19
- return if value.scan(/[A-Z]/).length < value.length / 3
19
+ return if value.scan(/[A-Z]/).length < value.length / 4
20
20
  record.errors.add(attribute, options[:message] || :too_much_caps)
21
21
  end
22
22
 
@@ -26,7 +26,7 @@ class EtiquetteValidator < ActiveModel::EachValidator
26
26
  end
27
27
 
28
28
  def validate_long_words(record, attribute, value)
29
- return if value.scan(/[A-z]{30,}/).empty?
29
+ return if value.scan(/[A-z]{35,}/).empty?
30
30
  record.errors.add(attribute, options[:message] || :long_words)
31
31
  end
32
32