From c9f9871488749fb58e7e165f30e023ea37193870 Mon Sep 17 00:00:00 2001 From: yomguy Date: Wed, 22 Feb 2012 15:04:42 +0100 Subject: [PATCH] try instrument filter --- telemeta/models/media.py | 18 ++++++++ telemeta/models/query.py | 46 +++++++++++++++++++ .../templates/telemeta/search_criteria.html | 5 ++ .../templates/telemeta/search_results.html | 3 ++ telemeta/views/base.py | 3 ++ 5 files changed, 75 insertions(+) diff --git a/telemeta/models/media.py b/telemeta/models/media.py index ae1eb94d..a25929df 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -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" diff --git a/telemeta/models/query.py b/telemeta/models/query.py index 0583d081..df6d1778 100644 --- a/telemeta/models/query.py +++ b/telemeta/models/query.py @@ -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__ diff --git a/telemeta/templates/telemeta/search_criteria.html b/telemeta/templates/telemeta/search_criteria.html index 6885f9e8..d02bf43d 100644 --- a/telemeta/templates/telemeta/search_criteria.html +++ b/telemeta/templates/telemeta/search_criteria.html @@ -64,6 +64,11 @@ $(document).ready(function () {

+

+ + +

+