Skip to content

Commit

Permalink
GPS: remove “join_group” feature (route, views, tests)
Browse files Browse the repository at this point in the history
  • Loading branch information
louije authored and tonial committed Jan 22, 2025
1 parent 70c1b07 commit d104e32
Show file tree
Hide file tree
Showing 10 changed files with 21 additions and 404 deletions.
55 changes: 0 additions & 55 deletions itou/static/js/gps.js

This file was deleted.

32 changes: 0 additions & 32 deletions itou/templates/gps/join_group.html

This file was deleted.

17 changes: 5 additions & 12 deletions itou/templates/gps/my_groups.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,11 @@ <h1 class="m-0">Mes bénéficiaires</h1>
<i class="ri-mail-send-line" aria-hidden="true"></i>
<span>Inviter un partenaire</span>
</a>
{% if can_use_gps_advanced_features %}
<a href="{% url 'gps:join_group' %}" class="btn btn-lg btn-ico btn-primary mt-3 mt-md-0" aria-label="Suivre un nouveau bénéficiaire" {% matomo_event "GPS_liste_groupes" "clic" "ajout_groupe" %}>
<i class="ri-user-add-line" aria-hidden="true"></i>
<span>Ajouter un bénéficiaire</span>
</a>
{% else %}
<a href="{{ request_new_beneficiary_form_url }}" id="request-new-beneficiary-link" class="btn btn-lg btn-ico btn-primary mt-3 mt-md-0">
<i class="ri-user-add-line" aria-hidden="true"></i>
<span>Demander l'ajout d'un bénéficiaire</span>
<i class="ri-external-link-line ms-2"></i>
</a>
{% endif %}
<a href="{{ request_new_beneficiary_form_url }}" id="request-new-beneficiary-link" class="btn btn-lg btn-ico btn-primary mt-3 mt-md-0">
<i class="ri-user-add-line" aria-hidden="true"></i>
<span>Demander l'ajout d'un bénéficiaire</span>
<i class="ri-external-link-line ms-2"></i>
</a>
</div>
</div>
{% endblock %}
Expand Down
1 change: 0 additions & 1 deletion itou/www/autocomplete/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@
path("cities", views.cities_autocomplete, name="cities"),
path("jobs", views.jobs_autocomplete, name="jobs"),
path("communes", views.communes_autocomplete, name="communes"),
path("gps_users", views.gps_users_autocomplete, name="gps_users"),
]
53 changes: 1 addition & 52 deletions itou/www/autocomplete/views.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
from datetime import datetime

from django.contrib.auth.decorators import login_not_required
from django.contrib.postgres.search import SearchQuery, SearchRank
from django.db.models import Exists, F, OuterRef, Q, Value
from django.db.models import F, Q, Value
from django.db.models.functions import Least, Lower, NullIf, StrIndex
from django.http import JsonResponse
from unidecode import unidecode

from itou.asp.models import Commune
from itou.cities.models import City
from itou.gps.models import FollowUpGroup
from itou.jobs.models import Appellation
from itou.users.enums import UserKind
from itou.users.models import User
from itou.utils.auth import check_user
from itou.www.gps.views import is_allowed_to_use_gps_advanced_features


# Consider that after 50 matches the user should refine its search.
Expand Down Expand Up @@ -127,48 +121,3 @@ def communes_autocomplete(request):
]

return JsonResponse({"results": communes}, safe=False)


@check_user(is_allowed_to_use_gps_advanced_features)
def gps_users_autocomplete(request):
"""
Returns JSON data compliant with Select2
"""

current_user = request.user

term = request.GET.get("term", "").strip()
users = []

if term:
users_qs = User.objects.filter(kind=UserKind.JOB_SEEKER).exclude(
Exists(
FollowUpGroup.objects.filter(
beneficiary_id=OuterRef("pk"),
memberships__member=current_user,
memberships__is_active=True,
)
)
)

search_query = SearchQuery(term, config="simple_unaccent")
users_qs = users_qs.filter(full_name_search_vector=search_query)
users_qs = users_qs.annotate(rank=SearchRank("full_name_search_vector", search_query)).order_by("-rank")

def format_data(user):
data = {
"id": user.pk,
"title": "",
"name": user.get_full_name(),
"birthdate": "",
}
if user.title:
# only add a . after M, not Mme
data["title"] = f"{user.title.capitalize()}."[:3] + " "
if getattr(user.jobseeker_profile, "birthdate", None):
data["birthdate"] = user.jobseeker_profile.birthdate.strftime("%d/%m/%Y")
return data

users = [format_data(user) for user in users_qs[:10]]

return JsonResponse({"results": users})
34 changes: 0 additions & 34 deletions itou/www/gps/forms.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,7 @@
from django import forms
from django.urls import reverse, reverse_lazy
from django_select2.forms import Select2Widget

from itou.users.enums import UserKind
from itou.users.models import User
from itou.utils.urls import add_url_params
from itou.utils.widgets import RemoteAutocompleteSelect2Widget


class GpsUserSearchForm(forms.Form):
# NB we need to inherit from forms.Form if we want the attributes
# to be added to the a Form using this mixin (django magic)

user = forms.ModelChoiceField(
queryset=User.objects.filter(kind=UserKind.JOB_SEEKER),
label="Nom et prénom du bénéficiaire",
widget=RemoteAutocompleteSelect2Widget(
attrs={
"data-ajax--url": reverse_lazy("autocomplete:gps_users"),
"data-ajax--cache": "true",
"data-ajax--type": "GET",
"data-minimum-input-length": 2,
"lang": "", # Needed to override the noResults i18n translation in JS.
"id": "js-search-user-input",
},
),
required=True,
)

