Recherche de ressources par type de document.
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.py
index cfca6e4..f24955d 100644 (file)
@@ -1,10 +1,15 @@
 # -*- encoding: utf-8 -*-
-import re
+import re, datetime
 from django import forms
+from django import db
 from django.db.models import Q
+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
+import settings
 
 # Modifications custom aux champs Django
 
@@ -12,35 +17,38 @@ class SEPDateField(forms.DateField):
     """Un champ de date avec des valeurs par défaut un peu modifiées."""
 
     def __init__(self, *args, **kwargs):
+        super(SEPDateField, self).__init__(self, *args, **kwargs)
 
         # La classe "date" active le datepicker dans sep.js
-        kwargs.setdefault('widget', forms.DateInput(*args, attrs={'class': 'date'}))
-
         # Nous recevons les dates en format français
-        kwargs.setdefault('input_formats', ['%d/%m/%Y'])
-
-        forms.DateField.__init__(self, *args, **kwargs)
+        format = '%d/%m/%Y'
+        self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
+        self.input_formats = [format,]
 
 # Formulaires de recherche
 
-class RechercheAvancee (forms.Form):
-    creator = forms.CharField (max_length=60, required=False, \
-            label = "Auteur ou contributeur") # + contributor
-    title = forms.CharField (max_length=100, required=False, \
-            label = "Titre") # + alt_title
-    description = forms.CharField (max_length=100, required=False, \
-            label = "Description ou résumé") # + abstract
-    subject = forms.CharField (max_length=100, required=False, label = "Sujet")
-    operator = forms.ChoiceField (choices = (('or', 'ou'), ('and', 'et')), label = "Operateur")
-    type = forms.CharField (initial='avancee', required=False, widget=forms.HiddenInput)
-
 class RecordSearchForm(forms.Form):
     """Formulaire de recherche pour les ressources."""
 
+    class TypeChoices(object):
+        
+        def __iter__(self):
+            """Génère dynamiquement les choix possibles pour la recherche par type."""
+            yield ('', '')
+            cursor = db.connection.cursor()
+            cursor.execute("SELECT DISTINCT REPLACE(REPLACE(type, ', PeerReviewed', ''), ', NonPeerReviewed', '') FROM savoirs_record")
+            for result in cursor.fetchall():
+                type = result[0].strip()
+                if type:
+                    yield (type, type)
+
+    TYPE_CHOICES = TypeChoices()
+
     q = forms.CharField(required=False, label="Mots-clés")
     auteur = forms.CharField(required=False, label="Auteur ou contributeur")
     titre = forms.CharField(required=False, label="Titre")
     sujet = forms.CharField(required=False, label="Sujet")
+    type = forms.ChoiceField(required=False, label="Type de document", choices = TYPE_CHOICES)
 
     def get_query_set(self):
         """Retourne l'ensemble des ressources qui correspondent aux valeurs
@@ -59,6 +67,9 @@ class RecordSearchForm(forms.Form):
             sujet = self.cleaned_data['sujet']
             if sujet:
                 records = records.search_sujet(sujet)
+            type = self.cleaned_data['type']
+            if type:
+                records = records.filter(type__icontains=type)
         return records
 
     def get_search_regexp(self):
@@ -140,7 +151,20 @@ class EvenementSearchForm(forms.Form):
 
 ###
 
-class EvenementForm(forms.ModelForm):
+class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
+    class Media:
+        extend=False
+        js = ("/jsi18n/",
+              settings.ADMIN_MEDIA_PREFIX + "js/core.js",
+              settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
+              settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.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')