decidim-core 0.4.3 → 0.4.4
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.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/decidim/modules/_card-grid.scss +2 -2
- data/app/assets/stylesheets/decidim/modules/_filters.scss +3 -3
- data/app/assets/stylesheets/decidim/modules/_main-container.scss +1 -5
- data/app/assets/stylesheets/decidim/modules/_process-nav.scss +1 -2
- data/app/constraints/decidim/current_participatory_process.rb +1 -1
- data/app/controllers/concerns/decidim/needs_authorization.rb +2 -3
- data/app/controllers/concerns/decidim/needs_participatory_process.rb +1 -1
- data/app/controllers/concerns/decidim/{feature_settings.rb → settings.rb} +1 -1
- data/app/controllers/decidim/features/base_controller.rb +1 -2
- data/app/controllers/decidim/pages_controller.rb +1 -1
- data/app/helpers/decidim/feature_path_helper.rb +1 -1
- data/{lib → app/models}/decidim/abilities/admin_ability.rb +1 -0
- data/app/models/decidim/abilities/base_ability.rb +34 -0
- data/{lib → app/models}/decidim/abilities/participatory_process_admin_ability.rb +4 -0
- data/{lib → app/models}/decidim/abilities/participatory_process_collaborator_ability.rb +4 -0
- data/{lib → app/models}/decidim/abilities/participatory_process_moderator_ability.rb +0 -0
- data/app/models/decidim/feature.rb +3 -78
- data/app/models/decidim/organization.rb +0 -2
- data/app/models/decidim/participatory_process.rb +2 -16
- data/app/models/decidim/participatory_process_group.rb +1 -2
- data/app/models/decidim/participatory_process_user_role.rb +9 -0
- data/app/models/decidim/user.rb +0 -7
- data/app/presenters/decidim/home_stats_presenter.rb +1 -1
- data/app/presenters/decidim/resource_locator_presenter.rb +57 -15
- data/app/queries/decidim/highlighted_participatory_processes.rb +1 -2
- data/app/queries/decidim/organization_participatory_process_groups.rb +14 -0
- data/app/queries/decidim/organization_participatory_processes.rb +2 -6
- data/app/queries/decidim/organization_prioritized_participatory_processes.rb +3 -3
- data/app/queries/decidim/organization_published_participatory_processes.rb +17 -0
- data/app/queries/decidim/participatory_processes_with_user_role.rb +1 -1
- data/app/queries/decidim/prioritized_participatory_processes.rb +1 -1
- data/app/queries/decidim/published_participatory_processes.rb +10 -0
- data/app/views/layouts/decidim/_process_header.html.erb +2 -2
- data/config/locales/ca.yml +19 -0
- data/config/locales/es.yml +19 -0
- data/config/locales/fr.yml +2 -2
- data/db/migrate/20170608142521_add_organization_to_user_groups.rb +16 -3
- data/db/seeds.rb +17 -12
- data/lib/decidim/abilities.rb +0 -4
- data/lib/decidim/abilities/participatory_process_role_ability.rb +4 -1
- data/lib/decidim/core.rb +20 -20
- data/lib/decidim/core/api/decidim_type.rb +1 -1
- data/lib/decidim/core/api/process_step_type.rb +2 -2
- data/lib/decidim/core/api/process_type.rb +1 -1
- data/lib/decidim/core/api/session_type.rb +1 -1
- data/lib/decidim/core/api/translated_field_type.rb +3 -3
- data/lib/decidim/core/test.rb +1 -0
- data/lib/decidim/core/test/factories.rb +21 -2
- data/lib/decidim/core/test/shared_examples/publicable.rb +27 -0
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/feature_manifest.rb +6 -6
- data/lib/decidim/form_builder.rb +1 -1
- data/lib/decidim/has_category.rb +1 -1
- data/lib/decidim/has_settings.rb +66 -0
- data/lib/decidim/manifest_registry.rb +45 -0
- data/lib/decidim/publicable.rb +49 -0
- data/lib/decidim/query_extensions.rb +1 -1
- data/lib/decidim/reportable.rb +3 -3
- data/lib/decidim/{features/settings_manifest.rb → settings_manifest.rb} +5 -5
- metadata +26 -33
- data/app/models/decidim/ability.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb2a449a263f71206457574b6624f360c107ca44
|
4
|
+
data.tar.gz: 3f6a5a14ea188fe87e6a19e421c254c385bbde79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df0da6dbd26020853ca158762a6a3cd787ef2a51fa6ed2b930ec90092170df0ed5ef7e1d65f9fe0bbbb62df978e160260cb91f81f30064f32ee7fcef34fffb32
|
7
|
+
data.tar.gz: 0a20c1fc7ca7669fcec1b0f6a544f5710817a208b0213b625ffc56cf95138fab5528b9f85480f660b9330a1d0cc8c4dd2fbe58ea107e982aec55dc04c5cd830d
|
@@ -3,7 +3,7 @@ $card-grid-margin-bottom: map-get($grid-column-gutter, medium);
|
|
3
3
|
.card-grid{
|
4
4
|
display: flex;
|
5
5
|
flex-wrap: wrap;
|
6
|
-
|
6
|
+
|
7
7
|
&:before{
|
8
8
|
width: 0; //fixes a flexbox bug in Safari with the clearfix element
|
9
9
|
}
|
@@ -18,7 +18,7 @@ $card-grid-margin-bottom: map-get($grid-column-gutter, medium);
|
|
18
18
|
flex-direction: column;
|
19
19
|
height: 100%;
|
20
20
|
}
|
21
|
-
|
21
|
+
|
22
22
|
.card__content{
|
23
23
|
flex-grow: 1;
|
24
24
|
}
|
@@ -70,12 +70,12 @@ $filters-padding-y: 1rem;
|
|
70
70
|
padding-bottom: $filters-padding-x*1.5;
|
71
71
|
border-bottom: none;
|
72
72
|
}
|
73
|
-
|
73
|
+
|
74
74
|
label{
|
75
75
|
line-height: 1.2;
|
76
76
|
margin-bottom: .4rem;
|
77
77
|
}
|
78
|
-
|
78
|
+
|
79
79
|
.button{
|
80
80
|
margin-bottom: 0;
|
81
81
|
}
|
@@ -93,4 +93,4 @@ $filters-padding-y: 1rem;
|
|
93
93
|
.input-group{
|
94
94
|
margin-bottom: 0;
|
95
95
|
}
|
96
|
-
}
|
96
|
+
}
|
@@ -29,7 +29,7 @@ module Decidim
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def detect_current_participatory_process(params)
|
32
|
-
@organization.
|
32
|
+
OrganizationParticipatoryProcesses.new(@organization).query.find_by_id(params["participatory_process_id"])
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -22,7 +22,7 @@ module Decidim
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def current_ability_klass
|
25
|
-
Decidim::
|
25
|
+
Decidim::Abilities::BaseAbility
|
26
26
|
end
|
27
27
|
|
28
28
|
def ability_context
|
@@ -30,8 +30,7 @@ module Decidim
|
|
30
30
|
current_settings: try(:current_settings),
|
31
31
|
feature_settings: try(:feature_settings),
|
32
32
|
current_organization: try(:current_organization),
|
33
|
-
current_feature: try(:current_feature)
|
34
|
-
current_participatory_process: try(:current_participatory_process)
|
33
|
+
current_feature: try(:current_feature)
|
35
34
|
}
|
36
35
|
end
|
37
36
|
|
@@ -39,7 +39,7 @@ module Decidim
|
|
39
39
|
|
40
40
|
def detect_participatory_process
|
41
41
|
request.env["current_participatory_process"] ||
|
42
|
-
current_organization.
|
42
|
+
OrganizationParticipatoryProcesses.new(current_organization).query.find(params[:participatory_process_id] || params[:id])
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -8,7 +8,7 @@ module Decidim
|
|
8
8
|
class BaseController < Decidim::ApplicationController
|
9
9
|
layout "layouts/decidim/participatory_process"
|
10
10
|
include NeedsParticipatoryProcess
|
11
|
-
include
|
11
|
+
include Settings
|
12
12
|
include ActionAuthorization
|
13
13
|
|
14
14
|
helper Decidim::FiltersHelper
|
@@ -47,7 +47,6 @@ module Decidim
|
|
47
47
|
def ability_context
|
48
48
|
super.merge(
|
49
49
|
current_manifest: current_manifest,
|
50
|
-
current_participatory_process: current_participatory_process,
|
51
50
|
current_settings: current_settings,
|
52
51
|
feature_settings: feature_settings
|
53
52
|
)
|
@@ -30,7 +30,7 @@ module Decidim
|
|
30
30
|
|
31
31
|
def highlighted_participatory_processes
|
32
32
|
@highlighted_participatory_processes ||=
|
33
|
-
|
33
|
+
OrganizationPublishedParticipatoryProcesses.new(current_organization) | HighlightedParticipatoryProcesses.new
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Abilities
|
5
|
+
# Defines the abilities for a User. Intended to be used with `cancancan`.
|
6
|
+
class BaseAbility
|
7
|
+
include CanCan::Ability
|
8
|
+
|
9
|
+
# Initializes the ability class for the given user. Automatically merges
|
10
|
+
# injected abilities fmor the configuration. In order to inject more
|
11
|
+
# abilities, add this code in the `engine.rb` file of your own engine, for
|
12
|
+
# example, inside an initializer:
|
13
|
+
#
|
14
|
+
# Decidim.configure do |config|
|
15
|
+
# config.abilities << Decidim::MyEngine::Abilities::MyAbility
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# Note that, in development, this will force you to restart the server
|
19
|
+
# every time you change things in your ability classes.
|
20
|
+
#
|
21
|
+
# user - the User that needs its abilities checked.
|
22
|
+
# context - a Hash with some context related to the current request.
|
23
|
+
def initialize(user, context = {})
|
24
|
+
Decidim.abilities.each do |ability|
|
25
|
+
merge ability.constantize.new(user, context)
|
26
|
+
end
|
27
|
+
|
28
|
+
can :manage, Authorization do |authorization|
|
29
|
+
authorization.user == user
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
File without changes
|
@@ -5,6 +5,9 @@ module Decidim
|
|
5
5
|
# defined via a FeatureManifest. It's meant to be able to provide a single
|
6
6
|
# feature that spans over several steps.
|
7
7
|
class Feature < ApplicationRecord
|
8
|
+
include HasSettings
|
9
|
+
include Publicable
|
10
|
+
|
8
11
|
belongs_to :participatory_process, foreign_key: "decidim_participatory_process_id"
|
9
12
|
has_one :organization, through: :participatory_process
|
10
13
|
has_many :categories, through: :participatory_process
|
@@ -12,31 +15,6 @@ module Decidim
|
|
12
15
|
|
13
16
|
default_scope { order(arel_table[:weight].asc) }
|
14
17
|
|
15
|
-
after_initialize :default_values
|
16
|
-
|
17
|
-
# Public: Filters the features that are published and, therefore, visible by
|
18
|
-
# the end user.
|
19
|
-
#
|
20
|
-
# Returns an ActiveRecord::Relation.
|
21
|
-
def self.published
|
22
|
-
where.not(published_at: nil)
|
23
|
-
end
|
24
|
-
|
25
|
-
# Public: Filters the features that are unpublished and, therefore, not visible
|
26
|
-
# by the end user.
|
27
|
-
#
|
28
|
-
# Returns an ActiveRecord::Relation.
|
29
|
-
def self.unpublished
|
30
|
-
where(published_at: nil)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Public: Finds out whether this feature is published.
|
34
|
-
#
|
35
|
-
# Returns true if published, false otherwise.
|
36
|
-
def published?
|
37
|
-
published_at.present?
|
38
|
-
end
|
39
|
-
|
40
18
|
# Public: Finds the manifest this feature is associated to.
|
41
19
|
#
|
42
20
|
# Returns a FeatureManifest.
|
@@ -53,62 +31,9 @@ module Decidim
|
|
53
31
|
self.manifest_name = manifest.name
|
54
32
|
end
|
55
33
|
|
56
|
-
def settings
|
57
|
-
settings_schema(:global).new(self[:settings]["global"])
|
58
|
-
end
|
59
|
-
|
60
|
-
def settings=(data)
|
61
|
-
self[:settings]["global"] = serialize_settings(settings_schema(:global), data)
|
62
|
-
end
|
63
|
-
|
64
|
-
def default_step_settings
|
65
|
-
settings_schema(:step).new(self[:settings]["default_step"])
|
66
|
-
end
|
67
|
-
|
68
|
-
def default_step_settings=(data)
|
69
|
-
self[:settings]["default_step"] = serialize_settings(settings_schema(:step), data)
|
70
|
-
end
|
71
|
-
|
72
|
-
def step_settings
|
73
|
-
participatory_process.steps.each_with_object({}) do |step, result|
|
74
|
-
result[step.id.to_s] = settings_schema(:step).new(self[:settings].dig("steps", step.id.to_s))
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def step_settings=(data)
|
79
|
-
self[:settings]["steps"] = data.each_with_object({}) do |(key, value), result|
|
80
|
-
result[key.to_s] = serialize_settings(settings_schema(:step), value)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def active_step_settings
|
85
|
-
active_step = participatory_process.active_step
|
86
|
-
return default_step_settings unless active_step
|
87
|
-
|
88
|
-
step_settings.fetch(active_step.id.to_s)
|
89
|
-
end
|
90
|
-
|
91
34
|
# Public: Returns the value of the registered primary stat.
|
92
35
|
def primary_stat
|
93
36
|
@primary_stat ||= manifest.stats.filter(primary: true).with_context([self]).map { |name, value| [name, value] }.first&.last
|
94
37
|
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
def serialize_settings(schema, value)
|
99
|
-
if value.respond_to?(:attributes)
|
100
|
-
value.attributes
|
101
|
-
else
|
102
|
-
schema.new(value)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def settings_schema(name)
|
107
|
-
manifest.settings(name.to_sym).schema
|
108
|
-
end
|
109
|
-
|
110
|
-
def default_values
|
111
|
-
self[:settings] ||= {}
|
112
|
-
end
|
113
38
|
end
|
114
39
|
end
|
@@ -7,8 +7,6 @@ module Decidim
|
|
7
7
|
class Organization < ApplicationRecord
|
8
8
|
SOCIAL_HANDLERS = [:twitter, :facebook, :instagram, :youtube, :github].freeze
|
9
9
|
|
10
|
-
has_many :participatory_process_groups, foreign_key: "decidim_organization_id", class_name: "Decidim::ParticipatoryProcessGroup", inverse_of: :organization
|
11
|
-
has_many :participatory_processes, foreign_key: "decidim_organization_id", class_name: "Decidim::ParticipatoryProcess", inverse_of: :organization
|
12
10
|
has_many :static_pages, foreign_key: "decidim_organization_id", class_name: "Decidim::StaticPage", inverse_of: :organization
|
13
11
|
has_many :scopes, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::Scope", inverse_of: :organization
|
14
12
|
has_many :admins, -> { where(admin: true) }, foreign_key: "decidim_organization_id", class_name: "Decidim::User"
|
@@ -8,11 +8,11 @@ module Decidim
|
|
8
8
|
# active.
|
9
9
|
class ParticipatoryProcess < ApplicationRecord
|
10
10
|
include Decidim::HasAttachments
|
11
|
+
include Decidim::Publicable
|
11
12
|
|
12
13
|
belongs_to :organization,
|
13
14
|
foreign_key: "decidim_organization_id",
|
14
|
-
class_name: "Decidim::Organization"
|
15
|
-
inverse_of: :participatory_processes
|
15
|
+
class_name: "Decidim::Organization"
|
16
16
|
belongs_to :participatory_process_group,
|
17
17
|
foreign_key: "decidim_participatory_process_group_id",
|
18
18
|
class_name: "Decidim::ParticipatoryProcessGroup",
|
@@ -50,13 +50,6 @@ module Decidim
|
|
50
50
|
mount_uploader :hero_image, Decidim::HeroImageUploader
|
51
51
|
mount_uploader :banner_image, Decidim::BannerImageUploader
|
52
52
|
|
53
|
-
# Scope to return only the published processes.
|
54
|
-
#
|
55
|
-
# Returns an ActiveRecord::Relation.
|
56
|
-
def self.published
|
57
|
-
where.not(published_at: nil)
|
58
|
-
end
|
59
|
-
|
60
53
|
# Scope to return only the promoted processes.
|
61
54
|
#
|
62
55
|
# Returns an ActiveRecord::Relation.
|
@@ -64,13 +57,6 @@ module Decidim
|
|
64
57
|
where(promoted: true)
|
65
58
|
end
|
66
59
|
|
67
|
-
# Checks whether the process has been published or not.
|
68
|
-
#
|
69
|
-
# Returns a boolean.
|
70
|
-
def published?
|
71
|
-
published_at.present?
|
72
|
-
end
|
73
|
-
|
74
60
|
def hashtag
|
75
61
|
attributes["hashtag"].to_s.delete("#")
|
76
62
|
end
|
@@ -8,8 +8,7 @@ module Decidim
|
|
8
8
|
inverse_of: :participatory_process_group
|
9
9
|
belongs_to :organization,
|
10
10
|
foreign_key: "decidim_organization_id",
|
11
|
-
class_name: "Decidim::Organization"
|
12
|
-
inverse_of: :participatory_process_groups
|
11
|
+
class_name: "Decidim::Organization"
|
13
12
|
|
14
13
|
mount_uploader :hero_image, Decidim::HeroImageUploader
|
15
14
|
end
|
@@ -9,5 +9,14 @@ module Decidim
|
|
9
9
|
|
10
10
|
ROLES = %w(admin collaborator moderator).freeze
|
11
11
|
validates :role, inclusion: { in: ROLES }, uniqueness: { scope: [:user, :participatory_process] }
|
12
|
+
validate :user_and_participatory_process_same_organization
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# Private: check if the process and the user have the same organization
|
17
|
+
def user_and_participatory_process_same_organization
|
18
|
+
return if !participatory_process || !user
|
19
|
+
errors.add(:participatory_process, :invalid) unless user.organization == participatory_process.organization
|
20
|
+
end
|
12
21
|
end
|
13
22
|
end
|
data/app/models/decidim/user.rb
CHANGED
@@ -33,13 +33,6 @@ module Decidim
|
|
33
33
|
# Returns a String.
|
34
34
|
attr_accessor :invitation_instructions
|
35
35
|
|
36
|
-
delegate :can?, to: :ability
|
37
|
-
|
38
|
-
# Gets the ability instance for the given user.
|
39
|
-
def ability
|
40
|
-
@ability ||= Ability.new(self)
|
41
|
-
end
|
42
|
-
|
43
36
|
# Public: returns the user's name or the default one
|
44
37
|
def name
|
45
38
|
super || I18n.t("decidim.anonymous_user")
|
@@ -75,7 +75,7 @@ module Decidim
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def published_features
|
78
|
-
@published_features ||= Feature.where(participatory_process: organization.
|
78
|
+
@published_features ||= Feature.where(participatory_process: OrganizationPublishedParticipatoryProcesses.new(organization).query).published
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|