bornhack-website/src/camps/mixins.py

60 lines
2.2 KiB
Python

from camps.models import Camp
from django.shortcuts import get_object_or_404
from django.utils.functional import cached_property
class CampViewMixin(object):
"""
This mixin makes sure self.camp is available (taken from url kwarg camp_slug)
It also filters out objects that belong to other camps when the queryset has a camp_filter
"""
def dispatch(self, request, *args, **kwargs):
self.camp = get_object_or_404(Camp, slug=self.kwargs["camp_slug"])
return super().dispatch(request, *args, **kwargs)
def get_queryset(self):
queryset = super().get_queryset()
# if this queryset is empty return it right away, because nothing for us to do
if not queryset:
return queryset
# do we have a camp_filter on this model
if not hasattr(self.model, "camp_filter"):
return queryset
# get the camp_filter from the model
camp_filter = self.model.get_camp_filter()
# Let us deal with eveything as a list
if isinstance(camp_filter, str):
camp_filter = [camp_filter]
for _filter in camp_filter:
# add camp to the filter_dict
filter_dict = {_filter: self.camp}
# get pk from kwargs if we have it
if hasattr(self, "pk_url_kwarg"):
pk = self.kwargs.get(self.pk_url_kwarg)
if pk is not None:
# We should also filter for the pk of the object
filter_dict["pk"] = pk
# get slug from kwargs if we have it
if hasattr(self, "slug_url_kwarg"):
slug = self.kwargs.get(self.slug_url_kwarg)
if slug is not None and (pk is None or self.query_pk_and_slug):
# we should also filter for the slug of the object
filter_dict[self.get_slug_field()] = slug
# do the filtering and return the result
result = queryset.filter(**filter_dict)
if result.exists():
# we got some results with this camp_filter, return now
return result
# no camp_filter returned any results, return an empty queryset
return result