55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
from django.contrib.auth.decorators import login_required
|
|
from django.shortcuts import render, get_object_or_404
|
|
from django.http import HttpResponse
|
|
from django.db.models import Q
|
|
from .models import Employee
|
|
from .forms import EmployeeForm
|
|
|
|
|
|
@login_required
|
|
def user_list(request):
|
|
query = request.GET.get("search", "")
|
|
employees = Employee.objects.all().order_by("name")
|
|
|
|
if query:
|
|
# Filter by name, username, or role (case-insensitive)
|
|
employees = employees.filter(
|
|
Q(name__icontains=query)
|
|
| Q(username__icontains=query)
|
|
| Q(role__icontains=query)
|
|
)
|
|
|
|
context = {"employees": employees}
|
|
|
|
# If the request comes from HTMX, only return the table rows
|
|
if request.headers.get("HX-Request"):
|
|
return render(request, "users/partials/user_table.html", context)
|
|
|
|
# Otherwise, return the full page
|
|
return render(request, "users/user_list.html", context)
|
|
|
|
|
|
@login_required
|
|
def employee_form(request, pk=None):
|
|
if pk:
|
|
employee = get_object_or_404(Employee, pk=pk)
|
|
else:
|
|
employee = None
|
|
|
|
if request.method == "POST":
|
|
form = EmployeeForm(request.POST, instance=employee)
|
|
if form.is_valid():
|
|
form.save()
|
|
# Return a 204 No Content response, but trigger custom HTMX events
|
|
response = HttpResponse(status=204)
|
|
response["HX-Trigger"] = "employeeListChanged, closeModal"
|
|
return response
|
|
else:
|
|
form = EmployeeForm(instance=employee)
|
|
|
|
return render(
|
|
request,
|
|
"users/partials/employee_form.html",
|
|
{"form": form, "employee": employee},
|
|
)
|