181 lines
6.5 KiB
Python
181 lines
6.5 KiB
Python
# -'- Encoding: utf-8 -*-
|
|
|
|
from django.core.urlresolvers import reverse
|
|
from django.db import models
|
|
from django.template.defaultfilters import slugify
|
|
from django.utils.timezone import now
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from utils import COUNTRIES, OverwriteStorage
|
|
from gallery.models import Photo
|
|
from kasu import image_models
|
|
|
|
|
|
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.
|
|
|
|
@param instance: an Django Object for which the Image has been uploaded.
|
|
@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:
|
|
return "events/%s.%s" % (instance.id, extension)
|
|
else:
|
|
return "events/%s.%s" % (slugify(instance.name), extension)
|
|
elif isinstance(instance, Location):
|
|
if instance.id:
|
|
return "events/location/%s.%s" % (instance.id, extension)
|
|
else:
|
|
return "events/location/%s.%s" % (instance.id, extension)
|
|
elif isinstance(instance, Photo):
|
|
return "events/%s/%s" % (instance.event.id, filename)
|
|
|
|
|
|
class EventManager(models.Manager):
|
|
def current_event(self):
|
|
try:
|
|
current = self.filter(start__lte=now())
|
|
current = current.filter(end__gte=now())
|
|
return current.order_by('start', 'end')[0]
|
|
except:
|
|
return None
|
|
|
|
def next_event(self):
|
|
try:
|
|
return self.filter(start__gt=now()).order_by('start', 'end')[0]
|
|
except:
|
|
return None
|
|
|
|
def archive(self):
|
|
return self.filter(start__lt=now())
|
|
|
|
def upcoming(self, limit=3):
|
|
result = self.filter(start__gt=now()).order_by('start', 'end')
|
|
if limit:
|
|
return result[1:(limit + 1)]
|
|
else:
|
|
return result
|
|
|
|
|
|
class Event(image_models.ImageModel):
|
|
name = models.CharField(_('Name'), max_length=255)
|
|
description = models.TextField(_("Description"), blank=True)
|
|
location = models.ForeignKey('Location')
|
|
start = models.DateTimeField(_('Start'))
|
|
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)
|
|
is_tournament = models.BooleanField(_('Tournament'), default=False,
|
|
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 \
|
|
werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen \
|
|
Event übernommen.'))
|
|
objects = EventManager()
|
|
|
|
class Meta(object):
|
|
verbose_name = _('Event')
|
|
verbose_name_plural = _('Events')
|
|
ordering = ('-start', '-end',)
|
|
|
|
def __unicode__(self):
|
|
try:
|
|
return "%(name)s (%(date)s)" % {'name': self.name,
|
|
'date': self.start.date()}
|
|
except:
|
|
return "New Event Model"
|
|
|
|
def get_absolute_url(self):
|
|
kwargs = {
|
|
'pk': self.id,
|
|
'year': self.start.strftime('%Y'),
|
|
'month': self.start.strftime('%m')
|
|
}
|
|
return reverse('event-detail', kwargs=kwargs)
|
|
|
|
def get_edit_url(self):
|
|
kwargs = {
|
|
'pk': self.id,
|
|
'year': self.start.strftime('%Y'),
|
|
'month': self.start.strftime('%m')
|
|
}
|
|
return reverse('event-form', kwargs=kwargs)
|
|
|
|
def get_callout(self):
|
|
if self.image:
|
|
return self.callout
|
|
elif self.photo_set.count():
|
|
return self.photo_set.all().order_by('?')[0].callout
|
|
elif self.location.image:
|
|
return self.location.callout
|
|
else:
|
|
return None
|
|
|
|
def get_thumbnail(self):
|
|
if self.image:
|
|
return self.thumbnail
|
|
elif self.photo_set.count():
|
|
return self.photo_set.all().order_by('?')[0].thumbnail
|
|
elif self.location.image:
|
|
return self.location.thumbnail
|
|
else:
|
|
return None
|
|
|
|
def save(self, **kwargs):
|
|
if self.event_series:
|
|
master_event = self.event_series
|
|
self.description = master_event.description
|
|
self.location = master_event.location
|
|
self.url = master_event.url
|
|
self.image = master_event.image
|
|
self.photo_count = self.photo_set.count()
|
|
super(Event, self).save(**kwargs)
|
|
|
|
# Update the rest of the event series:
|
|
for sub_event in Event.objects.filter(event_series=self):
|
|
sub_event.save()
|
|
|
|
# Update the Hanchans if necesery:
|
|
for hanchan in self.hanchan_set.all():
|
|
hanchan.save()
|
|
|
|
|
|
class Location(image_models.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)
|
|
url = models.URLField(_('Homepage'), blank=True)
|
|
postal_code = models.CharField(_('Postal Code'), max_length=6)
|
|
street_address = models.CharField(_('Street Address'), max_length=127)
|
|
locality = models.CharField(_('Locality'), max_length=127)
|
|
country = models.CharField(_('Country'), max_length=2, choices=COUNTRIES)
|
|
|
|
class Meta(object):
|
|
verbose_name = _('Venue')
|
|
verbose_name_plural = _('Venues')
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
@property
|
|
def address(self):
|
|
address = (self.street_address, self.locality, self.country,)
|
|
return ','.join(address)
|
|
|
|
|
|
models.signals.post_save.connect(image_models.regenerate_image_cache,
|
|
sender=Event)
|
|
models.signals.post_save.connect(image_models.regenerate_image_cache,
|
|
sender=Location) |