Пример #1
0
 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)
Пример #2
0
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
Пример #3
0
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))
Пример #4
0
 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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
    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
Пример #10
0
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)
Пример #11
0
 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