lib/decidim/elections/component.rb in decidim-elections-0.23.6 vs lib/decidim/elections/component.rb in decidim-elections-0.24.0.rc1
- old
+ new
@@ -7,14 +7,15 @@
component.admin_engine = Decidim::Elections::AdminEngine
component.icon = "decidim/elections/icon.svg"
component.stylesheet = "decidim/elections/elections"
component.permissions_class_name = "Decidim::Elections::Permissions"
component.query_type = "Decidim::Elections::ElectionsType"
- # component.on(:before_destroy) do |instance|
- # # Code executed before removing the component
- # end
+ component.on(:before_destroy) do |instance|
+ raise StandardError, "Can't remove this component" if Decidim::Elections::Election.where(component: instance).any?
+ end
+
# These actions permissions can be configured in the admin panel
component.actions = %w(vote)
component.settings(:global) do |settings|
settings.attribute :announcement, type: :text, translated: true, editor: true
@@ -41,10 +42,30 @@
component.register_resource(:answer) do |resource|
resource.model_class_name = "Decidim::Elections::Answer"
end
+ component.exports :feedback_form_answers do |exports|
+ exports.collection do |_component, _user, resource_id|
+ Decidim::Forms::QuestionnaireUserAnswers.for(resource_id)
+ end
+
+ exports.formats %w(CSV JSON Excel FormPDF)
+
+ exports.serializer Decidim::Forms::UserAnswersSerializer
+ end
+
+ component.exports :elections do |exports|
+ exports.collection do |component_instance|
+ Decidim::Elections::Question.where(election: Decidim::Elections::Election.where(component: component_instance).bb_results_published).collect(&:answers).flatten
+ end
+
+ exports.include_in_open_data = true
+
+ exports.serializer Decidim::Elections::AnswerSerializer
+ end
+
component.seeds do |participatory_space|
admin_user = Decidim::User.find_by(
organization: participatory_space.organization,
email: "admin@example.org"
)
@@ -63,66 +84,388 @@
visibility: "all"
) do
Decidim::Component.create!(params)
end
- 3.times do
- election = Decidim.traceability.create!(
+ # upcoming elections that may be published
+ 2.times do
+ upcoming_election = Decidim.traceability.create!(
Decidim::Elections::Election,
admin_user,
{
component: component,
- title: Decidim::Faker::Localized.sentence(2),
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
- Decidim::Faker::Localized.paragraph(3)
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
end,
start_time: 3.weeks.from_now,
end_time: 3.weeks.from_now + 4.hours,
- published_at: Faker::Boolean.boolean(0.5) ? 1.week.ago : nil
+ published_at: Faker::Boolean.boolean(true_ratio: 0.5) ? 1.week.ago : nil
},
visibility: "all"
)
- 2.times do
- question = Decidim.traceability.create!(
+ rand(1...4).times do
+ upcoming_question = Decidim.traceability.create!(
Decidim::Elections::Question,
admin_user,
{
- election: election,
- title: Decidim::Faker::Localized.sentence(2),
+ election: upcoming_election,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
- Decidim::Faker::Localized.paragraph(3)
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
end,
- max_selections: Faker::Number.between(1, 5),
- weight: Faker::Number.number(1),
- random_answers_order: Faker::Boolean.boolean(0.5),
- min_selections: Faker::Number.between(0, 1)
+ max_selections: Faker::Number.between(from: 1, to: 3),
+ weight: Faker::Number.number(digits: 1),
+ random_answers_order: Faker::Boolean.boolean(true_ratio: 0.5),
+ min_selections: Faker::Number.between(from: 0, to: 1)
},
visibility: "all"
)
- Faker::Number.between(2, 5).times do
+ rand(upcoming_question.max_selections...5).times do
answer = Decidim.traceability.create!(
Decidim::Elections::Answer,
admin_user,
{
- question: question,
- title: Decidim::Faker::Localized.sentence(2),
+ question: upcoming_question,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
- Decidim::Faker::Localized.paragraph(3)
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
end,
- weight: Faker::Number.number(1)
+ weight: Faker::Number.number(digits: 1),
+ selected: Faker::Boolean.boolean(true_ratio: 0.2), # false
+ votes_count: 0
},
visibility: "all"
)
Decidim::Attachment.create!(
- title: Decidim::Faker::Localized.sentence(2),
- description: Decidim::Faker::Localized.sentence(5),
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.sentence(word_count: 5),
attached_to: answer,
file: File.new(File.join(__dir__, "seeds", "city.jpeg")) # Keep after attached_to
)
end
+
+ questionnaire = Decidim::Forms::Questionnaire.create!(
+ title: Decidim::Faker::Localized.paragraph,
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ tos: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 2)
+ end,
+ questionnaire_for: upcoming_election
+ )
+
+ %w(short_answer long_answer).each do |text_question_type|
+ Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: text_question_type
+ )
+ end
+
+ %w(single_option multiple_option).each do |multiple_choice_question_type|
+ question = Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: multiple_choice_question_type
+ )
+
+ 3.times do
+ question.answer_options.create!(body: Decidim::Faker::Localized.sentence)
+ end
+ end
end
end
+
+ # finished elections that may be published, with questionnaire
+ 2.times do
+ finished_election = Decidim.traceability.create!(
+ Decidim::Elections::Election,
+ admin_user,
+ {
+ component: component,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ start_time: 4.weeks.ago,
+ end_time: 3.weeks.ago,
+ published_at: 4.weeks.ago
+ },
+ visibility: "all"
+ )
+
+ rand(1...4).times do
+ finished_question = Decidim.traceability.create!(
+ Decidim::Elections::Question,
+ admin_user,
+ {
+ election: finished_election,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ max_selections: 2,
+ weight: Faker::Number.number(digits: 1),
+ random_answers_order: Faker::Boolean.boolean(true_ratio: 0.5),
+ min_selections: Faker::Number.between(from: 0, to: 1)
+ },
+ visibility: "all"
+ )
+
+ rand(2...5).times do
+ answer = Decidim.traceability.create!(
+ Decidim::Elections::Answer,
+ admin_user,
+ {
+ question: finished_question,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ weight: Faker::Number.number(digits: 1),
+ selected: Faker::Boolean.boolean(true_ratio: 0.2), # false
+ votes_count: 0
+ },
+ visibility: "all"
+ )
+
+ Decidim::Attachment.create!(
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.sentence(word_count: 5),
+ attached_to: answer,
+ file: File.new(File.join(__dir__, "seeds", "city.jpeg")) # Keep after attached_to
+ )
+ end
+
+ questionnaire = Decidim::Forms::Questionnaire.create!(
+ title: Decidim::Faker::Localized.paragraph,
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ tos: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 2)
+ end,
+ questionnaire_for: finished_election
+ )
+
+ %w(short_answer long_answer).each do |text_question_type|
+ Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: text_question_type
+ )
+ end
+
+ %w(single_option multiple_option).each do |multiple_choice_question_type|
+ question = Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: multiple_choice_question_type
+ )
+
+ 3.times do
+ question.answer_options.create!(body: Decidim::Faker::Localized.sentence)
+ end
+ end
+ end
+ end
+
+ # finished, published elections with results and with questionnaire
+ 2.times do
+ election_with_results = Decidim.traceability.create!(
+ Decidim::Elections::Election,
+ admin_user,
+ {
+ component: component,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ start_time: 4.weeks.ago,
+ end_time: 3.weeks.ago,
+ published_at: 3.weeks.ago,
+ bb_status: "results_published"
+
+ },
+ visibility: "all"
+ )
+
+ rand(1...4).times do
+ result_question = Decidim.traceability.create!(
+ Decidim::Elections::Question,
+ admin_user,
+ {
+ election: election_with_results,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ max_selections: 2,
+ weight: Faker::Number.number(digits: 1),
+ random_answers_order: Faker::Boolean.boolean(true_ratio: 0.5),
+ min_selections: Faker::Number.between(from: 0, to: 1)
+ },
+ visibility: "all"
+ )
+
+ rand(2...5).times do
+ answer = Decidim.traceability.create!(
+ Decidim::Elections::Answer,
+ admin_user,
+ {
+ question: result_question,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ weight: Faker::Number.number(digits: 1),
+ selected: Faker::Boolean.boolean(true_ratio: 0.5),
+ votes_count: Faker::Number.number(digits: 3)
+ },
+ visibility: "all"
+ )
+
+ Decidim::Attachment.create!(
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.sentence(word_count: 5),
+ attached_to: answer,
+ file: File.new(File.join(__dir__, "seeds", "city.jpeg")) # Keep after attached_to
+ )
+ end
+
+ questionnaire = Decidim::Forms::Questionnaire.create!(
+ title: Decidim::Faker::Localized.paragraph,
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ tos: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 2)
+ end,
+ questionnaire_for: election_with_results
+ )
+
+ %w(short_answer long_answer).each do |text_question_type|
+ Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: text_question_type
+ )
+ end
+
+ %w(single_option multiple_option).each do |multiple_choice_question_type|
+ question = Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: multiple_choice_question_type
+ )
+
+ 3.times do
+ question.answer_options.create!(body: Decidim::Faker::Localized.sentence)
+ end
+ end
+ end
+ end
+
+ # ongoing election that is published
+ ongoing_election = Decidim.traceability.create!(
+ Decidim::Elections::Election,
+ admin_user,
+ {
+ component: component,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ start_time: 2.weeks.ago,
+ end_time: 2.weeks.from_now + 4.hours,
+ published_at: 3.weeks.ago
+ },
+ visibility: "all"
+ )
+
+ rand(1...4).times do
+ ongoing_question = Decidim.traceability.create!(
+ Decidim::Elections::Question,
+ admin_user,
+ {
+ election: ongoing_election,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ max_selections: 2,
+ weight: Faker::Number.number(digits: 1),
+ random_answers_order: Faker::Boolean.boolean(true_ratio: 0.5),
+ min_selections: Faker::Number.between(from: 0, to: 1)
+ },
+ visibility: "all"
+ )
+
+ rand(3...5).times do
+ answer = Decidim.traceability.create!(
+ Decidim::Elections::Answer,
+ admin_user,
+ {
+ question: ongoing_question,
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ weight: Faker::Number.number(digits: 1),
+ selected: Faker::Boolean.boolean(true_ratio: 0.2), # false
+ votes_count: 0
+ },
+ visibility: "all"
+ )
+
+ Decidim::Attachment.create!(
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
+ description: Decidim::Faker::Localized.sentence(word_count: 5),
+ attached_to: answer,
+ file: File.new(File.join(__dir__, "seeds", "city.jpeg")) # Keep after attached_to
+ )
+ end
+ end
+
+ questionnaire = Decidim::Forms::Questionnaire.create!(
+ title: Decidim::Faker::Localized.paragraph,
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 3)
+ end,
+ tos: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
+ Decidim::Faker::Localized.paragraph(sentence_count: 2)
+ end,
+ questionnaire_for: ongoing_election
+ )
+
+ %w(short_answer long_answer).each do |text_question_type|
+ Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: text_question_type
+ )
+ end
+
+ %w(single_option multiple_option).each do |multiple_choice_question_type|
+ question = Decidim::Forms::Question.create!(
+ questionnaire: questionnaire,
+ body: Decidim::Faker::Localized.paragraph,
+ question_type: multiple_choice_question_type
+ )
+
+ 3.times do
+ question.answer_options.create!(body: Decidim::Faker::Localized.sentence)
+ end
+ end
end
end
+
+Decidim.register_global_engine(
+ :decidim_elections_trustee_zone,
+ Decidim::Elections::TrusteeZoneEngine,
+ at: "/trustee"
+)