from django.http import Http404
from django.views.generic.base import View
from django.views.generic import DetailView, ListView, TemplateView
-
+from django.apps import apps
+from django.utils.translation import ugettext_lazy as _
+from django.http import QueryDict
+from mezzanine.conf import settings
+from mezzanine.utils.views import paginate
from organization.core.models import *
# class CustomDisplayableView(SlugMixin, DetailView):
#
# model = CustomDisplayable
+
+
+class CustomSearchView(TemplateView):
+
+ template_name='search_results.html'
+
+
+ def get(self, request, *args, **kwargs):
+
+ """
+ Display search results. Takes an optional "contenttype" GET parameter
+ in the form "app-name.ModelName" to limit search results to a single model.
+ """
+ context = super(CustomSearchView, self).get_context_data(**kwargs)
+ query = request.GET.get("q", "")
+ page = request.GET.get("page", 1)
+ per_page = settings.SEARCH_PER_PAGE
+ max_paging_links = settings.MAX_PAGING_LINKS
+ try:
+ parts = request.GET.get("type", "").split(".", 1)
+ search_model = apps.get_model(*parts)
+ search_model.objects.search # Attribute check
+ except (ValueError, TypeError, LookupError, AttributeError):
+ search_model = Displayable
+ search_type = _("Everything")
+ else:
+ search_type = search_model._meta.verbose_name_plural.capitalize()
+
+ results = search_model.objects.search(query, for_user=request.user)
+
+ # count objects
+ filter_dict = dict()
+ for result in results:
+ if result.__class__.__name__ in filter_dict:
+ filter_dict[result.__class__.__name__]['count'] += 1
+ else:
+ filter_dict[result.__class__.__name__] = {'count' : 1}
+ filter_dict[result.__class__.__name__].update({'app_label' : result._meta.app_label})
+
+ # get url param
+ current_query = QueryDict(mutable=True)
+ current_query = request.GET.copy()
+
+ # generate filter url
+ for key, value in filter_dict.items():
+ current_query['type'] = value['app_label']+'.'+key
+ filter_dict[key].update({'url' : request.path+"?"+current_query.urlencode(safe='/')})
+
+ # pagination
+ paginated = paginate(results, page, per_page, max_paging_links)
+
+ # context
+ context = {"query": query, "results": paginated,
+ "search_type": search_type}
+
+ # cancel filter url
+ if request.GET.__contains__('type'):
+ previous_query = QueryDict(mutable=True)
+ previous_query = request.GET.copy()
+ previous_query.pop('type')
+ context['cancel_filter_url'] = '?'+previous_query.urlencode(safe='/')
+
+ context['filter_dict'] = filter_dict
+ # context.update(extra_context or {})
+ return self.render_to_response(context)
from django import forms
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
+from mezzanine.core.managers import SearchableManager
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse, reverse_lazy
from organization.network.models import Department, PersonListBlock
from organization.media.models import Audio, Video
from organization.core.models import *
+from organization.magazine.apps import *
class Article(BlogPost, SubTitled):
department = models.ForeignKey(Department, verbose_name=_('department'), related_name='articles', limit_choices_to=dict(id__in=Department.objects.all()), blank=True, null=True, on_delete=models.SET_NULL)
topics = models.ManyToManyField("Topic", verbose_name=_('topics'), related_name="articles", blank=True)
+ search_fields = ("title", "content")
def get_absolute_url(self):
return reverse("magazine-article-detail", kwargs={"slug": self.slug})
from django.db import models
from django.utils.translation import ugettext_lazy as _
-
+from mezzanine.core.managers import SearchableManager
from mezzanine.core.models import RichText, Displayable, Slugged
from mezzanine.core.fields import RichTextField, OrderField, FileField
from mezzanine.utils.models import AdminThumbMixin, upload_to
closed_source_url = models.URLField(_('closed source URL'), max_length=1024, blank=True)
poster_url = models.URLField(_('poster'), max_length=1024, blank=True)
+ objects = SearchableManager()
+ search_fields = ("title",)
+
class Meta:
abstract = True
{% extends "base.html" %}
-{% load i18n mezzanine_tags %}
+{% load i18n mezzanine_tags organization_tags %}
{% block meta_title %}{% trans "Search Results" %}{% endblock %}
{% block title %}{% trans "Search Results" %}{% endblock %}
{% endif %}
</p>
+ <p>
+ <h4>Filter:</h4>
+ {% for key,value in filter_dict.items %}
+ <a href="{{ value.url }}" title="{{ key }}">{{ key }} {{ value.count }}</a><br>
+ {% endfor %}
+ {% if cancel_filter_url %}
+ <a href="{{ cancel_filter_url }}" title="">Cancel filter</a>
+ {% endif %}
+ </p>
{% for result in results.object_list %}
{% with result.get_absolute_url as result_url %}
+
<h5>
{{ forloop.counter0|add:results.start_index }})
+ - {{ result|classname }} -
{% if result_url %}
<a href="{{ result_url }}">{{ result }}</a>
{% else %}