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):
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
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
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):
def get_form_kwargs(self):
kwargs = super(ScriptCreateView, self).get_form_kwargs()
kwargs['period'] = self.period
+ kwargs['user'] = self.request.user
return kwargs
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')
--- /dev/null
+# 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'),
+ ),
+ ]
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(
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)
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:
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'