From: Yoan Le Clanche Date: Wed, 19 Sep 2018 12:10:44 +0000 (+0200) Subject: dev X-Git-Tag: 1.4.0~39^2~5 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=01261ff910a80ddaf76b6cfc9058c09df4b89fc9;p=teleforma.git dev --- diff --git a/teleforma/admin.py b/teleforma/admin.py index ab77126c..139c0b27 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -13,7 +13,7 @@ from django.http import HttpResponse from django.core import serializers from django.contrib.admin.helpers import ActionForm from django import forms - +import csv class PeriodListFilter(SimpleListFilter): @@ -203,6 +203,25 @@ class AppointmentJuryAdmin(admin.ModelAdmin): 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) diff --git a/teleforma/models/appointment.py b/teleforma/models/appointment.py index 252fb505..49921dd2 100644 --- a/teleforma/models/appointment.py +++ b/teleforma/models/appointment.py @@ -28,6 +28,10 @@ class AppointmentPeriod(Model): return q.get() return None + @property + def cancel_delay(self): + return self.period.cancel_delay + @property def is_open(self): """ @@ -153,11 +157,18 @@ class AppointmentDay(Model): 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, @@ -180,8 +191,7 @@ class AppointmentSlot(Model): def period(self): return self.day.period - # @cached_property - @property + @cached_property def slots(self): res = [] size = self.period.appointment_slot_size @@ -213,6 +223,15 @@ class AppointmentSlot(Model): # 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', @@ -281,3 +300,8 @@ class Appointment(Model): @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 diff --git a/teleforma/templates/teleforma/appointments.html b/teleforma/templates/teleforma/appointments.html index 4ff23ab3..309247c3 100644 --- a/teleforma/templates/teleforma/appointments.html +++ b/teleforma/templates/teleforma/appointments.html @@ -154,12 +154,17 @@ Heure de fin : {{ ap_period.appointment.end|date:'H:i' }}

-
- {% csrf_token %} - - - -
+ + {% if ap_period.appointment.can_cancel %} +
+ {% csrf_token %} + + + +
+ {% else %} + Il est trop tard pour annuler ce rendez-vous. + {% endif %} {% endif %} {% if not ap_period.appointment %} @@ -170,82 +175,88 @@ Précédent Suivant - {% for day in ap_period.days.all %} -
-

{{ day }}

- - - - - - - {% for jury in day.available_jurys %} + {% for day in ap_period.days %} + {% if day.can_book_today %} +
+

{{ day }}

+
- Heure d'arrivé - - Heure de début - - Heure de fin -
+ + + + + {% for jury in day.available_jurys %} + + {% endfor %} + + + + {% for groupslot in day.slots.all %} + {% for slot in groupslot.slots %} + + + + + + {% for jury in slot.jurys %} + {% if forloop.counter0 < day.number_of_available_jurys %} + + {% endif %} + {% endfor %} + + {% endfor %} + {% if not forloop.last %} + + + + {% endif %} {% endfor %} - - - - {% for groupslot in day.slots.all %} - {% for slot in groupslot.slots %} - - - - - - {% for jury in slot.jurys %} - {% if forloop.counter0 < day.number_of_available_jurys %} - - {% endif %} - {% endfor %} - - {% endfor %} - {% if not forloop.last %} - - - - {% endif %} - {% endfor %} - - -
+ Heure d'arrivé + - Jury {{ forloop.counter }} -
- - -
+ Heure de début
+ Heure de fin + + Jury {{ forloop.counter }} +
+ + +
+
+ {{ slot.start|date:'H:i' }} + + {% if jury.available %} +
+ {% csrf_token %} + + + + + +
+ {% else %} + Reservé + {% endif %} +
--
- {{ slot.arrival|date:'H:i' }} - - {{ slot.start|date:'H:i' }} - - {{ slot.end|date:'H:i' }} - - {% if jury.available %} -
- {% csrf_token %} - - - - - -
- {% else %} - Reservé - {% endif %} -
--
-
+ + + + + {% endif %} {% endfor %} {% endif %}
diff --git a/teleforma/templates/teleforma/courses.html b/teleforma/templates/teleforma/courses.html index fdc2f599..573bc1b5 100644 --- a/teleforma/templates/teleforma/courses.html +++ b/teleforma/templates/teleforma/courses.html @@ -76,6 +76,13 @@ $(document).ready(function(){
+ {% if hasAppointment %} + +
+ {% endif %} + {% autoescape off %} {{ home_text }} {% endautoescape %} diff --git a/teleforma/views/appointment.py b/teleforma/views/appointment.py index 02fd1854..9aa24784 100644 --- a/teleforma/views/appointment.py +++ b/teleforma/views/appointment.py @@ -34,11 +34,12 @@ class Appointments(View): # Get info ap_periods = [] for ap_period in AppointmentPeriod.objects.filter(period=period_id).order_by('id'): - ap_periods.append({ - 'days':ap_period.days.all(), - 'name': ap_period.name, - 'appointment':ap_period.get_appointment(request.user) - }) + if ap_period.is_open: + ap_periods.append({ + 'days':ap_period.days.all(), + '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, 'period_id':period_id}) diff --git a/teleforma/views/core.py b/teleforma/views/core.py index a7cd04fd..50685136 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -71,6 +71,7 @@ from jsonrpc.proxy import ServiceProxy from teleforma.models import * from teleforma.forms import * +from teleforma.models.appointment import AppointmentPeriod from telemeta.views import * import jqchat.models from xlwt import Workbook @@ -296,6 +297,8 @@ class CourseListView(CourseAccessMixin, ListView): context['doc_types'] = DocumentType.objects.all() context['list_view'] = True context['courses'] = sorted(context['all_courses'], key=lambda k: k['date'], reverse=True)[:1] + context['hasAppointment'] = AppointmentPeriod.objects.filter(period=context['period']).count() + home = Home.objects.all() if home: home = home[0]