From 982e6bf928e285ae684a5cf71f0eccfec06261f4 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 25 Sep 2017 21:55:49 +0300 Subject: [PATCH] Add autocomplete search to "add payment" and add search bar to table views --- locale/en/LC_MESSAGES/django.mo | Bin 6691 -> 6691 bytes locale/en/LC_MESSAGES/django.po | 133 ++++++++++++++++------------ locale/fi/LC_MESSAGES/django.mo | Bin 8343 -> 8490 bytes locale/fi/LC_MESSAGES/django.po | 131 +++++++++++++++------------ members/templates/member_list.html | 17 ++++ members/templates/payment_list.html | 21 +++++ members/tests.py | 26 ++++-- members/urls.py | 6 +- members/views/members.py | 13 ++- members/views/payments.py | 8 +- 10 files changed, 229 insertions(+), 126 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 2808dcfe602297cff4f5b87ff410f8af0f9967f4..6364efbbae44f602d2bc38d8c392c0efb7c5eaef 100644 GIT binary patch delta 18 ZcmZ2%ve;xppCGG|p_Q@G=E;H+H~>9G1@r&_ delta 18 ZcmZ2%ve;xppCGHDv6ZpK=E;H+H~>9y1^WO1 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 c81386c28cfcae8a255be8bdf9a3a834a5613e0c..d57a49a90a032e4ae4175f6680e48ab2849ef0e1 100644 GIT binary patch delta 2736 zcmXxleN5F=9LMo<6N1Y{o)JhME@1ft84zk1%bc|^l`;r*J?u(1?u}=-NF;jAhtwe3 z{MB5`iWb%~TL#Ym3LR5de=u#Vw3s;AvL`EB%bF{Df8faO`Mu6L_xC&Jd%oxVF8l94 zv@CofDdKg*UoRz-(j8&U5ROH2;qRQs7(brJ(|BL3G5RWM`jiPcjdljk$1J=RD{TKG zm_WMb(l9Wj`l&+gGW&hoWuhB3JdWD600fXW~!zbb>C7{ z|0>&FgKpYSV-^N63U^^C^P5+xmaPX9Q5l%Qg;bf@sQXGV5|^Uxe-Jfc zrR}dl)?l7QP1Io9?a0S$n1;tt5s#n-`o=nL z`!Az1_Ph0l?T;fGWhf1`phDy;Q-&I66>8qPmAUA}N>nCVP`?Mgw*8@PpG2+T z5^AEKZ2Kx|YyLrY!Njn9tuPZ6V6JV?Lv8H>yhZPSIhA@Bry1+`;xPF?gefd{@-U(v z7(pGPG1L#uMbyBt9AyQRin>3`T3}s*dVU3J3)Z3ntjBo0|C_0h4f6_W1@GeBIDkv= zGHRlH@}-m(paxomO6dyJR#c%f;zNxWu>IXwN_!9LcV-B^IDt8O|08bW-Nsos3s+(R zwqg#xjSAp%)I_IID;>4{6R1@Gf;#rfNB!iEqVE3#wN-zk#^->ACnJyNq-g~y zs0T7o6E8w#U^!~{4=O6 z3V&&(1^J;d zv(bgT&69uKT-_R}nTmc;o}y@=cIRw#TGk$F3n&_LGo_HCqoWYJoJe;`;%;jComfVB zoYLl0xN}_3J3)7itHn9tPJSRr@6Ep#Y^4_$QyOi%+WHbcN7+f?{WVJ|8!1grMofu& z6SWFT*r|@GO?;8s&A*qa^f+I{u z4EoBPx!F%ld&uW^c4Xh1xq7(2E94Ii_Ye0sc|#oy&Gqg6kT>A#XlU>c4rQNn{SR*W B983TJ delta 2597 zcmXxle@xVM9LMp`fp*?qbq6OB^5aM-7=i{DMv)UOTIRxt89Eo5P)TH1NNHf_5l2yN z(!Qa!x$EaFu!-wh+Nw!EHfk)XKN44FIku7&ZD|`dYwP)fkGK1LAD_?XzMs$M{ds?X z+~BJHD6ikBj~@}82vPE{TY*KPvT;n!pkt@ zirM~L4A9O;FP0;xm?~t-h`E!BpNhxSs;#v9R%^;pjOW)qb>I{K|2Vh-&eF@*oxb{0{pU5OdE5w)Xs&ec4q6Y{{v)Ui9YY`Mo8wdz`6w#2r%(gWqB8Ick}5NeIxm^dxfnp5zW}vh z$o3Z?F`E+9LO0v?Ey&m0&EYC+#E1rVQqfMjQ3Lm)7Kq#axA1D(L$>`brqMo)3gA2z z;zd*j@>6CvP=-qV4XAr$CF=ZY+h3DH{&m87I{2C`9JIq7sEMMe9qdH~x(`{y#O?1x z_V-UPNdFf|lFTX8B|3*1my~MEeDvZ>rtn(Y1*zm;sji_T6YFpRwqiQ=pdyZ=2EJ__ zvi(O<85_2a+5R)Ajr@vy&0ice-c6KR&ySjSeuRoLkZmonCzPTBSZ3Qbs0r&(12>~G z(~P=w+ikl8HD4F%lD&Y+#9_P!zrJq$+ zWY-L!cJvV{uwmQ&3UvujU=p6j7MC$U;e)i-kmf->{|PEeVFTOMfNiLor33XsiJ&Gv zgbL_=)cGG5a^SdN9L_elfhVi)SY@g^4F=a`SbVX>b7z{1%RmZJi=7d7Dn zsGYXi{w`FipGWPe&-TBD3TVK31Qqa6)MNZ9Dsv;KjEq^&VnhpEprQqnxB<94#*Ydl zA2mSilDwuQ%Bs9ZKmi zDwW@$Zjy1^e-4+^{u{N>GQw9TR-n$m1NFGoqITMbe9cY{?8)rIMfe^npzlx{nTXiR z6l&sWR3Q2X(g^`ndm(CI5$eC70u{ims0^${jbDcv*MPb-TWxoVF&!a9ucJAzaMacYH zOqhxmtVG>>Yf*tTp?2Pa+F=LkCXAw9C@-N4c^YRvyEtkik5Kg9XrO4GM;(_ZJ-dh6 zQi^7Ll2Ss^9ik8)cgj6s-8Q@rj9EpwhqB$-BPK^DNj+m^m&HLv(7)>Jl&NuALS-W zSweZtDfOjiM5t|`tfzES8Y!ie7Uw=+rcz}da-zPVtIg^6<)wAduBYsv?55~0*pv9$ rx5n)(3Et(zf@O)(;0f2<((p~;ibOnZYMyf-XQOj5r!r9&8h8B\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,