Another Step in the Quest to clean up the code base.

This commit is contained in:
2017-09-08 07:19:50 +02:00
parent ce218080b2
commit b3ab9798b5
229 changed files with 1915 additions and 15175 deletions

View File

@@ -1,107 +1,63 @@
# -*- encoding: utf-8 -*-
# Create your views here.
""" All views to display or edit events and event-photos. """
from datetime import timedelta
from django.db.models import Q
from django.contrib.auth.decorators import permission_required
from django.contrib.auth import get_user_model
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.urlresolvers import reverse
from extra_views import InlineFormSetView
from extra_views import ModelFormSetView
from django.db.models import Q
from django.http import HttpResponse, Http404
from django.shortcuts import redirect
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from django.views import generic
from extra_views import InlineFormSetView
from icalendar import Calendar, Event
from utils.mixins import PermissionRequiredMixin
from . import models, forms
from . import forms, mixins, models
class DeleteEventPhoto(generic.DeleteView):
class DeleteEventPhoto(PermissionRequiredMixin, mixins.EventDetailMixin,
generic.DeleteView):
"""Delete a requested photo and redirect to the album view."""
model = models.Photo
permission_required = 'events.delete_photo'
def get_success_url(self):
return reverse('event-photo-list', args=[self.object.event.id])
def get_context_data(self, **kwargs):
context = super(DeleteEventPhoto, self).get_context_data()
context['event'] = self.object.event
return context
@method_decorator(permission_required('events.delete_photo'))
def dispatch(self, *args, **kwargs):
return super(DeleteEventPhoto, self).dispatch(*args, **kwargs)
"""Redirect to the album view of the event from the deleted image."""
return reverse('event-photo-list', args=[self.object.event_id])
class EventArchiveIndex(generic.ArchiveIndexView):
class EventArchiveIndex(mixins.EventArchiveMixin, generic.ArchiveIndexView):
"""Index of the event archive, displays the upcoming events first."""
allow_empty = True
context_object_name = 'event_list'
date_field = 'start'
model = models.Event
ordering = ('-start', '-end')
paginate_by = 15
def get_context_data(self, **kwargs):
context = generic.ArchiveIndexView.get_context_data(self, **kwargs)
context['is_archive'] = True
return context
class EventArchiveMonth(generic.MonthArchiveView):
date_field = 'start'
make_object_list = True
model = models.Event
ordering = ('start', 'end')
class EventArchiveMonth(mixins.EventArchiveMixin, generic.MonthArchiveView):
"""List the events from the specific month of the given year."""
month_format = '%m'
paginate_by = 15
template_name = 'events/event_archive.html'
def get_context_data(self, **kwargs):
context = generic.MonthArchiveView.get_context_data(self, **kwargs)
context['is_archive'] = True
return context
class EventArchiveYear(generic.YearArchiveView):
model = models.Event
date_field = 'start'
make_object_list = True
ordering = ('start', 'end')
paginate_by = 15
template_name = 'events/event_archive.html'
class EventArchiveYear(mixins.EventArchiveMixin, generic.YearArchiveView):
"""List all events from the specified year."""
year_format = '%Y'
def get_context_data(self, **kwargs):
context = generic.YearArchiveView.get_context_data(self, **kwargs)
context['is_archive'] = True
return context
class EventDetail(generic.DetailView):
class EventDetail(mixins.EventDetailMixin, generic.DetailView):
"""Detail View to see all details of an event."""
model = models.Event
class EventDetailMixin(object):
def get_context_data(self, **kwargs):
context = super(EventDetailMixin, self).get_context_data(**kwargs)
if hasattr(self, 'event'):
context['event'] = self.event
else:
context['event'] = self.object.event
return context
class EventForm(PermissionRequiredMixin, generic.UpdateView):
class EventForm(PermissionRequiredMixin, mixins.EventDetailMixin,
generic.UpdateView):
"""Frontend formular to add or edit a Event."""
form_class = forms.EventForm
template_name = 'events/event_form.html'
permission_required = 'events.add_event'
def get_context_data(self, **kwargs):
"""Dynamicle set the title to Add or Edit Event, depanding if an
event ID was given, or not."""
context = super(EventForm, self).get_context_data(**kwargs)
if self.kwargs.get('pk'):
context['title'] = _("Edit Event")
@@ -110,18 +66,15 @@ class EventForm(PermissionRequiredMixin, generic.UpdateView):
return context
def get_object(self, queryset=None):
"""Try return the existing Event for an update if an id has been
submitted, else create a new one.
"""
If an id has been submitted, try return the existing Event for an update,
else creates a new one.
@param queryset:
"""
if self.kwargs.get('pk'):
return models.Event.objects.get(pk=self.kwargs['pk'])
else:
return models.Event()
return models.Event.objects.get(pk=self.kwargs['pk']) \
if self.kwargs.get('pk') else models.Event()
class EventGallery(generic.ListView):
class EventGallery(mixins.EventDetailMixin, generic.ListView):
"""Display a overview of all event photo albums."""
template_name = 'events/photo_gallery.html'
queryset = models.Event.objects.filter(
start__lt=timezone.now(),
@@ -132,69 +85,56 @@ class EventGallery(generic.ListView):
class EventListIcal(generic.View):
"""
Generates an returns an iCal File with all upcoming events.
"""
def add_event(self, event):
ics_event = Event()
dtstart = timezone.localtime(event.start)
dtend = timezone.localtime(event.end)
ics_event.add('DTSTART', dtstart)
ics_event.add('SUMMARY', event.name)
ics_event.add('DESCRIPTION', event.description)
ics_event.add('LOCATION', event.location.address)
ics_event.add('URL', 'http://www.kasu.at' + event.get_absolute_url())
ics_event['UID'] = 'event-%d@www.kasu.at' % event.pk
ics_event.add('PRIORITY', 5)
if event.end:
ics_event.add('DTEND', dtend)
self.calendar.add_component(ics_event)
"""Generates an returns an iCal File with all upcoming events."""
def get(self, request, *args, **kwargs):
"""Add all upcoming events to an .ics file and send it."""
response = HttpResponse(content_type="text/calendar; charset=UTF-8")
self.calendar = Calendar()
self.calendar.add('prodid', 'http://www.kasu.at/')
self.calendar.add('version', '2.0')
calendar = Calendar()
calendar.add('prodid', 'http://www.kasu.at/')
calendar.add('version', '2.0')
for event in models.Event.objects.upcoming(limit=None):
self.add_event(event)
response.write(self.calendar.to_ical())
ics_event = Event()
ics_event.add('DTSTART', timezone.localtime(event.start))
ics_event.add('SUMMARY', event.name)
ics_event.add('DESCRIPTION', event.description)
ics_event.add('LOCATION', event.location.address)
ics_event.add('URL',
'http://www.kasu.at' + event.get_absolute_url())
ics_event['UID'] = 'event-%d@www.kasu.at' % event.pk
ics_event.add('PRIORITY', 5)
if event.end:
ics_event.add('DTEND', timezone.localtime(event.end))
calendar.add_component(ics_event)
response.write(calendar.to_ical())
return response
class EventPhoto(generic.UpdateView):
class EventPhoto(mixins.EventDetailMixin, generic.UpdateView):
"""Display the requested Photo and allows rotation if the user has change
permissions."""
form_class = forms.EditPhotoForm
model = models.Photo
template_name = 'events/photo_detail.html'
def get_context_data(self, **kwargs):
context = super(EventPhoto, self).get_context_data()
try:
event = models.Event.objects.get(id=self.kwargs['event'])
except models.Event.DoesNotExist:
event = self.object.event
context['event'] = event
return context
def post(self, request, *args, **kwargs):
if request.POST.get('rotate') and request.user.has_perm(
'events.change_photo'):
photo = models.Photo.objects.get(pk=kwargs['pk'])
photo.rotate(request.POST['rotate'])
# return redirect(photo.get_absolute_url())
return self.get(request)
else:
return generic.UpdateView.post(self, request, *args, **kwargs)
class EventPhotoList(generic.ListView):
class EventPhotoList(mixins.EventDetailMixin, generic.ListView):
"""List all Photos of the event or event series in an album."""
context_object_name = 'photo_list'
event = None
paginate_by = 36
def get_context_data(self, **kwargs):
context = generic.ListView.get_context_data(self, **kwargs)
context['event'] = self.event
context = super(EventPhotoList, self).get_context_data(**kwargs)
context['form'] = forms.PhotoUploadForm(
initial={'event': self.event, 'photographer': self.request.user})
return context
@@ -210,13 +150,10 @@ class EventPhotoList(generic.ListView):
raise Http404(_('Event does not exist'))
class EventPhotoUpload(generic.FormView):
class EventPhotoUpload(mixins.EventDetailMixin, generic.FormView):
form_class = forms.PhotoUploadForm
template_name = 'events/photo_upload.html'
@method_decorator(permission_required('events.add_photo'))
def dispatch(self, *args, **kwargs):
return super(EventPhotoUpload, self).dispatch(*args, **kwargs)
permission_required = 'events.add_photo'
def get_context_data(self, **kwargs):
context = generic.FormView.get_context_data(self, **kwargs)
@@ -224,45 +161,30 @@ class EventPhotoUpload(generic.FormView):
return context
def get_initial(self):
"""
Set the current logged in user a default value for the photographer.
"""
return {
'photographer': self.request.user,
}
""" Set the current user as default value for the photographer."""
return {'photographer': self.request.user, }
def post(self, *args, **kwargs):
"""
"""
self.event = models.Event.objects.get(
id=self.request.REQUEST.get('event'))
photographer = self.request.POST.get('photographer',
self.request.user.id)
photographer = get_user_model().objects.get(id=photographer)
self.counter = 1
for upload in self.request.FILES.getlist('upload'):
name = upload.name
created_date, description = self.read_exif(upload)
event = models.Event.objects.get(id=self.request.POST.get('event'))
photographer = get_user_model().objects.get(
id=self.request.POST.get('photographer', self.request.user.id))
counter = 0
for image_file in self.request.FILES.getlist('upload'):
photo = models.Photo(
event=self.event,
event=event,
photographer=photographer,
image=upload,
name=name,
created_date=created_date,
description=description
image=image_file,
name=image_file.name,
created_date=event.start + timedelta(minutes=counter),
description=''
)
photo.save()
self.counter += 1
return redirect('event-photo-list', event=self.event.id)
def read_exif(self, photo):
created_date = self.event.start + timedelta(minutes=self.counter)
description = ''
return created_date, description
counter += 1
return redirect('event-photo-list', event=event.id)
class EventSeriesForm(EventDetailMixin, PermissionRequiredMixin, InlineFormSetView):
class EventSeriesForm(mixins.EventDetailMixin, PermissionRequiredMixin,
InlineFormSetView):
model = models.Event
inline_model = models.Event
fk_name = 'event_series'