qrurls/models.py
author Tero Marttila <terom@paivola.fi>
Thu, 25 Jul 2013 00:23:59 +0200
changeset 22 28a72692b749
parent 21 c6095ed39538
child 23 f9eadb627bb4
permissions -rw-r--r--
keep shorturl case sensitive, but warn if not uppercase
0
1fc671165892 django startproject/app skeleton
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
from django.db import models
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     2
from django.core.urlresolvers import reverse
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     3
import django.utils.http
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     4
from django.contrib.sites.models import get_current_site
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
     5
from django.utils import timezone
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     6
18
dd08de6f1fe3 user high error correction rate for qrcode
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
     7
QRCODE_API = 'https://chart.googleapis.com/chart?cht=qr&chs={width}x{height}&chl={url}&chld=H'
0
1fc671165892 django startproject/app skeleton
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     9
class URL(models.Model):
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    10
    shorturl = models.SlugField(unique=True)
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    11
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    12
    class Meta:
12
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    13
        verbose_name = u"URL Feed"
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    14
        verbose_name_plural = u"URL Feeds"
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    15
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    16
    def qrcode_img (self, size=512) :
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    17
        return QRCODE_API.format(
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    18
                width=size, height=size,
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    19
                url=django.utils.http.urlquote(self.qrcode_url()),
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    20
        )
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    21
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    22
    def qrcode_url (self) :
22
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
    23
        return 'HTTP://{domain}{url}'.format(
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
    24
                domain = get_current_site(None).domain.upper(),
21
c6095ed39538 use /foobar urls for qrcodes
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
    25
                url = self.get_maxi_url(),
22
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
    26
        )
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    27
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    28
    def get_absolute_url (self) :
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    29
        return reverse('shorturl', args=[self.shorturl])
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    30
19
0742539e94c3 shorter urls
Tero Marttila <terom@paivola.fi>
parents: 18
diff changeset
    31
    def get_short_url (self) :
20
2d45215de95a fix urls
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
    32
        return reverse('miniurl', args=[self.id])
19
0742539e94c3 shorter urls
Tero Marttila <terom@paivola.fi>
parents: 18
diff changeset
    33
21
c6095ed39538 use /foobar urls for qrcodes
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
    34
    def get_maxi_url (self) :
c6095ed39538 use /foobar urls for qrcodes
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
    35
        return reverse('maxiurl', args=[self.shorturl])
c6095ed39538 use /foobar urls for qrcodes
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
    36
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    37
    def active_item(self, now=None) :
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    38
        """Currently published URLItem."""
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    39
        if now is None :
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    40
            now = timezone.now()
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    41
16
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    42
        try :
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    43
            return URLItem.objects.filter(shorturl=self, published__lt=now).order_by('-published')[0]
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    44
        except IndexError :
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    45
            return None
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    46
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    47
    def upcoming_item(self, now=None) :
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    48
        """Following published URLItem."""
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    49
        if now is None :
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    50
            now = timezone.now()
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    51
16
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    52
        try :
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    53
            return URLItem.objects.filter(shorturl=self, published__gt=now).order_by('published')[0]
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    54
        except IndexError :
523b3e9eddfa fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    55
            return None
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    56
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    57
    def __unicode__ (self) :
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    58
        return self.shorturl
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    59
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    60
class URLItem(models.Model):
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    61
    shorturl = models.ForeignKey(URL)
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    62
    published = models.DateTimeField()
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    63
    url = models.URLField()
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    64
    
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    65
    class Meta:
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    66
        verbose_name = u"URL Item"
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    67
        verbose_name_plural = u"URL Items"
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    68
        ordering = ['published']
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    69
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    70
    def get_absolute_url (self) :
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    71
        return self.url
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    72
    
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    73
    def published_age (self) :
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    74
        now = timezone.now()
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    75
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    76
        if now > self.published:
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    77
            td = now - self.published
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    78
        else :
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    79
            td = self.published - now
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    80
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    81
        days, seconds = td.days, td.seconds
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    82
        m, s = divmod(seconds, 60)
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    83
        h, m = divmod(m, 60)
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    84
9
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    85
        return (self.published < now), days, "{h}h {m}m {s}s".format(h=h, m=m, s=s)
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    86
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    87
    def published_state (self) :
9
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    88
        date = self.published.strftime("%Y-%m-%d")
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    89
        published, days, age = self.published_age()
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    90
9
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    91
        if published and days :
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    92
            return "[{date}]".format(date=date)
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    93
        elif published :
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    94
            return "[{age}]".format(age=age)
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    95
        elif days :
9
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    96
            return "({when})".format(when=date)
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    97
        else :
9
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    98
            return "({age})".format(age=age)
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    99
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   100
    def __unicode__ (self) :
9
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   101
        return u"{published_state} {url}".format(
ccb1736fba1a consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   102
                published_state=self.published_state(),
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   103
                url=self.get_absolute_url(),
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   104
        )