|
@@ -1,6 +1,10 @@
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
from __future__ import unicode_literals
|
|
|
+
|
|
|
+import datetime
|
|
|
+import pytz
|
|
|
+from datetime import datetime
|
|
|
from django.db import models
|
|
|
from django.db.models import Q
|
|
|
from django.conf import settings
|
|
@@ -23,8 +27,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(
|
|
@@ -48,6 +52,16 @@ class ItemQuerySet(models.QuerySet):
|
|
|
"""
|
|
|
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')
|
|
@@ -130,13 +144,21 @@ 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:
|
|
|
+ # todo : change by default timezone in settings ?
|
|
|
+ at_date = pytz.timezone('Europe/Paris').localize(datetime.strptime(at_date, "%Y-%m-%d"))
|
|
|
return (
|
|
|
+ # avant : prêt dont la date de fin > aujourd'hui | null
|
|
|
+ # maintenant : prêt dont la date de début est < date donnée
|
|
|
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())
|