return self.slot.day
@property
- def real_time(self):
+ def start(self):
start = self.slot.start
delta = self.slot_nb * self.period.appointment_slot_size
- dt = datetime.datetime.combine(date.today(), start) + datetime.timedelta(minutes = delta)
- return datetime.time(dt.hour,dt.minute,0)
+ dt = datetime.datetime.combine(date.today(), start) + datetime.timedelta(minutes=delta)
+ return datetime.time(dt.hour, dt.minute, 0)
+
+ @property
+ def end(self):
+ dt = datetime.datetime.combine(date.today(), self.start) + datetime.timedelta(minutes=self.period.appointment_slot_size)
+ return datetime.time(dt.hour, dt.minute, 0)
+
+ @property
+ def arrival(self):
+ dt = datetime.datetime.combine(date.today(), self.start) - datetime.timedelta(minutes=60)
+ return datetime.time(dt.hour, dt.minute, 0)
+
+
+ # @property
+ # def real_time(self):
+ # start = self.slot.start
+ # delta = self.slot_nb * self.period.appointment_slot_size
+ # dt = datetime.datetime.combine(date.today(), start) + datetime.timedelta(minutes = delta)
+ # return datetime.time(dt.hour,dt.minute,0)
@property
def real_date(self):
- return datetime.datetime.combine(self.day.date, self.real_time)
+ return datetime.datetime.combine(self.day.date, self.start)
@property
def real_date_human(self):
}
}
});
+ $("#cancel-confirm").dialog({
+ autoOpen: false,
+ resizable: false,
+ modal: true,
+ buttons: {
+ 'Confirmer': function () {
+ currentForm.submit();
+ },
+ "Annuler": function () {
+ $(this).dialog('close');
+ }
+ }
+ });
$('.booking_form').submit(function () {
currentForm = this;
return false;
});
+ $('.cancel_form').submit(function () {
+ currentForm = this;
+ $('#cancel-confirm').dialog('open');
+ return false;
+ });
+
$('[name="day-to-show"]').bind('change', updateDisplayedDays);
updateDisplayedDays();
- $('.previous_day').click(function() {
+ $('.previous_day').click(function () {
var $select = $(this).parent().find('select');
- if($select.find('option:selected').prev().size()) {
- var $selected = $select.find('option:selected');
+ if ($select.find('option:selected').prev().size()) {
+ var selected = $select.val();
$select.find('option').removeAttr('selected');
- $selected.prev().attr('selected', 'selected');
+ $select.find('option[value="' + selected + '"]').prev().attr('selected', 'selected');
+ $select.trigger('change');
}
});
- $('.next_day').click(function() {
+ $('.next_day').click(function () {
var $select = $(this).parent().find('select');
- if($select.find('option:selected').next().size()) {
- var $selected = $select.find('option:selected');
+ if ($select.find('option:selected').next().size()) {
+ var selected = $select.val();
$select.find('option').removeAttr('selected');
- console.log($selected)
- $selected.next().attr('selected', 'selected');
+ $select.find('option[value="' + selected + '"]').next().attr('selected', 'selected');
+ $select.trigger('change');
}
});
})
{% block content %}
- <div id="booking-confirm" title="Confirmez votre réservation">
+ {% if messages %}
+ <ul class="messages">
+ {% for message in messages %}
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+
+
+
+ <div id="booking-confirm" title="Réservation">
<p>
Êtes-vous sûr de vouloir réserver ce créneau ?
</p>
Epreuve : <strong id="start_placeholder"></strong> - <strong id="end_placeholder"></strong>
<br/>
Vous devrez arrivez à <strong id="arrival_placeholder"></strong>
-
-
</div>
-
+ <div id="cancel-confirm" title="Annulation">
+ <p>
+ Êtes-vous sûr de vouloir annuler votre rendez-vous ?
+ </p>
+ </div>
{% for ap_period in ap_periods %}
- {% if ap_period.appointments %}
- Rendez-vous pour la 1ère période : {{ ap_period.appointments }}
+ <h2>{{ ap_period.name }}</h2>
+
+ {% if ap_period.appointment %}
+ <p>
+ Vous avez réservé pour cette période le {{ ap_period.appointment.real_date|date:'d/m/Y' }}.
+ <br/>
+ <strong>{{ ap_period.appointment.jury.name }}</strong>
+ <br/>
+ {{ ap_period.appointment.jury.address|linebreaks }}
+ Heure d'arrivé : {{ ap_period.appointment.arrival|date:'H:i' }}
+ <br/>
+ Heure de début : {{ ap_period.appointment.start|date:'H:i' }}
+ <br/>
+ 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>
{% endif %}
- {% if not ap_period.appointments %}
+ {% if not ap_period.appointment %}
- <p>Vous n'avez pas encore pris de rendez-vous pour la seconde période</p>
+ <p>Vous n'avez pas encore pris de rendez-vous pour cette période</p>
<div class="select-day">
-{# <a class="previous_day">Précédent</a>#}
+ <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>
{% endfor %}
</select>
-{# <a class="next_day">Suivant</a>#}
+ <a class="next_day">Suivant</a>
</div>
{% for day in ap_period.days.all %}
# APPOINTMENTS
url(r'^desk/periods/(?P<period_id>.*)/appointments/$', Appointments.as_view(),
name="teleforma-appointments"),
+ url(r'^desk/periods/appointments/cancel$', cancel_appointment,
+ name="teleforma-appointment-cancel"),
# Postman
url(r'^messages/', include('postman.urls')),
+# -*- coding: utf-8 -*-
+
from django.views.generic import View
-from django.shortcuts import render
+from django.shortcuts import render, redirect
+from django.contrib import messages
+from django.http import HttpResponse
from teleforma.models.appointment import AppointmentPeriod, Appointment
for ap_period in AppointmentPeriod.objects.filter(period=period_id).order_by('id'):
ap_periods.append({
'days':ap_period.days.all(),
- 'appointments':ap_period.get_appointment(request.user)
+ 'name': ap_period.name,
+ 'appointment':ap_period.get_appointment(request.user)
})
# for ap_period in ap_periods:
# appointments[ap_period.id] = ap_period.get_appointments(request.user)
- return render(request, self.template_name, {'ap_periods': ap_periods})
+ return render(request, self.template_name, {'ap_periods': ap_periods, 'period_id':period_id})
def post(self, request, period_id):
-
-
slot_nb = int(request.POST.get('slot_nb'))
slot_id = int(request.POST.get('slot'))
jury_id = int(request.POST.get('jury'))
ap.day_id = day_id
ap.student = request.user
ap.save()
+ messages.add_message(request, messages.INFO, "Votre réservation a bien été prise en compte.")
return self.render(request, period_id)
def get(self, request, period_id):
return self.render(request, period_id)
+
+
+def cancel_appointment(request):
+ period_id = request.POST['period_id']
+ appointment_id = request.POST['appointment_id']
+ try:
+ app = Appointment.objects.get(id=appointment_id)
+ except Appointment.DoesNotExist:
+ pass
+
+ if app.student != request.user:
+ return HttpResponse('Unauthorized', status=401)
+
+ app.delete()
+ messages.add_message(request, messages.INFO, 'Votre réservation a été annulé.')
+ return redirect('teleforma-appointments', period_id=period_id)
+