+ @classmethod
+ def get_active(cls):
+ n = now()
+ return cls.objects.exclude(start__gt=n).exclude(end__lt=n)
+
+ def has_progress(self):
+ return self.target is not None and self.start is not None and self.end is not None
+
+ @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.start or not self.end 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.start,
+ completed_at__lte=self.end,
+ ).aggregate(c=models.Sum('schedule__amount'))['c'] or 0
+
+ for schedule in Schedule.objects.filter(
+ method='paypal',
+ expires_at__gt=self.start
+ ):
+ progress += schedule.n_paypal_payments(self.start, self.end) * schedule.amount
+ self.progress = progress
+ self.save(update_fields=['progress'])
+
+ @classmethod
+ def update_all_progress(cls):
+ n = now()
+ for obj in cls.get_active().exclude(target=None):
+ obj.update_progress()
+