SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit d34535c1 authored by Jorran de Wit's avatar Jorran de Wit
Browse files

Improve queries

parent bc821ba2
No related branches found
No related tags found
No related merge requests found
...@@ -52,23 +52,25 @@ class ContributorQuerySet(models.QuerySet): ...@@ -52,23 +52,25 @@ class ContributorQuerySet(models.QuerySet):
Returns only potential duplicate Contributors (as identified by first and Returns only potential duplicate Contributors (as identified by first and
last names). last names).
Admins and superusers are explicitly excluded. Admins and superusers are explicitly excluded.
Be careful: This query may have a big impact on performance.
""" """
contribs = self.active().exclude(user__is_superuser=True).exclude(user__is_staff=True contribs = self.active().exclude(user__is_superuser=True).exclude(
).annotate(full_name=Concat('user__last_name', 'user__first_name')) user__is_staff=True).annotate(full_name=Concat('user__last_name', 'user__first_name'))
duplicates = contribs.values('full_name').annotate( duplicates = contribs.values('full_name').annotate(
nr_count=Count('full_name')).filter(nr_count__gt=1) nr_count=Count('full_name')).filter(nr_count__gt=1).values_list('full_name', flat=True)
return contribs.filter(full_name__in=[item['full_name'] for item in duplicates] return contribs.filter(
).order_by('user__last_name', 'user__first_name', '-id') full_name__in=duplicates).order_by('user__last_name', 'user__first_name', '-id')
def with_duplicate_email(self): def with_duplicate_email(self):
""" """
Return Contributors having duplicate emails. Return Contributors having duplicate emails.
""" """
duplicates = self.active().exclude(user__is_superuser=True).exclude(user__is_staff=True qs = self.active().exclude(user__is_superuser=True).exclude(
).values(lower_email=Lower('user__email')).annotate( user__is_staff=True).annotate(lower_email=Lower('user__email'))
Count('id')).order_by('user__last_name').filter(id__count__gt=1) duplicates = qs.values('lower_email').annotate(
return self.annotate(lower_email=Lower('user__email') Count('id')).filter(id__count__gt=1).values_list('lower_email', flat=True)
).filter(lower_email__in=[dup['lower_email'] for dup in duplicates]) return qs.filter(user__email__in=duplicates)
class UnavailabilityPeriodManager(models.Manager): class UnavailabilityPeriodManager(models.Manager):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment