# -*- coding: utf-8 -*- from __future__ import unicode_literals from datetime import datetime import re from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.core.mail import EmailMessage from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.db.models import Q, Count from django.http import HttpResponse, Http404 from django.shortcuts import get_object_or_404, render, redirect from django.urls import reverse from django.views.generic.list import ListView from django.db.models.functions.datetime import TruncYear from photologue.views import GalleryListView from photologue.models import Photo, Gallery from .models import Content, ContentContent from . import forms ITEMS_PER_PAGE = 30 def index(request): now = datetime.now() display_events = ['news', 'events'] base = Content.objects.filter(type__name__in=display_events).order_by('-datestart') base = base.filter(published=True) upcoming_events = base.filter(datestart__gte=now)[:12] ongoing_events = base.filter(datestart__lt=now, dateend__gte=now)[:12] past_events = base.filter(Q(dateend__lt=now) | Q(dateend=None, datestart__lt=now))[:12] homepage = Content.objects.filter(type__name='homepage').order_by('-datestart')[:1] context = { 'upcoming_events': upcoming_events, 'ongoing_events': ongoing_events, 'past_events': past_events, 'homepage': homepage} return render(request, 'index.html', context) SECTION_TYPE = { 'Projects': ['projects'], 'Works': ['works'], 'Texts': ['texts'], 'Events': ['events', 'news'], } def section_content(section): types = SECTION_TYPE.get(section, [section.lower()]) content = Content.objects.filter(type__name__in=types).order_by('-datestart') content = content.filter(published=True) return content def section_index(request, section, max_length=10): types = SECTION_TYPE.get(section, [section.lower()]) featured = Content.objects.filter(type__name__in=types, featured=True).order_by('-datestart')[:1] content = section_content(section) if featured: content = content.exclude(pk=featured[0].pk) more_content = content.count() > max_length content = content[:max_length] return render(request, 'section_index.html', { 'section': section, 'featured': featured, 'content': content, 'more_content': more_content, }) def content_years(content): years = [ year['year'].year for year in content.annotate(year=TruncYear('datestart')).values('year').annotate(count=Count('shortname')).order_by('-year') ] return years def filter_by_years(content, year): years = content_years(content) if year.isdigit(): year = int(year) else: year = years[0] content = content.filter(datestart__gte='%s-01-01' % year, datestart__lt='%s-01-01' % (year+1)) return { 'content': content, 'year': year, 'years': years } def section_list(request, section): content = section_content(section) q = request.GET.get('q') content = limit_content(content, q) year = request.GET.get('year', '') if year or section not in ('Projects', 'Works'): context = filter_by_years(content, year) else: context = { 'content': content } ''' page = request.GET.get('page', 1) paginator = Paginator(content, ITEMS_PER_PAGE) try: content = paginator.page(page) except PageNotAnInteger: content = paginator.page(1) except EmptyPage: content = paginator.page(paginator.num_pages) ''' base_query = '' if q: base_query = 'q=%s&' % q context.update({ 'base_query': base_query, 'query': q, 'section': section, }) return render(request, 'results.html', context) def event(request): now = datetime.now() display_events = ['events', 'news'] featured = Content.objects.filter(type__name='events', featured=True).order_by('-datestart')[:1] base = Content.objects.filter(type__name__in=display_events).order_by('-datestart') base = base.filter(published=True) if featured: base = base.exclude(pk=featured[0].pk) upcoming_events = base.filter(datestart__gt=now).order_by('-datestart') ongoing_events = base.filter(datestart__lt=now, dateend__gte=now).order_by('-datestart') past_events = base.filter(Q(dateend__lt=now) | Q(dateend=None, datestart__lt=now)).order_by('-datestart')[:10] context = { 'upcoming_events': upcoming_events, 'ongoing_events': ongoing_events, 'past_events': past_events, 'featured': featured, 'section': 'Events', } return render(request, 'event.html', context) def get_related_content(types, current=None, max_length=10): latest_content_list = Content.objects.filter(type__name__in=types).order_by('-datestart') if current: latest_content_list = latest_content_list.exclude(pk=current.pk) latest_content_list = latest_content_list.exclude(pk__in=current.related_content.all()) latest_content_list = latest_content_list.filter(published=True) more = latest_content_list.count() > max_length latest_content_list = latest_content_list[:max_length] return latest_content_list, more def render_content(request, shortname, section, template, types): if not shortname: if section == 'Events': return event(request) else: return section_index(request, section) shortname = shortname.replace(' ', '_') content = get_object_or_404(Content, shortname=shortname, type__name__in=types) if not content.published and not request.user.is_staff: raise Http404 latest_content_list, more = get_related_content(types, content) return render(request, template, { 'content': content, 'latest_content_list': latest_content_list, 'has_more_content': more, 'section': section, }) def events(request, shortname=None): return render_content(request, shortname, 'Events', 'content.html', ['events', 'news']) def projects(request, shortname=None): return render_content(request, shortname, 'Projects', 'content.html', ['projects']) def works(request, shortname=None): return render_content(request, shortname, 'Works', 'content.html', ['works']) def texts(request, shortname=None): return render_content(request, shortname, 'Texts', 'content.html', ['texts']) def page(request, shortname): content = get_object_or_404(Content, shortname=shortname, type__name='page') if not content.published and not request.user.is_staff: raise Http404 return render(request, 'page.html', {'content': content}) def contact(request): context = {} if request.method == 'POST': form = forms.ContactForm(request.POST) if form.is_valid(): name = form.cleaned_data['name'] email = form.cleaned_data['email'] message = form.cleaned_data['message'] subject = '{} has left a message on studio.camp'.format(name) from_ = settings.CONTACT_FROM_EMAIL to = settings.CONTACT_TO_EMAIL msg = EmailMessage(subject, message, from_, to, reply_to=[email]) msg.send(fail_silently=True) #msg.send() context['sent'] = True else: form = forms.ContactForm() context['form'] = form return render(request, 'contact.html', context) def limit_content(content, q): if q: content = content.filter(Q(body__icontains=q) | Q(title__icontains=q) | Q(header__icontains=q)).distinct() return content def search(request): content = Content.objects.filter(published=True).order_by('-datestart') content = content.exclude(type__name__in=['page', 'homepage']) q = request.GET.get('q') content = limit_content(content, q) year = request.GET.get('year', '') context = filter_by_years(content, year) ''' page = request.GET.get('page', 1) paginator = Paginator(content, ITEMS_PER_PAGE) try: content = paginator.page(page) except PageNotAnInteger: content = paginator.page(1) except EmptyPage: content = paginator.page(paginator.num_pages) ''' base_query = '' if q: base_query = 'q=%s&' % q context.update({ 'base_query': base_query, 'query': q }) return render(request, 'results.html', context) class GalleryListViews(ListView): queryset = Gallery.objects.on_site().is_public() paginate_by = ITEMS_PER_PAGE template_name = 'gallery_list.html' def get_or_none(classmodel, **kwargs): try: return classmodel.objects.get(**kwargs) except classmodel.DoesNotExist: return None def redirect_index(request): segment = request.GET.get('show') if segment == 'pastevents': return redirect(reverse('works')) elif segment == 'contact': return redirect(reverse('contact')) return redirect(reverse('index')) def redirect_event(request): shortname = request.GET.get('this', '').replace(' ', '_').lower() if shortname: content = get_object_or_404(Content, shortname__iexact=shortname) return redirect(content.get_absolute_url()) id = request.GET.get('id') if id: id = re.compile('\d+').findall(id) if id: id = id[0] content = get_object_or_404(Content, id=id) return redirect(content.get_absolute_url()) return redirect(reverse('events')) def redirect_images(request, image): return redirect(image)