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