From edcb7941941ea2ecbf53e17f7352937a0de2ce72 Mon Sep 17 00:00:00 2001
From: Flavio Tarsetti <flavio.tarsetti@idiap.ch>
Date: Thu, 14 May 2020 00:15:33 +0200
Subject: [PATCH] [accounts/navigation/ui/utils] pre-commit cleanup

---
 beat/web/accounts/api.py                      | 672 +++++++++++-------
 beat/web/accounts/models.py                   |  15 +-
 beat/web/accounts/urls.py                     |  14 +-
 beat/web/accounts/views.py                    | 283 +++++---
 beat/web/navigation/admin.py                  | 121 ++--
 beat/web/ui/registration/models.py            |   4 +-
 beat/web/ui/views.py                          | 320 +++++----
 .../management/commands/daily_cron_actions.py |  28 +-
 8 files changed, 878 insertions(+), 579 deletions(-)

diff --git a/beat/web/accounts/api.py b/beat/web/accounts/api.py
index 6bd59a136..b9648cefd 100644
--- a/beat/web/accounts/api.py
+++ b/beat/web/accounts/api.py
@@ -27,14 +27,10 @@
 
 from django.conf import settings
 from django.contrib.auth.models import User
-from django.shortcuts import get_object_or_404
-from django.http import Http404
 from django.db import models
 from django.db.models import Q
-from django.core.urlresolvers import reverse
 
 from rest_framework import generics
-from rest_framework import views
 from rest_framework import permissions
 from rest_framework.response import Response
 from rest_framework import status
@@ -43,38 +39,27 @@ from .serializers import FullSupervisionTrackSerializer
 from .serializers import SupervisionTrackUpdateSerializer
 from .serializers import UserSerializer
 
-from ..common.utils import validate_restructuredtext
-from ..ui.templatetags.markup import restructuredtext
-
-
 from .models import Profile
 from .models import SupervisionTrack
 from .models import TemporaryUrl
-from ..common.models import Shareable
-from ..common.exceptions import ShareError
-from ..common.mixins import CommonContextMixin
 from ..ui.registration.models import RegistrationProfile
 from ..utils import mail
 
-from itertools import chain
-from datetime import datetime, timedelta
-
+from .permissions import (
+    IsSupervisorAndAuthor,
+    IsAuthorAndNotSupervisor,
+    IsAuthorAndPossiblySupervisor,
+    IsSuperUser,
+)
 
-from .permissions import IsSupervisorAndAuthor, IsAuthorAndNotSupervisor, IsAuthorAndPossiblySupervisor, IsSuperUser
-
-from ..common.responses import BadRequestResponse, ForbiddenResponse
+from ..common.responses import BadRequestResponse
 
 import datetime
-import re
-try:
-  from urlparse import urlparse
-except ImportError:
-  from urllib.parse import urlparse
 
-import simplejson as json
+from urllib.parse import urlparse
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SupervisorListView(generics.ListAPIView):
@@ -88,26 +73,36 @@ class SupervisorListView(generics.ListAPIView):
 
         return super(SupervisorListView, self).get_permissions()
 
-
     def get_serializer(self, *args, **kwargs):
 
         return super(SupervisorListView, self).get_serializer(*args, **kwargs)
 
-
     def list(self, request):
-        #A supervisor can validate an account of:
-        #1) a new user requesting validation
-        #2) an existing validated user rejected by a previous supervisor
-        #3) an existing validated user requesting a change of supervisor
-        #4) a blocked user requesting a supervision
-        #On all cases check the current key in supervisee profile match the supervisiontrack key as this is the current supervision request/track from the supervisee
-        queryset    = SupervisionTrack.objects.filter(supervisor=request.user).filter(Q(supervisee__profile__status=Profile.WAITINGVALIDATION)|Q(supervisee__profile__status=Profile.REJECTED)|Q(supervisee__profile__status=Profile.YEARREVALIDATION)|Q(supervisee__profile__status=Profile.ACCEPTED)|Q(supervisee__profile__status=Profile.BLOCKED)).filter(Q(supervisee__profile__supervision_key=models.F('supervision_key')))
-        serializer  = FullSupervisionTrackSerializer(queryset, many=True, context ={'request': request})
+        # A supervisor can validate an account of:
+        # 1) a new user requesting validation
+        # 2) an existing validated user rejected by a previous supervisor
+        # 3) an existing validated user requesting a change of supervisor
+        # 4) a blocked user requesting a supervision
+        # On all cases check the current key in supervisee profile match the supervisiontrack key as this is the current supervision request/track from the supervisee
+        queryset = (
+            SupervisionTrack.objects.filter(supervisor=request.user)
+            .filter(
+                Q(supervisee__profile__status=Profile.WAITINGVALIDATION)
+                | Q(supervisee__profile__status=Profile.REJECTED)
+                | Q(supervisee__profile__status=Profile.YEARREVALIDATION)
+                | Q(supervisee__profile__status=Profile.ACCEPTED)
+                | Q(supervisee__profile__status=Profile.BLOCKED)
+            )
+            .filter(Q(supervisee__profile__supervision_key=models.F("supervision_key")))
+        )
+        serializer = FullSupervisionTrackSerializer(
+            queryset, many=True, context={"request": request}
+        )
 
         return Response(serializer.data)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BaseUpdateSupervisionTrackView(generics.UpdateAPIView):
@@ -122,7 +117,7 @@ class BaseUpdateSupervisionTrackView(generics.UpdateAPIView):
         return super(BaseUpdateSupervisionTrackView, self).get_permissions()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SupervisorAddSuperviseeView(BaseUpdateSupervisionTrackView):
@@ -130,28 +125,39 @@ class SupervisorAddSuperviseeView(BaseUpdateSupervisionTrackView):
 
     def put(self, request, supervisee_name):
         supervisee = User.objects.get(username=supervisee_name)
-        profile_supervisee = Profile.objects.get(user=supervisee)
         if supervisee.profile.status != Profile.ACCEPTED:
             if not request.user.is_superuser:
-                supervisiontrack = SupervisionTrack.objects.get(supervisor=request.user, supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
+                supervisiontrack = SupervisionTrack.objects.get(
+                    supervisor=request.user,
+                    supervisee=supervisee,
+                    supervisee__profile__supervision_key=models.F("supervision_key"),
+                )
             else:
                 try:
                     # admin that validates a supervisee
-                    supervisiontrack = SupervisionTrack.objects.get(supervisor=request.user, supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
-                except:
+                    supervisiontrack = SupervisionTrack.objects.get(
+                        supervisor=request.user,
+                        supervisee=supervisee,
+                        supervisee__profile__supervision_key=models.F(
+                            "supervision_key"
+                        ),
+                    )
+                except Exception:
                     # supervisor request for admin
                     supervisiontrack = SupervisionTrack.objects.create(
-                        supervisee = supervisee,
-                        supervisor = request.user,
-                        is_valid = True,
-                        )
-                    #Assign key to supervision track
-                    supervisiontrack.supervision_key = supervisee.profile.supervision_key
+                        supervisee=supervisee, supervisor=request.user, is_valid=True,
+                    )
+                    # Assign key to supervision track
+                    supervisiontrack.supervision_key = (
+                        supervisee.profile.supervision_key
+                    )
 
             supervisiontrack.is_valid = True
 
             now = datetime.datetime.now()
-            expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_EXPIRATION_DAYS)
+            expiration_date_delta = datetime.timedelta(
+                days=settings.ACCOUNT_EXPIRATION_DAYS
+            )
             supervisiontrack.expiration_date = now + expiration_date_delta
 
             supervisiontrack.start_date = now
@@ -165,30 +171,34 @@ class SupervisorAddSuperviseeView(BaseUpdateSupervisionTrackView):
             supervisee.save()
 
             parsed_url = urlparse(settings.URL_PREFIX)
-            server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+            server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
             context = {
-                'supervisor': supervisiontrack.supervisor,
-                'supervisee': supervisee,
-                'prefix': server_address,
+                "supervisor": supervisiontrack.supervisor,
+                "supervisee": supervisee,
+                "prefix": server_address,
             }
 
-            mail.send_email('registration/mail.supervisor_validated.subject.txt',
-                            'registration/mail.supervisor_validated.message.txt',
-                            context,
-                            [supervisee.email])
+            mail.send_email(
+                "registration/mail.supervisor_validated.subject.txt",
+                "registration/mail.supervisor_validated.message.txt",
+                context,
+                [supervisee.email],
+            )
 
             return Response(status=status.HTTP_204_NO_CONTENT)
         else:
-            #Track already valid
-            reason = "You can't validate this supervisee as his supervision is still valid"
+            # Track already valid
+            reason = (
+                "You can't validate this supervisee as his supervision is still valid"
+            )
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
@@ -197,44 +207,60 @@ class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
     def put(self, request, supervisee_name):
         supervisee = User.objects.get(username=supervisee_name)
         if not supervisee.profile.is_supervisor:
