From ac0294420538e2b844bcc08881bd9f442607330a Mon Sep 17 00:00:00 2001
From: Flavio Tarsetti <flavio.tarsetti@idiap.ch>
Date: Wed, 13 May 2020 23:02:09 +0200
Subject: [PATCH] [accounts][views] implement rejection endpoint and notify
 supervisor of revalidation through quick link

---
 beat/web/accounts/views.py | 72 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 1 deletion(-)

diff --git a/beat/web/accounts/views.py b/beat/web/accounts/views.py
index 031591a47..708a25afe 100644
--- a/beat/web/accounts/views.py
+++ b/beat/web/accounts/views.py
@@ -148,7 +148,8 @@ def generate_load_response(request, temp_url, template, parameters):
 
     return render(request, answer["template"], answer["parameters"])
 
-def load_temporary_url(request, hash_url):
+
+def load_temporary_url_validation(request, hash_url):
     temp_url = get_object_or_404(TemporaryUrl, url_hash=hash_url)
     supervisiontrack = temp_url.supervision_track
     supervisee = supervisiontrack.supervisee
@@ -221,6 +222,27 @@ def load_temporary_url(request, hash_url):
                     supervisiontrack.save()
                     supervisee.profile.save()
                     supervisee.save()
+
+                    # Inform supervisor about supervisee revalidation
+                    # Possible supervisor rejection available
+                    parsed_url = urlparse(settings.URL_PREFIX)
+                    server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+
+                    temp_url_rejection = TemporaryUrl.objects.create_temporary_url(TemporaryUrl.REJECTION, supervisiontrack)
+
+                    context = {
+                        "supervisor": supervisiontrack.supervisor,
+                        "supervisee": supervisee,
+                        "prefix": server_address,
+                        "temp_url": temp_url_rejection.url_hash,
+                    }
+
+                    mail.send_email(
+                        "registration/mail.account_revalidation_supervisor.subject.txt",
+                        "registration/mail.supervisor_possible_supervisee_rejection.message.txt",
+                        context,
+                        [supervisiontrack.supervisor.email],
+                    )
                 else:
                     #Track already valid
                     error_message = "You don't need to revalidate at the moment, your supervision is still valid"
@@ -252,3 +274,51 @@ def load_temporary_url(request, hash_url):
     else:
             #Track already valid
             return generate_load_response(request, temp_url, "accounts/url_validation_failed.html", {})
+
+
+def load_temporary_url_rejection(request, hash_url):
+    temp_url = get_object_or_404(TemporaryUrl, url_hash=hash_url)
+    supervisiontrack = temp_url.supervision_track
+    supervisee = supervisiontrack.supervisee
+
+    parsed_url = urlparse(settings.URL_PREFIX)
+    server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+
+    context = {
+        'supervisor': supervisiontrack.supervisor,
+        'supervisee': supervisee,
+        'prefix': server_address,
+    }
+
+    now = datetime.datetime.now()
+
+    if temp_url.status == TemporaryUrl.REJECTION:
+        # Supervisor rejects Supervisee
+        if supervisee.profile.supervision_key is not None and now < temp_url.expires:
+            if supervisiontrack.is_valid:
+                expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+
+                supervisiontrack.expiration_date = now
+                supervisiontrack.is_valid = False
+
+                if supervisee.profile.status != Profile.BLOCKED:
+                    supervisee.profile.status = Profile.REJECTED
+                    if supervisee.profile.rejection_date == None:
+                        supervisee.profile.rejection_date = now + expiration_date_delta
+                else:
+                        supervisee.profile.rejection_date = None
+
+                supervisee.profile.supervision_key = None
+
+                supervisiontrack.save()
+                supervisee.profile.save()
+                supervisee.save()
+
+
+                mail.send_email('registration/mail.supervisor_rejected.subject.txt',
+                                'registration/mail.supervisor_rejected.message.txt',
+                                context,
+                                [supervisee.email])
+
+                return generate_load_response(request, temp_url, "accounts/url_rejection.html", {"supervisiontrack": supervisiontrack})
+    return generate_load_response(request, temp_url, "accounts/url_rejection_failed.html", {})
-- 
GitLab