rebelstuff

Keep track of your stuff
git clone https://git.ce9e.org/rebelstuff.git

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    15 
   15    -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             )