-            supervisiontrack = SupervisionTrack.objects.get(supervisor=request.user, supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
+            supervisiontrack = SupervisionTrack.objects.get(
+                supervisor=request.user,
+                supervisee=supervisee,
+                supervisee__profile__supervision_key=models.F("supervision_key"),
+            )
         else:
             if not supervisee.profile.status == Profile.WAITINGVALIDATION:
                 try:
-                    supervisiontrack = SupervisionTrack.objects.get(supervisor=request.user, supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
-                except:
+                    supervisiontrack = SupervisionTrack.objects.get(
+                        supervisor=request.user,
+                        supervisee=supervisee,
+                        supervisee__profile__supervision_key=models.F(
+                            "supervision_key"
+                        ),
+                    )
+                except Exception:
                     if supervisee.profile.is_supervisor and request.user.is_superuser:
-                        supervisiontrack = SupervisionTrack.objects.get(supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
+                        supervisiontrack = SupervisionTrack.objects.get(
+                            supervisee=supervisee,
+                            supervisee__profile__supervision_key=models.F(
+                                "supervision_key"
+                            ),
+                        )
                     else:
                         reason = "You can't remove this supervisor"
                         result = {
-                            'error': reason,
+                            "error": reason,
                         }
                         return BadRequestResponse(result)
 
-
         parsed_url = urlparse(settings.URL_PREFIX)
-        server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+        server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
         if not supervisee.profile.is_supervisor:
             context = {
-                'supervisor': supervisiontrack.supervisor,
-                'supervisee': supervisee,
-                'prefix': server_address,
+                "supervisor": supervisiontrack.supervisor,
+                "supervisee": supervisee,
+                "prefix": server_address,
             }
         else:
             context = {
-                'supervisor': request.user,
-                'supervisee': supervisee,
-                'prefix': server_address,
+                "supervisor": request.user,
+                "supervisee": supervisee,
+                "prefix": server_address,
             }
 
         if supervisee.profile.status == Profile.WAITINGVALIDATION:
-            #New user account waiting validation, so delete this account and inform by email the user
-            mail.send_email('registration/mail.supervisor_rejected.subject.txt',
-                            'registration/mail.supervisor_rejected_delete_account.message.txt',
-                            context,
-                            [supervisee.email])
+            # New user account waiting validation, so delete this account and inform by email the user
+            mail.send_email(
+                "registration/mail.supervisor_rejected.subject.txt",
+                "registration/mail.supervisor_rejected_delete_account.message.txt",
+                context,
+                [supervisee.email],
+            )
 
             registration_profile = RegistrationProfile.objects.get(user=supervisee)
             supervisee.profile.delete()
@@ -243,19 +269,21 @@ class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
                 supervisiontrack.delete()
             registration_profile.delete()
         else:
-            #Reject this account and inform by email the user
+            # Reject this account and inform by email the user
             now = datetime.datetime.now()
-            expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+            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:
+                if supervisee.profile.rejection_date is None:
                     supervisee.profile.rejection_date = now + expiration_date_delta
             else:
-                    supervisee.profile.rejection_date = None
+                supervisee.profile.rejection_date = None
 
             supervisee.profile.supervision_key = None
 
@@ -265,29 +293,55 @@ class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
 
             if not supervisee.profile.is_supervisor:
 
-                mail.send_email('registration/mail.supervisor_rejected.subject.txt',
-                                'registration/mail.supervisor_rejected.message.txt',
-                                context,
-                                [supervisee.email])
+                mail.send_email(
+                    "registration/mail.supervisor_rejected.subject.txt",
+                    "registration/mail.supervisor_rejected.message.txt",
+                    context,
+                    [supervisee.email],
+                )
             else:
 
                 now = datetime.datetime.now()
-                expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+                expiration_date_delta = datetime.timedelta(
+                    days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS
+                )
 
                 # Transform supervisor account to normal account and inform by email
                 supervisee.profile.is_supervisor = False
                 supervisee.profile.save()
                 supervisee.save()
 
-                mail.send_email('registration/mail.beatadmin_supervisor_rejected.subject.txt',
-                                'registration/mail.beatadmin_supervisor_rejected.message.txt',
-                                context,
-                                [supervisee.email])
+                mail.send_email(
+                    "registration/mail.beatadmin_supervisor_rejected.subject.txt",
+                    "registration/mail.beatadmin_supervisor_rejected.message.txt",
+                    context,
+                    [supervisee.email],
+                )
 
                 # Reject all his supervisees and inform by email
                 # Make sure all supervision tracks are invalid for rejected supervisor
-                supervisiontracks = SupervisionTrack.objects.filter(supervisor=supervisee).filter(Q(supervisee__profile__status=Profile.REJECTED)|Q(supervisee__profile__status=Profile.YEARREVALIDATION)|Q(supervisee__profile__status=Profile.ACCEPTED)|Q(supervisee__profile__status=Profile.BLOCKED)).filter(Q(supervisee__profile__supervision_key=models.F('supervision_key')))
-                supervisiontracks_new_users = SupervisionTrack.objects.filter(supervisor=supervisee).filter(Q(supervisee__profile__status=Profile.NEWUSER)|Q(supervisee__profile__status=Profile.WAITINGVALIDATION))
+                supervisiontracks = (
+                    SupervisionTrack.objects.filter(supervisor=supervisee)
+                    .filter(
+                        Q(supervisee__profile__status=Profile.REJECTED)
+                        | Q(supervisee__profile__status=Profile.YEARREVALIDATION)
+                        | Q(supervisee__profile__status=Profile.ACCEPTED)
+                        | Q(supervisee__profile__status=Profile.BLOCKED)
+                    )
+                    .filter(
+                        Q(
+                            supervisee__profile__supervision_key=models.F(
+                                "supervision_key"
+                            )
+                        )
+                    )
+                )
+                supervisiontracks_new_users = SupervisionTrack.objects.filter(
+                    supervisor=supervisee
+                ).filter(
+                    Q(supervisee__profile__status=Profile.NEWUSER)
+                    | Q(supervisee__profile__status=Profile.WAITINGVALIDATION)
+                )
 
                 if supervisiontracks.count() > 0:
                     for track in supervisiontracks:
@@ -297,10 +351,12 @@ class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
                         track_supervisee = track.supervisee
                         if track_supervisee.profile.status != Profile.BLOCKED:
                             track_supervisee.profile.status = Profile.REJECTED
-                            if track_supervisee.profile.rejection_date == None:
-                                track_supervisee.profile.rejection_date = now + expiration_date_delta
+                            if track_supervisee.profile.rejection_date is None:
+                                track_supervisee.profile.rejection_date = (
+                                    now + expiration_date_delta
+                                )
                         else:
-                                track_supervisee.profile.rejection_date = None
+                            track_supervisee.profile.rejection_date = None
 
                         track_supervisee.profile.supervision_key = None
 
@@ -309,23 +365,27 @@ class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
                         track_supervisee.save()
 
                         context = {
-                            'supervisor': supervisee,
-                            'supervisee': track_supervisee,
-                            'prefix': server_address,
+                            "supervisor": supervisee,
+                            "supervisee": track_supervisee,
+                            "prefix": server_address,
                         }
 
-                        mail.send_email('registration/mail.supervisor_failed_rejected.subject.txt',
-                                        'registration/mail.supervisor_failed_rejected.message.txt',
-                                        context,
-                                        [track_supervisee.email])
+                        mail.send_email(
+                            "registration/mail.supervisor_failed_rejected.subject.txt",
+                            "registration/mail.supervisor_failed_rejected.message.txt",
+                            context,
+                            [track_supervisee.email],
+                        )
 
                         if track_supervisee.profile.status == Profile.WAITINGVALIDATION:
-                            registration_profile = RegistrationProfile.objects.get(user=track_supervisee)
+                            registration_profile = RegistrationProfile.objects.get(
+                                user=track_supervisee
+                            )
                             track_supervisee.profile.delete()
                             track_supervisee.delete()
                             registration_profile.delete()
 
-                        #New supervision request refused
+                        # New supervision request refused
                         if track.start_date is None:
                             track.delete()
 
@@ -335,34 +395,38 @@ class SupervisorRemoveSuperviseeView(BaseUpdateSupervisionTrackView):
                         track_supervisor = track.supervisor
 
                         context = {
-                            'supervisor': track_supervisor,
-                            'supervisee': track_supervisee,
-                            'prefix': server_address,
+                            "supervisor": track_supervisor,
+                            "supervisee": track_supervisee,
+                            "prefix": server_address,
                         }
 
-                        #New user account waiting validation, so delete this account and inform by email the user
-                        mail.send_email('registration/mail.supervisor_rejected.subject.txt',
-                                        'registration/mail.supervisor_rejected_delete_account.message.txt',
-                                        context,
-                                        [track_supervisee.email])
+                        # New user account waiting validation, so delete this account and inform by email the user
+                        mail.send_email(
+                            "registration/mail.supervisor_rejected.subject.txt",
+                            "registration/mail.supervisor_rejected_delete_account.message.txt",
+                            context,
+                            [track_supervisee.email],
+                        )
 
-                        registration_profile = RegistrationProfile.objects.get(user=track_supervisee)
+                        registration_profile = RegistrationProfile.objects.get(
+                            user=track_supervisee
+                        )
                         track_supervisee.profile.delete()
                         track_supervisee.delete()
                         registration_profile.delete()
 
-                        #New supervision request refused
+                        # New supervision request refused
                         if track.start_date is None:
                             track.delete()
 
-            #New supervision request refused
+            # New supervision request refused
             if supervisiontrack.start_date is None:
                 supervisiontrack.delete()
 
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BaseCreateSupervisionTrackViewSupervisee(generics.CreateAPIView):
@@ -377,98 +441,113 @@ class BaseCreateSupervisionTrackViewSupervisee(generics.CreateAPIView):
         return super(BaseCreateSupervisionTrackViewSupervisee, self).get_permissions()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SuperviseeAddSupervisorView(BaseCreateSupervisionTrackViewSupervisee):
     permission_classes = BaseCreateSupervisionTrackViewSupervisee.permission_classes
 
     def post(self, request, supervisor_name):
-        #check if user exists and its validity and if it's a supervisor account
+        # check if user exists and its validity and if it's a supervisor account
         try:
             supervisor = User.objects.get(username=supervisor_name)
             if not supervisor.profile.is_supervisor:
-                #Not a valid supervisor
+                # Not a valid supervisor
                 reason = "Not a valid supervisor request"
                 result = {
-                    'error': reason,
+                    "error": reason,
                 }
                 return BadRequestResponse(result)
             else:
                 if supervisor.profile.status == Profile.BLOCKED:
-                    #Not a valid supervisor
+                    # Not a valid supervisor
                     reason = "Not a valid supervisor request"
                     result = {
-                        'error': reason,
+                        "error": reason,
                     }
                     return BadRequestResponse(result)
-        except:
-            #This username does not exist but don't give too much information
+        except Exception:
+            # This username does not exist but don't give too much information
             reason = "Not a valid supervisor request"
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
         parsed_url = urlparse(settings.URL_PREFIX)
-        server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+        server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
         supervisee = request.user
         if supervisee.profile.supervision_key is not None:
-            #There's a key check if there's a valid track
-            supervisiontrack = SupervisionTrack.objects.get(supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
+            # There's a key check if there's a valid track
+            supervisiontrack = SupervisionTrack.objects.get(
+                supervisee=supervisee,
+                supervisee__profile__supervision_key=models.F("supervision_key"),
+            )
             if supervisiontrack.is_valid:
-                if supervisee.profile.status != Profile.WAITINGVALIDATION and supervisee.profile.status != Profile.NEWUSER and supervisee.profile.status != Profile.BLOCKED:
-                    #Stop the current supervision
+                if (
+                    supervisee.profile.status != Profile.WAITINGVALIDATION
+                    and supervisee.profile.status != Profile.NEWUSER
+                    and supervisee.profile.status != Profile.BLOCKED
+                ):
+                    # Stop the current supervision
                     now = datetime.datetime.now()
-                    expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
-
+                    expiration_date_delta = datetime.timedelta(
+                        days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS
+                    )
 
                     supervisiontrack.expiration_date = now
                     supervisiontrack.is_valid = False
                     supervisiontrack.save()
 
-                    #Inform by email the revoked supervisor
+                    # Inform by email the revoked supervisor
                     context = {
-                        'supervisor': supervisiontrack.supervisor,
-                        'supervisee': supervisiontrack.supervisee,
-                        'prefix': server_address,
+                        "supervisor": supervisiontrack.supervisor,
+                        "supervisee": supervisiontrack.supervisee,
+                        "prefix": server_address,
                     }
 
-                    mail.send_email('registration/mail.supervisor_rejection.subject.txt',
-                                    'registration/mail.supervisor_rejection.message.txt',
-                                    context,
-                                    [supervisiontrack.supervisor.email])
+                    mail.send_email(
+                        "registration/mail.supervisor_rejection.subject.txt",
+                        "registration/mail.supervisor_rejection.message.txt",
+                        context,
+                        [supervisiontrack.supervisor.email],
+                    )
 
-                    #Reject this account and inform by email the supervisor and the user
+                    # Reject this account and inform by email the supervisor and the user
 
                     supervisee.profile.status = Profile.REJECTED
                     supervisee.profile.supervision_key = None
-                    if supervisee.profile.rejection_date == None:
+                    if supervisee.profile.rejection_date is None:
                         supervisee.profile.rejection_date = now + expiration_date_delta
 
                     supervisee.profile.save()
                     supervisee.save()
                 else:
-                    #Not allowed to do this (unproper profile.status)
-                    reason = "You are not able to perform this action, your profile is %s"%(supervisee.profile.status)
+                    # Not allowed to do this (unproper profile.status)
+                    reason = (
+                        "You are not able to perform this action, your profile is %s"
+                        % (supervisee.profile.status)
+                    )
                     result = {
-                        'error': reason,
+                        "error": reason,
                     }
                     return BadRequestResponse(result)
 
             else:
-                #A pending request already exist
+                # A pending request already exist
                 reason = "You are not able to perform this action as you already have a pending request"
                 result = {
-                    'error': reason,
+                    "error": reason,
                 }
                 return BadRequestResponse(result)
         else:
-            #No key is present in supervisee
+            # No key is present in supervisee
 
-            #Make sure all tracks are invalid
-            supervisiontracks = SupervisionTrack.objects.filter(supervisee=supervisee, is_valid=True)
+            # Make sure all tracks are invalid
+            supervisiontracks = SupervisionTrack.objects.filter(
+                supervisee=supervisee, is_valid=True
+            )
             # This should never be the case but if it happens invalidate all tracks
             if supervisiontracks.count() > 0:
                 now = datetime.datetime.now()
@@ -477,38 +556,42 @@ class SuperviseeAddSupervisorView(BaseCreateSupervisionTrackViewSupervisee):
                     track.expiration_date = now
                     track.save()
 
-        #Create and assign key
-        supervisee.profile.supervision_key = supervisee.profile._generate_current_supervision_key()
+        # Create and assign key
+        supervisee.profile.supervision_key = (
+            supervisee.profile._generate_current_supervision_key()
+        )
         supervisiontrack = SupervisionTrack.objects.create(
-            supervisee = supervisee,
-            supervisor = supervisor,
-            is_valid = False,
+            supervisee=supervisee, supervisor=supervisor, is_valid=False,
         )
 
-        #Assign key to supervision track
+        # Assign key to supervision track
         supervisiontrack.supervision_key = supervisee.profile.supervision_key
         supervisiontrack.save()
         supervisee.profile.supervision.add(supervisiontrack)
         supervisee.save()
 
-        #Inform by email the supervisor that he has a new supervisee request
-        temp_url = TemporaryUrl.objects.create_temporary_url(TemporaryUrl.VALIDATION, supervisiontrack)
+        # Inform by email the supervisor that he has a new supervisee request
+        temp_url = TemporaryUrl.objects.create_temporary_url(
+            TemporaryUrl.VALIDATION, supervisiontrack
+        )
         context = {
-            'supervisor': supervisor,
-            'supervisee': supervisee,
-            'prefix': server_address,
+            "supervisor": supervisor,
+            "supervisee": supervisee,
+            "prefix": server_address,
             "temp_url": temp_url.url_hash,
         }
 
-        mail.send_email('registration/mail.supervisor_validation.subject.txt',
-                        'registration/mail.supervisor_validation_supervisee_add_request.message.txt',
-                        context,
-                        [supervisor.email])
+        mail.send_email(
+            "registration/mail.supervisor_validation.subject.txt",
+            "registration/mail.supervisor_validation_supervisee_add_request.message.txt",
+            context,
+            [supervisor.email],
+        )
 
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BaseUpdateSupervisionTrackFromSuperviseeView(generics.UpdateAPIView):
@@ -516,14 +599,19 @@ class BaseUpdateSupervisionTrackFromSuperviseeView(generics.UpdateAPIView):
     serializer_class = SupervisionTrackUpdateSerializer
 
     def get_permissions(self):
-        permission_classes = [permissions.IsAuthenticated, IsAuthorAndPossiblySupervisor]
+        permission_classes = [
+            permissions.IsAuthenticated,
+            IsAuthorAndPossiblySupervisor,
+        ]
 
         self.permission_classes = permission_classes
 
-        return super(BaseUpdateSupervisionTrackFromSuperviseeView, self).get_permissions()
+        return super(
+            BaseUpdateSupervisionTrackFromSuperviseeView, self
+        ).get_permissions()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SuperviseeReValidationView(BaseUpdateSupervisionTrackFromSuperviseeView):
@@ -534,24 +622,33 @@ class SuperviseeReValidationView(BaseUpdateSupervisionTrackFromSuperviseeView):
         now = datetime.datetime.now()
 
         if supervisee.profile.supervision_key is not None:
-            #There's a key check if there's a valid track
-            supervisiontrack = SupervisionTrack.objects.get(supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
+            # There's a key check if there's a valid track
+            supervisiontrack = SupervisionTrack.objects.get(
+                supervisee=supervisee,
+                supervisee__profile__supervision_key=models.F("supervision_key"),
+            )
             if supervisiontrack.is_valid:
                 if supervisee.profile.status == Profile.YEARREVALIDATION:
-                    #Check Supervisor validity
+                    # Check Supervisor validity
                     supervisor = supervisiontrack.supervisor
-                    #If Supervisor account is not valid. Reject the account (though this should already be done during supervisor rejection)
+                    # If Supervisor account is not valid. Reject the account (though this should already be done during supervisor rejection)
                     if supervisor.profile.status != Profile.BLOCKED:
-                        #Change status
+                        # Change status
                         supervisee.profile.status = Profile.ACCEPTED
-                        #Extend supervisiontrack validity for another 12 months
-                        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_EXPIRATION_DAYS)
-                        new_expiration_date = supervisiontrack.expiration_date + expiration_date_delta
+                        # Extend supervisiontrack validity for another 12 months
+                        expiration_date_delta = datetime.timedelta(
+                            days=settings.ACCOUNT_EXPIRATION_DAYS
+                        )
+                        new_expiration_date = (
+                            supervisiontrack.expiration_date + expiration_date_delta
+                        )
                         supervisiontrack.expiration_date = new_expiration_date
                         supervisiontrack.last_validation_date = now
                     else:
-                        #Change status
-                        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+                        # Change status
+                        expiration_date_delta = datetime.timedelta(
+                            days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS
+                        )
 
                         supervisiontrack.expiration_date = now
                         supervisiontrack.is_valid = False
@@ -559,7 +656,7 @@ class SuperviseeReValidationView(BaseUpdateSupervisionTrackFromSuperviseeView):
                         supervisee.profile.status = Profile.REJECTED
                         supervisee.profile.rejection_date = now + expiration_date_delta
                         supervisee.profile.supervision_key = None
-                    #save
+                    # save
                     supervisiontrack.save()
                     supervisee.profile.save()
                     supervisee.save()
@@ -567,9 +664,14 @@ class SuperviseeReValidationView(BaseUpdateSupervisionTrackFromSuperviseeView):
                     # 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)
+                    server_address = "%s://%s" % (
+                        parsed_url.scheme,
+                        parsed_url.hostname,
+                    )
 
-                    temp_url_rejection = TemporaryUrl.objects.create_temporary_url(TemporaryUrl.REJECTION, supervisiontrack)
+                    temp_url_rejection = TemporaryUrl.objects.create_temporary_url(
+                        TemporaryUrl.REJECTION, supervisiontrack
+                    )
 
                     context = {
                         "supervisor": supervisiontrack.supervisor,
@@ -585,23 +687,25 @@ class SuperviseeReValidationView(BaseUpdateSupervisionTrackFromSuperviseeView):
                         [supervisiontrack.supervisor.email],
                     )
                 else:
-                    #Track already valid
+                    # Track already valid
                     reason = "You don't need to revalidate at the moment, your supervision is still valid"
                     result = {
-                        'error': reason,
+                        "error": reason,
                     }
                     return BadRequestResponse(result)
             else:
-                #A pending request already exist
+                # A pending request already exist
                 reason = "You are not able to perform this action as you already have a pending supervision request"
                 result = {
-                    'error': reason,
+                    "error": reason,
                 }
                 return BadRequestResponse(result)
         else:
-            #No key is present in supervisee
-            #Make sure all tracks are invalid
-            supervisiontracks = SupervisionTrack.objects.filter(supervisee=supervisee, is_valid=True)
+            # No key is present in supervisee
+            # Make sure all tracks are invalid
+            supervisiontracks = SupervisionTrack.objects.filter(
+                supervisee=supervisee, is_valid=True
+            )
             # This should never be the case but if it happens invalidate all tracks
             if supervisiontracks.count() > 0:
                 now = datetime.datetime.now()
@@ -610,17 +714,17 @@ class SuperviseeReValidationView(BaseUpdateSupervisionTrackFromSuperviseeView):
                     track.expiration_date = now
                     track.save()
 
-            #Not allowed to do this (unproper profile.status)
+            # Not allowed to do this (unproper profile.status)
             reason = "You are not allowed to perform this action, you first need to get a valid supervision"
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BaseUpdateSupervisorModeView(generics.UpdateAPIView):
@@ -635,8 +739,7 @@ class BaseUpdateSupervisorModeView(generics.UpdateAPIView):
         return super(BaseUpdateSupervisorModeView, self).get_permissions()
 
 
-
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SetSupervisorModeView(BaseUpdateSupervisorModeView):
@@ -644,24 +747,23 @@ class SetSupervisorModeView(BaseUpdateSupervisorModeView):
 
     def put(self, request):
         user = request.user
-        now = datetime.datetime.now()
 
         if user.is_superuser:
             user.profile.is_supervisor = True
             user.profile.save()
             user.save()
         else:
-            #Not allowed to do this (unproper profile.status - not admin)
+            # Not allowed to do this (unproper profile.status - not admin)
             reason = "You are not allowed to perform this action"
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class RemoveSupervisorModeView(BaseUpdateSupervisorModeView):
@@ -670,7 +772,9 @@ class RemoveSupervisorModeView(BaseUpdateSupervisorModeView):
     def put(self, request):
         user = request.user
         now = datetime.datetime.now()
-        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+        expiration_date_delta = datetime.timedelta(
+            days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS
+        )
 
         if user.is_superuser:
             user.profile.is_supervisor = False
@@ -679,11 +783,28 @@ class RemoveSupervisorModeView(BaseUpdateSupervisorModeView):
 
             # Reject all his supervisees and inform by email
             # Make sure all supervision tracks are invalid for rejected supervisor
-            supervisiontracks = SupervisionTrack.objects.filter(supervisor=user).filter(Q(supervisee__profile__status=Profile.REJECTED)|Q(supervisee__profile__status=Profile.YEARREVALIDATION)|Q(supervisee__profile__status=Profile.ACCEPTED)|Q(supervisee__profile__status=Profile.BLOCKED)).filter(Q(supervisee__profile__supervision_key=models.F('supervision_key'))).exclude(Q(supervisee__profile__is_supervisor=True))
-            supervisiontracks_new_users = SupervisionTrack.objects.filter(supervisor=user).filter(Q(supervisee__profile__status=Profile.NEWUSER)|Q(supervisee__profile__status=Profile.WAITINGVALIDATION))
+            supervisiontracks = (
+                SupervisionTrack.objects.filter(supervisor=user)
+                .filter(
+                    Q(supervisee__profile__status=Profile.REJECTED)
+                    | Q(supervisee__profile__status=Profile.YEARREVALIDATION)
+                    | Q(supervisee__profile__status=Profile.ACCEPTED)
+                    | Q(supervisee__profile__status=Profile.BLOCKED)
+                )
+                .filter(
+                    Q(supervisee__profile__supervision_key=models.F("supervision_key"))
+                )
+                .exclude(Q(supervisee__profile__is_supervisor=True))
+            )
+            supervisiontracks_new_users = SupervisionTrack.objects.filter(
+                supervisor=user
+            ).filter(
+                Q(supervisee__profile__status=Profile.NEWUSER)
+                | Q(supervisee__profile__status=Profile.WAITINGVALIDATION)
+            )
 
             parsed_url = urlparse(settings.URL_PREFIX)
-            server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+            server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
             if supervisiontracks.count() > 0:
                 for track in supervisiontracks:
@@ -693,10 +814,12 @@ class RemoveSupervisorModeView(BaseUpdateSupervisorModeView):
                     track_supervisee = track.supervisee
                     if track_supervisee.profile.status != Profile.BLOCKED:
                         track_supervisee.profile.status = Profile.REJECTED
-                        if track_supervisee.profile.rejection_date == None:
-                            track_supervisee.profile.rejection_date = now + expiration_date_delta
+                        if track_supervisee.profile.rejection_date is None:
+                            track_supervisee.profile.rejection_date = (
+                                now + expiration_date_delta
+                            )
                     else:
-                            track_supervisee.profile.rejection_date = None
+                        track_supervisee.profile.rejection_date = None
 
                     track_supervisee.profile.supervision_key = None
 
@@ -705,23 +828,27 @@ class RemoveSupervisorModeView(BaseUpdateSupervisorModeView):
                     track_supervisee.save()
 
                     context = {
-                        'supervisor': user,
-                        'supervisee': track_supervisee,
-                        'prefix': server_address,
+                        "supervisor": user,
+                        "supervisee": track_supervisee,
+                        "prefix": server_address,
                     }
 
-                    mail.send_email('registration/mail.supervisor_failed_rejected.subject.txt',
-                                    'registration/mail.supervisor_failed_rejected.message.txt',
-                                    context,
-                                    [track_supervisee.email])
+                    mail.send_email(
+                        "registration/mail.supervisor_failed_rejected.subject.txt",
+                        "registration/mail.supervisor_failed_rejected.message.txt",
+                        context,
+                        [track_supervisee.email],
+                    )
 
                     if track_supervisee.profile.status == Profile.WAITINGVALIDATION:
-                        registration_profile = RegistrationProfile.objects.get(user=track_supervisee)
+                        registration_profile = RegistrationProfile.objects.get(
+                            user=track_supervisee
+                        )
                         track_supervisee.profile.delete()
                         track_supervisee.delete()
                         registration_profile.delete()
 
-                    #New supervision request refused
+                    # New supervision request refused
                     if track.start_date is None:
                         track.delete()
 
@@ -731,38 +858,42 @@ class RemoveSupervisorModeView(BaseUpdateSupervisorModeView):
                     track_supervisor = track.supervisor
 
                     context = {
-                        'supervisor': track_supervisor,
-                        'supervisee': track_supervisee,
-                        'prefix': server_address,
+                        "supervisor": track_supervisor,
+                        "supervisee": track_supervisee,
+                        "prefix": server_address,
                     }
 
-                    #New user account waiting validation, so delete this account and inform by email the user
-                    mail.send_email('registration/mail.supervisor_rejected.subject.txt',
-                                    'registration/mail.supervisor_rejected_delete_account.message.txt',
-                                    context,
-                                    [track_supervisee.email])
+                    # New user account waiting validation, so delete this account and inform by email the user
+                    mail.send_email(
+                        "registration/mail.supervisor_rejected.subject.txt",
+                        "registration/mail.supervisor_rejected_delete_account.message.txt",
+                        context,
+                        [track_supervisee.email],
+                    )
 
-                    registration_profile = RegistrationProfile.objects.get(user=track_supervisee)
+                    registration_profile = RegistrationProfile.objects.get(
+                        user=track_supervisee
+                    )
                     track_supervisee.profile.delete()
                     track_supervisee.delete()
                     registration_profile.delete()
 
-                    #New supervision request refused
+                    # New supervision request refused
                     if track.start_date is None:
                         track.delete()
 
         else:
-            #Not allowed to do this (unproper profile.status - not admin)
+            # Not allowed to do this (unproper profile.status - not admin)
             reason = "You are not allowed to perform this action"
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BaseListSupervisorCandidatesView(generics.ListAPIView):
@@ -777,8 +908,7 @@ class BaseListSupervisorCandidatesView(generics.ListAPIView):
         return super(BaseListSupervisorCandidatesView, self).get_permissions()
 
 
-
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class ListSupervisorCandidatesView(BaseListSupervisorCandidatesView):
@@ -789,20 +919,32 @@ class ListSupervisorCandidatesView(BaseListSupervisorCandidatesView):
 
         if user.is_superuser:
             specialusers = ["AnonymousUser", "plot", "system", "scheduler"]
-            queryset    = User.objects.filter(profile__is_supervisor=False).filter(Q(profile__status=Profile.ACCEPTED)|Q(profile__status=Profile.REJECTED)|Q(profile__status=Profile.YEARREVALIDATION)|Q(profile__status=Profile.BLOCKED)).exclude(is_superuser=True).exclude(username__in=specialusers)
-            serializer  = UserSerializer(queryset, many=True, context ={'request': request})
+            queryset = (
+                User.objects.filter(profile__is_supervisor=False)
+                .filter(
+                    Q(profile__status=Profile.ACCEPTED)
+                    | Q(profile__status=Profile.REJECTED)
+                    | Q(profile__status=Profile.YEARREVALIDATION)
+                    | Q(profile__status=Profile.BLOCKED)
+                )
+                .exclude(is_superuser=True)
+                .exclude(username__in=specialusers)
+            )
+            serializer = UserSerializer(
+                queryset, many=True, context={"request": request}
+            )
             return Response(serializer.data)
 
         else:
-            #Not allowed to do this (unproper profile.status - not admin)
+            # Not allowed to do this (unproper profile.status - not admin)
             reason = "You are not allowed to perform this action"
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BaseUpdateSupervisorCandidateView(generics.UpdateAPIView):
@@ -817,8 +959,7 @@ class BaseUpdateSupervisorCandidateView(generics.UpdateAPIView):
         return super(BaseUpdateSupervisorCandidateView, self).get_permissions()
 
 
-
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class UpdateSupervisorCandidateView(BaseUpdateSupervisorCandidateView):
@@ -830,20 +971,21 @@ class UpdateSupervisorCandidateView(BaseUpdateSupervisorCandidateView):
 
         if user.is_superuser:
             try:
-                supervisee_username = request.data['name']
-            except:
-                #Invalid supervisee username
+                supervisee_username = request.data["name"]
+            except Exception:
+                # Invalid supervisee username
                 reason = "Invalid supervisee username"
                 result = {
-                    'error': reason,
+                    "error": reason,
                 }
                 return BadRequestResponse(result)
 
             supervisee = User.objects.get(username=supervisee_username)
-            profile_supervisee = Profile.objects.get(user=supervisee)
 
-            #Invalidate all valid tracks
-            supervisiontracks = SupervisionTrack.objects.filter(supervisee=supervisee, is_valid=True)
+            # Invalidate all valid tracks
+            supervisiontracks = SupervisionTrack.objects.filter(
+                supervisee=supervisee, is_valid=True
+            )
             # This should never be the case but if it happens invalidate all tracks
             if supervisiontracks.count() > 0:
                 for track in supervisiontracks:
@@ -851,23 +993,25 @@ class UpdateSupervisorCandidateView(BaseUpdateSupervisorCandidateView):
                     track.expiration_date = now
                     track.save()
 
-            #Supervision from admin
-            supervisee.profile.supervision_key = supervisee.profile._generate_current_supervision_key()
+            # Supervision from admin
+            supervisee.profile.supervision_key = (
+                supervisee.profile._generate_current_supervision_key()
+            )
 
             supervisiontrack = SupervisionTrack.objects.create(
-                supervisee = supervisee,
-                supervisor = request.user,
-                is_valid = True,
-                )
+                supervisee=supervisee, supervisor=request.user, is_valid=True,
+            )
 
-            #Assign key to supervision track
+            # Assign key to supervision track
             supervisiontrack.supervision_key = supervisee.profile.supervision_key
             supervisiontrack.save()
 
             supervisee.profile.supervision.add(supervisiontrack)
             supervisee.save()
 
-            expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_EXPIRATION_DAYS)
+            expiration_date_delta = datetime.timedelta(
+                days=settings.ACCOUNT_EXPIRATION_DAYS
+            )
             supervisiontrack.expiration_date = now + expiration_date_delta
 
             supervisiontrack.start_date = now
@@ -882,29 +1026,31 @@ class UpdateSupervisorCandidateView(BaseUpdateSupervisorCandidateView):
             supervisee.save()
 
             parsed_url = urlparse(settings.URL_PREFIX)
-            server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+            server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
-            #Inform by email the new supervisor
+            # Inform by email the new supervisor
             context = {
-                'supervisor': request.user,
-                'supervisee': supervisee,
-                'prefix': server_address,
+                "supervisor": request.user,
+                "supervisee": supervisee,
+                "prefix": server_address,
             }
 
-            mail.send_email('registration/mail.grant_supervisor_access.subject.txt',
-                            'registration/mail.grant_supervisor_access.message.txt',
-                            context,
-                            [supervisee.email])
+            mail.send_email(
+                "registration/mail.grant_supervisor_access.subject.txt",
+                "registration/mail.grant_supervisor_access.message.txt",
+                context,
+                [supervisee.email],
+            )
 
             return Response(status=status.HTTP_204_NO_CONTENT)
 
         else:
-            #Not allowed to do this (unproper profile.status - not admin)
+            # Not allowed to do this (unproper profile.status - not admin)
             reason = "You are not allowed to perform this action"
             result = {
-                'error': reason,
+                "error": reason,
             }
             return BadRequestResponse(result)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
diff --git a/beat/web/accounts/models.py b/beat/web/accounts/models.py
index 9bb5ce5b9..71f2ecb78 100644
--- a/beat/web/accounts/models.py
+++ b/beat/web/accounts/models.py
@@ -164,16 +164,21 @@ class TemporaryUrlManager(models.Manager):
             for _ in range(length)
         )
         now = datetime.datetime.now()
-        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR)
+        expiration_date_delta = datetime.timedelta(
+            days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR
+        )
         expires = now + expiration_date_delta
 
