Another Step in the Quest to clean up the code base.
This commit is contained in:
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user