]> git.parisson.com Git - telemeta.git/commitdiff
try instrument filter
authoryomguy <yomguy@parisson.com>
Wed, 22 Feb 2012 14:04:42 +0000 (15:04 +0100)
committeryomguy <yomguy@parisson.com>
Wed, 22 Feb 2012 14:04:42 +0000 (15:04 +0100)
telemeta/models/media.py
telemeta/models/query.py
telemeta/templates/telemeta/search_criteria.html
telemeta/templates/telemeta/search_results.html
telemeta/views/base.py

index ae1eb94d5e17c7d0901f2fce3b3c4e36a459897c..a25929dfb8af4b376db9d4516207b67f62e7fb72 100644 (file)
@@ -408,6 +408,24 @@ class MediaItem(MediaResource):
             title += ' ' + self.track
         return title
 
+    @property
+    def instruments(self):
+        "Return the instruments of the item"
+        instruments = []
+        performances = MediaItemPerformance.objects.filter(media_item=self)
+        for performance in performances:
+            instrument = performance.instrument
+            alias = performance.alias
+            if not instrument in instruments:
+                instruments.append(instrument)
+            if not alias in instruments:
+                instruments.append(alias)
+
+        instruments.sort(self.__name_cmp)
+        return instruments
+
+        instruments.verbose_name = _("instruments")
+
 
 class MediaItemRelated(MediaRelated):
     "Item related media"
index 0583d081ccc7ce31b8484266e7ad605266711ad9..df6d17787e95a7933804e3148c8e31f9acdbf12b 100644 (file)
@@ -200,6 +200,10 @@ class MediaItemQuerySet(CoreQuerySet):
     def sound(self):
         return self.filter(file__contains='/')
 
+    def by_instrument(self, instrument):
+        "Find items by instrument"
+        return self.filter(instruments__in=instrument)
+
 
 class MediaItemManager(CoreManager):
     "Manage media items queries"
@@ -244,6 +248,10 @@ class MediaItemManager(CoreManager):
         return self.get_query_set().sound(*args, **kwargs)
     sound.__doc__ = MediaItemQuerySet.sound.__doc__
 
+    def by_instrument(self, *args, **kwargs):
+        return self.get_query_set().by_instrument(*args, **kwargs)
+    by_instrument.__doc__ = MediaItemQuerySet.by_instrument.__doc__
+
 
 class MediaCollectionQuerySet(CoreQuerySet):
 
@@ -331,6 +339,10 @@ class MediaCollectionQuerySet(CoreQuerySet):
     def sound(self):
         return self.filter(items__file__contains='/').distinct()
 
+    def by_instrument(self, instrument):
+        "Find collections by instrument"
+        return self.filter(items__instruments__in=instrument).distinct()
+
 
 class MediaCollectionManager(CoreManager):
     "Manage collection queries"
@@ -375,6 +387,10 @@ class MediaCollectionManager(CoreManager):
         return self.get_query_set().sound(*args, **kwargs)
     sound.__doc__ = MediaCollectionQuerySet.sound.__doc__
 
+    def by_instrument(self, *args, **kwargs):
+        return self.get_query_set().by_instrument(*args, **kwargs)
+    by_instrument.__doc__ = MediaCollectionQuerySet.by_instrument.__doc__
+
 
 class LocationQuerySet(CoreQuerySet):
     __flatname_map = None
@@ -477,3 +493,33 @@ class MediaFondsManager(CoreManager):
     def quick_search(self, *args, **kwargs):
         return self.get_query_set().quick_search(*args, **kwargs)
     quick_search.__doc__ = MediaFondsQuerySet.quick_search.__doc__
+
+
+class InstrumentQuerySet(CoreQuerySet):
+    "Base class for all media instrument query sets"
+
+    def quick_search(self, pattern):
+        "Perform a quick search on text and char fields"
+        from telemeta.models.instrument import Instrument
+        mod = Instrument()
+        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 InstrumentManager(CoreManager):
+    "Manage instrument queries"
+
+    def get_query_set(self):
+        "Return instrument query sets"
+        return InstrumentQuerySet(self.model)
+
+    def quick_search(self, *args, **kwargs):
+        return self.get_query_set().quick_search(*args, **kwargs)
+    quick_search.__doc__ = InstrumentQuerySet.quick_search.__doc__
index 6885f9e8cfcc0d5661a638476251defa80056d80..d02bf43d356e596dbc80b388c8464395eb778e6a 100644 (file)
@@ -64,6 +64,11 @@ $(document).ready(function () {
     <input type="text" name="location" id="location" value="{{ criteria.location }}" />
     </p>
 
+    <p>
+    <label for="instrument">{% field_label "Instrument" %}</label>
+    <input type="text" name="instrument" id="instrument" />
+    </p>
+
     <p>
     <label for="ethnic_group">{% field_label "EthnicGroup" %}</label>
     <select id="ethnic_group" name="ethnic_group">
index b08d5c83eb8d47ce212b84db2afa19eb465e5d9e..5426898018ad20b82bedbedf7600a454cbd07ad9 100644 (file)
@@ -28,6 +28,9 @@
   {% if criteria.location %}
     <li><b>{% field_label "Location" %}:</b> {{criteria.location}}</li>
   {% endif %}
+  {% if criteria.instrument %}
+  <li><b>{% field_label "Instrument" %}:</b> {{criteria.instrument}}</li>
+  {% endif %}
   {% if criteria.ethnic_group %}
     <li><b>{% field_label "EthnicGroup" %}:</b> {{criteria.ethnic_group}}</li>
   {% endif %}
index 0f22a48212ba50b2afbe2bba7f50c95ae75c2851..994d21a96b33e362029b9f8887e8b949b7d0c0dd 100644 (file)
@@ -338,6 +338,9 @@ class GeneralView(object):
             'sound': lambda value: (
                 collections.sound(),
                 items.sound()),
+            'instrument': lambda value: (
+                collections.by_instrument(value),
+                items.by_instrument(value)),
         }
 
         for key, value in input.items():