demarches-normaliennes/app/serializers/champ_serializer.rb
2018-11-30 13:28:30 +01:00

93 lines
1.9 KiB
Ruby

class ChampSerializer < ActiveModel::Serializer
include Rails.application.routes.url_helpers
attributes :value
has_one :type_de_champ
has_many :geo_areas, if: :include_geo_areas?
has_one :etablissement, if: :include_etablissement?
has_one :entreprise, if: :include_etablissement?
def value
case object
when GeoArea
object.geometry.to_json
when Champs::CarteChamp
if object.geo_json.present?
object.geo_json.to_json
end
when Champs::DecimalNumberChamp
if object.value.present?
object.value.to_f
end
when Champs::IntegerNumberChamp
if object.value.present?
object.value.to_i
end
when Champs::LinkedDropDownListChamp
if object.value.present?
{ primary: object.primary_value, secondary: object.secondary_value }
end
when Champs::PieceJustificativeChamp
if object.piece_justificative_file.attached?
url_for(object.piece_justificative_file)
end
else
object.value
end
end
def type_de_champ
case object
when GeoArea
legacy_type_de_champ
else
object.type_de_champ
end
end
def etablissement
object.etablissement
end
def entreprise
object.etablissement&.entreprise
end
def include_etablissement?
object.is_a?(Champs::SiretChamp)
end
def include_geo_areas?
object.is_a?(Champs::CarteChamp)
end
private
def legacy_type_de_champ
{
id: -1,
libelle: legacy_carto_libelle,
type_champ: legacy_carto_type_champ,
order_place: -1,
description: ''
}
end
def legacy_carto_libelle
if object.source == GeoArea.sources.fetch(:selection_utilisateur)
'user geometry'
else
object.source.to_s.tr('_', ' ')
end
end
def legacy_carto_type_champ
if object.source == GeoArea.sources.fetch(:selection_utilisateur)
'user_geometry'
else
object.source.to_s
end
end
end