]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/way.rb
Improve handling of login/logout some more to improve the chances of
[rails.git] / app / models / way.rb
index b7d0ec118f92bf3c4e5e239173e7179d842527d3..090c7a739f9bf7344d237528d9460024c6550186 100644 (file)
@@ -50,22 +50,46 @@ class Way < ActiveRecord::Base
     return doc
   end
 
-  def to_xml_node
+  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
-    el1['user'] = self.user.display_name if self.user.data_public?
-    # make sure segments are output in sequence_id order\r
-    ordered_segments = []\r
-    self.way_segments.each do |seg| \r
-      ordered_segments[seg.sequence_id] = seg.segment_id.to_s
-    end\r
-    ordered_segments.each do |seg_id|\r
-      e = XML::Node.new 'seg'\r
-      e['id'] = seg_id\r
-      el1 << e\r
-    end\r
+
+    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'
@@ -76,7 +100,6 @@ class Way < ActiveRecord::Base
     return el1
   end 
 
-
   def segs
     unless @segs
         @segs = Array.new