Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions hr/migrations/0002_alter_employee_email.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.23 on 2025-09-09 10:38

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('hr', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='employee',
name='email',
field=models.EmailField(max_length=254, unique=True),
),
]
1 change: 1 addition & 0 deletions hr/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ class Employee(AbstractUser):
position = models.ForeignKey(
"Position", on_delete=models.SET_NULL, null=True, blank=True
)
email = models.EmailField(max_length=254, unique=True)
9 changes: 8 additions & 1 deletion hr/urls.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
from django.urls import path
from django.urls import path, include
from django.contrib import admin

# from hr.views import generic_views as views
from hr.views import class_views as views

urlpatterns = [
path("employees/", views.EmployeeListView.as_view(), name="employee_list"),

path(
"employees/employee_details/<int:pk>",
views.EmployeeDetailView.as_view(),
name="details"
),
path(
"employees/create/", views.EmployeeCreateView.as_view(), name="employee_create"
),
Expand Down
19 changes: 17 additions & 2 deletions hr/views/class_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
)
from django.urls import reverse
from django.views import View
from django.core.paginator import Paginator

from hr.forms import EmployeeForm
from hr.models import Employee
Expand All @@ -25,10 +26,15 @@ def get(self, request):
employees = employees.filter(
Q(first_name__icontains=search)
| Q(last_name__icontains=search)
| Q(position__title__icontains=search),
| Q(position__title__icontains=search)
| Q(email__icontains=search)
)

context = {"employees": employees}
paginator = Paginator(employees, 10)
page_number = request.GET.get("page")
page_obj = paginator.get_page(page_number)

context = {"page_obj": page_obj}
return render(request, "employee_list.html", context)


Expand Down Expand Up @@ -78,3 +84,12 @@ def post(self, request, pk):

def test_func(self):
return user_is_superadmin(self.request.user)

class EmployeeDetailView(UserPassesTestMixin, View):
def get(self, request, pk):
employee = get_object_or_404(Employee, pk=pk)
print(f"Employee dict: {employee.__dict__}")
return render(request, "employee_details.html", {"employee": employee})

def test_func(self):
return user_is_superadmin(self.request.user)
Empty file removed templates/detail.html
Empty file.
24 changes: 24 additions & 0 deletions templates/employee_details.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{% extends 'base.html' %}

{% block title %}Employee Details{% endblock title %}

{% block content %}
<table class="table">
<thead>
<tr>
<th>Employee ID</th>
<th>Username</th>
<th>Email</th>
<th>Date Joined</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ employee.id }}</td>
<td>{{ employee.username }}</td>
<td>{{ employee.email }}</td>
<td>{{ employee.date_joined }}</td>
</tr>
</tbody>
</table>
{% endblock content %}
27 changes: 26 additions & 1 deletion templates/employee_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Username</th>
<th>First Name</th>
<th>Last Name</th>
Expand All @@ -30,8 +31,9 @@
</tr>
</thead>
<tbody>
{% for employee in employees %}
{% for employee in page_obj %}
<tr>
<td>{{ employee.id }}</td>
<td>{{ employee.username }}</td>
<td>{{ employee.first_name }}</td>
<td>{{ employee.last_name }}</td>
Expand All @@ -47,5 +49,28 @@
{% endfor %}
</tbody>
</table>
<nav>
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}">Previous</a>
</li>
{% endif %}

{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<li class="page-item active"><span class="page-link">{{ num }}</span></li>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<li class="page-item"><a class="page-link" href="?page={{ num }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}">{{ num }}</a></li>
{% endif %}
{% endfor %}

{% if page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.next_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}">Next</a>
</li>
{% endif %}
</ul>
</nav>
</div>
{% endblock %}