"""
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):
return available
- @property
- def number_of_available_jurys(self):
- return len(self.available_jurys)
-
@staticmethod
def work_day_between(start, end):
"""
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')
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)
'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]})
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")