diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index de97be5..2f37095 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 da992d6..92d0cd8 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-05-28 21:51+0300\n" +"POT-Creation-Date: 2017-05-29 22:48+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -289,6 +289,31 @@ msgstr "Are you sure you want to delete this member?" msgid "Yes, I'm sure" msgstr "Yes, I'm sure" +#: members/templates/member_duplicates.html:9 +msgid "Conflicting member entries" +msgstr "" + +#: members/templates/member_duplicates.html:13 +msgid "" +"Found conflicting member entries. Choose how to handle the problematic data." +msgstr "" + +#: members/templates/member_duplicates.html:29 +msgid "Which one has the correct information for this member?" +msgstr "" + +#: members/templates/member_duplicates.html:31 +msgid "Accept first and remove second" +msgstr "" + +#: members/templates/member_duplicates.html:32 +msgid "Accept second and remove first" +msgstr "" + +#: members/templates/member_duplicates.html:33 +msgid "Accept both as two members" +msgstr "" + #: members/templates/member_edit.html:9 msgid "Edit member" msgstr "Edit member" @@ -297,7 +322,13 @@ msgstr "Edit member" msgid "Member register" msgstr "Member register" -#: members/templates/member_list.html:23 +#: members/templates/member_list.html:16 +msgid "" +"There are duplicate member entries in the register.\n" +" Please visit duplicate resolver." +msgstr "" + +#: members/templates/member_list.html:30 msgid "Download CSV" msgstr "Download CSV" @@ -372,86 +403,92 @@ msgstr "Finnish" msgid "English" msgstr "English" -#: members/views.py:127 members/views.py:184 members/views.py:203 +#: members/views.py:128 members/views.py:185 members/views.py:204 msgid "No member id specified" msgstr "No member id specified" -#: members/views.py:149 +#: members/views.py:150 msgid "Successfully added member" msgstr "Successfully added member" -#: members/views.py:170 +#: members/views.py:171 msgid "Successfully updated member" msgstr "Successfully updated member" -#: members/views.py:174 +#: members/views.py:175 msgid "Could not update member object" msgstr "Could not update member object" -#: members/views.py:188 +#: members/views.py:189 msgid "Successfully deleted member" msgstr "Successfully deleted member" -#: members/views.py:194 +#: members/views.py:195 msgid "Could not delete member object" msgstr "Could not delete member object" -#: members/views.py:237 members/views.py:271 members/views.py:289 +#: members/views.py:238 members/views.py:272 members/views.py:290 msgid "No application id specified" msgstr "No application id specified" -#: members/views.py:258 +#: members/views.py:259 msgid "Successfully accepted application" msgstr "Successfully accepted application" -#: members/views.py:261 +#: members/views.py:262 msgid "Could not accept application object" msgstr "Could not accept application object" -#: members/views.py:275 +#: members/views.py:276 msgid "Successfully deleted application" msgstr "Successfully deleted application" -#: members/views.py:280 +#: members/views.py:281 msgid "Could not delete application object" msgstr "Could not delete application object" -#: members/views.py:344 +#: members/views.py:345 msgid "Successfully added payment for member" msgstr "Successfully added payment for member" -#: members/views.py:357 members/views.py:370 members/views.py:384 +#: members/views.py:358 members/views.py:371 members/views.py:385 msgid "No payment id specified" msgstr "No payment id specified" -#: members/views.py:388 +#: members/views.py:389 msgid "Successfully deleted payment" msgstr "Successfully deleted payment" -#: members/views.py:393 +#: members/views.py:394 msgid "Could not delete payment object" msgstr "Could not delete payment object" -#: members/views.py:408 +#: members/views.py:409 msgid "Successfully updated payment" msgstr "Successfully updated payment" -#: members/views.py:411 +#: members/views.py:412 msgid "Could not update payment object" msgstr "Could not update payment object" -#: members/views.py:428 +#: members/views.py:429 msgid "Missing \"textfield\" POST request field" msgstr "Missing \"textfield\" POST request field" -#: members/views.py:433 +#: members/views.py:434 msgid "Successfully imported multiple members" msgstr "Successfully imported multiple members" -#: members/views.py:436 +#: members/views.py:437 msgid "Failed to import members" msgstr "Failed to import members" +#: members/views.py:497 +#, fuzzy +#| msgid "Successfully deleted member" +msgid "Successfully resolved all member conflicts." +msgstr "Successfully deleted member" + #: 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 3e66af3..dfa853d 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 fdc875b..f8a6dfb 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-05-28 21:51+0300\n" +"POT-Creation-Date: 2017-05-29 22:48+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -293,6 +293,31 @@ msgstr "Oletko varma, että haluat poistaa tämän jäsenen?" msgid "Yes, I'm sure" msgstr "Kyllä, olen varma" +#: members/templates/member_duplicates.html:9 +msgid "Conflicting member entries" +msgstr "Ongelmalliset jäsentiedot" + +#: members/templates/member_duplicates.html:13 +msgid "" +"Found conflicting member entries. Choose how to handle the problematic data." +msgstr "Ongelmallista jäsendataa havaittu. Valitse, miten ongelmat ratkaistaan." + +#: members/templates/member_duplicates.html:29 +msgid "Which one has the correct information for this member?" +msgstr "Kummassa on jäsenen oikeat tiedot?" + +#: members/templates/member_duplicates.html:31 +msgid "Accept first and remove second" +msgstr "Hyväksy ensimmäinen ja poista toinen" + +#: members/templates/member_duplicates.html:32 +msgid "Accept second and remove first" +msgstr "Hyväksy toinen ja poista ensimmäinen" + +#: members/templates/member_duplicates.html:33 +msgid "Accept both as two members" +msgstr "Hyväksy molemmat kahtena jäsenenä" + #: members/templates/member_edit.html:9 msgid "Edit member" msgstr "Muokkaa jäsentä" @@ -301,7 +326,14 @@ msgstr "Muokkaa jäsentä" msgid "Member register" msgstr "Jäsenrekisteri" -#: members/templates/member_list.html:23 +#: members/templates/member_list.html:16 +msgid "" +"There are duplicate member entries in the register.\n" +" Please visit duplicate resolver." +msgstr "Jäsenrekisterissä on duplikaattijäseniä.\n" +" Käytä ongelman ratkaisuun duplikaattityökalua." + +#: members/templates/member_list.html:30 msgid "Download CSV" msgstr "Lataa CSV" @@ -376,86 +408,92 @@ msgstr "suomi" msgid "English" msgstr "englanti" -#: members/views.py:127 members/views.py:184 members/views.py:203 +#: members/views.py:128 members/views.py:185 members/views.py:204 msgid "No member id specified" msgstr "Jäsenen ID ei määritelty" -#: members/views.py:149 +#: members/views.py:150 msgid "Successfully added member" msgstr "Onnistuneesti lisättiin jäsen" -#: members/views.py:170 +#: members/views.py:171 msgid "Successfully updated member" msgstr "Onnistuneesti päivitettiin jäsen" -#: members/views.py:174 +#: members/views.py:175 msgid "Could not update member object" msgstr "Jäsenobjektia ei voitu päivittää" -#: members/views.py:188 +#: members/views.py:189 msgid "Successfully deleted member" msgstr "Onnistuneesti poistettiin jäsen" -#: members/views.py:194 +#: members/views.py:195 msgid "Could not delete member object" msgstr "Jäsenobjektia ei voitu poistaa" -#: members/views.py:237 members/views.py:271 members/views.py:289 +#: members/views.py:238 members/views.py:272 members/views.py:290 msgid "No application id specified" msgstr "Hakemuksen ID ei määritelty" -#: members/views.py:258 +#: members/views.py:259 msgid "Successfully accepted application" msgstr "Onnistuneesti hyväksyttiin hakemus" -#: members/views.py:261 +#: members/views.py:262 msgid "Could not accept application object" msgstr "Hakemusobjektia ei voitu hyväksyä" -#: members/views.py:275 +#: members/views.py:276 msgid "Successfully deleted application" msgstr "Onnistuneesti poistettiin hakemus" -#: members/views.py:280 +#: members/views.py:281 msgid "Could not delete application object" msgstr "Hakemusobjektia ei voitu poistaa" -#: members/views.py:344 +#: members/views.py:345 msgid "Successfully added payment for member" msgstr "Onnistuneesti lisättiin maksutapahtuma jäsenelle" -#: members/views.py:357 members/views.py:370 members/views.py:384 +#: members/views.py:358 members/views.py:371 members/views.py:385 msgid "No payment id specified" msgstr "Maksutapahtuman ID ei määritelty" -#: members/views.py:388 +#: members/views.py:389 msgid "Successfully deleted payment" msgstr "Onnistuneesti poistettiin maksutapahtuma" -#: members/views.py:393 +#: members/views.py:394 msgid "Could not delete payment object" msgstr "Maksutapahtumaobjektia ei voitu poistaa" -#: members/views.py:408 +#: members/views.py:409 msgid "Successfully updated payment" msgstr "Onnistuneesti päivitettiin maksutapahtuma" -#: members/views.py:411 +#: members/views.py:412 msgid "Could not update payment object" msgstr "Maksutapahtumaobjektia ei voitu päivittää" -#: members/views.py:428 +#: members/views.py:429 msgid "Missing \"textfield\" POST request field" msgstr "Puuttuva \"textfield\" POST-kenttä" -#: members/views.py:433 +#: members/views.py:434 msgid "Successfully imported multiple members" msgstr "Onnistuneesti tuotu useita jäseniä" -#: members/views.py:436 +#: members/views.py:437 msgid "Failed to import members" msgstr "Jäsenten tuonti epäonnistui" +#: members/views.py:497 +#, fuzzy +#| msgid "Successfully deleted member" +msgid "Successfully resolved all member conflicts." +msgstr "Onnistuneesti poistettiin jäsen" + #: 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/static/css/members.css b/members/static/css/members.css index 9b99baf..9cea9bd 100644 --- a/members/static/css/members.css +++ b/members/static/css/members.css @@ -249,4 +249,18 @@ input { .conflict-row { overflow: auto; + margin-bottom: 2rem; + border: 1px dotted black; +} + +.table-conflict { +} + +.conflict-row>div>table>tbody>tr>th, +.conflict-row>div>table>tbody>tr>td { + border-top: none; + padding: 1rem; +} + +.conflict-row>div { } diff --git a/members/templates/member_duplicates.html b/members/templates/member_duplicates.html index 359329e..c6f2995 100644 --- a/members/templates/member_duplicates.html +++ b/members/templates/member_duplicates.html @@ -13,14 +13,14 @@

