--- /dev/null
+# 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'),
+ ),
+ ]
"""
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,
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
@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']:
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)")
'slot_nb': i,
'start': start,
'end': end,
- 'arrival': arrival,
+ 'arrival': arrival
}
# compute if a slot is available for each jury
# 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
})
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
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)