diff options
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/chouette/journey_frequency.rb | 35 | ||||
| -rw-r--r-- | app/models/chouette/route.rb | 19 | ||||
| -rw-r--r-- | app/models/chouette/stop_area.rb | 30 | ||||
| -rw-r--r-- | app/models/chouette/stop_point.rb | 3 | ||||
| -rw-r--r-- | app/models/chouette/timeband.rb | 28 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 1 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey_at_stop.rb | 4 | ||||
| -rw-r--r-- | app/models/clean_up.rb | 2 | ||||
| -rw-r--r-- | app/models/concerns/custom_fields_support.rb | 2 | ||||
| -rw-r--r-- | app/models/concerns/iev_interfaces/task.rb | 1 | ||||
| -rw-r--r-- | app/models/import/base.rb | 2 | ||||
| -rw-r--r-- | app/models/referential.rb | 3 | ||||
| -rw-r--r-- | app/models/simple_importer.rb | 16 | ||||
| -rw-r--r-- | app/models/simple_interface.rb | 10 | ||||
| -rw-r--r-- | app/models/simple_interfaces_group.rb | 4 | ||||
| -rw-r--r-- | app/models/stop_area_copy.rb | 95 | 
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 | 
