]> git.parisson.com Git - teleforma.git/commitdiff
dev
authorYoan Le Clanche <yoan@ellington.pilotsystems.net>
Wed, 19 Sep 2018 12:10:44 +0000 (14:10 +0200)
committerYoan Le Clanche <yoan@ellington.pilotsystems.net>
Wed, 19 Sep 2018 12:10:44 +0000 (14:10 +0200)
teleforma/admin.py
teleforma/models/appointment.py
teleforma/templates/teleforma/appointments.html
teleforma/templates/teleforma/courses.html
teleforma/views/appointment.py
teleforma/views/core.py

index ab77126c97f262521a08cf8116bf71223cffe602..139c0b2737a7566a17c5f64cbcdcf8ffb9238c9c 100644 (file)
@@ -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)
index 252fb50589ea6cafac7f75bd17366d328d0fb243..49921dd2472afdc77bb9437a54ca0e68b6a6a3ff 100644 (file)
@@ -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
index 4ff23ab31fc626d0e1634cc1988cc1a9fb68a3c0..309247c33d9027c3f7e44c3fb2f93df14efb94dc 100644 (file)
                 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/>
index fdc2f599c315064832ce61506d1ee73d5f081661..573bc1b5f06613eef73e09137bbb545868c4cd63 100644 (file)
@@ -76,6 +76,13 @@ $(document).ready(function(){
 
 <div class="desk_center home">
 
+    {% if hasAppointment %}
+        <div class="appointment">
+            <a href="{% url teleforma-appointments period.id %}"><button>Rendez-vous individuels aux simulations du grand-oral</button></a>
+        </div>
+        <br/>
+    {% endif %}
+
     {% autoescape off %}
     {{ home_text }}
     {% endautoescape %}
index 02fd185456393785177834e098215fa90a1a98fc..9aa24784e170403264cf4f48e36fb83564ee28c7 100644 (file)
@@ -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})
index a7cd04fdb053d412e5443922b7cb1125dda6ba90..5068513693b6e73a03d046b87e793be8e914e03b 100644 (file)
@@ -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]