from django.db import models
from django.core.urlresolvers import reverse
import django.utils.http
from django.contrib.sites.models import get_current_site
from django.utils import timezone
QRCODE_API = 'https://chart.googleapis.com/chart?cht=qr&chs={width}x{height}&chl={url}'
class URL(models.Model):
shorturl = models.SlugField(unique=True)
class Meta:
verbose_name = u"URL"
verbose_name_plural = u"URLs"
def qrcode_img (self, size=512) :
return QRCODE_API.format(
width=size, height=size,
url=django.utils.http.urlquote(self.qrcode_url()),
)
def qrcode_url (self) :
return 'http://{domain}{url}'.format(
domain = get_current_site(None).domain,
url = self.get_absolute_url(),
)
def get_absolute_url (self) :
return reverse('shorturl', args=[self.shorturl])
def active_item(self, now=None) :
"""Currently published URLItem."""
if now is None :
now = timezone.now()
return URLItem.objects.filter(shorturl=self, published__lt=now).order_by('-published')[0]
def upcoming_item(self, now=None) :
"""Following published URLItem."""
if now is None :
now = timezone.now()
return URLItem.objects.filter(shorturl=self, published__gt=now).order_by('published')[0]
def __unicode__ (self) :
return self.shorturl
class URLItem(models.Model):
shorturl = models.ForeignKey(URL)
published = models.DateTimeField()
url = models.URLField()
class Meta:
verbose_name = u"URL Item"
verbose_name_plural = u"URL Items"
ordering = ['published']
def get_absolute_url (self) :
return self.url
def published_age (self) :
now = timezone.now()
if now > self.published:
td = now - self.published
else :
td = self.published - now
days, seconds = td.days, td.seconds
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
return (self.published < now), days, "{h}h {m}m {s}s".format(h=h, m=m, s=s)
def published_state (self) :
date = self.published.strftime("%Y-%m-%d")
published, days, age = self.published_age()
if published and days :
return "[{date}]".format(date=date)
elif published :
return "[{age}]".format(age=age)
elif days :
return "({when})".format(when=date)
else :
return "({age})".format(age=age)
def __unicode__ (self) :
return u"{published_state} {url}".format(
published_state=self.published_state(),
url=self.get_absolute_url(),
)