+ @property
+ def progress_percent(self):
+ if not self.target:
+ return 0
+ return (self.progress or 0) / self.target * 100
+
+ @property
+ def progress_percent_pretty(self):
+ return int(self.progress_percent)
+
+ def update_progress(self):
+ if not self.since or not self.until or not self.target:
+ return
+ Schedule = apps.get_model('club', 'Schedule')
+ PayUOrder = apps.get_model('club', 'PayUOrder')
+ progress = PayUOrder.objects.filter(
+ completed_at__gte=self.since,
+ completed_at__lte=self.until,
+ ).aggregate(c=models.Sum('schedule__amount'))['c']
+
+ for schedule in Schedule.objects.filter(
+ method='paypal',
+ expires_at__gt=self.since
+ ):
+ progress += schedule.n_paypal_payments(self.since, self.until) * schedule.amount
+ self.progress = progress
+ self.save(update_fields=['progress'])
+
+ @classmethod
+ def update_all_progress(cls):
+ for obj in cls.objects.exclude(target=None).exclude(until__lt=now()):
+ obj.update_progress()
+