Merge 12304:14009 from trunk.
[rails.git] / app / models / old_node.rb
1 class OldNode < ActiveRecord::Base
2   include GeoRecord
3   include ConsistencyValidations
4
5   set_table_name 'nodes'
6   
7   validates_presence_of :changeset_id, :timestamp
8   validates_inclusion_of :visible, :in => [ true, false ]
9   validates_numericality_of :latitude, :longitude
10   validate :validate_position
11   validates_associated :changeset
12
13   belongs_to :changeset
14  
15   def validate_position
16     errors.add_to_base("Node is not in the world") unless in_world?
17   end
18
19   def self.from_node(node)
20     old_node = OldNode.new
21     old_node.latitude = node.latitude
22     old_node.longitude = node.longitude
23     old_node.visible = node.visible
24     old_node.tags = node.tags
25     old_node.timestamp = node.timestamp
26     old_node.changeset_id = node.changeset_id
27     old_node.id = node.id
28     old_node.version = node.version
29     return old_node
30   end
31   
32   def to_xml
33     doc = OSM::API.new.get_xml_doc
34     doc.root << to_xml_node()
35     return doc
36   end
37
38   def to_xml_node
39     el1 = XML::Node.new 'node'
40     el1['id'] = self.id.to_s
41     el1['lat'] = self.lat.to_s
42     el1['lon'] = self.lon.to_s
43     el1['changeset'] = self.changeset.id.to_s
44     if self.changeset.user.data_public?
45       el1['user'] = self.changeset.user.display_name
46       el1['uid'] = self.changeset.user.id.to_s
47     end
48
49     self.tags.each do |k,v|
50       el2 = XML::Node.new('tag')
51       el2['k'] = k.to_s
52       el2['v'] = v.to_s
53       el1 << el2
54     end
55
56     el1['visible'] = self.visible.to_s
57     el1['timestamp'] = self.timestamp.xmlschema
58     el1['version'] = self.version.to_s
59     return el1
60   end
61
62   def save_with_dependencies!
63     save!
64     #not sure whats going on here
65     clear_aggregation_cache
66     clear_association_cache
67     #ok from here
68     @attributes.update(OldNode.find(:first, :conditions => ['id = ? AND timestamp = ? AND version = ?', self.id, self.timestamp, self.version]).instance_variable_get('@attributes'))
69    
70     self.tags.each do |k,v|
71       tag = OldNodeTag.new
72       tag.k = k
73       tag.v = v
74       tag.id = self.id
75       tag.version = self.version
76       tag.save!
77     end
78   end
79
80   def tags
81     unless @tags
82         @tags = Hash.new
83         OldNodeTag.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version]).each do |tag|
84             @tags[tag.k] = tag.v
85         end
86     end
87     @tags = Hash.new unless @tags
88     @tags
89   end
90
91   def tags=(t)
92     @tags = t 
93   end
94
95   def tags_as_hash 
96     return self.tags
97   end 
98  
99   # Pretend we're not in any ways 
100   def ways 
101     return [] 
102   end 
103  
104   # Pretend we're not in any relations 
105   def containing_relation_members 
106     return [] 
107   end 
108 end