1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2024-12-24 18:22:24 +00:00

Drop django-address dependency and keep only street, zip code and city (/!\ Breaking commit, can't upgrade)

This commit is contained in:
Emmy D'Anello 2023-01-10 20:24:06 +01:00
parent f7eddd289b
commit 63a10c1be5
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
21 changed files with 197 additions and 448 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 3.0.11 on 2021-01-21 21:06
# Generated by Django 3.2.13 on 2023-01-10 19:22
from django.conf import settings
from django.db import migrations, models
@ -26,7 +26,7 @@ class Migration(migrations.Migration):
('data', models.TextField(blank=True, default='', verbose_name='new data')),
('action', models.CharField(choices=[('create', 'create'), ('edit', 'edit'), ('delete', 'delete')], default='edit', max_length=16, verbose_name='action')),
('timestamp', models.DateTimeField(default=django.utils.timezone.now, verbose_name='timestamp')),
('model', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.ContentType', verbose_name='model')),
('model', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype', verbose_name='model')),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='user')),
],
options={

View File

@ -1,8 +1,9 @@
# Generated by Django 3.0.11 on 2021-01-22 18:26
# Generated by Django 3.2.13 on 2023-01-10 19:22
import datetime
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import participation.models
@ -47,8 +48,8 @@ class Migration(migrations.Migration):
name='Passage',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('place', models.CharField(default='Non indiqué', help_text='Where the solution is presented?', max_length=255, verbose_name='place')),
('solution_number', models.PositiveSmallIntegerField(choices=[(1, 'Problem #1'), (2, 'Problem #2'), (3, 'Problem #3'), (4, 'Problem #4'), (5, 'Problem #5'), (6, 'Problem #6'), (7, 'Problem #7'), (8, 'Problem #8')], verbose_name='defended solution')),
('defender_penalties', models.PositiveSmallIntegerField(default=0, help_text='Number of penalties for the defender. The defender will loose a 0.5 coefficient per penalty.', verbose_name='penalties')),
],
options={
'verbose_name': 'passage',
@ -61,6 +62,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('round', models.PositiveSmallIntegerField(choices=[(1, 'Round 1'), (2, 'Round 2')], verbose_name='round')),
('bbb_url', models.CharField(blank=True, default='', help_text='The link of the BBB visio for this pool.', max_length=255, verbose_name='BigBlueButton URL')),
('results_available', models.BooleanField(default=False, help_text='Check this case when results become accessible to teams. They stay accessible to you. Only averages are given.', verbose_name='results available')),
],
options={
'verbose_name': 'pool',
@ -73,11 +75,12 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('problem', models.PositiveSmallIntegerField(choices=[(1, 'Problem #1'), (2, 'Problem #2'), (3, 'Problem #3'), (4, 'Problem #4'), (5, 'Problem #5'), (6, 'Problem #6'), (7, 'Problem #7'), (8, 'Problem #8')], verbose_name='problem')),
('final_solution', models.BooleanField(default=False, verbose_name='solution for the final tournament')),
('file', models.FileField(blank=True, default='', unique=True, upload_to=participation.models.get_solution_filename, verbose_name='file')),
('file', models.FileField(unique=True, upload_to=participation.models.get_solution_filename, verbose_name='file')),
],
options={
'verbose_name': 'solution',
'verbose_name_plural': 'solutions',
'ordering': ('participation__team__trigram', 'final_solution', 'problem'),
},
),
migrations.CreateModel(
@ -85,11 +88,12 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('type', models.PositiveSmallIntegerField(choices=[(1, 'opponent'), (2, 'reporter')])),
('file', models.FileField(blank=True, default='', unique=True, upload_to=participation.models.get_synthesis_filename, verbose_name='file')),
('file', models.FileField(unique=True, upload_to=participation.models.get_synthesis_filename, verbose_name='file')),
],
options={
'verbose_name': 'synthesis',
'verbose_name_plural': 'syntheses',
'ordering': ('passage__pool__round', 'type'),
},
),
migrations.CreateModel(
@ -113,8 +117,10 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=255, unique=True, verbose_name='name')),
('date_start', models.DateField(default=datetime.date.today, verbose_name='start')),
('date_end', models.DateField(default=datetime.date.today, verbose_name='end')),
('place', models.CharField(max_length=255, verbose_name='place')),
('max_teams', models.PositiveSmallIntegerField(default=9, verbose_name='max team count')),
('price', models.PositiveSmallIntegerField(default=21, verbose_name='price')),
('remote', models.BooleanField(default=False, verbose_name='remote')),
('inscription_limit', models.DateTimeField(default=django.utils.timezone.now, verbose_name='limit date for registrations')),
('solution_limit', models.DateTimeField(default=django.utils.timezone.now, verbose_name='limit date to upload solutions')),
('solutions_draw', models.DateTimeField(default=django.utils.timezone.now, verbose_name='random draw for solutions')),
@ -129,4 +135,17 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'tournaments',
},
),
migrations.CreateModel(
name='Tweak',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('diff', models.IntegerField(help_text='Score to add/remove on the final score', verbose_name='difference')),
('participation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tweaks', to='participation.participation', verbose_name='participation')),
('pool', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='participation.pool', verbose_name='passage')),
],
options={
'verbose_name': 'tweak',
'verbose_name_plural': 'tweaks',
},
),
]

View File

