def test_a_create_attestation_journal_entry_can_be_created(self): demarches = ["transports", "logement"] expiration_date = timezone.now() + timedelta(days=6) entry = Journal.log_attestation_creation( aidant=self.aidant_thierry, usager=self.usager_ned, demarches=demarches, duree=6, is_remote_mandat=False, access_token="fjfgjfdkldlzlsmqqxxcn", attestation_hash=generate_attestation_hash(self.aidant_thierry, self.usager_ned, demarches, expiration_date), ) self.assertEqual(len(Journal.objects.all()), 3) self.assertEqual(entry.action, "create_attestation") attestation_string = ";".join([ str(self.aidant_thierry.id), date.today().isoformat(), "logement,transports", expiration_date.date().isoformat(), str(self.aidant_thierry.organisation.id), generate_file_sha256_hash(settings.MANDAT_TEMPLATE_PATH), self.usager_ned.sub, ]) self.assertTrue( validate_attestation_hash(attestation_string, entry.attestation_hash))
def new_mandat_recap(request): connection_id = request.session.get("connection") if not connection_id: log.error("No connection id found in session") return redirect("espace_aidant_home") connection = Connection.objects.get(pk=connection_id) aidant = request.user usager = connection.usager demarches_description = [ humanize_demarche_names(demarche) for demarche in connection.demarches ] duree = connection.get_duree_keyword_display() is_remote = connection.mandat_is_remote if request.method == "GET": form = RecapMandatForm(aidant) return render( request, "aidants_connect_web/new_mandat/new_mandat_recap.html", { "aidant": aidant, "usager": usager, "demarches": demarches_description, "duree": duree, "is_remote": is_remote, "form": form, }, ) else: form = RecapMandatForm(aidant=aidant, data=request.POST) if form.is_valid(): now = timezone.now() durationkw = connection.duree_keyword mandat_expiration_date = AuthorizationDurations.expiration( durationkw, now) mandat_duree = AuthorizationDurations.duration(durationkw, now) try: connection.demarches.sort() # Create a mandat mandat = Mandat.objects.create( organisation=aidant.organisation, usager=usager, duree_keyword=connection.duree_keyword, expiration_date=mandat_expiration_date, is_remote=connection.mandat_is_remote, ) # Add a Journal 'create_attestation' action Journal.log_attestation_creation( aidant=aidant, usager=usager, demarches=connection.demarches, duree=mandat_duree, is_remote_mandat=connection.mandat_is_remote, access_token=connection.access_token, attestation_hash=generate_attestation_hash( aidant, usager, connection.demarches, mandat_expiration_date), mandat=mandat, ) # This loop creates one `autorisation` object per `démarche` in the form for demarche in connection.demarches: # Revoke existing demarche autorisation(s) similar_active_autorisations = Autorisation.objects.active( ).filter( mandat__organisation=aidant.organisation, mandat__usager=usager, demarche=demarche, ) for similar_active_autorisation in similar_active_autorisations: similar_active_autorisation.revoke(aidant=aidant, revocation_date=now) # Create new demarche autorisation autorisation = Autorisation.objects.create( mandat=mandat, demarche=demarche, last_renewal_token=connection.access_token, ) Journal.log_autorisation_creation(autorisation, aidant) except AttributeError as error: log.error("Error happened in Recap") log.error(error) django_messages.error( request, f"Error with Usager attribute : {error}") return redirect("espace_aidant_home") except IntegrityError as error: log.error("Error happened in Recap") log.error(error) django_messages.error(request, f"No Usager was given : {error}") return redirect("espace_aidant_home") return redirect("new_mandat_success") else: return render( request, "aidants_connect_web/new_mandat/new_mandat_recap.html", { "aidant": aidant, "usager": usager, "demarche": demarches_description, "duree": duree, "form": form, }, )
def new_mandat_recap(request): connection = Connection.objects.get(pk=request.session["connection"]) aidant = request.user usager = connection.usager demarches_description = [ humanize_demarche_names(demarche) for demarche in connection.demarches ] duree = connection.get_duree_keyword_display() is_remote = connection.mandat_is_remote if request.method == "GET": form = RecapMandatForm(aidant) return render( request, "aidants_connect_web/new_mandat/new_mandat_recap.html", { "aidant": aidant, "usager": usager, "demarches": demarches_description, "duree": duree, "is_remote": is_remote, "form": form, }, ) else: form = RecapMandatForm(aidant=aidant, data=request.POST) if form.is_valid(): now = timezone.now() expiration_date = { "SHORT": now + timedelta(days=1), "LONG": now + timedelta(days=365), "EUS_03_20": settings.ETAT_URGENCE_2020_LAST_DAY, } mandat_expiration_date = expiration_date.get( connection.duree_keyword) days_before_expiration_date = { "SHORT": 1, "LONG": 365, "EUS_03_20": 1 + (settings.ETAT_URGENCE_2020_LAST_DAY - now).days, } mandat_duree = days_before_expiration_date.get( connection.duree_keyword) try: # Add a Journal 'create_attestation' action connection.demarches.sort() Journal.log_attestation_creation( aidant=aidant, usager=usager, demarches=connection.demarches, duree=mandat_duree, is_remote_mandat=connection.mandat_is_remote, access_token=connection.access_token, attestation_hash=generate_attestation_hash( aidant, usager, connection.demarches, mandat_expiration_date), ) # Create a mandat mandat = Mandat.objects.create( organisation=aidant.organisation, usager=usager, duree_keyword=connection.duree_keyword, expiration_date=mandat_expiration_date, is_remote=connection.mandat_is_remote, ) # This loop creates one `autorisation` object per `démarche` in the form for demarche in connection.demarches: # Revoke existing demarche autorisation(s) similar_active_autorisations = Autorisation.objects.active( ).filter( mandat__organisation=aidant.organisation, mandat__usager=usager, demarche=demarche, ) for similar_active_autorisation in similar_active_autorisations: similar_active_autorisation.revocation_date = now similar_active_autorisation.save( update_fields=["revocation_date"]) Journal.log_autorisation_cancel( similar_active_autorisation, aidant) # Create new demarche autorisation autorisation = Autorisation.objects.create( mandat=mandat, demarche=demarche, last_renewal_token=connection.access_token, ) Journal.log_autorisation_creation(autorisation, aidant) except AttributeError as error: log.error("Error happened in Recap") log.error(error) django_messages.error( request, f"Error with Usager attribute : {error}") return redirect("espace_aidant_home") except IntegrityError as error: log.error("Error happened in Recap") log.error(error) django_messages.error(request, f"No Usager was given : {error}") return redirect("espace_aidant_home") return redirect("new_mandat_success") else: return render( request, "aidants_connect_web/new_mandat/new_mandat_recap.html", { "aidant": aidant, "usager": usager, "demarche": demarches_description, "duree": duree, "form": form, }, )