From 1c2cb022a89f52aa2adcdfd8bf8fdc37da0be434 Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Tue, 28 Sep 2021 16:24:01 +0200 Subject: [PATCH] Add fields allow_elearning, allow_presentiel and change appointments display rules : https://trackers.pilotsystems.net/prebarreau/0265 --- .../migrations/0010_auto_20210927_1556.py | 23 +++++++++++++++ teleforma/models/appointment.py | 28 +++++++++++++------ teleforma/views/appointment.py | 20 ++++++++++--- 3 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 teleforma/migrations/0010_auto_20210927_1556.py diff --git a/teleforma/migrations/0010_auto_20210927_1556.py b/teleforma/migrations/0010_auto_20210927_1556.py new file mode 100644 index 00000000..07a6738b --- /dev/null +++ b/teleforma/migrations/0010_auto_20210927_1556.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.3 on 2021-09-27 15:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teleforma', '0009_alter_conference_public_id'), + ] + + operations = [ + migrations.AddField( + model_name='appointmentslot', + name='allow_elearning', + field=models.BooleanField(default=True, verbose_name='Autoriser e-learning'), + ), + migrations.AddField( + model_name='appointmentslot', + name='allow_presentiel', + field=models.BooleanField(default=True, verbose_name='Autoriser présentiel'), + ), + ] diff --git a/teleforma/models/appointment.py b/teleforma/models/appointment.py index d4fee3ef..2da396ff 100644 --- a/teleforma/models/appointment.py +++ b/teleforma/models/appointment.py @@ -71,20 +71,27 @@ class AppointmentPeriod(models.Model): """ return self.start <= datetime.date.today() <= self.end and self.enable_appointment - @cached_property + # @cached_property # @timing - def days(self): + def days(self, platform_only=False): days = {} delay = self.book_delay today = datetime.date.today() - - for slot in AppointmentSlot.objects.filter(appointment_period=self).order_by('start'): - cache_key = '%s_%s_%s-%s' % (CACHE_KEY, - self.id, slot.date, slot.mode) + queryset = AppointmentSlot.objects.filter(appointment_period=self).order_by('-date') + if platform_only: + queryset = queryset.filter(mode='distance', allow_elearning=True) + else: + queryset = queryset.filter(allow_presentiel=True) + for slot in queryset: + cache_key = '%s_%s_%s-%s-%s' % (CACHE_KEY, + self.id, slot.date, slot.mode, platform_only) dayData = cache.get(cache_key) # dayData = None slot_key = str(slot.date) + "-" + slot.mode + + # some slots are reserved to elearning or presentiel students if not dayData: + slotData = {'instance': slot, 'slots': slot.slots, 'mode': slot.mode, @@ -110,7 +117,7 @@ class AppointmentPeriod(models.Model): for day in days: if not days[day]['from_cache']: - cache_key = '%s_%s_%s' % (CACHE_KEY, self.id, day) + cache_key = '%s_%s_%s-%s' % (CACHE_KEY, self.id, day, platform_only) cache.set(cache_key, days[day], 1800) # print days @@ -119,7 +126,7 @@ class AppointmentPeriod(models.Model): @cached_property def modes(self): modes = set() - for day in self.days: + for day in self.days(platform_only=None): if day['mode'] not in modes: for MODE in APPOINTMENT_MODE: if MODE[0] == day['mode']: @@ -180,6 +187,9 @@ class AppointmentSlot(models.Model): mode = models.CharField('Mode', choices=APPOINTMENT_MODE, default='presentiel', max_length=20) + allow_elearning = models.BooleanField('Autoriser e-learning', default=True) + allow_presentiel = models.BooleanField('Autoriser présentiel', default=True) + date = models.DateField('date', null=True, blank=False) start = models.TimeField("heure du premier créneau (heure d'arrivée)") @@ -241,7 +251,7 @@ class AppointmentSlot(models.Model): 'slot_nb': i, 'start': start, 'end': end, - 'arrival': arrival, + 'arrival': arrival } # compute if a slot is available for each jury diff --git a/teleforma/views/appointment.py b/teleforma/views/appointment.py index ee7a36cf..ce15c98b 100644 --- a/teleforma/views/appointment.py +++ b/teleforma/views/appointment.py @@ -37,13 +37,21 @@ class Appointments(View): # Get info ap_periods = [] + platform_only = user.student.get().platform_only for ap_period in AppointmentPeriod.objects.filter(periods__id=period_id, course_id=course_id).order_by('id'): if ap_period.is_open: + modes = ap_period.modes + # platformonly student can't subscribe to presentiel appointments + if platform_only: + try: + modes.remove(('presentiel', 'Presentiel')) + except KeyError: + pass ap_periods.append({ - 'days':ap_period.days, + 'days':ap_period.days(platform_only), 'name': ap_period.name, 'appointment':ap_period.get_appointment(user), - 'modes':ap_period.modes, + 'modes':modes, 'course': ap_period.course, 'show_modes':len(ap_period.modes) > 1 }) @@ -102,7 +110,9 @@ class Appointments(View): ap.student = user try: ap.save() - cache.delete('%s_%s_%s-%s' % (CACHE_KEY, ap.slot.appointment_period.id, ap.slot.date, ap.slot.mode)) + cache.delete('%s_%s_%s-%s-True' % (CACHE_KEY, ap.slot.appointment_period.id, ap.slot.date, ap.slot.mode)) + cache.delete('%s_%s_%s-%s-None' % (CACHE_KEY, ap.slot.appointment_period.id, ap.slot.date, ap.slot.mode)) + cache.delete('%s_%s_%s-%s-False' % (CACHE_KEY, ap.slot.appointment_period.id, ap.slot.date, ap.slot.mode)) self.send_ap_mail(ap) except IntegrityError: # Duplicate appointment caught by the db @@ -162,7 +172,9 @@ def cancel_appointment(request): messages.add_message(request, messages.ERROR, 'Il est trop tard pour annuler ce rendez-vous.') return redirect('teleforma-appointments', period_id=period_id, course_id=course_id) - cache.delete('%s_%s_%s-%s' % (CACHE_KEY, app.slot.appointment_period.id, app.slot.date, app.slot.mode)) + cache.delete('%s_%s_%s-%s-True' % (CACHE_KEY, app.slot.appointment_period.id, app.slot.date, app.slot.mode)) + cache.delete('%s_%s_%s-%s-None' % (CACHE_KEY, app.slot.appointment_period.id, app.slot.date, app.slot.mode)) + cache.delete('%s_%s_%s-%s-False' % (CACHE_KEY, app.slot.appointment_period.id, app.slot.date, app.slot.mode)) app.delete() messages.add_message(request, messages.INFO, 'Votre réservation a été annulé.') return redirect('teleforma-appointments', period_id=period_id, course_id=course_id) -- 2.39.5