@ -1,115 +0,0 @@
# Generated by Django 3.0.11 on 2021-01-22 18:26
import address.models
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('registration', '0001_initial'),
('address', '0003_auto_20200830_1851'),
('participation', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='tournament',
name='organizers',
field=models.ManyToManyField(related_name='organized_tournaments', to='registration.VolunteerRegistration', verbose_name='organizers'),
),
migrations.AddField(
model_name='tournament',
name='place',
field=address.models.AddressField(on_delete=django.db.models.deletion.CASCADE, to='address.Address', verbose_name='place'),
),
migrations.AddIndex(
model_name='team',
index=models.Index(fields=['trigram'], name='participati_trigram_239255_idx'),
),
migrations.AddField(
model_name='synthesis',
name='participation',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='participation.Participation', verbose_name='participation'),
),
migrations.AddField(
model_name='synthesis',
name='passage',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='syntheses', to='participation.Passage', verbose_name='passage'),
),
migrations.AddField(
model_name='solution',
name='participation',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='solutions', to='participation.Participation', verbose_name='participation'),
),
migrations.AddField(
model_name='pool',
name='juries',
field=models.ManyToManyField(related_name='jury_in', to='registration.VolunteerRegistration', verbose_name='juries'),
),
migrations.AddField(
model_name='pool',
name='participations',
field=models.ManyToManyField(related_name='pools', to='participation.Participation', verbose_name='participations'),
),
migrations.AddField(
model_name='pool',
name='tournament',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pools', to='participation.Tournament', verbose_name='tournament'),
),
migrations.AddField(
model_name='passage',
name='defender',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='participation.Participation', verbose_name='defender'),
),
migrations.AddField(
model_name='passage',
name='opponent',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='participation.Participation', verbose_name='opponent'),
),
migrations.AddField(
model_name='passage',
name='pool',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='passages', to='participation.Pool', verbose_name='pool'),
),
migrations.AddField(
model_name='passage',
name='reporter',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='participation.Participation', verbose_name='reporter'),
),
migrations.AddField(
model_name='participation',
name='team',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='participation.Team', verbose_name='team'),
),
migrations.AddField(
model_name='participation',
name='tournament',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='participation.Tournament', verbose_name='tournament'),
),
migrations.AddField(
model_name='note',
name='jury',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='registration.VolunteerRegistration', verbose_name='jury'),
),
migrations.AddField(
model_name='note',
name='passage',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='participation.Passage', verbose_name='passage'),
),
migrations.AddIndex(
model_name='tournament',
index=models.Index(fields=['name', 'date_start', 'date_end'], name='participati_name_b43174_idx'),
),
migrations.AlterUniqueTogether(
name='synthesis',
unique_together={('participation', 'passage', 'type')},
),
migrations.AlterUniqueTogether(
name='solution',
unique_together={('participation', 'problem', 'final_solution')},
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.0.11 on 2021-01-23 18:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('participation', '0002_auto_20210122_1926'),
]
operations = [
migrations.AddField(
model_name='tournament',
name='remote',
field=models.BooleanField(default=False, verbose_name='remote'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.1.7 on 2021-04-03 19:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('participation', '0003_tournament_remote'),
]
operations = [
migrations.AddField(
model_name='passage',
name='defender_penalties',
field=models.PositiveSmallIntegerField(default=0, help_text='Number of penalties for the defender. The defender will loose a 0.5 coefficient per penalty.', verbose_name='penalties'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.1.7 on 2021-04-10 07:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('participation', '0004_passage_defender_penalties'),
]
operations = [
migrations.AddField(
model_name='pool',
name='results_available',
field=models.BooleanField(default=False, help_text='Check this case when results become accessible to teams. They stay accessible to you. Only averages are given.', verbose_name='results available'),
),
]

View File

@ -1,21 +0,0 @@
# Generated by Django 3.2.13 on 2022-04-26 11:46
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('participation', '0005_pool_results_available'),
]
operations = [
migrations.AlterModelOptions(
name='solution',
options={'ordering': ('participation__team__trigram', 'final_solution', 'problem'), 'verbose_name': 'solution', 'verbose_name_plural': 'solutions'},
),
migrations.AlterModelOptions(
name='synthesis',
options={'ordering': ('passage__pool__round', 'type'), 'verbose_name': 'synthesis', 'verbose_name_plural': 'syntheses'},
),
]

View File

@ -1,17 +0,0 @@
# Generated by Django 3.2.13 on 2022-04-26 19:42
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('participation', '0006_auto_20220426_1346'),
]
operations = [
migrations.RemoveField(
model_name='passage',
name='place',
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 3.2.13 on 2022-04-29 16:53
from django.db import migrations, models
import participation.models
class Migration(migrations.Migration):
dependencies = [
('participation', '0007_remove_passage_place'),
]
operations = [
migrations.AlterField(
model_name='solution',
name='file',
field=models.FileField(unique=True, upload_to=participation.models.get_solution_filename, verbose_name='file'),
),
migrations.AlterField(
model_name='synthesis',
name='file',
field=models.FileField(unique=True, upload_to=participation.models.get_synthesis_filename, verbose_name='file'),
),
]

View File

@ -1,27 +0,0 @@
# Generated by Django 3.2.13 on 2022-05-15 14:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('participation', '0008_auto_20220429_1853'),
]
operations = [
migrations.CreateModel(
name='Tweak',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('diff', models.IntegerField(help_text='Score to add/remove on the final score', verbose_name='difference')),
('participation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tweaks', to='participation.participation', verbose_name='participation')),
('pool', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='participation.pool', verbose_name='passage')),
],
options={
'verbose_name': 'tweak',
'verbose_name_plural': 'tweaks',
},
),
]

