From: yomguy Date: Tue, 7 Feb 2012 18:50:57 +0000 (+0100) Subject: get pattern search and title search working for corpus and fonds X-Git-Tag: 1.3.10~15 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=2f57f0e26110ecd47e87458226c647f5b039e5bb;p=telemeta.git get pattern search and title search working for corpus and fonds --- diff --git a/telemeta/htdocs/css/indicator.gif b/telemeta/htdocs/css/indicator.gif new file mode 100644 index 00000000..085ccaec Binary files /dev/null and b/telemeta/htdocs/css/indicator.gif differ diff --git a/telemeta/models/media.py b/telemeta/models/media.py index 4d7ba39a..d8039e7c 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -638,6 +638,8 @@ class MediaCorpus(MediaBaseResource): recorded_from_year = IntegerField(_('recording year (from)')) recorded_to_year = IntegerField(_('recording year (until)')) + objects = MediaCorpusManager() + @property def public_id(self): return self.code @@ -656,6 +658,8 @@ class MediaFonds(MediaBaseResource): children = models.ManyToManyField(MediaCorpus, related_name="fonds", verbose_name=_('corpus'), blank=True, null=True) + objects = MediaFondsManager() + @property def public_id(self): return self.code diff --git a/telemeta/models/query.py b/telemeta/models/query.py index 00162d39..0583d081 100644 --- a/telemeta/models/query.py +++ b/telemeta/models/query.py @@ -417,27 +417,63 @@ class LocationManager(CoreManager): flatname_map.__doc__ = LocationQuerySet.flatname_map.__doc__ -class MediaResourceQuerySet(CoreQuerySet): +class MediaCorpusQuerySet(CoreQuerySet): "Base class for all media resource query sets" def quick_search(self, pattern): - "Perform a quick search on code, title and description" + "Perform a quick search on text and char fields" + from telemeta.models.media import MediaCorpus + mod = MediaCorpus() pattern = pattern.strip() + q = Q(code__contains=pattern) + fields = mod.to_dict() + keys = fields.keys() - q = ( Q(code__contains=pattern) | - word_search_q('title', pattern) | - word_search_q('description', pattern)) + for field in keys: + field_str = str(mod._meta.get_field(field)) + if 'CharField' in field_str or 'TextField' in field_str: + q = q | word_search_q(field, pattern) return self.filter(q) -class MediaResourceManager(CoreManager): +class MediaCorpusManager(CoreManager): "Manage media resource queries" def get_query_set(self): - "Return media query sets" - return MediaItemQuerySet(self.model) + "Return resource query sets" + return MediaCorpusQuerySet(self.model) + + def quick_search(self, *args, **kwargs): + return self.get_query_set().quick_search(*args, **kwargs) + quick_search.__doc__ = MediaCorpusQuerySet.quick_search.__doc__ + + +class MediaFondsQuerySet(CoreQuerySet): + "Base class for all media resource query sets" + + def quick_search(self, pattern): + "Perform a quick search on text and char fields" + from telemeta.models.media import MediaFonds + mod = MediaFonds() + pattern = pattern.strip() + q = Q(code__contains=pattern) + fields = mod.to_dict() + keys = fields.keys() + for field in keys: + field_str = str(mod._meta.get_field(field)) + if 'CharField' in field_str or 'TextField' in field_str: + q = q | word_search_q(field, pattern) + return self.filter(q) + + +class MediaFondsManager(CoreManager): + "Manage media resource queries" + + def get_query_set(self): + "Return resource query sets" + return MediaFondsQuerySet(self.model) def quick_search(self, *args, **kwargs): return self.get_query_set().quick_search(*args, **kwargs) - quick_search.__doc__ = MediaResourceQuerySet.quick_search.__doc__ + quick_search.__doc__ = MediaFondsQuerySet.quick_search.__doc__ diff --git a/telemeta/templates/telemeta/search_results.html b/telemeta/templates/telemeta/search_results.html index ced78171..170c3528 100644 --- a/telemeta/templates/telemeta/search_results.html +++ b/telemeta/templates/telemeta/search_results.html @@ -60,26 +60,41 @@ {% endif %} {% ifequal type 'items' %} - -

Collections ({{collections_num}}) | Items ({{items_num}})

- +

