mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
feat: Peuplement de la BDD avec les JSON d'entrée [#16]
This commit is contained in:
@ -3,3 +3,6 @@ from django.apps import AppConfig
|
|||||||
class SchoolConfig(AppConfig):
|
class SchoolConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
name = 'School'
|
name = 'School'
|
||||||
|
|
||||||
|
def ready(self):
|
||||||
|
import School.signals
|
||||||
@ -130,4 +130,68 @@ class PaymentMode(models.Model):
|
|||||||
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='payment_modes')
|
establishment = models.ForeignKey(Establishment, on_delete=models.CASCADE, related_name='payment_modes')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.get_mode_display()} - {self.get_type_display()}"
|
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}"
|
||||||
49
Back-End/School/signals.py
Normal file
49
Back-End/School/signals.py
Normal file
@ -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}")
|
||||||
Reference in New Issue
Block a user