Implement conflict resolution logic

This commit is contained in:
Jan Tuomi
2017-05-29 22:00:29 +03:00
parent 09e8c93e8d
commit 3a8d988033
3 changed files with 69 additions and 14 deletions
+7
View File
@@ -11,6 +11,13 @@
<h2>{% trans "Member register" %}</h2> <h2>{% trans "Member register" %}</h2>
</div> </div>
{% if is_member_conflict %}
<div class="alert alert-warning">
{% blocktrans %}There are duplicate member entries in the register.
Please visit <a href="/members/duplicates">duplicate resolver</a>.{% endblocktrans %}
</div>
{% endif %}
{% if notification %} {% if notification %}
<div class="alert alert-success"> <div class="alert alert-success">
{{ notification }} {{ notification }}
+5 -1
View File
@@ -17,6 +17,7 @@ from members.views import member_delete_confirm
from members.views import member_delete from members.views import member_delete
from members.views import payment_list from members.views import payment_list
from members.views import member_duplicates from members.views import member_duplicates
from members.views import resolve_conflict
# rest api # rest api
from members.views import MemberDetail from members.views import MemberDetail
@@ -104,6 +105,9 @@ urlpatterns = [
url(r'^api/members/(?P<pk>\d+)$', MemberDetail.as_view()), url(r'^api/members/(?P<pk>\d+)$', MemberDetail.as_view()),
# member duplicate resolution 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)
] ]
+57 -13
View File
@@ -105,7 +105,8 @@ def member_list(request, *args, **kwargs):
context = { context = {
'table': table_html, 'table': table_html,
'member_count': len(members), '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) return render(request, 'member_list.html', context)
@@ -459,7 +460,6 @@ def export_csv(request, *args, **kwargs):
@require_http_methods(["GET"]) @require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login') @permission_required('members.change_member', login_url='/login')
def member_duplicates(request, *args, **kwargs): def member_duplicates(request, *args, **kwargs):
# TODO
conflicts = MemberConflict.objects.all() conflicts = MemberConflict.objects.all()
context = { context = {
'conflicts': conflicts 'conflicts': conflicts
@@ -468,6 +468,35 @@ def member_duplicates(request, *args, **kwargs):
return render(request, 'member_duplicates.html', context) 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): def send_mail_wrapper(subject, message, email_to):
send_mail(subject, send_mail(subject,
message, message,
@@ -476,20 +505,35 @@ def send_mail_wrapper(subject, message, email_to):
fail_silently=False) fail_silently=False)
@receiver(post_save, sender=Request) # @receiver(post_save, sender=Request)
def email_on_request(sender, instance, created, **kwargs): # def email_on_request(sender, instance, created, **kwargs):
if created: # if created:
subject = 'Test1' # subject = 'Test1'
message = 'Please validate your email address\r\n' # message = 'Please validate your email address\r\n'
send_mail_wrapper(subject, message, instance.email) # 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) @receiver(post_save, sender=Member)
def email_on_accept(sender, instance, created, **kwargs): def check_for_duplicates(sender, instance, created, **kwargs):
if created: name_candidates = Member.objects.filter(first_name=instance.first_name,
subject = 'Test2' last_name=instance.last_name)
message = 'Jäsenhakemuksesi on hyväksytty!!!\r\n' email_candidates = Member.objects.filter(email=instance.email)
send_mail_wrapper(subject, message, 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 # Can be used to retrieve single member information via REST API