'type', 'format', 'language', 'disciplines', 'thematiques',
'pays', 'regions', 'validated']
- search_fields = []
readonly_fields = []
list_filter = ('validated', 'server', 'listsets', 'pays', 'regions',
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]
# -*- 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
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
--- /dev/null
+{% 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>
+
+<label>
+<input type="checkbox" name="admin_search_description" value="1" {% if request.GET.admin_search_description %}checked="checked"{% endif %} />
+Description
+</label>
+
+<label>
+<input type="checkbox" name="admin_search_sujet" value="1" {% if request.GET.admin_search_sujet %}checked="checked"{% endif %} />
+Sujet
+</label>
+
+<label>
+<input type="checkbox" name="admin_search_auteur" value="1" {% if request.GET.admin_search_auteur %}checked="checked"{% endif %} />
+Auteur
+</label>
+
+<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 %}