]> git.openstreetmap.org Git - rails.git/blob - app/models/changeset.rb
Removing the in_world test from the model since it is included in the geo_record...
[rails.git] / app / models / changeset.rb
1 class Changeset < ActiveRecord::Base
2   require 'xml/libxml'
3
4   belongs_to :user
5
6   has_many :changeset_tags, :foreign_key => 'id'
7
8   def self.from_xml(xml, create=false)
9     begin
10       p = XML::Parser.new
11       p.string = xml
12       doc = p.parse
13
14       cs = Changeset.new
15
16       doc.find('//osm/changeset').each do |pt|
17         if create
18           cs.created_at = Time.now
19         end
20
21         pt.find('tag').each do |tag|
22           cs.add_tag_keyval(tag['k'], tag['v'])
23         end
24       end
25     rescue Exception => ex
26     print "noes "+ ex.to_s + "\n"
27       cs = nil
28     end
29
30     return cs
31   end
32
33   def tags
34     unless @tags
35       @tags = {}
36       self.changeset_tags.each do |tag|
37         @tags[tag.k] = tag.v
38       end
39     end
40     @tags
41   end
42
43   def tags=(t)
44     @tags = t
45   end
46
47   def add_tag_keyval(k, v)
48     @tags = Hash.new unless @tags
49     @tags[k] = v
50   end
51
52   def save_with_tags!
53     t = Time.now
54
55     Changeset.transaction do
56       # fixme update modified_at time?
57       self.save!
58     end
59
60     ChangesetTag.transaction do
61       tags = self.tags
62       ChangesetTag.delete_all(['id = ?', self.id])
63
64       tags.each do |k,v|
65         tag = ChangesetTag.new
66         tag.k = k
67         tag.v = v
68         tag.id = self.id
69         tag.save!
70       end
71     end
72   end
73   
74   def to_xml
75     doc = OSM::API.new.get_xml_doc
76     doc.root << to_xml_node()
77     return doc
78   end
79   def to_xml_node(user_display_name_cache = nil)
80     el1 = XML::Node.new 'changeset'
81     el1['id'] = self.id.to_s
82
83     user_display_name_cache = {} if user_display_name_cache.nil?
84
85     if user_display_name_cache and user_display_name_cache.key?(self.user_id)
86       # use the cache if available
87     elsif self.user.data_public?
88       user_display_name_cache[self.user_id] = self.user.display_name
89     else
90       user_display_name_cache[self.user_id] = nil
91     end
92
93     el1['user'] = user_display_name_cache[self.user_id] unless user_display_name_cache[self.user_id].nil?
94
95     self.tags.each do |k,v|
96       el2 = XML::Node.new('tag')
97       el2['k'] = k.to_s
98       el2['v'] = v.to_s
99       el1 << el2
100     end
101     
102     el1['created_at'] = self.created_at.xmlschema
103     el1['open'] = self.open.to_s
104
105     # FIXME FIXME FIXME: This does not include changes yet! There is 
106     # currently no changeset_id column in the tables as far as I can tell,
107     # so this is just a scaffold to build on, not a complete to_xml
108
109     return el1
110   end
111 end