View File

@ -4,7 +4,6 @@
from datetime import date
import os
from address.models import AddressField
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
@ -143,7 +142,8 @@ class Tournament(models.Model):
default=date.today,
)
place = AddressField(
place = models.CharField(
max_length=255,
verbose_name=_("place"),
)

View File

@ -1,8 +1,8 @@
# Generated by Django 3.0.11 on 2021-01-22 18:26
# Generated by Django 3.2.13 on 2023-01-10 19:22
import address.models
import datetime
from django.conf import settings
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import phonenumber_field.modelfields
@ -14,10 +14,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'),
('address', '0003_auto_20200830_1851'),
('participation', '0001_initial'),
('contenttypes', '0002_remove_content_type_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@ -27,7 +26,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('give_contact_to_animath', models.BooleanField(default=False, verbose_name='Grant Animath to contact me in the future about other actions')),
('email_confirmed', models.BooleanField(default=False, verbose_name='email confirmed')),
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_registration.registration_set+', to='contenttypes.ContentType')),
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_registration.registration_set+', to='contenttypes.contenttype')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')),
],
options={
@ -38,13 +37,16 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='ParticipantRegistration',
fields=[
('registration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.Registration')),
('registration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.registration')),
('birth_date', models.DateField(default=datetime.date.today, verbose_name='birth date')),
('gender', models.CharField(choices=[('female', 'Female'), ('male', 'Male'), ('other', 'Other')], default='other', max_length=6, verbose_name='gender')),
('address', models.CharField(max_length=255, verbose_name='address')),
('zip_code', models.PositiveSmallIntegerField(validators=[django.core.validators.MinValueValidator(1000), django.core.validators.MaxValueValidator(99999)], verbose_name='zip code')),
('city', models.CharField(max_length=255, verbose_name='city')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, region=None, verbose_name='phone number')),
('health_issues', models.TextField(blank=True, help_text='You can indicate here your allergies or anything that is important to know for organizers', verbose_name='health issues')),
('photo_authorization', models.FileField(blank=True, default='', upload_to=registration.models.get_random_photo_filename, verbose_name='photo authorization')),
('address', address.models.AddressField(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='address.Address', verbose_name='address')),
('team', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='participants', to='participation.Team', verbose_name='team')),
('team', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='participants', to='participation.team', verbose_name='team')),
],
options={
'abstract': False,
@ -55,7 +57,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='VolunteerRegistration',
fields=[
('registration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.Registration')),
('registration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.registration')),
('professional_activity', models.TextField(verbose_name='professional activity')),
],
options={
@ -67,7 +69,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='AdminRegistration',
fields=[
('volunteerregistration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.VolunteerRegistration')),
('volunteerregistration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.volunteerregistration')),
('role', models.TextField(verbose_name='role of the administrator')),
],
options={
@ -79,7 +81,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='CoachRegistration',
fields=[
('participantregistration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.ParticipantRegistration')),
('participantregistration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.participantregistration')),
('professional_activity', models.TextField(verbose_name='professional activity')),
],
options={
@ -91,7 +93,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='StudentRegistration',
fields=[
('participantregistration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.ParticipantRegistration')),
('participantregistration_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='registration.participantregistration')),
('student_class', models.IntegerField(choices=[(12, '12th grade'), (11, '11th grade'), (10, '10th grade or lower')], verbose_name='student class')),
('school', models.CharField(max_length=255, verbose_name='school')),
('responsible_name', models.CharField(default='', max_length=255, verbose_name='responsible name')),
@ -110,11 +112,11 @@ class Migration(migrations.Migration):
name='Payment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('type', models.CharField(blank=True, choices=[('', 'No payment'), ('helloasso', 'Hello Asso'), ('scholarship', 'Scholarship'), ('bank_transfer', 'Bank transfer'), ('free', 'The tournament is free')], default='', max_length=16, verbose_name='type')),
('type', models.CharField(blank=True, choices=[('', 'No payment'), ('helloasso', 'Hello Asso'), ('scholarship', 'Scholarship'), ('bank_transfer', 'Bank transfer'), ('other', 'Other (please indicate)'), ('free', 'The tournament is free')], default='', max_length=16, verbose_name='type')),
('scholarship_file', models.FileField(blank=True, default='', help_text='only if you have a scholarship.', upload_to=registration.models.get_scholarship_filename, verbose_name='scholarship file')),
('additional_information', models.TextField(blank=True, default='', help_text='To help us to find your payment.', verbose_name='additional information')),
('valid', models.BooleanField(default=False, null=True, verbose_name='valid')),
('registration', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='payment', to='registration.ParticipantRegistration', verbose_name='registration')),
('registration', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='payment', to='registration.participantregistration', verbose_name='registration')),
],
options={
'verbose_name': 'payment',

View File

@ -1,18 +0,0 @@
# Generated by Django 3.0.11 on 2021-01-23 20:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('registration', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='participantregistration',
name='health_issues',
field=models.TextField(blank=True, help_text='You can indicate here your allergies or anything that is important to know for organizers', verbose_name='health issues'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.13 on 2022-04-26 11:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('registration', '0002_participantregistration_health_issues'),
]
operations = [
migrations.AlterField(
model_name='payment',
name='type',
field=models.CharField(blank=True, choices=[('', 'No payment'), ('helloasso', 'Hello Asso'), ('scholarship', 'Scholarship'), ('bank_transfer', 'Bank transfer'), ('other', 'Other (please indicate)'), ('free', 'The tournament is free')], default='', max_length=16, verbose_name='type'),
),
]

View File

@ -3,8 +3,8 @@
from datetime import date
from address.models import AddressField
from django.contrib.sites.models import Site
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.template import loader
from django.urls import reverse_lazy
@ -139,10 +139,19 @@ class ParticipantRegistration(Registration):
default="other",
)
address = AddressField(
address = models.CharField(
max_length=255,
verbose_name=_("address"),
null=True,
default=None,
)
zip_code = models.PositiveSmallIntegerField(
verbose_name=_("zip code"),
validators=[MinValueValidator(1000), MaxValueValidator(99999)],
)
city = models.CharField(
max_length=255,
verbose_name=_("city"),
)
phone_number = PhoneNumberField(

View File

@ -46,7 +46,7 @@
<dd class="col-sm-6">{{ user_object.registration.get_gender_display }}</dd>
<dt class="col-sm-6 text-right">{% trans "Address:" %}</dt>
<dd class="col-sm-6">{{ user_object.registration.address }}</dd>
<dd class="col-sm-6">{{ user_object.registration.address }}, {{ user_object.registration.zip_code|stringformat:'05d' }} {{ user_object.registration.city }}</dd>
<dt class="col-sm-6 text-right">{% trans "Phone number:" %}</dt>
<dd class="col-sm-6">{{ user_object.registration.phone_number }}</dd>

View File

@ -131,7 +131,9 @@ class TestRegistration(TestCase):
school="God",
birth_date="2000-01-01",
gender="other",
address="1 Rue de Rivoli, 75001 Paris, France",
address="1 Rue de Rivoli",
zip_code=75001,
city="Paris",
phone_number="0123456789",
responsible_name="Toto",
responsible_phone="0123456789",
@ -155,7 +157,9 @@ class TestRegistration(TestCase):
school="God",
birth_date="2000-01-01",
gender="other",
address="1 Rue de Rivoli, 75001 Paris, France",
address="1 Rue de Rivoli",
zip_code=75001,
city="Paris",
phone_number="0123456789",
responsible_name="Toto",
responsible_phone="0123456789",
@ -176,7 +180,9 @@ class TestRegistration(TestCase):
role="coach",
birth_date="1980-01-01",
gender="other",
address="1 Rue de Rivoli, 75001 Paris, France",
address="1 Rue de Rivoli",
zip_code=75001,
city="Paris",
phone_number="0123456789",
professional_activity="God",
give_contact_to_animath=True,
@ -255,10 +261,11 @@ class TestRegistration(TestCase):
for user, data in [(self.user, dict(role="Bot")),
(self.student, dict(student_class=11, school="Sky", birth_date="2001-01-01",
gender="female", address="1 Rue de Rivoli, 75001 Paris, France",
responsible_name="Toto", responsible_email="toto@example.com")),
gender="female", address="1 Rue de Rivoli", zip_code=75001,
city="Paris", responsible_name="Toto",
responsible_email="toto@example.com")),
(self.coach, dict(professional_activity="God", birth_date="2001-01-01",
gender="male", address="1 Rue de Rivoli, 75001 Paris, France"))]:
gender="male", address="1 Rue de Rivoli", zip_code=75001, city="Paris"))]:
response = self.client.get(reverse("registration:update_user", args=(user.pk,)))
self.assertEqual(response.status_code, 200)

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-15 16:40+0200\n"
"POT-Creation-Date: 2023-01-10 20:22+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -100,7 +100,7 @@ msgid "Changelog of type \"{action}\" for model {model} at {timestamp}"
msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
#: apps/participation/admin.py:19 apps/participation/models.py:314
#: apps/participation/tables.py:44 apps/registration/models.py:359
#: apps/participation/tables.py:44 apps/registration/models.py:368
msgid "valid"
msgstr "valide"
@ -108,7 +108,7 @@ msgstr "valide"
msgid "This name is already used."
msgstr "Ce nom est déjà utilisé."
#: apps/participation/forms.py:37 apps/participation/models.py:41
#: apps/participation/forms.py:37 apps/participation/models.py:40
msgid "The trigram must be composed of three uppercase letters."
msgstr "Le trigramme doit être composé de trois lettres majuscules."
@ -173,52 +173,53 @@ msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
#: apps/participation/forms.py:267
msgid "The defender, the opponent and the reporter must be different."
msgstr "Læ défenseur⋅se, l'opposant⋅e et læ rapporteur⋅e doivent être différent⋅es."
msgstr ""
"Læ défenseur⋅se, l'opposant⋅e et læ rapporteur⋅e doivent être différent⋅es."
#: apps/participation/forms.py:271
msgid "This defender did not work on this problem."
msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème."
#: apps/participation/models.py:34 apps/participation/models.py:132
#: apps/participation/models.py:33 apps/participation/models.py:131
#: apps/participation/tables.py:17 apps/participation/tables.py:34
msgid "name"
msgstr "nom"
#: apps/participation/models.py:40 apps/participation/tables.py:39
#: apps/participation/models.py:39 apps/participation/tables.py:39
msgid "trigram"
msgstr "trigramme"
#: apps/participation/models.py:48
#: apps/participation/models.py:47
msgid "access code"
msgstr "code d'accès"
#: apps/participation/models.py:49
#: apps/participation/models.py:48
msgid "The access code let other people to join the team."
msgstr "Le code d'accès permet aux autres participants de rejoindre l'équipe."
#: apps/participation/models.py:53
#: apps/participation/models.py:52
msgid "motivation letter"
msgstr "lettre de motivation"
#: apps/participation/models.py:119
#: apps/participation/models.py:118
#, python-brace-format
msgid "Team {name} ({trigram})"
msgstr "Équipe {name} ({trigram})"
#: apps/participation/models.py:122 apps/participation/models.py:299
#: apps/participation/models.py:121 apps/participation/models.py:299
#: apps/registration/models.py:123
msgid "team"
msgstr "équipe"
#: apps/participation/models.py:123 apps/participation/tables.py:85
#: apps/participation/models.py:122 apps/participation/tables.py:85
msgid "teams"
msgstr "équipes"
#: apps/participation/models.py:137
#: apps/participation/models.py:136
msgid "start"
msgstr "début"
#: apps/participation/models.py:142
#: apps/participation/models.py:141
msgid "end"
msgstr "fin"
@ -306,7 +307,7 @@ msgid "Participation of the team {name} ({trigram})"
msgstr "Participation de l'équipe {name} ({trigram})"
#: apps/participation/models.py:331 apps/participation/models.py:528
#: apps/participation/models.py:555 apps/participation/models.py:593
#: apps/participation/models.py:558 apps/participation/models.py:596
msgid "participation"
msgstr "participation"
@ -365,7 +366,7 @@ msgstr "poules"
msgid "defended solution"
msgstr "solution défendue"
#: apps/participation/models.py:411 apps/participation/models.py:562
#: apps/participation/models.py:411 apps/participation/models.py:565
#, python-brace-format
msgid "Problem #{problem}"
msgstr "Problème n°{problem}"
@ -374,11 +375,11 @@ msgstr "Problème n°{problem}"
msgid "defender"
msgstr "défenseur"
#: apps/participation/models.py:425 apps/participation/models.py:605
#: apps/participation/models.py:425 apps/participation/models.py:608
msgid "opponent"
msgstr "opposant"
#: apps/participation/models.py:432 apps/participation/models.py:606
#: apps/participation/models.py:432 apps/participation/models.py:609
msgid "reporter"
msgstr "rapporteur"
@ -391,8 +392,8 @@ msgid ""
"Number of penalties for the defender. The defender will loose a 0.5 "
"coefficient per penalty."
msgstr ""
"Nombre de pénalités pour læ défenseur⋅se. Læ défenseur⋅se perd un coefficient 0.5 "
"sur sa solution écrite par pénalité."
"Nombre de pénalités pour læ défenseur⋅se. Læ défenseur⋅se perd un "
"coefficient 0.5 sur sa solution écrite par pénalité."
#: apps/participation/models.py:499 apps/participation/models.py:502
#: apps/participation/models.py:505
@ -406,7 +407,7 @@ msgid "Passage of {defender} for problem {problem}"
msgstr "Passage de {defender} pour le problème {problem}"
#: apps/participation/models.py:514 apps/participation/models.py:522
#: apps/participation/models.py:600 apps/participation/models.py:642
#: apps/participation/models.py:603 apps/participation/models.py:645
msgid "passage"
msgstr "passage"
@ -422,96 +423,96 @@ msgstr "différence"
msgid "Score to add/remove on the final score"
msgstr "Score à ajouter/retrancher au score final"
#: apps/participation/models.py:538
#: apps/participation/models.py:541
msgid "tweak"
msgstr "harmonisation"
#: apps/participation/models.py:539
#: apps/participation/models.py:542
msgid "tweaks"
msgstr "harmonisations"
#: apps/participation/models.py:560
#: apps/participation/models.py:563
msgid "problem"
msgstr "numéro de problème"
#: apps/participation/models.py:567
#: apps/participation/models.py:570
msgid "solution for the final tournament"
msgstr "solution pour la finale"
#: apps/participation/models.py:572 apps/participation/models.py:611
#: apps/participation/models.py:575 apps/participation/models.py:614
msgid "file"
msgstr "fichier"
#: apps/participation/models.py:578
#: apps/participation/models.py:581
#, python-brace-format
msgid "Solution of team {team} for problem {problem}"
msgstr "Solution de l'équipe {team} pour le problème {problem}"
#: apps/participation/models.py:580
#: apps/participation/models.py:583
msgid "for final"
msgstr "pour la finale"
#: apps/participation/models.py:583
#: apps/participation/models.py:586
msgid "solution"
msgstr "solution"
#: apps/participation/models.py:584
#: apps/participation/models.py:587
msgid "solutions"
msgstr "solutions"
#: apps/participation/models.py:617
#: apps/participation/models.py:620
#, python-brace-format
msgid "Synthesis of {team} as {type} for problem {problem} of {defender}"
msgstr ""
"Note de synthèse de l'équipe {team} en tant que {type} pour le problème "
"{problem} de {defender}"
#: apps/participation/models.py:625
#: apps/participation/models.py:628
msgid "synthesis"
msgstr "note de synthèse"
#: apps/participation/models.py:626
#: apps/participation/models.py:629
msgid "syntheses"
msgstr "notes de synthèse"
#: apps/participation/models.py:635
#: apps/participation/models.py:638
msgid "jury"
msgstr "jury"
#: apps/participation/models.py:647
#: apps/participation/models.py:650
msgid "defender writing note"
msgstr "note d'écrit de læ défenseur⋅se"
#: apps/participation/models.py:653
#: apps/participation/models.py:656
msgid "defender oral note"
msgstr "note d'oral de læ défenseur⋅se"
#: apps/participation/models.py:659
#: apps/participation/models.py:662
msgid "opponent writing note"
msgstr "note d'écrit de l'opposant⋅e"
#: apps/participation/models.py:665
#: apps/participation/models.py:668
msgid "opponent oral note"
msgstr "note d'oral de l'opposant⋅e"
#: apps/participation/models.py:671
#: apps/participation/models.py:674
msgid "reporter writing note"
msgstr "note d'écrit de læ rapporteur⋅e"
#: apps/participation/models.py:677
#: apps/participation/models.py:680
msgid "reporter oral note"
msgstr "note d'oral de læ rapporteur⋅e"
#: apps/participation/models.py:695
#: apps/participation/models.py:698
#, python-brace-format
msgid "Notes of {jury} for {passage}"
msgstr "Notes de {jury} pour le {passage}"
#: apps/participation/models.py:702
#: apps/participation/models.py:705
msgid "note"
msgstr "note"
#: apps/participation/models.py:703
#: apps/participation/models.py:706
msgid "notes"
msgstr "notes"
@ -938,7 +939,7 @@ msgid "Invalidate"
msgstr "Invalider"
#: apps/participation/templates/participation/team_detail.html:171
#: apps/participation/views.py:329
#: apps/participation/views.py:328
msgid "Upload motivation letter"
msgstr "Envoyer la lettre de motivation"
@ -947,7 +948,7 @@ msgid "Update team"
msgstr "Modifier l'équipe"
#: apps/participation/templates/participation/team_detail.html:181
#: apps/participation/views.py:432
#: apps/participation/views.py:431
msgid "Leave team"
msgstr "Quitter l'équipe"
@ -1059,49 +1060,49 @@ msgstr "Retour aux détails de l'utilisateur⋅rice"
msgid "Templates:"
msgstr "Modèles :"
#: apps/participation/views.py:45 tfjm/templates/base.html:71
#: apps/participation/views.py:44 tfjm/templates/base.html:71
#: tfjm/templates/base.html:230
msgid "Create team"
msgstr "Créer une équipe"
#: apps/participation/views.py:54 apps/participation/views.py:99
#: apps/participation/views.py:53 apps/participation/views.py:98
msgid "You don't participate, so you can't create a team."
msgstr "Vous ne participez pas, vous ne pouvez pas créer d'équipe."
#: apps/participation/views.py:56 apps/participation/views.py:101
#: apps/participation/views.py:55 apps/participation/views.py:100
msgid "You are already in a team."
msgstr "Vous êtes déjà dans une équipe."
#: apps/participation/views.py:90 tfjm/templates/base.html:76
#: apps/participation/views.py:89 tfjm/templates/base.html:76
#: tfjm/templates/base.html:225
msgid "Join team"
msgstr "Rejoindre une équipe"
#: apps/participation/views.py:152 apps/participation/views.py:438
#: apps/participation/views.py:472
#: apps/participation/views.py:151 apps/participation/views.py:437
#: apps/participation/views.py:471
msgid "You are not in a team."
msgstr "Vous n'êtes pas dans une équipe."
#: apps/participation/views.py:153 apps/participation/views.py:473
#: apps/participation/views.py:152 apps/participation/views.py:472
msgid "You don't participate, so you don't have any team."
msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe."
#: apps/participation/views.py:179
#: apps/participation/views.py:178
#, python-brace-format
msgid "Detail of team {trigram}"
msgstr "Détails de l'équipe {trigram}"
#: apps/participation/views.py:215
#: apps/participation/views.py:214
msgid "You don't participate, so you can't request the validation of the team."
msgstr ""
"Vous ne participez pas, vous ne pouvez pas demander la validation de "
"l'équipe."
#: apps/participation/views.py:218
#: apps/participation/views.py:217
msgid "The validation of the team is already done or pending."
msgstr "La validation de l'équipe est déjà faite ou en cours."
#: apps/participation/views.py:221
#: apps/participation/views.py:220
msgid ""
"The team can't be validated: missing email address confirmations, "
"authorizations, people, motivation letter or the tournament is not set."
@ -1110,74 +1111,74 @@ msgstr ""
"d'adresse e-mail, soit une autorisation, soit des personnes, soit la lettre "
"de motivation, soit le tournoi n'a pas été choisi."
#: apps/participation/views.py:243
#: apps/participation/views.py:242
msgid "You are not an organizer of the tournament."
msgstr "Vous n'êtes pas un⋅e organisateur⋅rice du tournoi."
#: apps/participation/views.py:246
#: apps/participation/views.py:245
msgid "This team has no pending validation."
msgstr "L'équipe n'a pas de validation en attente."
#: apps/participation/views.py:276
#: apps/participation/views.py:275
msgid "You must specify if you validate the registration or not."
msgstr "Vous devez spécifier si vous validez l'inscription ou non."
#: apps/participation/views.py:309
#: apps/participation/views.py:308
#, python-brace-format
msgid "Update team {trigram}"
msgstr "Mise à jour de l'équipe {trigram}"
#: apps/participation/views.py:368 apps/participation/views.py:418
#: apps/participation/views.py:367 apps/participation/views.py:417
#, python-brace-format
msgid "Motivation letter of {team}.{ext}"
msgstr "Lettre de motivation de {team}.{ext}"
#: apps/participation/views.py:399
#: apps/participation/views.py:398
#, python-brace-format
msgid "Photo authorization of {participant}.{ext}"
msgstr "Autorisation de droit à l'image de {participant}.{ext}"
#: apps/participation/views.py:405
#: apps/participation/views.py:404
#, python-brace-format
msgid "Parental authorization of {participant}.{ext}"
msgstr "Autorisation parentale de {participant}.{ext}"
#: apps/participation/views.py:412
#: apps/participation/views.py:411
#, python-brace-format
msgid "Health sheet of {participant}.{ext}"
msgstr "Fiche sanitaire de {participant}.{ext}"
#: apps/participation/views.py:422
#: apps/participation/views.py:421
#, python-brace-format
msgid "Photo authorizations of team {trigram}.zip"
msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip"
#: apps/participation/views.py:440
#: apps/participation/views.py:439
msgid "The team is already validated or the validation is pending."
msgstr "La validation de l'équipe est déjà faite ou en cours."
#: apps/participation/views.py:487
#: apps/participation/views.py:486
msgid "The team is not validated yet."
msgstr "L'équipe n'est pas encore validée."
#: apps/participation/views.py:501
#: apps/participation/views.py:500
#, python-brace-format
msgid "Participation of team {trigram}"
msgstr "Participation de l'équipe {trigram}"
#: apps/participation/views.py:627
#: apps/participation/views.py:626
msgid "You can't upload a solution after the deadline."
msgstr "Vous ne pouvez pas envoyer de solution après la date limite."
#: apps/participation/views.py:730
#: apps/participation/views.py:729
msgid "The following user is not registered as a jury:"
msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :"
#: apps/participation/views.py:738
#: apps/participation/views.py:737
msgid "Notes were successfully uploaded."
msgstr "Les notes ont bien été envoyées."
#: apps/participation/views.py:850
#: apps/participation/views.py:849
msgid "You can't upload a synthesis after the deadline."
msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite."
@ -1189,7 +1190,7 @@ msgstr "rôle"
msgid "participant"
msgstr "participant⋅e"
#: apps/registration/forms.py:25 apps/registration/models.py:259
#: apps/registration/forms.py:25 apps/registration/models.py:268
msgid "coach"
msgstr "encadrant⋅e"
@ -1197,11 +1198,11 @@ msgstr "encadrant⋅e"
msgid "This email address is already used."
msgstr "Cette adresse e-mail est déjà utilisée."
#: apps/registration/forms.py:56 apps/registration/models.py:285
#: apps/registration/forms.py:56 apps/registration/models.py:294
msgid "volunteer"
msgstr "bénévole"
#: apps/registration/forms.py:57 apps/registration/models.py:304
#: apps/registration/forms.py:57 apps/registration/models.py:313
msgid "admin"
msgstr "admin"
@ -1226,7 +1227,7 @@ msgstr "email confirmé"
msgid "Activate your TFJM² account"
msgstr "Activez votre compte du TFJM²"
#: apps/registration/models.py:99 apps/registration/models.py:325
#: apps/registration/models.py:99 apps/registration/models.py:334
msgid "registration"
msgstr "inscription"
@ -1254,19 +1255,27 @@ msgstr "Homme"
msgid "Other"
msgstr "Autre"
#: apps/registration/models.py:143
#: apps/registration/models.py:144
msgid "address"
msgstr "adresse"
#: apps/registration/models.py:149
#: apps/registration/models.py:148
msgid "zip code"
msgstr "code postal"
#: apps/registration/models.py:154
msgid "city"
msgstr "ville"
#: apps/registration/models.py:158
msgid "phone number"
msgstr "numéro de téléphone"
#: apps/registration/models.py:154
#: apps/registration/models.py:163
msgid "health issues"
msgstr "problèmes de santé"
#: apps/registration/models.py:156
#: apps/registration/models.py:165
msgid ""
"You can indicate here your allergies or anything that is important to know "
"for organizers"
@ -1274,136 +1283,136 @@ msgstr ""
"Vous pouvez indiquer ici vos allergies ou n'importe quoi qui peut être bon à "
"savoir pour les organisateur⋅rices"
#: apps/registration/models.py:160
#: apps/registration/models.py:169
msgid "photo authorization"
msgstr "autorisation de droit à l'image"
#: apps/registration/models.py:192
#: apps/registration/models.py:201
msgid "12th grade"
msgstr "Terminale"
#: apps/registration/models.py:193
#: apps/registration/models.py:202
msgid "11th grade"
msgstr "Première"
#: apps/registration/models.py:194
#: apps/registration/models.py:203
msgid "10th grade or lower"
msgstr "Seconde ou inférieur"
#: apps/registration/models.py:196
#: apps/registration/models.py:205
msgid "student class"
msgstr "classe"
#: apps/registration/models.py:201
#: apps/registration/models.py:210
msgid "school"
msgstr "école"
#: apps/registration/models.py:206
#: apps/registration/models.py:215
msgid "responsible name"
msgstr "nom de læ responsable légal⋅e"
#: apps/registration/models.py:211
#: apps/registration/models.py:220
msgid "responsible phone number"
msgstr "numéro de téléphone de læ responsable légal⋅e"
#: apps/registration/models.py:216
#: apps/registration/models.py:225
msgid "responsible email address"
msgstr "adresse e-mail de læ responsable légal⋅e"
#: apps/registration/models.py:221
#: apps/registration/models.py:230
msgid "parental authorization"
msgstr "autorisation parentale"
#: apps/registration/models.py:228
#: apps/registration/models.py:237
msgid "health sheet"
msgstr "fiche sanitaire"
#: apps/registration/models.py:236
#: apps/registration/models.py:245
msgid "student"
msgstr "étudiant⋅e"
#: apps/registration/models.py:244
#: apps/registration/models.py:253
msgid "student registration"
msgstr "inscription d'élève"
#: apps/registration/models.py:245
#: apps/registration/models.py:254
msgid "student registrations"
msgstr "inscriptions d'élève"
#: apps/registration/models.py:254 apps/registration/models.py:276
#: apps/registration/models.py:263 apps/registration/models.py:285
msgid "professional activity"
msgstr "activité professionnelle"
#: apps/registration/models.py:267
#: apps/registration/models.py:276
msgid "coach registration"
msgstr "inscription d'encadrant⋅e"
#: apps/registration/models.py:268
#: apps/registration/models.py:277
msgid "coach registrations"
msgstr "inscriptions d'encadrant⋅es"
#: apps/registration/models.py:299
#: apps/registration/models.py:308
msgid "role of the administrator"
msgstr "rôle de l'administrateur⋅rice"
#: apps/registration/models.py:312
#: apps/registration/models.py:321
msgid "admin registration"
msgstr "inscription d'administrateur⋅rice"
#: apps/registration/models.py:313
#: apps/registration/models.py:322
msgid "admin registrations"
msgstr "inscriptions d'administrateur⋅rices"
#: apps/registration/models.py:329
#: apps/registration/models.py:338
msgid "type"
msgstr "type"
#: apps/registration/models.py:332
#: apps/registration/models.py:341
msgid "No payment"
msgstr "Pas de paiement"
#: apps/registration/models.py:334
#: apps/registration/models.py:343
msgid "Scholarship"
msgstr "Notification de bourse"
#: apps/registration/models.py:335
#: apps/registration/models.py:344
msgid "Bank transfer"
msgstr "Virement bancaire"
#: apps/registration/models.py:336
#: apps/registration/models.py:345
msgid "Other (please indicate)"
msgstr "Autre (veuillez spécifier)"
#: apps/registration/models.py:337
#: apps/registration/models.py:346
msgid "The tournament is free"
msgstr "Le tournoi est gratuit"
#: apps/registration/models.py:344
#: apps/registration/models.py:353
msgid "scholarship file"
msgstr "Notification de bourse"
#: apps/registration/models.py:345
#: apps/registration/models.py:354
msgid "only if you have a scholarship."
msgstr "Nécessaire seulement si vous déclarez être boursier."
#: apps/registration/models.py:352
#: apps/registration/models.py:361
msgid "additional information"
msgstr "informations additionnelles"
#: apps/registration/models.py:353
#: apps/registration/models.py:362
msgid "To help us to find your payment."
msgstr "Pour nous aider à retrouver votre paiement, si nécessaire."
#: apps/registration/models.py:368
#: apps/registration/models.py:377
#, python-brace-format
msgid "Payment of {registration}"
msgstr "Paiement de {registration}"
#: apps/registration/models.py:371
#: apps/registration/models.py:380
msgid "payment"
msgstr "paiement"
#: apps/registration/models.py:372
#: apps/registration/models.py:381
msgid "payments"
msgstr "paiements"
@ -1575,8 +1584,8 @@ msgid ""
"your scholarship attestation."
msgstr ""
"Le prix du tournoi est de %(price)s €. Les frais de participation sont "
"offerts pour les encadrant⋅es et les étudiant⋅es boursièr⋅es. Si c'est le cas, "
"merci de nous transmettre votre notification de bourse."
"offerts pour les encadrant⋅es et les étudiant⋅es boursièr⋅es. Si c'est le "
"cas, merci de nous transmettre votre notification de bourse."
#: apps/registration/templates/registration/payment_form.html:17
msgid ""
@ -1834,11 +1843,11 @@ msgstr "Autorisation parentale de {student}.{ext}"
msgid "Scholarship attestation of {user}.{ext}"
msgstr "Notification de bourse de {user}.{ext}"
#: tfjm/settings.py:163
#: tfjm/settings.py:162
msgid "English"
msgstr "Anglais"
#: tfjm/settings.py:164
#: tfjm/settings.py:163
msgid "French"
msgstr "Français"

View File

@ -1,5 +1,4 @@
Django>=3.2,<4.0
django-address~=0.2
django-bootstrap-datepicker-plus~=4.0
django-cas-server~=1.3
django-crispy-forms~=1.9

View File

@ -53,7 +53,6 @@ INSTALLED_APPS = [
'django.contrib.staticfiles',
'django.forms',
'address',
'bootstrap_datepicker_plus',
'crispy_forms',
'django_filters',

View File

@ -12,7 +12,6 @@ sitepackages = False
deps =
coverage
Django>=3.2,<4.0
django-address~=0.2
django-bootstrap-datepicker-plus~=4.0
django-crispy-forms~=1.9
django-filter~=2.4