diff --git a/Back-End/School/apps.py b/Back-End/School/apps.py index fe33f19..560e5ba 100644 --- a/Back-End/School/apps.py +++ b/Back-End/School/apps.py @@ -3,3 +3,6 @@ from django.apps import AppConfig class SchoolConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'School' + + def ready(self): + import School.signals \ No newline at end of file diff --git a/Back-End/School/models.py b/Back-End/School/models.py index 9120112..059620e 100644 --- a/Back-End/School/models.py +++ b/Back-End/School/models.py @@ -130,4 +130,68 @@ class PaymentMode(models.Model): establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='payment_modes') def __str__(self): - return f"{self.get_mode_display()} - {self.get_type_display()}" \ No newline at end of file + return f"{self.get_mode_display()} - {self.get_type_display()}" + +class Domain(models.Model): + name = models.CharField(max_length=255) + cycle = models.IntegerField(choices=[(1, 'Cycle 1'), (2, 'Cycle 2'), (3, 'Cycle 3'), (4, 'Cycle 4')]) + + def __str__(self): + return f"{self.name} (Cycle {self.cycle})" + + +class Category(models.Model): + name = models.CharField(max_length=255) + domain = models.ForeignKey(Domain, on_delete=models.CASCADE, related_name='categories') + + def __str__(self): + return self.name + + +class Competency(models.Model): + name = models.TextField() + end_of_cycle = models.BooleanField(default=False, null=True, blank=True) + level = models.CharField(max_length=50, null=True, blank=True) + category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='competencies') + + establishments = models.ManyToManyField( + Establishment, + through='EstablishmentCompetency', + related_name='competencies', + blank=True + ) + + def __str__(self): + return self.name + +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) + competency = models.ForeignKey(Competency, on_delete=models.CASCADE) + is_selected = models.BooleanField(default=False) + + class Meta: + unique_together = ('establishment', 'competency') + + def __str__(self): + 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 Meta: + unique_together = ('student', 'competency') + + def __str__(self): + return f"{self.student} - {self.competency.name} - Score: {self.score}" \ No newline at end of file diff --git a/Back-End/School/signals.py b/Back-End/School/signals.py new file mode 100644 index 0000000..7f37ca5 --- /dev/null +++ b/Back-End/School/signals.py @@ -0,0 +1,49 @@ +import json +import os +from django.db.models.signals import post_migrate +from django.dispatch import receiver +from School.models import Domain, Category, Competency + +@receiver(post_migrate) +def load_json_data(sender, **kwargs): + if sender.name != "School": + return + + # Chemin absolu vers le répertoire Back-End + backend_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + # Chemins vers les fichiers JSON + json_files = [ + ("Cycle1.json", 1), + ("Cycle2.json", 2), + ("Cycle3.json", 3), + ("Cycle4.json", 4), + ] + + for file_name, cycle in json_files: + json_file_path = os.path.join(backend_dir, "competences", file_name) + + if not os.path.exists(json_file_path): + print(f"Fichier JSON introuvable : {json_file_path}") + continue + + with open(json_file_path, 'r', encoding='utf-8') as file: + data = json.load(file) + + for domain_data in data['domaines']: + # Vérifiez si le domaine existe déjà + domain, created = Domain.objects.get_or_create(name=domain_data['nom'], cycle=cycle) + + for category_data in domain_data['categories']: + # Vérifiez si la catégorie existe déjà + category, created = Category.objects.get_or_create(name=category_data['nom'], domain=domain) + + for competency_data in category_data['competences']: + # Vérifiez si la compétence existe déjà + Competency.objects.get_or_create( + name=competency_data['nom'], + end_of_cycle=competency_data.get('fin_cycle', False), + level=competency_data.get('niveau'), + category=category + ) + print(f"Données importées depuis : {json_file_path}") \ No newline at end of file