diff options
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 16 | ||||
| -rw-r--r-- | app/models/concerns/custom_fields_support.rb | 19 | ||||
| -rw-r--r-- | app/models/custom_field.rb | 38 | ||||
| -rw-r--r-- | spec/factories/custom_fields.rb | 2 | ||||
| -rw-r--r-- | spec/models/custom_field_spec.rb | 25 | 
5 files changed, 82 insertions, 18 deletions
| diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 9b94f7f0e..c5a6901d7 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -3,6 +3,7 @@ module Chouette    class VehicleJourney < Chouette::TridentActiveRecord      has_paper_trail      include ChecksumSupport +    include CustomFieldsSupport      include VehicleJourneyRestrictions      include ObjectidSupport      include StifTransportModeEnumerations @@ -340,21 +341,6 @@ module Chouette        end      end -    def self.custom_fields -      CustomField.where(resource_type: self.name.split("::").last) -    end - - -    def custom_fields -      Hash[*self.class.custom_fields.map do |v| -        [v.code, v.slice(:code, :name, :field_type, :options).update(value: custom_field_value(v.code))] -      end.flatten] -    end - -    def custom_field_value key -      (custom_field_values || {})[key.to_s] -    end -      def self.matrix(vehicle_journeys)        Hash[*VehicleJourneyAtStop.where(vehicle_journey_id: vehicle_journeys.pluck(:id)).map do |vjas|          [ "#{vjas.vehicle_journey_id}-#{vjas.stop_point_id}", vjas] diff --git a/app/models/concerns/custom_fields_support.rb b/app/models/concerns/custom_fields_support.rb new file mode 100644 index 000000000..e8ecfcb7c --- /dev/null +++ b/app/models/concerns/custom_fields_support.rb @@ -0,0 +1,19 @@ +module CustomFieldsSupport +  extend ActiveSupport::Concern + +  included do +    def self.custom_fields +      CustomField.where(resource_type: self.name.split("::").last) +    end + +    def custom_fields +      HashWithIndifferentAccess[*self.class.custom_fields.map do |v| +        [v.code, CustomField::Value.new(v, custom_field_value(v.code))] +      end.flatten] +    end + +    def custom_field_value key +      (custom_field_values || {})[key.to_s] +    end +  end +end diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb index 774c8b0f6..2572d5c80 100644 --- a/app/models/custom_field.rb +++ b/app/models/custom_field.rb @@ -6,4 +6,42 @@ class CustomField < ActiveRecord::Base    validates :name, uniqueness: {scope: [:resource_type, :workgroup_id]}    validates :code, uniqueness: {scope: [:resource_type, :workgroup_id], case_sensitive: false} + +  class Value +    def self.new custom_field, value +      field_type = custom_field.options["field_type"] +      klass_name = field_type && "CustomField::Value::#{field_type.classify}" +      klass = klass_name && const_defined?(klass_name) ? klass_name.constantize : CustomField::Value::Base +      klass.new custom_field, value +    end + +    class Base +      def initialize custom_field, value +        @custom_field = custom_field +        @raw_value = value +      end + +      %i(code name field_type options).each do |attr| +        define_method attr do +          @custom_field.send(attr) +        end +      end + +      def value +        @raw_value +      end +    end + +    class Integer < Base +      def value +        @raw_value.to_i +      end +    end + +    class String < Base +      def value +        "#{@raw_value}" +      end +    end +  end  end diff --git a/spec/factories/custom_fields.rb b/spec/factories/custom_fields.rb index 2f5fae555..7c43a6147 100644 --- a/spec/factories/custom_fields.rb +++ b/spec/factories/custom_fields.rb @@ -4,6 +4,6 @@ FactoryGirl.define do      resource_type "VehicleJourney"      sequence(:name){|n| "custom field ##{n}"}      field_type "list" -    options( { "capacity" => "0" } ) +    options( { capacity: "0" } )    end  end diff --git a/spec/models/custom_field_spec.rb b/spec/models/custom_field_spec.rb index 51128b0a2..d1c6d803a 100644 --- a/spec/models/custom_field_spec.rb +++ b/spec/models/custom_field_spec.rb @@ -16,7 +16,6 @@ RSpec.describe CustomField, type: :model do      end    end -    context "custom fields for a resource" do      let!( :fields ){ [create(:custom_field), create(:custom_field, code: :energy)] }      let!( :instance_fields ){ @@ -26,10 +25,32 @@ RSpec.describe CustomField, type: :model do        }      }      it { expect(Chouette::VehicleJourney.custom_fields).to eq(fields) } -    it { expect(vj.custom_fields).to eq(instance_fields) } +    it { +      instance_fields.each do |code, cf| +        cf.each do |k, v| +          expect(vj.custom_fields[code].send(k)).to eq(v) +        end +      end +    }    end    context "custom field_values for a resource" do      it { expect(vj.custom_field_value("energy")).to eq(99) }    end + +  context "with an 'integer' field_type" do +    let!(:field){ [create(:custom_field, code: :energy, options: {field_type: 'integer'})] } +    let!( :vj ){ create :vehicle_journey, custom_field_values: {energy: "99"} } +    it "should cast the value" do +      expect(vj.custom_fields[:energy].value).to eq 99 +    end +  end + +  context "with a 'string' field_type" do +    let!(:field){ [create(:custom_field, code: :energy, options: {field_type: 'string'})] } +    let!( :vj ){ create :vehicle_journey, custom_field_values: {energy: 99} } +    it "should cast the value" do +      expect(vj.custom_fields[:energy].value).to eq '99' +    end +  end  end | 
