common api

This commit is contained in:
Mikan
2025-05-19 17:10:30 +03:00
parent 59df2c55d9
commit a0a337045b
13 changed files with 659 additions and 6 deletions

25
outreach/filters.py Normal file
View File

@@ -0,0 +1,25 @@
import django_filters
from .models import School, SchoolResponsibility
class SchoolFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr="icontains")
address = django_filters.CharFilter(lookup_expr="icontains")
institution_type_name = django_filters.CharFilter(
field_name="institution_type__name", lookup_expr="icontains"
)
class Meta:
model = School
fields = ["name", "address", "institution_type_name"]
class SchoolResponsibilityFilter(django_filters.FilterSet):
academic_year = django_filters.CharFilter(field_name="academic_year__year", lookup_expr="exact")
school_name = django_filters.CharFilter(field_name="school__name", lookup_expr="icontains")
responsible_name = django_filters.CharFilter(
field_name="responsible__account__first_name", lookup_expr="icontains"
)
class Meta:
model = SchoolResponsibility
fields = ["academic_year", "school_name", "responsible_name"]

67
outreach/serializers.py Normal file
View File

@@ -0,0 +1,67 @@
from rest_framework import serializers
from .models import (
InstitutionType,
Representative,
School,
Partner,
PartnerRepresentative,
SchoolResponsibility,
)
class InstitutionTypeSerializer(serializers.ModelSerializer):
class Meta:
model = InstitutionType
fields = "__all__"
class RepresentativeSerializer(serializers.ModelSerializer):
full_name = serializers.SerializerMethodField()
class Meta:
model = Representative
fields = ["id", "first_name", "last_name", "middle_name", "phone", "email", "position", "full_name"]
def get_full_name(self, obj):
return f"{obj.first_name} {obj.last_name}" + (f" {obj.middle_name}" if obj.middle_name else "")
class SchoolSerializer(serializers.ModelSerializer):
director_name = serializers.SerializerMethodField()
class Meta:
model = School
fields = ["id", "director", "institution_type", "name", "address", "director_name"]
def get_director_name(self, obj):
if obj.director:
return f"{obj.director.first_name} {obj.director.last_name}"
return None
class PartnerSerializer(serializers.ModelSerializer):
class Meta:
model = Partner
fields = "__all__"
class PartnerRepresentativeSerializer(serializers.ModelSerializer):
representative_name = serializers.SerializerMethodField()
class Meta:
model = PartnerRepresentative
fields = ["id", "representative", "partner", "representative_name"]
def get_representative_name(self, obj):
return f"{obj.representative.first_name} {obj.representative.last_name}"
class SchoolResponsibilitySerializer(serializers.ModelSerializer):
responsible_name = serializers.SerializerMethodField()
class Meta:
model = SchoolResponsibility
fields = ["id", "academic_year", "responsible", "school", "responsible_name"]
def get_responsible_name(self, obj):
return f"{obj.responsible.account.first_name} {obj.responsible.account.last_name}"

22
outreach/urls.py Normal file
View File

@@ -0,0 +1,22 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import (
InstitutionTypeViewSet,
RepresentativeViewSet,
SchoolViewSet,
PartnerViewSet,
PartnerRepresentativeViewSet,
SchoolResponsibilityViewSet,
)
router = DefaultRouter()
router.register(r"institution-types", InstitutionTypeViewSet, basename="institution-type")
router.register(r"representatives", RepresentativeViewSet, basename="representative")
router.register(r"schools", SchoolViewSet, basename="school")
router.register(r"partners", PartnerViewSet, basename="partner")
router.register(r"partner-representatives", PartnerRepresentativeViewSet, basename="partner-representative")
router.register(r"school-responsibilities", SchoolResponsibilityViewSet, basename="school-responsibility")
urlpatterns = [
path("", include(router.urls)),
]

View File

@@ -1,3 +1,73 @@
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 (
InstitutionType,
Representative,
School,
Partner,
PartnerRepresentative,
SchoolResponsibility,
)
from .serializers import (
InstitutionTypeSerializer,
RepresentativeSerializer,
SchoolSerializer,
PartnerSerializer,
PartnerRepresentativeSerializer,
SchoolResponsibilitySerializer,
)
from .filters import (
SchoolFilter,
SchoolResponsibilityFilter,
) # Фильтры будут добавлены позже
# Create your views here.
class InstitutionTypeViewSet(viewsets.ModelViewSet):
queryset = InstitutionType.objects.all()
serializer_class = InstitutionTypeSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ["name"]
ordering_fields = ["name"]
class RepresentativeViewSet(viewsets.ModelViewSet):
queryset = Representative.objects.all()
serializer_class = RepresentativeSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ["first_name", "last_name", "position"]
ordering_fields = ["position"]
class SchoolViewSet(viewsets.ModelViewSet):
queryset = School.objects.all()
serializer_class = SchoolSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_class = SchoolFilter
search_fields = ["name", "address"]
ordering_fields = ["institution_type", "name"]
class PartnerViewSet(viewsets.ModelViewSet):
queryset = Partner.objects.all()
serializer_class = PartnerSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ["name", "description"]
ordering_fields = ["name"]
class PartnerRepresentativeViewSet(viewsets.ModelViewSet):
queryset = PartnerRepresentative.objects.all()
serializer_class = PartnerRepresentativeSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ["representative", "partner"]
search_fields = ["representative__first_name", "partner__name"]
ordering_fields = ["partner", "representative"]
class SchoolResponsibilityViewSet(viewsets.ModelViewSet):
queryset = SchoolResponsibility.objects.all()
serializer_class = SchoolResponsibilitySerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_class = SchoolResponsibilityFilter
search_fields = ["school__name", "responsible__account__first_name"]
ordering_fields = ["academic_year", "responsible", "school"]