recrutement merge
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 21 Sep 2012 16:40:07 +0000 (12:40 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 21 Sep 2012 16:40:07 +0000 (12:40 -0400)
19 files changed:
buildout.cfg
project/menu.py
project/rh/admin.py
project/rh/test/common.py
project/settings.py
project/templates/actions.html
project/templates/index.html
project/urls.py
project/views.py
src/qbe/django_qbe/forms.py
src/qbe/django_qbe/locale/fr/LC_MESSAGES/django.mo [new file with mode: 0644]
src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.mo [new file with mode: 0644]
src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.po [new file with mode: 0644]
src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.mo [deleted file]
src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.po [deleted file]
src/qbe/django_qbe/static/django_qbe/css/qbe.css
src/qbe/django_qbe/static/django_qbe/js/qbe.core.js
src/qbe/django_qbe/templates/qbe.html
versions.cfg

index 96305af..03068a0 100644 (file)
@@ -9,6 +9,7 @@ parts = django
 find-links = http://pypi.auf.org/simple/auf.recipe.django/
     http://pypi.auf.org/simple/auf.django.skin/
     http://pypi.auf.org/simple/auf.django.auth/
+    http://pypi.auf.org/simple/auf.django.saml/
     http://pypi.auf.org/simple/auf.django.workflow/
     http://pypi.auf.org/simple/auf.django.admingroup/
     http://pypi.auf.org/simple/auf.django.permissions/
@@ -39,6 +40,7 @@ eggs =
     django-urldecorators
     auf.django.admingroup
     auf.django.auth
+    auf.django.saml
     auf.django.emploi
     auf.django.export
     auf.django.metadata
index 03e4c1a..ff84e67 100644 (file)
@@ -66,11 +66,8 @@ class CustomMenu(Menu):
                         items.MenuItem('Rapport des modifications',
                             reverse('rhr_historique_des_modifications')),
                         )
-            self.children += [
-                items.MenuItem('Rapports',
-                    children=rapports),
 
-                items.MenuItem('Organigrammes',
+            items_organigrammes = items.MenuItem('Organigrammes',
                     children=[
                         items.MenuItem('Organigramme par employé',
                             reverse('admin:rh_employeproxy_changelist')),
@@ -80,13 +77,22 @@ class CustomMenu(Menu):
                             reverse('admin:rh_implantationproxy_changelist')),
                         items.MenuItem('Organigramme par bureau',
                             reverse('admin:rh_regionproxy_changelist')),
-                        ]),
-                items.MenuItem('Requêtes',
+                        ])
+
+            items_rapports = items.MenuItem('Rapports', children=rapports)
+
+            items_requetes = items.MenuItem('Requêtes',
                     children=[
                         items.MenuItem('Requêtes sauvegardées',
                             reverse('admin:django_qbe_savedquery_changelist')),
                         items.MenuItem('Constructeur de requêtes',
                             reverse('qbe_form')),
-                        ]),
-            ]
+                        ])
+
+            children = [items_rapports, items_organigrammes, ]
+            if in_drh_or_admin(request.user):
+                children.append(items_requetes)
+
+            self.children += children
+
         super(CustomMenu, self).init_with_context(context)
index 6a90877..71679a8 100644 (file)
@@ -20,7 +20,8 @@ from project.rh import models as rh
 from project.permissions import user_gere_obj_de_sa_region, \
         user_can_add_obj, \
         user_can_change_obj, \
-        user_can_delete_obj
+        user_can_delete_obj, \
+        get_region_user
 
 from project.rh.forms import ContratForm, AyantDroitForm, EmployeAdminForm, \
         AjaxSelect, DossierForm, ResponsableInlineForm
@@ -133,25 +134,22 @@ class ProtectRegionMixin(object):
         if in_drh_or_admin(request.user):
             return qs
 
-        #if user_gere_obj_de_sa_region(request.user):
-        #    region_user = get_region_user(request.user)
-        #    q = Q(**{self.model.prefix_implantation: \
-        #            region_user})
-        #    qs = qs.filter(q).distinct()
-        #    return qs
+        if user_gere_obj_de_sa_region(request.user):
+            region_user = get_region_user(request.user)
+            q = Q(**{self.model.prefix_implantation: \
+                    region_user})
+            qs = qs.filter(q).distinct()
+            return qs
         return qs.none()
 
     def has_add_permission(self, request):
-        return in_drh_or_admin(request.user)
-        #return user_can_add_obj(request.user)
+        return user_can_add_obj(request.user)
 
     def has_change_permission(self, request, obj=None):
