mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +00:00
chore: Création d'un RF de test au démarrage avec Template de documents
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,24 +0,0 @@
|
|||||||
from django.core.management.base import BaseCommand
|
|
||||||
from School.models import Establishment, StructureType
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = 'Initialize the establishment'
|
|
||||||
|
|
||||||
def handle(self, *args, **kwargs):
|
|
||||||
establishment_data = {
|
|
||||||
"name": "N3WT",
|
|
||||||
"address": "Société n3wt-innov 69 Chez LANA",
|
|
||||||
"total_capacity": 69,
|
|
||||||
"establishment_type": [StructureType.MATERNELLE, StructureType.PRIMAIRE],
|
|
||||||
"licence_code": ""
|
|
||||||
}
|
|
||||||
|
|
||||||
establishment, created = Establishment.objects.update_or_create(
|
|
||||||
name=establishment_data["name"],
|
|
||||||
defaults=establishment_data
|
|
||||||
)
|
|
||||||
|
|
||||||
if created:
|
|
||||||
self.stdout.write(self.style.SUCCESS('Establishment created successfully'))
|
|
||||||
else:
|
|
||||||
self.stdout.write(self.style.SUCCESS('Establishment updated successfully'))
|
|
||||||
510
Back-End/School/management/commands/init_mock_datas.py
Normal file
510
Back-End/School/management/commands/init_mock_datas.py
Normal file
@ -0,0 +1,510 @@
|
|||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from Subscriptions.models import (
|
||||||
|
RegistrationForm,
|
||||||
|
Student,
|
||||||
|
Guardian,
|
||||||
|
Fee,
|
||||||
|
Discount,
|
||||||
|
RegistrationFileGroup,
|
||||||
|
RegistrationFileTemplate
|
||||||
|
)
|
||||||
|
from Auth.models import Profile
|
||||||
|
from School.models import (
|
||||||
|
Establishment,
|
||||||
|
FeeType,
|
||||||
|
Speciality,
|
||||||
|
Teacher,
|
||||||
|
SchoolClass,
|
||||||
|
PaymentMode,
|
||||||
|
PaymentModeType,
|
||||||
|
PaymentPlan,
|
||||||
|
PaymentPlanType,
|
||||||
|
StructureType,
|
||||||
|
DiscountType
|
||||||
|
)
|
||||||
|
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
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = 'Initialise toutes les données mock'
|
||||||
|
|
||||||
|
def handle(self, *args, **kwargs):
|
||||||
|
self.create_or_update_establishment()
|
||||||
|
self.create_or_update_fees()
|
||||||
|
self.create_or_update_discounts()
|
||||||
|
self.create_or_update_payment_modes()
|
||||||
|
self.create_or_update_payment_plans()
|
||||||
|
self.create_or_update_specialities()
|
||||||
|
self.create_or_update_teachers()
|
||||||
|
self.create_or_update_school_classes()
|
||||||
|
self.create_or_update_registration_file_group()
|
||||||
|
self.create_or_update_registration_file_template()
|
||||||
|
self.create_register_form()
|
||||||
|
|
||||||
|
def create_or_update_establishment(self):
|
||||||
|
establishment_data = {
|
||||||
|
"name": "N3WT",
|
||||||
|
"address": "Société n3wt-innov 69 Chez LANA",
|
||||||
|
"total_capacity": 69,
|
||||||
|
"establishment_type": [StructureType.MATERNELLE, StructureType.PRIMAIRE],
|
||||||
|
"licence_code": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
establishment, created = Establishment.objects.update_or_create(
|
||||||
|
name=establishment_data["name"],
|
||||||
|
defaults=establishment_data
|
||||||
|
)
|
||||||
|
|
||||||
|
if created:
|
||||||
|
self.stdout.write(self.style.SUCCESS('Establishment created successfully'))
|
||||||
|
else:
|
||||||
|
self.stdout.write(self.style.SUCCESS('Establishment updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_fees(self):
|
||||||
|
establishment = Establishment.objects.get(name="N3WT")
|
||||||
|
fees_data = [
|
||||||
|
{
|
||||||
|
"name": "Frais d'inscription",
|
||||||
|
"base_amount": "150.00",
|
||||||
|
"description": "Montant de base",
|
||||||
|
"is_active": True,
|
||||||
|
"type": FeeType.REGISTRATION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Matériel",
|
||||||
|
"base_amount": "85.00",
|
||||||
|
"description": "Livres / jouets",
|
||||||
|
"is_active": True,
|
||||||
|
"type": FeeType.REGISTRATION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sorties périscolaires",
|
||||||
|
"base_amount": "120.00",
|
||||||
|
"description": "Sorties",
|
||||||
|
"is_active": True,
|
||||||
|
"type": FeeType.REGISTRATION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Les colibris",
|
||||||
|
"base_amount": "4500.00",
|
||||||
|
"description": "TPS / PS / MS / GS",
|
||||||
|
"is_active": True,
|
||||||
|
"type": FeeType.TUITION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Les butterflies",
|
||||||
|
"base_amount": "5000.00",
|
||||||
|
"description": "CP / CE1 / CE2 / CM1 / CM2",
|
||||||
|
"is_active": True,
|
||||||
|
"type": FeeType.TUITION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for fee_data in fees_data:
|
||||||
|
Fee.objects.update_or_create(
|
||||||
|
name=fee_data["name"],
|
||||||
|
type=fee_data["type"],
|
||||||
|
defaults=fee_data
|
||||||
|
)
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('Fees initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_discounts(self):
|
||||||
|
establishment = Establishment.objects.get(name="N3WT")
|
||||||
|
discounts_data = [
|
||||||
|
{
|
||||||
|
"name": "Parrainage",
|
||||||
|
"amount": "10.00",
|
||||||
|
"description": "Réduction pour parrainage",
|
||||||
|
"discount_type": DiscountType.PERCENT,
|
||||||
|
"type": FeeType.TUITION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Réinscription",
|
||||||
|
"amount": "100.00",
|
||||||
|
"description": "Réduction pour Réinscription",
|
||||||
|
"discount_type": DiscountType.PERCENT,
|
||||||
|
"type": FeeType.REGISTRATION_FEE,
|
||||||
|
"establishment": establishment
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for discount_data in discounts_data:
|
||||||
|
Discount.objects.update_or_create(
|
||||||
|
name=discount_data["name"],
|
||||||
|
type=discount_data["type"],
|
||||||
|
discount_type=discount_data["discount_type"],
|
||||||
|
defaults=discount_data
|
||||||
|
)
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('Discounts initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_payment_modes(self):
|
||||||
|
establishment = Establishment.objects.get(name="N3WT")
|
||||||
|
for fee_type in FeeType.choices:
|
||||||
|
fee_type_value = fee_type[0]
|
||||||
|
|
||||||
|
for mode in PaymentModeType.choices:
|
||||||
|
mode_value = mode[0]
|
||||||
|
|
||||||
|
PaymentMode.objects.update_or_create(
|
||||||
|
mode=mode_value,
|
||||||
|
type=fee_type_value,
|
||||||
|
defaults={
|
||||||
|
'is_active': False,
|
||||||
|
'establishment': establishment
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('Payment Modes initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_payment_plans(self):
|
||||||
|
current_date = timezone.now().date()
|
||||||
|
establishment = Establishment.objects.get(name="N3WT")
|
||||||
|
|
||||||
|
for fee_type in FeeType.choices:
|
||||||
|
fee_type_value = fee_type[0]
|
||||||
|
|
||||||
|
# 1 fois - échéance à 1 mois à partir de la date actuelle
|
||||||
|
PaymentPlan.objects.update_or_create(
|
||||||
|
frequency=PaymentPlanType.ONE_TIME,
|
||||||
|
type=fee_type_value,
|
||||||
|
defaults={
|
||||||
|
'due_dates': [current_date + relativedelta(months=1)],
|
||||||
|
'is_active': True,
|
||||||
|
'establishment': establishment
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# 3 fois - échéances espacées de 4 mois
|
||||||
|
PaymentPlan.objects.update_or_create(
|
||||||
|
frequency=PaymentPlanType.THREE_TIMES,
|
||||||
|
type=fee_type_value,
|
||||||
|
defaults={
|
||||||
|
'due_dates': [current_date + relativedelta(months=1+4*i) for i in range(3)],
|
||||||
|
'is_active': False,
|
||||||
|
'establishment': establishment
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# 10 fois - échéances espacées d'un mois
|
||||||
|
PaymentPlan.objects.update_or_create(
|
||||||
|
frequency=PaymentPlanType.TEN_TIMES,
|
||||||
|
type=fee_type_value,
|
||||||
|
defaults={
|
||||||
|
'due_dates': [current_date + relativedelta(months=1+i) for i in range(10)],
|
||||||
|
'is_active': False,
|
||||||
|
'establishment': establishment
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# 12 fois - échéances espacées d'un mois
|
||||||
|
PaymentPlan.objects.update_or_create(
|
||||||
|
frequency=PaymentPlanType.TWELVE_TIMES,
|
||||||
|
type=fee_type_value,
|
||||||
|
defaults={
|
||||||
|
'due_dates': [current_date + relativedelta(months=1+i) for i in range(12)],
|
||||||
|
'is_active': False,
|
||||||
|
'establishment': establishment
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('Payment Plans initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_specialities(self):
|
||||||
|
specialities_data = [
|
||||||
|
{
|
||||||
|
"name": "GROUPE",
|
||||||
|
"color_code": "#FF0000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MATHS",
|
||||||
|
"color_code": "#0a98f0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ANGLAIS",
|
||||||
|
"color_code": "#f708d7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FRANCAIS",
|
||||||
|
"color_code": "#04f108"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "HISTOIRE",
|
||||||
|
"color_code": "#ffb005"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "SPORT",
|
||||||
|
"color_code": "#bbb9b9"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for speciality_data in specialities_data:
|
||||||
|
Speciality.objects.update_or_create(
|
||||||
|
name=speciality_data["name"],
|
||||||
|
defaults=speciality_data
|
||||||
|
)
|
||||||
|
self.stdout.write(self.style.SUCCESS('Specialities initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_teachers(self):
|
||||||
|
teachers_data = [
|
||||||
|
{
|
||||||
|
"last_name": "DUMBLEDORE",
|
||||||
|
"first_name": "Albus",
|
||||||
|
"email": "albus.dumbledore@gmail.com",
|
||||||
|
"specialities": ["GROUPE"],
|
||||||
|
"droit": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"last_name": "ROGUE",
|
||||||
|
"first_name": "Severus",
|
||||||
|
"email": "severus.rogue@gmail.com",
|
||||||
|
"specialities": ["ANGLAIS"],
|
||||||
|
"droit": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"last_name": "MC GONAGALL",
|
||||||
|
"first_name": "Minerva",
|
||||||
|
"email": "minerva.mcgonagall@gmail.com",
|
||||||
|
"specialities": ["MATHS", "HISTOIRE"],
|
||||||
|
"droit": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"last_name": "CHOURAVE",
|
||||||
|
"first_name": "Pomona",
|
||||||
|
"email": "pomona.chourave@gmail.com",
|
||||||
|
"specialities": ["MATHS", "FRANCAIS", "SPORT"],
|
||||||
|
"droit": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for teacher_data in teachers_data:
|
||||||
|
specialities = teacher_data.pop("specialities")
|
||||||
|
email = teacher_data["email"]
|
||||||
|
droit = teacher_data.pop("droit")
|
||||||
|
|
||||||
|
# Create or update the user profile
|
||||||
|
user, created = Profile.objects.update_or_create(
|
||||||
|
email=email,
|
||||||
|
defaults={
|
||||||
|
"username": email,
|
||||||
|
"email": email,
|
||||||
|
"is_active": True,
|
||||||
|
"password": "Provisoire01!",
|
||||||
|
"droit": droit
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if created:
|
||||||
|
user.set_password("Provisoire01!")
|
||||||
|
user.save()
|
||||||
|
|
||||||
|
# Create or update the teacher
|
||||||
|
teacher, created = Teacher.objects.update_or_create(
|
||||||
|
email=email,
|
||||||
|
defaults={**teacher_data, "associated_profile_id": user.id}
|
||||||
|
)
|
||||||
|
teacher.specialities.set(Speciality.objects.filter(name__in=specialities))
|
||||||
|
teacher.save()
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('Teachers initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_school_classes(self):
|
||||||
|
establishment = Establishment.objects.get(name="N3WT")
|
||||||
|
school_classes_data = [
|
||||||
|
{
|
||||||
|
"atmosphere_name": "Classe A",
|
||||||
|
"age_range": "3-6",
|
||||||
|
"number_of_students": 14,
|
||||||
|
"teaching_language": "",
|
||||||
|
"school_year": "2024-2025",
|
||||||
|
"levels": [2, 3, 4],
|
||||||
|
"type": 1,
|
||||||
|
"time_range": ["08:30", "17:30"],
|
||||||
|
"opening_days": [1, 2, 4, 5],
|
||||||
|
"teachers": [2], # ID of Severus Rogue
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"atmosphere_name": "Classe B",
|
||||||
|
"age_range": "2-3",
|
||||||
|
"number_of_students": 5,
|
||||||
|
"teaching_language": "",
|
||||||
|
"school_year": "2024-2025",
|
||||||
|
"levels": [1],
|
||||||
|
"type": 1,
|
||||||
|
"time_range": ["08:30", "17:30"],
|
||||||
|
"opening_days": [1, 2, 4, 5],
|
||||||
|
"teachers": [3], # ID of Minerva McGonagall
|
||||||
|
"establishment": establishment
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"atmosphere_name": "Classe C",
|
||||||
|
"age_range": "6-12",
|
||||||
|
"number_of_students": 21,
|
||||||
|
"teaching_language": "",
|
||||||
|
"school_year": "2024-2025",
|
||||||
|
"levels": [5, 6, 7, 8, 9],
|
||||||
|
"type": 1,
|
||||||
|
"time_range": ["08:30", "17:30"],
|
||||||
|
"opening_days": [1, 2, 4, 5],
|
||||||
|
"teachers": [4], # ID of Pomona Chourave
|
||||||
|
"establishment": establishment
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for class_data in school_classes_data:
|
||||||
|
teachers_ids = class_data.pop("teachers")
|
||||||
|
school_class, created = SchoolClass.objects.update_or_create(
|
||||||
|
atmosphere_name=class_data["atmosphere_name"],
|
||||||
|
school_year=class_data["school_year"],
|
||||||
|
defaults=class_data
|
||||||
|
)
|
||||||
|
school_class.teachers.set(teachers_ids)
|
||||||
|
school_class.save()
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('SchoolClasses initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_registration_file_group(self):
|
||||||
|
group_data = {
|
||||||
|
"name": "LMDE",
|
||||||
|
"description": "Fichiers d'inscription de l'école LMDE"
|
||||||
|
}
|
||||||
|
|
||||||
|
self.registration_file_group, created = RegistrationFileGroup.objects.get_or_create(name=group_data["name"], defaults=group_data)
|
||||||
|
self.stdout.write(self.style.SUCCESS('RegistrationFileGroup initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_or_update_registration_file_template(self):
|
||||||
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
references_dir = os.path.join(script_dir, 'References', 'LMDE')
|
||||||
|
|
||||||
|
templates_data = [
|
||||||
|
{
|
||||||
|
"name": "RIB LA MAISON DES ENFANTS",
|
||||||
|
"file": "RIB LA MAISON DES ENFANTS.pdf",
|
||||||
|
"order": 0,
|
||||||
|
"is_required": False,
|
||||||
|
"group": self.registration_file_group
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Contrat d'engagement 2024 2025",
|
||||||
|
"file": "Contrat d'engagement 2024 2025.pdf",
|
||||||
|
"order": 0,
|
||||||
|
"is_required": True,
|
||||||
|
"group": self.registration_file_group
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bulletin d'adhésion familiale scolaire",
|
||||||
|
"file": "Bulletin d'adhésion familiale scolaire.pdf",
|
||||||
|
"order": 0,
|
||||||
|
"is_required": True,
|
||||||
|
"group": self.registration_file_group
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fiche sanitaire de liaison",
|
||||||
|
"file": "Fiche sanitaire de liaison.pdf",
|
||||||
|
"order": 0,
|
||||||
|
"is_required": True,
|
||||||
|
"group": self.registration_file_group
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for template_data in templates_data:
|
||||||
|
file_path = os.path.join(references_dir, template_data["file"])
|
||||||
|
references_dir_realpath = os.path.realpath(references_dir)
|
||||||
|
file_path_realpath = os.path.realpath(file_path)
|
||||||
|
if not file_path_realpath.startswith(references_dir_realpath):
|
||||||
|
raise SuspiciousFileOperation(f"Detected path traversal attempt in '{file_path_realpath}'")
|
||||||
|
if not os.path.exists(file_path_realpath):
|
||||||
|
raise FileNotFoundError(f"File not found: {file_path_realpath}")
|
||||||
|
with open(file_path_realpath, 'rb') as file:
|
||||||
|
RegistrationFileTemplate.objects.update_or_create(
|
||||||
|
name=template_data["name"],
|
||||||
|
defaults={
|
||||||
|
"file": File(file, name=template_data["file"]),
|
||||||
|
"order": template_data["order"],
|
||||||
|
"is_required": template_data["is_required"],
|
||||||
|
"group": template_data["group"]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('RegistrationFileTemplates initialized or updated successfully'))
|
||||||
|
|
||||||
|
def create_register_form(self):
|
||||||
|
# Créer ou mettre à jour le profil associé au guardian
|
||||||
|
profile_data = {
|
||||||
|
"email": "anthony.casini.30@gmail.com",
|
||||||
|
"droit": 2,
|
||||||
|
"username": "anthony.casini.30@gmail.com",
|
||||||
|
"is_active": True,
|
||||||
|
"password": "Provisoire01!"
|
||||||
|
}
|
||||||
|
|
||||||
|
user, created = Profile.objects.update_or_create(
|
||||||
|
email=profile_data["email"],
|
||||||
|
defaults={
|
||||||
|
"username": profile_data["username"],
|
||||||
|
"email": profile_data["email"],
|
||||||
|
"is_active": profile_data["is_active"],
|
||||||
|
"droit": profile_data["droit"]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if created:
|
||||||
|
user.set_password(profile_data["password"])
|
||||||
|
user.save()
|
||||||
|
|
||||||
|
# Créer les données du guardian
|
||||||
|
guardian_data = {
|
||||||
|
"associated_profile_id": user.id,
|
||||||
|
"email": "anthony.casini.30@gmail.com",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Créer les données de l'étudiant
|
||||||
|
student_data = {
|
||||||
|
"last_name": "CASINI",
|
||||||
|
"first_name": "Giulia",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Créer ou mettre à jour l'étudiant et le guardian
|
||||||
|
student, created = Student.objects.get_or_create(
|
||||||
|
last_name=student_data["last_name"],
|
||||||
|
first_name=student_data["first_name"],
|
||||||
|
defaults=student_data
|
||||||
|
)
|
||||||
|
guardian, created = Guardian.objects.get_or_create(
|
||||||
|
last_name=guardian_data["email"],
|
||||||
|
defaults=guardian_data
|
||||||
|
)
|
||||||
|
student.guardians.add(guardian)
|
||||||
|
|
||||||
|
# Récupérer les frais et les réductions
|
||||||
|
fees = Fee.objects.filter(id__in=[1, 2, 3, 4])
|
||||||
|
discounts = Discount.objects.filter(id__in=[1])
|
||||||
|
|
||||||
|
# Créer les données du formulaire d'inscription
|
||||||
|
register_form_data = {
|
||||||
|
"student": student,
|
||||||
|
"fileGroup": self.registration_file_group,
|
||||||
|
"establishment": Establishment.objects.get(id=1),
|
||||||
|
"status": 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Créer ou mettre à jour le formulaire d'inscription
|
||||||
|
register_form, created = RegistrationForm.objects.get_or_create(student=student, defaults=register_form_data)
|
||||||
|
register_form.fees.set(fees)
|
||||||
|
register_form.discounts.set(discounts)
|
||||||
|
if not created:
|
||||||
|
register_form.fileGroup = self.registration_file_group
|
||||||
|
register_form.save()
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('RegistrationForm initialized or updated successfully'))
|
||||||
@ -1,27 +0,0 @@
|
|||||||
from django.core.management.base import BaseCommand
|
|
||||||
from School.models import PaymentMode, PaymentModeType, FeeType, Establishment
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = 'Initialize or update Payment Modes'
|
|
||||||
|
|
||||||
def handle(self, *args, **kwargs):
|
|
||||||
self.create_or_update_payment_modes()
|
|
||||||
|
|
||||||
def create_or_update_payment_modes(self):
|
|
||||||
establishment = Establishment.objects.get(name="N3WT")
|
|
||||||
for fee_type in FeeType.choices:
|
|
||||||
fee_type_value = fee_type[0]
|
|
||||||
|
|
||||||
for mode in PaymentModeType.choices:
|
|
||||||
mode_value = mode[0]
|
|
||||||
|
|
||||||
PaymentMode.objects.update_or_create(
|
|
||||||
mode=mode_value,
|
|
||||||
type=fee_type_value,
|
|
||||||
defaults={
|
|
||||||
'is_active': False,
|
|
||||||
'establishment': establishment
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
self.stdout.write(self.style.SUCCESS('Payment Modes initialized or updated successfully'))
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
from django.core.management.base import BaseCommand
|
|
||||||
from django.utils import timezone
|
|
||||||
from dateutil.relativedelta import relativedelta
|
|
||||||
from School.models import PaymentPlan, PaymentPlanType, FeeType, Establishment
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = 'Initialize or update Payment Plans'
|
|
||||||
|
|
||||||
def handle(self, *args, **kwargs):
|
|
||||||
self.create_or_update_payment_plans()
|
|
||||||
|
|
||||||
def create_or_update_payment_plans(self):
|
|
||||||
current_date = timezone.now().date()
|
|
||||||
establishment = Establishment.objects.get(name="N3WT")
|
|
||||||
|
|
||||||
for fee_type in FeeType.choices:
|
|
||||||
fee_type_value = fee_type[0]
|
|
||||||
|
|
||||||
# 1 fois - échéance à 1 mois à partir de la date actuelle
|
|
||||||
PaymentPlan.objects.update_or_create(
|
|
||||||
frequency=PaymentPlanType.ONE_TIME,
|
|
||||||
type=fee_type_value,
|
|
||||||
defaults={
|
|
||||||
'due_dates': [current_date + relativedelta(months=1)],
|
|
||||||
'is_active': True,
|
|
||||||
'establishment': establishment
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
# 3 fois - échéances espacées de 4 mois
|
|
||||||
PaymentPlan.objects.update_or_create(
|
|
||||||
frequency=PaymentPlanType.THREE_TIMES,
|
|
||||||
type=fee_type_value,
|
|
||||||
defaults={
|
|
||||||
'due_dates': [current_date + relativedelta(months=1+4*i) for i in range(3)],
|
|
||||||
'is_active': False,
|
|
||||||
'establishment': establishment
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
# 10 fois - échéances espacées d'un mois
|
|
||||||
PaymentPlan.objects.update_or_create(
|
|
||||||
frequency=PaymentPlanType.TEN_TIMES,
|
|
||||||
type=fee_type_value,
|
|
||||||
defaults={
|
|
||||||
'due_dates': [current_date + relativedelta(months=1+i) for i in range(10)],
|
|
||||||
'is_active': False,
|
|
||||||
'establishment': establishment
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
# 12 fois - échéances espacées d'un mois
|
|
||||||
PaymentPlan.objects.update_or_create(
|
|
||||||
frequency=PaymentPlanType.TWELVE_TIMES,
|
|
||||||
type=fee_type_value,
|
|
||||||
defaults={
|
|
||||||
'due_dates': [current_date + relativedelta(months=1+i) for i in range(12)],
|
|
||||||
'is_active': False,
|
|
||||||
'establishment': establishment
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
self.stdout.write(self.style.SUCCESS('Payment Plans initialized or updated successfully'))
|
|
||||||
@ -1,164 +0,0 @@
|
|||||||
from django.core.management.base import BaseCommand
|
|
||||||
from Auth.models import Profile
|
|
||||||
from School.models import Speciality, Teacher, SchoolClass, Establishment
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = 'Initialize or update Fees and Discounts'
|
|
||||||
|
|
||||||
def handle(self, *args, **kwargs):
|
|
||||||
self.create_or_update_specialities()
|
|
||||||
self.create_or_update_teachers()
|
|
||||||
self.create_or_update_schoolClasses()
|
|
||||||
|
|
||||||
def create_or_update_specialities(self):
|
|
||||||
specialities_data = [
|
|
||||||
{
|
|
||||||
"name": "GROUPE",
|
|
||||||
"color_code": "#FF0000"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MATHS",
|
|
||||||
"color_code": "#0a98f0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ANGLAIS",
|
|
||||||
"color_code": "#f708d7"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "FRANCAIS",
|
|
||||||
"color_code": "#04f108"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "HISTOIRE",
|
|
||||||
"color_code": "#ffb005"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "SPORT",
|
|
||||||
"color_code": "#bbb9b9"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
for speciality_data in specialities_data:
|
|
||||||
Speciality.objects.update_or_create(
|
|
||||||
name=speciality_data["name"],
|
|
||||||
defaults=speciality_data
|
|
||||||
)
|
|
||||||
self.stdout.write(self.style.SUCCESS('Specialities initialized or updated successfully'))
|
|
||||||
|
|
||||||
def create_or_update_teachers(self):
|
|
||||||
teachers_data = [
|
|
||||||
{
|
|
||||||
"last_name": "DUMBLEDORE",
|
|
||||||
"first_name": "Albus",
|
|
||||||
"email": "albus.dumbledore@gmail.com",
|
|
||||||
"specialities": ["GROUPE"],
|
|
||||||
"droit": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last_name": "ROGUE",
|
|
||||||
"first_name": "Severus",
|
|
||||||
"email": "severus.rogue@gmail.com",
|
|
||||||
"specialities": ["ANGLAIS"],
|
|
||||||
"droit": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last_name": "MC GONAGALL",
|
|
||||||
"first_name": "Minerva",
|
|
||||||
"email": "minerva.mcgonagall@gmail.com",
|
|
||||||
"specialities": ["MATHS", "HISTOIRE"],
|
|
||||||
"droit": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last_name": "CHOURAVE",
|
|
||||||
"first_name": "Pomona",
|
|
||||||
"email": "pomona.chourave@gmail.com",
|
|
||||||
"specialities": ["MATHS", "FRANCAIS", "SPORT"],
|
|
||||||
"droit": 0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
for teacher_data in teachers_data:
|
|
||||||
specialities = teacher_data.pop("specialities")
|
|
||||||
email = teacher_data["email"]
|
|
||||||
droit = teacher_data.pop("droit")
|
|
||||||
|
|
||||||
# Create or update the user profile
|
|
||||||
user, created = Profile.objects.update_or_create(
|
|
||||||
email=email,
|
|
||||||
defaults={
|
|
||||||
"username": email,
|
|
||||||
"email": email,
|
|
||||||
"is_active": True,
|
|
||||||
"password": "Provisoire01!",
|
|
||||||
"droit": droit
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if created:
|
|
||||||
user.set_password("Provisoire01!")
|
|
||||||
user.save()
|
|
||||||
|
|
||||||
# Create or update the teacher
|
|
||||||
teacher, created = Teacher.objects.update_or_create(
|
|
||||||
email=email,
|
|
||||||
defaults={**teacher_data, "associated_profile_id": user.id}
|
|
||||||
)
|
|
||||||
teacher.specialities.set(Speciality.objects.filter(name__in=specialities))
|
|
||||||
teacher.save()
|
|
||||||
|
|
||||||
self.stdout.write(self.style.SUCCESS('Teachers initialized or updated successfully'))
|
|
||||||
|
|
||||||
def create_or_update_schoolClasses(self):
|
|
||||||
establishment = Establishment.objects.get(name="N3WT")
|
|
||||||
school_classes_data = [
|
|
||||||
{
|
|
||||||
"atmosphere_name": "Classe A",
|
|
||||||
"age_range": "3-6",
|
|
||||||
"number_of_students": 14,
|
|
||||||
"teaching_language": "",
|
|
||||||
"school_year": "2024-2025",
|
|
||||||
"levels": [2, 3, 4],
|
|
||||||
"type": 1,
|
|
||||||
"time_range": ["08:30", "17:30"],
|
|
||||||
"opening_days": [1, 2, 4, 5],
|
|
||||||
"teachers": [2], # ID of Severus Rogue
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"atmosphere_name": "Classe B",
|
|
||||||
"age_range": "2-3",
|
|
||||||
"number_of_students": 5,
|
|
||||||
"teaching_language": "",
|
|
||||||
"school_year": "2024-2025",
|
|
||||||
"levels": [1],
|
|
||||||
"type": 1,
|
|
||||||
"time_range": ["08:30", "17:30"],
|
|
||||||
"opening_days": [1, 2, 4, 5],
|
|
||||||
"teachers": [3], # ID of Minerva McGonagall
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"atmosphere_name": "Classe C",
|
|
||||||
"age_range": "6-12",
|
|
||||||
"number_of_students": 21,
|
|
||||||
"teaching_language": "",
|
|
||||||
"school_year": "2024-2025",
|
|
||||||
"levels": [5, 6, 7, 8, 9],
|
|
||||||
"type": 1,
|
|
||||||
"time_range": ["08:30", "17:30"],
|
|
||||||
"opening_days": [1, 2, 4, 5],
|
|
||||||
"teachers": [4], # ID of Pomona Chourave
|
|
||||||
"establishment": establishment
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
for class_data in school_classes_data:
|
|
||||||
teachers_ids = class_data.pop("teachers")
|
|
||||||
school_class, created = SchoolClass.objects.update_or_create(
|
|
||||||
atmosphere_name=class_data["atmosphere_name"],
|
|
||||||
school_year=class_data["school_year"],
|
|
||||||
defaults=class_data
|
|
||||||
)
|
|
||||||
school_class.teachers.set(teachers_ids)
|
|
||||||
school_class.save()
|
|
||||||
|
|
||||||
self.stdout.write(self.style.SUCCESS('SchoolClasses initialized or updated successfully'))
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
from django.core.management.base import BaseCommand
|
|
||||||
from Auth.models import Profile
|
|
||||||
from School.models import Fee, Discount, FeeType, DiscountType, Establishment
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = 'Initialize or update Fees and Discounts'
|
|
||||||
|
|
||||||
def handle(self, *args, **kwargs):
|
|
||||||
self.create_or_update_fees()
|
|
||||||
self.create_or_update_discounts()
|
|
||||||
|
|
||||||
def create_or_update_fees(self):
|
|
||||||
establishment = Establishment.objects.get(name="N3WT")
|
|
||||||
fees_data = [
|
|
||||||
{
|
|
||||||
"name": "Frais d'inscription",
|
|
||||||
"base_amount": "150.00",
|
|
||||||
"description": "Montant de base",
|
|
||||||
"is_active": True,
|
|
||||||
"type": FeeType.REGISTRATION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Matériel",
|
|
||||||
"base_amount": "85.00",
|
|
||||||
"description": "Livres / jouets",
|
|
||||||
"is_active": True,
|
|
||||||
"type": FeeType.REGISTRATION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Sorties périscolaires",
|
|
||||||
"base_amount": "120.00",
|
|
||||||
"description": "Sorties",
|
|
||||||
"is_active": True,
|
|
||||||
"type": FeeType.REGISTRATION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Les colibris",
|
|
||||||
"base_amount": "4500.00",
|
|
||||||
"description": "TPS / PS / MS / GS",
|
|
||||||
"is_active": True,
|
|
||||||
"type": FeeType.TUITION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Les butterflies",
|
|
||||||
"base_amount": "5000.00",
|
|
||||||
"description": "CP / CE1 / CE2 / CM1 / CM2",
|
|
||||||
"is_active": True,
|
|
||||||
"type": FeeType.TUITION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
for fee_data in fees_data:
|
|
||||||
Fee.objects.update_or_create(
|
|
||||||
name=fee_data["name"],
|
|
||||||
type=fee_data["type"],
|
|
||||||
defaults=fee_data
|
|
||||||
)
|
|
||||||
|
|
||||||
self.stdout.write(self.style.SUCCESS('Fees initialized or updated successfully'))
|
|
||||||
|
|
||||||
def create_or_update_discounts(self):
|
|
||||||
establishment = Establishment.objects.get(name="N3WT")
|
|
||||||
discounts_data = [
|
|
||||||
{
|
|
||||||
"name": "Parrainage",
|
|
||||||
"amount": "10.00",
|
|
||||||
"description": "Réduction pour parrainage",
|
|
||||||
"discount_type": DiscountType.PERCENT,
|
|
||||||
"type": FeeType.TUITION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Réinscription",
|
|
||||||
"amount": "100.00",
|
|
||||||
"description": "Réduction pour Réinscription",
|
|
||||||
"discount_type": DiscountType.PERCENT,
|
|
||||||
"type": FeeType.REGISTRATION_FEE,
|
|
||||||
"establishment": establishment
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
for discount_data in discounts_data:
|
|
||||||
Discount.objects.update_or_create(
|
|
||||||
name=discount_data["name"],
|
|
||||||
type=discount_data["type"],
|
|
||||||
discount_type=discount_data["discount_type"],
|
|
||||||
defaults=discount_data
|
|
||||||
)
|
|
||||||
|
|
||||||
self.stdout.write(self.style.SUCCESS('Discounts initialized or updated successfully'))
|
|
||||||
|
|
||||||
@ -186,8 +186,6 @@ class RegistrationFormSerializer(serializers.ModelSerializer):
|
|||||||
return local_time.strftime("%d-%m-%Y %H:%M")
|
return local_time.strftime("%d-%m-%Y %H:%M")
|
||||||
|
|
||||||
def get_totalRegistrationFees(self, obj):
|
def get_totalRegistrationFees(self, obj):
|
||||||
for fee in obj.fees.filter(type=FeeType.REGISTRATION_FEE):
|
|
||||||
print(fee.base_amount)
|
|
||||||
return sum(fee.base_amount for fee in obj.fees.filter(type=FeeType.REGISTRATION_FEE))
|
return sum(fee.base_amount for fee in obj.fees.filter(type=FeeType.REGISTRATION_FEE))
|
||||||
|
|
||||||
def get_totalTuitionFees(self, obj):
|
def get_totalTuitionFees(self, obj):
|
||||||
|
|||||||
@ -24,11 +24,7 @@ commands = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
test_commands = [
|
test_commands = [
|
||||||
["python", "manage.py", "init_establishment"],
|
["python", "manage.py", "init_mock_datas"]
|
||||||
["python", "manage.py", "init_school_configuration"],
|
|
||||||
["python", "manage.py", "init_school_fees"],
|
|
||||||
["python", "manage.py", "init_payment_plans"],
|
|
||||||
["python", "manage.py", "init_payment_modes"]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
for command in commands:
|
for command in commands:
|
||||||
|
|||||||
Reference in New Issue
Block a user