mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
feat: Gestion multi-profil multi-école
This commit is contained in:
1
Back-End/Establishment/__init__.py
Normal file
1
Back-End/Establishment/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
default_app_config = 'Establishment.apps.EstablishmentConfig'
|
||||
3
Back-End/Establishment/admin.py
Normal file
3
Back-End/Establishment/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
7
Back-End/Establishment/apps.py
Normal file
7
Back-End/Establishment/apps.py
Normal file
@ -0,0 +1,7 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
class EstablishmentConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'Establishment'
|
||||
|
||||
|
||||
20
Back-End/Establishment/models.py
Normal file
20
Back-End/Establishment/models.py
Normal file
@ -0,0 +1,20 @@
|
||||
from django.db import models
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
class StructureType(models.IntegerChoices):
|
||||
MATERNELLE = 1, _('Maternelle')
|
||||
PRIMAIRE = 2, _('Primaire')
|
||||
SECONDAIRE = 3, _('Secondaire')
|
||||
|
||||
class Establishment(models.Model):
|
||||
name = models.CharField(max_length=255, unique=True)
|
||||
address = models.CharField(max_length=255)
|
||||
total_capacity = models.IntegerField()
|
||||
establishment_type = ArrayField(models.IntegerField(choices=StructureType.choices))
|
||||
licence_code = models.CharField(max_length=100, blank=True)
|
||||
is_active = models.BooleanField(default=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
91
Back-End/Establishment/serializers.py
Normal file
91
Back-End/Establishment/serializers.py
Normal file
@ -0,0 +1,91 @@
|
||||
from rest_framework import serializers
|
||||
from .models import Establishment
|
||||
from School.models import SchoolClass, Teacher, Speciality, Fee, Discount, PaymentMode, PaymentPlan
|
||||
from Subscriptions.models import RegistrationForm, RegistrationFileGroup
|
||||
from Auth.models import Profile
|
||||
|
||||
class EstablishmentSerializer(serializers.ModelSerializer):
|
||||
profile_count = serializers.SerializerMethodField()
|
||||
profiles = serializers.SerializerMethodField()
|
||||
school_class_count = serializers.SerializerMethodField()
|
||||
school_classes = serializers.SerializerMethodField()
|
||||
teacher_count = serializers.SerializerMethodField()
|
||||
teachers = serializers.SerializerMethodField()
|
||||
speciality_count = serializers.SerializerMethodField()
|
||||
specialities = serializers.SerializerMethodField()
|
||||
fee_count = serializers.SerializerMethodField()
|
||||
fees = serializers.SerializerMethodField()
|
||||
discount_count = serializers.SerializerMethodField()
|
||||
discounts = serializers.SerializerMethodField()
|
||||
active_payment_mode_count = serializers.SerializerMethodField()
|
||||
active_payment_modes = serializers.SerializerMethodField()
|
||||
active_payment_plan_count = serializers.SerializerMethodField()
|
||||
active_payment_plans = serializers.SerializerMethodField()
|
||||
file_group_count = serializers.SerializerMethodField()
|
||||
file_groups = serializers.SerializerMethodField()
|
||||
registration_form_count = serializers.SerializerMethodField()
|
||||
registration_forms = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Establishment
|
||||
fields = '__all__'
|
||||
|
||||
def get_profile_count(self, obj):
|
||||
return Profile.objects.filter(roles__establishment=obj).distinct().count()
|
||||
|
||||
def get_profiles(self, obj):
|
||||
return list(Profile.objects.filter(roles__establishment=obj).distinct().values_list('email', flat=True))
|
||||
|
||||
def get_school_class_count(self, obj):
|
||||
return SchoolClass.objects.filter(establishment=obj).distinct().count()
|
||||
|
||||
def get_school_classes(self, obj):
|
||||
return list(SchoolClass.objects.filter(establishment=obj).distinct().values_list('atmosphere_name', flat=True))
|
||||
|
||||
def get_teacher_count(self, obj):
|
||||
return Teacher.objects.filter(profile_role__establishment=obj).distinct().count()
|
||||
|
||||
def get_teachers(self, obj):
|
||||
return list(Teacher.objects.filter(profile_role__establishment=obj).distinct().values_list('last_name', 'first_name'))
|
||||
|
||||
def get_speciality_count(self, obj):
|
||||
return Speciality.objects.filter(establishment=obj).distinct().count()
|
||||
|
||||
def get_specialities(self, obj):
|
||||
return list(Speciality.objects.filter(establishment=obj).distinct().values_list('name', flat=True))
|
||||
|
||||
def get_fee_count(self, obj):
|
||||
return Fee.objects.filter(establishment=obj).distinct().count()
|
||||
|
||||
def get_fees(self, obj):
|
||||
return list(Fee.objects.filter(establishment=obj).distinct().values_list('name', flat=True))
|
||||
|
||||
def get_discount_count(self, obj):
|
||||
return Discount.objects.filter(establishment=obj).distinct().count()
|
||||
|
||||
def get_discounts(self, obj):
|
||||
return list(Discount.objects.filter(establishment=obj).distinct().values_list('name', flat=True))
|
||||
|
||||
def get_active_payment_mode_count(self, obj):
|
||||
return PaymentMode.objects.filter(establishment=obj, is_active=True).distinct().count()
|
||||
|
||||
def get_active_payment_modes(self, obj):
|
||||
return list(PaymentMode.objects.filter(establishment=obj, is_active=True).distinct().values_list('mode', flat=True))
|
||||
|
||||
def get_active_payment_plan_count(self, obj):
|
||||
return PaymentPlan.objects.filter(establishment=obj, is_active=True).distinct().count()
|
||||
|
||||
def get_active_payment_plans(self, obj):
|
||||
return list(PaymentPlan.objects.filter(establishment=obj, is_active=True).distinct().values_list('frequency', flat=True))
|
||||
|
||||
def get_file_group_count(self, obj):
|
||||
return RegistrationFileGroup.objects.filter(establishment=obj).distinct().count()
|
||||
|
||||
def get_file_groups(self, obj):
|
||||
return list(RegistrationFileGroup.objects.filter(establishment=obj).distinct().values_list('name', flat=True))
|
||||
|
||||
def get_registration_form_count(self, obj):
|
||||
return RegistrationForm.objects.filter(establishment=obj).distinct().count()
|
||||
|
||||
def get_registration_forms(self, obj):
|
||||
return list(RegistrationForm.objects.filter(establishment=obj).distinct().values_list('student__last_name', 'student__first_name'))
|
||||
7
Back-End/Establishment/urls.py
Normal file
7
Back-End/Establishment/urls.py
Normal file
@ -0,0 +1,7 @@
|
||||
from django.urls import path, re_path
|
||||
from .views import EstablishmentListCreateView, EstablishmentDetailView
|
||||
|
||||
urlpatterns = [
|
||||
re_path(r'^establishments$', EstablishmentListCreateView.as_view(), name='establishment_list_create'),
|
||||
re_path(r'^establishments/(?P<id>[0-9]+)$', EstablishmentDetailView.as_view(), name="establishment_detail"),
|
||||
]
|
||||
51
Back-End/Establishment/views.py
Normal file
51
Back-End/Establishment/views.py
Normal file
@ -0,0 +1,51 @@
|
||||
from django.http.response import JsonResponse
|
||||
from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect
|
||||
from django.utils.decorators import method_decorator
|
||||
from rest_framework.parsers import JSONParser
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework import status
|
||||
from .models import Establishment
|
||||
from .serializers import EstablishmentSerializer
|
||||
from N3wtSchool.bdd import delete_object, getAllObjects, getObject
|
||||
|
||||
@method_decorator(csrf_protect, name='dispatch')
|
||||
@method_decorator(ensure_csrf_cookie, name='dispatch')
|
||||
class EstablishmentListCreateView(APIView):
|
||||
def get(self, request):
|
||||
establishments = getAllObjects(Establishment)
|
||||
establishments_serializer = EstablishmentSerializer(establishments, many=True)
|
||||
return JsonResponse(establishments_serializer.data, safe=False, status=status.HTTP_200_OK)
|
||||
|
||||
def post(self, request):
|
||||
establishment_data = JSONParser().parse(request)
|
||||
establishment_serializer = EstablishmentSerializer(data=establishment_data)
|
||||
if establishment_serializer.is_valid():
|
||||
establishment_serializer.save()
|
||||
return JsonResponse(establishment_serializer.data, safe=False, status=status.HTTP_201_CREATED)
|
||||
return JsonResponse(establishment_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@method_decorator(csrf_protect, name='dispatch')
|
||||
@method_decorator(ensure_csrf_cookie, name='dispatch')
|
||||
class EstablishmentDetailView(APIView):
|
||||
def get(self, request, id=None):
|
||||
try:
|
||||
establishment = Establishment.objects.get(id=id)
|
||||
establishment_serializer = EstablishmentSerializer(establishment)
|
||||
return JsonResponse(establishment_serializer.data, safe=False)
|
||||
except Establishment.DoesNotExist:
|
||||
return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
def put(self, request, id):
|
||||
establishment_data = JSONParser().parse(request)
|
||||
try:
|
||||
establishment = Establishment.objects.get(id=id)
|
||||
except Establishment.DoesNotExist:
|
||||
return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND)
|
||||
establishment_serializer = EstablishmentSerializer(establishment, data=establishment_data, partial=True)
|
||||
if establishment_serializer.is_valid():
|
||||
establishment_serializer.save()
|
||||
return JsonResponse(establishment_serializer.data, safe=False)
|
||||
return JsonResponse(establishment_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
def delete(self, request, id):
|
||||
return delete_object(Establishment, id)
|
||||
Reference in New Issue
Block a user