terom@27: import datetime terom@27: terom@0: from django.db import models terom@2: from django.core.urlresolvers import reverse terom@4: import django.utils.http terom@4: from django.contrib.sites.models import get_current_site terom@6: from django.utils import timezone terom@4: terom@18: QRCODE_API = 'https://chart.googleapis.com/chart?cht=qr&chs={width}x{height}&chl={url}&chld=H' terom@0: terom@2: class URL(models.Model): terom@2: shorturl = models.SlugField(unique=True) terom@27: publishing_schedule = models.TimeField(default=datetime.time(), terom@27: help_text="Default time to publish new URLItems") terom@2: terom@3: class Meta: terom@12: verbose_name = u"URL Feed" terom@12: verbose_name_plural = u"URL Feeds" terom@3: terom@4: def qrcode_img (self, size=512) : terom@4: return QRCODE_API.format( terom@4: width=size, height=size, terom@4: url=django.utils.http.urlquote(self.qrcode_url()), terom@4: ) terom@4: terom@4: def qrcode_url (self) : terom@22: return 'HTTP://{domain}{url}'.format( terom@22: domain = get_current_site(None).domain.upper(), terom@23: url = self.get_absolute_url(), terom@22: ) terom@4: terom@2: def get_absolute_url (self) : terom@2: return reverse('shorturl', args=[self.shorturl]) terom@2: terom@7: def active_item(self, now=None) : terom@7: """Currently published URLItem.""" terom@6: if now is None : terom@6: now = timezone.now() terom@6: terom@16: try : terom@16: return URLItem.objects.filter(shorturl=self, published__lt=now).order_by('-published')[0] terom@16: except IndexError : terom@16: return None terom@6: terom@27: def upcoming_item (self, now=None) : terom@7: """Following published URLItem.""" terom@7: if now is None : terom@7: now = timezone.now() terom@7: terom@16: try : terom@16: return URLItem.objects.filter(shorturl=self, published__gt=now).order_by('published')[0] terom@16: except IndexError : terom@16: return None terom@7: terom@27: def last_item (self) : terom@27: """The last URLItem available.""" terom@27: terom@27: try : terom@27: return URLItem.objects.filter(shorturl=self).order_by('-published')[0] terom@27: except IndexError : terom@27: return None terom@27: terom@2: def __unicode__ (self) : terom@2: return self.shorturl terom@2: terom@28: class URLImage(models.Model): terom@28: image = models.ImageField(upload_to='qrurls-images') terom@40: title = models.CharField(max_length=1024) terom@30: uploaded = models.DateTimeField(auto_now_add=True) terom@30: terom@30: class Meta: terom@30: verbose_name = u"URL Image" terom@30: verbose_name_plural = u"URL Images" terom@30: ordering = ['uploaded'] terom@30: terom@32: def get_absolute_url (self) : terom@32: return self.image.url terom@32: terom@30: def __unicode__ (self) : terom@30: return self.image.name terom@28: terom@2: class URLItem(models.Model): terom@2: shorturl = models.ForeignKey(URL) terom@2: published = models.DateTimeField() terom@32: terom@32: # either-or terom@32: url = models.URLField(blank=True) # populated from image terom@32: image = models.ForeignKey(URLImage, null=True, blank=True) terom@2: terom@3: class Meta: terom@3: verbose_name = u"URL Item" terom@3: verbose_name_plural = u"URL Items" terom@3: ordering = ['published'] terom@3: terom@2: def get_absolute_url (self) : terom@35: if self.image : terom@35: return reverse('shorturl_image', kwargs=dict(shorturl=self.shorturl, item_id=self.id)) terom@35: else : terom@35: return self.url terom@2: terom@7: def published_age (self) : terom@6: now = timezone.now() terom@6: terom@6: if now > self.published: terom@6: td = now - self.published terom@6: else : terom@6: td = self.published - now terom@6: terom@6: days, seconds = td.days, td.seconds terom@6: m, s = divmod(seconds, 60) terom@6: h, m = divmod(m, 60) terom@7: terom@9: return (self.published < now), days, "{h}h {m}m {s}s".format(h=h, m=m, s=s) terom@7: terom@7: def published_state (self) : terom@9: date = self.published.strftime("%Y-%m-%d") terom@9: published, days, age = self.published_age() terom@6: terom@9: if published and days : terom@9: return "[{date}]".format(date=date) terom@9: elif published : terom@9: return "[{age}]".format(age=age) terom@6: elif days : terom@9: return "({when})".format(when=date) terom@6: else : terom@9: return "({age})".format(age=age) terom@6: terom@2: def __unicode__ (self) : terom@9: return u"{published_state} {url}".format( terom@9: published_state=self.published_state(), terom@7: url=self.get_absolute_url(), terom@7: ) terom@32: