From 8235a2f2c549bc7117796e2f3942baabe80a93a8 Mon Sep 17 00:00:00 2001 From: Flavio Tarsetti <flavio.tarsetti@idiap.ch> Date: Sat, 2 May 2020 03:06:51 +0200 Subject: [PATCH] [accounts][views] load temporary url --- beat/web/accounts/views.py | 150 ++++++++++++++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 1 deletion(-) diff --git a/beat/web/accounts/views.py b/beat/web/accounts/views.py index 756a72e31..12218ed7b 100644 --- a/beat/web/accounts/views.py +++ b/beat/web/accounts/views.py @@ -25,19 +25,42 @@ # # ############################################################################### +from django.conf import settings + from django.shortcuts import render +from django.shortcuts import get_object_or_404 + from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordChangeForm 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 + from .models import AccountSettings -from .models import SupervisionTrack, Profile +from .models import SupervisionTrack +from .models import Profile +from .models import TemporaryUrl + +from ..utils import mail + +from ..common.responses import BadRequestResponse, ForbiddenResponse + +from datetime import datetime, timedelta + +import datetime +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + @login_required def account_settings(request): @@ -114,3 +137,128 @@ def account_settings(request): 'supervisors_valid': supervisors_valid, 'supervisors_pending': supervisors_pending, 'token' : user.auth_token}) + + +def load_temporary_url(request, hash_url): + temp_url = get_object_or_404(TemporaryUrl, url_hash=hash_url) + supervisiontrack = temp_url.supervision_track + supervisee = supervisiontrack.supervisee + + now = datetime.datetime.now() + + if temp_url.status == TemporaryUrl.VALIDATION: + # Supervisor validates new Supervisee + 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) + supervisiontrack.expiration_date = now + expiration_date_delta + + supervisiontrack.start_date = now + supervisiontrack.last_validation_date = now + supervisee.profile.status = Profile.ACCEPTED + supervisee.profile.rejection_date = None + + supervisiontrack.save() + supervisee.profile.save() + supervisee.is_active = True + supervisee.save() + + parsed_url = urlparse(settings.URL_PREFIX) + server_address = '%s://%s' % (parsed_url.scheme, parsed_url.hostname) + + context = { + 'supervisor': supervisiontrack.supervisor, + 'supervisee': supervisee, + 'prefix': server_address, + } + + mail.send_email('registration/mail.supervisor_validated.subject.txt', + 'registration/mail.supervisor_validated.message.txt', + context, + [supervisee.email]) + + temp_url.delete() + return render(request, + 'accounts/url_validation.html', + {'supervisiontrack': supervisiontrack}) + else: + #Track already valid + temp_url.delete() + return render(request, + '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 + supervisor = supervisiontrack.supervisor + #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 + 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 + 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) + + supervisiontrack.expiration_date = now + supervisiontrack.is_valid = False + + supervisee.profile.status = Profile.REJECTED + supervisee.profile.rejection_date = now + expiration_date_delta + supervisee.profile.supervision_key = None + #save + supervisiontrack.save() + supervisee.profile.save() + supervisee.save() + else: + #Track already valid + error_message = "You don't need to revalidate at the moment, your supervision is still valid" + temp_url.delete() + return render(request, + 'accounts/url_revalidation_failed.html', + {'error_message': error_message}) + + else: + #A pending request already exist + error_message = "You are not able to perform this action as you already have a pending supervision request" + temp_url.delete() + return render(request, + '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) + # This should never be the case but if it happens invalidate all tracks + if supervisiontracks.count() > 0: + now = datetime.datetime.now() + for track in supervisiontracks: + track.is_valid = False + track.expiration_date = now + track.save() + + #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" + temp_url.delete() + return render(request, + 'accounts/url_revalidation_failed.html', + {'error_message': error_message}) + + temp_url.delete() + return render(request, + 'accounts/url_validation.html', + {'supervisiontrack': supervisiontrack}) + + else: + #Track already valid + temp_url.delete() + return render(request, + 'accounts/url_validation_failed.html') -- GitLab