diff --git a/Back-End/Auth/migrations/0001_initial.py b/Back-End/Auth/migrations/0001_initial.py new file mode 100644 index 0000000..f4492ff --- /dev/null +++ b/Back-End/Auth/migrations/0001_initial.py @@ -0,0 +1,75 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.contrib.auth.models +import django.contrib.auth.validators +import django.core.validators +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('Establishment', '0001_initial'), + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='ProfileRole', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('role_type', models.IntegerField(choices=[(-1, 'NON DEFINI'), (0, 'ECOLE'), (1, 'ADMIN'), (2, 'PARENT')], default=-1)), + ('is_active', models.BooleanField(default=False)), + ('updated_date', models.DateTimeField(auto_now=True)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='profile_roles', to='Establishment.establishment')), + ], + ), + migrations.CreateModel( + name='Directeur', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_name', models.CharField(max_length=100)), + ('first_name', models.CharField(max_length=100)), + ('profile_role', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='directeur_profile', to='Auth.profilerole')), + ], + ), + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('email', models.EmailField(default='', max_length=255, unique=True, validators=[django.core.validators.EmailValidator()])), + ('roleIndexLoginDefault', models.IntegerField(default=0)), + ('code', models.CharField(blank=True, default='', max_length=200)), + ('datePeremption', models.CharField(blank=True, default='', max_length=200)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.AddField( + model_name='profilerole', + name='profile', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roles', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/Back-End/Auth/migrations/__init__.py b/Back-End/Auth/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/Common/migrations/0001_initial.py b/Back-End/Common/migrations/0001_initial.py new file mode 100644 index 0000000..5725c9e --- /dev/null +++ b/Back-End/Common/migrations/0001_initial.py @@ -0,0 +1,63 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Cycle', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('number', models.IntegerField(unique=True)), + ('label', models.CharField(max_length=50)), + ], + ), + migrations.CreateModel( + name='Domain', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('cycle', models.IntegerField(choices=[(1, 'Cycle 1'), (2, 'Cycle 2'), (3, 'Cycle 3'), (4, 'Cycle 4')])), + ], + ), + migrations.CreateModel( + name='PaymentModeType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=50, unique=True)), + ('label', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='PaymentPlanType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=50, unique=True)), + ('label', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='categories', to='Common.domain')), + ], + ), + migrations.CreateModel( + name='Level', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('cycle', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='levels', to='Common.cycle')), + ], + ), + ] diff --git a/Back-End/Common/migrations/__init__.py b/Back-End/Common/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/Establishment/migrations/0001_initial.py b/Back-End/Establishment/migrations/0001_initial.py new file mode 100644 index 0000000..4ec0546 --- /dev/null +++ b/Back-End/Establishment/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Establishment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('address', models.CharField(max_length=255)), + ('total_capacity', models.IntegerField()), + ('establishment_type', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(choices=[(1, 'Maternelle'), (2, 'Primaire'), (3, 'Secondaire')]), size=None)), + ('evaluation_frequency', models.IntegerField(choices=[(1, 'Trimestre'), (2, 'Semestre'), (3, 'Année')], default=1)), + ('licence_code', models.CharField(blank=True, max_length=100)), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/Back-End/Establishment/migrations/0002_establishment_api_docuseal.py b/Back-End/Establishment/migrations/0002_establishment_api_docuseal.py new file mode 100644 index 0000000..568376b --- /dev/null +++ b/Back-End/Establishment/migrations/0002_establishment_api_docuseal.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.3 on 2025-05-30 07:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Establishment', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='establishment', + name='api_docuseal', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/Back-End/Establishment/migrations/0003_establishment_logo.py b/Back-End/Establishment/migrations/0003_establishment_logo.py new file mode 100644 index 0000000..1d89e51 --- /dev/null +++ b/Back-End/Establishment/migrations/0003_establishment_logo.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.3 on 2025-05-31 09:56 + +import Establishment.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Establishment', '0002_establishment_api_docuseal'), + ] + + operations = [ + migrations.AddField( + model_name='establishment', + name='logo', + field=models.FileField(blank=True, null=True, upload_to=Establishment.models.registration_logo_upload_to), + ), + ] diff --git a/Back-End/Establishment/migrations/__init__.py b/Back-End/Establishment/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/GestionMessagerie/migrations/0001_initial.py b/Back-End/GestionMessagerie/migrations/0001_initial.py new file mode 100644 index 0000000..914c079 --- /dev/null +++ b/Back-End/GestionMessagerie/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Messagerie', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('objet', models.CharField(blank=True, default='', max_length=200)), + ('corpus', models.CharField(blank=True, default='', max_length=200)), + ('date_envoi', models.DateTimeField(auto_now_add=True)), + ('is_read', models.BooleanField(default=False)), + ('conversation_id', models.CharField(blank=True, default='', max_length=100)), + ('destinataire', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='messages_recus', to=settings.AUTH_USER_MODEL)), + ('emetteur', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='messages_envoyes', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/Back-End/GestionMessagerie/migrations/0002_conversation_message_userpresence_and_more.py b/Back-End/GestionMessagerie/migrations/0002_conversation_message_userpresence_and_more.py new file mode 100644 index 0000000..abe623e --- /dev/null +++ b/Back-End/GestionMessagerie/migrations/0002_conversation_message_userpresence_and_more.py @@ -0,0 +1,87 @@ +# Generated by Django 5.1.3 on 2025-05-30 07:40 + +import django.db.models.deletion +import django.utils.timezone +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('GestionMessagerie', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Conversation', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('conversation_type', models.CharField(choices=[('private', 'Privée'), ('group', 'Groupe')], default='private', max_length=10)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('last_activity', models.DateTimeField(default=django.utils.timezone.now)), + ('is_active', models.BooleanField(default=True)), + ], + ), + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('content', models.TextField()), + ('message_type', models.CharField(choices=[('text', 'Texte'), ('file', 'Fichier'), ('image', 'Image'), ('system', 'Système')], default='text', max_length=10)), + ('file_url', models.URLField(blank=True, null=True)), + ('file_name', models.CharField(blank=True, max_length=255, null=True)), + ('file_size', models.BigIntegerField(blank=True, null=True)), + ('file_type', models.CharField(blank=True, max_length=100, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('is_edited', models.BooleanField(default=False)), + ('is_deleted', models.BooleanField(default=False)), + ('conversation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='GestionMessagerie.conversation')), + ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_messages', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['created_at'], + }, + ), + migrations.CreateModel( + name='UserPresence', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.CharField(choices=[('online', 'En ligne'), ('away', 'Absent'), ('busy', 'Occupé'), ('offline', 'Hors ligne')], default='offline', max_length=10)), + ('last_seen', models.DateTimeField(default=django.utils.timezone.now)), + ('is_typing_in', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='typing_users', to='GestionMessagerie.conversation')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='presence', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='ConversationParticipant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('joined_at', models.DateTimeField(auto_now_add=True)), + ('last_read_at', models.DateTimeField(default=django.utils.timezone.now)), + ('is_active', models.BooleanField(default=True)), + ('conversation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participants', to='GestionMessagerie.conversation')), + ('participant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='conversation_participants', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('conversation', 'participant')}, + }, + ), + migrations.CreateModel( + name='MessageRead', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('read_at', models.DateTimeField(auto_now_add=True)), + ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='read_by', to='GestionMessagerie.message')), + ('participant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='read_messages', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('message', 'participant')}, + }, + ), + ] diff --git a/Back-End/GestionMessagerie/migrations/__init__.py b/Back-End/GestionMessagerie/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/GestionNotification/migrations/0001_initial.py b/Back-End/GestionNotification/migrations/0001_initial.py new file mode 100644 index 0000000..3517e45 --- /dev/null +++ b/Back-End/GestionNotification/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Notification', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=255)), + ('is_read', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('typeNotification', models.IntegerField(choices=[(0, 'Aucune notification'), (1, 'Un message a été reçu'), (2, "Le dossier d'inscription a été mis à jour")], default=0)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/Back-End/GestionNotification/migrations/__init__.py b/Back-End/GestionNotification/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/Planning/migrations/0001_initial.py b/Back-End/Planning/migrations/0001_initial.py new file mode 100644 index 0000000..e6472c6 --- /dev/null +++ b/Back-End/Planning/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('Establishment', '0001_initial'), + ('School', '__first__'), + ] + + operations = [ + migrations.CreateModel( + name='Planning', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('description', models.TextField(blank=True, default='', null=True)), + ('color', models.CharField(default='#000000', max_length=255)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Establishment.establishment')), + ('school_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='planning', to='School.schoolclass')), + ], + ), + migrations.CreateModel( + name='Events', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('description', models.TextField(blank=True, default='', null=True)), + ('start', models.DateTimeField()), + ('end', models.DateTimeField()), + ('recursionType', models.IntegerField(choices=[(0, 'Aucune'), (1, 'Quotidienne'), (2, 'Hebdomadaire'), (3, 'Mensuel'), (4, 'Personnalisé')], default=0)), + ('recursionEnd', models.DateTimeField(blank=True, default=None, null=True)), + ('color', models.CharField(max_length=255)), + ('location', models.CharField(blank=True, default='', max_length=255, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('planning', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Planning.planning')), + ], + ), + ] diff --git a/Back-End/Planning/migrations/__init__.py b/Back-End/Planning/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/School/migrations/0001_initial.py b/Back-End/School/migrations/0001_initial.py new file mode 100644 index 0000000..4289620 --- /dev/null +++ b/Back-End/School/migrations/0001_initial.py @@ -0,0 +1,145 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.contrib.postgres.fields +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('Auth', '0001_initial'), + ('Common', '0001_initial'), + ('Establishment', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Competency', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ('end_of_cycle', models.BooleanField(blank=True, default=False, null=True)), + ('level', models.CharField(blank=True, max_length=50, null=True)), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='competencies', to='Common.category')), + ], + ), + migrations.CreateModel( + name='Discount', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('amount', models.DecimalField(decimal_places=2, default=0, max_digits=10)), + ('description', models.TextField(blank=True)), + ('discount_type', models.IntegerField(choices=[(0, 'Currency'), (1, 'Percent')], default=0)), + ('type', models.IntegerField(choices=[(0, 'Registration Fee'), (1, 'Tuition Fee')], default=0)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='discounts', to='Establishment.establishment')), + ], + ), + migrations.CreateModel( + name='EstablishmentCompetency', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('custom_name', models.TextField(blank=True, help_text='Nom de la compétence custom', null=True)), + ('is_required', models.BooleanField(default=True)), + ('competency', models.ForeignKey(blank=True, help_text='Compétence de référence (optionnelle si custom)', null=True, on_delete=django.db.models.deletion.CASCADE, to='School.competency')), + ('custom_category', models.ForeignKey(blank=True, help_text='Catégorie de la compétence custom', null=True, on_delete=django.db.models.deletion.CASCADE, to='Common.category')), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Establishment.establishment')), + ], + options={ + 'unique_together': {('establishment', 'competency', 'custom_name', 'custom_category')}, + }, + ), + migrations.AddField( + model_name='competency', + name='establishments', + field=models.ManyToManyField(blank=True, related_name='competencies', through='School.EstablishmentCompetency', to='Establishment.establishment'), + ), + migrations.CreateModel( + name='Fee', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('base_amount', models.DecimalField(decimal_places=2, default=0, max_digits=10)), + ('description', models.TextField(blank=True)), + ('is_active', models.BooleanField(default=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('type', models.IntegerField(choices=[(0, 'Registration Fee'), (1, 'Tuition Fee')], default=0)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='fees', to='Establishment.establishment')), + ], + ), + migrations.CreateModel( + name='PaymentMode', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.IntegerField(choices=[(0, 'Registration Fee'), (1, 'Tuition Fee')], default=0)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payment_modes', to='Establishment.establishment')), + ('mode', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='payment_modes', to='Common.paymentmodetype')), + ], + ), + migrations.CreateModel( + name='PaymentPlan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('due_dates', django.contrib.postgres.fields.ArrayField(base_field=models.DateField(), blank=True, null=True, size=None)), + ('type', models.IntegerField(choices=[(0, 'Registration Fee'), (1, 'Tuition Fee')], default=0)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payment_plans', to='Establishment.establishment')), + ('plan_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='payment_plans', to='Common.paymentplantype')), + ], + ), + migrations.CreateModel( + name='SchoolClass', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('atmosphere_name', models.CharField(blank=True, max_length=255, null=True)), + ('age_range', models.JSONField(blank=True, null=True)), + ('number_of_students', models.PositiveIntegerField(blank=True, null=True)), + ('teaching_language', models.CharField(blank=True, max_length=255)), + ('school_year', models.CharField(blank=True, max_length=9)), + ('updated_date', models.DateTimeField(auto_now=True)), + ('type', models.IntegerField(choices=[(1, 'Annuel'), (2, 'Semestriel'), (3, 'Trimestriel')], default=1)), + ('time_range', models.JSONField(default=list)), + ('opening_days', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), default=list, size=None)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='school_classes', to='Establishment.establishment')), + ('levels', models.ManyToManyField(blank=True, related_name='school_classes', to='Common.level')), + ], + ), + migrations.CreateModel( + name='Planning', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(blank=True, choices=[(1, 'Très Petite Section (TPS)'), (2, 'Petite Section (PS)'), (3, 'Moyenne Section (MS)'), (4, 'Grande Section (GS)'), (5, 'Cours Préparatoire (CP)'), (6, 'Cours Élémentaire 1 (CE1)'), (7, 'Cours Élémentaire 2 (CE2)'), (8, 'Cours Moyen 1 (CM1)'), (9, 'Cours Moyen 2 (CM2)')], null=True)), + ('schedule', models.JSONField(default=dict)), + ('school_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='plannings', to='School.schoolclass')), + ], + ), + migrations.CreateModel( + name='Speciality', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('updated_date', models.DateTimeField(auto_now=True)), + ('color_code', models.CharField(default='#FFFFFF', max_length=7)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='specialities', to='Establishment.establishment')), + ], + ), + migrations.CreateModel( + name='Teacher', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_name', models.CharField(max_length=100)), + ('first_name', models.CharField(max_length=100)), + ('updated_date', models.DateTimeField(auto_now=True)), + ('profile_role', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='teacher_profile', to='Auth.profilerole')), + ('specialities', models.ManyToManyField(blank=True, to='School.speciality')), + ], + ), + migrations.AddField( + model_name='schoolclass', + name='teachers', + field=models.ManyToManyField(blank=True, to='School.teacher'), + ), + ] diff --git a/Back-End/School/migrations/__init__.py b/Back-End/School/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/Settings/migrations/0001_initial.py b/Back-End/Settings/migrations/0001_initial.py new file mode 100644 index 0000000..c05340d --- /dev/null +++ b/Back-End/Settings/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('Establishment', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='SMTPSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('smtp_server', models.CharField(max_length=255)), + ('smtp_port', models.PositiveIntegerField()), + ('smtp_user', models.CharField(max_length=255)), + ('smtp_password', models.CharField(max_length=255)), + ('use_tls', models.BooleanField(default=True)), + ('use_ssl', models.BooleanField(default=False)), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Establishment.establishment')), + ], + ), + ] diff --git a/Back-End/Settings/migrations/__init__.py b/Back-End/Settings/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/Subscriptions/migrations/0001_initial.py b/Back-End/Subscriptions/migrations/0001_initial.py new file mode 100644 index 0000000..afd9c5c --- /dev/null +++ b/Back-End/Subscriptions/migrations/0001_initial.py @@ -0,0 +1,213 @@ +# Generated by Django 5.1.3 on 2025-05-28 11:14 + +import Subscriptions.models +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('Auth', '__first__'), + ('Common', '0001_initial'), + ('Establishment', '0001_initial'), + ('School', '__first__'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Language', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('label', models.CharField(default='', max_length=200)), + ], + ), + migrations.CreateModel( + name='Student', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('photo', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_photo_upload_to)), + ('last_name', models.CharField(default='', max_length=200)), + ('first_name', models.CharField(default='', max_length=200)), + ('gender', models.IntegerField(blank=True, choices=[(0, 'Sélection du genre'), (1, 'Garçon'), (2, 'Fille')], default=0)), + ('nationality', models.CharField(blank=True, default='', max_length=200)), + ('address', models.CharField(blank=True, default='', max_length=200)), + ('birth_date', models.DateField(blank=True, null=True)), + ('birth_place', models.CharField(blank=True, default='', max_length=200)), + ('birth_postal_code', models.IntegerField(blank=True, default=0)), + ('attending_physician', models.CharField(blank=True, default='', max_length=200)), + ('associated_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='students', to='School.schoolclass')), + ], + ), + migrations.CreateModel( + name='RegistrationSchoolFileTemplate', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('slug', models.CharField(default='', max_length=255)), + ('name', models.CharField(default='', max_length=255)), + ('file', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_school_file_upload_to)), + ], + ), + migrations.CreateModel( + name='Sibling', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_name', models.CharField(blank=True, max_length=200, null=True)), + ('first_name', models.CharField(blank=True, max_length=200, null=True)), + ('birth_date', models.DateField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Guardian', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_name', models.CharField(blank=True, max_length=200, null=True)), + ('first_name', models.CharField(blank=True, max_length=200, null=True)), + ('birth_date', models.DateField(blank=True, null=True)), + ('address', models.CharField(blank=True, default='', max_length=200)), + ('phone', models.CharField(blank=True, default='', max_length=200)), + ('profession', models.CharField(blank=True, default='', max_length=200)), + ('profile_role', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guardian_profile', to='Auth.profilerole')), + ], + ), + migrations.CreateModel( + name='RegistrationFileGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=255)), + ('description', models.TextField(blank=True, null=True)), + ('establishment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='file_group', to='Establishment.establishment')), + ], + ), + migrations.CreateModel( + name='RegistrationForm', + fields=[ + ('student', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='Subscriptions.student')), + ('status', models.IntegerField(choices=[(0, "Pas de dossier d'inscription"), (1, "Dossier d'inscription initialisé"), (2, "Dossier d'inscription envoyé"), (3, "Dossier d'inscription en cours de validation"), (4, "Dossier d'inscription à relancer"), (5, "Dossier d'inscription validé"), (6, "Dossier d'inscription archivé"), (7, 'Mandat SEPA envoyé'), (8, 'Mandat SEPA à envoyer')], default=0)), + ('last_update', models.DateTimeField(auto_now=True)), + ('school_year', models.CharField(blank=True, default='', max_length=9)), + ('notes', models.CharField(blank=True, max_length=200)), + ('registration_link_code', models.CharField(blank=True, default='', max_length=200)), + ('registration_file', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_file_path)), + ('sepa_file', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_file_path)), + ('fusion_file', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_file_path)), + ('associated_rf', models.CharField(blank=True, default='', max_length=200)), + ('discounts', models.ManyToManyField(blank=True, related_name='register_forms', to='School.discount')), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='register_forms', to='Establishment.establishment')), + ('fees', models.ManyToManyField(blank=True, related_name='register_forms', to='School.fee')), + ('fileGroup', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='register_forms', to='Subscriptions.registrationfilegroup')), + ('registration_payment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registration_payment_modes_forms', to='School.paymentmode')), + ('registration_payment_plan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registration_payment_plans_forms', to='School.paymentplan')), + ('tuition_payment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tuition_payment_modes_forms', to='School.paymentmode')), + ('tuition_payment_plan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tuition_payment_plans_forms', to='School.paymentplan')), + ], + ), + migrations.AddField( + model_name='student', + name='guardians', + field=models.ManyToManyField(blank=True, to='Subscriptions.guardian'), + ), + migrations.AddField( + model_name='student', + name='level', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='students', to='Common.level'), + ), + migrations.AddField( + model_name='student', + name='profiles', + field=models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='student', + name='spoken_languages', + field=models.ManyToManyField(blank=True, to='Subscriptions.language'), + ), + migrations.CreateModel( + name='BilanCompetence', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_bilan_form_upload_to)), + ('period', models.CharField(help_text='Période ex: T1-2024_2025, S1-2024_2025, A-2024_2025', max_length=20)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bilans', to='Subscriptions.student')), + ], + ), + migrations.CreateModel( + name='AbsenceManagement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('day', models.DateField(blank=True, null=True)), + ('moment', models.IntegerField(choices=[(1, 'Morning'), (2, 'Afternoon'), (3, 'Total')], default=3)), + ('reason', models.IntegerField(choices=[(1, 'Justified Absence'), (2, 'Unjustified Absence'), (3, 'Justified Late'), (4, 'Unjustified Late')], default=2)), + ('commentaire', models.TextField(blank=True, null=True)), + ('establishment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='absences', to='Establishment.establishment')), + ('student', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='absences', to='Subscriptions.student')), + ], + ), + migrations.CreateModel( + name='RegistrationParentFileMaster', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=255)), + ('description', models.CharField(blank=True, null=True)), + ('is_required', models.BooleanField(default=False)), + ('groups', models.ManyToManyField(blank=True, related_name='parent_file_masters', to='Subscriptions.registrationfilegroup')), + ], + ), + migrations.CreateModel( + name='RegistrationSchoolFileMaster', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('name', models.CharField(default='', max_length=255)), + ('is_required', models.BooleanField(default=False)), + ('groups', models.ManyToManyField(blank=True, related_name='school_file_masters', to='Subscriptions.registrationfilegroup')), + ], + ), + migrations.AddField( + model_name='student', + name='registration_files', + field=models.ManyToManyField(blank=True, related_name='students', to='Subscriptions.registrationschoolfiletemplate'), + ), + migrations.AddField( + model_name='registrationschoolfiletemplate', + name='master', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='school_file_templates', to='Subscriptions.registrationschoolfilemaster'), + ), + migrations.AddField( + model_name='student', + name='siblings', + field=models.ManyToManyField(blank=True, to='Subscriptions.sibling'), + ), + migrations.AddField( + model_name='registrationschoolfiletemplate', + name='registration_form', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='school_file_templates', to='Subscriptions.registrationform'), + ), + migrations.CreateModel( + name='RegistrationParentFileTemplate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(blank=True, null=True, upload_to=Subscriptions.models.registration_parent_file_upload_to)), + ('master', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_file_templates', to='Subscriptions.registrationparentfilemaster')), + ('registration_form', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_file_templates', to='Subscriptions.registrationform')), + ], + ), + migrations.CreateModel( + name='StudentCompetency', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('score', models.IntegerField(blank=True, null=True)), + ('comment', models.TextField(blank=True, null=True)), + ('period', models.CharField(blank=True, default='', help_text="Période d'évaluation ex: T1-2024_2025, S1-2024_2025, A-2024_2025", max_length=20)), + ('establishment_competency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_scores', to='School.establishmentcompetency')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='competency_scores', to='Subscriptions.student')), + ], + options={ + 'unique_together': {('student', 'establishment_competency', 'period')}, + }, + ), + ] diff --git a/Back-End/Subscriptions/migrations/0002_alter_registrationparentfilemaster_description.py b/Back-End/Subscriptions/migrations/0002_alter_registrationparentfilemaster_description.py new file mode 100644 index 0000000..82d5627 --- /dev/null +++ b/Back-End/Subscriptions/migrations/0002_alter_registrationparentfilemaster_description.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.3 on 2025-05-30 07:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Subscriptions', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='registrationparentfilemaster', + name='description', + field=models.CharField(blank=True, max_length=500, null=True), + ), + ] diff --git a/Back-End/Subscriptions/migrations/__init__.py b/Back-End/Subscriptions/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Back-End/start.py b/Back-End/start.py index 867a684..853e703 100644 --- a/Back-End/start.py +++ b/Back-End/start.py @@ -14,17 +14,17 @@ test_mode = os.getenv('TEST_MODE', 'False') == 'True' commands = [ ["python", "manage.py", "collectstatic", "--noinput"], - ["python", "manage.py", "flush", "--noinput"], - ["python", "manage.py", "makemigrations", "Common", "--noinput"], - ["python", "manage.py", "makemigrations", "Establishment", "--noinput"], - ["python", "manage.py", "makemigrations", "Settings", "--noinput"], - ["python", "manage.py", "makemigrations", "Subscriptions", "--noinput"], - ["python", "manage.py", "makemigrations", "Planning", "--noinput"], - ["python", "manage.py", "makemigrations", "GestionNotification", "--noinput"], - ["python", "manage.py", "makemigrations", "GestionEmail", "--noinput"], - ["python", "manage.py", "makemigrations", "GestionMessagerie", "--noinput"], - ["python", "manage.py", "makemigrations", "Auth", "--noinput"], - ["python", "manage.py", "makemigrations", "School", "--noinput"], + #["python", "manage.py", "flush", "--noinput"], + # ["python", "manage.py", "makemigrations", "Common", "--noinput"], + # ["python", "manage.py", "makemigrations", "Establishment", "--noinput"], + # ["python", "manage.py", "makemigrations", "Settings", "--noinput"], + # ["python", "manage.py", "makemigrations", "Subscriptions", "--noinput"], + # ["python", "manage.py", "makemigrations", "Planning", "--noinput"], + # ["python", "manage.py", "makemigrations", "GestionNotification", "--noinput"], + # ["python", "manage.py", "makemigrations", "GestionEmail", "--noinput"], + # ["python", "manage.py", "makemigrations", "GestionMessagerie", "--noinput"], + # ["python", "manage.py", "makemigrations", "Auth", "--noinput"], + # ["python", "manage.py", "makemigrations", "School", "--noinput"], ["python", "manage.py", "migrate", "--noinput"] ]