def associate_aidant_carte_totp(request, aidant_id): responsable: Aidant = request.user aidant = get_object_or_404(Aidant, pk=aidant_id) if not responsable.can_see_aidant(aidant): raise Http404 if hasattr(aidant, "carte_totp"): django_messages.error( request, ( f"Le compte de {aidant.get_full_name()} est déjà lié à une carte " "Aidants Connect. Vous devez d’abord retirer la carte de son compte " "avant de pouvoir en lier une nouvelle." ), ) return redirect( "espace_responsable_aidant", aidant_id=aidant.id, ) if request.method == "GET": form = CarteOTPSerialNumberForm() if request.method == "POST": form = CarteOTPSerialNumberForm(request.POST) if form.is_valid(): serial_number = form.cleaned_data["serial_number"] try: carte_totp = CarteTOTP.objects.get(serial_number=serial_number) with transaction.atomic(): carte_totp.aidant = aidant carte_totp.save() totp_device = carte_totp.createTOTPDevice() totp_device.save() Journal.log_card_association(responsable, aidant, serial_number) return redirect( "espace_responsable_validate_totp", aidant_id=aidant.id, ) except Exception: django_messages.error( request, "Une erreur s’est produite lors de la sauvegarde de la carte.", ) # todo send exception to Sentry return render( request, "aidants_connect_web/espace_responsable/write-carte-totp-sn.html", { "aidant": aidant, "organisation": organisation, "responsable": responsable, "form": form, }, )
def __associate_to_aidant_post(self, request, object_id): def redirect_to_list(): return HttpResponseRedirect( reverse("otpadmin:aidants_connect_web_cartetotp_changelist")) def redirect_to_object(object_id): return HttpResponseRedirect( reverse( "otpadmin:aidants_connect_web_cartetotp_change", kwargs={"object_id": object_id}, )) def redirect_to_try_again(object_id): return HttpResponseRedirect( reverse( "otpadmin:aidants_connect_web_carte_totp_associate", kwargs={"object_id": object_id}, )) if request.POST["aidant"].isnumeric(): target_aidant_id = int(request.POST["aidant"]) else: self.message_user(request, "L'identifiant de l'aidant est obligatoire.", messages.ERROR) return redirect_to_try_again(object_id) carte = CarteTOTP.objects.get(id=object_id) try: # Check if we are trying to associate the card with another aidant: BAD if carte.aidant is not None: if target_aidant_id != carte.aidant.id: self.message_user( request, f"La carte {carte} est déjà associée à un autre aidant.", messages.ERROR, ) return redirect_to_list() # link card with aidant target_aidant = Aidant.objects.get(id=target_aidant_id) if target_aidant.has_a_carte_totp and carte.aidant != target_aidant: self.message_user( request, f"L’aidant {target_aidant} a déjà une carte TOTP. " "Vous ne pouvez pas le lier à celle-ci en plus.", messages.ERROR, ) return redirect_to_try_again(object_id) carte.aidant = target_aidant carte.save() # check if totp devices need to be created totp_devices = TOTPDevice.objects.filter(user=target_aidant, key=carte.seed) if totp_devices.count() > 0: self.message_user( request, "Tout s'est bien passé. Le TOTP Device existait déjà.") return redirect_to_object(object_id) else: # No Device exists: crate the TOTP Device and save everything new_device = carte.createTOTPDevice(confirmed=True) new_device.save() Journal.log_card_association(request.user, target_aidant, carte.serial_number) self.message_user( request, f"Tout s'est bien passé. La carte {carte} a été associée à " f"{target_aidant} et un TOTP Device a été créé.", ) return redirect_to_list() except Aidant.DoesNotExist: self.message_user( request, f"Aucun aidant n’existe avec l'ID {target_aidant_id}. " "Veuillez corriger votre saisie.", messages.ERROR, ) return redirect_to_try_again(object_id) except Exception as e: logger.exception( "An error occured while trying to associate an aidant" "with a new TOTP.") self.message_user( request, f"Quelque chose s’est mal passé durant l'opération. {e}", messages.ERROR, ) return HttpResponseRedirect( reverse("otpadmin:aidants_connect_web_cartetotp_changelist"))