From 59df2c55d9ad7c22634a90c03f49f5bdcc97af37 Mon Sep 17 00:00:00 2001 From: Mikan <72257910+Mikan-DS@users.noreply.github.com> Date: Mon, 19 May 2025 17:00:02 +0300 Subject: [PATCH] employees api --- education/serializers.py | 4 ++-- education/views.py | 8 ++++---- employees/filters.py | 12 +++++++++++ employees/serializers.py | 44 ++++++++++++++++++++++++++++++++++++++++ employees/urls.py | 12 +++++++++++ employees/views.py | 31 ++++++++++++++++++++++++++-- tisbiProFi/urls.py | 1 + 7 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 employees/filters.py create mode 100644 employees/serializers.py create mode 100644 employees/urls.py diff --git a/education/serializers.py b/education/serializers.py index e2d6c30..33e577a 100644 --- a/education/serializers.py +++ b/education/serializers.py @@ -7,13 +7,13 @@ class AcademicYearSerializer(serializers.ModelSerializer): fields = "__all__" -class DepartmentSerializer(serializers.ModelSerializer): +class StudyDepartmentSerializer(serializers.ModelSerializer): class Meta: model = Department fields = "__all__" -class DepartmentHeadSerializer(serializers.ModelSerializer): +class StudyDepartmentHeadSerializer(serializers.ModelSerializer): head_name = serializers.SerializerMethodField() class Meta: diff --git a/education/views.py b/education/views.py index 6dac682..9c04e57 100644 --- a/education/views.py +++ b/education/views.py @@ -4,8 +4,8 @@ from django_filters.rest_framework import DjangoFilterBackend from .models import AcademicYear, Department, DepartmentHead, Specialty, Group, Student from .serializers import ( AcademicYearSerializer, - DepartmentSerializer, - DepartmentHeadSerializer, + StudyDepartmentSerializer, + StudyDepartmentHeadSerializer, SpecialtySerializer, GroupSerializer, StudentSerializer, @@ -30,7 +30,7 @@ class AcademicYearViewSet(viewsets.ModelViewSet): class DepartmentViewSet(viewsets.ModelViewSet): queryset = Department.objects.all() - serializer_class = DepartmentSerializer + serializer_class = StudyDepartmentSerializer filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = DepartmentFilter search_fields = ["name"] @@ -39,7 +39,7 @@ class DepartmentViewSet(viewsets.ModelViewSet): class DepartmentHeadViewSet(viewsets.ModelViewSet): queryset = DepartmentHead.objects.all() - serializer_class = DepartmentHeadSerializer + serializer_class = StudyDepartmentHeadSerializer filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = DepartmentHeadFilter search_fields = ["department__name", "head__first_name"] diff --git a/employees/filters.py b/employees/filters.py new file mode 100644 index 0000000..d1bdbff --- /dev/null +++ b/employees/filters.py @@ -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"] \ No newline at end of file diff --git a/employees/serializers.py b/employees/serializers.py new file mode 100644 index 0000000..a8e001e --- /dev/null +++ b/employees/serializers.py @@ -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) \ No newline at end of file diff --git a/employees/urls.py b/employees/urls.py new file mode 100644 index 0000000..8ba90ca --- /dev/null +++ b/employees/urls.py @@ -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)), +] \ No newline at end of file diff --git a/employees/views.py b/employees/views.py index 91ea44a..b539ec4 100644 --- a/employees/views.py +++ b/employees/views.py @@ -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"] \ No newline at end of file diff --git a/tisbiProFi/urls.py b/tisbiProFi/urls.py index 4c0407f..b9cf4ac 100644 --- a/tisbiProFi/urls.py +++ b/tisbiProFi/urls.py @@ -39,6 +39,7 @@ schema_view = get_schema_view( urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/education/', include("education.urls")), + path('api/v1/employees/', include("employees.urls")), path('docs/swagger/', 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'),