]> git.parisson.com Git - telemeta.git/commitdiff
get pattern search and title search working for corpus and fonds
authoryomguy <yomguy@parisson.com>
Tue, 7 Feb 2012 18:50:57 +0000 (19:50 +0100)
committeryomguy <yomguy@parisson.com>
Tue, 7 Feb 2012 18:50:57 +0000 (19:50 +0100)
telemeta/htdocs/css/indicator.gif [new file with mode: 0644]
telemeta/models/media.py
telemeta/models/query.py
telemeta/templates/telemeta/search_results.html
telemeta/urls.py
telemeta/views/base.py

diff --git a/telemeta/htdocs/css/indicator.gif b/telemeta/htdocs/css/indicator.gif
new file mode 100644 (file)
index 0000000..085ccae
Binary files /dev/null and b/telemeta/htdocs/css/indicator.gif differ
index 4d7ba39a852dc0cf3cb2c4a8c9d35eae1590bb72..d8039e7c4d8edb86c5eca16034a5cd5158e1bd0a 100644 (file)
@@ -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
index 00162d392199aee593857a4d64e6ec5c2142c98f..0583d081ccc7ce31b8484266e7ad605266711ad9 100644 (file)
@@ -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__
index ced7817178f6def1ae588ae6ad2c96ce9e0ef6ef..170c35281e8948f4c7126310252c6f01faa92d2d 100644 (file)
 {% endif %}
 
 {% ifequal type 'items' %}
-
-  <p><a href="{% url telemeta-search-collections %}?{{criteria|build_query_string}}">Collections ({{collections_num}})</a> | <b>Items ({{items_num}})</b></p>
-
+<p><b><a href="{% url telemeta-search-collections %}?{{criteria|build_query_string}}">Collections ({{collections_num}})</a> | Items ({{items_num}}) | <a href="{% url telemeta-search-corpus %}?{{criteria|build_query_string}}">Corpus ({{corpus_num}})</a> | <a href="{% url telemeta-search-fonds %}?{{criteria|build_query_string}}">Fonds ({{fonds_num}})</a></b></p>
   {% with object_list as items %}
    <div class="fullpage">
       {% include "telemeta/inc/mediaitem_list.html" %}
    </div>
   {% endwith %}    
-
-{% else %}
-
-  <p><b>Collections ({{collections_num}})</b> | <a href="{% url telemeta-search-items %}?{{criteria|build_query_string}}">Items ({{items_num}})</a>
-  </p>
-
+{% endifequal %}
+  
+{% ifequal type 'collections' %}
+<p><b>Collections ({{collections_num}}) | <a href="{% url telemeta-search-items %}?{{criteria|build_query_string}}">Items ({{items_num}})  | <a href="{% url telemeta-search-corpus %}?{{criteria|build_query_string}}">Corpus ({{corpus_num}})</a> | <a href="{% url telemeta-search-fonds %}?{{criteria|build_query_string}}">Fonds ({{fonds_num}})</a>
+  </b></p>
   {% with object_list as collections %}
    <div class="fullpage">
       {% include "telemeta/inc/collection_list.html" %}
    </div>
   {% endwith %}
-
 {% endifequal %}
 
+{% if type == 'fonds' %}
+<p><b><a href="{% url telemeta-search-collections %}?{{criteria|build_query_string}}">Collections ({{collections_num}})</a> | <a href="{% url telemeta-search-items %}?{{criteria|build_query_string}}">Items ({{items_num}})  | <a href="{% url telemeta-search-corpus %}?{{criteria|build_query_string}}">Corpus ({{corpus_num}})</a> | Fonds ({{fonds_num}})
+</b></p>
+{% endif %}
+
+{% if type == 'corpus' %}
+<p><b><a href="{% url telemeta-search-collections %}?{{criteria|build_query_string}}">Collections ({{collections_num}})</a> | <a href="{% url telemeta-search-items %}?{{criteria|build_query_string}}">Items ({{items_num}})</a> | Corpus ({{corpus_num}}) | <a href="{% url telemeta-search-fonds %}?{{criteria|build_query_string}}">Fonds ({{fonds_num}})</a>
+</b></p>
+{% endif %}
+
+{% if type == 'corpus' or type == 'fonds' %}
+{% with object_list as resources and type as type %}
+<div class="fullpage">
+{% include "telemeta/inc/resource_list.html" %}
+</div>
+{% endwith %}
+{% endif %}
+
+
 {% endblock %}
index 7d0c40962553a2a5c1c2467806900dafaa92187f..2d3666c4dbc65cbb2d12ad250bf79e868f7c5ca0 100644 (file)
@@ -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"),
 
index 20d4d641890b3ff9df8def57bebb14d6a34af787..be8d296da65043bcc6f75a416d70a9c58de10c56 100644 (file)
@@ -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