recorded_from_year = IntegerField(_('recording year (from)'))
recorded_to_year = IntegerField(_('recording year (until)'))
+ objects = MediaCorpusManager()
+
@property
def public_id(self):
return self.code
children = models.ManyToManyField(MediaCorpus, related_name="fonds", verbose_name=_('corpus'), blank=True, null=True)
+ objects = MediaFondsManager()
+
@property
def public_id(self):
return self.code
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__
{% 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 %}
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"),
"""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))),
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
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