decidim-core 0.9.2 → 0.9.3
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/commands/decidim/invite_user.rb +1 -0
- data/app/helpers/decidim/translations_helper.rb +1 -16
- data/app/mailers/decidim/notification_mailer.rb +2 -0
- data/app/models/decidim/user.rb +1 -1
- data/app/views/decidim/notifications/_notification.html.erb +18 -16
- data/db/migrate/20180221101934_fix_nickname_index.rb +22 -0
- data/lib/decidim/content_parsers/base_parser.rb +7 -2
- data/lib/decidim/content_parsers/user_parser.rb +5 -4
- data/lib/decidim/content_processor.rb +6 -3
- data/lib/decidim/core/test/shared_examples/simple_event.rb +3 -1
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/events/author_event.rb +5 -4
- data/lib/decidim/events/base_event.rb +9 -1
- data/lib/decidim/events/simple_event.rb +5 -0
- data/lib/decidim/form_builder.rb +5 -4
- data/lib/decidim/nicknamizable.rb +1 -1
- data/lib/decidim/translatable_attributes.rb +24 -0
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb155e8d59a117cddb772f80d367de9d7abe021ea6d37af2f8d6b080a7f94bf8
|
4
|
+
data.tar.gz: a429cb952493c92af576ab9253dbc66884c87cbc1de2f2d4a743d5006828a027
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fb306e7dcee5e6124143546150283368face417e8774244cf7893d72900316fb98a7cde6a3c66adb951eea4ae49581963a9ef79c2ebcadb534f26c9a594d01b
|
7
|
+
data.tar.gz: '041917204f85f7af4d8d0269934a23c06ee19a3223b26295eafb8213f22eebd44cd5bedce0df6148fe9eed59c4403dc70b78ede416531476b81af830c351bf96'
|
@@ -41,6 +41,7 @@ module Decidim
|
|
41
41
|
@user = Decidim::User.new(
|
42
42
|
name: form.name,
|
43
43
|
email: form.email.downcase,
|
44
|
+
nickname: User.nicknamize(form.name),
|
44
45
|
organization: form.organization,
|
45
46
|
admin: form.role == "admin",
|
46
47
|
roles: form.role == "admin" ? [] : [form.role].compact
|
@@ -3,22 +3,7 @@
|
|
3
3
|
module Decidim
|
4
4
|
# Helper that provides convenient methods to deal with translated attributes.
|
5
5
|
module TranslationsHelper
|
6
|
-
|
7
|
-
# if available. Checks for the organization default locale as fallback.
|
8
|
-
#
|
9
|
-
# attribute - A Hash where keys (strings) are locales, and their values are
|
10
|
-
# the translation for each locale.
|
11
|
-
#
|
12
|
-
# Returns a String with the translation.
|
13
|
-
def translated_attribute(attribute)
|
14
|
-
return "" if attribute.nil?
|
15
|
-
return attribute unless attribute.is_a?(Hash)
|
16
|
-
|
17
|
-
attribute[I18n.locale.to_s].presence ||
|
18
|
-
attribute[current_organization.default_locale].presence ||
|
19
|
-
attribute[attribute.keys.first].presence ||
|
20
|
-
""
|
21
|
-
end
|
6
|
+
include Decidim::TranslatableAttributes
|
22
7
|
|
23
8
|
# Public: Creates a translation for each available language in the list
|
24
9
|
# given a translation key.
|
data/app/models/decidim/user.rb
CHANGED
@@ -28,7 +28,7 @@ module Decidim
|
|
28
28
|
validates :locale, inclusion: { in: :available_locales }, allow_blank: true
|
29
29
|
validates :tos_agreement, acceptance: true, allow_nil: false, on: :create
|
30
30
|
validates :avatar, file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_avatar_size } }
|
31
|
-
validates :email, :nickname, uniqueness: { scope: :organization }, unless: -> { deleted? || managed? }
|
31
|
+
validates :email, :nickname, uniqueness: { scope: :organization }, unless: -> { deleted? || managed? || nickname.blank? }
|
32
32
|
validates :email, 'valid_email_2/email': { disposable: true }
|
33
33
|
|
34
34
|
validate :all_roles_are_valid
|
@@ -1,18 +1,20 @@
|
|
1
|
-
|
2
|
-
<div class="card--
|
3
|
-
|
4
|
-
<%=
|
5
|
-
|
6
|
-
|
7
|
-
<
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
<% if notification.resource %>
|
2
|
+
<div class="card--list__item">
|
3
|
+
<div class="card--list__text">
|
4
|
+
<%= link_to notification.event_class_instance.resource_path do %>
|
5
|
+
<%= resource_icon notification.resource, class: "icon--chat card--list__icon" %>
|
6
|
+
<% end %>
|
7
|
+
<div>
|
8
|
+
<h5 class="card--list__heading">
|
9
|
+
<%= notification.event_class_instance.notification_title %>
|
10
|
+
</h5>
|
11
|
+
<span class="text-small"><%= l notification.created_at.to_date, format: :long %></span>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div class="card--list__data">
|
15
|
+
<%= link_to notification, class: "mark-as-read-button card--list__data__icon", remote: true, method: :delete do %>
|
16
|
+
<%= icon "check", class: "icon icon--chevron-right" %>
|
17
|
+
<% end %>
|
11
18
|
</div>
|
12
19
|
</div>
|
13
|
-
|
14
|
-
<%= link_to notification, class: "mark-as-read-button card--list__data__icon", remote: true, method: :delete do %>
|
15
|
-
<%= icon "check", class: "icon icon--chevron-right" %>
|
16
|
-
<% end %>
|
17
|
-
</div>
|
18
|
-
</div>
|
20
|
+
<% end %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class FixNicknameIndex < ActiveRecord::Migration[5.1]
|
4
|
+
class User < ApplicationRecord
|
5
|
+
self.table_name = :decidim_users
|
6
|
+
end
|
7
|
+
|
8
|
+
def change
|
9
|
+
Decidim::User.where(nickname: nil)
|
10
|
+
.where(deleted_at: nil)
|
11
|
+
.where(managed: false)
|
12
|
+
.find_each { |u| u.update_attributes(nickname: Decidim::User.nicknamize(u.name)) }
|
13
|
+
|
14
|
+
# rubocop:disable Rails/SkipsModelValidations
|
15
|
+
Decidim::User.where(nickname: nil)
|
16
|
+
.update_all("nickname = ''")
|
17
|
+
# rubocop:enable Rails/SkipsModelValidations
|
18
|
+
|
19
|
+
change_column_default :decidim_users, :nickname, ""
|
20
|
+
change_column_null(:decidim_users, :nickname, false)
|
21
|
+
end
|
22
|
+
end
|
@@ -5,7 +5,7 @@ module Decidim
|
|
5
5
|
# Abstract base class for content parsers, so they have the same contract
|
6
6
|
#
|
7
7
|
# @example How to use a content parser class
|
8
|
-
# parser = Decidim::ContentParsers::CustomParser.new(content)
|
8
|
+
# parser = Decidim::ContentParsers::CustomParser.new(content, context)
|
9
9
|
# parser.rewrite # returns the content rewritten
|
10
10
|
# parser.metadata # returns a Metadata object
|
11
11
|
#
|
@@ -17,11 +17,16 @@ module Decidim
|
|
17
17
|
# @return [String] the content to be rewritten
|
18
18
|
attr_reader :content
|
19
19
|
|
20
|
+
# @return [Hash] with context information
|
21
|
+
attr_reader :context
|
22
|
+
|
20
23
|
# Gets initialized with the `content` to parse
|
21
24
|
#
|
22
25
|
# @param content [String] already rewritten content or regular content
|
23
|
-
|
26
|
+
# @param context [Hash] arbitrary information to have a context
|
27
|
+
def initialize(content, context)
|
24
28
|
@content = content || ""
|
29
|
+
@context = context
|
25
30
|
end
|
26
31
|
|
27
32
|
# Parse the `content` and return it modified
|
@@ -21,13 +21,14 @@ module Decidim
|
|
21
21
|
MENTION_REGEX = /(^|\s)@([a-zA-Z0-9]\w*)/
|
22
22
|
|
23
23
|
# Replaces found mentions matching a nickname of an existing
|
24
|
-
# user with a global id. Other
|
25
|
-
# match an existing user are
|
24
|
+
# user in the current organization with a global id. Other
|
25
|
+
# mentions found that doesn't match an existing user are
|
26
|
+
# returned as is.
|
26
27
|
#
|
27
28
|
# @return [String] the content with the valid mentions replaced by a global id
|
28
29
|
def rewrite
|
29
30
|
content.gsub(MENTION_REGEX) do |match|
|
30
|
-
if (user = Decidim::User.
|
31
|
+
if (user = Decidim::User.where(nickname: Regexp.last_match[2], organization: context[:current_organization]).first)
|
31
32
|
Regexp.last_match[1] + user.to_global_id.to_s
|
32
33
|
else
|
33
34
|
match
|
@@ -38,7 +39,7 @@ module Decidim
|
|
38
39
|
# (see BaseParser#metadata)
|
39
40
|
def metadata
|
40
41
|
Metadata.new(
|
41
|
-
Decidim::User.where(nickname: content.scan(MENTION_REGEX).flatten)
|
42
|
+
Decidim::User.where(nickname: content.scan(MENTION_REGEX).flatten, organization: context[:current_organization])
|
42
43
|
)
|
43
44
|
end
|
44
45
|
end
|
@@ -22,7 +22,7 @@ module Decidim
|
|
22
22
|
# declare the other side making it "transparent" (declaring the class and leaving it empty).
|
23
23
|
#
|
24
24
|
# @example How to parse a content
|
25
|
-
# parsed = Decidim::ContentProcessor.parse(content)
|
25
|
+
# parsed = Decidim::ContentProcessor.parse(content, context)
|
26
26
|
# parsed.rewrite # contains rewritten content
|
27
27
|
# parsed.metadata # contains the merged metadata of all parsers
|
28
28
|
#
|
@@ -42,10 +42,13 @@ module Decidim
|
|
42
42
|
# This calls all registered processors one after the other and collects the
|
43
43
|
# metadata for each one and the resulting modified content
|
44
44
|
#
|
45
|
+
# @param content [String] already rewritten content or regular content
|
46
|
+
# @param context [Hash] with information to inject to the parsers as context
|
47
|
+
#
|
45
48
|
# @return [Result] a Result object with the content rewritten and the metadata
|
46
|
-
def self.parse(content)
|
49
|
+
def self.parse(content, context)
|
47
50
|
parsed = Decidim.content_processors.each_with_object(rewrite: content, metadata: {}) do |type, result|
|
48
|
-
parser = parser_klass(type).constantize.new(result[:rewrite])
|
51
|
+
parser = parser_klass(type).constantize.new(result[:rewrite], context)
|
49
52
|
result[:rewrite] = parser.rewrite
|
50
53
|
result[:metadata][type] = parser.metadata
|
51
54
|
end
|
@@ -24,11 +24,13 @@ shared_context "simple event" do
|
|
24
24
|
let(:resource_path) { resource_locator(resource).path }
|
25
25
|
let(:resource_url) { resource_locator(resource).url }
|
26
26
|
let(:resource_title) { resource.title["en"] }
|
27
|
+
let(:participatory_space) { resource.participatory_space }
|
28
|
+
let(:participatory_space_title) { participatory_space.title["en"] }
|
27
29
|
let(:author) { resource.author }
|
28
30
|
let(:author_presenter) { Decidim::UserPresenter.new(author) }
|
29
31
|
end
|
30
32
|
|
31
|
-
shared_examples_for "
|
33
|
+
shared_examples_for "a simple event" do
|
32
34
|
describe "types" do
|
33
35
|
subject { described_class }
|
34
36
|
|
data/lib/decidim/core/version.rb
CHANGED
@@ -13,22 +13,23 @@ module Decidim
|
|
13
13
|
i18n_attributes :author_name, :author_nickname, :author_path, :author_url
|
14
14
|
|
15
15
|
def author_nickname
|
16
|
-
author_presenter.
|
16
|
+
author_presenter&.nickname.to_s
|
17
17
|
end
|
18
18
|
|
19
19
|
def author_name
|
20
|
-
author_presenter.
|
20
|
+
author_presenter&.name.to_s
|
21
21
|
end
|
22
22
|
|
23
23
|
def author_path
|
24
|
-
author_presenter.
|
24
|
+
author_presenter&.profile_path.to_s
|
25
25
|
end
|
26
26
|
|
27
27
|
def author_url
|
28
|
-
author_presenter.
|
28
|
+
author_presenter&.profile_url.to_s
|
29
29
|
end
|
30
30
|
|
31
31
|
def author_presenter
|
32
|
+
return unless author
|
32
33
|
@author ||= Decidim::UserPresenter.new(author)
|
33
34
|
end
|
34
35
|
|
@@ -6,6 +6,8 @@ module Decidim
|
|
6
6
|
# add more logic to a `Decidim::Notification` and are used to render them in the
|
7
7
|
# notifications dashboard and to generate other notifications (emails, for example).
|
8
8
|
class BaseEvent
|
9
|
+
include Decidim::TranslatableAttributes
|
10
|
+
|
9
11
|
class_attribute :types
|
10
12
|
self.types = []
|
11
13
|
|
@@ -88,7 +90,13 @@ module Decidim
|
|
88
90
|
end
|
89
91
|
|
90
92
|
def resource_title
|
91
|
-
|
93
|
+
return unless resource
|
94
|
+
|
95
|
+
if resource.respond_to?(:title)
|
96
|
+
translated_attribute(resource.title)
|
97
|
+
elsif resource.respond_to?(:name)
|
98
|
+
translated_attribute(resource.name)
|
99
|
+
end
|
92
100
|
end
|
93
101
|
end
|
94
102
|
end
|
@@ -71,9 +71,14 @@ module Decidim
|
|
71
71
|
resource_path: resource_path,
|
72
72
|
resource_title: resource_title,
|
73
73
|
resource_url: resource_url,
|
74
|
+
participatory_space_title: participatory_space_title,
|
74
75
|
scope: i18n_scope
|
75
76
|
}
|
76
77
|
end
|
78
|
+
|
79
|
+
def participatory_space_title
|
80
|
+
translated_attribute(participatory_space.try(:title))
|
81
|
+
end
|
77
82
|
end
|
78
83
|
end
|
79
84
|
end
|
data/lib/decidim/form_builder.rb
CHANGED
@@ -7,6 +7,7 @@ module Decidim
|
|
7
7
|
# following the conventions set on `Decidim::TranslatableAttributes`.
|
8
8
|
class FormBuilder < FoundationRailsHelper::FormBuilder
|
9
9
|
include ActionView::Context
|
10
|
+
include Decidim::TranslatableAttributes
|
10
11
|
|
11
12
|
# Public: generates a check boxes input from a collection and adds help
|
12
13
|
# text and errors.
|
@@ -436,18 +437,18 @@ module Decidim
|
|
436
437
|
|
437
438
|
def categories_for_select(scope)
|
438
439
|
sorted_main_categories = scope.first_class.includes(:subcategories).sort_by do |category|
|
439
|
-
category.name
|
440
|
+
translated_attribute(category.name, category.participatory_space.organization)
|
440
441
|
end
|
441
442
|
|
442
443
|
sorted_main_categories.flat_map do |category|
|
443
|
-
parent = [[category.name
|
444
|
+
parent = [[translated_attribute(category.name, category.participatory_space.organization), category.id]]
|
444
445
|
|
445
446
|
sorted_subcategories = category.subcategories.sort_by do |subcategory|
|
446
|
-
subcategory.name
|
447
|
+
translated_attribute(subcategory.name, subcategory.participatory_space.organization)
|
447
448
|
end
|
448
449
|
|
449
450
|
sorted_subcategories.each do |subcategory|
|
450
|
-
parent << ["- #{subcategory.name
|
451
|
+
parent << ["- #{translated_attribute(subcategory.name, subcategory.participatory_space.organization)}", subcategory.id]
|
451
452
|
end
|
452
453
|
|
453
454
|
parent
|
@@ -49,6 +49,30 @@ module Decidim
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
included do
|
53
|
+
# Public: Returns the translation of an attribute using the current locale,
|
54
|
+
# if available. Checks for the organization default locale as fallback.
|
55
|
+
#
|
56
|
+
# attribute - A Hash where keys (strings) are locales, and their values are
|
57
|
+
# the translation for each locale.
|
58
|
+
#
|
59
|
+
# organization - An optional Organization to get the default locale from.
|
60
|
+
#
|
61
|
+
# Returns a String with the translation.
|
62
|
+
def translated_attribute(attribute, organization = nil)
|
63
|
+
return "" if attribute.nil?
|
64
|
+
return attribute unless attribute.is_a?(Hash)
|
65
|
+
|
66
|
+
organization ||= try(:current_organization)
|
67
|
+
organization_locale = organization.try(:default_locale)
|
68
|
+
|
69
|
+
attribute[I18n.locale.to_s].presence ||
|
70
|
+
attribute[organization_locale].presence ||
|
71
|
+
attribute[attribute.keys.first].presence ||
|
72
|
+
""
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
52
76
|
private
|
53
77
|
|
54
78
|
def translatable_attribute_setter(name, locale, value)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decidim-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josep Jaume Rey Peroy
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2018-02-
|
13
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: active_link_to
|
@@ -506,28 +506,28 @@ dependencies:
|
|
506
506
|
requirements:
|
507
507
|
- - '='
|
508
508
|
- !ruby/object:Gem::Version
|
509
|
-
version: 0.9.
|
509
|
+
version: 0.9.3
|
510
510
|
type: :runtime
|
511
511
|
prerelease: false
|
512
512
|
version_requirements: !ruby/object:Gem::Requirement
|
513
513
|
requirements:
|
514
514
|
- - '='
|
515
515
|
- !ruby/object:Gem::Version
|
516
|
-
version: 0.9.
|
516
|
+
version: 0.9.3
|
517
517
|
- !ruby/object:Gem::Dependency
|
518
518
|
name: decidim-dev
|
519
519
|
requirement: !ruby/object:Gem::Requirement
|
520
520
|
requirements:
|
521
521
|
- - '='
|
522
522
|
- !ruby/object:Gem::Version
|
523
|
-
version: 0.9.
|
523
|
+
version: 0.9.3
|
524
524
|
type: :development
|
525
525
|
prerelease: false
|
526
526
|
version_requirements: !ruby/object:Gem::Requirement
|
527
527
|
requirements:
|
528
528
|
- - '='
|
529
529
|
- !ruby/object:Gem::Version
|
530
|
-
version: 0.9.
|
530
|
+
version: 0.9.3
|
531
531
|
description: Adds core features so other engines can hook into the framework.
|
532
532
|
email:
|
533
533
|
- josepjaume@gmail.com
|
@@ -1048,6 +1048,7 @@ files:
|
|
1048
1048
|
- db/migrate/20180123125432_add_omnipresent_banner_short_description_to_decidim_organizations.rb
|
1049
1049
|
- db/migrate/20180123125452_add_omnipresent_banner_url_to_decidim_organizations.rb
|
1050
1050
|
- db/migrate/20180125063433_add_highlighted_content_banner_to_decidim_organizations.rb
|
1051
|
+
- db/migrate/20180221101934_fix_nickname_index.rb
|
1051
1052
|
- db/seeds.rb
|
1052
1053
|
- db/seeds/homepage_image.jpg
|
1053
1054
|
- lib/decidim/abilities.rb
|