From a3cdef8570f8ada1130b193f026c430ebad4fc03 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 8 May 2017 23:49:33 +0100 Subject: [PATCH] Tidy up the querying and move into model This should really be in the model not in the view --- RIGS/finance.py | 11 ++--------- RIGS/models.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/RIGS/finance.py b/RIGS/finance.py index 00786c62..fbec7028 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -31,15 +31,8 @@ class InvoiceIndex(generic.ListView): return context def get_queryset(self): - query = self.model.objects.annotate( - _sum_total=Sum(F('event__items__cost') * F('event__items__quantity'), output_field=FloatField()), - _payment_count=Count('payment'), - _payment_total=Sum('payment__amount'), - ).filter( - Q(_sum_total__gt=0.0, _payment_count=0) | - Q(_sum_total__lt=Value('_payment_total'), _sum_total__gt=Value('_payment_total')) - ).select_related('event', 'event__organisation', 'event__person', 'event__venue', 'event__mic') - + query = self.model.objects.outstanding().select_related('event', 'event__organisation', 'event__person', + 'event__venue', 'event__mic') return query diff --git a/RIGS/models.py b/RIGS/models.py index 6aa16730..7a2e065f 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -501,12 +501,30 @@ class EventCrew(models.Model): notes = models.TextField(blank=True, null=True) +class InvoiceManager(models.Manager): + def outstanding(self): + return self.annotate( + _payment_total=models.Sum(models.F('payment__amount')) + ).annotate( + _sum_total=models.Sum(models.F('event__items__cost') * models.F('event__items__quantity'), + output_field=models.DecimalField(decimal_places=2)) + # ).annotate( + # _balance=models.ExpressionWrapper(models.F('_sum_total') - models.F('_payment_total'), + # models.DecimalField(decimal_places=2)) + # ).filter( + # models.Q(_balance__isnull=True) | + # ~models.Q(_sum_total=models.F('_payment_total')) + ) + + @python_2_unicode_compatible class Invoice(models.Model): event = models.OneToOneField('Event') invoice_date = models.DateField(auto_now_add=True) void = models.BooleanField(default=False) + objects = InvoiceManager() + @property def sum_total(self): if getattr(self, '_sum_total', None):