You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.1 KiB
116 lines
4.1 KiB
from xml.dom import Node
|
|
import django_filters
|
|
from django.db.models import Max, F, Q
|
|
from django.contrib.auth import get_user_model
|
|
from django.contrib import admin
|
|
from django.utils import timezone
|
|
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
from .models import Activity, Prospect, Status, DeclinationReason
|
|
|
|
User = get_user_model()
|
|
|
|
class ProspectFilter(django_filters.FilterSet):
|
|
zip_code = django_filters.CharFilter(lookup_expr='istartswith', label='Code postal')
|
|
activities = django_filters.ModelMultipleChoiceFilter(
|
|
queryset=Activity.objects.all(),
|
|
field_name='activities',
|
|
)
|
|
city = django_filters.CharFilter(lookup_expr='icontains', label='Ville')
|
|
name = django_filters.CharFilter(method='filter_name', label='Nom')
|
|
|
|
def filter_name(self, queryset, name, value):
|
|
return queryset.filter(
|
|
Q(first_name__icontains=value) | Q(last_name__icontains=value) | Q(entity_name__icontains=value)
|
|
)
|
|
|
|
class Meta:
|
|
model = Prospect
|
|
fields = ['name', 'city', 'activities', 'zip_code']
|
|
|
|
class StaffUserFilter(admin.SimpleListFilter):
|
|
title = 'staff user'
|
|
parameter_name = 'user'
|
|
|
|
def lookups(self, request, model_admin):
|
|
staff_users = User.objects.filter(is_staff=True)
|
|
return [(user.id, user.username) for user in staff_users]
|
|
|
|
def queryset(self, request, queryset):
|
|
# Filter the queryset based on the selected user ID
|
|
if self.value():
|
|
return queryset.filter(related_user__id=self.value())
|
|
return queryset
|
|
|
|
class ProspectProfileFilter(admin.SimpleListFilter):
|
|
title = 'Prospect profiles' # displayed in the admin UI
|
|
parameter_name = 'profile' # URL parameter
|
|
|
|
def lookups(self, request, model_admin):
|
|
return (
|
|
('tournament_at_least_1_month_old', 'tournaments > 1 month old'),
|
|
('no_tournaments', 'No tournaments'),
|
|
)
|
|
|
|
def queryset(self, request, queryset):
|
|
if not self.value():
|
|
return queryset
|
|
|
|
two_months_ago = timezone.now().date() - relativedelta(months=2)
|
|
|
|
if self.value() == 'tournament_at_least_2_month_old':
|
|
return queryset.filter(
|
|
official_user__isnull=False,
|
|
official_user__events__creation_date__lte=two_months_ago
|
|
)
|
|
elif self.value() == 'no_tournaments':
|
|
return queryset.filter(
|
|
official_user__isnull=False,
|
|
official_user__events__isnull=True
|
|
)
|
|
|
|
class ProspectStatusFilter(admin.SimpleListFilter):
|
|
title = 'Status'
|
|
parameter_name = 'status'
|
|
|
|
def lookups(self, request, model_admin):
|
|
return [(tag.name, tag.value) for tag in Status]
|
|
|
|
def queryset(self, request, queryset):
|
|
if self.value() == Status.NONE:
|
|
return queryset.filter(activities__isnull=True)
|
|
elif self.value():
|
|
# Get prospects whose most recent activity has the selected status
|
|
return queryset.filter(
|
|
activities__status=self.value()
|
|
).annotate(
|
|
latest_activity_date=Max('activities__creation_date')
|
|
).filter(
|
|
activities__creation_date=F('latest_activity_date'),
|
|
activities__status=self.value()
|
|
).distinct()
|
|
else:
|
|
return queryset
|
|
|
|
class ProspectDeclineReasonFilter(admin.SimpleListFilter):
|
|
title = 'Decline reason'
|
|
parameter_name = 'reason'
|
|
|
|
def lookups(self, request, model_admin):
|
|
return [(tag.name, tag.value) for tag in DeclinationReason]
|
|
|
|
|
|
def queryset(self, request, queryset):
|
|
if self.value():
|
|
# Get prospects whose most recent activity has the selected status
|
|
return queryset.filter(
|
|
activities__declination_reason=self.value()
|
|
).annotate(
|
|
latest_activity_date=Max('activities__creation_date')
|
|
).filter(
|
|
activities__creation_date=F('latest_activity_date'),
|
|
activities__declination_reason=self.value()
|
|
).distinct()
|
|
else:
|
|
return queryset
|
|
|