]> git.openstreetmap.org Git - rails.git/blob - app/models/old_node.rb
Reuse the map_bug_comment table as a more general history table of map_bugs including...
[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   # Should probably have the composite primary key set in the model
8   # however there are some weird bugs happening when you do
9   #set_primary_keys :id, :version
10   
11   validates_presence_of :changeset_id, :timestamp
12   validates_inclusion_of :visible, :in => [ true, false ]
13   validates_numericality_of :latitude, :longitude
14   validate :validate_position
15   validates_associated :changeset
16
17   belongs_to :changeset
18  
19   def validate_position
20     errors.add_to_base("Node is not in the world") unless in_world?
21   end
22
23   def self.from_node(node)
24     old_node = OldNode.new
25     old_node.latitude = node.latitude
26     old_node.longitude = node.longitude
27     old_node.visible = node.visible
28     old_node.tags = node.tags
29     old_node.timestamp = node.timestamp
30     old_node.changeset_id = node.changeset_id
31     old_node.id = node.id
32     old_node.version = node.version
33     return old_node
34   end
35   
36   def to_xml
37     doc = OSM::API.new.get_xml_doc
38     doc.root << to_xml_node()
39     return doc
40   end
41
42   def to_xml_node
43     el1 = XML::Node.new 'node'
44     el1['id'] = self.id.to_s
45     el1['lat'] = self.lat.to_s
46     el1['lon'] = self.lon.to_s
47     el1['changeset'] = self.changeset.id.to_s
48     if self.changeset.user.data_public?
49       el1['user'] = self.changeset.user.display_name
50       el1['uid'] = self.changeset.user.id.to_s
51     end
52
53     self.tags.each do |k,v|
54       el2 = XML::Node.new('tag')
55       el2['k'] = k.to_s
56       el2['v'] = v.to_s
57       el1 << el2
58     end
59
60     el1['visible'] = self.visible.to_s
61     el1['timestamp'] = self.timestamp.xmlschema
62     el1['version'] = self.version.to_s
63     return el1
64   end
65
66   def save_with_dependencies!
67     save!
68     #not sure whats going on here
69     clear_aggregation_cache
70     clear_association_cache
71     #ok from here
72     @attributes.update(OldNode.find(:first, :conditions => ['id = ? AND timestamp = ? AND version = ?', self.id, self.timestamp, self.version]).instance_variable_get('@attributes'))
73    
74     self.tags.each do |k,v|
75       tag = OldNodeTag.new
76       tag.k = k
77       tag.v = v
78       tag.id = self.id
79       tag.version = self.version
80       tag.save!
81     end
82   end
83
84   def tags
85     unless @tags
86         @tags = Hash.new
87         OldNodeTag.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version]).each do |tag|
88             @tags[tag.k] = tag.v
89         end
90     end
91     @tags = Hash.new unless @tags
92     @tags
93   end
94
95   def tags=(t)
96     @tags = t 
97   end
98
99   def tags_as_hash 
100     return self.tags
101   end 
102  
103   # Pretend we're not in any ways 
104   def ways 
105     return [] 
106   end 
107  
108   # Pretend we're not in any relations 
109   def containing_relation_members 
110     return [] 
111   end 
112 end