is_referent = forms.BooleanField(label="Se rattacher comme référent", required=False)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
params = {"tunnel": "gps", "from_url": reverse("gps:my_groups")}
self.fields["user"].widget.attrs["data-no-results-url"] = add_url_params(
reverse("job_seekers_views:get_or_create_start"), params
)


class MembershipsFiltersForm(forms.Form):
Expand Down
1 change: 0 additions & 1 deletion itou/www/gps/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

urlpatterns = [
path("groups", views.my_groups, name="my_groups"),
path("groups/join", views.join_group, name="join_group"),
path("groups/<int:group_id>/leave", views.leave_group, name="leave_group"),
path("groups/<int:group_id>/toggle_referent", views.toggle_referent, name="toggle_referent"),
path("details/<uuid:public_id>", views.UserDetailsView.as_view(), name="user_details"),
Expand Down
52 changes: 14 additions & 38 deletions itou/www/gps/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
from django.urls import reverse, reverse_lazy
from django.views.generic import DetailView

from itou.gps.models import FollowUpGroup, FollowUpGroupMembership
from itou.gps.models import FollowUpGroupMembership
from itou.users.models import User
from itou.utils.auth import check_user
from itou.utils.pagination import pager
from itou.utils.urls import get_safe_url
from itou.www.gps.forms import GpsUserSearchForm, MembershipsFiltersForm
from itou.www.gps.forms import MembershipsFiltersForm


def is_allowed_to_use_gps(user):
Expand Down Expand Up @@ -54,47 +54,23 @@ def my_groups(request, template_name="gps/my_groups.html"):
"can_use_gps_advanced_features": is_allowed_to_use_gps_advanced_features(request.user),
}

if not context["can_use_gps_advanced_features"]:
context["request_new_beneficiary_form_url"] = (
"https://formulaires.gps.inclusion.gouv.fr/ajouter-usager?"
+ urllib.parse.urlencode(
{
"user_name": request.user.get_full_name(),
"user_id": request.user.pk,
"user_email": request.user.email,
"user_organization_name": getattr(request.current_organization, "display_name", ""),
"user_organization_id": getattr(request.current_organization, "pk", ""),
"success_url": request.build_absolute_uri(),
}
)
context["request_new_beneficiary_form_url"] = (
"https://formulaires.gps.inclusion.gouv.fr/ajouter-usager?"
+ urllib.parse.urlencode(
{
"user_name": request.user.get_full_name(),
"user_id": request.user.pk,
"user_email": request.user.email,
"user_organization_name": getattr(request.current_organization, "display_name", ""),
"user_organization_id": getattr(request.current_organization, "pk", ""),
"success_url": request.build_absolute_uri(),
}
)
)

return render(request, "gps/includes/memberships_results.html" if request.htmx else template_name, context)


@check_user(is_allowed_to_use_gps_advanced_features)
def join_group(request, template_name="gps/join_group.html"):
form = GpsUserSearchForm(data=request.POST or None)

my_groups_url = reverse("gps:my_groups")
back_url = get_safe_url(request, "back_url", my_groups_url)

if request.method == "POST" and form.is_valid():
user = form.cleaned_data["user"]
is_referent = form.cleaned_data["is_referent"]

FollowUpGroup.objects.follow_beneficiary(beneficiary=user, user=request.user, is_referent=is_referent)

return HttpResponseRedirect(my_groups_url)

context = {
"form": form,
"reset_url": back_url,
}

return render(request, template_name, context)


@check_user(is_allowed_to_use_gps)
def leave_group(request, group_id):
membership = (
Expand Down
31 changes: 0 additions & 31 deletions tests/gps/test_create_beneficiary.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
from tests.cities.factories import create_city_geispolsheim, create_test_cities
from tests.prescribers.factories import PrescriberOrganizationWithMembershipFactory
from tests.users.factories import (
EmployerFactory,
JobSeekerFactory,
PrescriberFactory,
)
from tests.utils.test import KNOWN_SESSION_KEYS

Expand Down Expand Up @@ -334,32 +332,3 @@ def test_existing_user_with_nir(client):
job_seeker.refresh_from_db()
assert job_seeker.follow_up_group is not None
assert user in job_seeker.follow_up_group.members.all()


@pytest.mark.parametrize(
"UserFactory, factory_args, expected_access",
[
(PrescriberFactory, {"membership": False}, False),
(PrescriberFactory, {"membership": True}, False),
(PrescriberFactory, {"membership__organization__authorized": True}, True),
(EmployerFactory, {"with_company": True}, True),
],
)
def test_creation_by_user_kind(client, UserFactory, factory_args, expected_access):
user = UserFactory(**factory_args)
client.force_login(user)
# Assert contains link.
params = {"tunnel": "gps", "from_url": reverse("gps:my_groups")}
create_beneficiary_url = add_url_params(reverse("job_seekers_views:get_or_create_start"), params)
response = client.get(reverse("gps:join_group"))
if expected_access:
assertContains(response, create_beneficiary_url.replace("&", "&amp;"))
else:
assert response.status_code == 403

response = client.get(create_beneficiary_url)
[job_seeker_session_name] = [k for k in client.session.keys() if k not in KNOWN_SESSION_KEYS]
assert response.status_code == 302
assert response["Location"] == reverse(
"job_seekers_views:check_nir_for_sender", kwargs={"session_uuid": job_seeker_session_name}
)
Loading

0 comments on commit d104e32

Please sign in to comment.