decidim-proposals 0.6.8 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/commands/decidim/proposals/create_proposal.rb +12 -0
- data/app/commands/decidim/proposals/vote_proposal.rb +2 -0
- data/app/controllers/decidim/proposals/application_controller.rb +18 -0
- data/app/controllers/decidim/proposals/proposals_controller.rb +7 -1
- data/app/helpers/decidim/proposals/application_helper.rb +14 -0
- data/app/helpers/decidim/proposals/proposal_votes_helper.rb +45 -1
- data/app/models/decidim/proposals/proposal.rb +19 -0
- data/app/services/decidim/proposals/proposal_search.rb +1 -1
- data/app/views/decidim/proposals/admin/proposals/index.html.erb +11 -0
- data/app/views/decidim/proposals/proposals/_filters.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/_vote_button.html.erb +9 -7
- data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +35 -0
- data/app/views/decidim/proposals/proposals/index.html.erb +8 -4
- data/app/views/decidim/proposals/proposals/show.html.erb +11 -4
- data/config/locales/ca.yml +18 -6
- data/config/locales/en.yml +17 -5
- data/config/locales/es.yml +17 -5
- data/config/locales/eu.yml +28 -16
- data/config/locales/fi.yml +23 -11
- data/config/locales/fr.yml +21 -9
- data/config/locales/it.yml +17 -5
- data/config/locales/nl.yml +19 -7
- data/config/locales/pl.yml +17 -5
- data/config/locales/ru.yml +183 -0
- data/config/locales/uk.yml +36 -24
- data/lib/decidim/proposals/feature.rb +10 -8
- data/lib/decidim/proposals/test/factories.rb +29 -1
- data/lib/decidim/proposals/version.rb +10 -0
- metadata +25 -51
- data/app/views/decidim/proposals/proposals/_votes_limit.html.erb +0 -21
@@ -0,0 +1,183 @@
|
|
1
|
+
ru:
|
2
|
+
activemodel:
|
3
|
+
attributes:
|
4
|
+
proposal:
|
5
|
+
body: Основной текст
|
6
|
+
category_id: Категория
|
7
|
+
scope_id: Охват
|
8
|
+
title: Название
|
9
|
+
user_group_id: Внести предложение как
|
10
|
+
proposal_answer:
|
11
|
+
answer: Ответить
|
12
|
+
decidim:
|
13
|
+
features:
|
14
|
+
proposals:
|
15
|
+
actions:
|
16
|
+
create: Внести
|
17
|
+
vote: Голосовать
|
18
|
+
name: Предложения
|
19
|
+
settings:
|
20
|
+
global:
|
21
|
+
announcement: Объявление
|
22
|
+
attachments_allowed: Разрешить вложения
|
23
|
+
comments_enabled: Комментарии включены
|
24
|
+
geocoding_enabled: Геокодирование включено
|
25
|
+
maximum_votes_per_proposal: Максимальное количество голосов на одно предложение
|
26
|
+
new_proposal_help_text: Подсказки по созданию нового предложения
|
27
|
+
official_proposals_enabled: Включена возможность выдвигать официальные предложения
|
28
|
+
proposal_answering_enabled: Включена возможность отвечать на предложения
|
29
|
+
proposal_limit: Максимальное количество предложений на одного участника
|
30
|
+
vote_limit: Максимальное количество голосов для одного пользователя
|
31
|
+
step:
|
32
|
+
announcement: Объявление
|
33
|
+
comments_blocked: Комментарии выключены
|
34
|
+
creation_enabled: Включена возможность создания предложений
|
35
|
+
proposal_answering_enabled: Включена возможность отвечать на предложения
|
36
|
+
votes_blocked: Голосование выключено
|
37
|
+
votes_enabled: Голосование включено
|
38
|
+
votes_hidden: Голоса скрыты (если голосование включено, то при поставленной здесь птичке будет скрыто количество голосов)
|
39
|
+
proposals:
|
40
|
+
actions:
|
41
|
+
answer: Ответить
|
42
|
+
new: Новая
|
43
|
+
title: Действия
|
44
|
+
admin:
|
45
|
+
actions:
|
46
|
+
preview: Предпросмотр
|
47
|
+
exports:
|
48
|
+
comments: Комментарии
|
49
|
+
proposals: Предложения
|
50
|
+
models:
|
51
|
+
proposal:
|
52
|
+
name: Предложение
|
53
|
+
proposal_answers:
|
54
|
+
edit:
|
55
|
+
accepted: Принято
|
56
|
+
answer_proposal: Ответить
|
57
|
+
evaluating: Рассматривается
|
58
|
+
rejected: Отклонено
|
59
|
+
title: Ответ на предложение %{title}
|
60
|
+
proposals:
|
61
|
+
answer:
|
62
|
+
invalid: При попытке ответить на это предложение возникла проблема
|
63
|
+
success: Успешно дан ответ на предложение
|
64
|
+
create:
|
65
|
+
invalid: При попытке выдвинуть предложение возникла проблема
|
66
|
+
success: Предложение успешно внесено
|
67
|
+
form:
|
68
|
+
attachment_legend: "(Необязательно) Добавить вложение"
|
69
|
+
select_a_category: Выберите категорию
|
70
|
+
index:
|
71
|
+
title: Предложения
|
72
|
+
new:
|
73
|
+
create: Внести
|
74
|
+
title: Внести предложение
|
75
|
+
answers:
|
76
|
+
accepted: Принято
|
77
|
+
evaluating: Рассматривается
|
78
|
+
not_answered: Без ответов
|
79
|
+
rejected: Отклонено
|
80
|
+
create:
|
81
|
+
error: При сохранении этого предложения произошли ошибки.
|
82
|
+
success: Предложение успешно внесено.
|
83
|
+
models:
|
84
|
+
proposal:
|
85
|
+
fields:
|
86
|
+
category: Категория
|
87
|
+
id: Идентификатор
|
88
|
+
official_proposal: Официальное предложение
|
89
|
+
scope: Охват
|
90
|
+
state: Cостояние
|
91
|
+
title: Название
|
92
|
+
votes: Голоса
|
93
|
+
new:
|
94
|
+
limit_reached: Вы не можете вносить новые предложения, так как вы превысили лимит.
|
95
|
+
proposal_votes:
|
96
|
+
create:
|
97
|
+
error: При голосовании по этому предложению произошли ошибки.
|
98
|
+
proposals:
|
99
|
+
author:
|
100
|
+
deleted: Удаленный пользователь
|
101
|
+
verified_user_group: Проверенная организация
|
102
|
+
count:
|
103
|
+
proposals_count:
|
104
|
+
one: 1 предложение
|
105
|
+
few: "%{count} предложения"
|
106
|
+
many: "%{count} предложений"
|
107
|
+
other: "%{count} предложений"
|
108
|
+
filters:
|
109
|
+
accepted: Принято
|
110
|
+
activity: Деятельность
|
111
|
+
all: Все
|
112
|
+
category: Категория
|
113
|
+
category_prompt: Выберите категорию
|
114
|
+
citizens: Граждане
|
115
|
+
evaluating: Рассматривается
|
116
|
+
official: Официальный
|
117
|
+
origin: Источник
|
118
|
+
rejected: Отклонено
|
119
|
+
related_to: Связано с
|
120
|
+
scope_prompt: Выбрать охват
|
121
|
+
scopes: Охваты
|
122
|
+
search: Поиск
|
123
|
+
state: Cостояние
|
124
|
+
voted: Проголосованные
|
125
|
+
filters_small_view:
|
126
|
+
close_modal: Закрыть окошко
|
127
|
+
filter: Отобрать
|
128
|
+
filter_by: 'Отобрать по признаку:'
|
129
|
+
unfold: Развернуть
|
130
|
+
index:
|
131
|
+
new_proposal: Новое предложение
|
132
|
+
proposal_limit_reached: Достигнуто максимальное количество предложений
|
133
|
+
view_proposal: Просмотреть предложение
|
134
|
+
linked_proposals:
|
135
|
+
proposal_votes:
|
136
|
+
one: <span class="card--list__data__number">1</span> голос
|
137
|
+
few: <span class="card--list__data__number">%{count}</span> голоса
|
138
|
+
many: <span class="card--list__data__number">%{count}</span> голосов
|
139
|
+
other: <span class="card--list__data__number">%{count}</span> голосов
|
140
|
+
new:
|
141
|
+
attachment_legend: "(Необязательно) Добавить вложение"
|
142
|
+
back: Вернуться
|
143
|
+
select_a_category: Пожалуйста, выберите категорию
|
144
|
+
send: Отправить
|
145
|
+
title: Новое предложение
|
146
|
+
orders:
|
147
|
+
label: 'Упорядочить предложения по:'
|
148
|
+
most_voted: С наибольшим количеством голосов
|
149
|
+
random: Произвольно
|
150
|
+
recent: Недавние
|
151
|
+
proposal:
|
152
|
+
view_proposal: Просмотреть предложение
|
153
|
+
show:
|
154
|
+
proposal_accepted_reason: 'Это предложение было принято, поскольку:'
|
155
|
+
proposal_in_evaluation_reason: Это предложение сейчас рассматривается
|
156
|
+
proposal_rejected_reason: 'Это предложение было отклонено, поскольку:'
|
157
|
+
report: Пожаловаться
|
158
|
+
vote_button:
|
159
|
+
already_voted: Уже проголосовали
|
160
|
+
maximum_votes_reached: Достигнуто предельное количество голосов
|
161
|
+
no_votes_remaining: Больше не осталось голосов
|
162
|
+
vote: Голосовать
|
163
|
+
votes_blocked: Голосование отключено
|
164
|
+
votes_count:
|
165
|
+
count:
|
166
|
+
one: ГОЛОС
|
167
|
+
few: ГОЛОСА
|
168
|
+
many: ГОЛОСОВ
|
169
|
+
other: ГОЛОСА
|
170
|
+
voting_rules:
|
171
|
+
maximum_votes_per_proposal:
|
172
|
+
description: Каждое предложение может получить максимум %{limit} голосов.
|
173
|
+
proposal_limit:
|
174
|
+
description: Вы можете внести до %{limit} предложений.
|
175
|
+
title: 'Голосование регулируется следующими правилами:'
|
176
|
+
vote_limit:
|
177
|
+
description: Вы можете проголосовать до %{limit} предложений.
|
178
|
+
left: Осталось
|
179
|
+
votes: Голоса
|
180
|
+
resource_links:
|
181
|
+
included_proposals:
|
182
|
+
proposal_projects: 'Предложение представлено в проектах:'
|
183
|
+
proposal_results: 'Предложения, представленные в этих итогах:'
|
data/config/locales/uk.yml
CHANGED
@@ -6,14 +6,14 @@ uk:
|
|
6
6
|
category_id: Розділ
|
7
7
|
scope_id: Терен
|
8
8
|
title: Назва
|
9
|
-
user_group_id:
|
9
|
+
user_group_id: Внести пропозицію як
|
10
10
|
proposal_answer:
|
11
|
-
answer:
|
11
|
+
answer: Відповісти
|
12
12
|
decidim:
|
13
13
|
features:
|
14
14
|
proposals:
|
15
15
|
actions:
|
16
|
-
create:
|
16
|
+
create: Внести
|
17
17
|
vote: Голосувати
|
18
18
|
name: Пропозиції
|
19
19
|
settings:
|
@@ -22,21 +22,23 @@ uk:
|
|
22
22
|
attachments_allowed: Дозволити вкладення
|
23
23
|
comments_enabled: Коментарі ввімкнено
|
24
24
|
geocoding_enabled: Геокодування ввімкнено
|
25
|
+
maximum_votes_per_proposal: Максимальна кількість голосів на пропозицію
|
25
26
|
new_proposal_help_text: Підказки зі створення нової пропозиції
|
26
27
|
official_proposals_enabled: Офіційні пропозиції ввімкнені
|
27
28
|
proposal_answering_enabled: Ввімкнуто відповіді на пропозиції
|
28
|
-
|
29
|
+
proposal_limit: Максимальна кількість пропозицій на одного учасника
|
30
|
+
vote_limit: Максимальна кількість голосів для одного користувача
|
29
31
|
step:
|
30
32
|
announcement: Оголошення
|
31
|
-
comments_blocked: Коментарі
|
33
|
+
comments_blocked: Коментарі вимкнено
|
32
34
|
creation_enabled: Ввімкнено створення пропозицій
|
33
35
|
proposal_answering_enabled: Ввімкнуто відповіді на пропозиції
|
34
|
-
votes_blocked: Голосування
|
36
|
+
votes_blocked: Голосування вимкнене
|
35
37
|
votes_enabled: Голосування ввімкнене
|
36
38
|
votes_hidden: Голосування приховане (якщо голосування ввімкнене, то при галочці тут буде сховано кількість голосів)
|
37
39
|
proposals:
|
38
40
|
actions:
|
39
|
-
answer:
|
41
|
+
answer: Відповісти
|
40
42
|
new: Нова
|
41
43
|
title: Дії
|
42
44
|
admin:
|
@@ -51,33 +53,33 @@ uk:
|
|
51
53
|
proposal_answers:
|
52
54
|
edit:
|
53
55
|
accepted: Прийнято
|
54
|
-
answer_proposal:
|
56
|
+
answer_proposal: Відповісти
|
55
57
|
evaluating: Розглядається
|
56
58
|
rejected: Відхилено
|
57
59
|
title: Відповідь на пропозицію %{title}
|
58
60
|
proposals:
|
59
61
|
answer:
|
60
|
-
invalid: При
|
61
|
-
success:
|
62
|
+
invalid: При спробі відповісти на цю пропозицію виникла проблема
|
63
|
+
success: Успішно дано відповідь на пропозицію
|
62
64
|
create:
|
63
|
-
invalid: При
|
64
|
-
success: Пропозицію успішно
|
65
|
+
invalid: При спробі створити цю пропозицію виникла проблема
|
66
|
+
success: Пропозицію успішно внесено
|
65
67
|
form:
|
66
68
|
attachment_legend: "(Необов'язково) Додати вкладений файл"
|
67
69
|
select_a_category: Оберіть розділ
|
68
70
|
index:
|
69
71
|
title: Пропозиції
|
70
72
|
new:
|
71
|
-
create:
|
72
|
-
title:
|
73
|
+
create: Внести
|
74
|
+
title: Внести пропозицію
|
73
75
|
answers:
|
74
76
|
accepted: Прийнято
|
75
77
|
evaluating: Розглядається
|
76
|
-
not_answered:
|
78
|
+
not_answered: Без відповідей
|
77
79
|
rejected: Відхилено
|
78
80
|
create:
|
79
81
|
error: При збереженні цієї пропозиції сталися помилки.
|
80
|
-
success: Пропозицію успішно
|
82
|
+
success: Пропозицію успішно додано.
|
81
83
|
models:
|
82
84
|
proposal:
|
83
85
|
fields:
|
@@ -87,6 +89,9 @@ uk:
|
|
87
89
|
scope: Терен
|
88
90
|
state: Стан
|
89
91
|
title: Назва
|
92
|
+
votes: Голоси
|
93
|
+
new:
|
94
|
+
limit_reached: Ви не можете додавати нові пропозиції, оскільки ви перевищили ліміт.
|
90
95
|
proposal_votes:
|
91
96
|
create:
|
92
97
|
error: При голосуванні пропозиції сталися помилки.
|
@@ -106,7 +111,7 @@ uk:
|
|
106
111
|
all: Усі
|
107
112
|
category: Розділ
|
108
113
|
category_prompt: Оберіть розділ
|
109
|
-
|
114
|
+
citizens: Громадяни
|
110
115
|
evaluating: Розглядається
|
111
116
|
official: Офіційне
|
112
117
|
origin: Джерело
|
@@ -124,6 +129,7 @@ uk:
|
|
124
129
|
unfold: Розгорнути
|
125
130
|
index:
|
126
131
|
new_proposal: Нова пропозиція
|
132
|
+
proposal_limit_reached: Досягнуто максимальної дозволеної кількості пропозицій
|
127
133
|
view_proposal: Переглянути пропозицію
|
128
134
|
linked_proposals:
|
129
135
|
proposal_votes:
|
@@ -140,16 +146,18 @@ uk:
|
|
140
146
|
orders:
|
141
147
|
label: 'Впорядкувати пропозиції за:'
|
142
148
|
most_voted: Найбільш підтримані
|
143
|
-
random:
|
149
|
+
random: Довільно
|
144
150
|
recent: Нещодавні
|
145
151
|
proposal:
|
146
152
|
view_proposal: Переглянути пропозицію
|
147
153
|
show:
|
148
154
|
proposal_accepted_reason: 'Ця пропозиція була прийнята, тому що:'
|
155
|
+
proposal_in_evaluation_reason: Ця пропозиція розглядається
|
149
156
|
proposal_rejected_reason: 'Ця пропозиція була відхилена, оскільки:'
|
150
|
-
report:
|
157
|
+
report: Поскаржитись
|
151
158
|
vote_button:
|
152
159
|
already_voted: Вже проголосували
|
160
|
+
maximum_votes_reached: Використано всі голоси
|
153
161
|
no_votes_remaining: Не залишилось голосів
|
154
162
|
vote: Голосувати
|
155
163
|
votes_blocked: Голосування вимкнене
|
@@ -159,13 +167,17 @@ uk:
|
|
159
167
|
few: ГОЛОСИ
|
160
168
|
many: ГОЛОСІВ
|
161
169
|
other: ГОЛОСІВ
|
162
|
-
|
170
|
+
voting_rules:
|
171
|
+
maximum_votes_per_proposal:
|
172
|
+
description: Кожна пропозиція може отримати максимум %{limit} голосів.
|
173
|
+
proposal_limit:
|
174
|
+
description: Ви можете висунути до %{limit} пропозицій.
|
175
|
+
title: 'Голосування регулюється наступними правилами:'
|
163
176
|
vote_limit:
|
164
|
-
description: Ви
|
177
|
+
description: Ви можете проголосувати до %{limit} пропозицій.
|
165
178
|
left: Залишилось
|
166
|
-
title: У вас є %{limit} голосів для того, щоб їх розподілити
|
167
179
|
votes: Голоси
|
168
180
|
resource_links:
|
169
181
|
included_proposals:
|
170
|
-
proposal_projects: '
|
171
|
-
proposal_results: '
|
182
|
+
proposal_projects: 'Пропозиція є в таких проектах:'
|
183
|
+
proposal_results: 'Пропозиція є в таких підсумках:'
|
@@ -17,6 +17,8 @@ Decidim.register_feature(:proposals) do |feature|
|
|
17
17
|
|
18
18
|
feature.settings(:global) do |settings|
|
19
19
|
settings.attribute :vote_limit, type: :integer, default: 0
|
20
|
+
settings.attribute :proposal_limit, type: :integer, default: 0
|
21
|
+
settings.attribute :maximum_votes_per_proposal, type: :integer, default: 0
|
20
22
|
settings.attribute :proposal_answering_enabled, type: :boolean, default: true
|
21
23
|
settings.attribute :official_proposals_enabled, type: :boolean, default: true
|
22
24
|
settings.attribute :comments_enabled, type: :boolean, default: true
|
@@ -42,16 +44,16 @@ Decidim.register_feature(:proposals) do |feature|
|
|
42
44
|
end
|
43
45
|
|
44
46
|
feature.register_stat :proposals_count, primary: true, priority: Decidim::StatsRegistry::HIGH_PRIORITY do |features, start_at, end_at|
|
45
|
-
Decidim::Proposals::FilteredProposals.for(features, start_at, end_at).count
|
47
|
+
Decidim::Proposals::FilteredProposals.for(features, start_at, end_at).not_hidden.count
|
46
48
|
end
|
47
49
|
|
48
50
|
feature.register_stat :votes_count, priority: Decidim::StatsRegistry::MEDIUM_PRIORITY do |features, start_at, end_at|
|
49
|
-
proposals = Decidim::Proposals::FilteredProposals.for(features, start_at, end_at)
|
51
|
+
proposals = Decidim::Proposals::FilteredProposals.for(features, start_at, end_at).not_hidden
|
50
52
|
Decidim::Proposals::ProposalVote.where(proposal: proposals).count
|
51
53
|
end
|
52
54
|
|
53
55
|
feature.register_stat :comments_count, tag: :comments do |features, start_at, end_at|
|
54
|
-
proposals = Decidim::Proposals::FilteredProposals.for(features, start_at, end_at)
|
56
|
+
proposals = Decidim::Proposals::FilteredProposals.for(features, start_at, end_at).not_hidden
|
55
57
|
Decidim::Comments::Comment.where(root_commentable: proposals).count
|
56
58
|
end
|
57
59
|
|
@@ -101,14 +103,14 @@ Decidim.register_feature(:proposals) do |feature|
|
|
101
103
|
global = nil
|
102
104
|
end
|
103
105
|
|
104
|
-
|
106
|
+
5.times do |n|
|
105
107
|
author = Decidim::User.where(organization: feature.organization).all.sample
|
106
108
|
user_group = [true, false].sample ? author.user_groups.verified.sample : nil
|
107
|
-
state, answer = if n >
|
109
|
+
state, answer = if n > 3
|
108
110
|
["accepted", Decidim::Faker::Localized.sentence(10)]
|
109
|
-
elsif n >
|
111
|
+
elsif n > 2
|
110
112
|
["rejected", nil]
|
111
|
-
elsif n >
|
113
|
+
elsif n > 1
|
112
114
|
["evaluating", nil]
|
113
115
|
else
|
114
116
|
[nil, nil]
|
@@ -127,7 +129,7 @@ Decidim.register_feature(:proposals) do |feature|
|
|
127
129
|
answered_at: Time.current
|
128
130
|
)
|
129
131
|
|
130
|
-
|
132
|
+
(n % 3).times do |m|
|
131
133
|
email = "vote-author-#{participatory_space.underscored_name}-#{participatory_space.id}-#{n}-#{m}@example.org"
|
132
134
|
name = "#{Faker::Name.name} #{participatory_space.id} #{n} #{m}"
|
133
135
|
|
@@ -34,6 +34,18 @@ FactoryGirl.define do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
trait :with_proposal_limit do
|
38
|
+
transient do
|
39
|
+
proposal_limit 1
|
40
|
+
end
|
41
|
+
|
42
|
+
settings do
|
43
|
+
{
|
44
|
+
proposal_limit: proposal_limit
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
37
49
|
trait :with_votes_blocked do
|
38
50
|
step_settings do
|
39
51
|
{
|
@@ -68,6 +80,14 @@ FactoryGirl.define do
|
|
68
80
|
}
|
69
81
|
end
|
70
82
|
end
|
83
|
+
|
84
|
+
trait :with_maximum_votes_per_proposal do
|
85
|
+
settings do
|
86
|
+
{
|
87
|
+
maximum_votes_per_proposal: 1
|
88
|
+
}
|
89
|
+
end
|
90
|
+
end
|
71
91
|
end
|
72
92
|
|
73
93
|
factory :proposal, class: Decidim::Proposals::Proposal do
|
@@ -82,6 +102,11 @@ FactoryGirl.define do
|
|
82
102
|
author nil
|
83
103
|
end
|
84
104
|
|
105
|
+
trait :evaluating do
|
106
|
+
state "evaluating"
|
107
|
+
answered_at { Time.current }
|
108
|
+
end
|
109
|
+
|
85
110
|
trait :accepted do
|
86
111
|
state "accepted"
|
87
112
|
answered_at { Time.current }
|
@@ -89,9 +114,12 @@ FactoryGirl.define do
|
|
89
114
|
|
90
115
|
trait :rejected do
|
91
116
|
state "rejected"
|
92
|
-
answer { Decidim::Faker::Localized.sentence }
|
93
117
|
answered_at { Time.current }
|
94
118
|
end
|
119
|
+
|
120
|
+
trait :with_answer do
|
121
|
+
answer { Decidim::Faker::Localized.sentence }
|
122
|
+
end
|
95
123
|
end
|
96
124
|
|
97
125
|
factory :proposal_vote, class: Decidim::Proposals::ProposalVote do
|