from django.core import serializers
from django.contrib.admin.helpers import ActionForm
from django import forms
-
+import csv
class PeriodListFilter(SimpleListFilter):
class AppointmentAdmin(admin.ModelAdmin):
list_display = ('real_date', 'student', 'jury')
+ list_filter = ('slot__day__date', 'slot__day__appointment_period')
+ actions = ['export_csv']
+
+ def export_csv(self, request, queryset):
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment; filename=rendezvous.csv'
+ writer = csv.writer(response)
+
+ writer.writerow(['date', 'creneau', 'nom', 'prenom', 'iej', 'jury'])
+ for app in queryset:
+ user = app.student
+ student = user.student.all()[0]
+
+ writer.writerow([
+ app.day, app.start, user.last_name, user.first_name, student.iej, app.jury.name
+ ])
+
+ return response
+ export_csv.short_description = "Exporter en CSV"
admin.site.unregister(User)
admin.site.register(Organization)
return q.get()
return None
+ @property
+ def cancel_delay(self):
+ return self.period.cancel_delay
+
@property
def is_open(self):
"""
def can_book_today(self):
"""
- Check if we can book something today due to the delay
+ Check if we can book something today due to the delay and available slots
"""
delay = self.book_delay
today = datetime.date.today()
- return self.work_day_between(today, self.date) >= delay
+ 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,
def period(self):
return self.day.period
- # @cached_property
- @property
+ @cached_property
def slots(self):
res = []
size = self.period.appointment_slot_size
# res.append(self.start + datetime.timedelta(minutes = i * size))
return res
+ @property
+ def has_available_slot(self):
+ """ is this day has any slot available"""
+ for slot in self.slots:
+ for jury in slot['jurys']:
+ if jury['available']:
+ return True
+ return False
+
class AppointmentJury(Model):
day = models.ForeignKey(AppointmentDay,
related_name = 'jurys',
@property
def real_date_human(self):
return self.real_date.strftime('%d/%m/%Y %H:%M')
+
+ def can_cancel(self):
+ delay = self.period.cancel_delay
+ today = datetime.date.today()
+ return AppointmentDay.work_day_between(today, self.day.date) >= delay
Heure de fin : {{ ap_period.appointment.end|date:'H:i' }}
<br/>
</p>
- <form class="cancel_form" action="{% url teleforma-appointment-cancel %}" method="POST">
- {% csrf_token %}
- <input type="hidden" name="period_id" value="{{ period_id }}"/>
- <input type="hidden" name="appointment_id" value="{{ ap_period.appointment.id }}"/>
- <button type="submit">Annuler</button>
- </form>
+
+ {% if ap_period.appointment.can_cancel %}
+ <form class="cancel_form" action="{% url teleforma-appointment-cancel %}" method="POST">
+ {% csrf_token %}
+ <input type="hidden" name="period_id" value="{{ period_id }}"/>
+ <input type="hidden" name="appointment_id" value="{{ ap_period.appointment.id }}"/>
+ <button type="submit">Annuler</button>
+ </form>
+ {% else %}
+ <strong>Il est trop tard pour annuler ce rendez-vous.</strong>
+ {% endif %}
{% endif %}
{% if not ap_period.appointment %}
<a class="previous_day">Précédent</a>
<select name="day-to-show">
{% for day in ap_period.days %}
- <option value="{{ day.id }}">{{ day }}</option>
+ {% if day.can_book_today %}
+ <option value="{{ day.id }}">{{ day }}</option>
+ {% endif %}
{% endfor %}
</select>
<a class="next_day">Suivant</a>
</div>
- {% for day in ap_period.days.all %}
- <section data-day="{{ day.id }}" class="booking_day">
- <h2 class="day">{{ day }}</h2>
- <table border="1">
- <thead>
- <tr>
- <th>
- Heure d'arrivé
- </th>
- <th>
- Heure de début
- </th>
- <th>
- Heure de fin
- </th>
- {% for jury in day.available_jurys %}
+ {% for day in ap_period.days %}
+ {% if day.can_book_today %}
+ <section data-day="{{ day.id }}" class="booking_day">
+ <h2 class="day">{{ day }}</h2>
+ <table border="1">
+ <thead>
+ <tr>
+ <th style="display:none">
+ Heure d'arrivé
+ </th>
<th>
- Jury {{ forloop.counter }}
- <div data-jury="{{ jury.id }}">
- <input type="hidden" name="jury_name" value="{{ jury.name }}"/>
- <input type="hidden" name="jury_address" value="{{ jury.address }}"/>
- </div>
+ Heure de début
</th>
+ <th style="display:none">
+ Heure de fin
+ </th>
+ {% for jury in day.available_jurys %}
+ <th>
+ Jury {{ forloop.counter }}
+ <div data-jury="{{ jury.id }}">
+ <input type="hidden" name="jury_name" value="{{ jury.name }}"/>
+ <input type="hidden" name="jury_address" value="{{ jury.address }}"/>
+ </div>
+ </th>
+ {% endfor %}
+ </tr>
+ </thead>
+ <tbody>
+ {% for groupslot in day.slots.all %}
+ {% for slot in groupslot.slots %}
+ <tr>
+ <td class="arrival" style="display:none">
+ {{ slot.arrival|date:'H:i' }}
+ </td>
+ <td class="start">
+ {{ slot.start|date:'H:i' }}
+ </td>
+ <td class="end" style="display:none">
+ {{ slot.end|date:'H:i' }}
+ </td>
+
+ {% for jury in slot.jurys %}
+ {% if forloop.counter0 < day.number_of_available_jurys %}
+ <td>
+ {% if jury.available %}
+ <form class="booking_form" method="POST">
+ {% csrf_token %}
+ <input type="hidden" name="slot_nb"
+ value="{{ slot.slot_nb }}"/>
+ <input type="hidden" name="slot"
+ value="{{ groupslot.id }}"/>
+ <input type="hidden" name="day" value="{{ day.id }}"/>
+ <input type="hidden" name="jury" value="{{ jury.id }}"/>
+ <button type="submit">Réserver</button>
+ </form>
+ {% else %}
+ <strong>Reservé</strong>
+ {% endif %}
+ </td>
+ {% endif %}
+ {% endfor %}
+ </tr>
+ {% endfor %}
+ {% if not forloop.last %}
+ <tr class="separator">
+ <td colspan="{{ day.number_of_available_jurys|add:3 }}">--</td>
+ </tr>
+ {% endif %}
{% endfor %}
- </tr>
- </thead>
- <tbody>
- {% for groupslot in day.slots.all %}
- {% for slot in groupslot.slots %}
- <tr>
- <td class="arrival">
- {{ slot.arrival|date:'H:i' }}
- </td>
- <td class="start">
- {{ slot.start|date:'H:i' }}
- </td>
- <td class="end">
- {{ slot.end|date:'H:i' }}
- </td>
-
- {% for jury in slot.jurys %}
- {% if forloop.counter0 < day.number_of_available_jurys %}
- <td>
- {% if jury.available %}
- <form class="booking_form" method="POST">
- {% csrf_token %}
- <input type="hidden" name="slot_nb" value="{{ slot.slot_nb }}"/>
- <input type="hidden" name="slot" value="{{ groupslot.id }}"/>
- <input type="hidden" name="day" value="{{ day.id }}"/>
- <input type="hidden" name="jury" value="{{ jury.id }}"/>
- <button type="submit">Réserver</button>
- </form>
- {% else %}
- <strong>Reservé</strong>
- {% endif %}
- </td>
- {% endif %}
- {% endfor %}
- </tr>
- {% endfor %}
- {% if not forloop.last %}
- <tr class="separator">
- <td colspan="{{ day.number_of_available_jurys|add:3 }}">--</td>
- </tr>
- {% endif %}
- {% endfor %}
-
- </tbody>
- </table>
- </section>
+
+ </tbody>
+ </table>
+ </section>
+ {% endif %}
{% endfor %}
{% endif %}
<br/>