-        temporary_url = self.model(status=status,
-                                   url_hash=url_hash,
-                                   expires=expires,
-                                   supervision_track=supervision_track)
+        temporary_url = self.model(
+            status=status,
+            url_hash=url_hash,
+            expires=expires,
+            supervision_track=supervision_track,
+        )
         temporary_url.save()
         return temporary_url
 
+
 class TemporaryUrl(models.Model):
     # _____ Constants __________
 
diff --git a/beat/web/accounts/urls.py b/beat/web/accounts/urls.py
index 9363e8617..6e7bced0f 100644
--- a/beat/web/accounts/urls.py
+++ b/beat/web/accounts/urls.py
@@ -29,7 +29,15 @@ from django.conf.urls import url
 from . import views
 
 urlpatterns = [
-    url(r'^settings/$', views.account_settings, name='settings'),
-    url(r'^validation/(?P<hash_url>\w+)/$', views.load_temporary_url_validation, name="temp_url_validation"),
-    url(r'^rejection/(?P<hash_url>\w+)/$', views.load_temporary_url_rejection, name="temp_url_rejection"),
+    url(r"^settings/$", views.account_settings, name="settings"),
+    url(
+        r"^validation/(?P<hash_url>\w+)/$",
+        views.load_temporary_url_validation,
+        name="temp_url_validation",
+    ),
+    url(
+        r"^rejection/(?P<hash_url>\w+)/$",
+        views.load_temporary_url_rejection,
+        name="temp_url_rejection",
+    ),
 ]
