ajout calendrier de ladmin avec check sur les dates
authorolivier larcheveque <olivier.larcheveque@u-ol.(none)>
Thu, 28 Oct 2010 23:46:56 +0000 (19:46 -0400)
committerolivier larcheveque <olivier.larcheveque@u-ol.(none)>
Thu, 28 Oct 2010 23:46:56 +0000 (19:46 -0400)
auf_savoirs_en_partage/media/css/calendrier.css [new file with mode: 0644]
auf_savoirs_en_partage/media/js/calendrier.js [new file with mode: 0644]
auf_savoirs_en_partage/savoirs/admin.py
auf_savoirs_en_partage/savoirs/forms.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/templates/container_base.html
auf_savoirs_en_partage/templates/savoirs/evenement_ajout.html

diff --git a/auf_savoirs_en_partage/media/css/calendrier.css b/auf_savoirs_en_partage/media/css/calendrier.css
new file mode 100644 (file)
index 0000000..f9058b0
--- /dev/null
@@ -0,0 +1,7 @@
+.clockbox, .calendarbox {border: 1px solid #CDCDCD; background-color: #EEEEEE; padding:6px 12px;}
+.calendarbox th {padding:0}
+.clockbox, .calendarbox a {text-decoration: none;}
+.calendarnav-previous {float: left;}
+.calendarnav-next {float: right;}
+.vDateField {margin-left: 8px;}
+.vDateField, .vTimeField {width: 100px !important;}
diff --git a/auf_savoirs_en_partage/media/js/calendrier.js b/auf_savoirs_en_partage/media/js/calendrier.js
new file mode 100644 (file)
index 0000000..da8bcd1
--- /dev/null
@@ -0,0 +1,113 @@
+function customOpenCalendar(num) {
+    var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num)
+    var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num)
+    var inp = DateTimeShortcuts.calendarInputs[num];
+
+    // With no starting value, try to initialize it with calendar before
+    if (!inp.value) {
+        var before = num-1;
+        if (before >= 0) {
+            inp = DateTimeShortcuts.calendarInputs[before];
+            DateTimeShortcuts.calendarInputs[num].value = inp.value;
+        }
+    }
+
+    // Determine if the current value in the input has a valid date.
+    // If so, draw the calendar with that date's year and month.
+    if (inp.value) {
+        var date_parts = inp.value.split('-');
+        var year = date_parts[0];
+        var month = parseFloat(date_parts[1]);
+        if (year.match(/\d\d\d\d/) && month >= 1 && month <= 12) {
+       DateTimeShortcuts.calendars[num].drawDate(month, year);
+        }
+    }
+
+
+    // Recalculate the clockbox position
+    // is it left-to-right or right-to-left layout ?
+    if (getStyle(document.body,'direction')!='rtl') {
+        cal_box.style.left = findPosX(cal_link) + 17 + 'px';
+    }
+    else {
+        // since style's width is in em, it'd be tough to calculate
+        // px value of it. let's use an estimated px for now
+        // TODO: IE returns wrong value for findPosX when in rtl mode
+        //       (it returns as it was left aligned), needs to be fixed.
+        cal_box.style.left = findPosX(cal_link) - 180 + 'px';
+    }
+    cal_box.style.top = findPosY(cal_link) - 75 + 'px';
+
+    cal_box.style.display = 'block';
+    addEvent(window.document, 'click', function() { DateTimeShortcuts.dismissCalendar(num); return true; });
+}
+
+function customAddClock(inp) {
+        var num = DateTimeShortcuts.clockInputs.length;
+        DateTimeShortcuts.clockInputs[num] = inp;
+
+        // Shortcut links (clock icon and "Now" link)
+        var shortcuts_span = document.createElement('span');
+        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+        var now_link = document.createElement('a');
+        now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinuteSecond());");
+        now_link.appendChild(document.createTextNode(gettext('Now')));
+        var clock_link = document.createElement('a');
+        clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
+        clock_link.id = DateTimeShortcuts.clockLinkName + num;
+        quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock'));
+        shortcuts_span.appendChild(document.createTextNode('\240'));
+        shortcuts_span.appendChild(now_link);
+        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
+        shortcuts_span.appendChild(clock_link);
+
+        // Create clock link div
+        //
+        // Markup looks like:
+        // <div id="clockbox1" class="clockbox module">
+        //     <h2>Choose a time</h2>
+        //     <ul class="timelist">
+        //         <li><a href="#">Now</a></li>
+        //         <li><a href="#">Midnight</a></li>
+        //         <li><a href="#">6 a.m.</a></li>
+        //         <li><a href="#">Noon</a></li>
+        //     </ul>
+        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
+        // </div>
+
+        var clock_box = document.createElement('div');
+        clock_box.style.display = 'none';
+        clock_box.style.position = 'absolute';
+        clock_box.className = 'clockbox module';
+        clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
+        document.body.appendChild(clock_box);
+        addEvent(clock_box, 'click', DateTimeShortcuts.cancelEventPropagation);
+
+        quickElement('h2', clock_box, gettext('Choose a time'));
+        time_list = quickElement('ul', clock_box, '');
+        time_list.className = 'timelist';
+        quickElement("a", quickElement("li", time_list, ""), "6:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '06:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "7:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '07:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "8:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '08:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "9:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '09:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "10:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '10:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "11:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '11:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "12:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '12:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "13:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '13:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "14:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '14:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "15:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '15:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "16:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '16:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "17:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '17:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "18:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '18:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "19:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '19:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "20:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '20:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "21:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '21:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), "22:00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '22:00:00');")
+
+        cancel_p = quickElement('p', clock_box, '');
+        cancel_p.className = 'calendar-cancel';
+        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
+    }
+
+DateTimeShortcuts.addClock = customAddClock;
+DateTimeShortcuts.openCalendar = customOpenCalendar;
index 3695b64..36c8465 100644 (file)
@@ -251,7 +251,20 @@ class ActualiteAdmin(admin.ModelAdmin):
 admin.site.register(Actualite, ActualiteAdmin)
 
 
