from django.core.management.base import BaseCommand from django.contrib.auth.models import User from Subscriptions.models import ( RegistrationForm, Student, Guardian, Fee, Discount, RegistrationFileGroup, RegistrationTemplateMaster, RegistrationTemplate ) 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 from faker import Faker 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_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_1 = { "name": "LMDE", "description": "Fichiers d'inscription de l'école LMDE" } self.registration_file_group_1, created = RegistrationFileGroup.objects.get_or_create(name=group_data_1["name"], defaults=group_data_1) self.stdout.write(self.style.SUCCESS('RegistrationFileGroup 1 initialized or updated successfully')) group_data_2 = { "name": "LMDE 2", "description": "Fichiers d'inscription de l'école LMDE 2" } self.registration_file_group_2, created = RegistrationFileGroup.objects.get_or_create(name=group_data_2["name"], defaults=group_data_2) self.stdout.write(self.style.SUCCESS('RegistrationFileGroup 2 initialized or updated successfully')) def create_register_form(self): fake = Faker('fr_FR') # Utiliser le locale français pour Faker for _ in range(50): # Générer des données fictives pour le profil profile_data = { "email": fake.email(), "droit": 2, "username": fake.user_name(), "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() # Générer des données fictives pour le guardian guardian_data = { "associated_profile_id": user.id, "email": profile_data["email"], } # Générer des données fictives pour l'étudiant student_data = { "last_name": fake.last_name(), "first_name": fake.first_name(), "address": fake.address(), "birth_date": fake.date_of_birth(), "birth_place": fake.city(), "birth_postal_code": fake.postcode(), "nationality": fake.country(), "attending_physician": fake.name(), "level": fake.random_int(min=1, max=6) } # 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_1, "establishment": Establishment.objects.get(id=1), "status": fake.random_int(min=1, max=3) } # 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_1 register_form.save() self.stdout.write(self.style.SUCCESS('50 RegistrationForms initialized or updated successfully'))