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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/proposals/create_proposal.rb +12 -0
  3. data/app/commands/decidim/proposals/vote_proposal.rb +2 -0
  4. data/app/controllers/decidim/proposals/application_controller.rb +18 -0
  5. data/app/controllers/decidim/proposals/proposals_controller.rb +7 -1
  6. data/app/helpers/decidim/proposals/application_helper.rb +14 -0
  7. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +45 -1
  8. data/app/models/decidim/proposals/proposal.rb +19 -0
  9. data/app/services/decidim/proposals/proposal_search.rb +1 -1
  10. data/app/views/decidim/proposals/admin/proposals/index.html.erb +11 -0
  11. data/app/views/decidim/proposals/proposals/_filters.html.erb +1 -1
  12. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +9 -7
  13. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +35 -0
  14. data/app/views/decidim/proposals/proposals/index.html.erb +8 -4
  15. data/app/views/decidim/proposals/proposals/show.html.erb +11 -4
  16. data/config/locales/ca.yml +18 -6
  17. data/config/locales/en.yml +17 -5
  18. data/config/locales/es.yml +17 -5
  19. data/config/locales/eu.yml +28 -16
  20. data/config/locales/fi.yml +23 -11
  21. data/config/locales/fr.yml +21 -9
  22. data/config/locales/it.yml +17 -5
  23. data/config/locales/nl.yml +19 -7
  24. data/config/locales/pl.yml +17 -5
  25. data/config/locales/ru.yml +183 -0
  26. data/config/locales/uk.yml +36 -24
  27. data/lib/decidim/proposals/feature.rb +10 -8
  28. data/lib/decidim/proposals/test/factories.rb +29 -1
  29. data/lib/decidim/proposals/version.rb +10 -0
  30. metadata +25 -51
  31. 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: 'Предложения, представленные в этих итогах:'
@@ -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
- vote_limit: Гранична кількість голосів
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
- citizenship: Громадянство
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
- votes_limit:
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: Ви маєте право проголосувати лише по %{limit} пропозиціям, а не по скільком завгодно багатьом.
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
- 20.times do |n|
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 > 15
109
+ state, answer = if n > 3
108
110
  ["accepted", Decidim::Faker::Localized.sentence(10)]
109
- elsif n > 9
111
+ elsif n > 2
110
112
  ["rejected", nil]
111
- elsif n > 6
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
- rand(3).times do |m|
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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This holds decidim-proposals version.
5
+ module Proposals
6
+ def self.version
7
+ "0.7.0"
8
+ end
9
+ end
10
+ end