+
+ validates_presence_of :id, :on => :update
+ validates_presence_of :user_id, :created_at, :closed_at, :num_changes
+ validates_uniqueness_of :id
+ validates_numericality_of :id, :on => :update, :integer_only => true
+ validates_numericality_of :min_lat, :max_lat, :min_lon, :max_lat, :allow_nil => true, :integer_only => true
+ validates_numericality_of :user_id, :integer_only => true, :greater_than_or_equal_to => 1
+ validates_numericality_of :num_changes, :integer_only => true, :greater_than_or_equal_to => 0
+ validates_associated :user
+
+ # over-expansion factor to use when updating the bounding box
+ EXPAND = 0.1
+
+ # maximum number of elements allowed in a changeset
+ MAX_ELEMENTS = 50000
+
+ # maximum time a changeset is allowed to be open for (note that this
+ # is in days - so one hour is Rational(1,24)).
+ MAX_TIME_OPEN = 1
+
+ # idle timeout increment, one hour as a rational number of days.
+ # NOTE: DO NOT CHANGE THIS TO 1.hour! when this was done the idle
+ # timeout changed to 1 second, which meant all changesets closed
+ # almost immediately.
+ IDLE_TIMEOUT = Rational(1,24)
+
+ # Use a method like this, so that we can easily change how we
+ # determine whether a changeset is open, without breaking code in at
+ # least 6 controllers
+ def is_open?
+ # a changeset is open (that is, it will accept further changes) when
+ # it has not yet run out of time and its capacity is small enough.
+ # note that this may not be a hard limit - due to timing changes and
+ # concurrency it is possible that some changesets may be slightly
+ # longer than strictly allowed or have slightly more changes in them.
+ return ((closed_at > DateTime.now) and (num_changes <= MAX_ELEMENTS))
+ end