author | Tero Marttila <terom@fixme.fi> |
Thu, 15 Aug 2013 00:35:55 +0300 | |
changeset 33 | b714115da724 |
parent 32 | 82eae853e240 |
child 35 | acc1a366fa7c |
permissions | -rw-r--r-- |
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
1 |
import datetime |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
2 |
|
0
1fc671165892
django startproject/app skeleton
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
from django.db import models |
2 | 4 |
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
|
5 |
import django.utils.http |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
6 |
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
|
7 |
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
|
8 |
|
18
dd08de6f1fe3
user high error correction rate for qrcode
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
9 |
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
|
10 |
|
2 | 11 |
class URL(models.Model): |
12 |
shorturl = models.SlugField(unique=True) |
|
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
13 |
publishing_schedule = models.TimeField(default=datetime.time(), |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
14 |
help_text="Default time to publish new URLItems") |
2 | 15 |
|
3 | 16 |
class Meta: |
12 | 17 |
verbose_name = u"URL Feed" |
18 |
verbose_name_plural = u"URL Feeds" |
|
3 | 19 |
|
4
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
20 |
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
|
21 |
return QRCODE_API.format( |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
22 |
width=size, height=size, |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
23 |
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
|
24 |
) |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
25 |
|
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
26 |
def qrcode_url (self) : |
22
28a72692b749
keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents:
21
diff
changeset
|
27 |
return 'HTTP://{domain}{url}'.format( |
28a72692b749
keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents:
21
diff
changeset
|
28 |
domain = get_current_site(None).domain.upper(), |
23 | 29 |
url = self.get_absolute_url(), |
22
28a72692b749
keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents:
21
diff
changeset
|
30 |
) |
4
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
31 |
|
2 | 32 |
def get_absolute_url (self) : |
33 |
return reverse('shorturl', args=[self.shorturl]) |
|
34 |
||
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
35 |
def active_item(self, now=None) : |
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
36 |
"""Currently published URLItem.""" |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
37 |
if now is None : |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
38 |
now = timezone.now() |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
39 |
|
16
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
40 |
try : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
41 |
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
|
42 |
except IndexError : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
43 |
return None |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
44 |
|
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
45 |
def upcoming_item (self, now=None) : |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
46 |
"""Following published URLItem.""" |
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
47 |
if now is None : |
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
48 |
now = timezone.now() |
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
49 |
|
16
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
50 |
try : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
51 |
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
|
52 |
except IndexError : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
53 |
return None |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
54 |
|
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
55 |
def last_item (self) : |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
56 |
"""The last URLItem available.""" |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
57 |
|
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
58 |
try : |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
59 |
return URLItem.objects.filter(shorturl=self).order_by('-published')[0] |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
60 |
except IndexError : |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
61 |
return None |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
62 |
|
2 | 63 |
def __unicode__ (self) : |
64 |
return self.shorturl |
|
65 |
||
28
d1733c82c278
migration for previous commit
Tero Marttila <terom@fixme.fi>
parents:
27
diff
changeset
|
66 |
class URLImage(models.Model): |
d1733c82c278
migration for previous commit
Tero Marttila <terom@fixme.fi>
parents:
27
diff
changeset
|
67 |
image = models.ImageField(upload_to='qrurls-images') |
30 | 68 |
uploaded = models.DateTimeField(auto_now_add=True) |
69 |
||
70 |
class Meta: |
|
71 |
verbose_name = u"URL Image" |
|
72 |
verbose_name_plural = u"URL Images" |
|
73 |
ordering = ['uploaded'] |
|
74 |
||
32 | 75 |
def get_absolute_url (self) : |
76 |
return self.image.url |
|
77 |
||
30 | 78 |
def __unicode__ (self) : |
79 |
return self.image.name |
|
28
d1733c82c278
migration for previous commit
Tero Marttila <terom@fixme.fi>
parents:
27
diff
changeset
|
80 |
|
2 | 81 |
class URLItem(models.Model): |
82 |
shorturl = models.ForeignKey(URL) |
|
83 |
published = models.DateTimeField() |
|
32 | 84 |
|
85 |
# either-or |
|
86 |
url = models.URLField(blank=True) # populated from image |
|
87 |
image = models.ForeignKey(URLImage, null=True, blank=True) |
|
2 | 88 |
|
3 | 89 |
class Meta: |
90 |
verbose_name = u"URL Item" |
|
91 |
verbose_name_plural = u"URL Items" |
|
92 |
ordering = ['published'] |
|
93 |
||
2 | 94 |
def get_absolute_url (self) : |
95 |
return self.url |
|
96 |
||
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
97 |
def published_age (self) : |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
98 |
now = timezone.now() |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
99 |
|
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
100 |
if now > self.published: |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
101 |
td = now - self.published |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
102 |
else : |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
103 |
td = self.published - now |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
104 |
|
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
105 |
days, seconds = td.days, td.seconds |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
106 |
m, s = divmod(seconds, 60) |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
107 |
h, m = divmod(m, 60) |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
108 |
|
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
109 |
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
|
110 |
|
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
111 |
def published_state (self) : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
112 |
date = self.published.strftime("%Y-%m-%d") |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
113 |
published, days, age = self.published_age() |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
114 |
|
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
115 |
if published and days : |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
116 |
return "[{date}]".format(date=date) |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
117 |
elif published : |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
118 |
return "[{age}]".format(age=age) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
119 |
elif days : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
120 |
return "({when})".format(when=date) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
121 |
else : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
122 |
return "({age})".format(age=age) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
123 |
|
2 | 124 |
def __unicode__ (self) : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
125 |
return u"{published_state} {url}".format( |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
126 |
published_state=self.published_state(), |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
127 |
url=self.get_absolute_url(), |
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
128 |
) |
32 | 129 |
|
130 |
def save (self, *args, **kwargs) : |
|
131 |
if self.image : |
|
33
b714115da724
use seprate frontend view for url_images in url_items
Tero Marttila <terom@fixme.fi>
parents:
32
diff
changeset
|
132 |
self.url = reverse('shorturl_image', kwargs=dict(shorturl=self.shorturl, item_id=self.id)) |
32 | 133 |
|
134 |
super(URLItem, self).save(*args, **kwargs) |
|
135 |