+class EvenementAdminForm(forms.ModelForm):
+    class Meta:
+        model = Evenement
+
+    def clean(self,):
+        cleaned_data = self.cleaned_data
+        debut = cleaned_data.get("debut")
+        fin = cleaned_data.get("fin")
+        if debut > fin:
+            raise forms.ValidationError("La date de fin ne doit pas être antérieure à la date de début")
+        return cleaned_data
+
 class EvenementAdmin(admin.ModelAdmin):
+    form = EvenementAdminForm
     list_filter = ('approuve',)
     list_display = ('titre', 'debut', 'fin', 'lieu', 'approuve')
     fields = ['titre',
index b126abd..5568cea 100644 (file)
@@ -1,9 +1,12 @@
 # -*- encoding: utf-8 -*-
-import re
+import re, datetime
 from django import forms
+from django.db import models
+from django.contrib.admin import widgets
 from datamaster_modeles.models import Thematique, Pays, Region
 from models import Evenement, Discipline, Record, Actualite
 from savoirs.lib.recherche import build_search_regexp
+from savoirs.admin import EvenementAdminForm
 
 # Formulaires de recherche
 
@@ -107,7 +110,16 @@ class EvenementSearchForm(forms.Form):
 
 ###
 
-class EvenementForm(forms.ModelForm):
+class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
+    class Media:
+        extends=True
+        js = ('js/calendrier.js', )
+        css = {'all' : ('css/calendrier.css', )}
+
+class EvenementForm(EvenementAdminForm):
+    debut = forms.DateTimeField(widget=FrontEndSplitDateTime)
+    fin = forms.DateTimeField(widget=FrontEndSplitDateTime)
+
     class Meta:
         model = Evenement
         exclude = ('approuve', 'uid')
index 4e4c7cb..28b6df4 100644 (file)
@@ -122,9 +122,15 @@ class Evenement(models.Model):
     def __unicode__(self,):
         return "[%s] %s" % (self.uid, self.titre)
 
+    def clean(self):
+        from django.core.exceptions import ValidationError
+        if self.debut > self.fin:
+            raise ValidationError('La date de fin ne doit pas être antérieure à la date de début')
+
     def save(self, *args, **kwargs):
         """Sauvegarde l'objet dans django et le synchronise avec caldav s'il a été
         approuvé"""
+        self.clean()
         self.update_vevent()
         super(Evenement, self).save(*args, **kwargs)
 
index a55a85a..6a9335f 100644 (file)
@@ -10,6 +10,8 @@
         <script type="text/javascript" src="{{ MEDIA_URL }}js/tabber.js"></script>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/pagination.js"></script>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/sep.js"></script>
+        {% block extra-script %}{% endblock %}
+
         <link href="{{ MEDIA_URL }}css/global.css" rel="stylesheet" type="text/css" />
         <link href="{{ MEDIA_URL }}css/tabber.css" rel="stylesheet" type="text/css" />
         <link rel="stylesheet" href="{{ MEDIA_URL }}js/jquery/css/smoothness/jquery-ui-1.8rc3.custom.css" type="text/css" media="all" />
@@ -21,6 +23,7 @@
             DD_belatedPNG.fix('.top, .bottom, #col-droite, #contenu, .resultats');
         </script>
         <![endif]-->
+        {% block extra-style %}{% endblock %}
     </head>
 
     <body>
index e89c572..8dc8ddf 100644 (file)
@@ -1,5 +1,15 @@
 {% extends "container_base.html" %}
 
+{% block extra-script %}
+    <script type="text/javascript" src="/admin/jsi18n/"></script>
+    <script type="text/javascript" src="/admin_media/js/core.js"></script>
+    {{ form.media.js }}
+{% endblock %}
+
+{% block extra-style %}
+    {{ form.media.css }}
+{% endblock %}
+
 {% block contenu %}
 
 <style>
   input[type=text] { width: 250px; }
 </style>
 
-<script>
-  $(function () {
-      $("#id_debut").datetime({ userLang: 'fr' });
-      $("#id_fin").datetime({ userLang: 'fr' });
-      });
-</script>
-
 <div class="clearfix">
   <h4>Soumettre un événement</h4>
   <div class="zone-texte">