{% blocktrans %}Found conflicting member entries. Choose how to handle the problematic data.{% endblocktrans %}

{% for conflict in conflicts %} -
+
- +
{{ conflict.first_member_form }}
- +
{{ conflict.second_member_form }}
diff --git a/members/views.py b/members/views.py index 691b30f..615dd9e 100644 --- a/members/views.py +++ b/members/views.py @@ -25,6 +25,7 @@ import requests import logging import html import csv +from smtplib import SMTPAuthenticationError from members.models import Member, Request, Payment, MemberConflict from members.forms import MemberForm, PaymentForm, ApplicationForm @@ -490,6 +491,7 @@ def resolve_conflict(request, *args, **kwargs): first_member.delete() conflict.delete() + if MemberConflict.objects.exists(): return HttpResponseRedirect('/members/duplicates') else: @@ -505,24 +507,29 @@ def send_mail_wrapper(subject, message, email_to): fail_silently=False) -# @receiver(post_save, sender=Request) -# def email_on_request(sender, instance, created, **kwargs): -# if created: -# subject = 'Test1' -# message = 'Please validate your email address\r\n' -# send_mail_wrapper(subject, message, instance.email) -# -# -# @receiver(post_save, sender=Member) -# def email_on_accept(sender, instance, created, **kwargs): -# if created: -# subject = 'Test2' -# message = 'Jäsenhakemuksesi on hyväksytty!!!\r\n' -# send_mail_wrapper(subject, message, instance.email) +@receiver(post_save, sender=Request) +def email_on_request(sender, instance, created, **kwargs): + try: + if created: + subject = 'Test1' + message = 'Please validate your email address\r\n' + send_mail_wrapper(subject, message, instance.email) + except SMTPAuthenticationError: + memberlogger.error('Failed to send email to accepted request!') @receiver(post_save, sender=Member) -def check_for_duplicates(sender, instance, created, **kwargs): +def email_on_accept(sender, instance, created, **kwargs): + try: + if created: + subject = 'Test2' + message = 'Jäsenhakemuksesi on hyväksytty!!!\r\n' + send_mail_wrapper(subject, message, instance.email) + except SMTPAuthenticationError: + memberlogger.error('Failed to send email to accepted member!') + + +def check_for_duplicates(instance): name_candidates = Member.objects.filter(first_name=instance.first_name, last_name=instance.last_name) email_candidates = Member.objects.filter(email=instance.email) @@ -536,6 +543,11 @@ def check_for_duplicates(sender, instance, created, **kwargs): conflict.save() +@receiver(post_save, sender=Member) +def duplicate_receiver(sender, instance, created, **kwargs): + check_for_duplicates(instance) + + # Can be used to retrieve single member information via REST API class MemberDetail(generics.RetrieveAPIView): queryset = Member.objects.all()