diff --git a/beat/web/accounts/views.py b/beat/web/accounts/views.py
index e9d528fec..e05852bfa 100644
--- a/beat/web/accounts/views.py
+++ b/beat/web/accounts/views.py
@@ -36,11 +36,8 @@ from django.contrib.auth.models import User
 from django.contrib import messages
 
 from django.db import models
-from django.db.models import Q
 
 from rest_framework.authtoken.models import Token
-from rest_framework.response import Response
-from rest_framework import status
 
 from .forms import AccountSettingsForm
 
@@ -51,10 +48,6 @@ from .models import TemporaryUrl
 
 from ..utils import mail
 
-from ..common.responses import BadRequestResponse, ForbiddenResponse
-
-from datetime import datetime, timedelta
-
 import datetime
 from urllib.parse import urlparse
 
@@ -67,23 +60,32 @@ def account_settings(request):
     user = request.user
     password_change_form = PasswordChangeForm(user=user)
 
-    if request.method == 'POST':
-        if 'password' in request.POST:
+    if request.method == "POST":
+        if "password" in request.POST:
             password_change_form = PasswordChangeForm(data=request.POST, user=user)
             if password_change_form.is_valid():
                 password_change_form.save()
-                messages.add_message(request, messages.SUCCESS, 'Password changed successfully')
+                messages.add_message(
+                    request, messages.SUCCESS, "Password changed successfully"
+                )
 
