From d3e763aa057d75e32a139b3e2bd17d6d64a8abbd Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 25 Sep 2017 23:06:44 +0300 Subject: [PATCH] Fix search logic for full names --- members/models.py | 39 +++++++++++++++------------------------ members/views/members.py | 8 ++------ members/views/payments.py | 4 +--- 3 files changed, 18 insertions(+), 33 deletions(-) diff --git a/members/models.py b/members/models.py index aaf9c80..6cd4dc3 100644 --- a/members/models.py +++ b/members/models.py @@ -3,6 +3,7 @@ from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ +from django.db.models import Q import csv @@ -27,30 +28,6 @@ class BaseMember(models.Model): """Return member last name, first name and email.""" return "{} {}, {}".format(self.last_name, self.first_name, self.email) - @staticmethod - def from_csv(data): - clean_data = data.strip().split('\n') - csv_reader = csv.reader(clean_data) - - members = [] - for line in csv_reader: - try: - line = list(map(lambda x: x.strip(), line)) - print(line) - - member = Member.from_array([ - line[0], line[1], line[2], line[3], - bool(int(line[4])), bool(int(line[5])) - ]) - members.append(member) - except: - return False - - for member in members: - member.save() - - return True - def as_array(self): """Return member model as an array.""" return [ @@ -95,6 +72,13 @@ class Payment(models.Model): """Return payment id and date.""" return 'Payment no. {}, {}'.format(self.id, str(self.date)) + @staticmethod + def find_payments_by_name(query_name): + qs = Payment.objects.all() + for term in query_name.split(): + qs = qs.filter(Q(member__first_name__icontains=term) | Q(member__last_name__icontains=term)) + return qs + class Member(BaseMember): """Member model represets one member on the registry.""" @@ -126,6 +110,13 @@ class Member(BaseMember): jas=bool(array[5]), ) + @staticmethod + def find_members_by_name(query_name): + qs = Member.objects.all() + for term in query_name.split(): + qs = qs.filter(Q(first_name__icontains=term) | Q(last_name__icontains=term)) + return qs + # To avoid problems with a cyclical import, this is at the bottom of the file from members.forms import MemberForm # nopep8 diff --git a/members/views/members.py b/members/views/members.py index 18c8325..7c61fd4 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -27,9 +27,7 @@ def member_list(request, *args, **kwargs): """Render members list.""" search = request.GET.get('q', None) if search: - firsts = Member.objects.filter(first_name__istartswith=search) - lasts = Member.objects.filter(last_name__istartswith=search) - members = firsts | lasts + members = Member.find_members_by_name(search) else: members = Member.objects.all() @@ -198,8 +196,6 @@ class MemberAutoComplete(autocomplete.Select2QuerySetView): qs = Member.objects.all() if self.q: - firsts = qs.filter(first_name__istartswith=self.q) - lasts = qs.filter(last_name__istartswith=self.q) - qs = firsts | lasts + qs = Member.find_members_by_name(self.q) return qs diff --git a/members/views/payments.py b/members/views/payments.py index be1a12e..b5f22af 100644 --- a/members/views/payments.py +++ b/members/views/payments.py @@ -23,9 +23,7 @@ def payment_list(request, *args, **kwargs): """Render list of payments.""" search = request.GET.get('q', None) if search: - firsts = Payment.objects.filter(member__first_name__istartswith=search) - lasts = Payment.objects.filter(member__last_name__istartswith=search) - payments = firsts | lasts + payments = Payment.find_payments_by_name(search) else: payments = Payment.objects.all()