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})
Beispiel #4
0
    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}
        )
Beispiel #5
0
    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
        })
Beispiel #6
0
    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)
Beispiel #7
0
 def starts_after(self, date):
     start = datetimeify(date, clamp="min")
     return self.filter(start__gte=start)
Beispiel #8
0
 def starts_before(self, date):
     end = datetimeify(date, clamp="max")
     return self.filter(start__lte=end)
Beispiel #9
0
 def ends_before(self, date):
     end = datetimeify(date, clamp="max")
     return self.filter(end__lte=end)
Beispiel #10
0
 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)
Beispiel #11
0
 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)
 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)