def clean(self, ExceptionClass=exceptions.ValidationError): if self.event_end is None: self.event_end = self.event_start self.event_start = datetimeify(self.event_start, clamp="min") self.event_end = datetimeify(self.event_end, clamp="max") if self.repeat_until is not None: self.repeat_until = datetimeify(self.repeat_until, clamp="max") if self.event_end.time == time.min: self.event_end.time == time.max if not self.rule_id: raise ExceptionClass('A Rule must be given') if self.event_start > self.event_end: raise ExceptionClass('Start must be earlier than End') if self.repeat_until is not None and \ self.repeat_until < self.event_end: raise ExceptionClass('Repeat until must not be earlier than start') # This data entry mistake is common enough to justify a slight hack. if self.rule.frequency == 'DAILY' \ and self.event_duration() > timedelta(1): raise ExceptionClass( 'Daily events cannot span multiple days; the event start and \ end dates should be the same.') self.is_clean = True super(GeneratorModel, self).clean()
def clean(self, ExceptionClass=exceptions.ValidationError): if self.event_end is None: self.event_end = self.event_start self.event_start = datetimeify(self.event_start, clamp="min") self.event_end = datetimeify(self.event_end, clamp="max") if self.repeat_until is not None: self.repeat_until = datetimeify(self.repeat_until, clamp="max") if self.event_end.time == time.min: self.event_end.time == time.max if not self.rule_id: raise ExceptionClass('A Rule must be given') if self.event_start > self.event_end: raise ExceptionClass('Start must be earlier than End') if self.repeat_until is not None and \ self.repeat_until < self.event_end: raise ExceptionClass( 'Repeat until must not be earlier than start') # This data entry mistake is common enough to justify a slight hack. if self.rule.frequency == 'DAILY' \ and self.event_duration() > timedelta(1): raise ExceptionClass( 'Daily events cannot span multiple days; the event start and \ end dates should be the same.' ) self.is_clean = True super(GeneratorModel, self).clean()
def test_occurrence_create(self): e = ExampleEvent.eventobjects.create(title="event with occurrences") d1 = date(2010,1,1) d2 = date(2010,1,2) d1min = datetimeify(d1, clamp='min') d2min = datetimeify(d2, clamp='min') t1 = time(9,00) t2 = time(10,00) dt1 = datetime.combine(d1, t1) dt2 = datetime.combine(d2, t2) #datetimes o = e.occurrences.create(start=dt1, _duration=24*60+60) self.ae(o.start, dt1) self.ae(o.end(), dt2) o.delete() o = e.occurrences.create(start=dt1) self.ae(o.start, dt1) self.ae(o.end(), dt1) o.delete() o = e.occurrences.create(start=d1min) self.ae(o.start, d1min) self.ae(o.end(), d1min) o.delete() #missing start date self.assertRaises(Exception, e.occurrences.create, **{'_duration': 60}) #invalid start value self.assertRaises(Exception, e.occurrences.create, **{'start':t1}) self.assertRaises(Exception, e.occurrences.create, **{'start':t1, '_duration':60})
def test_creation(self): """ Same date/time constraints as occurrence. Attitionally, it is not valid to have a repeat_until without a rule. """ e = self.bin_night d1 = date(2010,1,1) d2 = date(2010,1,2) d1min = datetimeify(d1, clamp='min') d1max = datetimeify(d1, clamp='max') d2min = datetimeify(d2, clamp='min') d2max = datetimeify(d2, clamp='max') t1 = time(9,00) t2 = time(10,00) dt1 = datetime.combine(d1, t1) dt2 = datetime.combine(d2, t2) #datetimes g = e.generators.create(start=dt1, _duration=60*24+60, rule=self.yearly) self.ae(g.start, dt1) self.ae(g.end(), dt2) g = e.generators.create(start=dt1, rule=self.yearly) self.ae(g.start, dt1) self.ae(g.end(), dt1) g = e.generators.create(start=d1min, rule=self.yearly) self.ae(g.start, d1min) self.ae(g.end(), d1min) # Missing start. self.assertRaises( Exception, e.generators.create, **{'_duration': 60, 'rule': self.yearly} ) # Missing rule. self.assertRaises( Exception, e.generators.create, **{'start':dt1, } ) # Invalid start value. self.assertRaises( Exception, e.generators.create, **{'start':t1, 'rule': self.yearly} )
def test_occurrence_create(self): e = ExampleEvent.eventobjects.create(title="event with occurrences") d1 = date(2010, 1, 1) d2 = date(2010, 1, 2) d1min = datetimeify(d1, clamp='min') d2min = datetimeify(d2, clamp='min') t1 = time(9, 00) t2 = time(10, 00) dt1 = datetime.combine(d1, t1) dt2 = datetime.combine(d2, t2) #datetimes o = e.occurrences.create(start=dt1, _duration=24 * 60 + 60) self.ae(o.start, dt1) self.ae(o.end(), dt2) o.delete() o = e.occurrences.create(start=dt1) self.ae(o.start, dt1) self.ae(o.end(), dt1) o.delete() o = e.occurrences.create(start=d1min) self.ae(o.start, d1min) self.ae(o.end(), d1min) o.delete() #missing start date self.assertRaises(Exception, e.occurrences.create, **{'_duration': 60}) #invalid start value self.assertRaises(Exception, e.occurrences.create, **{'start': t1}) self.assertRaises(Exception, e.occurrences.create, **{ 'start': t1, '_duration': 60 })
def save(self, *args, **kwargs): if self.end is None: self.end = self.start self.start = datetimeify(self.start, clamp="min") self.end = datetimeify(self.end, clamp="max") if self.end.time == time.min: self.end.time == time.max if self.start > self.end: raise AttributeError('start must be earlier than end') #if my time is being changed, or if i'm being detatched from the generator, add the old time to the generator's exceptions. #TODO: add the new time if self.start is in exceptions and durations are equal if getattr(self, 'generator', None) and self.pk: saved_self = type(self).objects.get(pk=self.pk) if self.generator != saved_self.generator or self.start != saved_self.start or self.end != saved_self.end: saved_self.generator.add_exception(saved_self.start) if self.generator is not None and self.generator.is_exception(self.start): if self.duration == self.generator.event_duration: self.generator.remove_exception(self.start) super(OccurrenceModel, self).save(*args, **kwargs)
def starts_after(self, date): start = datetimeify(date, clamp="min") return self.filter(start__gte=start)
def starts_before(self, date): end = datetimeify(date, clamp="max") return self.filter(start__lte=end)
def ends_before(self, date): end = datetimeify(date, clamp="max") return self.filter(end__lte=end)
def starts_after(self, date): start = datetimeify(date, clamp="min") if is_naive(start): start = make_aware(start, get_default_timezone()) return self.filter(start__gte=start)
def starts_before(self, date): end = datetimeify(date, clamp="max") if is_naive(end): end = make_aware(end, get_default_timezone()) return self.filter(start__lte=end)