From 2f57f0e26110ecd47e87458226c647f5b039e5bb Mon Sep 17 00:00:00 2001 From: yomguy Date: Tue, 7 Feb 2012 19:50:57 +0100 Subject: [PATCH] get pattern search and title search working for corpus and fonds --- telemeta/htdocs/css/indicator.gif | Bin 0 -> 1553 bytes telemeta/models/media.py | 4 ++ telemeta/models/query.py | 54 +++++++++++++++--- .../templates/telemeta/search_results.html | 35 ++++++++---- telemeta/urls.py | 5 ++ telemeta/views/base.py | 33 +++++++++-- 6 files changed, 107 insertions(+), 24 deletions(-) create mode 100644 telemeta/htdocs/css/indicator.gif diff --git a/telemeta/htdocs/css/indicator.gif b/telemeta/htdocs/css/indicator.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 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 -- 2.39.5