text: from django import http
  from django.conf import settings
  from django.shortcuts import get_list_or_404, get_object_or_404
  
  import amo
  from amo.models import manual_order
  from browse.views import personas_listing
  from addons.decorators import addon_view_factory
  from addons.models import Addon, Category, AddonCategory
  from addons.views import _category_personas as _category_themes
  from discovery.views import get_featured_personas
  from reviews.models import Review
  from reviews.views import get_flags
  from mkt.search.views import _app_search
  
  import jingo
  from waffle.decorators import waffle_switch
  
  addon_all_view = addon_view_factory(qs=Addon.objects.all)
  
  
  @waffle_switch('mkt-themes')
  @addon_all_view
  def detail(request, addon):
      """Theme details page."""
      theme = addon.persona
  
      categories = [category for category in addon.all_categories if
                    category.application.id == amo.FIREFOX.id]
      if categories:
          qs = Addon.objects.public().filter(categories=categories[0])
          category_themes = _category_themes(qs, limit=6)
      else:
          category_themes = None
  
      reviews = Review.objects.valid().filter(addon=addon, is_latest=True)
  
      data = {
          'product': addon,
          'reviews': reviews[:2],
          'flags': get_flags(request, reviews),
          'has_review': request.user.is_authenticated() and
                        reviews.filter(user=request.user.id).exists(),
          'categories': categories,
          'category_themes': category_themes,
          'author_themes': theme.authors_other_addons(request.APP)[:3],
          'theme': theme,
      }
      if not theme.is_new():
          # Remora uses persona.author despite there being a display_username.
          data['author_gallery'] = settings.PERSONAS_USER_ROOT % theme.author
  
      return jingo.render(request, 'themes/detail.html', data)
  
  
  @waffle_switch('mkt-themes')
  def _landing(request, category=None):
      if category:
          featured = ''
          category = get_list_or_404(
              Category.objects.filter(type=amo.ADDON_PERSONA, slug=category))[0]
          popular = (Addon.objects.public()
                     .filter(type=amo.ADDON_PERSONA,
                             addoncategory__category__id=category.id)
                     .order_by('-persona__popularity')[:12])
  
          categories, filter, base, category = personas_listing(request,
                                                                category.slug)
          ids = AddonCategory.creatured_random(category, request.LANG)
          featured = manual_order(base, ids, pk_name="addons.id")[:12]
      else:
          popular = (Addon.objects.public().filter(type=amo.ADDON_PERSONA)
                     .order_by('-persona__popularity')[:12])
          featured = get_featured_personas(request, num_personas=12)
  
      return jingo.render(request, 'themes/landing.html', {
          'category': category,
          'popular': popular,
          'featured': featured,
      })
  
  
  # TODO: sort pages, this function is just a stub.
  @waffle_switch('mkt-themes')
  def _search(request, category=None):
      from django.http import Http404
      raise Http404
  
      ctx = {'browse': True}
  
      if category is not None:
          qs = Category.objects.filter(type=amo.ADDON_PERSONA, weight__gte=0)
          ctx['category'] = get_object_or_404(qs, slug=category)
  
          # Do a search filtered by this category and sort by Weekly Downloads.
          # TODO: Listen to andy and do not modify `request.GET` but at least
          # the traceback is fixed now.
          request.GET = request.GET.copy()
          request.GET.update({'cat': ctx['category'].id})
          if not request.GET.get('sort'):
              request.GET['sort'] = 'downloads'
  
      ctx.update(_app_search(request, category=ctx.get('category'), browse=True))
  
      # If category is not listed as a facet, then remove redirect to search.
      if ctx.get('redirect'):
          return http.HttpResponseRedirect(ctx['redirect'])
  
      return jingo.render(request, 'search/results.html', ctx)
  
  
  @waffle_switch('mkt-themes')
  def browse_themes(request, category=None):
      if request.GET.get('sort'):
          return _search(request, category)
      else:
          return _landing(request, category)
  