-        elif 'token' in request.POST:
+        elif "token" in request.POST:
             user.auth_token.delete()
             Token.objects.create(user=user)
-            messages.add_message(request, messages.SUCCESS, 'Token changed successfully')
+            messages.add_message(
+                request, messages.SUCCESS, "Token changed successfully"
+            )
 
-        else: #'settings'
-            account_settings_form = AccountSettingsForm(data=request.POST, instance=account_settings)
+        else:
+            # "settings"
+            account_settings_form = AccountSettingsForm(
+                data=request.POST, instance=account_settings
+            )
             if account_settings_form.is_valid():
-              account_settings_form.save()
-              messages.add_message(request, messages.SUCCESS, 'Account settings changed successfully')
+                account_settings_form.save()
+                messages.add_message(
+                    request, messages.SUCCESS, "Account settings changed successfully"
+                )
 
     else:
         account_settings_form = AccountSettingsForm(instance=account_settings)
@@ -95,45 +97,78 @@ def account_settings(request):
     supervisors_valid = None
     supervisors_pending = None
     supervisiontracks_supervisors_valid = None
-    if user.profile.is_supervisor == False and not user.is_superuser:
+    if not user.profile.is_supervisor and not user.is_superuser:
         supervisee = user
         if supervisee.profile.supervision_key is not None:
-            #There's a key check if there's a valid track
-            supervisiontrack = SupervisionTrack.objects.get(supervisee=supervisee, supervisee__profile__supervision_key=models.F('supervision_key'))
+            # There's a key check if there's a valid track
+            supervisiontrack = SupervisionTrack.objects.get(
+                supervisee=supervisee,
+                supervisee__profile__supervision_key=models.F("supervision_key"),
+            )
         else:
             supervisiontrack = None
     elif user.profile.is_supervisor and not user.is_superuser:
         supervisor = user
-        #Filter and get all supervision tracks valid and
-        supervisiontracks_valid = SupervisionTrack.objects.filter(supervisor=supervisor, is_valid=True)
-        supervisiontracks_pending = SupervisionTrack.objects.filter(supervisor=supervisor, is_valid=False, start_date=None).exclude(supervisee__profile__status=Profile.NEWUSER)
+        # Filter and get all supervision tracks valid and
+        supervisiontracks_valid = SupervisionTrack.objects.filter(
+            supervisor=supervisor, is_valid=True
+        )
+        supervisiontracks_pending = SupervisionTrack.objects.filter(
+            supervisor=supervisor, is_valid=False, start_date=None
+        ).exclude(supervisee__profile__status=Profile.NEWUSER)
         if supervisor.profile.supervision_key is not None:
-            #There's a key check if there's a valid track
-            supervisiontrack = SupervisionTrack.objects.get(supervisee=supervisor, supervisee__profile__supervision_key=models.F('supervision_key'))
+            # There's a key check if there's a valid track
+            supervisiontrack = SupervisionTrack.objects.get(
+                supervisee=supervisor,
+                supervisee__profile__supervision_key=models.F("supervision_key"),
+            )
         else:
             supervisiontrack = None
     else:
         supervisor = user
-        #Filter and get all supervision tracks valid and pending
-        supervisiontracks_valid = SupervisionTrack.objects.filter(supervisor=supervisor, is_valid=True, supervisee__profile__is_supervisor=False)
-        supervisiontracks_pending = SupervisionTrack.objects.filter(supervisor=supervisor, is_valid=False, start_date=None, supervisee__profile__is_supervisor=False).exclude(supervisee__profile__status=Profile.NEWUSER)
-        #Get all new supervisor accounts pending requests and valid
-        supervisors_valid = User.objects.filter(profile__is_supervisor=True, profile__status=Profile.ACCEPTED, is_superuser=False)
-        supervisiontracks_supervisors_valid = SupervisionTrack.objects.filter(supervisee__profile__is_supervisor=True, is_valid=True)
-        supervisors_pending = User.objects.filter(profile__is_supervisor=True, profile__status=Profile.WAITINGVALIDATION, is_superuser=False)
-
-    return render(request,
-                  'accounts/settings.html',
-                  {'account_settings_form': account_settings_form,
-                   'password_change_form': password_change_form,
-                   'user': user,
-                   'supervisiontrack': supervisiontrack,
-                   'supervisiontracks_valid': supervisiontracks_valid,
-                   'supervisiontracks_pending': supervisiontracks_pending,
-                   'supervisiontracks_supervisors_valid': supervisiontracks_supervisors_valid,
-                   'supervisors_valid': supervisors_valid,
-                   'supervisors_pending': supervisors_pending,
-                   'token' : user.auth_token})
+        # Filter and get all supervision tracks valid and pending
+        supervisiontracks_valid = SupervisionTrack.objects.filter(
+            supervisor=supervisor,
+            is_valid=True,
+            supervisee__profile__is_supervisor=False,
+        )
+        supervisiontracks_pending = SupervisionTrack.objects.filter(
+            supervisor=supervisor,
+            is_valid=False,
+            start_date=None,
+            supervisee__profile__is_supervisor=False,
+        ).exclude(supervisee__profile__status=Profile.NEWUSER)
+        # Get all new supervisor accounts pending requests and valid
+        supervisors_valid = User.objects.filter(
+            profile__is_supervisor=True,
+            profile__status=Profile.ACCEPTED,
+            is_superuser=False,
+        )
+        supervisiontracks_supervisors_valid = SupervisionTrack.objects.filter(
+            supervisee__profile__is_supervisor=True, is_valid=True
+        )
+        supervisors_pending = User.objects.filter(
+            profile__is_supervisor=True,
+            profile__status=Profile.WAITINGVALIDATION,
+            is_superuser=False,
+        )
+
+    return render(
+        request,
+        "accounts/settings.html",
+        {
+            "account_settings_form": account_settings_form,
+            "password_change_form": password_change_form,
+            "user": user,
+            "supervisiontrack": supervisiontrack,
+            "supervisiontracks_valid": supervisiontracks_valid,
+            "supervisiontracks_pending": supervisiontracks_pending,
+            "supervisiontracks_supervisors_valid": supervisiontracks_supervisors_valid,
+            "supervisors_valid": supervisors_valid,
+            "supervisors_pending": supervisors_pending,
+            "token": user.auth_token,
+        },
+    )
 
 
 def generate_load_response(request, temp_url, template, parameters):
@@ -158,7 +193,9 @@ def load_temporary_url_validation(request, hash_url):
         if supervisee.profile.status != Profile.ACCEPTED and now < temp_url.expires:
             supervisiontrack.is_valid = True
 
