Files
kasu/src/events/mixins.py

87 lines
3.0 KiB
Python

"""Mixins for Events."""
from django.core.exceptions import ImproperlyConfigured
from django.db.models import Q
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext as _
from . import models
# Ignore PyLintBear (R0903)
class EventArchiveMixin(object):
"""Adds an is_archive = True variable to the template context."""
context_object_name = 'event_list'
date_field = 'start'
make_object_list = True
model = models.Event
paginate_by = 15
template_name = 'events/event_archive.html'
def get_context_data(self, **kwargs):
"""Add is_archive to the context and set it to true.
:return: TemplateContext object"""
context = super(EventArchiveMixin, self).get_context_data(**kwargs)
context['is_archive'] = True
return context
# Ignore PyLintBear (R0903)
class EventDetailMixin(object):
"""A very simple Mixin to add the related event to the template context."""
event = None
def get_context_data(self, **kwargs):
"""Add this event or the related event of the given object to the template context.
:return: TemplateContext object"""
context = super(EventDetailMixin, self).get_context_data(**kwargs)
if getattr(self, 'event'):
context['event'] = self.event
elif isinstance(getattr(self, 'object'), models.Event):
context['event'] = self.object
elif getattr(getattr(self, 'object'), 'event'):
context['event'] = self.object.event
else:
raise ImproperlyConfigured("No Event in Context!")
return context
def get_queryset(self):
"""set event attribute from the URL kwarg event and
load all related objects from the set model.
:return: a django QuerySets
"""
if self.model == models.Event:
self.event = get_object_or_404(models.Event, pk=self.kwargs['pk'])
queryset = self.model._default_manager.all()
elif self.kwargs.get('event'):
self.event = get_object_or_404(
models.Event,
pk=self.kwargs['event'])
queryset = self.model.objects.filter(event=self.event)
elif self.model:
queryset = self.model._default_manager.all()
else:
raise ImproperlyConfigured(
"%(cls)s is missing a QuerySet. Define "
"%(cls)s.model, %(cls)s.queryset, or override "
"%(cls)s.get_queryset()." % {
'cls': self.__class__.__name__
})
return queryset.prefetch_related()
class EventPhotoMixin(EventDetailMixin):
def get_queryset(self):
try:
self.event = models.Event.objects.get(id=self.kwargs['event'])
return models.Photo.objects.filter(
Q(event=self.event) |
Q(event__event_series=self.event)
)
except models.Event.DoesNotExist:
raise Http404(_('Event does not exist'))