diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 2808dcf..6364efb 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index ae88ae4..839ce4d 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -184,12 +184,12 @@ msgid "Language" msgstr "Language" #: 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" msgstr "Finnish" #: 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" msgstr "English" @@ -200,56 +200,56 @@ msgstr "English" msgid "Submit" msgstr "Submitted" -#: members/forms.py:97 members/tables.py:32 +#: members/forms.py:103 members/tables.py:32 msgid "Member" msgstr "Member" -#: members/models.py:14 +#: members/models.py:13 msgid "First name" msgstr "First name" -#: members/models.py:15 +#: members/models.py:14 msgid "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" msgstr "Email" -#: members/models.py:17 +#: members/models.py:16 msgid "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 msgid "AYY" msgstr "AYY" -#: members/models.py:20 +#: members/models.py:19 msgid "JAS" msgstr "JAS" -#: members/models.py:70 +#: members/models.py:69 msgid "Submitted" msgstr "Submitted" -#: members/models.py:82 +#: members/models.py:81 msgid "Date" msgstr "Date" -#: members/models.py:83 +#: members/models.py:82 msgid "Source" msgstr "Source" -#: members/models.py:85 +#: members/models.py:84 msgid "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" msgstr "Bank transfer" -#: members/models.py:103 +#: members/models.py:102 msgid "Created" msgstr "Created" @@ -294,7 +294,7 @@ msgid "Add member" msgstr "Add member" #: 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" msgstr "Save" @@ -390,7 +390,15 @@ msgstr "Member register" msgid "Members in 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" msgstr "Download CSV" @@ -411,7 +419,7 @@ msgstr "Add multiple" msgid "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" msgstr "Add payment" @@ -439,82 +447,91 @@ msgstr "Edit payment" msgid "Payment events" msgstr "Payment events" -#: members/views.py:138 members/views.py:209 members/views.py:235 -msgid "No member id specified" -msgstr "No member id specified" +#: members/templates/payment_list.html:18 +#, fuzzy +#| msgid "Member register" +msgid "Payments in register:" +msgstr "Member register" -#: members/views.py:164 -msgid "Successfully added member" -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 +#: members/views/applications.py:49 members/views/applications.py:96 +#: members/views/applications.py:124 msgid "No application id specified" msgstr "No application id specified" -#: members/views.py:301 +#: members/views/applications.py:77 msgid "Successfully accepted application" msgstr "Successfully accepted application" -#: members/views.py:308 +#: members/views/applications.py:84 msgid "Could not accept application object" msgstr "Could not accept application object" -#: members/views.py:324 +#: members/views/applications.py:100 msgid "Successfully deleted application" msgstr "Successfully deleted application" -#: members/views.py:336 +#: members/views/applications.py:112 msgid "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" 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" msgstr "No payment id specified" -#: members/views.py:473 +#: members/views/payments.py:129 msgid "Successfully deleted payment" msgstr "Successfully deleted payment" -#: members/views.py:483 +#: members/views/payments.py:139 msgid "Could not delete payment object" msgstr "Could not delete payment object" -#: members/views.py:502 +#: members/views/payments.py:158 msgid "Successfully updated payment" msgstr "Successfully updated payment" -#: members/views.py:509 +#: members/views/payments.py:165 msgid "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" msgstr "Missing \"textfield\" POST request field" -#: members/views.py:583 -msgid "Failed to import members" -msgstr "Failed to import members" - #: templates/footer.html:7 msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" diff --git a/locale/fi/LC_MESSAGES/django.mo b/locale/fi/LC_MESSAGES/django.mo index c81386c..d57a49a 100644 Binary files a/locale/fi/LC_MESSAGES/django.mo and b/locale/fi/LC_MESSAGES/django.mo differ diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index ae4d24a..2145ded 100644 --- a/locale/fi/LC_MESSAGES/django.po +++ b/locale/fi/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -183,12 +183,12 @@ msgid "Language" msgstr "Kieli" #: 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" msgstr "suomi" #: 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" msgstr "englanti" @@ -197,56 +197,56 @@ msgstr "englanti" msgid "Submit" msgstr "Lisää" -#: members/forms.py:97 members/tables.py:32 +#: members/forms.py:103 members/tables.py:32 msgid "Member" msgstr "Jäsen" -#: members/models.py:14 +#: members/models.py:13 msgid "First name" msgstr "Etunimi" -#: members/models.py:15 +#: members/models.py:14 msgid "Last name" 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" msgstr "Sähköposti" -#: members/models.py:17 +#: members/models.py:16 msgid "Place of residence" 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 msgid "AYY" msgstr "AYY" -#: members/models.py:20 +#: members/models.py:19 msgid "JAS" msgstr "JAS" -#: members/models.py:70 +#: members/models.py:69 msgid "Submitted" msgstr "Lisätty" -#: members/models.py:82 +#: members/models.py:81 msgid "Date" msgstr "Päivämäärä" -#: members/models.py:83 +#: members/models.py:82 msgid "Source" msgstr "Lähde" -#: members/models.py:85 +#: members/models.py:84 msgid "Cash" 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" msgstr "Tilisiirto" -#: members/models.py:103 +#: members/models.py:102 msgid "Created" msgstr "Lisätty" @@ -291,7 +291,7 @@ msgid "Add member" msgstr "Lisää jäsen" #: 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" msgstr "Tallenna" @@ -382,7 +382,15 @@ msgstr "Jäsenrekisteri" msgid "Members in register:" 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" msgstr "Lataa CSV" @@ -403,7 +411,7 @@ msgstr "Lisää useita" msgid "List payments" 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" msgstr "Lisää maksu" @@ -431,82 +439,89 @@ msgstr "Muokkaa maksua" msgid "Payment events" msgstr "Maksutapahtumat" -#: members/views.py:138 members/views.py:209 members/views.py:235 -msgid "No member id specified" -msgstr "Jäsenen ID ei määritelty" +#: members/templates/payment_list.html:18 +msgid "Payments in register:" +msgstr "Maksutapahtumia:" -#: members/views.py:164 -msgid "Successfully added member" -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 +#: members/views/applications.py:49 members/views/applications.py:96 +#: members/views/applications.py:124 msgid "No application id specified" msgstr "Hakemuksen ID ei määritelty" -#: members/views.py:301 +#: members/views/applications.py:77 msgid "Successfully accepted application" msgstr "Onnistuneesti hyväksyttiin hakemus" -#: members/views.py:308 +#: members/views/applications.py:84 msgid "Could not accept application object" msgstr "Hakemusobjektia ei voitu hyväksyä" -#: members/views.py:324 +#: members/views/applications.py:100 msgid "Successfully deleted application" msgstr "Onnistuneesti poistettiin hakemus" -#: members/views.py:336 +#: members/views/applications.py:112 msgid "Could not delete application object" 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" 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" msgstr "Maksutapahtuman ID ei määritelty" -#: members/views.py:473 +#: members/views/payments.py:129 msgid "Successfully deleted payment" msgstr "Onnistuneesti poistettiin maksutapahtuma" -#: members/views.py:483 +#: members/views/payments.py:139 msgid "Could not delete payment object" msgstr "Maksutapahtumaobjektia ei voitu poistaa" -#: members/views.py:502 +#: members/views/payments.py:158 msgid "Successfully updated payment" msgstr "Onnistuneesti päivitettiin maksutapahtuma" -#: members/views.py:509 +#: members/views/payments.py:165 msgid "Could not update payment object" msgstr "Maksutapahtumaobjektia ei voitu päivittää" -#: members/views.py:531 +#: members/views/utils.py:110 msgid "Missing \"textfield\" POST request field" msgstr "Puuttuva \"textfield\" POST-kenttä" -#: members/views.py:583 -msgid "Failed to import members" -msgstr "Jäsenten tuonti epäonnistui" - #: templates/footer.html:7 msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" diff --git a/members/templates/member_list.html b/members/templates/member_list.html index 9a665fc..9c0eb80 100644 --- a/members/templates/member_list.html +++ b/members/templates/member_list.html @@ -21,6 +21,23 @@ {% trans "Members in register:" %} {{ member_count }} +
+
+ + + + +
+
+ + {% if request.GET.q %} +
+ +
+ {% endif %} + {{ table|safe }}
diff --git a/members/templates/payment_list.html b/members/templates/payment_list.html index 780e0cb..1665f0a 100644 --- a/members/templates/payment_list.html +++ b/members/templates/payment_list.html @@ -14,6 +14,27 @@
{% endif %} +
+ {% trans "Payments in register:" %} {{ payment_count }} +
+ +
+
+ + + + +
+
+ + {% if request.GET.q %} +
+ +
+ {% endif %} + {{ table|safe }} {% endblock content %} diff --git a/members/tests.py b/members/tests.py index 3987d38..d2d6bb4 100644 --- a/members/tests.py +++ b/members/tests.py @@ -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) diff --git a/members/urls.py b/members/urls.py index 8cae5f8..1578da4 100644 --- a/members/urls.py +++ b/members/urls.py @@ -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', ), diff --git a/members/views/members.py b/members/views/members.py index 66f43fe..18c8325 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -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 diff --git a/members/views/payments.py b/members/views/payments.py index da6c8aa..be1a12e 100644 --- a/members/views/payments.py +++ b/members/views/payments.py @@ -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,