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