From 3a8d9880330a3e0bfa32ab91926855be7e0f7797 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 29 May 2017 22:00:29 +0300 Subject: [PATCH] Implement conflict resolution logic --- members/templates/member_list.html | 7 +++ members/urls.py | 6 ++- members/views.py | 70 ++++++++++++++++++++++++------ 3 files changed, 69 insertions(+), 14 deletions(-) diff --git a/members/templates/member_list.html b/members/templates/member_list.html index 221764f..18bc6cb 100644 --- a/members/templates/member_list.html +++ b/members/templates/member_list.html @@ -11,6 +11,13 @@

{% trans "Member register" %}

+ {% if is_member_conflict %} +
+ {% blocktrans %}There are duplicate member entries in the register. + Please visit duplicate resolver.{% endblocktrans %} +
+ {% endif %} + {% if notification %}
{{ notification }} diff --git a/members/urls.py b/members/urls.py index d4a8fe9..9738af6 100644 --- a/members/urls.py +++ b/members/urls.py @@ -17,6 +17,7 @@ from members.views import member_delete_confirm from members.views import member_delete from members.views import payment_list from members.views import member_duplicates +from members.views import resolve_conflict # rest api from members.views import MemberDetail @@ -104,6 +105,9 @@ urlpatterns = [ url(r'^api/members/(?P\d+)$', MemberDetail.as_view()), # member duplicate resolution view - url(r'^duplicates$', member_duplicates) + url(r'^duplicates$', member_duplicates), + + # post target for resolving a conflict + url(r'^resolve_conflict$', resolve_conflict) ] diff --git a/members/views.py b/members/views.py index 4a7acbf..691b30f 100644 --- a/members/views.py +++ b/members/views.py @@ -105,7 +105,8 @@ def member_list(request, *args, **kwargs): context = { 'table': table_html, 'member_count': len(members), - 'notification': request.GET.get('notification', None) + 'notification': request.GET.get('notification', None), + 'is_member_conflict': MemberConflict.objects.exists() } return render(request, 'member_list.html', context) @@ -459,7 +460,6 @@ def export_csv(request, *args, **kwargs): @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def member_duplicates(request, *args, **kwargs): - # TODO conflicts = MemberConflict.objects.all() context = { 'conflicts': conflicts @@ -468,6 +468,35 @@ def member_duplicates(request, *args, **kwargs): return render(request, 'member_duplicates.html', context) +@ensure_csrf_cookie +@require_http_methods(["POST"]) +@permission_required('members.change_member', login_url='/login') +def resolve_conflict(request, *args, **kwargs): + action = request.POST.get('action', None) + if action not in ['first', 'second', 'both']: + return render(request, 'error.html', {'error': '{}: {}'.format(('Incorrect action value'), action)}) + + id = request.POST.get('id', None) + if id is None: + return render(request, 'error.html', {'error': '{}: {}'.format(('Incorrect id value'), id)}) + + conflict = MemberConflict.objects.get(id=id) + first_member = conflict.first_member + second_member = conflict.second_member + + if action == 'first': + second_member.delete() + elif action == 'second': + first_member.delete() + + conflict.delete() + if MemberConflict.objects.exists(): + return HttpResponseRedirect('/members/duplicates') + else: + notification = _('Successfully resolved all member conflicts.') + return HttpResponseRedirect('/members/list?notification={}'.format(html.escape(notification))) + + def send_mail_wrapper(subject, message, email_to): send_mail(subject, message, @@ -476,20 +505,35 @@ 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=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=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) +def check_for_duplicates(sender, instance, created, **kwargs): + name_candidates = Member.objects.filter(first_name=instance.first_name, + last_name=instance.last_name) + email_candidates = Member.objects.filter(email=instance.email) + + candidates = name_candidates | email_candidates + duplicates = candidates.exclude(id=instance.id) + + if len(duplicates) > 0: + conflict = MemberConflict(first_member=instance, + second_member=duplicates[0]) + conflict.save() # Can be used to retrieve single member information via REST API