-            expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_EXPIRATION_DAYS)
+            expiration_date_delta = datetime.timedelta(
+                days=settings.ACCOUNT_EXPIRATION_DAYS
+            )
             supervisiontrack.expiration_date = now + expiration_date_delta
 
             supervisiontrack.start_date = now
@@ -172,42 +209,57 @@ def load_temporary_url_validation(request, hash_url):
             supervisee.save()
 
             parsed_url = urlparse(settings.URL_PREFIX)
-            server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+            server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
             context = {
-                'supervisor': supervisiontrack.supervisor,
-                'supervisee': supervisee,
-                'prefix': server_address,
+                "supervisor": supervisiontrack.supervisor,
+                "supervisee": supervisee,
+                "prefix": server_address,
             }
 
-            mail.send_email('registration/mail.supervisor_validated.subject.txt',
-                            'registration/mail.supervisor_validated.message.txt',
-                            context,
-                            [supervisee.email])
-
-            return generate_load_response(request, temp_url, "accounts/url_validation.html", {"supervisiontrack": supervisiontrack})
+            mail.send_email(
+                "registration/mail.supervisor_validated.subject.txt",
+                "registration/mail.supervisor_validated.message.txt",
+                context,
+                [supervisee.email],
+            )
+
+            return generate_load_response(
+                request,
+                temp_url,
+                "accounts/url_validation.html",
+                {"supervisiontrack": supervisiontrack},
+            )
         else:
-            #Track already valid
-            return generate_load_response(request, temp_url, "accounts/url_validation_failed.html", {})
+            # Track already valid
+            return generate_load_response(
+                request, temp_url, "accounts/url_validation_failed.html", {}
+            )
     elif temp_url.status == TemporaryUrl.YEARREVALIDATION:
         # Supervisee re-validation
         if supervisee.profile.supervision_key is not None and now < temp_url.expires:
             if supervisiontrack.is_valid:
                 if supervisee.profile.status == Profile.YEARREVALIDATION:
-                    #Check Supervisor validity
+                    # Check Supervisor validity
                     supervisor = supervisiontrack.supervisor
-                    #If Supervisor account is not valid. Reject the account (though this should already be done during supervisor rejection)
+                    # If Supervisor account is not valid. Reject the account (though this should already be done during supervisor rejection)
                     if supervisor.profile.status != Profile.BLOCKED:
-                        #Change status
+                        # Change status
                         supervisee.profile.status = Profile.ACCEPTED
-                        #Extend supervisiontrack validity for another 12 months
-                        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_EXPIRATION_DAYS)
-                        new_expiration_date = supervisiontrack.expiration_date + expiration_date_delta
+                        # Extend supervisiontrack validity for another 12 months
+                        expiration_date_delta = datetime.timedelta(
+                            days=settings.ACCOUNT_EXPIRATION_DAYS
+                        )
+                        new_expiration_date = (
+                            supervisiontrack.expiration_date + expiration_date_delta
+                        )
                         supervisiontrack.expiration_date = new_expiration_date
                         supervisiontrack.last_validation_date = now
                     else:
-                        #Change status
-                        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+                        # Change status
+                        expiration_date_delta = datetime.timedelta(
+                            days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS
+                        )
 
                         supervisiontrack.expiration_date = now
                         supervisiontrack.is_valid = False
@@ -215,7 +267,7 @@ def load_temporary_url_validation(request, hash_url):
                         supervisee.profile.status = Profile.REJECTED
                         supervisee.profile.rejection_date = now + expiration_date_delta
                         supervisee.profile.supervision_key = None
-                    #save
+                    # save
                     supervisiontrack.save()
                     supervisee.profile.save()
                     supervisee.save()
@@ -223,9 +275,14 @@ def load_temporary_url_validation(request, hash_url):
                     # 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)
+                    server_address = "%s://%s" % (
+                        parsed_url.scheme,
+                        parsed_url.hostname,
+                    )
 
-                    temp_url_rejection = TemporaryUrl.objects.create_temporary_url(TemporaryUrl.REJECTION, supervisiontrack)
+                    temp_url_rejection = TemporaryUrl.objects.create_temporary_url(
+                        TemporaryUrl.REJECTION, supervisiontrack
+                    )
 
                     context = {
                         "supervisor": supervisiontrack.supervisor,
@@ -241,19 +298,31 @@ def load_temporary_url_validation(request, hash_url):
                         [supervisiontrack.supervisor.email],
                     )
                 else:
-                    #Track already valid
+                    # Track already valid
                     error_message = "You don't need to revalidate at the moment, your supervision is still valid"
-                    return generate_load_response(request, temp_url, "accounts/url_revalidation_failed.html", {"error_message": error_message})
+                    return generate_load_response(
+                        request,
+                        temp_url,
+                        "accounts/url_revalidation_failed.html",
+                        {"error_message": error_message},
+                    )
 
             else:
-                #A pending request already exist
+                # A pending request already exist
                 error_message = "You are not able to perform this action as you already have a pending supervision request"
-                return generate_load_response(request, temp_url, "accounts/url_revalidation_failed.html", {"error_message": error_message})
+                return generate_load_response(
+                    request,
+                    temp_url,
+                    "accounts/url_revalidation_failed.html",
+                    {"error_message": error_message},
+                )
 
         else:
-            #No key is present in supervisee
-            #Make sure all tracks are invalid
-            supervisiontracks = SupervisionTrack.objects.filter(supervisee=supervisee, is_valid=True)
+            # No key is present in supervisee
+            # Make sure all tracks are invalid
+            supervisiontracks = SupervisionTrack.objects.filter(
+                supervisee=supervisee, is_valid=True
+            )
             # This should never be the case but if it happens invalidate all tracks
             if supervisiontracks.count() > 0:
                 now = datetime.datetime.now()
@@ -262,15 +331,27 @@ def load_temporary_url_validation(request, hash_url):
                     track.expiration_date = now
                     track.save()
 
-            #Not allowed to do this (unproper profile.status)
+            # Not allowed to do this (unproper profile.status)
             error_message = "You are not allowed to perform this action, you first need to get a valid supervision"
-            return generate_load_response(request, temp_url, "accounts/url_revalidation_failed.html", {"error_message": error_message})
-
-        return generate_load_response(request, temp_url, "accounts/url_validation.html", {'supervisiontrack': supervisiontrack})
+            return generate_load_response(
+                request,
+                temp_url,
+                "accounts/url_revalidation_failed.html",
+                {"error_message": error_message},
+            )
+
+        return generate_load_response(
+            request,
+            temp_url,
+            "accounts/url_validation.html",
+            {"supervisiontrack": supervisiontrack},
+        )
 
     else:
-            #Track already valid
-            return generate_load_response(request, temp_url, "accounts/url_validation_failed.html", {})
+        # Track already valid
+        return generate_load_response(
+            request, temp_url, "accounts/url_validation_failed.html", {}
+        )
 
 
 def load_temporary_url_rejection(request, hash_url):
@@ -279,12 +360,12 @@ def load_temporary_url_rejection(request, hash_url):
     supervisee = supervisiontrack.supervisee
 
     parsed_url = urlparse(settings.URL_PREFIX)
-    server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+    server_address = "%s://%s" % (parsed_url.scheme, parsed_url.hostname)
 
     context = {
-        'supervisor': supervisiontrack.supervisor,
-        'supervisee': supervisee,
-        'prefix': server_address,
+        "supervisor": supervisiontrack.supervisor,
+        "supervisee": supervisee,
+        "prefix": server_address,
     }
 
     now = datetime.datetime.now()
@@ -293,17 +374,19 @@ def load_temporary_url_rejection(request, hash_url):
         # 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)
+                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:
+                    if supervisee.profile.rejection_date is None:
                         supervisee.profile.rejection_date = now + expiration_date_delta
                 else:
-                        supervisee.profile.rejection_date = None
+                    supervisee.profile.rejection_date = None
 
                 supervisee.profile.supervision_key = None
 
@@ -311,11 +394,19 @@ def load_temporary_url_rejection(request, hash_url):
                 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", {})
+                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", {}
+    )
diff --git a/beat/web/navigation/admin.py b/beat/web/navigation/admin.py
index 138f581d4..7295a9963 100644
--- a/beat/web/navigation/admin.py
+++ b/beat/web/navigation/admin.py
@@ -36,49 +36,51 @@ from ..accounts.models import Profile
 from ..accounts.models import TemporaryUrl
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AgreementInline(admin.StackedInline):
     model = Agreement
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountSettingsInline(admin.StackedInline):
     model = AccountSettings
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SupervisionTrackInline(admin.StackedInline):
     model = SupervisionTrack
-    fk_name = 'supervisor'
+    fk_name = "supervisor"
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class ProfileInline(admin.StackedInline):
     model = Profile
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class UserAdmin(UserAdmin):
-
     def agreement_number(self, obj):
         return obj.agreement.version
-    agreement_number.admin_order_field = 'agreement__version'
+
+    agreement_number.admin_order_field = "agreement__version"
 
     def notifications(self, obj):
-        return int(obj.accountsettings.daily_summary) + \
-            int(obj.accountsettings.experiment_mail_notifications_enabled) + \
-            int(obj.accountsettings.database_notifications_enabled) + \
-            int(obj.accountsettings.environment_notifications_enabled)
+        return (
+            int(obj.accountsettings.daily_summary)
+            + int(obj.accountsettings.experiment_mail_notifications_enabled)
+            + int(obj.accountsettings.database_notifications_enabled)
+            + int(obj.accountsettings.environment_notifications_enabled)
+        )
 
     def supervisor(self, obj):
         return obj.profile.is_supervisor
@@ -92,8 +94,9 @@ class UserAdmin(UserAdmin):
         if obj.profile.is_supervisor:
             return "Supervisor account"
         else:
-            supervisiontrack = SupervisionTrack.objects.get(supervisee=obj,
-                is_valid=True)
+            supervisiontrack = SupervisionTrack.objects.get(
+                supervisee=obj, is_valid=True
+            )
             supervisor = supervisiontrack.supervisor
             return supervisor
 
@@ -103,25 +106,24 @@ class UserAdmin(UserAdmin):
     def rejection_date(self, obj):
         return obj.profile.rejection_date
 
-
     list_display = (
-        'username',
-        'is_staff',
-        'email',
-        'notifications',
-        'agreement_number',
-        'last_login',
-        'supervisor',
-        'status',
-        'supervision',
-        'supervision_key',
-        'rejection_date',
+        "username",
+        "is_staff",
+        "email",
+        "notifications",
+        "agreement_number",
+        "last_login",
+        "supervisor",
+        "status",
+        "supervision",
+        "supervision_key",
+        "rejection_date",
     )
 
     ordering = (
-        '-is_staff',
-        '-last_login',
-        'username',
+        "-is_staff",
+        "-last_login",
+        "username",
     )
 
     inlines = (
@@ -131,73 +133,68 @@ class UserAdmin(UserAdmin):
         ProfileInline,
     )
 
