]> git.parisson.com Git - teleforma.git/commitdiff
Add fields allow_elearning, allow_presentiel and change appointments display rules... feature/type-rdv
authorYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 28 Sep 2021 14:24:01 +0000 (16:24 +0200)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 28 Sep 2021 14:24:01 +0000 (16:24 +0200)
teleforma/migrations/0010_auto_20210927_1556.py [new file with mode: 0644]
teleforma/models/appointment.py
teleforma/views/appointment.py

diff --git a/teleforma/migrations/0010_auto_20210927_1556.py b/teleforma/migrations/0010_auto_20210927_1556.py
new file mode 100644 (file)
index 0000000..07a6738
--- /dev/null
@@ -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'),
+        ),
+    ]
index d4fee3eff686ccc669b98c0c30c90a886d393010..2da396ffcd70f451b6e15337582cfaf5625577bf 100644 (file)
@@ -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
index ee7a36cf4a94208239211e9cb97047aaf176c426..ce15c98b5b85ac90bd79694e26fb089adc340ba9 100644 (file)
@@ -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)