]> git.parisson.com Git - teleforma.git/commitdiff
Move nb_script from period to training
authorYoan Le Clanche <yoanl@pilotsystems.net>
Thu, 8 Dec 2022 12:22:48 +0000 (13:22 +0100)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Thu, 8 Dec 2022 12:22:48 +0000 (13:22 +0100)
teleforma/exam/forms.py
teleforma/exam/views.py
teleforma/migrations/0021_auto_20221208_1214.py [new file with mode: 0644]
teleforma/models/core.py
teleforma/models/crfpa.py

index 7d80f6444d2fac76b5ea34db7b4d4d38fed705ab..1be248fc9a346e3db4790bcf6df645149ac353e0 100644 (file)
@@ -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
index 4fda97aa29fc7ede0fc16cdca7f19bb94c9c011a..a2badb041aee8c02ea0fa8b8922aa6c7fd4b3b99 100755 (executable)
@@ -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 (file)
index 0000000..e5f6653
--- /dev/null
@@ -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'),
+        ),
+    ]
index acd643c0a2434024e91247c5c4a75c31d54fd5b4..91734d0c9d3639af21e6ecff67b73f870296026b 100755 (executable)
@@ -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)
index aea424a810fc658fd744f7c48df9741ce31a6979..7cc81d95de5400dcd31b0193627a91ad8544d9bf 100755 (executable)
@@ -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'