Class: Decidim::ParticipatoryDocuments::Suggestion
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Decidim::ParticipatoryDocuments::Suggestion
- Includes:
- AttachmentMethods, Authorable, HasUploadValidations, Loggable, Traceable, TranslatableAttributes, TranslatableResource
- Defined in:
- app/models/decidim/participatory_documents/suggestion.rb
Constant Summary collapse
- POSSIBLE_STATES =
%w(not_answered evaluating accepted rejected withdrawn).freeze
Class Method Summary collapse
- .dummy_author_ids_has(value) ⇒ Object
- .dummy_suggestable_id_has(value) ⇒ Object
- .export_serializer ⇒ Object
- .ransackable_scopes(_auth = nil) ⇒ Object
- .sort_by_suggestable_title_query ⇒ Object
- .sort_by_translated_body_asc ⇒ Object
- .sort_by_translated_body_desc ⇒ Object
-
.sort_by_valuation_assignments_count_nulls_last_query ⇒ Object
Defines the base query so that ransack can actually sort by this value.
-
.valuator_role_ids_has(value) ⇒ Object
method to filter by assigned valuator role ID.
Instance Method Summary collapse
Class Method Details
.dummy_author_ids_has(value) ⇒ Object
117 118 119 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 117 def self.(value) where(decidim_author_id: value) end |
.dummy_suggestable_id_has(value) ⇒ Object
121 122 123 124 125 126 127 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 121 def self.dummy_suggestable_id_has(value) if value.split("-").first == "d" where(suggestable_id: value.split("-").last, suggestable_type: "Decidim::ParticipatoryDocuments::Document") else where(suggestable_id: value.split("-").last, suggestable_type: "Decidim::ParticipatoryDocuments::Section") end end |
.export_serializer ⇒ Object
164 165 166 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 164 def self.export_serializer Decidim::ParticipatoryDocuments::SuggestionSerializer end |
.ransackable_scopes(_auth = nil) ⇒ Object
113 114 115 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 113 def self.ransackable_scopes(_auth = nil) [:valuator_role_ids_has, :dummy_author_ids_has, :dummy_suggestable_id_has] end |
.sort_by_suggestable_title_query ⇒ Object
154 155 156 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 154 def self.sort_by_suggestable_title_query Arel.sql("COALESCE(d.title->>'#{I18n.locale}', s.title->>'#{I18n.locale}')") end |
.sort_by_translated_body_asc ⇒ Object
91 92 93 94 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 91 def self.sort_by_translated_body_asc field = Arel::Nodes::InfixOperation.new("->>", arel_table[:body], Arel::Nodes.build_quoted(I18n.locale)) order(Arel::Nodes::InfixOperation.new("", field, Arel.sql("ASC"))) end |
.sort_by_translated_body_desc ⇒ Object
96 97 98 99 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 96 def self.sort_by_translated_body_desc field = Arel::Nodes::InfixOperation.new("->>", arel_table[:body], Arel::Nodes.build_quoted(I18n.locale)) order(Arel::Nodes::InfixOperation.new("", field, Arel.sql("DESC"))) end |
.sort_by_valuation_assignments_count_nulls_last_query ⇒ Object
Defines the base query so that ransack can actually sort by this value
143 144 145 146 147 148 149 150 151 152 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 143 def self.sort_by_valuation_assignments_count_nulls_last_query "(\nSELECT COUNT(decidim_participatory_documents_valuation_assignments.id)\nFROM decidim_participatory_documents_valuation_assignments\nWHERE decidim_participatory_documents_valuation_assignments.decidim_participatory_documents_suggestion_id = decidim_participatory_documents_suggestions.id\nGROUP BY decidim_participatory_documents_valuation_assignments.decidim_participatory_documents_suggestion_id\n)\n".squish end |
.valuator_role_ids_has(value) ⇒ Object
method to filter by assigned valuator role ID
130 131 132 133 134 135 136 137 138 139 140 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 130 def self.valuator_role_ids_has(value) query = ":value = any(\n(SELECT decidim_participatory_documents_valuation_assignments.valuator_role_id\nFROM decidim_participatory_documents_valuation_assignments\nWHERE decidim_participatory_documents_valuation_assignments.decidim_participatory_documents_suggestion_id = decidim_participatory_documents_suggestions.id\n)\n)\n".squish where(query, value: value) end |
Instance Method Details
#answered? ⇒ Boolean
53 54 55 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 53 def answered? answered_at.present? end |
#has_answer? ⇒ Boolean
57 58 59 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 57 def has_answer? translated_attribute(answer).present? end |
#validate_file_type ⇒ Object
168 169 170 171 172 173 174 175 176 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 168 def validate_file_type allowed_extensions = organization.file_upload_settings["allowed_file_extensions"]["default"] allowed_content_types = organization.file_upload_settings["allowed_content_types"]["default"] file_extension = File.extname(file.blob.filename.to_s)[1..] file_content_type = file.blob.content_type errors.add(:file, :invalid) if allowed_extensions.exclude?(file_extension) || allowed_content_types.exclude?(file_content_type) end |
#valuators ⇒ Object
158 159 160 161 162 |
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 158 def valuators valuator_role_ids = valuation_assignments.where(suggestion: self).pluck(:valuator_role_id) user_ids = participatory_space.user_roles(:valuator).where(id: valuator_role_ids).pluck(:decidim_user_id) participatory_space.organization.users.where(id: user_ids) end |