Implement user search functionality and enhance supervisor management UI
This commit is contained in:
@@ -140,3 +140,46 @@ def test_cid_manager_can_send_password_reset_from_account_profile(client, create
|
||||
assert mail.outbox[0].to == ["managed@example.com"]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_people_page_and_user_search(client, create_users, create_cid_manager):
|
||||
# Log in as cid_user_manager
|
||||
client.force_login(create_cid_manager)
|
||||
|
||||
# 1. Test standard GET request to /people page
|
||||
response = client.get(reverse("people"))
|
||||
assert response.status_code == 200
|
||||
assert b"Quick User Search" in response.content
|
||||
assert b"hx-indicator=\"#search-indicator\"" in response.content
|
||||
|
||||
# 2. Test HTMX GET request with empty query
|
||||
response_empty = client.get(
|
||||
reverse("people"),
|
||||
{"q": ""},
|
||||
HTTP_HX_REQUEST="true",
|
||||
)
|
||||
assert response_empty.status_code == 200
|
||||
assert response_empty.content == b""
|
||||
|
||||
# 3. Test HTMX GET request with matching query
|
||||
user1, user2 = create_users
|
||||
response_search = client.get(
|
||||
reverse("people"),
|
||||
{"q": "user1"},
|
||||
HTTP_HX_REQUEST="true",
|
||||
)
|
||||
assert response_search.status_code == 200
|
||||
assert b"user1" in response_search.content
|
||||
assert b"user1@user.com" in response_search.content
|
||||
assert b"Actions" in response_search.content
|
||||
|
||||
# 4. Test HTMX GET request with no matching users
|
||||
response_no_match = client.get(
|
||||
reverse("people"),
|
||||
{"q": "nonexistent_username_xyz"},
|
||||
HTTP_HX_REQUEST="true",
|
||||
)
|
||||
assert response_no_match.status_code == 200
|
||||
assert b"No users found matching" in response_no_match.content
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -140,9 +140,40 @@ def server(request):
|
||||
|
||||
@user_is_cid_user_manager
|
||||
def people(request):
|
||||
"""Render the people management overview or search users via HTMX.
|
||||
|
||||
Scope: managers and superusers.
|
||||
Functionality: provides details on user roles/groups, and a single search
|
||||
input that filters users dynamically via HTMX GET requests.
|
||||
"""
|
||||
if request.htmx:
|
||||
q = request.GET.get("q", "").strip()
|
||||
if not q:
|
||||
return HttpResponse("")
|
||||
|
||||
users = (
|
||||
User.objects.filter(
|
||||
Q(first_name__icontains=q)
|
||||
| Q(last_name__icontains=q)
|
||||
| Q(email__icontains=q)
|
||||
| Q(username__icontains=q)
|
||||
)
|
||||
.prefetch_related(
|
||||
"userprofile", "userprofile__grade", "userprofile__supervisor", "user_groups"
|
||||
)
|
||||
.order_by("first_name", "last_name", "username")[:20]
|
||||
)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"rad/partials/_people_search_results.html",
|
||||
{"users": users, "q": q},
|
||||
)
|
||||
|
||||
return render(request, "people.html", {})
|
||||
|
||||
|
||||
|
||||
@login_required
|
||||
def profile(request):
|
||||
"""Render the current user's profile page with group management context.
|
||||
|
||||
Reference in New Issue
Block a user