def test_any_new_signup_invalidates_past_token(self): """ Tokens are based on siae.members.count() so that any new signup invalidates past tokens. """ siae = Siae.objects.create() p0 = SiaeSignupTokenGenerator() tk1 = p0.make_token(siae) self.assertIs(p0.check_token(siae, tk1), True) user = User() user.save() membership = SiaeMembership() membership.user = user membership.siae = siae membership.save() self.assertIs(p0.check_token(siae, tk1), False)
def create_user_from_fc_user_data(fc_user_data: FranceConnectUserData): user = User(is_job_seeker=True) for field in [ "username", "first_name", "last_name", "birthdate", "email", "phone" ]: value = getattr(fc_user_data, field) if user.update_external_data_source_history_field( settings.PROVIDER_FRANCE_CONNECT, field, value): setattr(user, field, value) if fc_user_data.country == "France": for field in ["address_line_1", "post_code", "city"]: value = getattr(fc_user_data, field) if user.update_external_data_source_history_field( settings.PROVIDER_FRANCE_CONNECT, field, value): setattr(user, field, getattr(fc_user_data, field)) return user
def update_fields_from_user_data(user: User, fc_user_data: FranceConnectUserData): for field in dataclasses.fields(fc_user_data): if field.name == "country": continue value = getattr(fc_user_data, field.name) if (user.update_external_data_source_history_field( settings.PROVIDER_FRANCE_CONNECT, field.name, value) or getattr(fc_user_data, field.name) == ""): setattr(user, field.name, getattr(fc_user_data, field.name))
def save(self, request): self.cleaned_data["email"] = self.email # Avoid django-allauth to call its own often failing `generate_unique_username` # function by forcing a username. self.cleaned_data["username"] = User.generate_unique_username() get_adapter().stash_verified_email(request, self.email) # Possible problem: this causes the user to be saved twice. # If we want to save it once, we should override the Allauth method. # See https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py#L401 user = super().save(request) user = self.invitation.set_guest_type(user) user.save() return user
def save(self, request): # Avoid django-allauth to call its own often failing `generate_unique_username` # function by forcing a username. self.cleaned_data["username"] = User.generate_unique_username() # Create the user. user = super().save(request) user.first_name = self.cleaned_data["first_name"] user.last_name = self.cleaned_data["last_name"] user.is_prescriber = True user.save() # Create the organization if any: an orienteur may not belong to any organization. if self.prescriber_org_data: prescriber_org = PrescriberOrganization() prescriber_org.siret = self.prescriber_org_data["siret"] prescriber_org.name = self.prescriber_org_data["name"] prescriber_org.address_line_1 = self.prescriber_org_data[ "address_line_1"] or "" prescriber_org.address_line_2 = self.prescriber_org_data[ "address_line_2"] or "" prescriber_org.post_code = self.prescriber_org_data["post_code"] prescriber_org.city = self.prescriber_org_data["city"] prescriber_org.department = self.prescriber_org_data["department"] longitude = self.prescriber_org_data["longitude"] latitude = self.prescriber_org_data["latitude"] if longitude and latitude: prescriber_org.coords = GEOSGeometry( f"POINT({longitude} {latitude})") prescriber_org.geocoding_score = self.prescriber_org_data[ "geocoding_score"] prescriber_org.kind = self.kind prescriber_org.authorization_status = self.authorization_status prescriber_org.created_by = user prescriber_org.save() # The member becomes a member of the organization. membership = PrescriberMembership() membership.user = user membership.organization = prescriber_org # The first member becomes an admin. membership.is_admin = membership.organization.members.count() == 0 membership.save() # Notify support. if prescriber_org.authorization_status == PrescriberOrganization.AuthorizationStatus.NOT_SET: prescriber_org.must_validate_prescriber_organization_email( ).send() return user
def save(self, request): # Avoid django-allauth to call its own often failing `generate_unique_username` # function by forcing a username. self.cleaned_data["username"] = User.generate_unique_username() # Create the user. user = super().save(request) user.first_name = self.cleaned_data["first_name"] user.last_name = self.cleaned_data["last_name"] user.is_job_seeker = True if self.nir: user.nir = self.nir user.save() if self.nir: del request.session[settings.ITOU_SESSION_NIR_KEY] return user
def save(self, request): # Avoid django-allauth to call its own often failing `generate_unique_username` # function by forcing a username. self.cleaned_data["username"] = User.generate_unique_username() # Create the user. user = super().save(request) user.first_name = self.cleaned_data["first_name"] user.last_name = self.cleaned_data["last_name"] user.is_prescriber = True user.save() # The member becomes a member of the PE agency. membership = PrescriberMembership() membership.user = user membership.organization = self.pole_emploi_org # The first member becomes an admin. membership.is_admin = membership.organization.members.count() == 0 membership.save() return user
def save(self, request): # Avoid django-allauth to call its own often failing `generate_unique_username` # function by forcing a username. self.cleaned_data["username"] = User.generate_unique_username() # Create the user. user = super().save(request) if self.check_siae_signup_credentials(): siae = self.get_siae() else: raise RuntimeError("This should never happen.") user.is_siae_staff = True user.save() membership = SiaeMembership() membership.user = user membership.siae = siae # Only the first member becomes an admin. membership.is_admin = siae.active_members.count() == 0 membership.save() return user
def find_or_create_job_seeker(self, row, created_by): created = False # Get city by its INSEE code to fill in the `User.city` attribute with a valid name. commune = self.commune_from_insee_col(row[CITY_INSEE_COL]) user_data = { "first_name": row[FIRST_NAME_COL].title(), "last_name": row[LAST_NAME_COL].title(), "birthdate": row[BIRTHDATE_COL], # If no email: create a fake one. "email": row[EMAIL_COL] or self.fake_email(), "address_line_1": f"{row['adr_numero_voie']} {row['codeextensionvoie']} {row['codetypevoie']} {row['adr_libelle_voie']}", "address_line_2": f"{row['adr_cplt_distribution']} {row['adr_point_remise']}", "post_code": row[POST_CODE_COL], "city": commune.name.title(), "department": department_from_postcode(row[POST_CODE_COL]), "phone": row[PHONE_COL], "nir": row[NIR_COL], "date_joined": settings.AI_EMPLOYEES_STOCK_IMPORT_DATE, } # If NIR is not valid, row[NIR_COL] is empty. # See `self.clean_nir`. if not row.nir_is_valid: user_data["nir"] = None job_seeker = None if row.nir_is_valid: job_seeker = User.objects.filter(nir=user_data["nir"]).exclude(Q(nir__isnull=True) | Q(nir="")).first() if not job_seeker: job_seeker = User.objects.filter(email=user_data["email"]).first() if not job_seeker: # Find users created previously by this script, # either because a bug forced us to interrupt it # or because we had to run it twice to import new users. job_seeker = User.objects.filter( first_name=user_data["first_name"], last_name=user_data["last_name"], birthdate=user_data["birthdate"].date(), created_by=created_by, date_joined__date=settings.AI_EMPLOYEES_STOCK_IMPORT_DATE.date(), ).first() # Some e-mail addresses belong to prescribers! if job_seeker: # Probably same corporate email. not_same_nir = job_seeker.nir and job_seeker.nir != row[NIR_COL] if not_same_nir: self.logger.info(f"User found but with a different NIR: {job_seeker.email}. Creating a new one.") if not job_seeker.is_job_seeker or not_same_nir: # If job seeker is not a job seeker, create a new one. user_data["email"] = self.fake_email() job_seeker = None if not job_seeker: if self.dry_run: job_seeker = User(**user_data) else: job_seeker = User.create_job_seeker_by_proxy(created_by, **user_data) created = True return created, job_seeker
def pe_approval_create(request, pe_approval_id): """ Final step of the PoleEmploiApproval's conversion process. Create a Approval and a JobApplication out of a (previously created) User and a PoleEmploiApproval. """ siae = get_current_siae_or_404(request) pe_approval = get_object_or_404(PoleEmploiApproval, pk=pe_approval_id) form = UserExistsForm(data=request.POST or None) if request.method != "POST" or not form.is_valid(): next_url = reverse("approvals:pe_approval_search_user", kwargs={"pe_approval_id": pe_approval_id}) return HttpResponseRedirect(next_url) # If there already is a user with this email, we take it, otherwise we create one email = form.cleaned_data["email"] job_seeker = User.objects.filter(email__iexact=email).first() if not job_seeker: job_seeker = User.create_job_seeker_from_pole_emploi_approval(request.user, email, pe_approval) # If the PoleEmploiApproval has already been imported, it is not possible to import it again. possible_matching_approval = Approval.objects.filter(number=pe_approval.number[:12]).order_by("-start_at").first() if possible_matching_approval: messages.info(request, "Cet agrément a déjà été importé.") job_application = JobApplication.objects.filter(approval=possible_matching_approval).first() next_url = reverse("apply:details_for_siae", kwargs={"job_application_id": job_application.id}) return HttpResponseRedirect(next_url) # It is not possible to attach an approval to a job seeker that already has a valid approval. if job_seeker.approvals_wrapper.has_valid and job_seeker.approvals_wrapper.latest_approval.is_pass_iae: messages.error(request, "Le candidat associé à cette adresse e-mail a déjà un PASS IAE valide.") next_url = reverse("approvals:pe_approval_search_user", kwargs={"pe_approval_id": pe_approval_id}) return HttpResponseRedirect(next_url) with transaction.atomic(): # Then we create an Approval based on the PoleEmploiApproval data approval_from_pe = Approval( start_at=pe_approval.start_at, end_at=pe_approval.end_at, user=job_seeker, # Only store 12 chars numbers. number=pe_approval.number[:12], ) approval_from_pe.save() # Then we create the necessary JobApplication for redirection job_application = JobApplication( job_seeker=job_seeker, to_siae=siae, state=JobApplicationWorkflow.STATE_ACCEPTED, approval=approval_from_pe, created_from_pe_approval=True, # This flag is specific to this process. sender=request.user, sender_kind=JobApplication.SENDER_KIND_SIAE_STAFF, sender_siae=siae, ) job_application.save() messages.success(request, "L'agrément a bien été importé, vous pouvez désormais le prolonger ou le suspendre.") next_url = reverse("apply:details_for_siae", kwargs={"job_application_id": job_application.id}) return HttpResponseRedirect(next_url)
def clean_email(self): email = self.cleaned_data["email"] if User.email_already_exists(email): raise forms.ValidationError(User.ERROR_EMAIL_ALREADY_EXISTS) return email