|
@@ -1,10 +1,15 @@
|
|
|
|
|
|
|
|
|
from __future__ import unicode_literals
|
|
|
+
|
|
|
+import datetime
|
|
|
+from datetime import datetime
|
|
|
from django.db import models
|
|
|
from django.db.models import Q
|
|
|
from django.conf import settings
|
|
|
from django.utils import timezone
|
|
|
+from django.db.models import Count, Q
|
|
|
+from coin.offers.models import OfferSubscription
|
|
|
|
|
|
from .fields import MACAddressField
|
|
|
|
|
@@ -21,8 +26,8 @@ class ItemType(models.Model):
|
|
|
|
|
|
|
|
|
class ItemQuerySet(models.QuerySet):
|
|
|
- def _get_borrowed_pks(self):
|
|
|
- return Loan.objects.running().values_list('item', flat=True)
|
|
|
+ def _get_borrowed_pks(self, at_date=None):
|
|
|
+ return Loan.objects.running(at_date).values_list('item', flat=True)
|
|
|
|
|
|
def available(self):
|
|
|
return self.exclude(
|
|
@@ -41,7 +46,21 @@ class ItemQuerySet(models.QuerySet):
|
|
|
Q(pk__in=self._get_borrowed_pks()) |
|
|
|
Q(deployed=True))
|
|
|
|
|
|
+ def summary_item(self):
|
|
|
+ """ Agregates as a count of items per designation
|
|
|
+ """
|
|
|
+ return self.values('designation').annotate(count_item=Count('designation'))
|
|
|
+
|
|
|
+ def running(self, at_date=None):
|
|
|
+ """ Only item at a given date or deployed
|
|
|
+ """
|
|
|
+ if at_date is None:
|
|
|
+ at_date = timezone.now()
|
|
|
+
|
|
|
+ return self.filter(Q(pk__in=self._get_borrowed_pks(at_date)) |
|
|
|
+ Q(deployed=True))
|
|
|
|
|
|
+
|
|
|
class Item(models.Model):
|
|
|
type = models.ForeignKey(ItemType, verbose_name='type de matériel',
|
|
|
related_name='items')
|
|
@@ -124,13 +143,18 @@ class Item(models.Model):
|
|
|
class LoanQuerySet(models.QuerySet):
|
|
|
|
|
|
@staticmethod
|
|
|
- def _running_filter():
|
|
|
+ def _running_filter(at_date=None):
|
|
|
+ if at_date is None:
|
|
|
+ at_date = timezone.now()
|
|
|
+ else:
|
|
|
+ at_date = timezone.make_aware(datetime.strptime(at_date, "%Y-%m-%d"))
|
|
|
return (
|
|
|
models.Q(loan_date_end__gt=timezone.now()) |
|
|
|
- models.Q(loan_date_end__isnull=True))
|
|
|
+ models.Q(loan_date_end__isnull=True) &
|
|
|
+ models.Q(loan_date__lt=at_date))
|
|
|
|
|
|
- def running(self):
|
|
|
- return self.filter(self._running_filter())
|
|
|
+ def running(self, at_date=None):
|
|
|
+ return self.filter(self._running_filter(at_date))
|
|
|
|
|
|
def finished(self):
|
|
|
return self.exclude(self._running_filter())
|
|
@@ -145,6 +169,8 @@ class Loan(models.Model):
|
|
|
loan_date_end = models.DateTimeField(verbose_name='date de fin de prêt',
|
|
|
null=True, blank=True)
|
|
|
notes = models.TextField(null=True, blank=True)
|
|
|
+ offer_subscription = models.ForeignKey(OfferSubscription, verbose_name='Abonnement',
|
|
|
+ related_name='loans', blank=True, null=True)
|
|
|
|
|
|
def __unicode__(self):
|
|
|
return 'prêt de {item} à {user}'.format(
|