From: Yoan Le Clanche Date: Thu, 27 Sep 2018 08:32:49 +0000 (+0200) Subject: rework X-Git-Tag: 1.4.0~37 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=e5ebcd2dbf6ead9aec375408763b583e9a3bee1b;p=teleforma.git rework --- diff --git a/teleforma/models/appointment.py b/teleforma/models/appointment.py index eb3650c1..ab9c8c7f 100644 --- a/teleforma/models/appointment.py +++ b/teleforma/models/appointment.py @@ -39,53 +39,24 @@ class AppointmentPeriod(Model): """ return self.start <= datetime.date.today() <= self.end - class Meta(MetaCore): - ordering = ('id',) - db_table = app_label + '_appointment_period' - verbose_name = "période de prise de rendez-vous" - verbose_name_plural = "périodes de prise de rendez-vous" - -class AppointmentDay(Model): - appointment_period = models.ForeignKey(AppointmentPeriod, - related_name = "days", - verbose_name = u"Période de prise de rendez-vous") - date = models.DateField('date') - - def __unicode__(self): - return self.date and self.date.strftime('%d/%m/%Y') or u'' - class Meta(MetaCore): - db_table = app_label + '_appointment_date' - verbose_name = "date de prise de rendez-vous" - verbose_name_plural = "dates de prise de rendez-vous" - - def changeform_link(self): - if self.id: - # Replace "myapp" with the name of the app containing - # your Certificate model: - changeform_url = urlresolvers.reverse( - 'admin:teleforma_appointmentday_change', args=(self.id,) - ) - return u'Détails' % changeform_url - return u'' - changeform_link.allow_tags = True - changeform_link.short_description = '' # omit column header - - def get_nb_slots(self): - return sum([ s.nb for s in self.slots.all() ]) - get_nb_slots.short_description = 'Nombre de créneaux' + def days(self): + days = {} + delay = self.period.book_delay + today = datetime.date.today() + for slot in AppointmentSlot.objects.filter(period = self.period): + if slot.date not in days: + days['slots'] = [slot,] + days['available'] = False + else: + days['slots'].append(slot) - def get_nb_jury(self): - return self.jurys.count() - get_nb_jury.short_description = 'Nombre de jurys' + # days are available if they are within the good period and if there are remaining slots + if slot.has_available_slots and self.work_day_between(today, self.date) >= delay: + days['available'] = True - @property - def period(self): - return self.appointment_period.period + return days - @property - def book_delay(self): - return self.period.book_delay @cached_property def available_jurys(self): @@ -111,10 +82,6 @@ class AppointmentDay(Model): return available - @property - def number_of_available_jurys(self): - return len(self.available_jurys) - @staticmethod def work_day_between(start, end): """ @@ -154,26 +121,66 @@ class AppointmentDay(Model): return res + class Meta(MetaCore): + ordering = ('id',) + db_table = app_label + '_appointment_period' + verbose_name = "période de prise de rendez-vous" + verbose_name_plural = "périodes de prise de rendez-vous" + +class AppointmentDay(Model): + appointment_period = models.ForeignKey(AppointmentPeriod, + related_name = "days", + verbose_name = u"Période de prise de rendez-vous") + date = models.DateField('date') + + def __unicode__(self): + return self.date and self.date.strftime('%d/%m/%Y') or u'' + + class Meta(MetaCore): + db_table = app_label + '_appointment_date' + verbose_name = "date de prise de rendez-vous" + verbose_name_plural = "dates de prise de rendez-vous" + + def changeform_link(self): + if self.id: + # Replace "myapp" with the name of the app containing + # your Certificate model: + changeform_url = urlresolvers.reverse( + 'admin:teleforma_appointmentday_change', args=(self.id,) + ) + return u'Détails' % changeform_url + return u'' + changeform_link.allow_tags = True + changeform_link.short_description = '' # omit column header + + def get_nb_slots(self): + return sum([ s.nb for s in self.slots.all() ]) + get_nb_slots.short_description = 'Nombre de créneaux' + + def get_nb_jury(self): + return self.jurys.count() + get_nb_jury.short_description = 'Nombre de jurys' + + @property + def period(self): + return self.appointment_period.period + + + + @property + def number_of_available_jurys(self): + return len(self.available_jurys) - def can_book_today(self): - """ - Check if we can book something today due to the delay and available slots - """ - delay = self.book_delay - today = datetime.date.today() - delay_ok = self.work_day_between(today, self.date) >= delay - available = False - for groupslot in self.slots.all(): - if groupslot.has_available_slot: - available = True - break - return delay_ok and available class AppointmentSlot(Model): - day = models.ForeignKey(AppointmentDay, - related_name = 'slots', - verbose_name = 'jour') + # day = models.ForeignKey(AppointmentDay, + # related_name = 'slots', + # verbose_name = 'jour') + appointment_period = models.ForeignKey(AppointmentPeriod, + related_name="days", + verbose_name=u"Période de prise de rendez-vous") + date = models.DateField('date') start = models.TimeField("heure du premier créneau (heure d'arrivée)") nb = models.IntegerField('nombre de créneaux') @@ -191,20 +198,25 @@ class AppointmentSlot(Model): def period(self): return self.day.period + # @property + # def slots_from_same_day(self): + # slots = AppointmentSlot.objets.filter(appointment_period=self.appointment_period, date=self.date) + + + @cached_property def slots(self): res = [] size = self.period.appointment_slot_size # slots reserved per jury - jurys = self.day.jurys.all() + jurys = self.jurys.all() jurys_slots = [] for jury in jurys: jurys_slots.append([ap.slot_nb for ap in self.appointments.filter(jury=jury)]) for i in range(self.nb): - # for jury in self arrival = datetime.datetime.combine(self.day.date, self.start) + datetime.timedelta(minutes = i * size) start = arrival + datetime.timedelta(minutes = 60) end = start + datetime.timedelta(minutes = size) @@ -215,6 +227,8 @@ class AppointmentSlot(Model): 'end':end, 'arrival':arrival, } + + # compute if a slot is available for each jury sjurys = [] for j, jury in enumerate(jurys): sjurys.append({'id':jury.id, 'available':i not in jurys_slots[j]}) @@ -234,9 +248,9 @@ class AppointmentSlot(Model): return False class AppointmentJury(Model): - day = models.ForeignKey(AppointmentDay, + slot = models.ForeignKey(AppointmentDay, related_name = 'jurys', - verbose_name = 'jour') + verbose_name = 'creneau') name = models.CharField(_('name'), max_length=255) address = models.TextField("adresse")