]> git.parisson.com Git - teleforma.git/commitdiff
rework
authorYoan Le Clanche <yoan@ellington.pilotsystems.net>
Thu, 27 Sep 2018 08:32:49 +0000 (10:32 +0200)
committerYoan Le Clanche <yoan@ellington.pilotsystems.net>
Thu, 27 Sep 2018 08:32:49 +0000 (10:32 +0200)
teleforma/models/appointment.py

index eb3650c16d21f6db3f76223cf5d8f24d336ff98c..ab9c8c7f6022c32bbf7c22d439e2ad9d5b8e4b11 100644 (file)
@@ -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'<a href="%s" target="_blank">Détails</a>' % 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'<a href="%s" target="_blank">Détails</a>' % 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")