From: olivier <> Date: Thu, 6 Mar 2008 19:16:54 +0000 (+0000) Subject: add advanced search X-Git-Tag: 1.1~870 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=36220726530276c9a3155e53e35c70633e0a7ac1;p=telemeta.git add advanced search --- diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index ce49f135..89094c8c 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -30,7 +30,8 @@ a img { border: none; } #submenu { clear: right; float: right; padding-top: 1em; } #submenu a { color: #000066; } -#quick_search { position: absolute; top: 2em; right: 1em; } +#quick_search { position: absolute; top: 2em; right: 1em; text-align: right;} +#quick_search a { font-size: 80%; } #quick_search input { vertical-align: middle; font-size: 90%; diff --git a/telemeta/models.py b/telemeta/models.py index bc144ebf..c97ca7f9 100644 --- a/telemeta/models.py +++ b/telemeta/models.py @@ -9,6 +9,7 @@ from django.db.models import Manager, Model, Q, CharField, FileField, \ TextField, DecimalField, ForeignKey, DateField +from django.db.models.query import QuerySet from django.core.exceptions import ObjectDoesNotExist from django.core import validators from django.conf import settings @@ -82,13 +83,25 @@ class PublishingStatus(Model): class Meta: ordering = ['value'] verbose_name_plural = "Publishing status" - -class MediaCollectionManager(Manager): - "Manage collection queries" + +class CoreQuerySet(QuerySet): + "Base class for all query sets" + + def none(self): # redundant with none() in recent Django svn + "Return an empty result set" + return self.extra(where = ["0 = 1"]) + +class CoreManager(Manager): + "Base class for all models managers" + + def none(self, *args, **kwargs): + return self.get_query_set().none(*args, **kwargs) + +class MediaCollectionQuerySet(CoreQuerySet): def quick_search(self, pattern): "Perform a quick search on id, title and creator name" - return super(MediaCollectionManager, self).get_query_set().filter( + return self.filter( Q(id__icontains=pattern) | Q(title__icontains=pattern) | Q(creator__icontains=pattern) @@ -96,22 +109,58 @@ class MediaCollectionManager(Manager): def by_country(self, country): "Find collections by country" - qs = super(MediaCollectionManager, self).get_query_set() - return qs.extra(where = ["id IN (SELECT collection_id " + return self.extra(where = ["id IN (SELECT collection_id " "FROM telemeta_item WHERE etat = %s)"], params=[country]); + + def by_continent(self, continent): + "Find collections by continent" + return self.extra(where = ["id IN (SELECT collection_id " + "FROM telemeta_item WHERE continent = %s)"], + params=[continent]); + + def by_recording_date(self, pattern): + return self.filter(annee_enr__icontains=pattern) + + def by_publish_date(self, pattern): + return self.filter(date_published__icontains=pattern) + +class MediaCollectionManager(CoreManager): + "Manage collection queries" + + def get_query_set(self): + return MediaCollectionQuerySet(self.model) - def stat_continents(self): + def quick_search(self, *args, **kwargs): + return self.get_query_set().quick_search(*args, **kwargs) + + def by_country(self, *args, **kwargs): + return self.get_query_set().by_country(*args, **kwargs) + + def by_continent(self, *args, **kwargs): + return self.get_query_set().by_continent(*args, **kwargs) + + def by_recording_date(self, *args, **kwargs): + return self.get_query_set().by_recording_date(*args, **kwargs) + + def by_publish_date(self, *args, **kwargs): + return self.get_query_set().by_publish_date(*args, **kwargs) + + def stat_continents(self, order_by='num'): "Return the number of collections by continents and countries as a tree" from django.db import connection cursor = connection.cursor() + if order_by == 'num': + order_by = 'items_num DESC' + else: + order_by = 'etat' cursor.execute("SELECT continent, etat, count(*) AS items_num " "FROM telemeta_collection INNER JOIN telemeta_item " "ON telemeta_collection.id = telemeta_item.collection_id " "WHERE (continent IN " " ('EUROPE', 'OCEANIE', 'ASIE', 'AMERIQUE', 'AFRIQUE')) " "AND etat <> '' " - "GROUP BY etat ORDER BY continent, items_num desc;") + "GROUP BY etat ORDER BY continent, " + order_by) result_set = cursor.fetchall() stat = {} for continent, country, count in result_set: @@ -125,6 +174,31 @@ class MediaCollectionManager(Manager): ordered = [{'name': k, 'countries': stat[k]} for k in keys] return ordered + def list_countries(self): + "Return a 2D list of all countries with continents" + + from django.db import connection + cursor = connection.cursor() + + cursor.execute("SELECT continent, etat FROM telemeta_item " + "GROUP BY continent, etat ORDER BY REPLACE(etat, '\"', '')"); + return cursor.fetchall() + + def list_continents(self): + "Return a list of all continents" + + from django.db import connection + cursor = connection.cursor() + + cursor.execute("SELECT DISTINCT(continent) FROM telemeta_item ORDER BY continent") + result_set = cursor.fetchall() + result = [] + for a, in result_set: + if a != '' and a != 'N': # CREM fix + result.append(a) + + return result + class MediaCollection(Model, MediaCore): "Group related media items" @@ -216,22 +290,55 @@ class MediaCollection(Model, MediaCore): class Admin: pass -class MediaItemManager(Manager): - "Manage media items queries" - +class MediaItemQuerySet(CoreQuerySet): + def quick_search(self, pattern): "Perform a quick search on id and title" - return super(MediaItemManager, self).get_query_set().filter( + return self.filter( Q(id__icontains=pattern) | Q(_title__icontains=pattern) ) def without_collection(self): "Find items which do not belong to any collection" - qs = super(MediaItemManager, self).get_query_set() - return qs.extra( + return self.extra( where = ["collection_id NOT IN (SELECT id FROM telemeta_collection)"]); + def by_recording_date(self, pattern): + return self.filter(Q(dates_enregistr__icontains=pattern) + | Q(annee_enreg__icontains=pattern)) + +class MediaItemManager(CoreManager): + "Manage media items queries" + + def get_query_set(self): + return MediaItemQuerySet(self.model) + + def quick_search(self, *args, **kwargs): + return self.get_query_set().quick_search(*args, **kwargs) + + def without_collection(self, *args, **kwargs): + return self.get_query_set().without_collection(*args, **kwargs) + + def by_recording_date(self, *args, **kwargs): + return self.get_query_set().by_recording_date(*args, **kwargs) + + def list_ethnic_groups(self): + "Return a list of all ethnic groups" + + from django.db import connection + cursor = connection.cursor() + + cursor.execute("SELECT DISTINCT(ethnie_grsocial) FROM telemeta_item " + "ORDER BY REPLACE(ethnie_grsocial, '\\'', '')") + result_set = cursor.fetchall() + result = [] + for a, in result_set: + if a != '/' and a != '': # CREM fix + result.append(a) + + return result + class MediaItem(Model, MediaCore): "Describe an item with metadata" diff --git a/telemeta/templates/base.html b/telemeta/templates/base.html index fe689366..01cdb0d6 100644 --- a/telemeta/templates/base.html +++ b/telemeta/templates/base.html @@ -20,10 +20,11 @@