Meilleure gestion des fuseaux horaires lors de l'ajout d'un événement.
authorEric Mc Sween <eric.mcsween@gmail.com>
Mon, 8 Nov 2010 22:55:01 +0000 (17:55 -0500)
committerEric Mc Sween <eric.mcsween@gmail.com>
Mon, 8 Nov 2010 22:55:01 +0000 (17:55 -0500)
*   Les fuseaux sont maintenant présentés en français
*   SEP essaie de deviner dans quel fuseau l'utilisateur se trouve et fait une
    présélection.

auf_savoirs_en_partage/media/css/global.css
auf_savoirs_en_partage/media/js/sep.js
auf_savoirs_en_partage/savoirs/admin.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/templates/chercheurs/chercheur_form.html
auf_savoirs_en_partage/templates/savoirs/evenement_ajout.html
buildout.cfg

index 94edfa7..356be78 100644 (file)
@@ -198,6 +198,7 @@ ul.actions { position: absolute; top: 15px; right: 20px; width: 240px; }
 
 
 .errorlist { color:red; margin: 0 }
+.errorlist li { list-style: none; }
 
 .publications_autre {border:1px solid #CCC; background:#FAFAFA; margin:10px; padding:10px; display:none;}
 
index 9d452c3..b9558dd 100644 (file)
-$(document).ready(function() {
-
-   //Register review form submition function
-    $("#show_publications").click(
-    function() 
-    { 
-      if($(".publications_autre").css('display') == 'none')
-        $(".publications_autre").show();
-      else
-        $(".publications_autre").hide();
-    
+(function() {
+
+    function getTimezoneName() {
+        tmSummer = new Date(Date.UTC(2005, 6, 30, 0, 0, 0, 0));
+        so = -1 * tmSummer.getTimezoneOffset();
+        tmWinter = new Date(Date.UTC(2005, 12, 30, 0, 0, 0, 0));
+        wo = -1 * tmWinter.getTimezoneOffset();
+
+        if (-660 == so && -660 == wo) return 'Pacific/Midway';
+        if (-600 == so && -600 == wo) return 'Pacific/Tahiti';
+        if (-570 == so && -570 == wo) return 'Pacific/Marquesas';
+        if (-540 == so && -600 == wo) return 'America/Adak';
+        if (-540 == so && -540 == wo) return 'Pacific/Gambier';
+        if (-480 == so && -540 == wo) return 'America/Anchorage';
+        if (-480 == so && -480 == wo) return 'Pacific/Pitcairn';
+        if (-420 == so && -480 == wo) return 'America/Vancouver';
+        if (-420 == so && -420 == wo) return 'America/Phoenix';
+        if (-360 == so && -420 == wo) return 'America/Edmonton';
+        if (-360 == so && -360 == wo) return 'America/Guatemala';
+        if (-360 == so && -300 == wo) return 'Pacific/Easter';
+        if (-300 == so && -360 == wo) return 'America/Winnipeg';
+        if (-300 == so && -300 == wo) return 'America/Bogota';
+        if (-240 == so && -300 == wo) return 'America/Montreal';
+        if (-240 == so && -240 == wo) return 'America/Caracas';
+        if (-240 == so && -180 == wo) return 'America/Santiago';
+        if (-180 == so && -240 == wo) return 'America/Moncton';
+        if (-180 == so && -180 == wo) return 'America/Montevideo';
+        if (-180 == so && -120 == wo) return 'America/Sao_Paulo';
+        if (-150 == so && -210 == wo) return 'America/St_Johns';
+        if (-120 == so && -180 == wo) return 'America/Godthab';
+        if (-120 == so && -120 == wo) return 'America/Noronha';
+        if (-60 == so && -60 == wo) return 'Atlantic/Cape_Verde';
+        if (0 == so && -60 == wo) return 'Atlantic/Azores';
+        if (0 == so && 0 == wo) return 'Africa/Casablanca';
+        if (60 == so && 0 == wo) return 'Europe/London';
+        if (60 == so && 60 == wo) return 'Africa/Algiers';
+        if (60 == so && 120 == wo) return 'Africa/Windhoek';
+        if (120 == so && 60 == wo) return 'Africa/Algiers';
+        if (120 == so && 120 == wo) return 'Africa/Harare';
+        if (180 == so && 120 == wo) return 'Africa/Cairo';
+        if (180 == so && 180 == wo) return 'Africa/Nairobi';
+        if (240 == so && 180 == wo) return 'Europe/Moscow';
+        if (240 == so && 240 == wo) return 'Asia/Dubai';
+        if (270 == so && 210 == wo) return 'Asia/Tehran';
+        if (270 == so && 270 == wo) return 'Asia/Kabul';
+        if (300 == so && 240 == wo) return 'Asia/Baku';
+        if (300 == so && 300 == wo) return 'Asia/Karachi';
+        if (330 == so && 330 == wo) return 'Asia/Kolkata';
+        if (345 == so && 345 == wo) return 'Asia/Kathmandu';
+        if (360 == so && 300 == wo) return 'Asia/Yekaterinburg';
+        if (360 == so && 360 == wo) return 'Asia/Colombo';
+        if (390 == so && 390 == wo) return 'Asia/Rangoon';
+        if (420 == so && 360 == wo) return 'Asia/Almaty';
+        if (420 == so && 420 == wo) return 'Asia/Bangkok';
+        if (480 == so && 420 == wo) return 'Asia/Krasnoyarsk';
+        if (480 == so && 480 == wo) return 'Australia/Perth';
+        if (540 == so && 480 == wo) return 'Asia/Irkutsk';
+        if (540 == so && 540 == wo) return 'Asia/Tokyo';
+        if (570 == so && 570 == wo) return 'Australia/Darwin';
+        if (570 == so && 630 == wo) return 'Australia/Adelaide';
+        if (600 == so && 540 == wo) return 'Asia/Yakutsk';
+        if (600 == so && 600 == wo) return 'Australia/Brisbane';
+        if (600 == so && 660 == wo) return 'Australia/Sydney';
+        if (630 == so && 660 == wo) return 'Australia/Lord_Howe';
+        if (660 == so && 600 == wo) return 'Asia/Vladivostok';
+        if (660 == so && 660 == wo) return 'Pacific/Guadalcanal';
+        if (690 == so && 690 == wo) return 'Pacific/Norfolk';
+        if (720 == so && 660 == wo) return 'Asia/Magadan';
+        if (720 == so && 720 == wo) return 'Pacific/Fiji';
+        if (720 == so && 780 == wo) return 'Pacific/Auckland';
+        if (765 == so && 825 == wo) return 'Pacific/Chatham';
+        if (780 == so && 780 == wo) return 'Pacific/Enderbury'
+        if (840 == so && 840 == wo) return 'Pacific/Kiritimati';
+        return 'GMT';
+    }
+
+    $(document).ready(function() {
+
+        //Register review form submition function
+        $("#show_publications").click(function() { 
+            if($(".publications_autre").css('display') == 'none') {
+                $(".publications_autre").show();
+            }
+            else {
+                $(".publications_autre").hide();
+            }
+        });
+
+        // Activer le datepicker sur les input de classe "date"
+        $.datepicker.setDefaults($.datepicker.regional['fr']);
+        $('input:text.date').datepicker();
+
+        // Sélectionner automatiquement le fuseau horaire
+        $('select[name=fuseau]').each(function() {
+            $(this).val(getTimezoneName())
+        })
+
     });
 
-    // Activer le datepicker sur les input de classe "date"
-    $.datepicker.setDefaults($.datepicker.regional['fr']);
-    $('input:text.date').datepicker();
-});
+})();
index be1414e..b4b792b 100644 (file)
@@ -212,6 +212,9 @@ admin.site.register(Actualite, ActualiteAdmin)
 
 
 class EvenementAdminForm(forms.ModelForm):
+    mots_cles = forms.CharField(label='Mots-clés', required=False)
+    lieu = forms.CharField(label='Lieu', required=False)
+
     class Meta:
         model = Evenement
 
index e09e6dc..2f885b0 100644 (file)
@@ -1,5 +1,6 @@
 # -*- encoding: utf-8 -*-
-import simplejson, uuid, datetime, caldav, vobject, uuid, random, operator
+import simplejson, uuid, datetime, caldav, vobject, uuid, random, operator, pytz
+from babel.dates import get_timezone_name
 from django.contrib.auth.models import User
 from django.db import models
 from django.db.models import Q, Max
@@ -124,13 +125,32 @@ class EvenementQuerySet(models.query.QuerySet, RandomQuerySetMixin):
             qs = qs.filter(titre__icontains=word)
         return qs
 
+def build_time_zone_choices():
+    fr_names = set()
+    tzones = []
+    now = datetime.datetime.now()
+    for tzname in pytz.common_timezones:
+        tz = pytz.timezone(tzname)
+        fr_name = get_timezone_name(tz, locale='fr_FR')
+        if fr_name in fr_names:
+            continue
+        fr_names.add(fr_name)
+        offset = tz.utcoffset(now)
+        seconds = offset.seconds + offset.days * 86400
+        (hours, minutes) = divmod(seconds // 60, 60)
+        offset_str = 'UTC%+d:%d' % (hours, minutes) if minutes else 'UTC%+d' % hours
+        tzones.append((seconds, tzname, '%s - %s' % (offset_str, fr_name)))
+    tzones.sort()
+    return [(tz[1], tz[2]) for tz in tzones]
+
 class Evenement(models.Model):
     TYPE_CHOICES = ((u'Colloque', u'Colloque'),
                     (u'Conférence', u'Conférence'),
                     (u'Appel à contribution', u'Appel à contribution'),
                     (u'Journée d\'étude', u'Journée d\'étude'),
                     (None, u'Autre'))
-                   
+    TIME_ZONE_CHOICES = build_time_zone_choices()
+
     uid = models.CharField(max_length = 255, default = str(uuid.uuid1()))
     approuve = models.BooleanField(default=False, verbose_name=u'approuvé')
     titre = models.CharField(max_length=255)
@@ -141,10 +161,10 @@ class Evenement(models.Model):
                                               blank=True, null=True)
     mots_cles = models.TextField('Mots-Clés', blank = True, null = True)
     type = models.CharField(max_length=255, choices=TYPE_CHOICES)
-    fuseau = TimeZoneField(verbose_name='fuseau horaire')
+    lieu = models.TextField()
     debut = models.DateTimeField(default = datetime.datetime.now)
     fin = models.DateTimeField(default = datetime.datetime.now)
-    lieu = models.TextField()
+    fuseau = models.CharField(max_length=100, choices=TIME_ZONE_CHOICES, verbose_name='fuseau horaire')
     description = models.TextField(blank = True, null = True)
     #fichiers = TODO?
     contact = models.TextField(blank = True, null = True)
index 8661808..09210d7 100644 (file)
@@ -1,11 +1,5 @@
 {% load form_tags %}
 
-<script>
-  $(function () {
-      $("#id_expertise").datetime({ userLang: 'fr' });
-      });
-</script>
-
 {% if forms.has_errors %}
 <span class="message">Votre fiche n'a pas été enregistrée. Veuillez remplir tous les champs obligatoires (*).</span>
 {% endif %}   
index dc482de..8c8f5b9 100644 (file)
@@ -1,34 +1,33 @@
 {% extends "container_base.html" %}
 
 {% block extra-script %}
-    {{ form.media.js }}
+{{ form.media.js }}
 {% endblock %}
 
 {% block extra-style %}
-    {{ form.media.css }}
+{{ form.media.css }}
 {% endblock %}
 
 {% block contenu %}
 
 <style>
-  div.boite-recherche { display: none !important; }
-  div#contenu { margin-top: 20px !important; }
-  div#results { margin-top: 15px; }
-  div.tabber { display: none; }
-  th { font-weight: normal; padding-right: 10px;}
-  input[type=text] { width: 250px; }
+    div.boite-recherche { display: none !important; }
+    div#contenu { margin-top: 20px !important; }
+    div#results { margin-top: 15px; }
+    div.tabber { display: none; }
+    th { font-weight: normal; padding-right: 10px;}
 </style>
 
 <div class="clearfix">
-  <h4>Soumettre un évènement</h4>
-  <div class="zone-texte">
-    <form method="POST">
-      <table class="form">
-        {{ form }}
-        <tr><td></td><td><input type="submit" value="Ajouter" /></td></tr>
-      </table>
-    </form>
-  </div>
+    <h4>Soumettre un évènement</h4>
+    <div class="contenu-wrapper">
+        <form method="POST">
+            <table class="form">
+                {% include "render_form.html" %}
+                <tr><td></td><td><input type="submit" value="Ajouter" /></td></tr>
+            </table>
+        </form>
+    </div>
 </div>
 
 {% endblock %}
index 9897e9d..a451485 100644 (file)
@@ -15,6 +15,7 @@ wsgi = true
 settings = production
 extra-paths = auf_savoirs_en_partage
 eggs = auf_references_client
+    babel
     caldav==0.1.4.3-auf
     chardet
     pytz