Add autocomplete search to "add payment" and add search bar to table views

This commit is contained in:
Jan Tuomi
2017-09-25 21:55:49 +03:00
parent 7ce28c3a48
commit 982e6bf928
10 changed files with 229 additions and 126 deletions
Binary file not shown.
+75 -58
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-25 13:38+0300\n" "POT-Creation-Date: 2017-09-25 21:32+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -184,12 +184,12 @@ msgid "Language"
msgstr "Language" msgstr "Language"
#: infoscreen/templates/infoscreen_admin.html:161 #: infoscreen/templates/infoscreen_admin.html:161
#: members/templates/settings.html:20 sikweb/base.py:214 #: members/templates/settings.html:20 sikweb/base.py:216
msgid "Finnish" msgid "Finnish"
msgstr "Finnish" msgstr "Finnish"
#: infoscreen/templates/infoscreen_admin.html:162 #: infoscreen/templates/infoscreen_admin.html:162
#: members/templates/settings.html:21 sikweb/base.py:215 #: members/templates/settings.html:21 sikweb/base.py:217
msgid "English" msgid "English"
msgstr "English" msgstr "English"
@@ -200,56 +200,56 @@ msgstr "English"
msgid "Submit" msgid "Submit"
msgstr "Submitted" msgstr "Submitted"
#: members/forms.py:97 members/tables.py:32 #: members/forms.py:103 members/tables.py:32
msgid "Member" msgid "Member"
msgstr "Member" msgstr "Member"
#: members/models.py:14 #: members/models.py:13
msgid "First name" msgid "First name"
msgstr "First name" msgstr "First name"
#: members/models.py:15 #: members/models.py:14
msgid "Last name" msgid "Last name"
msgstr "Last name" msgstr "Last name"
#: members/models.py:16 webapp/models.py:95 webapp/models.py:108 #: members/models.py:15 webapp/models.py:95 webapp/models.py:108
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
#: members/models.py:17 #: members/models.py:16
msgid "Place of residence" msgid "Place of residence"
msgstr "Place of residence" msgstr "Place of residence"
#: members/models.py:19 members/models.py:84 #: members/models.py:18 members/models.py:83
#: members/templates/member_add_many.html:35 #: members/templates/member_add_many.html:35
msgid "AYY" msgid "AYY"
msgstr "AYY" msgstr "AYY"
#: members/models.py:20 #: members/models.py:19
msgid "JAS" msgid "JAS"
msgstr "JAS" msgstr "JAS"
#: members/models.py:70 #: members/models.py:69
msgid "Submitted" msgid "Submitted"
msgstr "Submitted" msgstr "Submitted"
#: members/models.py:82 #: members/models.py:81
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
#: members/models.py:83 #: members/models.py:82
msgid "Source" msgid "Source"
msgstr "Source" msgstr "Source"
#: members/models.py:85 #: members/models.py:84
msgid "Cash" msgid "Cash"
msgstr "Cash" msgstr "Cash"
#: members/models.py:86 members/templates/member_add_many.html:36 #: members/models.py:85 members/templates/member_add_many.html:36
msgid "Bank transfer" msgid "Bank transfer"
msgstr "Bank transfer" msgstr "Bank transfer"
#: members/models.py:103 #: members/models.py:102
msgid "Created" msgid "Created"
msgstr "Created" msgstr "Created"
@@ -294,7 +294,7 @@ msgid "Add member"
msgstr "Add member" msgstr "Add member"
#: members/templates/member_add.html:15 members/templates/member_edit.html:18 #: members/templates/member_add.html:15 members/templates/member_edit.html:18
#: members/templates/payment_add.html:15 members/templates/payment_edit.html:18 #: members/templates/payment_add.html:20 members/templates/payment_edit.html:18
msgid "Save" msgid "Save"
msgstr "Save" msgstr "Save"
@@ -390,7 +390,15 @@ msgstr "Member register"
msgid "Members in register:" msgid "Members in register:"
msgstr "Member register" msgstr "Member register"
#: members/templates/member_list.html:27 #: members/templates/member_list.html:28 members/templates/payment_list.html:25
msgid "Search"
msgstr ""
#: members/templates/member_list.html:36 members/templates/payment_list.html:33
msgid "Showing results for"
msgstr ""
#: members/templates/member_list.html:44
msgid "Download CSV" msgid "Download CSV"
msgstr "Download CSV" msgstr "Download CSV"
@@ -411,7 +419,7 @@ msgstr "Add multiple"
msgid "List payments" msgid "List payments"
msgstr "List payments" msgstr "List payments"
#: members/templates/members_base.html:63 members/templates/payment_add.html:8 #: members/templates/members_base.html:63 members/templates/payment_add.html:13
msgid "Add payment" msgid "Add payment"
msgstr "Add payment" msgstr "Add payment"
@@ -439,82 +447,91 @@ msgstr "Edit payment"
msgid "Payment events" msgid "Payment events"
msgstr "Payment events" msgstr "Payment events"
#: members/views.py:138 members/views.py:209 members/views.py:235 #: members/templates/payment_list.html:18
msgid "No member id specified" #, fuzzy
msgstr "No member id specified" #| msgid "Member register"
msgid "Payments in register:"
msgstr "Member register"
#: members/views.py:164 #: members/views/applications.py:49 members/views/applications.py:96
msgid "Successfully added member" #: members/views/applications.py:124
msgstr "Successfully added member"
#: members/views.py:189
msgid "Successfully updated member"
msgstr "Successfully updated member"
#: members/views.py:197
msgid "Could not update member object"
msgstr "Could not update member object"
#: members/views.py:213
msgid "Successfully deleted member"
msgstr "Successfully deleted member"
#: members/views.py:224
msgid "Could not delete member object"
msgstr "Could not delete member object"
#: members/views.py:273 members/views.py:320 members/views.py:348
msgid "No application id specified" msgid "No application id specified"
msgstr "No application id specified" msgstr "No application id specified"
#: members/views.py:301 #: members/views/applications.py:77
msgid "Successfully accepted application" msgid "Successfully accepted application"
msgstr "Successfully accepted application" msgstr "Successfully accepted application"
#: members/views.py:308 #: members/views/applications.py:84
msgid "Could not accept application object" msgid "Could not accept application object"
msgstr "Could not accept application object" msgstr "Could not accept application object"
#: members/views.py:324 #: members/views/applications.py:100
msgid "Successfully deleted application" msgid "Successfully deleted application"
msgstr "Successfully deleted application" msgstr "Successfully deleted application"
#: members/views.py:336 #: members/views/applications.py:112
msgid "Could not delete application object" msgid "Could not delete application object"
msgstr "Could not delete application object" msgstr "Could not delete application object"
#: members/views.py:413 #: members/views/members.py:70 members/views/members.py:163
#: members/views/members.py:189
msgid "No member id specified"
msgstr "No member id specified"
#: members/views/members.py:105
msgid "Failed to import members"
msgstr "Failed to import members"
#: members/views/members.py:118
msgid "Successfully added member"
msgstr "Successfully added member"
#: members/views/members.py:143
msgid "Successfully updated member"
msgstr "Successfully updated member"
#: members/views/members.py:151
msgid "Could not update member object"
msgstr "Could not update member object"
#: members/views/members.py:167
msgid "Successfully deleted member"
msgstr "Successfully deleted member"
#: members/views/members.py:178
msgid "Could not delete member object"
msgstr "Could not delete member object"
#: members/views/payments.py:69
msgid "Successfully added payment for member" msgid "Successfully added payment for member"
msgstr "Successfully added payment for member" msgstr "Successfully added payment for member"
#: members/views.py:431 members/views.py:449 members/views.py:468 #: members/views/payments.py:87 members/views/payments.py:105
#: members/views/payments.py:124
msgid "No payment id specified" msgid "No payment id specified"
msgstr "No payment id specified" msgstr "No payment id specified"
#: members/views.py:473 #: members/views/payments.py:129
msgid "Successfully deleted payment" msgid "Successfully deleted payment"
msgstr "Successfully deleted payment" msgstr "Successfully deleted payment"
#: members/views.py:483 #: members/views/payments.py:139
msgid "Could not delete payment object" msgid "Could not delete payment object"
msgstr "Could not delete payment object" msgstr "Could not delete payment object"
#: members/views.py:502 #: members/views/payments.py:158
msgid "Successfully updated payment" msgid "Successfully updated payment"
msgstr "Successfully updated payment" msgstr "Successfully updated payment"
#: members/views.py:509 #: members/views/payments.py:165
msgid "Could not update payment object" msgid "Could not update payment object"
msgstr "Could not update payment object" msgstr "Could not update payment object"
#: members/views.py:531 #: members/views/utils.py:110
msgid "Missing \"textfield\" POST request field" msgid "Missing \"textfield\" POST request field"
msgstr "Missing \"textfield\" POST request field" msgstr "Missing \"textfield\" POST request field"
#: members/views.py:583
msgid "Failed to import members"
msgstr "Failed to import members"
#: templates/footer.html:7 #: templates/footer.html:7
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
Binary file not shown.
+73 -58
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-25 13:38+0300\n" "POT-Creation-Date: 2017-09-25 21:32+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -183,12 +183,12 @@ msgid "Language"
msgstr "Kieli" msgstr "Kieli"
#: infoscreen/templates/infoscreen_admin.html:161 #: infoscreen/templates/infoscreen_admin.html:161
#: members/templates/settings.html:20 sikweb/base.py:214 #: members/templates/settings.html:20 sikweb/base.py:216
msgid "Finnish" msgid "Finnish"
msgstr "suomi" msgstr "suomi"
#: infoscreen/templates/infoscreen_admin.html:162 #: infoscreen/templates/infoscreen_admin.html:162
#: members/templates/settings.html:21 sikweb/base.py:215 #: members/templates/settings.html:21 sikweb/base.py:217
msgid "English" msgid "English"
msgstr "englanti" msgstr "englanti"
@@ -197,56 +197,56 @@ msgstr "englanti"
msgid "Submit" msgid "Submit"
msgstr "Lisää" msgstr "Lisää"
#: members/forms.py:97 members/tables.py:32 #: members/forms.py:103 members/tables.py:32
msgid "Member" msgid "Member"
msgstr "Jäsen" msgstr "Jäsen"
#: members/models.py:14 #: members/models.py:13
msgid "First name" msgid "First name"
msgstr "Etunimi" msgstr "Etunimi"
#: members/models.py:15 #: members/models.py:14
msgid "Last name" msgid "Last name"
msgstr "Sukunimi" msgstr "Sukunimi"
#: members/models.py:16 webapp/models.py:95 webapp/models.py:108 #: members/models.py:15 webapp/models.py:95 webapp/models.py:108
msgid "Email" msgid "Email"
msgstr "Sähköposti" msgstr "Sähköposti"
#: members/models.py:17 #: members/models.py:16
msgid "Place of residence" msgid "Place of residence"
msgstr "Asuinpaikka" msgstr "Asuinpaikka"
#: members/models.py:19 members/models.py:84 #: members/models.py:18 members/models.py:83
#: members/templates/member_add_many.html:35 #: members/templates/member_add_many.html:35
msgid "AYY" msgid "AYY"
msgstr "AYY" msgstr "AYY"
#: members/models.py:20 #: members/models.py:19
msgid "JAS" msgid "JAS"
msgstr "JAS" msgstr "JAS"
#: members/models.py:70 #: members/models.py:69
msgid "Submitted" msgid "Submitted"
msgstr "Lisätty" msgstr "Lisätty"
#: members/models.py:82 #: members/models.py:81
msgid "Date" msgid "Date"
msgstr "Päivämäärä" msgstr "Päivämäärä"
#: members/models.py:83 #: members/models.py:82
msgid "Source" msgid "Source"
msgstr "Lähde" msgstr "Lähde"
#: members/models.py:85 #: members/models.py:84
msgid "Cash" msgid "Cash"
msgstr "Käteinen" msgstr "Käteinen"
#: members/models.py:86 members/templates/member_add_many.html:36 #: members/models.py:85 members/templates/member_add_many.html:36
msgid "Bank transfer" msgid "Bank transfer"
msgstr "Tilisiirto" msgstr "Tilisiirto"
#: members/models.py:103 #: members/models.py:102
msgid "Created" msgid "Created"
msgstr "Lisätty" msgstr "Lisätty"
@@ -291,7 +291,7 @@ msgid "Add member"
msgstr "Lisää jäsen" msgstr "Lisää jäsen"
#: members/templates/member_add.html:15 members/templates/member_edit.html:18 #: members/templates/member_add.html:15 members/templates/member_edit.html:18
#: members/templates/payment_add.html:15 members/templates/payment_edit.html:18 #: members/templates/payment_add.html:20 members/templates/payment_edit.html:18
msgid "Save" msgid "Save"
msgstr "Tallenna" msgstr "Tallenna"
@@ -382,7 +382,15 @@ msgstr "Jäsenrekisteri"
msgid "Members in register:" msgid "Members in register:"
msgstr "Jäseniä:" msgstr "Jäseniä:"
#: members/templates/member_list.html:27 #: members/templates/member_list.html:28 members/templates/payment_list.html:25
msgid "Search"
msgstr "Hae"
#: members/templates/member_list.html:36 members/templates/payment_list.html:33
msgid "Showing results for"
msgstr "Näytetään tulokset haulle"
#: members/templates/member_list.html:44
msgid "Download CSV" msgid "Download CSV"
msgstr "Lataa CSV" msgstr "Lataa CSV"
@@ -403,7 +411,7 @@ msgstr "Lisää useita"
msgid "List payments" msgid "List payments"
msgstr "Maksulistaus" msgstr "Maksulistaus"
#: members/templates/members_base.html:63 members/templates/payment_add.html:8 #: members/templates/members_base.html:63 members/templates/payment_add.html:13
msgid "Add payment" msgid "Add payment"
msgstr "Lisää maksu" msgstr "Lisää maksu"
@@ -431,82 +439,89 @@ msgstr "Muokkaa maksua"
msgid "Payment events" msgid "Payment events"
msgstr "Maksutapahtumat" msgstr "Maksutapahtumat"
#: members/views.py:138 members/views.py:209 members/views.py:235 #: members/templates/payment_list.html:18
msgid "No member id specified" msgid "Payments in register:"
msgstr "Jäsenen ID ei määritelty" msgstr "Maksutapahtumia:"
#: members/views.py:164 #: members/views/applications.py:49 members/views/applications.py:96
msgid "Successfully added member" #: members/views/applications.py:124
msgstr "Onnistuneesti lisättiin jäsen"
#: members/views.py:189
msgid "Successfully updated member"
msgstr "Onnistuneesti päivitettiin jäsen"
#: members/views.py:197
msgid "Could not update member object"
msgstr "Jäsenobjektia ei voitu päivittää"
#: members/views.py:213
msgid "Successfully deleted member"
msgstr "Onnistuneesti poistettiin jäsen"
#: members/views.py:224
msgid "Could not delete member object"
msgstr "Jäsenobjektia ei voitu poistaa"
#: members/views.py:273 members/views.py:320 members/views.py:348
msgid "No application id specified" msgid "No application id specified"
msgstr "Hakemuksen ID ei määritelty" msgstr "Hakemuksen ID ei määritelty"
#: members/views.py:301 #: members/views/applications.py:77
msgid "Successfully accepted application" msgid "Successfully accepted application"
msgstr "Onnistuneesti hyväksyttiin hakemus" msgstr "Onnistuneesti hyväksyttiin hakemus"
#: members/views.py:308 #: members/views/applications.py:84
msgid "Could not accept application object" msgid "Could not accept application object"
msgstr "Hakemusobjektia ei voitu hyväksyä" msgstr "Hakemusobjektia ei voitu hyväksyä"
#: members/views.py:324 #: members/views/applications.py:100
msgid "Successfully deleted application" msgid "Successfully deleted application"
msgstr "Onnistuneesti poistettiin hakemus" msgstr "Onnistuneesti poistettiin hakemus"
#: members/views.py:336 #: members/views/applications.py:112
msgid "Could not delete application object" msgid "Could not delete application object"
msgstr "Hakemusobjektia ei voitu poistaa" msgstr "Hakemusobjektia ei voitu poistaa"
#: members/views.py:413 #: members/views/members.py:70 members/views/members.py:163
#: members/views/members.py:189
msgid "No member id specified"
msgstr "Jäsenen ID ei määritelty"
#: members/views/members.py:105
msgid "Failed to import members"
msgstr "Jäsenten tuonti epäonnistui"
#: members/views/members.py:118
msgid "Successfully added member"
msgstr "Onnistuneesti lisättiin jäsen"
#: members/views/members.py:143
msgid "Successfully updated member"
msgstr "Onnistuneesti päivitettiin jäsen"
#: members/views/members.py:151
msgid "Could not update member object"
msgstr "Jäsenobjektia ei voitu päivittää"
#: members/views/members.py:167
msgid "Successfully deleted member"
msgstr "Onnistuneesti poistettiin jäsen"
#: members/views/members.py:178
msgid "Could not delete member object"
msgstr "Jäsenobjektia ei voitu poistaa"
#: members/views/payments.py:69
msgid "Successfully added payment for member" msgid "Successfully added payment for member"
msgstr "Onnistuneesti lisättiin maksutapahtuma jäsenelle" msgstr "Onnistuneesti lisättiin maksutapahtuma jäsenelle"
#: members/views.py:431 members/views.py:449 members/views.py:468 #: members/views/payments.py:87 members/views/payments.py:105
#: members/views/payments.py:124
msgid "No payment id specified" msgid "No payment id specified"
msgstr "Maksutapahtuman ID ei määritelty" msgstr "Maksutapahtuman ID ei määritelty"
#: members/views.py:473 #: members/views/payments.py:129
msgid "Successfully deleted payment" msgid "Successfully deleted payment"
msgstr "Onnistuneesti poistettiin maksutapahtuma" msgstr "Onnistuneesti poistettiin maksutapahtuma"
#: members/views.py:483 #: members/views/payments.py:139
msgid "Could not delete payment object" msgid "Could not delete payment object"
msgstr "Maksutapahtumaobjektia ei voitu poistaa" msgstr "Maksutapahtumaobjektia ei voitu poistaa"
#: members/views.py:502 #: members/views/payments.py:158
msgid "Successfully updated payment" msgid "Successfully updated payment"
msgstr "Onnistuneesti päivitettiin maksutapahtuma" msgstr "Onnistuneesti päivitettiin maksutapahtuma"
#: members/views.py:509 #: members/views/payments.py:165
msgid "Could not update payment object" msgid "Could not update payment object"
msgstr "Maksutapahtumaobjektia ei voitu päivittää" msgstr "Maksutapahtumaobjektia ei voitu päivittää"
#: members/views.py:531 #: members/views/utils.py:110
msgid "Missing \"textfield\" POST request field" msgid "Missing \"textfield\" POST request field"
msgstr "Puuttuva \"textfield\" POST-kenttä" msgstr "Puuttuva \"textfield\" POST-kenttä"
#: members/views.py:583
msgid "Failed to import members"
msgstr "Jäsenten tuonti epäonnistui"
#: templates/footer.html:7 #: templates/footer.html:7
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
+17
View File
@@ -21,6 +21,23 @@
<span>{% trans "Members in register:" %} {{ member_count }}</span> <span>{% trans "Members in register:" %} {{ member_count }}</span>
</div> </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 }} {{ table|safe }}
<div> <div>
+21
View File
@@ -14,6 +14,27 @@
</div> </div>
{% endif %} {% 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 }} {{ table|safe }}
</div> </div>
{% endblock content %} {% endblock content %}
+21 -5
View File
@@ -12,9 +12,11 @@ class MemberRegisterTestCase(TestCase):
def setUp(self): def setUp(self):
"""Setup testing environment by creating member and admin.""" """Setup testing environment by creating member and admin."""
memb = Member.objects.create(first_name="Tidus", last_name="Tester") memb = Member.objects.create(first_name="Tidus", last_name="Tester")
username, password = 'test_admin', 'password123'
test_admin = User.objects.create_superuser( test_admin = User.objects.create_superuser(
'test_admin', 'myemail@test.com', 'password123') username, 'myemail@test.com', password)
self.c = Client() self.c = Client()
self.c.login(username=username, password=password)
def test_member_created(self): def test_member_created(self):
"""Test member creation.""" """Test member creation."""
@@ -24,13 +26,27 @@ class MemberRegisterTestCase(TestCase):
def test_import_csv_single_line(self): def test_import_csv_single_line(self):
"""Test csv import only with single line in csv file.""" """Test csv import only with single line in csv file."""
data = 'Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0' data = 'Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0'
response = self.c.post('/members/import_csv', {'textarea': data}) response = self.c.post('/members/import_csv', {'textarea': data}, follow=True)
self.assertIn(response.status_code, [200, 302]) self.assertEqual(response.status_code, 200)
def test_import_csv_multi_line(self): def test_import_csv_multi_line(self):
"""Test csv import with multilined csv.""" """Test csv import with multilined csv."""
data = ('Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0\n' data = ('Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0\n'
'Reiska, Remontti, remontti@reiska.fi, Värisilmä, 1, 1') 'Reiska, Remontti, remontti@reiska.fi, Värisilmä, 1, 1')
response = self.c.post('/members/import_csv', {'textarea': data}) response = self.c.post('/members/import_csv', {'textarea': data}, follow=True)
self.assertIn(response.status_code, [200, 302]) 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
View File
@@ -40,6 +40,10 @@ from members.views import application_form_success
favicon_view = RedirectView.as_view( favicon_view = RedirectView.as_view(
url='static/img/favicon.ico', permanent=True) url='static/img/favicon.ico', permanent=True)
member_autocomplete_view = login_required(
permission_required('members.change_member', login_url='/login')(MemberAutoComplete.as_view())
)
urlpatterns = [ urlpatterns = [
# landing page # landing page
@@ -117,7 +121,7 @@ urlpatterns = [
# member select autocomplete view # member select autocomplete view
url( url(
r'^member-autocomplete/$', r'^member-autocomplete/$',
permission_required('members.change_member')(MemberAutoComplete.as_view()), member_autocomplete_view,
name='member-autocomplete', name='member-autocomplete',
), ),
+10 -3
View File
@@ -1,5 +1,6 @@
from django.shortcuts import render from django.shortcuts import render
from django.contrib.auth.decorators import permission_required 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.http import require_http_methods
from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
@@ -24,7 +25,13 @@ from members.views.utils import *
@permission_required('members.change_member', login_url='/login') @permission_required('members.change_member', login_url='/login')
def member_list(request, *args, **kwargs): def member_list(request, *args, **kwargs):
"""Render members list.""" """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, table = MemberTable(members,
request=request, request=request,
@@ -33,7 +40,6 @@ def member_list(request, *args, **kwargs):
table.paginate(page=request.GET.get('page', 1), per_page=25) table.paginate(page=request.GET.get('page', 1), per_page=25)
table_html = convert_table_to_html(table, request) table_html = convert_table_to_html(table, request)
context = { context = {
'table': table_html, 'table': table_html,
'member_count': len(members), 'member_count': len(members),
@@ -187,12 +193,13 @@ def member_edit(request, *args, **kwargs):
class MemberAutoComplete(autocomplete.Select2QuerySetView): class MemberAutoComplete(autocomplete.Select2QuerySetView):
def get_queryset(self): def get_queryset(self):
qs = Member.objects.all() qs = Member.objects.all()
if self.q: if self.q:
firsts = qs.filter(first_name__istartswith=self.q) firsts = qs.filter(first_name__istartswith=self.q)
lasts = qs.filter(last_name__istartswith=self.q) lasts = qs.filter(last_name__istartswith=self.q)
qs = firsts.union(lasts) qs = firsts | lasts
return qs return qs
+7 -1
View File
@@ -21,7 +21,13 @@ from members.forms import PaymentForm
@permission_required('members.change_member', login_url='/login') @permission_required('members.change_member', login_url='/login')
def payment_list(request, *args, **kwargs): def payment_list(request, *args, **kwargs):
"""Render list of payments.""" """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, table = PaymentTable(payments,
request=request, request=request,