mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
fix: Correction dépendances circulaires
This commit is contained in:
@ -2,7 +2,6 @@ from django.contrib.auth.models import AbstractUser
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.core.validators import EmailValidator
|
||||
from Establishment.models import Establishment
|
||||
|
||||
class Profile(AbstractUser):
|
||||
email = models.EmailField(max_length=255, unique=True, default="", validators=[EmailValidator()])
|
||||
@ -25,7 +24,7 @@ class ProfileRole(models.Model):
|
||||
|
||||
profile = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='roles')
|
||||
role_type = models.IntegerField(choices=RoleType.choices, default=RoleType.PROFIL_UNDEFINED)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='profile_roles')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='profile_roles')
|
||||
is_active = models.BooleanField(default=False)
|
||||
updated_date = models.DateTimeField(auto_now=True)
|
||||
|
||||
|
||||
0
Back-End/Common/__init__.py
Normal file
0
Back-End/Common/__init__.py
Normal file
3
Back-End/Common/admin.py
Normal file
3
Back-End/Common/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
Back-End/Common/apps.py
Normal file
6
Back-End/Common/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CommonConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'Common'
|
||||
13
Back-End/Common/models.py
Normal file
13
Back-End/Common/models.py
Normal file
@ -0,0 +1,13 @@
|
||||
from django.db import models
|
||||
|
||||
class StudentCompetency(models.Model):
|
||||
student = models.ForeignKey('Subscriptions.Student', on_delete=models.CASCADE, related_name='competency_scores')
|
||||
competency = models.ForeignKey('School.Competency', on_delete=models.CASCADE, related_name='student_scores')
|
||||
score = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
|
||||
comment = models.TextField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('student', 'competency')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.student} - {self.competency.name} - Score: {self.score}"
|
||||
3
Back-End/Common/tests.py
Normal file
3
Back-End/Common/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
3
Back-End/Common/views.py
Normal file
3
Back-End/Common/views.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
@ -1,17 +1,14 @@
|
||||
from django.http.response import JsonResponse
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.parsers import JSONParser
|
||||
from django.core.mail import send_mail
|
||||
from django.utils.html import strip_tags
|
||||
from django.conf import settings
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from django.db.models import Q
|
||||
from Auth.models import Profile # Assurez-vous que le modèle Profile contient les informations nécessaires
|
||||
from Auth.models import Profile, ProfileRole
|
||||
|
||||
from .models import *
|
||||
from School.models import Teacher, ProfileRole
|
||||
from Settings.models import SMTPSettings # Assurez-vous que le chemin est correct
|
||||
from School.models import Teacher
|
||||
|
||||
from GestionMessagerie.serializers import MessageSerializer
|
||||
from School.serializers import TeacherSerializer
|
||||
|
||||
@ -1,30 +1,21 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
from Subscriptions.models import (
|
||||
RegistrationForm,
|
||||
Student,
|
||||
Guardian,
|
||||
Fee,
|
||||
Discount,
|
||||
RegistrationFileGroup,
|
||||
RegistrationSchoolFileMaster,
|
||||
RegistrationSchoolFileTemplate
|
||||
RegistrationFileGroup
|
||||
)
|
||||
from Auth.models import Profile, ProfileRole
|
||||
from School.models import (
|
||||
FeeType,
|
||||
Speciality,
|
||||
Teacher,
|
||||
SchoolClass,
|
||||
PaymentMode,
|
||||
PaymentModeType,
|
||||
PaymentPlan,
|
||||
PaymentPlanType,
|
||||
DiscountType
|
||||
DiscountType,
|
||||
Fee,
|
||||
Discount,
|
||||
)
|
||||
from django.utils import timezone
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from django.core.files import File
|
||||
from django.core.exceptions import SuspiciousFileOperation
|
||||
import os
|
||||
from django.conf import settings
|
||||
from faker import Faker
|
||||
@ -42,7 +33,7 @@ from School.serializers import (
|
||||
)
|
||||
from Auth.serializers import ProfileSerializer, ProfileRoleSerializer
|
||||
from Establishment.serializers import EstablishmentSerializer
|
||||
from Subscriptions.serializers import RegistrationFormSerializer, StudentSerializer
|
||||
from Subscriptions.serializers import StudentSerializer
|
||||
|
||||
from Subscriptions.util import getCurrentSchoolYear, getNextSchoolYear # Import des fonctions nécessaires
|
||||
|
||||
|
||||
@ -1,6 +1,4 @@
|
||||
from django.db import models
|
||||
from Auth.models import ProfileRole
|
||||
from Establishment.models import Establishment
|
||||
from django.db.models import JSONField
|
||||
from django.dispatch import receiver
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
@ -23,7 +21,7 @@ class Speciality(models.Model):
|
||||
name = models.CharField(max_length=100)
|
||||
updated_date = models.DateTimeField(auto_now=True)
|
||||
color_code = models.CharField(max_length=7, default='#FFFFFF')
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='specialities')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='specialities')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@ -32,7 +30,7 @@ class Teacher(models.Model):
|
||||
last_name = models.CharField(max_length=100)
|
||||
first_name = models.CharField(max_length=100)
|
||||
specialities = models.ManyToManyField(Speciality, blank=True)
|
||||
profile_role = models.OneToOneField(ProfileRole, on_delete=models.CASCADE, related_name='teacher_profile', null=True, blank=True)
|
||||
profile_role = models.OneToOneField('Auth.ProfileRole', on_delete=models.CASCADE, related_name='teacher_profile', null=True, blank=True)
|
||||
updated_date = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
@ -56,7 +54,7 @@ class SchoolClass(models.Model):
|
||||
type = models.IntegerField(choices=PLANNING_TYPE_CHOICES, default=1)
|
||||
time_range = models.JSONField(default=list)
|
||||
opening_days = ArrayField(models.IntegerField(), default=list)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='school_classes')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='school_classes')
|
||||
|
||||
def __str__(self):
|
||||
return self.atmosphere_name
|
||||
@ -96,7 +94,7 @@ class Discount(models.Model):
|
||||
discount_type = models.IntegerField(choices=DiscountType.choices, default=DiscountType.CURRENCY)
|
||||
type = models.IntegerField(choices=FeeType.choices, default=FeeType.REGISTRATION_FEE)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='discounts')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='discounts')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@ -108,7 +106,7 @@ class Fee(models.Model):
|
||||
is_active = models.BooleanField(default=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
type = models.IntegerField(choices=FeeType.choices, default=FeeType.REGISTRATION_FEE)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='fees')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='fees')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@ -118,7 +116,7 @@ class PaymentPlan(models.Model):
|
||||
due_dates = ArrayField(models.DateField(), blank=True)
|
||||
type = models.IntegerField(choices=FeeType.choices, default=FeeType.REGISTRATION_FEE)
|
||||
is_active = models.BooleanField(default=False)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='payment_plans')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='payment_plans')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.get_frequency_display()} - {self.get_type_display()}"
|
||||
@ -127,7 +125,7 @@ class PaymentMode(models.Model):
|
||||
mode = models.IntegerField(choices=PaymentModeType.choices, default=PaymentModeType.SEPA)
|
||||
type = models.IntegerField(choices=FeeType.choices, default=FeeType.REGISTRATION_FEE)
|
||||
is_active = models.BooleanField(default=False)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='payment_modes')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='payment_modes')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.get_mode_display()} - {self.get_type_display()}"
|
||||
@ -155,7 +153,7 @@ class Competency(models.Model):
|
||||
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='competencies')
|
||||
|
||||
establishments = models.ManyToManyField(
|
||||
Establishment,
|
||||
'Establishment.Establishment',
|
||||
through='EstablishmentCompetency',
|
||||
related_name='competencies',
|
||||
blank=True
|
||||
@ -169,7 +167,7 @@ class EstablishmentCompetency(models.Model):
|
||||
Relation entre un établissement et une compétence.
|
||||
Permet de définir quelles compétences sont sélectionnées par un établissement.
|
||||
"""
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE)
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE)
|
||||
competency = models.ForeignKey(Competency, on_delete=models.CASCADE)
|
||||
is_selected = models.BooleanField(default=False)
|
||||
|
||||
@ -180,18 +178,18 @@ class EstablishmentCompetency(models.Model):
|
||||
return f"{self.establishment.name} - {self.competency.name}"
|
||||
|
||||
|
||||
class StudentCompetency(models.Model):
|
||||
"""
|
||||
Relation entre un élève et une compétence.
|
||||
Permet d'attribuer une note à un élève pour une compétence.
|
||||
"""
|
||||
student = models.ForeignKey('Subscriptions.Student', on_delete=models.CASCADE, related_name='competency_scores')
|
||||
competency = models.ForeignKey(Competency, on_delete=models.CASCADE, related_name='student_scores')
|
||||
score = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) # Note attribuée
|
||||
comment = models.TextField(blank=True, null=True) # Commentaire facultatif
|
||||
# class StudentCompetency(models.Model):
|
||||
# """
|
||||
# Relation entre un élève et une compétence.
|
||||
# Permet d'attribuer une note à un élève pour une compétence.
|
||||
# """
|
||||
# student = models.ForeignKey('Subscriptions.Student', on_delete=models.CASCADE, related_name='competency_scores')
|
||||
# competency = models.ForeignKey(Competency, on_delete=models.CASCADE, related_name='student_scores')
|
||||
# score = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) # Note attribuée
|
||||
# comment = models.TextField(blank=True, null=True) # Commentaire facultatif
|
||||
|
||||
class Meta:
|
||||
unique_together = ('student', 'competency')
|
||||
# class Meta:
|
||||
# unique_together = ('student', 'competency')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.student} - {self.competency.name} - Score: {self.score}"
|
||||
# def __str__(self):
|
||||
# return f"{self.student} - {self.competency.name} - Score: {self.score}"
|
||||
@ -3,11 +3,8 @@ from django.utils.timezone import now
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from School.models import SchoolClass, Fee, Discount, PaymentModeType, PaymentPlanType
|
||||
from Auth.models import ProfileRole
|
||||
from Establishment.models import Establishment
|
||||
|
||||
from datetime import datetime
|
||||
from School.models import PaymentModeType, PaymentPlanType
|
||||
|
||||
import os
|
||||
|
||||
@ -31,7 +28,7 @@ class Guardian(models.Model):
|
||||
address = models.CharField(max_length=200, default="", blank=True)
|
||||
phone = models.CharField(max_length=200, default="", blank=True)
|
||||
profession = models.CharField(max_length=200, default="", blank=True)
|
||||
profile_role = models.OneToOneField(ProfileRole, on_delete=models.CASCADE, related_name='guardian_profile', null=True, blank=True)
|
||||
profile_role = models.OneToOneField('Auth.ProfileRole', on_delete=models.CASCADE, related_name='guardian_profile', null=True, blank=True)
|
||||
|
||||
@property
|
||||
def email(self):
|
||||
@ -100,19 +97,19 @@ class Student(models.Model):
|
||||
profiles = models.ManyToManyField('Auth.Profile', blank=True)
|
||||
|
||||
# Many-to-Many Relationship
|
||||
guardians = models.ManyToManyField(Guardian, blank=True)
|
||||
guardians = models.ManyToManyField('Subscriptions.Guardian', blank=True)
|
||||
|
||||
# Many-to-Many Relationship
|
||||
siblings = models.ManyToManyField(Sibling, blank=True)
|
||||
siblings = models.ManyToManyField('Subscriptions.Sibling', blank=True)
|
||||
|
||||
# Many-to-Many Relationship
|
||||
registration_files = models.ManyToManyField('RegistrationSchoolFileTemplate', blank=True, related_name='students')
|
||||
registration_files = models.ManyToManyField('Subscriptions.RegistrationSchoolFileTemplate', blank=True, related_name='students')
|
||||
|
||||
# Many-to-Many Relationship
|
||||
spoken_languages = models.ManyToManyField(Language, blank=True)
|
||||
spoken_languages = models.ManyToManyField('Subscriptions.Language', blank=True)
|
||||
|
||||
# One-to-Many Relationship
|
||||
associated_class = models.ForeignKey(SchoolClass, on_delete=models.SET_NULL, null=True, blank=True, related_name='students')
|
||||
associated_class = models.ForeignKey('School.SchoolClass', on_delete=models.SET_NULL, null=True, blank=True, related_name='students')
|
||||
|
||||
def __str__(self):
|
||||
return self.last_name + "_" + self.first_name
|
||||
@ -190,7 +187,7 @@ class Student(models.Model):
|
||||
class RegistrationFileGroup(models.Model):
|
||||
name = models.CharField(max_length=255, default="")
|
||||
description = models.TextField(blank=True, null=True)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='file_group', null=True, blank=True)
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='file_group', null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@ -239,17 +236,17 @@ class RegistrationForm(models.Model):
|
||||
associated_rf = models.CharField(max_length=200, default="", blank=True)
|
||||
|
||||
# Many-to-Many Relationship
|
||||
fees = models.ManyToManyField(Fee, blank=True, related_name='register_forms')
|
||||
fees = models.ManyToManyField('School.Fee', blank=True, related_name='register_forms')
|
||||
|
||||
# Many-to-Many Relationship
|
||||
discounts = models.ManyToManyField(Discount, blank=True, related_name='register_forms')
|
||||
discounts = models.ManyToManyField('School.Discount', blank=True, related_name='register_forms')
|
||||
fileGroup = models.ForeignKey(RegistrationFileGroup,
|
||||
on_delete=models.SET_NULL,
|
||||
related_name='register_forms',
|
||||
null=True,
|
||||
blank=True)
|
||||
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='register_forms')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='register_forms')
|
||||
registration_payment = models.IntegerField(choices=PaymentModeType.choices, null=True, blank=True)
|
||||
tuition_payment = models.IntegerField(choices=PaymentModeType.choices, null=True, blank=True)
|
||||
registration_payment_plan = models.IntegerField(choices=PaymentPlanType.choices, null=True, blank=True)
|
||||
@ -386,7 +383,7 @@ class AbsenceManagement(models.Model):
|
||||
on_delete=models.CASCADE,
|
||||
related_name='absences'
|
||||
)
|
||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='absences')
|
||||
establishment = models.ForeignKey('Establishment.Establishment', on_delete=models.CASCADE, related_name='absences')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.student} - {self.day} - {self.get_moment_display()} - {self.get_reason_display()}"
|
||||
Reference in New Issue
Block a user