+
 admin.site.unregister(User)
 admin.site.register(User, UserAdmin)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class SupervisionTrackAdmin(admin.ModelAdmin):
 
-
     list_display = (
-        'supervisor',
-        'supervisee',
-        'is_valid',
-        'start_date',
-        'expiration_date',
-        'last_validation_date',
-        'supervision_key',
+        "supervisor",
+        "supervisee",
+        "is_valid",
+        "start_date",
+        "expiration_date",
+        "last_validation_date",
+        "supervision_key",
     )
 
-    ordering = (
-        'supervisor',
-        )
+    ordering = ("supervisor",)
+
 
 admin.site.register(SupervisionTrack, SupervisionTrackAdmin)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class ProfileAdmin(admin.ModelAdmin):
 
-
     list_display = (
-        'user',
-        'status',
-        'registration_date',
-        'is_supervisor',
-        'supervision_key',
-        'rejection_date',
+        "user",
+        "status",
+        "registration_date",
+        "is_supervisor",
+        "supervision_key",
+        "rejection_date",
     )
 
-    ordering = (
-        'user',
-    )
+    ordering = ("user",)
+
 
 admin.site.register(Profile, ProfileAdmin)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class TemporaryUrlAdmin(admin.ModelAdmin):
-
     def supervision_key(self, obj):
         return obj.supervision_track.supervision_key
 
     list_display = (
-        'url_hash',
-        'expires',
-        'supervision_track',
-        'supervision_key',
-        'status',
+        "url_hash",
+        "expires",
+        "supervision_track",
+        "supervision_key",
+        "status",
     )
 
-    ordering = (
-        'expires',
-    )
+    ordering = ("expires",)
+
 
 admin.site.register(TemporaryUrl, TemporaryUrlAdmin)
diff --git a/beat/web/ui/registration/models.py b/beat/web/ui/registration/models.py
index 8ce9bb90b..ad68cad19 100644
--- a/beat/web/ui/registration/models.py
+++ b/beat/web/ui/registration/models.py
@@ -144,7 +144,9 @@ class RegistrationManager(models.Manager):
                         parsed_url.hostname,
                     )
 
-                    temp_url = TemporaryUrl.objects.create_temporary_url(TemporaryUrl.VALIDATION, supervisiontrack)
+                    temp_url = TemporaryUrl.objects.create_temporary_url(
+                        TemporaryUrl.VALIDATION, supervisiontrack
+                    )
 
                     context = {
                         "supervisor": supervisor_user,
diff --git a/beat/web/ui/views.py b/beat/web/ui/views.py
index 7c0280a4d..450293e58 100755
--- a/beat/web/ui/views.py
+++ b/beat/web/ui/views.py
@@ -28,7 +28,6 @@
 
 from django.shortcuts import get_object_or_404
 from django.shortcuts import render
-from django.template import loader
 from django.contrib.auth.views import login as django_login
 from django.contrib.auth.forms import PasswordChangeForm
 from django.contrib.auth.models import User
@@ -44,7 +43,7 @@ from django.conf import settings
 
 from rest_framework.authtoken.models import Token
 
-from ..import __version__
+from .. import __version__
 from ..common.models import Shareable
 from ..accounts.models import Profile
 from ..accounts.models import SupervisionTrack
@@ -54,46 +53,50 @@ from ..utils import mail
 from .registration.forms import BlockedUserRevalidationForm
 
 import datetime
+
 try:
     from urlparse import urlparse
 except ImportError:
     from urllib.parse import urlparse
 
 import logging
+
 logger = logging.getLogger(__name__)
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 def index(request):
-    '''Our main index page'''
+    """Our main index page"""
 
-    return render(request, 'ui/index.html')
+    return render(request, "ui/index.html")
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 def login(request):
-    '''Login page'''
+    """Login page"""
 
     response = django_login(request)
     if request.user.is_authenticated():
-        path = request.GET.get('next', '/')
-        if path in ('/', reverse('login')):
-            return HttpResponseRedirect(reverse('activity-stream', args=[request.user.username]))
+        path = request.GET.get("next", "/")
+        if path in ("/", reverse("login")):
+            return HttpResponseRedirect(
+                reverse("activity-stream", args=[request.user.username])
+            )
         else:
             return HttpResponseRedirect(path)
 
     return response
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 def blocked_user_reactivation(request):
-    '''Reactivation page'''
+    """Reactivation page"""
 
     if request.method == "POST":
         form = BlockedUserRevalidationForm(request.POST)
@@ -103,64 +106,93 @@ def blocked_user_reactivation(request):
                 if user.check_password(request.POST["password"]):
                     # Check if user is a blocked user
                     if user.profile.status == Profile.BLOCKED:
-                        supervisor = User.objects.get(username=request.POST["supervisor"])
+                        supervisor = User.objects.get(
+                            username=request.POST["supervisor"]
+                        )
                         # Check the supervisor
                         if supervisor.profile.status == Profile.ACCEPTED:
                             # Check if supervision track already exists
                             if user.profile.supervision_key is None:
                                 # Create and assign key
                                 supervisee = user
-                                supervisee.profile.supervision_key = supervisee.profile._generate_current_supervision_key()
+                                supervisee.profile.supervision_key = (
+                                    supervisee.profile._generate_current_supervision_key()
+                                )
                                 supervisiontrack = SupervisionTrack.objects.create(
-                                    supervisee = supervisee,
-                                    supervisor = supervisor,
-                                    is_valid = False,
+                                    supervisee=supervisee,
+                                    supervisor=supervisor,
+                                    is_valid=False,
                                 )
 
                                 # Assign key to supervision track
-                                supervisiontrack.supervision_key = supervisee.profile.supervision_key
+                                supervisiontrack.supervision_key = (
+                                    supervisee.profile.supervision_key
+                                )
                                 supervisiontrack.save()
                                 supervisee.profile.supervision.add(supervisiontrack)
                                 # Add a rejection date to the supervisee profile
                                 now = datetime.datetime.now()
-                                expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR)
-                                if supervisee.profile.rejection_date == None:
-                                    supervisee.profile.rejection_date = now + expiration_date_delta
+                                expiration_date_delta = datetime.timedelta(
+                                    days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR
+                                )
+                                if supervisee.profile.rejection_date is None:
+                                    supervisee.profile.rejection_date = (
+                                        now + expiration_date_delta
+                                    )
 
                                 supervisee.profile.save()
                                 supervisee.save()
 
-                                #Inform by email the supervisor that he has a new supervisee request
+                                # Inform by email the supervisor that he has a new supervisee request
                                 parsed_url = urlparse(settings.URL_PREFIX)
-                                server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname)
+                                server_address = "%s://%s" % (
+                                    parsed_url.scheme,
+                                    parsed_url.hostname,
+                                )
 
-                                temp_url = TemporaryUrl.objects.create_temporary_url(TemporaryUrl.VALIDATION, supervisiontrack)
+                                temp_url = TemporaryUrl.objects.create_temporary_url(
+                                    TemporaryUrl.VALIDATION, supervisiontrack
+                                )
                                 context = {
-                                    'supervisor': supervisor,
-                                    'supervisee': supervisee,
-                                    'prefix': server_address,
-                                    'temp_url': temp_url.url_hash,
+                                    "supervisor": supervisor,
+                                    "supervisee": supervisee,
+                                    "prefix": server_address,
+                                    "temp_url": temp_url.url_hash,
                                 }
 
-                                mail.send_email('registration/mail.supervisor_validation.subject.txt',
-                                                'registration/mail.supervisor_validation_supervisee_add_request.message.txt',
-                                                context,
-                                                [supervisor.email])
+                                mail.send_email(
+                                    "registration/mail.supervisor_validation.subject.txt",
+                                    "registration/mail.supervisor_validation_supervisee_add_request.message.txt",
+                                    context,
+                                    [supervisor.email],
+                                )
 
                                 # inform the supervisee of his request
-                                mail.send_email('registration/mail.supervisee_blocked_validation_wait.subject.txt',
-                                                'registration/mail.supervisee_blocked_state_wait_for_activation.message.txt',
-                                                context,
-                                                [supervisee.email])
+                                mail.send_email(
+                                    "registration/mail.supervisee_blocked_validation_wait.subject.txt",
+                                    "registration/mail.supervisee_blocked_state_wait_for_activation.message.txt",
+                                    context,
+                                    [supervisee.email],
+                                )
 
-                                messages.success(request, "Your supervision request has been successfully processed.")
+                                messages.success(
+                                    request,
+                                    "Your supervision request has been successfully processed.",
+                                )
                             else:
-                                messages.error(request, "A supervision request already exists for this account, you need to wait for your supervisor's decision.")
+                                messages.error(
+                                    request,
+                                    "A supervision request already exists for this account, you need to wait for your supervisor's decision.",
+                                )
                         else:
-                            messages.error(request, "The selected supervisor is not valid.")
+                            messages.error(
+                                request, "The selected supervisor is not valid."
+                            )
                     else:
-                        path = request.GET.get('next', '/')
-                        messages.error(request, "Your profile is not blocked, you can go to the login page instead.")
+                        messages.error(
+                            request,
+                            "Your profile is not blocked, you can go to the login page instead.",
+                        )
                 else:
                     # Don't give too much details though we know the problem is the password only at this step
                     messages.error(request, "Wrong user or password combination!")
@@ -169,20 +201,18 @@ def blocked_user_reactivation(request):
                 messages.error(request, "Wrong user or password combination!")
                 pass
 
-            #return redirect('blocked_user_reactivation', pk=post.pk)
+            # return redirect('blocked_user_reactivation', pk=post.pk)
     else:
         form = BlockedUserRevalidationForm()
 
-    return render(request,
-                  'registration/blocked_user_reactivate.html',
-                  {'form': form})
+    return render(request, "registration/blocked_user_reactivate.html", {"form": form})
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 def gather_contributions(requestor, author):
-    '''Gather contributions that are accessible to a certain requestor'''
+    """Gather contributions that are accessible to a certain requestor"""
 
     from ..experiments.models import Experiment
     from ..toolchains.models import Toolchain
@@ -203,165 +233,195 @@ def gather_contributions(requestor, author):
     teams = Team.objects.for_user(requestor).filter(owner=author)
     plotters = Plotter.objects.for_user(requestor).filter(author=author)
     if requestor == author:
-      attestations = Attestation.objects.filter(experiment__author=author)
+        attestations = Attestation.objects.filter(experiment__author=author)
     else:
