Diverse Code Cleanups
*Code wurde PEP-8 gerecht formatiert * Kleine Fehler die der PyCharm Inspector beanstandet wurden korrigiert
This commit is contained in:
committed by
Christian Berg
parent
f34281089d
commit
86a0db050d
@@ -1,8 +1,8 @@
|
||||
'''
|
||||
"""
|
||||
Created on 19.09.2011
|
||||
|
||||
@author: christian
|
||||
'''
|
||||
"""
|
||||
# import stuff we need from django
|
||||
from django.contrib import admin
|
||||
from events.models import Event, Photo, Location
|
||||
@@ -33,11 +33,11 @@ class LocationAdmin(admin.ModelAdmin):
|
||||
class PhotoAdmin(admin.ModelAdmin):
|
||||
admin_thumbnail = AdminThumbnail(image_field='thumbnail')
|
||||
fields = ('image', 'event', 'name', 'description',
|
||||
('anchor_horizontal', 'anchor_vertical'),
|
||||
('photographer', 'created_date'))
|
||||
('anchor_horizontal', 'anchor_vertical'),
|
||||
('photographer', 'created_date'))
|
||||
list_filter = ('event', 'on_startpage',)
|
||||
list_display = ('admin_thumbnail', 'image', 'name', 'event',
|
||||
'photographer', 'on_startpage')
|
||||
'photographer', 'on_startpage')
|
||||
list_display_links = ('image',)
|
||||
list_editable = ('on_startpage', 'name', 'event', 'photographer')
|
||||
|
||||
|
||||
@@ -1,24 +1,31 @@
|
||||
'''
|
||||
"""
|
||||
Created on 03.10.2011
|
||||
|
||||
@author: christian
|
||||
'''
|
||||
"""
|
||||
from . import models
|
||||
from django import forms
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.contrib.auth import get_user_model
|
||||
from utils.html5.widgets import DateTimeInput
|
||||
|
||||
user_query = get_user_model().objects.all()
|
||||
|
||||
|
||||
class PhotoUploadForm(forms.Form):
|
||||
error_css_class = 'error'
|
||||
required_css_class = 'required'
|
||||
|
||||
photographer = forms.ModelChoiceField(User.objects.all(), required=True,)
|
||||
photographer = forms.ModelChoiceField(user_query, required=True,)
|
||||
event = forms.ModelChoiceField(models.Event.objects.all(), required=True,)
|
||||
upload = forms.FileField(label=_('Images'), required=True,
|
||||
widget=forms.widgets.ClearableFileInput(attrs={'multiple': 'multiple',
|
||||
'accept': "image/gif,image/png,image/jpeg"})
|
||||
upload = forms.FileField(
|
||||
label=_('Images'),
|
||||
required=True,
|
||||
widget=forms.widgets.ClearableFileInput(
|
||||
attrs={
|
||||
'multiple': 'multiple',
|
||||
'accept': "image/gif,image/png,image/jpeg"
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ CHOICES_VERTICAL = (
|
||||
|
||||
|
||||
def get_upload_path(instance, filename):
|
||||
'''
|
||||
"""
|
||||
Generates the desired file path and filename for an uploaded Image.
|
||||
With this function Django can save the uploaded images to subfolders that
|
||||
also have a meaning for humans.
|
||||
@@ -40,7 +40,7 @@ def get_upload_path(instance, filename):
|
||||
@type instance: a instace of an models.Model sub-class.
|
||||
@param filename: The filename of the uploaded image.
|
||||
@type filename: String
|
||||
'''
|
||||
"""
|
||||
extension = filename[filename.rfind('.') + 1:]
|
||||
if isinstance(instance, Event):
|
||||
if instance.id:
|
||||
@@ -57,9 +57,9 @@ def get_upload_path(instance, filename):
|
||||
|
||||
|
||||
def post_save_image(sender, instance=None, created=False, raw=False, **kwargs):
|
||||
'''
|
||||
"""
|
||||
Reganerate the images.
|
||||
'''
|
||||
"""
|
||||
os.remove(instance.display.path)
|
||||
os.remove(instance.callout.path)
|
||||
os.remove(instance.thumbnail.path)
|
||||
@@ -95,7 +95,7 @@ class CalloutImage(ImageSpec):
|
||||
class DisplayImage(ImageSpec):
|
||||
format = 'PNG'
|
||||
processors = [processors.Transpose(),
|
||||
processors.ResizeToFit(width=940, height=940, upscale=False)]
|
||||
processors.ResizeToFit(width=940, height=940, upscale=False)]
|
||||
|
||||
|
||||
class ThumbnailImage(CalloutImage):
|
||||
@@ -121,7 +121,7 @@ class ImageModel(models.Model):
|
||||
except AttributeError:
|
||||
return None
|
||||
if anchor_horizontal and anchor_vertical:
|
||||
return (self.anchor_horizontal, self.anchor_vertical)
|
||||
return self.anchor_horizontal, self.anchor_vertical
|
||||
else:
|
||||
return None
|
||||
|
||||
@@ -130,7 +130,6 @@ class ImageModel(models.Model):
|
||||
|
||||
|
||||
class EventManager(models.Manager):
|
||||
|
||||
def current_event(self):
|
||||
try:
|
||||
current = self.filter(start__lte=now())
|
||||
@@ -164,15 +163,15 @@ class Event(ImageModel):
|
||||
end = models.DateTimeField(_('End'), blank=True, null=True)
|
||||
url = models.URLField(_('Homepage'), blank=True)
|
||||
image = models.ImageField(_("Image"), upload_to=get_upload_path,
|
||||
storage=OverwriteStorage(), blank=True, null=True)
|
||||
storage=OverwriteStorage(), blank=True, null=True)
|
||||
is_tournament = models.BooleanField(_('Tournament'), default=False,
|
||||
help_text=_(u'This event is a tournament, different rules apply for \
|
||||
help_text=_(u'This event is a tournament, different rules apply for \
|
||||
the kyu ranking.'))
|
||||
photo_count = models.PositiveIntegerField(default=0, editable=False)
|
||||
event_series = models.ForeignKey('Event', blank=True, null=True,
|
||||
on_delete=models.SET_NULL, editable=False,
|
||||
verbose_name=_('Event Series'),
|
||||
help_text=_(u'Wenn dieser Event zu einer Veranstaltungsreihe gehört \
|
||||
on_delete=models.SET_NULL, editable=False,
|
||||
verbose_name=_('Event Series'),
|
||||
help_text=_(u'Wenn dieser Event zu einer Veranstaltungsreihe gehört \
|
||||
werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen \
|
||||
Event übernommen.'))
|
||||
objects = EventManager()
|
||||
@@ -185,7 +184,7 @@ class Event(ImageModel):
|
||||
def __unicode__(self):
|
||||
try:
|
||||
return "%(name)s (%(date)s)" % {'name': self.name,
|
||||
'date': self.start.date()}
|
||||
'date': self.start.date()}
|
||||
except:
|
||||
return "New Event Model"
|
||||
|
||||
@@ -248,7 +247,7 @@ class Location(ImageModel):
|
||||
name = models.CharField(_("Name"), max_length=200)
|
||||
description = models.TextField(_("Description"), blank=True)
|
||||
image = models.ImageField(_("Image"), upload_to=get_upload_path,
|
||||
storage=OverwriteStorage(), blank=True, null=True)
|
||||
storage=OverwriteStorage(), blank=True, null=True)
|
||||
url = models.URLField(_('Homepage'), blank=True)
|
||||
postal_code = models.CharField(_('Postal Code'), max_length=6)
|
||||
street_address = models.CharField(_('Street Address'), max_length=127)
|
||||
@@ -283,7 +282,7 @@ class PhotoManager(models.Manager):
|
||||
class Photo(ImageModel):
|
||||
name = models.CharField(_("Name"), max_length=100, blank=True)
|
||||
image = models.ImageField(_("Image"), upload_to=get_upload_path,
|
||||
storage=OverwriteStorage())
|
||||
storage=OverwriteStorage())
|
||||
anchor_horizontal = models.FloatField(
|
||||
_('horizontal Anchorpoint'),
|
||||
choices=CHOICES_HORIZONTAL,
|
||||
@@ -300,14 +299,23 @@ class Photo(ImageModel):
|
||||
)
|
||||
|
||||
event = models.ForeignKey(Event)
|
||||
description = models.TextField(_("Description"), max_length=300,
|
||||
blank=True)
|
||||
photographer = models.ForeignKey('auth.User')
|
||||
on_startpage = models.BooleanField(_("Startpage"), default=False,
|
||||
help_text=_('Display this Photo on the Startpage Teaser'))
|
||||
description = models.TextField(
|
||||
_("Description"),
|
||||
max_length=300,
|
||||
blank=True
|
||||
)
|
||||
photographer = models.ForeignKey(settings.AUTH_USER_MODEL)
|
||||
on_startpage = models.BooleanField(
|
||||
_("Startpage"),
|
||||
default=False,
|
||||
help_text=_('Display this Photo on the Startpage Teaser')
|
||||
)
|
||||
created_date = models.DateTimeField(_("Published on"))
|
||||
views = models.PositiveIntegerField(_("Number of views"), editable=False,
|
||||
default=0)
|
||||
views = models.PositiveIntegerField(
|
||||
_("Number of views"),
|
||||
editable=False,
|
||||
default=0
|
||||
)
|
||||
objects = PhotoManager()
|
||||
metadata = None
|
||||
orientation = 1
|
||||
@@ -340,12 +348,12 @@ class Photo(ImageModel):
|
||||
self.metadata.write()
|
||||
|
||||
def rotate(self, rotate):
|
||||
'''
|
||||
"""
|
||||
Sets an the Exif tag in an image to set the right direction.
|
||||
This provides lossless image rotation.
|
||||
@param rotate: 'clockwise' or 'counter-clockwise' the direction in
|
||||
which we should rotate the image in 90° steps.
|
||||
'''
|
||||
"""
|
||||
if not self.metadata:
|
||||
self.read_metadata()
|
||||
if rotate == 'clockwise':
|
||||
@@ -369,24 +377,27 @@ class Photo(ImageModel):
|
||||
self.save()
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('event-photo', kwargs={'event': self.event.id,
|
||||
'pk': self.id})
|
||||
return reverse(
|
||||
'event-photo',
|
||||
kwargs={'event': self.event.id, 'pk': self.id}
|
||||
)
|
||||
|
||||
@property
|
||||
def next_photo(self):
|
||||
return self.get_next_by_created_date(event=self.event)
|
||||
return self.get_next_by_created_date(event=self.event)
|
||||
|
||||
@property
|
||||
def previous_photo(self):
|
||||
return self.get_previous_by_created_date(event=self.event)
|
||||
return self.get_previous_by_created_date(event=self.event)
|
||||
|
||||
def save(self, **kwargs):
|
||||
'''
|
||||
"""
|
||||
Triggers to save related Event to save. This should force an update for
|
||||
the denormalized Photo count.
|
||||
'''
|
||||
"""
|
||||
ImageModel.save(self, **kwargs)
|
||||
self.save_metadata()
|
||||
self.event.save()
|
||||
|
||||
|
||||
models.signals.post_save.connect(post_save_image, sender=Photo)
|
||||
|
||||
@@ -1,40 +1,48 @@
|
||||
from imagekit.specs import ImageSpec
|
||||
from imagekit import processors
|
||||
|
||||
|
||||
class ResizeDisplay(processors.Resize):
|
||||
width = 780
|
||||
crop = False
|
||||
upscale = False
|
||||
|
||||
# first we define our thumbnail resize processor
|
||||
|
||||
# first we define our thumbnail resize processor
|
||||
class ResizeCallout(processors.Resize):
|
||||
width = 620
|
||||
height = 300
|
||||
crop = True
|
||||
|
||||
|
||||
|
||||
class ResizeAdmin(processors.Resize):
|
||||
width = 60
|
||||
height = 60
|
||||
crop = True
|
||||
|
||||
|
||||
class ResizeThumbnail(processors.Resize):
|
||||
width = 140
|
||||
height = 140
|
||||
crop = True
|
||||
|
||||
|
||||
# Different Image Sizes
|
||||
class Admin(ImageSpec):
|
||||
pre_cache = False
|
||||
processors = [processors.Transpose, ResizeAdmin]
|
||||
|
||||
|
||||
class Display(ImageSpec):
|
||||
pre_cache = False
|
||||
processors = [processors.Transpose, ResizeDisplay]
|
||||
|
||||
|
||||
class Callout(ImageSpec):
|
||||
pre_cache = False
|
||||
processors = [processors.Transpose, ResizeCallout]
|
||||
|
||||
|
||||
class Thumbnail(ImageSpec):
|
||||
pre_cache = False
|
||||
processors = [processors.Transpose, ResizeThumbnail]
|
||||
@@ -2,20 +2,24 @@
|
||||
{% load i18n comments %}
|
||||
|
||||
{% block maincontent %}
|
||||
<header>
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<h1 class="grid_12">Dieses Photo wirklich löschen?</h1>
|
||||
</header>
|
||||
<img src="{{photo.display.url}}" alt="{{photo.name}}" title="{{photo.name}}" class="grid_10 push_1" />
|
||||
<br class="clear" />
|
||||
<p>Sind Sie sicher, dass Sie das Bild “{{photo.name}}” löschen wollen?</p>
|
||||
<p class="buttonbar">
|
||||
<a href="{% url 'event-photo-list' photo.event.id %}" class="button" style="float: left;"><img src="{{STATIC_URL}}icons/cancel.png" alt="{% trans 'Cancel' %}" /> {% trans 'Cancel' %}</a>
|
||||
<button type="submit"><img src="{{STATIC_URL}}icons/delete.png" alt="{% trans 'Delete' %}" /> {% trans 'Delete' %}</button>
|
||||
<form action="" method="post" class="grid_12">
|
||||
{% csrf_token %}
|
||||
<header>
|
||||
<h1 class="grid_12">Dieses Photo wirklich löschen?</h1>
|
||||
</header>
|
||||
<p>Sind Sie sicher, dass Sie das Bild “{{photo.name}}” löschen wollen?</p>
|
||||
<img src="{{photo.display.url}}" alt="{{photo.name}}" title="{{photo.name}}" class="grid_10 push_1"/>
|
||||
<br class="clear"/>
|
||||
<p> </p>
|
||||
<p class="buttonbar">
|
||||
<a href="{% url 'event-photo-list' photo.event.id %}" class="button" style="float: left;"><img
|
||||
src="{{STATIC_URL}}icons/cancel.png" alt="{% trans 'Cancel' %}"/> {% trans 'Cancel' %}</a>
|
||||
<button type="submit"><img src="{{STATIC_URL}}icons/delete.png" alt="{% trans 'Delete' %}"/>
|
||||
{% trans 'Delete' %}
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
</p>
|
||||
|
||||
{% endblock %}
|
||||
{% block buttonbar %}{% endblock %}
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
{% else %}
|
||||
<li><a href="{{ current_top_page.get_absolute_url }}" {% ifequal current_page current_top_page %}class="active"{% endifequal %}>{{current_top_page.menu_name}}</a></li>
|
||||
{% if perms.event.add_photo %}
|
||||
<li><a href="/gallery/upload/" {% ifequal current_path 'gallery/upload' %}class="active"{% endifequal %}>{% trans 'Upload' %}</a></li>
|
||||
<li><a href="/gallery/upload/" class="{% ifequal current_path 'gallery/upload' %}active{% endifequal %}">{% trans 'Upload' %}</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
{% else %}
|
||||
<li><a href="{{ current_top_page.get_absolute_url }}" {% ifequal current_page current_top_page %}class="active"{% endifequal %}>{{current_top_page.menu_name}}</a></li>
|
||||
{% if perms.event.add_photo %}
|
||||
<li><a href="/gallery/upload/" {% ifequal current_path 'gallery/upload' %}class="active"{% endifequal %}>{% trans 'Upload' %}</a></li>
|
||||
<li><a href="/gallery/upload/" class="{% ifequal current_path 'gallery/upload' %}active{% endifequal %}">{% trans 'Upload' %}</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Create your views here.
|
||||
from . import models, forms
|
||||
from datetime import timedelta
|
||||
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponse, Http404
|
||||
from django.shortcuts import redirect
|
||||
@@ -13,8 +13,11 @@ from django.utils.translation import ugettext as _
|
||||
from django.views import generic
|
||||
from icalendar import Calendar, Event
|
||||
import pyexiv2
|
||||
|
||||
from utils.mixins import PermissionRequiredMixin
|
||||
|
||||
from . import models, forms
|
||||
|
||||
|
||||
class DeleteEventPhoto(generic.DeleteView):
|
||||
model = models.Photo
|
||||
@@ -22,6 +25,7 @@ class DeleteEventPhoto(generic.DeleteView):
|
||||
def get_object(self, queryset=None):
|
||||
return models.Photo.objects.get(pk=self.kwargs['pk'])
|
||||
"""
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('event-photo-list', args=[self.object.event.id])
|
||||
|
||||
@@ -29,18 +33,22 @@ class DeleteEventPhoto(generic.DeleteView):
|
||||
def dispatch(self, *args, **kwargs):
|
||||
return super(DeleteEventPhoto, self).dispatch(*args, **kwargs)
|
||||
|
||||
|
||||
class EventArchiveIndex(generic.ArchiveIndexView):
|
||||
allow_empty = True
|
||||
context_object_name = 'event_list'
|
||||
date_field = 'start'
|
||||
model = models.Event
|
||||
paginate_by = 5
|
||||
queryset = model.objects.all()
|
||||
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
|
||||
@@ -54,6 +62,7 @@ class EventArchiveMonth(generic.MonthArchiveView):
|
||||
context['is_archive'] = True
|
||||
return context
|
||||
|
||||
|
||||
class EventArchiveYear(generic.YearArchiveView):
|
||||
date_field = 'start'
|
||||
make_object_list = True
|
||||
@@ -67,24 +76,26 @@ class EventArchiveYear(generic.YearArchiveView):
|
||||
context['is_archive'] = True
|
||||
return context
|
||||
|
||||
|
||||
class EventDetail(generic.DetailView):
|
||||
model = models.Event
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = generic.DetailView.get_context_data(self, **kwargs)
|
||||
context['form'] = forms.PhotoUploadForm(initial={'event':self.object, 'photographer': self.request.user})
|
||||
context['form'] = forms.PhotoUploadForm(initial={'event': self.object, 'photographer': self.request.user})
|
||||
return context
|
||||
|
||||
|
||||
class EventForm(PermissionRequiredMixin, generic.UpdateView):
|
||||
form_class = forms.EventForm
|
||||
permission_required = 'events.add_event'
|
||||
|
||||
def get_object(self, queryset=None):
|
||||
'''
|
||||
"""
|
||||
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'):
|
||||
event = models.Event.objects.get(pk=self.kwargs['pk'])
|
||||
if event.event_series:
|
||||
@@ -94,15 +105,17 @@ class EventForm(PermissionRequiredMixin, generic.UpdateView):
|
||||
else:
|
||||
return models.Event()
|
||||
|
||||
|
||||
class EventGallery(generic.ListView):
|
||||
template_name = 'events/photo_gallery.html'
|
||||
queryset = models.Event.objects.filter(start__lt=timezone.now(), photo_count__gt=0)
|
||||
paginate_by = 12
|
||||
|
||||
|
||||
class EventListIcal(generic.View):
|
||||
'''
|
||||
"""
|
||||
Generates an returns an iCal File with all upcoming events.
|
||||
'''
|
||||
"""
|
||||
|
||||
def add_event(self, event):
|
||||
ics_event = Event()
|
||||
@@ -130,6 +143,7 @@ class EventListIcal(generic.View):
|
||||
response.write(self.calendar.to_ical())
|
||||
return response
|
||||
|
||||
|
||||
class EventPhoto(generic.UpdateView):
|
||||
form_class = forms.EditPhotoForm
|
||||
model = models.Photo
|
||||
@@ -144,6 +158,7 @@ class EventPhoto(generic.UpdateView):
|
||||
else:
|
||||
return generic.UpdateView.post(self, request, *args, **kwargs)
|
||||
|
||||
|
||||
class EventPhotoList(generic.ListView):
|
||||
context_object_name = 'photo_list'
|
||||
paginate_by = 36
|
||||
@@ -151,7 +166,7 @@ class EventPhotoList(generic.ListView):
|
||||
def get_context_data(self, **kwargs):
|
||||
context = generic.ListView.get_context_data(self, **kwargs)
|
||||
context['event'] = self.event
|
||||
context['form'] = forms.PhotoUploadForm(initial={'event':self.event, 'photographer': self.request.user})
|
||||
context['form'] = forms.PhotoUploadForm(initial={'event': self.event, 'photographer': self.request.user})
|
||||
return context
|
||||
|
||||
def get_queryset(self):
|
||||
@@ -161,6 +176,7 @@ class EventPhotoList(generic.ListView):
|
||||
except models.Event.DoesNotExist:
|
||||
raise Http404(_('Event does not exist'))
|
||||
|
||||
|
||||
class EventPhotoUpload(generic.FormView):
|
||||
form_class = forms.PhotoUploadForm
|
||||
template_name = 'events/photo_upload.html'
|
||||
@@ -175,24 +191,20 @@ 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,
|
||||
}
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
'''
|
||||
|
||||
'''
|
||||
self.event = models.Event.objects.get(id=self.request.REQUEST.get('event'))
|
||||
photographer = self.request.POST.get('photographer')
|
||||
if photographer:
|
||||
photographer = User.objects.get(id=photographer)
|
||||
else:
|
||||
photographer = self.request.user
|
||||
"""
|
||||
|
||||
"""
|
||||
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
|
||||
@@ -221,8 +233,9 @@ class EventPhotoUpload(generic.FormView):
|
||||
description = exif_data['Exif.Image.ImageDescription'].value
|
||||
except:
|
||||
description = ''
|
||||
return (created_date, description)
|
||||
return created_date, description
|
||||
|
||||
|
||||
class UpcomingEvents(generic.ListView):
|
||||
queryset = models.Event.objects.upcoming(limit=None)
|
||||
paginate_by = 12
|
||||
paginate_by = 16
|
||||
|
||||
Reference in New Issue
Block a user