Add autocomplete search to "add payment" and add search bar to table views
This commit is contained in:
@@ -21,6 +21,23 @@
|
||||
<span>{% trans "Members in register:" %} {{ member_count }}</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<form class="input-group" method="GET" action="/members/list">
|
||||
<input class="form-control" type="text" name="q" placeholder="Teemu Teekkari" />
|
||||
<span class="input-group-btn">
|
||||
<input type="submit" class="btn" value="{% trans "Search" %}" />
|
||||
</span>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{% if request.GET.q %}
|
||||
<div>
|
||||
<div class="alert alert-info" role="alert">
|
||||
{% trans "Showing results for" %} "{{ request.GET.q }}"
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{{ table|safe }}
|
||||
|
||||
<div>
|
||||
|
||||
@@ -14,6 +14,27 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="member_count">
|
||||
<span>{% trans "Payments in register:" %} {{ payment_count }}</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<form class="input-group" method="GET" action="/members/payments">
|
||||
<input class="form-control" type="text" name="q" placeholder="Teemu Teekkari" />
|
||||
<span class="input-group-btn">
|
||||
<input type="submit" class="btn" value="{% trans "Search" %}" />
|
||||
</span>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{% if request.GET.q %}
|
||||
<div>
|
||||
<div class="alert alert-info" role="alert">
|
||||
{% trans "Showing results for" %} "{{ request.GET.q }}"
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{{ table|safe }}
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
+21
-5
@@ -12,9 +12,11 @@ class MemberRegisterTestCase(TestCase):
|
||||
def setUp(self):
|
||||
"""Setup testing environment by creating member and admin."""
|
||||
memb = Member.objects.create(first_name="Tidus", last_name="Tester")
|
||||
username, password = 'test_admin', 'password123'
|
||||
test_admin = User.objects.create_superuser(
|
||||
'test_admin', 'myemail@test.com', 'password123')
|
||||
username, 'myemail@test.com', password)
|
||||
self.c = Client()
|
||||
self.c.login(username=username, password=password)
|
||||
|
||||
def test_member_created(self):
|
||||
"""Test member creation."""
|
||||
@@ -24,13 +26,27 @@ class MemberRegisterTestCase(TestCase):
|
||||
def test_import_csv_single_line(self):
|
||||
"""Test csv import only with single line in csv file."""
|
||||
data = 'Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0'
|
||||
response = self.c.post('/members/import_csv', {'textarea': data})
|
||||
self.assertIn(response.status_code, [200, 302])
|
||||
response = self.c.post('/members/import_csv', {'textarea': data}, follow=True)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_import_csv_multi_line(self):
|
||||
"""Test csv import with multilined csv."""
|
||||
data = ('Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0\n'
|
||||
'Reiska, Remontti, remontti@reiska.fi, Värisilmä, 1, 1')
|
||||
|
||||
response = self.c.post('/members/import_csv', {'textarea': data})
|
||||
self.assertIn(response.status_code, [200, 302])
|
||||
response = self.c.post('/members/import_csv', {'textarea': data}, follow=True)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_autocomplete_search_found(self):
|
||||
"""Test member autocomplete search"""
|
||||
search_terms = 'Tidus'
|
||||
response = self.c.get('/members/member-autocomplete?q={}'.format(search_terms), follow=True)
|
||||
results = response.json()['results']
|
||||
self.assertEqual(len(results), 1)
|
||||
|
||||
def test_autocomplete_search_not_found(self):
|
||||
"""Test member autocomplete search"""
|
||||
search_terms = 'Notfound'
|
||||
response = self.c.get('/members/member-autocomplete?q={}'.format(search_terms), follow=True)
|
||||
results = response.json()['results']
|
||||
self.assertEqual(len(results), 0)
|
||||
|
||||
+5
-1
@@ -40,6 +40,10 @@ from members.views import application_form_success
|
||||
favicon_view = RedirectView.as_view(
|
||||
url='static/img/favicon.ico', permanent=True)
|
||||
|
||||
member_autocomplete_view = login_required(
|
||||
permission_required('members.change_member', login_url='/login')(MemberAutoComplete.as_view())
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
# landing page
|
||||
@@ -117,7 +121,7 @@ urlpatterns = [
|
||||
# member select autocomplete view
|
||||
url(
|
||||
r'^member-autocomplete/$',
|
||||
permission_required('members.change_member')(MemberAutoComplete.as_view()),
|
||||
member_autocomplete_view,
|
||||
name='member-autocomplete',
|
||||
),
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from django.shortcuts import render
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.views.decorators.http import require_http_methods
|
||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
@@ -24,7 +25,13 @@ from members.views.utils import *
|
||||
@permission_required('members.change_member', login_url='/login')
|
||||
def member_list(request, *args, **kwargs):
|
||||
"""Render members list."""
|
||||
members = Member.objects.all()
|
||||
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
|
||||
else:
|
||||
members = Member.objects.all()
|
||||
|
||||
table = MemberTable(members,
|
||||
request=request,
|
||||
@@ -33,7 +40,6 @@ def member_list(request, *args, **kwargs):
|
||||
|
||||
table.paginate(page=request.GET.get('page', 1), per_page=25)
|
||||
table_html = convert_table_to_html(table, request)
|
||||
|
||||
context = {
|
||||
'table': table_html,
|
||||
'member_count': len(members),
|
||||
@@ -187,12 +193,13 @@ def member_edit(request, *args, **kwargs):
|
||||
|
||||
|
||||
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)
|
||||
qs = firsts | lasts
|
||||
|
||||
return qs
|
||||
|
||||
@@ -21,7 +21,13 @@ from members.forms import PaymentForm
|
||||
@permission_required('members.change_member', login_url='/login')
|
||||
def payment_list(request, *args, **kwargs):
|
||||
"""Render list of payments."""
|
||||
payments = Payment.objects.all()
|
||||
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
|
||||
else:
|
||||
payments = Payment.objects.all()
|
||||
|
||||
table = PaymentTable(payments,
|
||||
request=request,
|
||||
|
||||
Reference in New Issue
Block a user