# -*- coding: utf-8 -*- import datetime import logging from django.apps import apps from django.contrib import messages from django.db.models import Q from django.http import JsonResponse from django.urls import reverse_lazy from django.utils.translation import gettext as _ from django.views import generic from dav_events.choices import SPORT_CHOICES, LEVEL_CHOICES from dav_events.models.event import Event from .forms import RegistrationForm from .models import Registration from .utils import purge_registrations app_config = apps.get_containing_app_config(__package__) logger = logging.getLogger(__name__) class RootView(generic.RedirectView): url = reverse_lazy('dav_registration:events') def get(self, request, *args, **kwargs): purge_registrations() return super().get(request, *args, **kwargs) class HomeView(generic.TemplateView): template_name = 'dav_registration/home.html' class EventListView(generic.ListView): model = Event template_name = 'dav_registration/event_list.html' def get_queryset(self): today = datetime.date.today() filter_exp = Q(flags__status__code__in=('publishing', 'publishing_web', 'publishing_facebook', 'published', 'published_web', 'published_facebook')) filter_exp &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter_exp &= Q(first_day__gte=today) # filter_exp &= Q(registration_closed=False) # filter_exp &= Q(deadline__isnull=True) | Q(deadline__gte=today) qs = self.model.objects.filter(filter_exp).order_by('first_day', 'number').distinct() return qs def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) if hasattr(self, 'init_filter'): context['init_filter'] = self.init_filter return context def get(self, request, *args, **kwargs): if 'filter' in request.GET: choices = SPORT_CHOICES.codes + LEVEL_CHOICES.codes filter_input = request.GET['filter'].split(',') filter_cleaned = list(set(filter_input) & set(choices)) self.init_filter = filter_cleaned return super().get(request, *args, **kwargs) def EventListAsJSONView(request): filter_cleaned = [] if 'filter' in request.GET: choices = SPORT_CHOICES.codes + LEVEL_CHOICES.codes filter_input = request.GET['filter'].split(',') filter_cleaned = list(set(filter_input) & set(choices)) today = datetime.date.today() filter_exp = Q(flags__status__code__in=('publishing', 'publishing_web', 'publishing_facebook', 'published', 'published_web', 'published_facebook')) filter_exp &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter_exp &= Q(first_day__gte=today) # filter_exp &= Q(registration_closed=False) # filter_exp &= Q(deadline__isnull=True) | Q(deadline__gte=today) if filter_cleaned: filter_exp &= Q(sport__in=filter_cleaned) | Q(level__in=filter_cleaned) qs = Event.objects.filter(filter_exp).order_by('first_day', 'number').distinct() data = {} for event in qs: data[event.id] = event.as_dict(json=True, add_registration_url=True) response = JsonResponse(data) return response class EventDetailView(generic.DetailView): model = Event template_name = 'dav_registration/event_detail.html' def get_queryset(self): today = datetime.date.today() filter_exp = Q(flags__status__code__in=('publishing', 'publishing_web', 'publishing_facebook', 'published', 'published_web', 'published_facebook')) filter_exp &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter_exp &= Q(first_day__gte=today) # filter_exp &= Q(registration_closed=False) # filter_exp &= Q(deadline__isnull=True) | Q(deadline__gte=today) qs = self.model.objects.filter(filter_exp).distinct() return qs class RegistrationView(generic.CreateView): model = Registration form_class = RegistrationForm initial = { 'dav_number': '131/00/', } def get_queryset(self): today = datetime.date.today() filter_exp = Q(flags__status__code__in=('publishing', 'publishing_web', 'publishing_facebook', 'published', 'published_web', 'published_facebook')) filter_exp &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter_exp &= Q(first_day__gte=today) filter_exp &= Q(registration_closed=False) filter_exp &= Q(deadline__isnull=True) | Q(deadline__gte=today) qs = Event.objects.filter(filter_exp).distinct() return qs def get_initial(self): initials = super().get_initial() return initials def get_form(self, form_class=None): form = super().get_form(form_class) event = self.get_object() experience_label = form.fields['experience'].label experience_help_text = form.fields['experience'].help_text if event.sport == 'B': experience_label = _('Eigene Bergerfahrung') elif event.sport == 'K' and event.terrain == 'alpine': experience_label = _('Eigene Fels- und Bergerfahrung') if event.level == 'beginner': experience_help_text = '%s
%s
%s' % ( _('Warst du schon mal im Gebirge klettern?'), _('In welchem Schwierigkeitsgrad hast du Spaß?'), _('Bist du schon mal vorgestiegen?') ) else: experience_help_text = '%s
%s
%s' % ( _('In welchen Klettergebieten/Touren warst du bisher unterwegs?'), _('In welchem Schwierigkeitsgrad hast du im Vorstieg Spaß?'), _('Wie waren die Touren abgesichert, in denen du dich noch wohlgefühlt hast?') ) elif event.sport == 'K': experience_label = _('Eigene Klettererfahrung') if event.level == 'beginner': experience_help_text = '%s
%s
%s' % ( _('Warst du schon mal am Fels klettern?'), _('In welchem Schwierigkeitsgrad hast du Spaß?'), _('Bist du schon mal vorgestiegen?') ) else: experience_help_text = '%s
%s
%s' % ( _('In welchen Klettergebieten warst du bisher unterwegs?'), _('In welchem Schwierigkeitsgrad hast du im Vorstieg Spaß?'), _('Wie waren die Touren abgesichert, in denen du dich noch wohlgefühlt hast?') ) elif event.sport == 'M': experience_label = _('Eigene MTB-Erfahrung') experience_help_text = '%s' % ( _('Was für Touren bist du schon gefahren?') ) if event.level != 'beginner': experience_help_text += '
%s' % ( _('Single-Trail-Schwierigkeit (S0-S5) bei der du dich wohl fühlst?') ) elif event.sport == 'S': experience_label = _('Eigene Skitouren- und Bergerfahrung') elif event.sport == 'W': experience_help_text += '
%s' % ( _('Kann frei gelassen werden.') ) form.fields['experience'].label = experience_label form.fields['experience'].help_text = experience_help_text form.instance.event = event form.instance.privacy_policy = app_config.settings.privacy_policy return form def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) event = self.get_object() context['event'] = event context['privacy_policy'] = app_config.settings.privacy_policy context['purge_at'] = self.model.calc_purge_at(event) return context def form_valid(self, form): r = super().form_valid(form) self.request.session['registration_id'] = form.instance.pk message = _('Deine Anmeldung wurde erfolgreich gespeichert.') messages.success(self.request, message) return r def post(self, request, *args, **kwargs): if 'registration_id' in request.session: del request.session['registration_id'] return super().post(request, *args, **kwargs) class RegistrationSuccessView(generic.DetailView): model = Registration def get_object(self, queryset=None): try: pk = self.request.session['registration_id'] obj = self.model.objects.get(pk=pk) except (KeyError, self.model.DoesNotExist): obj = None return obj