X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/c2f23fea6a7821a4ad4c97fd65744b138ec86267..400db5803633c92cf5ac0adf1ec7de32211aedea:/app/models/trace.rb diff --git a/app/models/trace.rb b/app/models/trace.rb index 0e8180550..bd8ab72b3 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -2,18 +2,17 @@ # # Table name: gpx_files # -# id :bigint(8) not null, primary key -# user_id :bigint(8) not null +# id :integer not null, primary key +# user_id :integer not null # visible :boolean default(TRUE), not null # name :string default(""), not null -# size :bigint(8) +# size :integer # latitude :float # longitude :float # timestamp :datetime not null # description :string default(""), not null # inserted :boolean not null # visibility :enum default("public"), not null -# length :bigint(8) # # Indexes # @@ -39,9 +38,8 @@ class Trace < ActiveRecord::Base scope :tagged, ->(t) { joins(:tags).where(:gpx_file_tags => { :tag => t }) } validates :user, :presence => true, :associated => true - validates :name, :presence => true, :length => 1..255 - validates :name, :description, :invalid_chars => true - validates :description, :presence => { :on => :create }, :length => 1..255 + validates :name, :presence => true, :length => 1..255, :characters => true + validates :description, :presence => { :on => :create }, :length => 1..255, :characters => true validates :timestamp, :presence => true validates :visibility, :inclusion => %w[private public trackable identifiable] @@ -112,15 +110,15 @@ class Trace < ActiveRecord::Base end def large_picture_name - "#{GPX_IMAGE_DIR}/#{id}.gif" + "#{Settings.gpx_image_dir}/#{id}.gif" end def icon_picture_name - "#{GPX_IMAGE_DIR}/#{id}_icon.gif" + "#{Settings.gpx_image_dir}/#{id}_icon.gif" end def trace_name - "#{GPX_TRACE_DIR}/#{id}.gpx" + "#{Settings.gpx_trace_dir}/#{id}.gpx" end def mime_type @@ -282,7 +280,7 @@ class Trace < ActiveRecord::Base def import logger.info("GPX Import importing #{name} (#{id}) from #{user.email}") - gpx = GPX::File.new(xml_file) + gpx = ::GPX::File.new(xml_file) f_lat = 0 f_lon = 0 @@ -291,6 +289,8 @@ class Trace < ActiveRecord::Base # If there are any existing points for this trace then delete them Tracepoint.where(:gpx_id => id).delete_all + # Gather the trace points together for a bulk import + tracepoints = [] gpx.points do |point| if first f_lat = point.latitude @@ -305,9 +305,16 @@ class Trace < ActiveRecord::Base tp.timestamp = point.timestamp tp.gpx_id = id tp.trackid = point.segment - tp.save! + tracepoints << tp end + # Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import + tracepoints.each do |tp| + tp.run_callbacks(:save) { false } + tp.run_callbacks(:create) { false } + end + Tracepoint.import(tracepoints) + if gpx.actual_points.positive? max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude) min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)