From 50709e494c4066dc51f5816eff027b3ed28ccc1f Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Thu, 8 Dec 2022 13:22:48 +0100 Subject: [PATCH] Move nb_script from period to training --- teleforma/exam/forms.py | 13 ++++++++++- teleforma/exam/views.py | 22 ++++++++++++++++--- .../migrations/0021_auto_20221208_1214.py | 22 +++++++++++++++++++ teleforma/models/core.py | 10 +++++++-- teleforma/models/crfpa.py | 17 ++++++++++++++ 5 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 teleforma/migrations/0021_auto_20221208_1214.py diff --git a/teleforma/exam/forms.py b/teleforma/exam/forms.py index 7d80f644..1be248fc 100644 --- a/teleforma/exam/forms.py +++ b/teleforma/exam/forms.py @@ -4,6 +4,7 @@ from django.core.exceptions import ValidationError from django.forms import ModelForm from ..exam.models import Script from ..models.core import get_n_choices +from ..models.crfpa import Student def validate_session(nb): @@ -17,9 +18,19 @@ class ScriptForm(ModelForm): def __init__(self, *args, **kwargs): period = kwargs.pop('period') + user = kwargs.pop('user') super(ScriptForm, self).__init__(*args, **kwargs) self.fields['score'].localize = False - nb = period.nb_script or settings.TELEFORMA_EXAM_MAX_SESSIONS + try: + student = user.student.get() + except Student.DoesNotExist: + student = None + + if student: + nb = student.max_sessions() or settings.TELEFORMA_EXAM_MAX_SESSIONS + else: + nb = period.nb_scripts() or settings.TELEFORMA_EXAM_MAX_SESSIONS + self.fields['session'] = forms.ChoiceField(choices=get_n_choices(nb + 1), validators=[validate_session(nb)]) self.fields['file'].required = True diff --git a/teleforma/exam/views.py b/teleforma/exam/views.py index 4fda97aa..a2badb04 100755 --- a/teleforma/exam/views.py +++ b/teleforma/exam/views.py @@ -53,13 +53,23 @@ class ScriptMixinView(View): context['courses'] = Course.objects.filter(pk__in=course_pk_list) context['script_service_url'] = getattr( settings, 'TELEFORMA_EXAM_SCRIPT_SERVICE_URL') - self.nb_script = self.period.nb_script or settings.TELEFORMA_EXAM_MAX_SESSIONS + + try: + student = self.request.user.student.get() + except Student.DoesNotExist: + student = None + self.max_scripts = 1000 + if student: + self.nb_script = student.max_sessions() or settings.TELEFORMA_EXAM_MAX_SESSIONS + self.max_scripts = student.max_total_scripts() + else: + self.nb_script = self.period.nb_scripts() or settings.TELEFORMA_EXAM_MAX_SESSIONS if getattr(settings, 'TELEFORMA_EXAM_SCRIPT_UPLOAD', True) and self.period.date_exam_end: upload = datetime.datetime.now() <= self.period.date_exam_end cur_scripts = Script.objects.filter(period=self.period, author=self.request.user)\ .exclude(status=0).count() - allowed_scripts = self.nb_script * len(self.get_course_pk_list()) + allowed_scripts = self.max_scripts * len(self.get_course_pk_list()) if cur_scripts >= allowed_scripts: upload = False context['upload'] = upload @@ -123,6 +133,7 @@ class ScriptView(ScriptMixinView, CourseAccessMixin, UpdateView): kwargs = super(ScriptView, self).get_form_kwargs() script = self.get_object() kwargs['period'] = script.period + kwargs['user'] = self.request.user return kwargs def get_success_url(self): @@ -307,6 +318,7 @@ class ScriptCreateView(ScriptMixinView, CreateView): def get_form_kwargs(self): kwargs = super(ScriptCreateView, self).get_form_kwargs() kwargs['period'] = self.period + kwargs['user'] = self.request.user return kwargs @@ -326,7 +338,11 @@ class QuotasView(ListView): self.courses = self.professor.courses.all() self.period = get_object_or_404( Period, id=int(self.kwargs['period_id'])) - self.nb_script = self.period.nb_script or settings.TELEFORMA_EXAM_MAX_SESSIONS + try: + student = self.request.user.student.get() + self.nb_script = student.max_sessions() or settings.TELEFORMA_EXAM_MAX_SESSIONS + except Student.DoesNotExist: + self.nb_script = self.period.nb_scripts() or settings.TELEFORMA_EXAM_MAX_SESSIONS self.session = self.request.GET.get('session') self.course = self.request.GET.get('course') self.corrector = self.request.GET.get('corrector') diff --git a/teleforma/migrations/0021_auto_20221208_1214.py b/teleforma/migrations/0021_auto_20221208_1214.py new file mode 100644 index 00000000..e5f6653d --- /dev/null +++ b/teleforma/migrations/0021_auto_20221208_1214.py @@ -0,0 +1,22 @@ +# Generated by Django 3.2.13 on 2022-12-08 12:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teleforma', '0020_chatmessage_reply_to'), + ] + + operations = [ + migrations.RemoveField( + model_name='period', + name='nb_script', + ), + migrations.AddField( + model_name='training', + name='nb_script', + field=models.IntegerField(blank=True, default=12, null=True, verbose_name='nombre maximal de copies'), + ), + ] diff --git a/teleforma/models/core.py b/teleforma/models/core.py index acd643c0..91734d0c 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -182,8 +182,6 @@ class Period(models.Model): is_open = models.BooleanField(_('is open'), default=True) date_exam_end = models.DateTimeField( _("date de fin d'examens"), null=True, blank=True) - nb_script = models.IntegerField( - _("nombre maximal de copies"), null=True, blank=True) date_close_accounts = models.DateField( "date de fermeture des comptes étudiants", null=True, blank=True) date_inscription_start = models.DateField( @@ -194,12 +192,20 @@ class Period(models.Model): def __str__(self): return self.name + def nb_scripts(self): + """ max number of scripts among all trainings """ + max_scripts = 0 + for training in self.training.all(): + max_scripts = max(max_scripts, training.nb_script) + return max_scripts + class Meta(MetaCore): db_table = app_label + '_' + 'period' verbose_name = _('period') ordering = ['name'] + class CourseType(models.Model): name = models.CharField(_('name'), max_length=255) diff --git a/teleforma/models/crfpa.py b/teleforma/models/crfpa.py index aea424a8..7cc81d95 100755 --- a/teleforma/models/crfpa.py +++ b/teleforma/models/crfpa.py @@ -116,6 +116,9 @@ class Training(models.Model): available = models.BooleanField(_('available')) platform_only = models.BooleanField(_('e-learning platform only')) duration = models.IntegerField(u"Durée en heures", default=0) + nb_script = models.IntegerField( + _("nombre maximal de copies"), default=12) + def __str__(self): if self.name and self.period: @@ -400,6 +403,20 @@ class Student(models.Model): def expiration_date(self): """ closing date of student period """ return self.period.date_close_accounts + + def max_sessions(self): + """ get total number of scripts """ + max_sessions = 0 + for training in self.trainings.all(): + max_sessions = max(training.nb_script, max_sessions) + return max_sessions + + def max_total_scripts(self): + """ get total number of scripts""" + total = 0 + for training in self.trainings.all(): + total += training.nb_script + return total class Meta(MetaCore): db_table = app_label + '_' + 'student' -- 2.39.5