-      attestations = Attestation.objects.published().filter(experiment__author=author)
+        attestations = Attestation.objects.published().filter(experiment__author=author)
     searches = Search.objects.for_user(requestor).filter(author=author)
     if requestor == author:
-      reports = Report.objects.filter(author=author)
+        reports = Report.objects.filter(author=author)
     else:
-      reports = Report.objects.published().filter(author=author)
+        reports = Report.objects.published().filter(author=author)
 
     return dict(
-
         experiments=experiments,
         toolchains=toolchains,
         algorithms=algorithms,
         libraries=libraries,
         dataformats=dataformats,
         teams=teams,
-
         attestations=attestations,
         searches=searches,
         reports=reports,
         plotters=plotters,
-
     )
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 def activity_stream(request, author_name):
-    '''User-specific activity stream'''
+    """User-specific activity stream"""
 
     # check that the user exists on the system
     author = get_object_or_404(User, username=author_name)
 
     # gather leaderboards for the following conditions:
     from ..search.models import Search, Leaderboard
+
     if request.user == author:
-      # 1. request.user == author AND user is subscribed
-      leaderboards = Leaderboard.objects.filter(search__in=Search.objects.for_user(author, add_public=True), notify__in=(author,)).order_by('-changed')
+        # 1. request.user == author AND user is subscribed
+        leaderboards = Leaderboard.objects.filter(
+            search__in=Search.objects.for_user(author, add_public=True),
+            notify__in=(author,),
+        ).order_by("-changed")
     else:
-      # 2. request.user != author
-      leaderboards = Leaderboard.objects.filter(search__in=Search.objects.for_user(request.user).filter(author=author)).order_by('-changed')
-
-    return render(request,
-                  'ui/activity_stream.html',
-                  dict(
-                      owner = (request.user == author),
-                      author= author,
-                      statistics= gather_contributions(request.user, author),
-                      leaderboards= leaderboards,
-                  ))
+        # 2. request.user != author
+        leaderboards = Leaderboard.objects.filter(
+            search__in=Search.objects.for_user(request.user).filter(author=author)
+        ).order_by("-changed")
+
+    return render(
+        request,
+        "ui/activity_stream.html",
+        dict(
+            owner=(request.user == author),
+            author=author,
+            statistics=gather_contributions(request.user, author),
+            leaderboards=leaderboards,
+        ),
+    )
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 @login_required
 def docreq(request, author_name):
-    '''Request a documentation for an existing platform object'''
+    """Request a documentation for an existing platform object"""
 
-    url = request.META.get('HTTP_REFERER')
-    if not url: raise Http404()
-    if author_name not in url: raise Http404()
+    url = request.META.get("HTTP_REFERER")
+    if not url:
+        raise Http404()
+    if author_name not in url:
+        raise Http404()
 
     author = get_object_or_404(User, username=author_name)
 
-    to = '%s %s <%s>' % (author.first_name, author.last_name, author.email)
-    cc = '%s %s <%s>' % (request.user.first_name, request.user.last_name,
-                         request.user.email)
+    to = "%s %s <%s>" % (author.first_name, author.last_name, author.email)
+    cc = "%s %s <%s>" % (
+        request.user.first_name,
+        request.user.last_name,
+        request.user.email,
+    )
 
     try:
-        subject_template = 'ui/docreq_email_subject.txt'
-        subject = render_to_string(subject_template,
-                                   {
-                                       'user': request.user,
-                                       'url': url,
-                                   },
+        subject_template = "ui/docreq_email_subject.txt"
+        subject = render_to_string(
+            subject_template, {"user": request.user, "url": url},
         ).strip()
-        body_template = 'ui/docreq_email_body.txt'
-        body = render_to_string(body_template,
-                                {
-                                    'user': request.user,
-                                    'url': url,
-                                    'beat_version': __version__,
-                                },
+        body_template = "ui/docreq_email_body.txt"
+        body = render_to_string(
+            body_template,
+            {"user": request.user, "url": url, "beat_version": __version__},
+        )
+        message = EmailMessage(
+            subject=subject,
+            body=body,
+            from_email=settings.DEFAULT_FROM_EMAIL,
+            to=[to],
+            reply_to=[cc],
         )
-        message = EmailMessage(subject=subject, body=body,
-                               from_email=settings.DEFAULT_FROM_EMAIL, to=[to], reply_to=[cc])
         message.send()
     except Exception:
         import traceback
-        logger.warn("Could not send e-mail to `%s' (cc: `%s') about " \
-                    "documentation request for `%s'. Exception caught: %s", to, cc,
-                    url, traceback.format_exc())
+
+        logger.warn(
+            "Could not send e-mail to `%s' (cc: `%s') about "
+            "documentation request for `%s'. Exception caught: %s",
+            to,
+            cc,
+            url,
+            traceback.format_exc(),
+        )
 
     return HttpResponse()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 @login_required
 def user_settings(request):
-    '''User settings page (password and token change)'''
+    """User settings page (password and token change)"""
 
     user = request.user
 
-    if request.method == 'POST':
+    if request.method == "POST":
 
-        if 'password' in request.POST:
-            password_change_form = \
-                PasswordChangeForm(data=request.POST, user=user)
+        if "password" in request.POST:
+            password_change_form = PasswordChangeForm(data=request.POST, user=user)
             if password_change_form.is_valid():
                 password_change_form.save()
-                messages.add_message(request, messages.SUCCESS,
-                                     'Password changed successfully')
+                messages.add_message(
+                    request, messages.SUCCESS, "Password changed successfully"
+                )
 
-        elif 'token' in request.POST:
+        elif "token" in request.POST:
 
             user.auth_token.delete()
             Token.objects.create(user=user)
             password_change_form = PasswordChangeForm(user=user)
-            messages.add_message(request, messages.SUCCESS,
-                                 'Token changed successfully')
+            messages.add_message(
+                request, messages.SUCCESS, "Token changed successfully"
+            )
 
     else:
 
         password_change_form = PasswordChangeForm(user=user)
 
-    return render(request,
-                  'ui/user_settings.html',
-                  {
-                      'password_change_form': password_change_form,
-                      'token' : user.auth_token,
-                      'statistics' : {
-                          'nb_experiments': user.experiments.count(),
-                          'nb_public_experiments': user.experiments.filter(sharing=Shareable.PUBLIC).count(),
-                          'nb_attested_experiments': user.experiments.filter(~Q(attestation=None)).count(),
-                          'nb_toolchains': user.toolchains.count(),
-                          'nb_public_toolchains': user.toolchains.filter(sharing=Shareable.PUBLIC).count(),
-                          'nb_algorithms': user.algorithms.count(),
-                          'nb_public_algorithms': user.algorithms.filter(sharing=Shareable.PUBLIC).count(),
-                          'nb_libraries': user.algorithms.count(),
-                          'nb_public_libraries': user.librarys.filter(sharing=Shareable.PUBLIC).count(),
-                          'nb_dataformats': user.dataformats.count(),
-                          'nb_public_dataformats': user.dataformats.filter(sharing=Shareable.PUBLIC).count(),
-                      },
-                  })
-
-
-#----------------------------------------------------------
+    return render(
+        request,
+        "ui/user_settings.html",
+        {
+            "password_change_form": password_change_form,
+            "token": user.auth_token,
+            "statistics": {
+                "nb_experiments": user.experiments.count(),
+                "nb_public_experiments": user.experiments.filter(
+                    sharing=Shareable.PUBLIC
+                ).count(),
+                "nb_attested_experiments": user.experiments.filter(
+                    ~Q(attestation=None)
+                ).count(),
+                "nb_toolchains": user.toolchains.count(),
+                "nb_public_toolchains": user.toolchains.filter(
+                    sharing=Shareable.PUBLIC
+                ).count(),
+                "nb_algorithms": user.algorithms.count(),
+                "nb_public_algorithms": user.algorithms.filter(
+                    sharing=Shareable.PUBLIC
+                ).count(),
+                "nb_libraries": user.algorithms.count(),
+                "nb_public_libraries": user.librarys.filter(
+                    sharing=Shareable.PUBLIC
+                ).count(),
+                "nb_dataformats": user.dataformats.count(),
+                "nb_public_dataformats": user.dataformats.filter(
+                    sharing=Shareable.PUBLIC
+                ).count(),
+            },
+        },
+    )
+
+
+# ----------------------------------------------------------
 
 
 def empty_error500_for_tests(request):
-    '''Custom error 500 view used ONLY DURING THE TESTS
+    """Custom error 500 view used ONLY DURING THE TESTS
 
     Without it, Django tries to render the custom one from the website when an error
     occurs in some tests, but fails because some variables needed by the template aren't
     found.
-    '''
+    """
     return HttpResponse()
diff --git a/beat/web/utils/management/commands/daily_cron_actions.py b/beat/web/utils/management/commands/daily_cron_actions.py
index ad580f42c..242af6069 100644
--- a/beat/web/utils/management/commands/daily_cron_actions.py
+++ b/beat/web/utils/management/commands/daily_cron_actions.py
@@ -28,42 +28,32 @@
 
 
 from django.core.management import call_command
-from django.core.management.base import BaseCommand, CommandError
-from django.core.mail import send_mail
-from django.template.loader import render_to_string
-from django.conf import settings
-from django.contrib.sites.models import Site
+from django.core.management.base import BaseCommand
 
-from datetime import datetime, time, date, timedelta
-
-from ....reports.models import Report
-from .... import __version__
-
-import sys
 
 class Command(BaseCommand):
 
-    help = 'Daily CRON actions'
+    help = "Daily CRON actions"
 
     def handle(self, *args, **options):
 
         # Send attestations cleanup warnings and cleanup attestations
-        call_command('send_attestation_cleanup_warning')
+        call_command("send_attestation_cleanup_warning")
 
         # Send report cleanup warnings and cleanup reports
-        call_command('send_report_cleanup_warning_and_cleanup')
+        call_command("send_report_cleanup_warning_and_cleanup")
 
         # Clean and remove invalid users
-        call_command('clean_invalid_users')
+        call_command("clean_invalid_users")
 
         # Block rejected users with no supervision after specific rejection date
-        call_command('block_rejected_users')
+        call_command("block_rejected_users")
 
         # Clean blocked users with no supervision after specific rejection date
-        call_command('clean_blocked_users_expired_requests')
+        call_command("clean_blocked_users_expired_requests")
 
         # Yearly revalidation process with warnings, status change and blockage
-        call_command('year_revalidation_users')
+        call_command("year_revalidation_users")
 
         # Clean expired temporary urls for account activation/re-activation
-        call_command('clean_expired_temporary_urls')
+        call_command("clean_expired_temporary_urls")
-- 
GitLab