+
+ ##
+ # set the auto-close time to be one hour in the future unless
+ # that would make it more than 24h long, in which case clip to
+ # 24h, as this has been decided is a reasonable time limit.
+ def update_closed_at
+ if self.is_open?
+ if (closed_at - created_at) > (MAX_TIME_OPEN - IDLE_TIMEOUT)
+ self.closed_at = created_at + MAX_TIME_OPEN
+ else
+ self.closed_at = Time.now.getutc + IDLE_TIMEOUT
+ end
+ end
+ end
+
+ def to_xml(include_discussion = false)
+ doc = OSM::API.new.get_xml_doc
+ doc.root << to_xml_node(nil, include_discussion)
+ return doc
+ end
+
+ def to_xml_node(user_display_name_cache = nil, include_discussion = false)
+ el1 = XML::Node.new 'changeset'
+ el1['id'] = self.id.to_s
+
+ user_display_name_cache = {} if user_display_name_cache.nil?
+
+ if user_display_name_cache and user_display_name_cache.key?(self.user_id)
+ # use the cache if available
+ elsif self.user.data_public?
+ user_display_name_cache[self.user_id] = self.user.display_name
+ else
+ user_display_name_cache[self.user_id] = nil
+ end
+
+ el1['user'] = user_display_name_cache[self.user_id] unless user_display_name_cache[self.user_id].nil?
+ el1['uid'] = self.user_id.to_s if self.user.data_public?
+
+ self.tags.each do |k,v|
+ el2 = XML::Node.new('tag')
+ el2['k'] = k.to_s
+ el2['v'] = v.to_s
+ el1 << el2
+ end
+
+ el1['created_at'] = self.created_at.xmlschema
+ el1['closed_at'] = self.closed_at.xmlschema unless is_open?
+ el1['open'] = is_open?.to_s
+
+ if bbox.complete?
+ bbox.to_unscaled.add_bounds_to(el1, '_')
+ end
+
+ el1['comments_count'] = self.comments.count.to_s
+
+ if include_discussion
+ el2 = XML::Node.new('discussion')
+ self.comments.includes(:author).each do |comment|
+ el3 = XML::Node.new('comment')
+ el3['date'] = comment.created_at.xmlschema
+ el3['uid'] = comment.author.id.to_s if comment.author.data_public?
+ el3['user'] = comment.author.display_name.to_s if comment.author.data_public?
+ el4 = XML::Node.new('text')
+ el4.content = comment.body.to_s
+ el3 << el4
+ el2 << el3
+ end
+ el1 << el2
+ end
+
+ # NOTE: changesets don't include the XML of the changes within them,
+ # they are just structures for tagging. to get the osmChange of a
+ # changeset, see the download method of the controller.
+
+ return el1
+ end
+
+ ##
+ # update this instance from another instance given and the user who is
+ # doing the updating. note that this method is not for updating the
+ # bounding box, only the tags of the changeset.
+ def update_from(other, user)
+ # ensure that only the user who opened the changeset may modify it.
+ unless user.id == self.user_id
+ raise OSM::APIUserChangesetMismatchError.new
+ end
+
+ # can't change a closed changeset
+ unless is_open?
+ raise OSM::APIChangesetAlreadyClosedError.new(self)
+ end
+
+ # copy the other's tags
+ self.tags = other.tags
+
+ save_with_tags!
+ end