From 7ce28c3a489edbf441da6bc93fa2f2555f9ff3c7 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 25 Sep 2017 20:45:13 +0300 Subject: [PATCH] Add autocomplete widget and fix some errors --- members/forms.py | 8 +++++++- members/templates/payment_add.html | 8 ++++++++ members/urls.py | 11 +++++++++++ members/views/applications.py | 3 +++ members/views/members.py | 18 +++++++++++++++++- members/views/payments.py | 5 ++++- members/views/utils.py | 2 ++ requirements.txt | 1 + sikweb/base.py | 2 ++ 9 files changed, 55 insertions(+), 3 deletions(-) diff --git a/members/forms.py b/members/forms.py index eb49a83..67f4754 100644 --- a/members/forms.py +++ b/members/forms.py @@ -1,13 +1,14 @@ """File containing member forms.""" from django import forms +from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from members.models import Member, Payment, Request import csv -from django.utils import timezone import logging +from dal import autocomplete class CSVValidationError(Exception): @@ -88,6 +89,11 @@ class MemberForm(forms.ModelForm): class PaymentForm(forms.ModelForm): """Payment model form.""" + member = forms.ModelChoiceField( + queryset=Member.objects.all(), + widget=autocomplete.ModelSelect2(url='member-autocomplete') + ) + class Meta: """Meta for Payment model form.""" diff --git a/members/templates/payment_add.html b/members/templates/payment_add.html index d1f75b2..90bca77 100644 --- a/members/templates/payment_add.html +++ b/members/templates/payment_add.html @@ -4,6 +4,11 @@ {% load i18n %} {% block content %} + +

{% trans "Add payment" %}

@@ -18,4 +23,7 @@
+ +{{ form.media }} + {% endblock content %} diff --git a/members/urls.py b/members/urls.py index 664e5cd..8cae5f8 100644 --- a/members/urls.py +++ b/members/urls.py @@ -1,6 +1,7 @@ """File containing Member application URLs.""" from django.conf.urls import url +from django.contrib.auth.decorators import login_required, permission_required from django.views.generic.base import RedirectView # members @@ -20,6 +21,9 @@ from members.views import member_delete from members.views import payment_list from members.views import add_many_confirm +# autocomplete view +from members.views import MemberAutoComplete + # rest api from members.views import MemberDetail @@ -110,4 +114,11 @@ urlpatterns = [ # rest api url url(r'^api/members/(?P\d+)$', MemberDetail.as_view()), + # member select autocomplete view + url( + r'^member-autocomplete/$', + permission_required('members.change_member')(MemberAutoComplete.as_view()), + name='member-autocomplete', + ), + ] diff --git a/members/views/applications.py b/members/views/applications.py index 0005c1d..9207fd7 100644 --- a/members/views/applications.py +++ b/members/views/applications.py @@ -8,6 +8,9 @@ from django.conf import settings from django.utils.translation import ugettext as _ from django.forms.models import model_to_dict +import logging +import html + from members.views.utils import * from members.tables import RequestTable from members.forms import ApplicationForm diff --git a/members/views/members.py b/members/views/members.py index d65a5eb..66f43fe 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -7,6 +7,10 @@ from django.core.mail import send_mail from django.conf import settings from django.utils.translation import ugettext as _ from django.forms.models import model_to_dict +from dal import autocomplete + +import logging +import html from members.models import Member, Request, Payment from members.forms import MemberForm, CSVValidationError @@ -102,7 +106,7 @@ def member_submit(request, *args, **kwargs): if form.is_valid(): form.save() logging.info("Saved new member to member register" - "with the following info: {}".format(form)) + "with the following info: {}".format(form.cleaned_data)) notification = "{} {} {}.".format(_("Successfully added member"), form.cleaned_data['last_name'], form.cleaned_data['first_name']) @@ -180,3 +184,15 @@ def member_edit(request, *args, **kwargs): form = MemberForm(instance=member) return render( request, 'member_edit.html', {'member_id': i, 'form': form}) + + +class MemberAutoComplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + 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.union(lasts) + + return qs diff --git a/members/views/payments.py b/members/views/payments.py index 9a0d0e0..da6c8aa 100644 --- a/members/views/payments.py +++ b/members/views/payments.py @@ -8,6 +8,9 @@ from django.conf import settings from django.utils.translation import ugettext as _ from django.forms.models import model_to_dict +import logging +import html + from members.views.utils import * from members.tables import PaymentTable from members.forms import PaymentForm @@ -55,7 +58,7 @@ def payment_submit(request, *args, **kwargs): form.save() logging.info( "Saved new payment to member register with the following info: {}" - .format(form)) + .format(form.cleaned_data)) notification = "{} {}.".format( _("Successfully added payment for member"), form.cleaned_data['member']) diff --git a/members/views/utils.py b/members/views/utils.py index 35b7b84..eeef43d 100644 --- a/members/views/utils.py +++ b/members/views/utils.py @@ -8,6 +8,8 @@ from django.conf import settings from django.utils.translation import ugettext as _ from django.forms.models import model_to_dict +import logging + # REST framework from members.serializers import MemberSerializer from rest_framework import generics diff --git a/requirements.txt b/requirements.txt index 3c028d5..32dc598 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,3 +26,4 @@ django-modeltranslation==0.12.1 django-auditlog==0.4.3 django-phonenumber-field==1.3.0 paho-mqtt==1.3.0 +django-autocomplete-light==3.2.10 diff --git a/sikweb/base.py b/sikweb/base.py index 6ccab05..e340969 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -64,6 +64,8 @@ LOGGING = { INSTALLED_APPS = [ 'modeltranslation', # has to be before admin for translation admin to work + 'dal', + 'dal_select2', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes',