telemeta.views.published module
# -*- coding: utf-8 -*- from telemeta.views.core import * class SearchViewPublished(ListView): """Perform a search through resources""" template_name='telemeta/search_results.html' paginate_by = 20 def get_queryset(self): input = self.request.GET self.criteria = {} self.type = None if 'type' in self.kwargs: self.type = self.kwargs['type'] self.collections = MediaCollection.objects.enriched() self.items = MediaItem.objects.enriched().filter(code__contains="_E_") self.corpus = MediaCorpus.objects.all() self.fonds = MediaFonds.objects.all() switch = { 'pattern': lambda value: ( self.collections.quick_search(value), self.items.quick_search(value), self.corpus.quick_search(value), self.fonds.quick_search(value), ), 'title': lambda value: ( self.collections.word_search('title', value), self.items.by_title(value), self.corpus.word_search('title', value), self.fonds.word_search('title', value)), 'location': lambda value: ( self.collections.by_location(Location.objects.get(name=value)), self.items.by_location(Location.objects.get(name=value))), 'continent': lambda value: ( self.collections.by_continent(value), self.items.filter(continent = value)), 'ethnic_group': lambda value: ( self.collections.by_ethnic_group(value), self.items.filter(ethnic_group = value), EthnicGroup.objects.get(pk=value)), 'creator': lambda value: ( self.collections.word_search('creator', value), self.items.word_search('collection__creator', value)), 'collector': lambda value: ( self.collections.by_fuzzy_collector(value), self.items.by_fuzzy_collector(value)), 'rec_year_from': lambda value: ( self.collections.by_recording_year(int(value), int(input.get('rec_year_to', value))), self.items.by_recording_date(datetime.date(int(value), 1, 1), datetime.date(int(input.get('rec_year_to', value)), 12, 31))), 'rec_year_to': lambda value: (self.collections, self.items), 'pub_year_from': lambda value: ( self.collections.by_publish_year(int(value), int(input.get('pub_year_to', value))), self.items.by_publish_year(int(value), int(input.get('pub_year_to', value)))), 'pub_year_to': lambda value: (self.collections, self.items), 'sound': lambda value: ( self.collections.sound(), self.items.sound()), 'instrument': lambda value: ( self.collections.by_instrument(value), self.items.by_instrument(value)), } for key, value in input.items(): func = switch.get(key) if func and value and value != "0": try: res = func(value) if len(res) > 4: self.collections, self.items, self.corpus, self.fonds, value = res elif len(res) == 4: self.collections, self.items, self.corpus, self.fonds = res elif len(res) == 3: self.collections, self.items, value = res self.corpus = self.corpus.none() self.fonds = self.fonds.none() else: self.collections, self.items = res self.corpus = self.corpus.none() self.fonds = self.fonds.none() except ObjectDoesNotExist: self.collections = self.collections.none() self.items = self.items.none() self.corpus = self.corpus.none() self.fonds = self.fonds.none() self.criteria[key] = value # Save the search user = self.request.user if user: if user.is_authenticated(): search = Search(username=user) search.save() if self.criteria: for key in self.criteria.keys(): value = self.criteria[key] if key == 'ethnic_group': try: group = EthnicGroup.objects.get(value=value) value = group.id except: value = '' criter = Criteria(key=key, value=value) criter.save() search.criteria.add(criter) search.save() if self.type is None: if self.collections.count(): self.type = 'collections' else: self.type = 'items' if self.type == 'items': objects = self.items elif self.type == 'collections': objects = self.collections elif self.type == 'corpus': objects = self.corpus elif self.type == 'fonds': objects = self.fonds self.objects = objects return objects def get_context_data(self, *args, **kwargs): context = super(SearchView, self).get_context_data(*args, **kwargs) context['criteria'] = self.criteria context['collections_num'] = self.collections.count() context['items_num'] = self.items.count() context['corpus_num'] = self.corpus.count() context['fonds_num'] = self.fonds.count() context['type'] = self.type context['count'] = self.object_list.count() return context
Module variables
var ITEM_PUBLIC_ACCESS_CHOICES
var ITEM_TRANSODING_STATUS
var PUBLIC_ACCESS_CHOICES
var SCOPE_CHOICES
var TYPE_CHOICES
var app_name
var code_linesep
var collection_code_regex
var collection_published_code_regex
var collection_unpublished_code_regex
var default_decoding
var default_encoding
var engine
var eol
var ext
var item_code_regex
var item_published_code_regex
var item_unpublished_code_regex
var mime_type
var mods
var private_extra_types
var public_extra_types
var resource_code_regex
var strict_code
Classes
class SearchViewPublished
Perform a search through resources
class SearchViewPublished(ListView): """Perform a search through resources""" template_name='telemeta/search_results.html' paginate_by = 20 def get_queryset(self): input = self.request.GET self.criteria = {} self.type = None if 'type' in self.kwargs: self.type = self.kwargs['type'] self.collections = MediaCollection.objects.enriched() self.items = MediaItem.objects.enriched().filter(code__contains="_E_") self.corpus = MediaCorpus.objects.all() self.fonds = MediaFonds.objects.all() switch = { 'pattern': lambda value: ( self.collections.quick_search(value), self.items.quick_search(value), self.corpus.quick_search(value), self.fonds.quick_search(value), ), 'title': lambda value: ( self.collections.word_search('title', value), self.items.by_title(value), self.corpus.word_search('title', value), self.fonds.word_search('title', value)), 'location': lambda value: ( self.collections.by_location(Location.objects.get(name=value)), self.items.by_location(Location.objects.get(name=value))), 'continent': lambda value: ( self.collections.by_continent(value), self.items.filter(continent = value)), 'ethnic_group': lambda value: ( self.collections.by_ethnic_group(value), self.items.filter(ethnic_group = value), EthnicGroup.objects.get(pk=value)), 'creator': lambda value: ( self.collections.word_search('creator', value), self.items.word_search('collection__creator', value)), 'collector': lambda value: ( self.collections.by_fuzzy_collector(value), self.items.by_fuzzy_collector(value)), 'rec_year_from': lambda value: ( self.collections.by_recording_year(int(value), int(input.get('rec_year_to', value))), self.items.by_recording_date(datetime.date(int(value), 1, 1), datetime.date(int(input.get('rec_year_to', value)), 12, 31))), 'rec_year_to': lambda value: (self.collections, self.items), 'pub_year_from': lambda value: ( self.collections.by_publish_year(int(value), int(input.get('pub_year_to', value))), self.items.by_publish_year(int(value), int(input.get('pub_year_to', value)))), 'pub_year_to': lambda value: (self.collections, self.items), 'sound': lambda value: ( self.collections.sound(), self.items.sound()), 'instrument': lambda value: ( self.collections.by_instrument(value), self.items.by_instrument(value)), } for key, value in input.items(): func = switch.get(key) if func and value and value != "0": try: res = func(value) if len(res) > 4: self.collections, self.items, self.corpus, self.fonds, value = res elif len(res) == 4: self.collections, self.items, self.corpus, self.fonds = res elif len(res) == 3: self.collections, self.items, value = res self.corpus = self.corpus.none() self.fonds = self.fonds.none() else: self.collections, self.items = res self.corpus = self.corpus.none() self.fonds = self.fonds.none() except ObjectDoesNotExist: self.collections = self.collections.none() self.items = self.items.none() self.corpus = self.corpus.none() self.fonds = self.fonds.none() self.criteria[key] = value # Save the search user = self.request.user if user: if user.is_authenticated(): search = Search(username=user) search.save() if self.criteria: for key in self.criteria.keys(): value = self.criteria[key] if key == 'ethnic_group': try: group = EthnicGroup.objects.get(value=value) value = group.id except: value = '' criter = Criteria(key=key, value=value) criter.save() search.criteria.add(criter) search.save() if self.type is None: if self.collections.count(): self.type = 'collections' else: self.type = 'items' if self.type == 'items': objects = self.items elif self.type == 'collections': objects = self.collections elif self.type == 'corpus': objects = self.corpus elif self.type == 'fonds': objects = self.fonds self.objects = objects return objects def get_context_data(self, *args, **kwargs): context = super(SearchView, self).get_context_data(*args, **kwargs) context['criteria'] = self.criteria context['collections_num'] = self.collections.count() context['items_num'] = self.items.count() context['corpus_num'] = self.corpus.count() context['fonds_num'] = self.fonds.count() context['type'] = self.type context['count'] = self.object_list.count() return context
Ancestors (in MRO)
- SearchViewPublished
- django.views.generic.list.ListView
- django.views.generic.list.MultipleObjectTemplateResponseMixin
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.list.BaseListView
- django.views.generic.list.MultipleObjectMixin
- django.views.generic.base.ContextMixin
- django.views.generic.base.View
- __builtin__.object
Class variables
var allow_empty
var content_type
var context_object_name
var http_method_names
var model
var page_kwarg
var paginate_by
var paginate_orphans
var paginator_class
var queryset
var response_class
var template_name
var template_name_suffix
Methods
def __init__(
self, **kwargs)
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
def __init__(self, **kwargs): """ Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things. """ # Go through keyword arguments, and either save their values to our # instance, or raise an error. for key, value in six.iteritems(kwargs): setattr(self, key, value)
def as_view(
cls, **initkwargs)
Main entry point for a request-response process.
@classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """ # sanitize keyword arguments for key in initkwargs: if key in cls.http_method_names: raise TypeError("You tried to pass in the %s method name as a " "keyword argument to %s(). Don't do that." % (key, cls.__name__)) if not hasattr(cls, key): raise TypeError("%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs return self.dispatch(request, *args, **kwargs) # take name and docstring from class update_wrapper(view, cls, updated=()) # and possible attributes set by decorators # like csrf_exempt from dispatch update_wrapper(view, cls.dispatch, assigned=()) return view
def dispatch(
self, request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs)
def get(
self, request, *args, **kwargs)
def get(self, request, *args, **kwargs): self.object_list = self.get_queryset() allow_empty = self.get_allow_empty() if not allow_empty: # When pagination is enabled and object_list is a queryset, # it's better to do a cheap query than to load the unpaginated # queryset in memory. if (self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists')): is_empty = not self.object_list.exists() else: is_empty = len(self.object_list) == 0 if is_empty: raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {'class_name': self.__class__.__name__}) context = self.get_context_data() return self.render_to_response(context)
def get_allow_empty(
self)
Returns True
if the view should display empty lists, and False
if a 404 should be raised instead.
def get_allow_empty(self): """ Returns ``True`` if the view should display empty lists, and ``False`` if a 404 should be raised instead. """ return self.allow_empty
def get_context_data(
self, *args, **kwargs)
def get_context_data(self, *args, **kwargs): context = super(SearchView, self).get_context_data(*args, **kwargs) context['criteria'] = self.criteria context['collections_num'] = self.collections.count() context['items_num'] = self.items.count() context['corpus_num'] = self.corpus.count() context['fonds_num'] = self.fonds.count() context['type'] = self.type context['count'] = self.object_list.count() return context
def get_context_object_name(
self, object_list)
Get the name of the item to be used in the context.
def get_context_object_name(self, object_list): """ Get the name of the item to be used in the context. """ if self.context_object_name: return self.context_object_name elif hasattr(object_list, 'model'): return '%s_list' % object_list.model._meta.model_name else: return None
def get_paginate_by(
self, queryset)
Get the number of items to paginate by, or None
for no pagination.
def get_paginate_by(self, queryset): """ Get the number of items to paginate by, or ``None`` for no pagination. """ return self.paginate_by
def get_paginate_orphans(
self)
Returns the maximum number of orphans extend the last page by when paginating.
def get_paginate_orphans(self): """ Returns the maximum number of orphans extend the last page by when paginating. """ return self.paginate_orphans
def get_paginator(
self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs)
Return an instance of the paginator for this view.
def get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs): """ Return an instance of the paginator for this view. """ return self.paginator_class( queryset, per_page, orphans=orphans, allow_empty_first_page=allow_empty_first_page, **kwargs)
def get_queryset(
self)
def get_queryset(self): input = self.request.GET self.criteria = {} self.type = None if 'type' in self.kwargs: self.type = self.kwargs['type'] self.collections = MediaCollection.objects.enriched() self.items = MediaItem.objects.enriched().filter(code__contains="_E_") self.corpus = MediaCorpus.objects.all() self.fonds = MediaFonds.objects.all() switch = { 'pattern': lambda value: ( self.collections.quick_search(value), self.items.quick_search(value), self.corpus.quick_search(value), self.fonds.quick_search(value), ), 'title': lambda value: ( self.collections.word_search('title', value), self.items.by_title(value), self.corpus.word_search('title', value), self.fonds.word_search('title', value)), 'location': lambda value: ( self.collections.by_location(Location.objects.get(name=value)), self.items.by_location(Location.objects.get(name=value))), 'continent': lambda value: ( self.collections.by_continent(value), self.items.filter(continent = value)), 'ethnic_group': lambda value: ( self.collections.by_ethnic_group(value), self.items.filter(ethnic_group = value), EthnicGroup.objects.get(pk=value)), 'creator': lambda value: ( self.collections.word_search('creator', value), self.items.word_search('collection__creator', value)), 'collector': lambda value: ( self.collections.by_fuzzy_collector(value), self.items.by_fuzzy_collector(value)), 'rec_year_from': lambda value: ( self.collections.by_recording_year(int(value), int(input.get('rec_year_to', value))), self.items.by_recording_date(datetime.date(int(value), 1, 1), datetime.date(int(input.get('rec_year_to', value)), 12, 31))), 'rec_year_to': lambda value: (self.collections, self.items), 'pub_year_from': lambda value: ( self.collections.by_publish_year(int(value), int(input.get('pub_year_to', value))), self.items.by_publish_year(int(value), int(input.get('pub_year_to', value)))), 'pub_year_to': lambda value: (self.collections, self.items), 'sound': lambda value: ( self.collections.sound(), self.items.sound()), 'instrument': lambda value: ( self.collections.by_instrument(value), self.items.by_instrument(value)), } for key, value in input.items(): func = switch.get(key) if func and value and value != "0": try: res = func(value) if len(res) > 4: self.collections, self.items, self.corpus, self.fonds, value = res elif len(res) == 4: self.collections, self.items, self.corpus, self.fonds = res elif len(res) == 3: self.collections, self.items, value = res self.corpus = self.corpus.none() self.fonds = self.fonds.none() else: self.collections, self.items = res self.corpus = self.corpus.none() self.fonds = self.fonds.none() except ObjectDoesNotExist: self.collections = self.collections.none() self.items = self.items.none() self.corpus = self.corpus.none() self.fonds = self.fonds.none() self.criteria[key] = value # Save the search user = self.request.user if user: if user.is_authenticated(): search = Search(username=user) search.save() if self.criteria: for key in self.criteria.keys(): value = self.criteria[key] if key == 'ethnic_group': try: group = EthnicGroup.objects.get(value=value) value = group.id except: value = '' criter = Criteria(key=key, value=value) criter.save() search.criteria.add(criter) search.save() if self.type is None: if self.collections.count(): self.type = 'collections' else: self.type = 'items' if self.type == 'items': objects = self.items elif self.type == 'collections': objects = self.collections elif self.type == 'corpus': objects = self.corpus elif self.type == 'fonds': objects = self.fonds self.objects = objects return objects
def get_template_names(
self)
Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response is overridden.
def get_template_names(self): """ Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response is overridden. """ try: names = super(MultipleObjectTemplateResponseMixin, self).get_template_names() except ImproperlyConfigured: # If template_name isn't specified, it's not a problem -- # we just start with an empty list. names = [] # If the list is a queryset, we'll invent a template name based on the # app and model name. This name gets put at the end of the template # name list so that user-supplied names override the automatically- # generated ones. if hasattr(self.object_list, 'model'): opts = self.object_list.model._meta names.append("%s/%s%s.html" % (opts.app_label, opts.model_name, self.template_name_suffix)) return names
def http_method_not_allowed(
self, request, *args, **kwargs)
def http_method_not_allowed(self, request, *args, **kwargs): logger.warning('Method Not Allowed (%s): %s', request.method, request.path, extra={ 'status_code': 405, 'request': self.request } ) return http.HttpResponseNotAllowed(self._allowed_methods())
def options(
self, request, *args, **kwargs)
Handles responding to requests for the OPTIONS HTTP verb.
def options(self, request, *args, **kwargs): """ Handles responding to requests for the OPTIONS HTTP verb. """ response = http.HttpResponse() response['Allow'] = ', '.join(self._allowed_methods()) response['Content-Length'] = '0' return response
def paginate_queryset(
self, queryset, page_size)
Paginate the queryset, if needed.
def paginate_queryset(self, queryset, page_size): """ Paginate the queryset, if needed. """ paginator = self.get_paginator( queryset, page_size, orphans=self.get_paginate_orphans(), allow_empty_first_page=self.get_allow_empty()) page_kwarg = self.page_kwarg page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 try: page_number = int(page) except ValueError: if page == 'last': page_number = paginator.num_pages else: raise Http404(_("Page is not 'last', nor can it be converted to an int.")) try: page = paginator.page(page_number) return (paginator, page, page.object_list, page.has_other_pages()) except InvalidPage as e: raise Http404(_('Invalid page (%(page_number)s): %(message)s') % { 'page_number': page_number, 'message': str(e) })
def render_to_response(
self, context, **response_kwargs)
Returns a response, using the response_class
for this
view, with a template rendered with the given context.
If any keyword arguments are provided, they will be passed to the constructor of the response class.
def render_to_response(self, context, **response_kwargs): """ Returns a response, using the `response_class` for this view, with a template rendered with the given context. If any keyword arguments are provided, they will be passed to the constructor of the response class. """ response_kwargs.setdefault('content_type', self.content_type) return self.response_class( request = self.request, template = self.get_template_names(), context = context, **response_kwargs )