Collections ({{collections_num}}) | Items ({{items_num}}) | Corpus ({{corpus_num}}) | Fonds ({{fonds_num}})

{% with object_list as items %}
{% include "telemeta/inc/mediaitem_list.html" %}
{% endwith %} - -{% else %} - -

Collections ({{collections_num}}) | Items ({{items_num}}) -

- +{% endifequal %} + +{% ifequal type 'collections' %} +

Collections ({{collections_num}}) | Items ({{items_num}}) | Corpus ({{corpus_num}}) | Fonds ({{fonds_num}}) +

{% with object_list as collections %}
{% include "telemeta/inc/collection_list.html" %}
{% endwith %} - {% endifequal %} +{% if type == 'fonds' %} +

Collections ({{collections_num}}) | Items ({{items_num}}) | Corpus ({{corpus_num}}) | Fonds ({{fonds_num}}) +

+{% endif %} + +{% if type == 'corpus' %} +

Collections ({{collections_num}}) | Items ({{items_num}}) | Corpus ({{corpus_num}}) | Fonds ({{fonds_num}}) +

+{% endif %} + +{% if type == 'corpus' or type == 'fonds' %} +{% with object_list as resources and type as type %} +
+{% include "telemeta/inc/resource_list.html" %} +
+{% endwith %} +{% endif %} + + {% endblock %} diff --git a/telemeta/urls.py b/telemeta/urls.py index 7d0c4096..2d3666c4 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -196,6 +196,11 @@ urlpatterns = patterns('', name="telemeta-search-collections"), url(r'^search/items/$', general_view.search, {'type': 'items'}, name="telemeta-search-items"), + url(r'^search/corpus/$', general_view.search, {'type': 'corpus'}, + name="telemeta-search-corpus"), + url(r'^search/fonds/$', general_view.search, {'type': 'fonds'}, + name="telemeta-search-fonds"), + url(r'^search/criteria/$', general_view.edit_search, name="telemeta-search-criteria"), url(r'^complete_location/$', general_view.complete_location, name="telemeta-complete-location"), diff --git a/telemeta/views/base.py b/telemeta/views/base.py index 20d4d641..be8d296d 100644 --- a/telemeta/views/base.py +++ b/telemeta/views/base.py @@ -308,16 +308,23 @@ class GeneralView(object): """Perform a search through collections and items metadata""" collections = MediaCollection.objects.enriched() items = MediaItem.objects.enriched() + corpus = MediaCorpus.objects.all() + fonds = MediaFonds.objects.all() input = request.REQUEST criteria = {} switch = { 'pattern': lambda value: ( collections.quick_search(value), - items.quick_search(value)), + items.quick_search(value), + corpus.quick_search(value), + fonds.quick_search(value), + ), 'title': lambda value: ( collections.word_search('title', value), - items.by_title(value)), + items.by_title(value), + corpus.word_search('title', value), + fonds.word_search('title', value)), 'location': lambda value: ( collections.by_location(Location.objects.get(name=value)), items.by_location(Location.objects.get(name=value))), @@ -353,13 +360,24 @@ class GeneralView(object): if func and value and value != "0": try: res = func(value) - if len(res) > 2: + if len(res) > 4: + collections, items, corpus, fonds, value = res + elif len(res) == 4: + collections, items, corpus, fonds = res + elif len(res) == 3: collections, items, value = res + corpus = corpus.none() + fonds = fonds.none() else: collections, items = res + corpus = corpus.none() + fonds = fonds.none() + except ObjectDoesNotExist: collections = collections.none() items = items.none() + corpus = corpus.none() + fonds = fonds.none() criteria[key] = value @@ -371,13 +389,18 @@ class GeneralView(object): if type == 'items': objects = items - else: + elif type == 'collections': objects = collections + elif type == 'corpus': + objects = corpus + elif type == 'fonds': + objects = fonds return list_detail.object_list(request, objects, template_name='telemeta/search_results.html', paginate_by=20, extra_context={'criteria': criteria, 'collections_num': collections.count(), - 'items_num': items.count(), 'type' : type}) + 'items_num': items.count(), 'corpus_num': corpus.count(), 'fonds_num': fonds.count(), + 'type' : type,}) def complete_location(self, request, with_items=True): input = request.REQUEST