Recherche par mots-clés dans des champs donnés des ressources.
authorEric Mc Sween <eric.mcsween@gmail.com>
Fri, 5 Nov 2010 21:35:22 +0000 (17:35 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Fri, 5 Nov 2010 21:35:22 +0000 (17:35 -0400)
auf_savoirs_en_partage/savoirs/admin.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/templates/admin/savoirs/record/change_list.html [new file with mode: 0644]

index e24e915..be1414e 100644 (file)
@@ -89,7 +89,6 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
               'type', 'format', 'language', 'disciplines', 'thematiques',
               'pays', 'regions', 'validated']
 
-    search_fields = []
     readonly_fields = []
 
     list_filter = ('validated', 'server', 'listsets', 'pays', 'regions',
@@ -105,28 +104,26 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
     def __init__(self, *args, **kwargs):
         """Surcharge l'initialisation pour définir les champs de recherche dynamiquement,
         et les champs en lecture seule uniquement."""
-        self.search_fields = META.keys()
         self.readonly_fields = META.keys()
         self.readonly_fields.append('listsets')
         super(RecordAdmin, self).__init__(*args, **kwargs) 
 
-    # Fonctions pour présenter l'information
+    # Recherche par mots-clés
+
+    # Présentation de l'information
     
     def est_complet(self, obj):
-        """ """
         v = obj.est_complet()
         return '<img src="/admin_media/img/admin/icon-%s.gif" alt="%d"/>' % (('no','yes')[v], v)
     est_complet.allow_tags = True
     est_complet.short_description = u'complet'
     
     def uri_display(self, obj):
-        """ """
         return "<a target='_blank' href='%s'>%s</a>" % (obj.uri, obj.uri)
     uri_display.allow_tags = True
     uri_display.short_description = u'lien'
 
     def description_display(self, obj):
-        """ """
         max = 140
         if obj.description is not None and len(obj.description) > max:       
             return "%s..." % obj.description[:max]
index 81c3fc5..e09e6dc 100644 (file)
@@ -1,5 +1,5 @@
 # -*- encoding: utf-8 -*-
-import simplejson, uuid, datetime, caldav, vobject, uuid, random
+import simplejson, uuid, datetime, caldav, vobject, uuid, random, operator
 from django.contrib.auth.models import User
 from django.db import models
 from django.db.models import Q, Max
@@ -345,6 +345,42 @@ class RecordQuerySet(models.query.QuerySet, RandomQuerySetMixin):
         qs = qs.filter(Q(listsets__isnull=True) | Q(listsets__validated=True))
         return qs.distinct()
 
+    def filter(self, *args, **kwargs):
+        """Gère des filtres supplémentaires pour l'admin.
+           
+        C'est la seule façon que j'ai trouvée de contourner les mécanismes
+        de recherche de l'admin."""
+        search = kwargs.pop('admin_search', None)
+        search_titre = kwargs.pop('admin_search_titre', None)
+        search_sujet = kwargs.pop('admin_search_sujet', None)
+        search_description = kwargs.pop('admin_search_description', None)
+        search_auteur = kwargs.pop('admin_search_auteur', None)
+
+        if search:
+            qs = self
+            search_all = not (search_titre or search_description or search_sujet or search_auteur)
+            fields = []
+            if search_titre or search_all:
+                fields += ['title', 'alt_title']
+            if search_description or search_all:
+                fields += ['description', 'abstract']
+            if search_sujet or search_all:
+                fields += ['subject']
+            if search_auteur or search_all:
+                fields += ['creator', 'contributor']
+
+            for bit in search.split():
+                or_queries = [Q(**{field + '__icontains': bit}) for field in fields]
+                qs = qs.filter(reduce(operator.or_, or_queries))
+
+            if args or kwargs:
+                qs = super(RecordQuerySet, qs).filter(*args, **kwargs)
+            return qs
+        else:
+            return super(RecordQuerySet, self).filter(*args, **kwargs)
+
+
+
 class Record(models.Model):
     
     #fonctionnement interne
diff --git a/auf_savoirs_en_partage/templates/admin/savoirs/record/change_list.html b/auf_savoirs_en_partage/templates/admin/savoirs/record/change_list.html
new file mode 100644 (file)
index 0000000..b1e89f7
--- /dev/null
@@ -0,0 +1,40 @@
+{% extends "admin/change_list.html" %}
+{% load adminmedia %}
+{% load i18n %}
+
+{% block search %}
+<div id="toolbar"><form id="changelist-search" action="" method="get">
+<div><!-- DIV needed for valid HTML -->
+<label for="searchbar"><img src="{% admin_media_prefix %}img/admin/icon_searchbox.png" alt="Recherche" /></label>
+<input type="text" size="40" name="admin_search" value="{{ request.GET.admin_search }}" id="searchbar" />
+<label>
+<input type="checkbox" name="admin_search_titre" value="1" {% if request.GET.admin_search_titre %}checked="checked"{% endif %} />
+Titre
+</label>
+&nbsp;
+<label>
+<input type="checkbox" name="admin_search_description" value="1" {% if request.GET.admin_search_description %}checked="checked"{% endif %} />
+Description 
+</label>
+&nbsp;
+<label>
+<input type="checkbox" name="admin_search_sujet" value="1" {% if request.GET.admin_search_sujet %}checked="checked"{% endif %} />
+Sujet
+</label>
+&nbsp;
+<label>
+<input type="checkbox" name="admin_search_auteur" value="1" {% if request.GET.admin_search_auteur %}checked="checked"{% endif %} />
+Auteur
+</label>
+&nbsp;
+<input type="submit" value="Recherche" />
+{% if request.GET.admin_search %}
+<span class="small quiet">{% blocktrans count cl.result_count as counter %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?{% if cl.is_popup %}pop=1{% endif %}">{% blocktrans with cl.full_result_count as full_result_count %}{{ full_result_count }} total{% endblocktrans %}</a>)</span>
+{% endif %}
+{% for pair in cl.params.items %}
+    {% ifnotequal pair.0|slice:":6" "admin_" %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endifnotequal %}
+{% endfor %}
+</div>
+</form></div>
+<script type="text/javascript">document.getElementById("searchbar").focus();</script>
+{% endblock %}