# Index has a very special view that lives out here from django.shortcuts import render, get_object_or_404 from django.template.defaultfilters import slugify from django.contrib.auth.decorators import login_required from postgresqleu.newsevents.models import News from postgresqleu.confreg.models import Conference, ConferenceSeries from postgresqleu.util.db import exec_to_dict import datetime import markdown # Handle the frontpage def index(request): events = Conference.objects.filter(promoactive=True, enddate__gte=datetime.datetime.today()).order_by('startdate') series = ConferenceSeries.objects.filter(visible=True).extra( where=["EXISTS (SELECT 1 FROM confreg_conference c WHERE c.series_id=confreg_conferenceseries.id AND c.promoactive)"] ) # Native query, because django ORM vs UNION... # If a news item has the flag "high priority until" until a date that's still in the future, # make sure it always bubbles to the top of the list. We do this by creating a secondary ordering # field to order by first. To make sure we capture all such things, we need to get at least the # same number of items from each subset and then LIMIT it once again for the total limit. news = exec_to_dict("""WITH main AS ( SELECT id, NULL::text AS confurl, CASE WHEN highpriorityuntil > CURRENT_TIMESTAMP THEN 1 ELSE 0 END AS priosort, datetime, title, summary FROM newsevents_news WHERE datetime= datetime.datetime.today().date()], 'past': [e for e in events if e.enddate < datetime.datetime.today().date()], }) # Handle a users list of previous events @login_required def attendee_events(request): events = list(Conference.objects.filter(promoactive=True, enddate__gte=datetime.datetime.today()).order_by('startdate')) series = ConferenceSeries.objects.filter(visible=True).extra( where=["EXISTS (SELECT 1 FROM confreg_conference c WHERE c.series_id=confreg_conferenceseries.id AND c.promoactive)"] ) attended = Conference.objects.only('urlname', 'conferencename', 'location').filter(conferenceregistration__attendee=request.user, conferenceregistration__payconfirmedat__isnull=False).distinct().order_by('-startdate') return render(request, 'events/attendee.html', { 'attended': attended, 'events': events, 'series': series, }) # Handle CSRF failures def csrf_failure(request, reason=''): resp = render(request, 'csrf_failure.html', { 'reason': reason, }) resp.status_code = 403 # Forbidden return resp