Class: Decidim::ParticipatoryDocuments::Suggestion

Inherits:
ApplicationRecord
  • Object
show all
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

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.dummy_author_ids_has(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_serializerObject



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_queryObject



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_ascObject



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_descObject



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_queryObject

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

Returns:

  • (Boolean)


53
54
55
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 53

def answered?
  answered_at.present?
end

#has_answer?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'app/models/decidim/participatory_documents/suggestion.rb', line 57

def has_answer?
  translated_attribute(answer).present?
end

#validate_file_typeObject



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

#valuatorsObject



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