employees api

This commit is contained in:
Mikan
2025-05-19 17:00:02 +03:00
parent 5623d01134
commit 59df2c55d9
7 changed files with 104 additions and 8 deletions

View File

@@ -7,13 +7,13 @@ class AcademicYearSerializer(serializers.ModelSerializer):
fields = "__all__" fields = "__all__"
class DepartmentSerializer(serializers.ModelSerializer): class StudyDepartmentSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Department model = Department
fields = "__all__" fields = "__all__"
class DepartmentHeadSerializer(serializers.ModelSerializer): class StudyDepartmentHeadSerializer(serializers.ModelSerializer):
head_name = serializers.SerializerMethodField() head_name = serializers.SerializerMethodField()
class Meta: class Meta:

View File

@@ -4,8 +4,8 @@ from django_filters.rest_framework import DjangoFilterBackend
from .models import AcademicYear, Department, DepartmentHead, Specialty, Group, Student from .models import AcademicYear, Department, DepartmentHead, Specialty, Group, Student
from .serializers import ( from .serializers import (
AcademicYearSerializer, AcademicYearSerializer,
DepartmentSerializer, StudyDepartmentSerializer,
DepartmentHeadSerializer, StudyDepartmentHeadSerializer,
SpecialtySerializer, SpecialtySerializer,
GroupSerializer, GroupSerializer,
StudentSerializer, StudentSerializer,
@@ -30,7 +30,7 @@ class AcademicYearViewSet(viewsets.ModelViewSet):
class DepartmentViewSet(viewsets.ModelViewSet): class DepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all() queryset = Department.objects.all()
serializer_class = DepartmentSerializer serializer_class = StudyDepartmentSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_class = DepartmentFilter filterset_class = DepartmentFilter
search_fields = ["name"] search_fields = ["name"]
@@ -39,7 +39,7 @@ class DepartmentViewSet(viewsets.ModelViewSet):
class DepartmentHeadViewSet(viewsets.ModelViewSet): class DepartmentHeadViewSet(viewsets.ModelViewSet):
queryset = DepartmentHead.objects.all() queryset = DepartmentHead.objects.all()
serializer_class = DepartmentHeadSerializer serializer_class = StudyDepartmentHeadSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_class = DepartmentHeadFilter filterset_class = DepartmentHeadFilter
search_fields = ["department__name", "head__first_name"] search_fields = ["department__name", "head__first_name"]

12
employees/filters.py Normal file
View File

@@ -0,0 +1,12 @@
import django_filters
from .models import Employee
class EmployeeFilter(django_filters.FilterSet):
first_name = django_filters.CharFilter(field_name="account__first_name", lookup_expr="icontains")
last_name = django_filters.CharFilter(field_name="account__last_name", lookup_expr="icontains")
department_name = django_filters.CharFilter(field_name="department__name", lookup_expr="icontains")
position_name = django_filters.CharFilter(field_name="position__name", lookup_expr="icontains")
class Meta:
model = Employee
fields = ["first_name", "last_name", "department_name", "position_name"]

44
employees/serializers.py Normal file
View File

@@ -0,0 +1,44 @@
from rest_framework import serializers
from .models import Position, Department, Employee
class PositionSerializer(serializers.ModelSerializer):
class Meta:
model = Position
fields = "__all__"
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = Department
fields = "__all__"
class EmployeeSerializer(serializers.ModelSerializer):
first_name = serializers.CharField(source="account.first_name")
last_name = serializers.CharField(source="account.last_name")
middle_name = serializers.CharField(source="account.middle_name", allow_null=True)
phone = serializers.CharField(source="account.phone", allow_null=True)
email = serializers.CharField(source="account.email")
class Meta:
model = Employee
fields = [
"id",
"department",
"position",
"first_name",
"last_name",
"middle_name",
"phone",
"email",
]
def update(self, instance, validated_data):
account_data = validated_data.pop("account", {})
instance.account.first_name = account_data.get("first_name", instance.account.first_name)
instance.account.last_name = account_data.get("last_name", instance.account.last_name)
instance.account.middle_name = account_data.get("middle_name", instance.account.middle_name)
instance.account.phone = account_data.get("phone", instance.account.phone)
instance.account.email = account_data.get("email", instance.account.email)
instance.account.save()
return super().update(instance, validated_data)

12
employees/urls.py Normal file
View File

@@ -0,0 +1,12 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PositionViewSet, DepartmentViewSet, EmployeeViewSet
router = DefaultRouter()
router.register(r"positions", PositionViewSet, basename="position")
router.register(r"departments", DepartmentViewSet, basename="department")
router.register(r"employees", EmployeeViewSet, basename="employee")
urlpatterns = [
path("", include(router.urls)),
]

View File

@@ -1,3 +1,30 @@
from django.shortcuts import render from rest_framework import viewsets
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from .models import Position, Department, Employee
from .serializers import PositionSerializer, DepartmentSerializer, EmployeeSerializer
from .filters import EmployeeFilter # Фильтры будут добавлены позже
# Create your views here. class PositionViewSet(viewsets.ModelViewSet):
queryset = Position.objects.all()
serializer_class = PositionSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ["name"]
ordering_fields = ["name"]
class DepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all()
serializer_class = DepartmentSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ["name"]
ordering_fields = ["name"]
class EmployeeViewSet(viewsets.ModelViewSet):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_class = EmployeeFilter
search_fields = ["account__first_name", "account__last_name", "position__name", "department__name"]
ordering_fields = ["department", "position", "account__last_name"]

View File

@@ -39,6 +39,7 @@ schema_view = get_schema_view(
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('api/v1/education/', include("education.urls")), path('api/v1/education/', include("education.urls")),
path('api/v1/employees/', include("employees.urls")),
path('docs/swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'), path('docs/swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'),
path('docs/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), path('docs/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),