-        return in_drh_or_admin(request.user)
-        #return user_can_change_obj(request.user, obj) if obj else True
+        return user_can_change_obj(request.user, obj) if obj else True
 
     def has_delete_permission(self, request, obj=None):
-        return in_drh_or_admin(request.user)
-        #return user_can_delete_obj(request.user, obj) if obj else True
+        return user_can_delete_obj(request.user, obj) if obj else True
 
 
 class DerniereModificationAdmin(admin.ModelAdmin):
index fb238c3..643229e 100644 (file)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import datetime
+from auf.django.saml.settings import SAML_REDIRECT_FIELD_NAME
 from django.contrib.auth.models import User, Group
 from project import groups
 from auf.django.references import models as ref
@@ -284,7 +285,9 @@ class RhTest(TestCase):
 
     def _test_acces_ko(self, url):
         response = self.client.get(url, follow=True)
-        is_ko = response.status_code in (403, 404) or 'next' in response.context
+        is_ko = response.status_code in (403, 404) or \
+                'next' in response.context or \
+                SAML_REDIRECT_FIELD_NAME in response.context['request'].GET.keys()
         self.assertEqual(is_ko, True)
 
     def _test_anonyme(self):
index 8b16558..4459b14 100644 (file)
@@ -24,15 +24,18 @@ DATE_INPUT_FORMATS = ('%d-%m-%Y', )
 SESSION_SAVE_EVERY_REQUEST = True
 SESSION_EXPIRE_AT_BROWSER_CLOSE = True
 
+PROJECT_ROOT = os.path.dirname(__file__)
+SITE_ROOT = os.path.dirname(PROJECT_ROOT)
+
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media')
-PRIVE_MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media_prive')
+MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
+PRIVE_MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media_prive')
 
 STATICFILES_DIRS = (
-    os.path.join(os.path.dirname(__file__), 'assets'),
+    os.path.join(PROJECT_ROOT, 'assets'),
 )
-STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static')
+STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
 STATIC_URL = '/static/'
 
 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
