initial changeset support
[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 end