import logging from django.conf import settings from django.shortcuts import redirect from django.utils import timezone from django.views import View from django.views.generic import DetailView, ListView from .mixins import CampViewMixin from .models import Camp logger = logging.getLogger("bornhack.%s" % __name__) class CampRedirectView(CampViewMixin, View): def dispatch(self, request, *args, **kwargs): now = timezone.now() try: camp = Camp.objects.get(camp__contains=now) logger.debug( "Redirecting to camp '%s' for page '%s' because it is now!" % (camp.slug, kwargs["page"]) ) return redirect(kwargs["page"], camp_slug=camp.slug) except Camp.DoesNotExist: pass # no ongoing camp, find the closest camp in the past try: prevcamp = ( Camp.objects.filter(camp__endswith__lt=now).order_by("-camp").first() ) except Camp.DoesNotExist: prevcamp = None # find the closest upcoming camp try: nextcamp = ( Camp.objects.filter(camp__startswith__gt=now).order_by("camp").first() ) except Camp.DoesNotExist: nextcamp = None percentpassed = False if prevcamp and nextcamp: # find the number of days between the two camps daysbetween = (nextcamp.camp.lower - prevcamp.camp.upper).days # find the number of days since the last camp ended dayssinceprevcamp = (timezone.now() - prevcamp.camp.lower).days # find the percentage of time passed percentpassed = (dayssinceprevcamp / daysbetween) * 100 # figure out where to redirect if percentpassed > settings.CAMP_REDIRECT_PERCENT or not prevcamp: # either we have no previous camp, or we have both and more than settings.CAMP_REDIRECT_PERCENT has passed, so redirect to the next camp camp = nextcamp else: # either we have no next camp, or we have both and less than settings.CAMP_REDIRECT_PERCENT has passed, so redirect to the previous camp camp = prevcamp # do the redirect return redirect(kwargs["page"], camp_slug=camp.slug) class CampDetailView(DetailView): model = Camp slug_url_kwarg = "camp_slug" def get_template_names(self): return "%s_camp_detail.html" % self.get_object().slug class CampListView(ListView): model = Camp template_name = "camp_list.html" queryset = Camp.objects.all().order_by("camp")