from dateutil.relativedelta import relativedelta
from django.db import models, transaction
+from django.db.models import Q
from django.db.models.fields.related import OneToOneRel
from django.urls import reverse
from django.utils.decorators import classproperty
ROLE = 'role'
+class MemberQuerySet(models.QuerySet):
+ def with_active_membership(self):
+ return self.filter(
+ Q(memberships__start__lte=now().date())
+ & (
+ Q(memberships__end__isnull=True)
+ | Q(memberships__end__gte=now().date())
+ )
+ ).order_by('-id').distinct()
+
+
class MemberManager(models.Manager):
def get_queryset(self):
- return super().get_queryset().filter(membership_type=MemberTypes.MEMBER)
+ return MemberQuerySet(self.model, using=self._db).filter(membership_type=MemberTypes.MEMBER)
+
+ def with_active_membership(self):
+ return self.get_queryset().with_active_membership()
class AllMemberManager(models.Manager):
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['member_count'] = Member.objects.all().count()
- context['active_count'] = Membership.objects.filter(
- Q(start__lte=now().date())
- & (Q(end__isnull=True) | Q(end__gte=now().date()))
- ).count()
+ context['active_count'] = Member.objects.with_active_membership().count()
context['stats'] = get_member_statistics()
return context
form_class = MemberBalanceForm
def form_valid(self, form):
- members = (
- Member.objects.filter(
- Q(memberships__start__lte=now().date())
- & (
- Q(memberships__end__isnull=True)
- | Q(memberships__end__gte=now().date())
- )
- )
- .order_by('-id')
- .distinct()
- )
+ members = Member.objects.with_active_membership()
mails = errors = balance_count = 0
start = datetime.combine(form.cleaned_data.get('start'), time(0, 0))
end = datetime.combine(form.cleaned_data.get('end'), time(23, 59))