diff --git a/Back-End/Auth/serializers.py b/Back-End/Auth/serializers.py
index 7c11b85..98686d2 100644
--- a/Back-End/Auth/serializers.py
+++ b/Back-End/Auth/serializers.py
@@ -1,6 +1,8 @@
from rest_framework import serializers
from Auth.models import Profile, ProfileRole
from Establishment.models import Establishment
+from Subscriptions.models import Guardian, RegistrationForm
+from School.models import Teacher
class ProfileSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
@@ -14,7 +16,7 @@ class ProfileSerializer(serializers.ModelSerializer):
def get_roles(self, obj):
roles = ProfileRole.objects.filter(profile=obj)
- return [{'role_type': role.role_type, 'establishment': role.establishment.id, 'is_active': role.is_active} for role in roles]
+ return [{'role_type': role.role_type, 'establishment': role.establishment.id, 'establishment_name': role.establishment.name, 'is_active': role.is_active} for role in roles]
def create(self, validated_data):
user = Profile(
@@ -48,10 +50,12 @@ class ProfileSerializer(serializers.ModelSerializer):
class ProfileRoleSerializer(serializers.ModelSerializer):
profile = serializers.PrimaryKeyRelatedField(queryset=Profile.objects.all(), required=False)
profile_data = ProfileSerializer(write_only=True, required=False)
+ associated_profile_email = serializers.SerializerMethodField()
+ associated_person = serializers.SerializerMethodField()
class Meta:
model = ProfileRole
- fields = ['role_type', 'establishment', 'is_active', 'profile', 'profile_data']
+ fields = ['id', 'role_type', 'establishment', 'is_active', 'profile', 'profile_data', 'associated_profile_email', 'associated_person']
def create(self, validated_data):
profile_data = validated_data.pop('profile_data', None)
@@ -82,4 +86,40 @@ class ProfileRoleSerializer(serializers.ModelSerializer):
instance.establishment_id = validated_data.get('establishment', instance.establishment.id)
instance.is_active = validated_data.get('is_active', instance.is_active)
instance.save()
- return instance
\ No newline at end of file
+ return instance
+
+ def get_associated_profile_email(self, obj):
+ if obj.profile:
+ return obj.profile.email
+ return None
+
+ def get_associated_person(self, obj):
+ if obj.role_type == ProfileRole.RoleType.PROFIL_PARENT:
+ guardian = Guardian.objects.filter(profile_role=obj).first()
+ if guardian:
+ students = guardian.student_set.all()
+ students_list = []
+ for student in students:
+ registration_form = RegistrationForm.objects.filter(student=student).first()
+ registration_status = registration_form.status if registration_form else None
+ students_list.append({
+ "student_name": f"{student.last_name} {student.first_name}",
+ "registration_status": registration_status
+ })
+ return {
+ "guardian_name": f"{guardian.last_name} {guardian.first_name}",
+ "students": students_list
+ }
+ else:
+ teacher = Teacher.objects.filter(profile_role=obj).first()
+ if teacher:
+ classes = teacher.schoolclass_set.all()
+ classes_list = [{"id": classe.id, "name": classe.atmosphere_name} for classe in classes]
+ specialities = teacher.specialities.all()
+ specialities_list = [{"name": speciality.name, "color_code": speciality.color_code} for speciality in specialities]
+ return {
+ "teacher_name": f"{teacher.last_name} {teacher.first_name}",
+ "classes": classes_list,
+ "specialities": specialities_list
+ }
+ return None
\ No newline at end of file
diff --git a/Back-End/Auth/views.py b/Back-End/Auth/views.py
index 0f4d669..079f765 100644
--- a/Back-End/Auth/views.py
+++ b/Back-End/Auth/views.py
@@ -200,7 +200,7 @@ class LoginView(APIView):
primary_role = ProfileRole.objects.filter(profile=user, role_type=role_type, is_active=True).first()
if not primary_role:
- return JsonResponse({"errorMessage": "Role not assigned to the user"}, status=status.HTTP_401_UNAUTHORIZED)
+ return JsonResponse({"errorMessage": "Profil inactif"}, status=status.HTTP_401_UNAUTHORIZED)
login(request, user)
user.save()
@@ -305,10 +305,10 @@ class RefreshJWTView(APIView):
role_type = payload.get('role_type')
# Récupérer le rôle principal de l'utilisateur
- primary_role = ProfileRole.objects.filter(profile=user, role_type=role_type).first()
+ primary_role = ProfileRole.objects.filter(profile=user, role_type=role_type, is_active=True).first()
if not primary_role:
- return JsonResponse({'errorMessage': 'No role assigned to the user'}, status=400)
+ return JsonResponse({'errorMessage': 'Profil inactif'}, status=400)
# Générer un nouveau Access Token avec les informations complètes
new_access_payload = {
@@ -383,10 +383,7 @@ class SubscribeView(APIView):
retourErreur = error.returnMessage[error.BAD_URL]
retour = ''
newProfilConnection = JSONParser().parse(request)
- establishment_id = request.GET.get('establishment_id')
-
- if not establishment_id:
- return JsonResponse({'message': retour, 'errorMessage': 'establishment_id manquant', "errorFields": {}, "id": -1}, safe=False, status=status.HTTP_400_BAD_REQUEST)
+ establishment_id = newProfilConnection['establishment_id']
validatorSubscription = validator.ValidatorSubscription(data=newProfilConnection)
validationOk, errorFields = validatorSubscription.validate()
@@ -398,7 +395,7 @@ class SubscribeView(APIView):
retourErreur = error.returnMessage[error.PROFIL_NOT_EXISTS]
else:
# Vérifier si le profil a déjà un rôle actif pour l'établissement donné
- active_roles = ProfileRole.objects.filter(profile=profil, establishment_id=establishment_id, is_active=True)
+ active_roles = ProfileRole.objects.filter(profile=profil, establishment=establishment_id, is_active=True)
if active_roles.exists():
retourErreur = error.returnMessage[error.PROFIL_ACTIVE]
return JsonResponse({'message': retour, 'errorMessage': retourErreur, "errorFields": errorFields, "id": profil.id}, safe=False)
@@ -408,18 +405,23 @@ class SubscribeView(APIView):
profil.full_clean()
profil.save()
- # Utiliser le sérialiseur ProfileRoleSerializer pour créer ou mettre à jour le rôle
- role_data = {
- 'profile': profil.id,
- 'establishment_id': establishment_id,
- 'role_type': ProfileRole.RoleType.PROFIL_PARENT,
- 'is_active': True
- }
- role_serializer = ProfileRoleSerializer(data=role_data)
- if role_serializer.is_valid():
- role_serializer.save()
+ # Récupérer le ProfileRole existant pour l'établissement et le profil
+ profile_role = ProfileRole.objects.filter(profile=profil, establishment=establishment_id).first()
+ if profile_role:
+ profile_role.is_active = True
+ profile_role.save()
else:
- return JsonResponse(role_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
+ # Si aucun ProfileRole n'existe, en créer un nouveau
+ role_data = {
+ 'profile': profil.id,
+ 'establishment': establishment_id,
+ 'is_active': True
+ }
+ role_serializer = ProfileRoleSerializer(data=role_data)
+ if role_serializer.is_valid():
+ role_serializer.save()
+ else:
+ return JsonResponse(role_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
clear_cache()
retour = error.returnMessage[error.MESSAGE_ACTIVATION_PROFILE]
@@ -536,7 +538,13 @@ class ProfileRoleView(APIView):
responses={200: ProfileRoleSerializer(many=True)}
)
def get(self, request):
+ establishment_id = request.GET.get('establishment_id', None)
+ if establishment_id is None:
+ return JsonResponse({'error': 'establishment_id est requis'}, safe=False, status=status.HTTP_400_BAD_REQUEST)
+
profiles_roles_List = bdd.getAllObjects(_objectName=ProfileRole)
+ if profiles_roles_List:
+ profiles_roles_List = profiles_roles_List.filter(establishment=establishment_id).distinct()
profile_roles_serializer = ProfileRoleSerializer(profiles_roles_List, many=True)
return JsonResponse(profile_roles_serializer.data, safe=False)
diff --git a/Back-End/School/management/commands/init_mock_datas.py b/Back-End/School/management/commands/init_mock_datas.py
index 77c5a07..b570cc2 100644
--- a/Back-End/School/management/commands/init_mock_datas.py
+++ b/Back-End/School/management/commands/init_mock_datas.py
@@ -103,20 +103,26 @@ class Command(BaseCommand):
# Créer entre 1 et 3 ProfileRole pour chaque profil
num_roles = random.randint(1, 3)
+ created_roles = set()
for _ in range(num_roles):
establishment = random.choice(self.establishments)
role_type = random.choice([ProfileRole.RoleType.PROFIL_ECOLE, ProfileRole.RoleType.PROFIL_ADMIN, ProfileRole.RoleType.PROFIL_PARENT])
+ # Vérifier si le rôle existe déjà pour cet établissement
+ if (establishment.id, role_type) in created_roles:
+ continue
+
profile_role_data = {
"profile": profile.id,
"establishment": establishment.id,
"role_type": role_type,
- "is_active": True
+ "is_active": random.choice([True, False])
}
profile_role_serializer = ProfileRoleSerializer(data=profile_role_data)
if profile_role_serializer.is_valid():
profile_role_serializer.save()
+ created_roles.add((establishment.id, role_type))
self.stdout.write(self.style.SUCCESS(f'ProfileRole for {profile.email} created successfully with role type {role_type}'))
else:
self.stdout.write(self.style.ERROR(f'Error in data for profile role: {profile_role_serializer.errors}'))
@@ -129,7 +135,7 @@ class Command(BaseCommand):
for fee_data in fees_data:
establishment = random.choice(self.establishments)
print(f'establishment : {establishment}')
- fee_data["name"] = f"{fee_data['name']} - {establishment.name}"
+ fee_data["name"] = fee_data['name']
fee_data["establishment"] = establishment.id
fee_data["type"] = random.choice([FeeType.REGISTRATION_FEE, FeeType.TUITION_FEE])
@@ -145,7 +151,7 @@ class Command(BaseCommand):
for discount_data in discounts_data:
establishment = random.choice(self.establishments)
- discount_data["name"] = f"{discount_data['name']} - {establishment.name}"
+ discount_data["name"] = discount_data['name']
discount_data["establishment"] = establishment.id
discount_data["type"] = random.choice([FeeType.REGISTRATION_FEE, FeeType.TUITION_FEE])
discount_data["discount_type"] = random.choice([DiscountType.CURRENCY, DiscountType.PERCENT])
@@ -216,7 +222,7 @@ class Command(BaseCommand):
for speciality_data in specialities_data:
establishment = random.choice(self.establishments)
- speciality_data["name"] = f"{speciality_data['name']} - {establishment.name}"
+ speciality_data["name"] = speciality_data['name']
speciality_data["establishment"] = establishment.id
serializer = SpecialitySerializer(data=speciality_data)
@@ -260,7 +266,7 @@ class Command(BaseCommand):
# Générer des données fictives pour l'enseignant
teacher_data = {
"last_name": fake.last_name(),
- "first_name": f"{fake.first_name()} - {profile_role.establishment.name}",
+ "first_name": fake.first_name(),
"profile_role": profile_role.id
}
@@ -287,7 +293,7 @@ class Command(BaseCommand):
for index, class_data in enumerate(school_classes_data, start=1):
# Randomize establishment
establishment = random.choice(self.establishments)
- class_data["atmosphere_name"] = f"Classe {index} - {establishment.name}"
+ class_data["atmosphere_name"] = f"Classe {index}"
class_data["establishment"] = establishment.id
# Randomize levels
@@ -295,9 +301,12 @@ class Command(BaseCommand):
# Randomize teachers
establishment_teachers = list(Teacher.objects.filter(profile_role__establishment=establishment))
- num_teachers = min(random.randint(1, 10), len(establishment_teachers))
- selected_teachers = random.sample(establishment_teachers, num_teachers)
- teachers_ids = [teacher.id for teacher in selected_teachers]
+ if len(establishment_teachers) > 0:
+ num_teachers = min(2, len(establishment_teachers))
+ selected_teachers = random.sample(establishment_teachers, num_teachers)
+ teachers_ids = [teacher.id for teacher in selected_teachers]
+ else:
+ teachers_ids = []
# Use the serializer to create or update the school class
class_data["teachers"] = teachers_ids
@@ -315,7 +324,7 @@ class Command(BaseCommand):
for establishment in self.establishments:
for i in range(1, 4): # Créer 3 groupes de fichiers par établissement
- name = f"Fichiers d'inscription - {fake.word()} - {establishment.name}"
+ name = f"Fichiers d'inscription - {fake.word()}"
description = fake.sentence()
group_data = {
"name": name,
@@ -342,8 +351,6 @@ class Command(BaseCommand):
used_profiles = set()
for _ in range(50):
- establishment = random.choice(self.establishments)
-
# Récupérer un profil aléatoire qui n'a pas encore été utilisé
available_profiles = profiles_with_parent_role.exclude(id__in=used_profiles)
if not available_profiles.exists():
@@ -354,7 +361,8 @@ class Command(BaseCommand):
used_profiles.add(profile.id)
# Récupérer le ProfileRole Parent associé au profil
- profile_role = ProfileRole.objects.filter(profile=profile, role_type=ProfileRole.RoleType.PROFIL_PARENT).first()
+ profile_roles = ProfileRole.objects.filter(profile=profile, role_type=ProfileRole.RoleType.PROFIL_PARENT)
+ profile_role = random.choice(profile_roles)
# Générer des données fictives pour le guardian
guardian_data = {
@@ -370,7 +378,7 @@ class Command(BaseCommand):
# Générer des données fictives pour l'étudiant
student_data = {
"last_name": fake.last_name(),
- "first_name": f"{fake.first_name()} - {establishment.name}",
+ "first_name": fake.first_name(),
"address": fake.address(),
"birth_date": fake.date_of_birth(),
"birth_place": fake.city(),
@@ -398,14 +406,14 @@ class Command(BaseCommand):
# Créer les données du formulaire d'inscription
register_form_data = {
"fileGroup": RegistrationFileGroup.objects.get(id=fake.random_int(min=1, max=file_group_count)),
- "establishment": establishment,
+ "establishment": profile_role.establishment,
"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,
- establishment=establishment,
+ establishment=profile_role.establishment,
defaults=register_form_data
)
diff --git a/Back-End/School/serializers.py b/Back-End/School/serializers.py
index fb26e21..5e31270 100644
--- a/Back-End/School/serializers.py
+++ b/Back-End/School/serializers.py
@@ -49,7 +49,9 @@ class TeacherSerializer(serializers.ModelSerializer):
if profile_role_data:
establishment_id = profile_role_data.pop('establishment').id
+ profile_id = profile_role_data.pop('profile').id
profile_role_data['establishment'] = establishment_id
+ profile_role_data['profile'] = profile_id
# Créer l'instance de ProfileRole
profile_role_serializer = ProfileRoleSerializer(data=profile_role_data)
@@ -95,7 +97,9 @@ class TeacherSerializer(serializers.ModelSerializer):
def get_role_type(self, obj):
profile_role = obj.profile_role
- return {'role_type': profile_role.role_type, 'establishment': profile_role.establishment.name}
+ if profile_role:
+ return {'role_type': profile_role.role_type, 'establishment': profile_role.establishment.name}
+ return None
def get_specialities_details(self, obj):
return [{'id': speciality.id, 'name': speciality.name, 'color_code': speciality.color_code} for speciality in obj.specialities.all()]
diff --git a/Back-End/Subscriptions/mailManager.py b/Back-End/Subscriptions/mailManager.py
index b783d0c..26342e3 100644
--- a/Back-End/Subscriptions/mailManager.py
+++ b/Back-End/Subscriptions/mailManager.py
@@ -23,7 +23,7 @@ def envoieReinitMotDePasse(recipients, code):
return errorMessage
-def sendRegisterForm(recipients):
+def sendRegisterForm(recipients, establishment_id):
errorMessage = ''
try:
print(f'{settings.EMAIL_HOST_USER}')
@@ -31,7 +31,8 @@ def sendRegisterForm(recipients):
EMAIL_INSCRIPTION_SUBJECT = '[N3WT-SCHOOL] Dossier Inscription'
context = {
'BASE_URL': settings.BASE_URL,
- 'email': recipients
+ 'email': recipients,
+ 'establishment': establishment_id
}
subject = EMAIL_INSCRIPTION_SUBJECT
diff --git a/Back-End/Subscriptions/templates/emails/inscription.html b/Back-End/Subscriptions/templates/emails/inscription.html
index e0daed5..fdd4cdd 100644
--- a/Back-End/Subscriptions/templates/emails/inscription.html
+++ b/Back-End/Subscriptions/templates/emails/inscription.html
@@ -38,7 +38,7 @@
Bonjour,
Nous vous confirmons la réception de votre demande d'inscription, vous trouverez ci-joint le lien vers la page d'authentification : {{BASE_URL}}/users/login
-
S'il s'agit de votre première connexion, veuillez procéder à l'activation de votre compte à cette url : {{BASE_URL}}/users/subscribe
+
S'il s'agit de votre première connexion, veuillez procéder à l'activation de votre compte à cette url : {{BASE_URL}}/users/subscribe
votre identifiant est : {{ email }}
Merci de compléter votre dossier d'inscription en suivant les instructions fournies.