2021-12-05 14:34:46 +00:00
|
|
|
from django.http import Http404, HttpResponse
|
2010-12-18 19:47:52 +00:00
|
|
|
from django.shortcuts import get_object_or_404
|
2010-02-26 13:35:05 +00:00
|
|
|
from django.template.loader import select_template
|
2012-05-11 12:07:01 +00:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2017-10-13 03:48:51 +00:00
|
|
|
from django.views.generic import DetailView, ListView
|
2011-12-20 07:09:18 +00:00
|
|
|
|
2012-01-11 20:22:29 +00:00
|
|
|
from .models import Category
|
2009-10-01 19:51:13 +00:00
|
|
|
|
2012-07-12 23:24:55 +00:00
|
|
|
|
2021-12-05 14:34:46 +00:00
|
|
|
def category_detail(request, path, template_name="categories/category_detail.html", extra_context={}):
|
|
|
|
|
path_items = path.strip("/").split("/")
|
2010-06-16 15:06:15 +00:00
|
|
|
if len(path_items) >= 2:
|
2016-02-15 21:47:21 +00:00
|
|
|
category = get_object_or_404(
|
2021-12-05 14:34:46 +00:00
|
|
|
Category, slug__iexact=path_items[-1], level=len(path_items) - 1, parent__slug__iexact=path_items[-2]
|
|
|
|
|
)
|
2010-06-16 15:06:15 +00:00
|
|
|
else:
|
2021-12-05 14:34:46 +00:00
|
|
|
category = get_object_or_404(Category, slug__iexact=path_items[-1], level=len(path_items) - 1)
|
2012-07-12 23:24:55 +00:00
|
|
|
|
2010-02-26 18:37:18 +00:00
|
|
|
templates = []
|
|
|
|
|
while path_items:
|
2021-12-05 14:34:46 +00:00
|
|
|
templates.append("categories/%s.html" % "_".join(path_items))
|
2010-02-26 18:37:18 +00:00
|
|
|
path_items.pop()
|
|
|
|
|
templates.append(template_name)
|
|
|
|
|
|
2021-12-05 14:34:46 +00:00
|
|
|
context = {"category": category}
|
2010-04-29 15:07:05 +00:00
|
|
|
if extra_context:
|
|
|
|
|
context.update(extra_context)
|
2011-03-26 16:23:42 +00:00
|
|
|
return HttpResponse(select_template(templates).render(context))
|
|
|
|
|
|
|
|
|
|
|
2011-03-26 17:33:42 +00:00
|
|
|
def get_category_for_path(path, queryset=Category.objects.all()):
|
2021-12-05 14:34:46 +00:00
|
|
|
path_items = path.strip("/").split("/")
|
2011-03-26 17:33:42 +00:00
|
|
|
if len(path_items) >= 2:
|
|
|
|
|
queryset = queryset.filter(
|
2021-12-05 14:34:46 +00:00
|
|
|
slug__iexact=path_items[-1], level=len(path_items) - 1, parent__slug__iexact=path_items[-2]
|
|
|
|
|
)
|
2011-03-26 17:33:42 +00:00
|
|
|
else:
|
2021-12-05 14:34:46 +00:00
|
|
|
queryset = queryset.filter(slug__iexact=path_items[-1], level=len(path_items) - 1)
|
2011-03-26 17:33:42 +00:00
|
|
|
return queryset.get()
|
|
|
|
|
|
2011-03-26 18:05:36 +00:00
|
|
|
|
2013-01-21 14:14:05 +00:00
|
|
|
class CategoryDetailView(DetailView):
|
|
|
|
|
model = Category
|
2021-12-05 14:34:46 +00:00
|
|
|
path_field = "path"
|
2013-01-21 14:14:05 +00:00
|
|
|
|
|
|
|
|
def get_object(self, **kwargs):
|
|
|
|
|
if self.path_field not in self.kwargs:
|
2021-12-05 14:34:46 +00:00
|
|
|
raise AttributeError(
|
|
|
|
|
"Category detail view %s must be called with " "a %s." % (self.__class__.__name__, self.path_field)
|
|
|
|
|
)
|
2013-01-21 14:14:05 +00:00
|
|
|
if self.queryset is None:
|
|
|
|
|
queryset = self.get_queryset()
|
|
|
|
|
try:
|
2013-07-29 13:24:11 +00:00
|
|
|
return get_category_for_path(self.kwargs[self.path_field], self.model.objects.all())
|
2017-10-13 03:48:51 +00:00
|
|
|
except Category.DoesNotExist:
|
2021-12-05 14:34:46 +00:00
|
|
|
raise Http404(
|
|
|
|
|
_("No %(verbose_name)s found matching the query") % {"verbose_name": queryset.model._meta.verbose_name}
|
|
|
|
|
)
|
2013-01-21 14:14:05 +00:00
|
|
|
|
|
|
|
|
def get_template_names(self):
|
|
|
|
|
names = []
|
2021-12-05 14:34:46 +00:00
|
|
|
path_items = self.kwargs[self.path_field].strip("/").split("/")
|
2013-01-21 14:14:05 +00:00
|
|
|
while path_items:
|
2021-12-05 14:34:46 +00:00
|
|
|
names.append("categories/%s.html" % "_".join(path_items))
|
2013-01-21 14:14:05 +00:00
|
|
|
path_items.pop()
|
|
|
|
|
names.extend(super(CategoryDetailView, self).get_template_names())
|
|
|
|
|
return names
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CategoryRelatedDetail(DetailView):
|
2021-12-05 14:34:46 +00:00
|
|
|
path_field = "category_path"
|
2013-01-21 14:14:05 +00:00
|
|
|
object_name_field = None
|
|
|
|
|
|
|
|
|
|
def get_object(self, **kwargs):
|
2017-10-13 03:48:51 +00:00
|
|
|
if self.path_field not in self.kwargs:
|
2021-12-05 14:34:46 +00:00
|
|
|
raise AttributeError(
|
|
|
|
|
"Category detail view %s must be called with " "a %s." % (self.__class__.__name__, self.path_field)
|
|
|
|
|
)
|
2013-01-21 14:14:05 +00:00
|
|
|
queryset = super(CategoryRelatedDetail, self).get_queryset()
|
2017-10-13 03:48:51 +00:00
|
|
|
try:
|
|
|
|
|
category = get_category_for_path(self.kwargs[self.path_field])
|
|
|
|
|
except Category.DoesNotExist:
|
2021-12-05 14:34:46 +00:00
|
|
|
raise Http404(
|
|
|
|
|
_("No %(verbose_name)s found matching the query") % {"verbose_name": queryset.model._meta.verbose_name}
|
|
|
|
|
)
|
2017-10-13 03:48:51 +00:00
|
|
|
return queryset.get(category=category)
|
2013-01-21 14:14:05 +00:00
|
|
|
|
|
|
|
|
def get_template_names(self):
|
|
|
|
|
names = []
|
|
|
|
|
opts = self.object._meta
|
2021-12-05 14:34:46 +00:00
|
|
|
path_items = self.kwargs[self.path_field].strip("/").split("/")
|
2013-01-21 14:14:05 +00:00
|
|
|
if self.object_name_field:
|
|
|
|
|
path_items.append(getattr(self.object, self.object_name_field))
|
|
|
|
|
while path_items:
|
2021-12-05 14:34:46 +00:00
|
|
|
names.append(
|
|
|
|
|
"%s/category_%s_%s%s.html"
|
|
|
|
|
% (opts.app_label, "_".join(path_items), opts.object_name.lower(), self.template_name_suffix)
|
2013-01-21 14:14:05 +00:00
|
|
|
)
|
|
|
|
|
path_items.pop()
|
2021-12-05 14:34:46 +00:00
|
|
|
names.append("%s/category_%s%s.html" % (opts.app_label, opts.object_name.lower(), self.template_name_suffix))
|
2013-01-21 14:14:05 +00:00
|
|
|
names.extend(super(CategoryRelatedDetail, self).get_template_names())
|
|
|
|
|
return names
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CategoryRelatedList(ListView):
|
2021-12-05 14:34:46 +00:00
|
|
|
path_field = "category_path"
|
2013-01-21 14:14:05 +00:00
|
|
|
|
|
|
|
|
def get_queryset(self):
|
2017-10-13 03:48:51 +00:00
|
|
|
if self.path_field not in self.kwargs:
|
2021-12-05 14:34:46 +00:00
|
|
|
raise AttributeError(
|
|
|
|
|
"Category detail view %s must be called with " "a %s." % (self.__class__.__name__, self.path_field)
|
|
|
|
|
)
|
2013-01-21 14:14:05 +00:00
|
|
|
queryset = super(CategoryRelatedList, self).get_queryset()
|
2017-10-13 03:48:51 +00:00
|
|
|
category = get_category_for_path(self.kwargs[self.path_field])
|
2013-01-21 14:14:05 +00:00
|
|
|
return queryset.filter(category=category)
|
|
|
|
|
|
|
|
|
|
def get_template_names(self):
|
|
|
|
|
names = []
|
2021-12-05 14:34:46 +00:00
|
|
|
if hasattr(self.object_list, "model"):
|
2013-01-21 14:14:05 +00:00
|
|
|
opts = self.object_list.model._meta
|
2021-12-05 14:34:46 +00:00
|
|
|
path_items = self.kwargs[self.path_field].strip("/").split("/")
|
2011-03-26 18:05:36 +00:00
|
|
|
while path_items:
|
2021-12-05 14:34:46 +00:00
|
|
|
names.append(
|
|
|
|
|
"%s/category_%s_%s%s.html"
|
|
|
|
|
% (opts.app_label, "_".join(path_items), opts.object_name.lower(), self.template_name_suffix)
|
2012-07-12 23:24:55 +00:00
|
|
|
)
|
2011-03-26 18:05:36 +00:00
|
|
|
path_items.pop()
|
2021-12-05 14:34:46 +00:00
|
|
|
names.append(
|
|
|
|
|
"%s/category_%s%s.html" % (opts.app_label, opts.object_name.lower(), self.template_name_suffix)
|
2012-07-12 23:24:55 +00:00
|
|
|
)
|
2013-01-21 14:14:05 +00:00
|
|
|
names.extend(super(CategoryRelatedList, self).get_template_names())
|
|
|
|
|
return names
|