aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/chouette/vehicle_journey.rb16
-rw-r--r--app/models/concerns/custom_fields_support.rb19
-rw-r--r--app/models/custom_field.rb38
3 files changed, 58 insertions, 15 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