- commit
- 40c1272ab93353616be20ca2cbec43a96f9d38e0
- parent
- b583b90962b79f6052c736c77d02378fb1e9dff7
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2019-08-22 23:06
add validation
Diffstat
| M | rebelstuff/models.py | 40 | ++++++++++++++++++++++++++++++++++++++-- |
1 files changed, 38 insertions, 2 deletions
diff --git a/rebelstuff/models.py b/rebelstuff/models.py
@@ -1,5 +1,6 @@ 1 1 import datetime 2 2 -1 3 from django.core.exceptions import ValidationError 3 4 from django.db import models 4 5 from django.utils.translation import gettext_lazy as _ 5 6 @@ -12,8 +13,9 @@ class Stuff(models.Model): 12 13 def __str__(self): 13 14 return self.name 14 1515 -1 def available(self):16 -1 day = datetime.date.today()-1 16 def available(self, day=None, exclude_item_pk=None): -1 17 if day is None: -1 18 day = datetime.date.today() 17 19 18 20 items = BookingItem.objects.filter( 19 21 booking__start__lte=day, @@ -21,6 +23,9 @@ class Stuff(models.Model): 21 23 stuff=self, 22 24 ) 23 25 -1 26 if exclude_item_pk: -1 27 items = items.exclude(pk=exclude_item_pk) -1 28 24 29 agg = items.aggregate(models.Sum('amount')) 25 30 booked = agg['amount__sum'] or 0 26 31 return self.amount - booked @@ -38,8 +43,39 @@ class Booking(models.Model): 38 43 def __str__(self): 39 44 return self.name 40 45 -1 46 def clean(self): -1 47 if not self.start or not self.end: -1 48 return -1 49 -1 50 if self.end < self.start: -1 51 raise ValidationError({ -1 52 'end': _('Cannot be before start.'), -1 53 }) -1 54 -1 55 def iter_days(self): -1 56 day = self.start -1 57 while day <= self.end: -1 58 yield day -1 59 day += datetime.timedelta(days=1) -1 60 41 61 42 62 class BookingItem(models.Model): 43 63 booking = models.ForeignKey(Booking, on_delete=models.CASCADE) 44 64 stuff = models.ForeignKey(Stuff, on_delete=models.CASCADE) 45 65 amount = models.PositiveIntegerField(_('Amount')) -1 66 -1 67 def clean(self): -1 68 if not self.stuff or not self.amount: -1 69 return -1 70 -1 71 if not self.booking.start or not self.booking.end: -1 72 return -1 73 -1 74 available = min( -1 75 self.stuff.available(day, self.pk) -1 76 for day in self.booking.iter_days() -1 77 ) -1 78 if self.amount > available: -1 79 raise ValidationError( -1 80 _('Not enough of this stuff. Only %i left.') % available, -1 81 )