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