@@ -55,6 +58,7 @@ MIDDLEWARE_CLASSES = (
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'auf.django.saml.middleware.SPMiddleware',
     'auf.django.piwik.middleware.TrackMiddleware',
     'django.middleware.doc.XViewMiddleware',
     'reversion.middleware.RevisionMiddleware',
@@ -70,6 +74,7 @@ INSTALLED_APPS = (
     'auf.django.workflow',
     'auf.django.permissions',
     'auf.django.emploi',
+    'auf.django.saml',
     'auf.django.export',
     'admin_tools',
     'admin_tools.theming',
@@ -109,11 +114,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
 )
 
 AUTHENTICATION_BACKENDS = (
-    'auf.django.auth.backends.CascadeBackend',
+    'auf.django.saml.backends.SPBackend',
     'auf.django.permissions.backends.AuthenticationBackend',
 )
-LOGIN_URL = "/connexion"
-LOGIN_REDIRECT_URL = "/"
 
 TEMPLATE_DIRS = (
     os.path.join(os.path.dirname(__file__), "templates"),
index cdc8f6d..2729fff 100644 (file)
@@ -1,11 +1,11 @@
+{% load saml %}
+
 <ul>
     {% if user.is_authenticated %}
-      <li class="username">{{ user }}</li>
+    <li class="username"><img src="{{ STATIC_URL }}/img/idauf_16.png" /> {{ user }}</li>
       {% if perms.recrutement or user_in_dae_groupes or perms.rh %}
         <li><a href="{% url admin:index %}">Administration</a></li>
       {% endif %}
-      <li><a href="{% url django.contrib.auth.views.logout %}?next=/">Déconnexion</a></li>
-    {% else %}
-      <li><a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Connexion</a></li>
+      <li><a href="{% mellon_logout_url %}">Déconnexion</a></li>
     {% endif %}
 </ul>
index 856a8b0..519d264 100644 (file)
@@ -6,31 +6,23 @@
 
 {% block main %}
 
-{% if not request.user.is_authenticated %}
-<h1>Connexion</h1>
+{% for k,v in meta.items %}
+<p>{{ k }} : {{ v }}</p>
+{% endfor %}
 
-    <form method="post" action="{% url django.contrib.auth.views.login %}">{% csrf_token %}
-        <table>
-        {{ form.as_table }}
-        </table>
-        <input type="submit" value="Se connecter" />
-        <input type="hidden" name="next" value="{{ next }}" />
-    </form>
+<h1>Vos droits d'accès</h1>
+{% if request.user.groups.all %}
+  <p>Vous faîtes partie des groupes suivants : </p>
+  <ul>
+      {% for g in request.user.groups.all %}
+      <li>{{ g.name }}</li>
+      {% endfor %}
+  </ul>
 {% else %}
-    <h1>Vos droits d'accès</h1>
-    {% if request.user.groups.all %}
-      <p>Vous faîtes partie des groupes suivants : </p>
-      <ul>
-          {% for g in request.user.groups.all %}
-          <li>{{ g.name }}</li>
-          {% endfor %}
-      </ul>
-    {% else %}
-      <p>
-      Vous n'avez actuellement aucun droit dans ce système.<br />
-      Contactez la DRH si vous croyez qu'il s'agit d'une erreur.
-      </p>
-    {% endif %}
+  <p>
+  Vous n'avez actuellement aucun droit dans ce système.<br />
+  Contactez la DRH si vous croyez qu'il s'agit d'une erreur.
+  </p>
 {% endif %}
 
 {% endblock %}
index 5334386..dd06a52 100644 (file)
@@ -4,6 +4,7 @@ from django.contrib import admin
 from urldecorators.defaults import patterns, include, url
 from urldecorators.defaults import handler500  # NOQA
 from auf.django import permissions
+from auf.django.saml import settings as saml_settings
 from project.monkey import patch_ajax_selects
 
 patch_ajax_selects()
@@ -13,28 +14,43 @@ permissions.autodiscover()
 
 urlpatterns = patterns(
     '',
-    url(r'^$', 'project.views.index', name='index'),
-    url(r'^admin_tools/', include('admin_tools.urls')),
+    url(r'^$', 'project.views.index', name='index',
+        decorators=['auf.django.saml.decorators.login_required']),
+
+    url(r'^', include('auf.django.saml.urls')),
+
+    url(r'^admin_tools/', include('admin_tools.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
     (r'^admin/', include(admin.site.urls)),
+
     url(r'^api/(?P<method>[a-z_-]+)/(?P<offre_id>\d+)/$',
         'project.recrutement.api.api', name='recrutement_api'),
     url(r'^api/(?P<method>[a-z_-]+)/$', 'project.recrutement.api.api',
         name='recrutement_api'),
-    (r'^connexion/$', 'django.contrib.auth.views.login'),
-    (r'^deconnexion/$', 'django.contrib.auth.views.logout'),
-    #url(r'^private_files/', include('private_files.urls')),
-    url(r'^captcha/', include('captcha.urls')),
-    (r'^ajax_select/', include('ajax_select.urls')),
-    (r'^tinymce/', include('tinymce.urls')),
-    url(r'^prive/(?P<filename>.*)$', 'project.views.piece'),
+
+    url(r'^captcha/', include('captcha.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
+    url(r'^ajax_select/', include('ajax_select.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
+    url(r'^tinymce/', include('tinymce.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
+    url(r'^prive/(?P<filename>.*)$', 'project.views.piece',
+        decorators=['auf.django.saml.decorators.login_required']),
 
     # apps
     url(r'^dae/', include('project.dae.urls'),
-        decorators=['django.contrib.auth.decorators.login_required']),
+        decorators=['auf.django.saml.decorators.login_required']),
     url(r'^recrutement/', include('project.recrutement.urls'),
-        decorators=['django.contrib.auth.decorators.login_required']),
+        decorators=['auf.django.saml.decorators.login_required']),
     url(r'^rh/', include('project.rh.urls'),
-        decorators=['django.contrib.auth.decorators.login_required']),
+        decorators=['auf.django.saml.decorators.login_required']),
 
-    url(r'^qbe/', include('django_qbe.urls')),
+    url(r'^qbe/', include('django_qbe.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
 )
+
+if not saml_settings.SAML_AUTH:
+    urlpatterns += patterns(
+        '',
+        (r'^', include('auf.django.saml.mellon_urls')),
+    )
index 7466549..fd83264 100644 (file)
@@ -4,8 +4,8 @@ import os
 from sendfile import sendfile
 
 from django.conf import settings
+from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
-from django.contrib.auth.views import login
 from django.http import Http404
 
 from project.decorators import redirect_interdiction
@@ -13,8 +13,10 @@ from project.rh import models as rh_models
 from project.dae import models as dae_models
 
 
+@login_required
 def index(request):
-    return login(request, template_name='index.html')
+    c = {}
+    return render(request, 'index.html', c)
 
 
 @login_required
index 620696b..d926cbb 100644 (file)
@@ -29,7 +29,15 @@ except AttributeError:
 SORT_CHOICES = (
     ("", ""),
     ("asc", _("Ascending")),
-    ("des", _("Descending")),
+    ("desc", _("Descending")),
+)
+
+STATUS_CHOICES = (
+    ("", "Tous"),
+    ("inactive", "Inactifs"),
+    ("active", "Actifs"),
+    ("futur", "Futurs"),
+    ("unknown", "Inconnus"),
 )
 
 
@@ -38,6 +46,8 @@ class QueryByExampleForm(forms.Form):
     model = forms.CharField(label=_("Model"))
     field = forms.CharField(label=_("Field"))
     criteria = forms.CharField(label=_("Criteria"), required=False)
+    status = forms.ChoiceField(label=_("Statut"), choices=STATUS_CHOICES,
+                             required=False)
     sort = forms.ChoiceField(label=_("Sort"), choices=SORT_CHOICES,
                              required=False)
 
@@ -59,6 +69,10 @@ class QueryByExampleForm(forms.Form):
             field_attr_class = "qbeFillFields enable:sort,%s" % criteria_names
         else:
             field_attr_class = "qbeFillFields enable:sort,criteria"
+        status_widget = forms.Select(attrs={'disabled': "disabled",
+                                          'class': 'hidden'},
+                                   choices=STATUS_CHOICES)
+        self.fields['status'].widget = status_widget
         field_widget = forms.Select(attrs={'class': field_attr_class})
         self.fields['field'].widget = field_widget
 
@@ -79,6 +93,7 @@ class BaseQueryByExampleFormSet(BaseFormSet):
     _selects = []
     _froms = []
     _wheres = []
+    _statuses = []
     _sorts = []
     _params = []
     _models = {}
@@ -120,7 +135,7 @@ class BaseQueryByExampleFormSet(BaseFormSet):
             # Don't bother validating the formset unless each form is valid on
             # its own
             return
-        selects, froms, wheres, sorts, params = self.get_query_parts()
+        selects, froms, wheres, sorts, params, statuses = self.get_query_parts()
         if not selects:
             validation_message = _(u"At least you must check a row to get.")
             raise forms.ValidationError, validation_message
@@ -129,6 +144,7 @@ class BaseQueryByExampleFormSet(BaseFormSet):
         self._wheres = wheres
         self._sorts = sorts
         self._params = params
+        self._statuses = statuses
 
     def translate_model_to_db_table(self, model_name):
         """
@@ -152,6 +168,7 @@ class BaseQueryByExampleFormSet(BaseFormSet):
         wheres = []
         sorts = []
         params = []
+        statuses = []
         app_model_labels = None
         lookup_cast = self._db_operations.lookup_cast
         qn = self._db_operations.quote_name
@@ -176,13 +193,20 @@ class BaseQueryByExampleFormSet(BaseFormSet):
             show = data["show"]
             criteria = data["criteria"]
             sort = data["sort"]
+            status = data["status"]
             db_field = u"%s.%s" % (qn(model), qn(field))
             operator, over = criteria
-            is_join = operator.lower() == 'join'
+            try:
+                is_join = operator.lower() == 'join'
+            except:
+                is_join = False
             if show and not is_join:
                 selects.append(db_field)
             if sort:
-                sorts.append(db_field)
+                sorts.append((db_field, sort))
+            if status:
+                statuses.append((model, status))
+            
             if all(criteria):
                 if is_join:
                     over_split = over.lower().rsplit(".", 1)
@@ -191,9 +215,14 @@ class BaseQueryByExampleFormSet(BaseFormSet):
                     
                     if model in self._models:
                         _field = self._models[model]._meta.get_field(field)
+                        try:
+                            _db_column = qn(_field.db_column)
+                        except:
+                            _db_column = qn(_field.attname)
+
                         join = u"%s.%s = %s.%s" \
                                % (join_model, join_field, qn(model),
-                                  qn(_field.db_column))
+                                  qn(_db_column))
                     else:
                         join = u"%s.%s = %s" \
                                % (join_model, join_field,
@@ -216,18 +245,40 @@ class BaseQueryByExampleFormSet(BaseFormSet):
                                      db_operator))
             if qn(model) not in froms and model in self._db_table_names:
                 froms.append(qn(model))
-        return selects, froms, wheres, sorts, params
+        return selects, froms, wheres, sorts, params, statuses
 
     def get_raw_query(self, limit=None, offset=None, count=False,
                       add_extra_ids=False, add_params=False):
+        qn = self._db_operations.quote_name
         if self._raw_query:
             return self._raw_query
         if self._sorts:
-            order_by = u"ORDER BY %s" % (", ".join(self._sorts))
+            order_by = u"ORDER BY %s" % (", ".join([" ".join(x) for x in self._sorts]))
         else:
             order_by = u""
-        if self._wheres:
-            wheres = u"WHERE %s" % (" AND ".join(self._wheres))
+        _my_wheres = self._wheres
+        if self._statuses:
+            for m, s in self._statuses:
+                # Test cas spécial: Pour état employé, vérifier via les dossiers.
+                if m == 'rh_employe':
+                    m = qn('rh_dossier')
+                    if m not in self._froms:
+                        self._froms.append(m)
+                        _my_wheres.append("`rh_employe`.`id` = `rh_dossier`.`employe`")
+                if s == "inactive":
+                    _my_wheres.append("%s.date_fin < DATE(NOW())" % m)
+                if s == "active":
+                    _my_wheres.append(
+                        "(((%s.`date_debut` <= DATE(NOW()) OR %s.`date_debut` IS NULL) AND %s.`date_fin` >= DATE(NOW())) OR "
+                        "((%s.`date_fin` >= DATE(NOW()) OR %s.`date_fin` IS NULL) AND %s.`date_debut` <= DATE(NOW())) OR "
+                        "(%s.`date_debut` <= DATE(NOW()) AND %s.`date_fin` >= DATE(NOW())))"
+                        % (m, m, m, m, m, m, m, m))
+                if s == "futur":
+                    _my_wheres.append("%s.date_debut > DATE(NOW())" % m)
+                if s == "unknown":
+                    _my_wheres.append("(%s.date_debut IS NULL AND %s.date_fin IS NULL)" % (m, m))
+        if _my_wheres:
+            wheres = u"WHERE %s" % (" AND ".join(_my_wheres))
         else:
             wheres = u""
         if count:
diff --git a/src/qbe/django_qbe/locale/fr/LC_MESSAGES/django.mo b/src/qbe/django_qbe/locale/fr/LC_MESSAGES/django.mo
new file mode 100644 (file)
index 0000000..991632a
Binary files /dev/null and b/src/qbe/django_qbe/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.mo b/src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.mo
new file mode 100644 (file)
index 0000000..991632a
Binary files /dev/null and b/src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.mo differ
diff --git a/src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.po b/src/qbe/django_qbe/locale/fr/fr_CA/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..f5e03eb
--- /dev/null
@@ -0,0 +1,219 @@
+# django-qbe FR translations
+# Copyright (C) 2011
+# This file is distributed under the same license as the django-qbe package.
+# Olivier Larchevêque <olivier.larcheveque@auf.org>, 2011
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-02 13:25+0000\n"
+"PO-Revision-Date: 2011-08-02 13:25+0000\n"
+"Last-Translator: Olivier Larchevêque <olivier.larcheveque@auf.org>\n"
+"Language-Team: Olivier Larchevêque <olivier.larcheveque@auf.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: forms.py:29
+msgid "Ascending"
+msgstr "Croissant"
+
+#: forms.py:30
+msgid "Descending"
+msgstr "Décroissant"
+
+#: forms.py:35 templates/qbe.html:48 templates/qbe.html.py:72
+msgid "Show"
+msgstr "Voir"
+
+#: forms.py:36 templates/qbe.html:49
+msgid "Model"
+msgstr "Modèle"
+
+#: forms.py:37 templates/qbe.html:50
+msgid "Field"
+msgstr "Champs"
+
+#: forms.py:38 templates/qbe.html:52
+msgid "Criteria"
+msgstr "Critère"
+
+#: forms.py:39 templates/qbe.html:51
+msgid "Sort"
+msgstr "Trier"
+
+#: forms.py:123
+msgid "At least you must check a row to get."
+msgstr "Sélectionner au moins une ligne à afficher."
+
+#: forms.py:320
+msgid "#"
+msgstr ""
+
+#: views.py:57 views.py:118 views.py:170
+msgid "Query by Example"
+msgstr "Constructeur de requêtes (QBE)"
+
+#: views.py:169
+msgid "Reports"
+msgstr "Rapports"
+
+#: widgets.py:10
+msgid "is equal to"
+msgstr "égal à"
+
+#: widgets.py:11
+msgid "contains"
+msgstr "contient"
+
+#: widgets.py:12
+msgid "matchs regex"
+msgstr "expression régulière"
+
+#: widgets.py:13
+msgid "starts with"
+msgstr "commence par"
+
+#: widgets.py:14
+msgid "ends with"
+msgstr "fini par"
+
+#: widgets.py:15
+msgid "is greater than"
+msgstr "est supérieur à"
+
+#: widgets.py:16
+msgid "is greater than or equal to"
+msgstr "est supérieur ou égal à"
+
+#: widgets.py:17
+msgid "is less than"
+msgstr "est inférieur à"
+
+#: widgets.py:18
+msgid "is less than or equal to"
+msgstr "est inférieur ou égal à"
+
+#: widgets.py:19
+msgid "(i) is equal to"
+msgstr "(i) est égal à"
+
+#: widgets.py:20
+msgid "(i) contains"
+msgstr "(i) contient"
+
+#: widgets.py:21
+msgid "(i) matchs regex"
+msgstr "(i) expression régulière"
+
+#: widgets.py:22
+msgid "(i) starts with"
+msgstr "(i) commence par"
+
+#: widgets.py:23
+msgid "(i) ends with"
+msgstr "(i) fini par"
+
+#: widgets.py:24
+msgid "joins to"
+msgstr "jointure sur"
+
+#: widgets.py:33
+msgid "Check this"
+msgstr ""
+
+#: templates/qbe.html:18 templates/qbe_results.html:9
+msgid "Home"
+msgstr "Accueil"
+
+#: templates/qbe.html:27
+msgid "Diagram"
+msgstr "Diagramme"
+
+#: templates/qbe.html:30
+msgid "Tabular"
+msgstr "Tables"
+
+#: templates/qbe.html:33 templates/qbe.html.py:96
+msgid "Models"
+msgstr "Modèles"
+
+#: templates/qbe.html:53
+msgid "Delete"
+msgstr "Supprimer"
+
+#: templates/qbe.html:72
+msgid "rows"
+msgstr "lignes"
+
+#: templates/qbe.html:74
+msgid "Auto complete"
+msgstr "Auto-complétion"
+
+#: templates/qbe.html:76
+msgid "Run"
+msgstr "Exécuter"
+
+#: templates/qbe.html:80
+msgid "Database"
+msgstr "Base de données"
+
+#: templates/qbe_results.html:9
+msgid "Results"
+msgstr "Résultats"
+
+#: templates/qbe_results.html:21
+#, fuzzy
+msgid "Showing all"
+msgstr "Tout afficher"
+
+#: templates/qbe_results.html:21 templates/qbe_results.html.py:23
+#: templates/qbe_results.html:82
+msgid "result"
+msgstr "résultat"
+
+#: templates/qbe_results.html:23
+msgid "Showing from"
+msgstr "Afficher de"
+
+#: templates/qbe_results.html:23
+msgid "to"
+msgstr "à"
+
+#: templates/qbe_results.html:23
+msgid "of"
+msgstr "de"
+
+#: templates/qbe_results.html:27
+msgid "show first ones"
+msgstr "Montrer les premiers résultats"
+
+#: templates/qbe_results.html:29
+msgid "show all"
+msgstr "Tout afficher"
+
+#: templates/qbe_results.html:31
+msgid "edit query"
+msgstr "Modifier la requête"
+
+#: templates/qbe_results.html:32
+msgid "view query"
+msgstr "Voir la requête"
+
+#: templates/qbe_results.html:36
+msgid "Save query as"
+msgstr "Sauvegarder la requête comme"
+
+#: templates/qbe_results.html:39
+msgid "Drag this yo your bookmarks bar to save this query"
+msgstr "Glisser le lien sur vos favoris pour sauvegarder la requête"
+
+#: templates/qbe_results.html:39
+msgid "bookmark"
+msgstr "favori"
+
+#: templates/qbe_results.html:43
+msgid "Export to"
+msgstr "Exporter en"
diff --git a/src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.mo b/src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.mo
deleted file mode 100644 (file)
index 991632a..0000000
Binary files a/src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.mo and /dev/null differ
diff --git a/src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.po b/src/qbe/django_qbe/locale/fr_CA/LC_MESSAGES/django.po
deleted file mode 100644 (file)
index f5e03eb..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-# django-qbe FR translations
-# Copyright (C) 2011
-# This file is distributed under the same license as the django-qbe package.
-# Olivier Larchevêque <olivier.larcheveque@auf.org>, 2011
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-08-02 13:25+0000\n"
-"PO-Revision-Date: 2011-08-02 13:25+0000\n"
-"Last-Translator: Olivier Larchevêque <olivier.larcheveque@auf.org>\n"
-"Language-Team: Olivier Larchevêque <olivier.larcheveque@auf.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: forms.py:29
-msgid "Ascending"
-msgstr "Croissant"
-
-#: forms.py:30
-msgid "Descending"
-msgstr "Décroissant"
-
-#: forms.py:35 templates/qbe.html:48 templates/qbe.html.py:72
-msgid "Show"
-msgstr "Voir"
-
-#: forms.py:36 templates/qbe.html:49
-msgid "Model"
-msgstr "Modèle"
-
-#: forms.py:37 templates/qbe.html:50
-msgid "Field"
-msgstr "Champs"
-
-#: forms.py:38 templates/qbe.html:52
-msgid "Criteria"
-msgstr "Critère"
-
-#: forms.py:39 templates/qbe.html:51
-msgid "Sort"
-msgstr "Trier"
-
-#: forms.py:123
-msgid "At least you must check a row to get."
-msgstr "Sélectionner au moins une ligne à afficher."
-
-#: forms.py:320
-msgid "#"
-msgstr ""
-
-#: views.py:57 views.py:118 views.py:170
-msgid "Query by Example"
-msgstr "Constructeur de requêtes (QBE)"
-
-#: views.py:169
-msgid "Reports"
-msgstr "Rapports"
-
-#: widgets.py:10
-msgid "is equal to"
-msgstr "égal à"
-
-#: widgets.py:11
-msgid "contains"
-msgstr "contient"
-
-#: widgets.py:12
-msgid "matchs regex"
-msgstr "expression régulière"
-
-#: widgets.py:13
-msgid "starts with"
-msgstr "commence par"
-
-#: widgets.py:14
-msgid "ends with"
-msgstr "fini par"
-
-#: widgets.py:15
-msgid "is greater than"
-msgstr "est supérieur à"
-
-#: widgets.py:16
-msgid "is greater than or equal to"
-msgstr "est supérieur ou égal à"
-
-#: widgets.py:17
-msgid "is less than"
-msgstr "est inférieur à"
-
-#: widgets.py:18
-msgid "is less than or equal to"
-msgstr "est inférieur ou égal à"
-
-#: widgets.py:19
-msgid "(i) is equal to"
-msgstr "(i) est égal à"
-
-#: widgets.py:20
-msgid "(i) contains"
-msgstr "(i) contient"
-
-#: widgets.py:21
-msgid "(i) matchs regex"
-msgstr "(i) expression régulière"
-
-#: widgets.py:22
-msgid "(i) starts with"
-msgstr "(i) commence par"
-
-#: widgets.py:23
-msgid "(i) ends with"
-msgstr "(i) fini par"
-
-#: widgets.py:24
-msgid "joins to"
-msgstr "jointure sur"
-
-#: widgets.py:33
-msgid "Check this"
-msgstr ""
-
-#: templates/qbe.html:18 templates/qbe_results.html:9
-msgid "Home"
-msgstr "Accueil"
-
-#: templates/qbe.html:27
-msgid "Diagram"
-msgstr "Diagramme"
-
-#: templates/qbe.html:30
-msgid "Tabular"
-msgstr "Tables"
-
-#: templates/qbe.html:33 templates/qbe.html.py:96
-msgid "Models"
-msgstr "Modèles"
-
-#: templates/qbe.html:53
-msgid "Delete"
-msgstr "Supprimer"
-
-#: templates/qbe.html:72
-msgid "rows"
-msgstr "lignes"
-
-#: templates/qbe.html:74
-msgid "Auto complete"
-msgstr "Auto-complétion"
-
-#: templates/qbe.html:76
-msgid "Run"
-msgstr "Exécuter"
-
-#: templates/qbe.html:80
-msgid "Database"
-msgstr "Base de données"
-
-#: templates/qbe_results.html:9
-msgid "Results"
-msgstr "Résultats"
-
-#: templates/qbe_results.html:21
-#, fuzzy
-msgid "Showing all"
-msgstr "Tout afficher"
-
-#: templates/qbe_results.html:21 templates/qbe_results.html.py:23
-#: templates/qbe_results.html:82
-msgid "result"
-msgstr "résultat"
-
-#: templates/qbe_results.html:23
-msgid "Showing from"
-msgstr "Afficher de"
-
-#: templates/qbe_results.html:23
-msgid "to"
-msgstr "à"
-
-#: templates/qbe_results.html:23
-msgid "of"
-msgstr "de"
-
-#: templates/qbe_results.html:27
-msgid "show first ones"
-msgstr "Montrer les premiers résultats"
-
-#: templates/qbe_results.html:29
-msgid "show all"
-msgstr "Tout afficher"
-
-#: templates/qbe_results.html:31
-msgid "edit query"
-msgstr "Modifier la requête"
-
-#: templates/qbe_results.html:32
-msgid "view query"
-msgstr "Voir la requête"
-
-#: templates/qbe_results.html:36
-msgid "Save query as"
-msgstr "Sauvegarder la requête comme"
-
-#: templates/qbe_results.html:39
-msgid "Drag this yo your bookmarks bar to save this query"
-msgstr "Glisser le lien sur vos favoris pour sauvegarder la requête"
-
-#: templates/qbe_results.html:39
-msgid "bookmark"
-msgstr "favori"
-
-#: templates/qbe_results.html:43
-msgid "Export to"
-msgstr "Exporter en"
index 7564825..ad8fb80 100644 (file)
@@ -166,3 +166,7 @@ input.qbeCheckModels {
     overflow: auto;
     margin-top: 10px;
 }
+
+.qbeTabular .hidden {
+       display: none;
+}
index 5f230bb..7ef17f5 100644 (file)
@@ -199,7 +199,8 @@ qbe.Core = function() {};
                         optFields.push(option);
                     }
                 }
-                $("#"+ domTo).html('<option value="">*</option>' + optPrimaries.join("") + optForeigns.join("") + optManies.join("") + optFields.join(""));
+                optEtat = '<option value="status">État</option>'
+                $("#"+ domTo).html('<option value="">*</option>' + optPrimaries.join("") + optForeigns.join("") + optManies.join("") + optFields.join("") + optEtat);
                 // We need to raise change event
                 $("#"+ domTo).change();
             }
@@ -216,11 +217,32 @@ qbe.Core = function() {};
             css = $(this).attr("class");
             cssSplit = css.split("enable:")
             inputs = cssSplit[cssSplit.length-1].split(",");
+            if (field == 'status') {
+                $("#"+ prefix + "-sort").attr("disabled", "disabled");
+                $("#"+ prefix + "-sort").val("");
+                $("#"+ prefix + "-criteria").attr("disabled", "disabled");
+                $("#"+ prefix + "-criteria").val("");
+                $("#"+ prefix + "-criteria").addClass("hidden");
+                $("#"+ prefix + "-criteria_0").attr("disabled", "disabled");
+                $("#"+ prefix + "-criteria_0").val("");
+                $("#"+ prefix + "-criteria_0").addClass("hidden");
+                $("#"+ prefix + "-criteria_1").attr("disabled", "disabled");
+                $("#"+ prefix + "-criteria_1").val("");
+                $("#"+ prefix + "-criteria_1").addClass("hidden");
+                $("#"+ prefix + "-status").removeClass("hidden");
+                $("#"+ prefix + "-status").removeAttr("disabled");
+
+            }
+            else {
+                $("#"+ prefix + "-status").val("");
+                $("#"+ prefix + "-status").addClass("hidden");
+
             for(var i=0; i<inputs.length; i++) {
                 input = inputs[i];
                 domTo = prefix +"-"+ input;
                 if (field) {
                     $("#"+ domTo).removeAttr("disabled");
+                    $("#"+ domTo).removeClass("hidden");
                 } else {
                     $("#"+ domTo).attr("disabled", "disabled");
                     $("#"+ domTo).val("");
@@ -262,6 +284,7 @@ qbe.Core = function() {};
                     }
                 }
             }
+            }
         };
 
         /**
index 99a54be..bb4763c 100644 (file)
@@ -60,7 +60,7 @@
                 <td>{{ form.model.errors }}{{ form.model }}</td>
                 <td>{{ form.field.errors }}{{ form.field }}</td>
                 <td>{{ form.sort.errors }}{{ form.sort }}</td>
-                <td>{{ form.criteria.errors }}{{ form.criteria }}</td>
+                <td>{{ form.criteria.errors }}{{ form.criteria }}{{ form.status }}</td>
                 <td class="delete"></td>
             </tr>
         {% endfor %}
index 0d0123d..8f2a18e 100644 (file)
@@ -77,3 +77,6 @@ raven = 2.0.4
 
 # Added by Buildout Versions at 2012-09-18 10:17:13.131666
 auf.django.piwik = 1.7
+
+# Added by Buildout Versions at 2012-09-19 14:46:17.866203
+auf.django.saml = 1.8