X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/222d31e435f003ec59e84860d2fa5129449f69de..1bbe59b6a77030c362f9991083aa7c06799b272d:/app/models/way.rb diff --git a/app/models/way.rb b/app/models/way.rb index 2773ecc7b..090c7a739 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -2,6 +2,12 @@ class Way < ActiveRecord::Base require 'xml/libxml' belongs_to :user + + has_many :way_segments, :foreign_key => 'id' + has_many :way_tags, :foreign_key => 'id' + + has_many :old_ways, :foreign_key => :id + set_table_name 'current_ways' def self.from_xml(xml, create=false) @@ -32,23 +38,96 @@ class Way < ActiveRecord::Base pt.find('seg').each do |seg| way.add_seg_num(seg['id']) end - end return way end + def to_xml + doc = OSM::API.new.get_xml_doc + doc.root << to_xml_node() + return doc + end + + def to_xml_node(visible_segments = nil, user_display_name_cache = nil) + el1 = XML::Node.new 'way' + el1['id'] = self.id.to_s + el1['visible'] = self.visible.to_s + el1['timestamp'] = self.timestamp.xmlschema + + user_display_name_cache = {} if user_display_name_cache.nil? + + if user_display_name_cache and user_display_name_cache[self.user_id] + # use the cache if available + else + user_display_name_cache[self.user_id] = self.user.display_name + end + + #el1['user'] = self.user.display_name if self.user.data_public? + el1['user'] = user_display_name_cache[self.user_id] + + # make sure segments are output in sequence_id order + ordered_segments = [] + self.way_segments.each do |seg| + if visible_segments + # if there is a list of visible segments then use that to weed out deleted segments + if visible_segments[seg.segment_id] + ordered_segments[seg.sequence_id] = seg.segment_id.to_s + end + else + # otherwise, manually go to the db to check things + if seg.segment.visible? and seg.segment.from_node.visible? and seg.segment.to_node.visible? + ordered_segments[seg.sequence_id] = seg.segment_id.to_s + end + end + end + + ordered_segments.each do |seg_id| + if seg_id and seg_id != '0' + e = XML::Node.new 'seg' + e['id'] = seg_id + el1 << e + end + end + + self.way_tags.each do |tag| + e = XML::Node.new 'tag' + e['k'] = tag.k + e['v'] = tag.v + el1 << e + end + return el1 + end + def segs - @segs = Array.new unless @segs + unless @segs + @segs = Array.new + self.way_segments.each do |seg| + @segs += [seg.segment_id] + end + end @segs end def tags - @tags = Hash.new unless @tags + unless @tags + @tags = Hash.new + self.way_tags.each do |tag| + @tags[tag.k] = tag.v + end + end @tags end + def segs=(s) + @segs = s + end + + def tags=(t) + @tags = t + end + def add_seg_num(n) @segs = Array.new unless @segs @segs << n.to_i @@ -74,8 +153,31 @@ class Way < ActiveRecord::Base tag.save end + WaySegment.delete_all(['id = ?', self.id]) + + i = 0 + self.segs.each do |n| + seg = WaySegment.new + seg.id = self.id + seg.segment_id = n + seg.sequence_id = i + seg.save + i += 1 + end + old_way = OldWay.from_way(self) - old_way.save + old_way.timestamp = t + old_way.save_with_dependencies + end + + def preconditions_ok? + self.segs.each do |n| + segment = Segment.find(n) + unless segment and segment.visible and segment.preconditions_ok? + return false + end + end + return true end end