aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/chouette/journey_frequency.rb35
-rw-r--r--app/models/chouette/route.rb19
-rw-r--r--app/models/chouette/stop_area.rb30
-rw-r--r--app/models/chouette/stop_point.rb3
-rw-r--r--app/models/chouette/timeband.rb28
-rw-r--r--app/models/chouette/vehicle_journey.rb1
-rw-r--r--app/models/chouette/vehicle_journey_at_stop.rb4
-rw-r--r--app/models/clean_up.rb2
-rw-r--r--app/models/concerns/custom_fields_support.rb2
-rw-r--r--app/models/concerns/iev_interfaces/task.rb1
-rw-r--r--app/models/import/base.rb2
-rw-r--r--app/models/referential.rb3
-rw-r--r--app/models/simple_importer.rb16
-rw-r--r--app/models/simple_interface.rb10
-rw-r--r--app/models/simple_interfaces_group.rb4
-rw-r--r--app/models/stop_area_copy.rb95
16 files changed, 72 insertions, 183 deletions
diff --git a/app/models/chouette/journey_frequency.rb b/app/models/chouette/journey_frequency.rb
deleted file mode 100644
index 1b4efe96e..000000000
--- a/app/models/chouette/journey_frequency.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-module Chouette
- class JourneyFrequencyValidator < ActiveModel::Validator
- def validate(record)
- timeband = record.timeband
- if timeband
- first_departure_time = record.first_departure_time.utc.strftime( "%H%M%S%N" )
- last_departure_time = record.last_departure_time.utc.strftime( "%H%M%S%N" )
- timeband_start_time = timeband.start_time.utc.strftime( "%H%M%S%N" )
- timeband_end_time = timeband.end_time.utc.strftime( "%H%M%S%N" )
-
- unless first_departure_time.between? timeband_start_time, timeband_end_time
- record.errors[:first_departure_time] << I18n.t('activerecord.errors.models.journey_frequency.start_must_be_after_timeband')
- end
- unless last_departure_time.between? timeband_start_time, timeband_end_time
- record.errors[:last_departure_time] << I18n.t('activerecord.errors.models.journey_frequency.end_must_be_before_timeband')
- end
- end
- if record.first_departure_time == record.last_departure_time
- record.errors[:last_departure_time] << I18n.t('activerecord.errors.models.journey_frequency.end_must_be_different_from_first')
- end
- if record.scheduled_headway_interval.blank? || (record.scheduled_headway_interval.strftime( "%H%M%S%N" ) == Time.current.midnight.strftime( "%H%M%S%N" ))
- record.errors[:scheduled_headway_interval] << I18n.t('activerecord.errors.models.journey_frequency.scheduled_headway_interval_greater_than_zero')
- end
- end
- end
-
- class JourneyFrequency < ActiveRecord
- belongs_to :vehicle_journey_frequency, foreign_key: 'vehicle_journey_id'
- belongs_to :timeband
- validates :first_departure_time, presence: true
- validates :last_departure_time, presence: true
- validates :scheduled_headway_interval, presence: true
- validates_with Chouette::JourneyFrequencyValidator
- end
-end \ No newline at end of file
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index 949b18d6f..00e5d27fa 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -34,6 +34,7 @@ module Chouette
Chouette::Route.vehicle_journeys_timeless(proxy_association.owner.journey_patterns.pluck( :departure_stop_point_id))
end
end
+ has_many :vehicle_journey_at_stops, through: :vehicle_journeys
has_many :vehicle_journey_frequencies, :dependent => :destroy do
# Todo : I think there is a better way to do this.
def timeless
@@ -63,6 +64,9 @@ module Chouette
where(" position between ? and ? ", between_positions.first, between_positions.last)
end
end
+
+ has_many :vehicle_journey_at_stops, through: :vehicle_journeys
+
has_many :stop_areas, -> { order('stop_points.position ASC') }, :through => :stop_points do
def between(departure, arrival)
departure, arrival = [departure, arrival].map do |endpoint|
@@ -89,6 +93,18 @@ module Chouette
TomTom.enabled?
}
+ def clean!
+ vehicle_journeys.find_each do |vj|
+ vj.vehicle_journey_at_stops.delete_all
+ end
+ vehicle_journeys.delete_all
+ journey_patterns.delete_all
+ stop_points.delete_all
+ routing_constraint_zones.delete_all
+ Chouette::Route.where(opposite_route_id: self.id).update_all(opposite_route_id: nil)
+ self.delete
+ end
+
def duplicate opposite=false
overrides = {
'opposite_route_id' => nil,
@@ -166,7 +182,8 @@ module Chouette
end
def time_tables
- vehicle_journeys.joins(:time_tables).map(&:"time_tables").flatten.uniq
+ ids = vehicle_journeys.joins(:time_tables).pluck('time_tables.id').uniq
+ Chouette::TimeTable.where(id: ids)
end
def sorted_vehicle_journeys(journey_category_model)
diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb
index b933e1944..25a0010d8 100644
--- a/app/models/chouette/stop_area.rb
+++ b/app/models/chouette/stop_area.rb
@@ -383,6 +383,28 @@ module Chouette
end
end
+ def self.ransackable_scopes(auth_object = nil)
+ [:by_status]
+ end
+
+
+ def self.by_status(*statuses)
+ return Chouette::StopArea.all if statuses.reject(&:blank?).length == 3 || statuses.reject(&:blank?).empty?
+
+ status = {
+ in_creation: statuses.include?('in_creation'),
+ confirmed: statuses.include?('confirmed'),
+ deactivated: statuses.include?('deactivated'),
+ }
+
+ query = []
+ query << "deleted_at IS NOT NULL" if statuses.include?('deactivated')
+ query << "(confirmed_at IS NULL AND deleted_at IS NULL)" if statuses.include?('in_creation')
+ query << "(confirmed_at IS NOT NULL AND deleted_at IS NULL)" if statuses.include?('confirmed')
+
+ Chouette::StopArea.where(query.join(' OR '))
+ end
+
def activated?
!!(deleted_at.nil? && confirmed_at)
end
@@ -410,7 +432,7 @@ module Chouette
end
def status
- return :deleted if deleted_at
+ return :deactivated if deleted_at
return :confirmed if confirmed_at
:in_creation
@@ -418,7 +440,7 @@ module Chouette
def status=(status)
case status&.to_sym
- when :deleted
+ when :deactivated
deactivate
when :confirmed
activate
@@ -428,7 +450,7 @@ module Chouette
end
def self.statuses
- %i{in_creation confirmed deleted}
+ %i{in_creation confirmed deactivated}
end
def time_zone_offset
@@ -441,7 +463,7 @@ module Chouette
return unless ActiveSupport::TimeZone[time_zone].present?
ActiveSupport::TimeZone[time_zone].tzinfo.name
end
-
+
def country
return unless country_code
country = ISO3166::Country[country_code]
diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb
index edb0e81fd..91dfab705 100644
--- a/app/models/chouette/stop_point.rb
+++ b/app/models/chouette/stop_point.rb
@@ -10,6 +10,7 @@ module Chouette
include ObjectidSupport
belongs_to :stop_area
+ belongs_to :stop_area_light, -> {select(:name, :city_name, :zip_code, :time_zone, :registration_number, :kind, :area_type, :time_zone)}, class_name: "Chouette::StopArea", foreign_key: :stop_area_id
belongs_to :route, inverse_of: :stop_points
has_many :journey_patterns, through: :route
has_many :vehicle_journey_at_stops, :dependent => :destroy
@@ -27,7 +28,7 @@ module Chouette
scope :default_order, -> { order("position") }
- delegate :name, :registration_number, :kind, :area_type, to: :stop_area
+ delegate :name, :registration_number, :kind, :area_type, to: :stop_area_light
before_destroy :remove_dependent_journey_pattern_stop_points
def remove_dependent_journey_pattern_stop_points
diff --git a/app/models/chouette/timeband.rb b/app/models/chouette/timeband.rb
deleted file mode 100644
index 38260b755..000000000
--- a/app/models/chouette/timeband.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-module Chouette
- class TimebandValidator < ActiveModel::Validator
- def validate(record)
- if record.end_time <= record.start_time
- record.errors[:end_time] << I18n.t('activerecord.errors.models.timeband.start_must_be_before_end')
- end
- end
- end
-
- class Timeband < Chouette::TridentActiveRecord
- include ObjectidSupport
- has_metadata
-
- validates :start_time, :end_time, presence: true
- validates_with Chouette::TimebandValidator
-
- default_scope { order(:start_time) }
-
- def self.object_id_key
- "Timeband"
- end
-
- def fullname
- fullname = "#{I18n.l(self.start_time, format: :hour)}-#{I18n.l(self.end_time, format: :hour)}"
- "#{self.name} (#{fullname})" if self.name
- end
- end
-end
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 818287b04..3bbd89f7b 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -21,6 +21,7 @@ module Chouette
belongs_to :company
belongs_to :route
belongs_to :journey_pattern
+ belongs_to :journey_pattern_only_objectid, -> {select("journey_patterns.objectid")}, class_name: "Chouette::JourneyPattern", foreign_key: :journey_pattern_id
has_many :stop_areas, through: :journey_pattern
has_and_belongs_to_many :footnotes, :class_name => 'Chouette::Footnote'
diff --git a/app/models/chouette/vehicle_journey_at_stop.rb b/app/models/chouette/vehicle_journey_at_stop.rb
index 3f5bd5abf..797571070 100644
--- a/app/models/chouette/vehicle_journey_at_stop.rb
+++ b/app/models/chouette/vehicle_journey_at_stop.rb
@@ -101,8 +101,8 @@ module Chouette
end
def time_zone_offset
- return 0 unless stop_point&.stop_area&.time_zone.present?
- ActiveSupport::TimeZone[stop_point.stop_area.time_zone]&.utc_offset || 0
+ return 0 unless stop_point&.stop_area_light&.time_zone.present?
+ ActiveSupport::TimeZone[stop_point.stop_area_light.time_zone]&.utc_offset || 0
end
private
diff --git a/app/models/clean_up.rb b/app/models/clean_up.rb
index 9cf2389c9..c9dc269ac 100644
--- a/app/models/clean_up.rb
+++ b/app/models/clean_up.rb
@@ -109,7 +109,7 @@ class CleanUp < ApplicationModel
def destroy_routes_outside_referential
line_ids = referential.metadatas.pluck(:line_ids).flatten.uniq
- Chouette::Route.where(['line_id not in (?)', line_ids]).destroy_all
+ Chouette::Route.where(['line_id not in (?)', line_ids]).find_each &:clean!
end
def destroy_vehicle_journeys
diff --git a/app/models/concerns/custom_fields_support.rb b/app/models/concerns/custom_fields_support.rb
index f5a76f324..f55ff923b 100644
--- a/app/models/concerns/custom_fields_support.rb
+++ b/app/models/concerns/custom_fields_support.rb
@@ -31,7 +31,7 @@ module CustomFieldsSupport
end
def custom_fields_checksum
- custom_fields.values.map(&:checksum)
+ custom_fields.values.sort_by(&:code).map(&:checksum)
end
def custom_field_values= vals
diff --git a/app/models/concerns/iev_interfaces/task.rb b/app/models/concerns/iev_interfaces/task.rb
index e40808009..b8ae12be9 100644
--- a/app/models/concerns/iev_interfaces/task.rb
+++ b/app/models/concerns/iev_interfaces/task.rb
@@ -7,6 +7,7 @@ module IevInterfaces::Task
belongs_to :referential
mount_uploader :file, ImportUploader
+ validates_integrity_of :file
has_many :children, foreign_key: :parent_id, class_name: self.name, dependent: :destroy
diff --git a/app/models/import/base.rb b/app/models/import/base.rb
index dcd710e58..ea7304d70 100644
--- a/app/models/import/base.rb
+++ b/app/models/import/base.rb
@@ -1,6 +1,5 @@
class Import::Base < ApplicationModel
self.table_name = "imports"
- validates :file, presence: true
def self.messages_class_name
"Import::Message"
@@ -15,6 +14,7 @@ class Import::Base < ApplicationModel
end
include IevInterfaces::Task
+ validates_presence_of :file, unless: Proc.new {|import| import.errors[:file].present? }
def self.model_name
ActiveModel::Name.new Import::Base, Import::Base, "Import"
diff --git a/app/models/referential.rb b/app/models/referential.rb
index 0c6e71d47..ea75274d0 100644
--- a/app/models/referential.rb
+++ b/app/models/referential.rb
@@ -192,9 +192,6 @@ class Referential < ApplicationModel
Chouette::TimeTableDate.all
end
- def timebands
- Chouette::Timeband.all
- end
def connection_links
Chouette::ConnectionLink.all
diff --git a/app/models/simple_importer.rb b/app/models/simple_importer.rb
index 4cfe90cff..d47ff6a92 100644
--- a/app/models/simple_importer.rb
+++ b/app/models/simple_importer.rb
@@ -42,8 +42,10 @@ class SimpleImporter < SimpleInterface
end
def dump_csv_from_context
- dir = context[:logs_output_dir] || "log/importers"
- filepath = File.join dir, "#{self.configuration_name}_#{Time.now.strftime "%y%m%d%H%M"}.csv"
+ dir = @output_dir
+ FileUtils.mkdir_p dir
+
+ filepath = File.join dir, "#{self.configuration_name}_#{Time.now.strftime "%y%m%d%H%M"}_dump.csv"
# for some reason, context[:csv].to_csv does not work
CSV.open(filepath, 'w') do |csv|
header = true
@@ -131,14 +133,16 @@ class SimpleImporter < SimpleInterface
@current_attribute = col[:attribute]
val = col[:value]
if val.nil? || val.is_a?(Proc)
- if row.has_key? col.name
- if val.is_a?(Proc)
+ if val.is_a?(Proc)
+ if row.has_key? col.name
val = instance_exec(row[col.name], &val)
else
- val = row[col.name]
+ val = instance_exec(&val)
end
+ elsif row.has_key? col.name
+ val = row[col.name]
else
- push_in_journal({event: :column_not_found, message: "Column not found: #{col.name}", kind: :warning})
+ push_in_journal({event: :column_not_found, message: "Column not found: #{col.name || col.attribute}", kind: :warning})
self.status ||= :success_with_warnings
end
end
diff --git a/app/models/simple_interface.rb b/app/models/simple_interface.rb
index 7b04a07df..4da103c38 100644
--- a/app/models/simple_interface.rb
+++ b/app/models/simple_interface.rb
@@ -97,14 +97,16 @@ class SimpleInterface < ApplicationModel
def write_output_to_csv
cols = %i(line kind event message error)
- if self.journal.size > 0 && self.journal.first[:row].present?
+ journal = self.journal && self.journal.map(&:symbolize_keys)
+ first_row = journal.find{|r| r[:row].present? }
+ if first_row.present?
log "Writing output log"
FileUtils.mkdir_p @output_dir
- keys = self.journal.first[:row].map(&:first)
+ keys = first_row[:row].map(&:first)
CSV.open(output_filepath, "w") do |csv|
csv << cols + keys
- self.journal.each do |j|
- csv << cols.map{|c| j[c]} + j[:row].map(&:last)
+ journal.each do |j|
+ csv << cols.map{|c| j[c]} + (j[:row] || {}).map(&:last)
end
end
log "Output written in #{output_filepath}", replace: true
diff --git a/app/models/simple_interfaces_group.rb b/app/models/simple_interfaces_group.rb
index 808be6570..1e13bd0b5 100644
--- a/app/models/simple_interfaces_group.rb
+++ b/app/models/simple_interfaces_group.rb
@@ -30,7 +30,9 @@ class SimpleInterfacesGroup
name = "### #{self.name} ###"
centered_name = " " * ([width - name.size, 0].max / 2) + name
- banner = [centered_name, ""]
+ banner = [centered_name]
+ banner << "Output to: #{shared_options[:output_dir]}" if shared_options && shared_options[:output_dir]
+ banner << ""
banner << @interfaces.each_with_index.map do |interface, i|
if interface[:interface].status.present?
SimpleInterface.colorize interface[:name], SimpleInterface.status_color(interface[:interface].status)
diff --git a/app/models/stop_area_copy.rb b/app/models/stop_area_copy.rb
deleted file mode 100644
index d3eb78557..000000000
--- a/app/models/stop_area_copy.rb
+++ /dev/null
@@ -1,95 +0,0 @@
-class StopAreaCopy
- include ActiveModel::Validations
- include ActiveModel::Conversion
- extend ActiveModel::Naming
-
- attr_accessor :source_id, :hierarchy, :area_type, :source, :copy
-
- validates_presence_of :source_id, :hierarchy, :area_type
-
- validates :hierarchy, inclusion: { in: %w(child parent) }
-
-
- def initialize(attributes = {})
- attributes.each { |name, value| send("#{name}=", value) } if attributes
- if self.area_type.blank? && self.source != nil
- self.source_id = self.source.id
- if self.hierarchy == "child"
- if self.source.area_type.underscore == "stop_place"
- self.area_type="commercial_stop_point"
- else
- self.area_type="boarding_position"
- end
- else
- if self.source.area_type.underscore == "stop_place" || self.source.area_type.underscore == "commercial_stop_point"
- self.area_type="stop_place"
- else
- self.area_type="commercial_stop_point"
- end
- end
- end
- end
-
- def persisted?
- false
- end
-
- def source
- @source ||= Chouette::StopArea.find self.source_id
- end
-
- def copy
- @copy ||= self.source.duplicate
- end
-
- def copy_is_source_parent?
- self.hierarchy == "parent"
- end
-
- def copy_is_source_child?
- self.hierarchy == "child"
- end
-
- def copy_modfied_attributes
- { :name => self.source.name, # TODO: change ninoxe to avoid that !!!
- :area_type => self.area_type.camelcase,
- :registration_number => nil,
- :parent_id => copy_is_source_child? ? self.source_id : nil
- }
- end
-
- def source_modified_attributes
- return {} unless copy_is_source_parent?
- { :parent_id => self.copy.id
- }
- end
-
- def save
- begin
- if self.valid?
- Chouette::StopArea.transaction do
- copy.update_attributes copy_modfied_attributes
- if copy.valid?
- unless source_modified_attributes.empty?
- source.update_attributes source_modified_attributes
- end
- true
- else
- copy.errors.full_messages.each do |m|
- errors.add :base, m
- end
- false
- end
- end
- else
- false
- end
- rescue Exception => exception
- Rails.logger.error(exception.message)
- Rails.logger.error(exception.backtrace.join("\n"))
- errors.add :base, I18n.t("stop_area_copies.errors.exception")
- false
- end
- end
-
-end