author | Tero Marttila <terom@fixme.fi> |
Wed, 21 Aug 2013 01:17:44 +0300 | |
changeset 50 | b8a8269d7214 |
parent 48 | 5df9ed6b5976 |
child 51 | 6f35a169ef01 |
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 |
41
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
2 |
import hashlib |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
3 |
import os.path |
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
4 |
|
0
1fc671165892
django startproject/app skeleton
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
from django.db import models |
41
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
6 |
import django.core.files.storage |
2 | 7 |
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
|
8 |
import django.utils.http |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
9 |
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
|
10 |
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
|
11 |
|
18
dd08de6f1fe3
user high error correction rate for qrcode
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
12 |
QRCODE_API = 'https://chart.googleapis.com/chart?cht=qr&chs={width}x{height}&chl={url}&chld=H' |
41
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
13 |
IMAGES_MEDIA = 'qrurls-images' |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
14 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
15 |
class SecretFileSystemStorage (django.core.files.storage.FileSystemStorage) : |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
16 |
""" |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
17 |
Store files named by a sha1 hash of their contents. |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
18 |
""" |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
19 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
20 |
HASH = hashlib.sha1 |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
21 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
22 |
def _hash (self, content) : |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
23 |
"""Compute hash for given UploadedFile (as a hex string).""" |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
24 |
hash = self.HASH() |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
25 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
26 |
for chunk in content.chunks() : |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
27 |
hash.update(chunk) |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
28 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
29 |
return hash.hexdigest() |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
30 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
31 |
def save (self, name, content) : |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
32 |
# Get the proper name for the file, as it will actually be saved. |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
33 |
if name is None: |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
34 |
name = content.name |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
35 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
36 |
dirname, filename = os.path.split(name) |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
37 |
basename, fileext = os.path.splitext(filename) |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
38 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
39 |
# hash |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
40 |
name = "%s/%s%s" % (dirname, self._hash(content), fileext) |
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
41 |
|
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
42 |
return super(SecretFileSystemStorage, self).save(name, content) |
0
1fc671165892
django startproject/app skeleton
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
|
2 | 44 |
class URL(models.Model): |
48 | 45 |
shorturl = models.SlugField(unique=True, |
46 |
help_text="Changing this will break existing QR-codes!") |
|
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
47 |
publishing_time = models.TimeField(default=datetime.time(), |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
48 |
help_text="Default time to publish new URLItems (in timezone)") |
2 | 49 |
|
3 | 50 |
class Meta: |
12 | 51 |
verbose_name = u"URL Feed" |
52 |
verbose_name_plural = u"URL Feeds" |
|
3 | 53 |
|
4
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
54 |
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
|
55 |
return QRCODE_API.format( |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
56 |
width=size, height=size, |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
57 |
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
|
58 |
) |
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
59 |
|
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
60 |
def qrcode_url (self) : |
22
28a72692b749
keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents:
21
diff
changeset
|
61 |
return 'HTTP://{domain}{url}'.format( |
28a72692b749
keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents:
21
diff
changeset
|
62 |
domain = get_current_site(None).domain.upper(), |
23 | 63 |
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
|
64 |
) |
4
d56f48f6c94b
URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
65 |
|
2 | 66 |
def get_absolute_url (self) : |
67 |
return reverse('shorturl', args=[self.shorturl]) |
|
68 |
||
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
69 |
def now (self, now=None) : |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
70 |
""" |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
71 |
Return database-compatible concept of "now". |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
72 |
|
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
73 |
All datetimes are strictly stored and compared as UTC. Any |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
74 |
timezone-aware logic should happen in the admin. |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
75 |
""" |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
76 |
if now : |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
77 |
return now |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
78 |
else : |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
79 |
return timezone.now() |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
80 |
|
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
81 |
def active_item (self, now=None) : |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
82 |
"""Currently published URLItem.""" |
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
83 |
now = self.now(now) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
84 |
|
16
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
85 |
try : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
86 |
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
|
87 |
except IndexError : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
88 |
return None |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
89 |
|
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
90 |
def upcoming_item (self, now=None) : |
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
91 |
"""Next-up to-be-published URLItem.""" |
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
92 |
now = self.now(now) |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
93 |
|
16
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
94 |
try : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
95 |
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
|
96 |
except IndexError : |
523b3e9eddfa
fixbug modelget item upcoming
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
97 |
return None |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
98 |
|
27
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
99 |
def last_item (self) : |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
100 |
"""The last URLItem available.""" |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
101 |
|
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
102 |
try : |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
103 |
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
|
104 |
except IndexError : |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
105 |
return None |
ffcffe3024f1
sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents:
23
diff
changeset
|
106 |
|
2 | 107 |
def __unicode__ (self) : |
108 |
return self.shorturl |
|
109 |
||
28
d1733c82c278
migration for previous commit
Tero Marttila <terom@fixme.fi>
parents:
27
diff
changeset
|
110 |
class URLImage(models.Model): |
41
4d38296d58a3
use sha1 names for image storage
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
111 |
image = models.ImageField(upload_to=IMAGES_MEDIA, storage=SecretFileSystemStorage()) |
40 | 112 |
title = models.CharField(max_length=1024) |
30 | 113 |
uploaded = models.DateTimeField(auto_now_add=True) |
114 |
||
115 |
class Meta: |
|
116 |
verbose_name = u"URL Image" |
|
117 |
verbose_name_plural = u"URL Images" |
|
118 |
ordering = ['uploaded'] |
|
119 |
||
32 | 120 |
def get_absolute_url (self) : |
121 |
return self.image.url |
|
122 |
||
30 | 123 |
def __unicode__ (self) : |
45 | 124 |
return "[%s] %s" % (self.uploaded.strftime("%Y-%m-%d"), self.title) |
28
d1733c82c278
migration for previous commit
Tero Marttila <terom@fixme.fi>
parents:
27
diff
changeset
|
125 |
|
2 | 126 |
class URLItem(models.Model): |
127 |
shorturl = models.ForeignKey(URL) |
|
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
128 |
published = models.DateTimeField() # UTC |
32 | 129 |
|
130 |
# either-or |
|
131 |
url = models.URLField(blank=True) # populated from image |
|
132 |
image = models.ForeignKey(URLImage, null=True, blank=True) |
|
2 | 133 |
|
3 | 134 |
class Meta: |
135 |
verbose_name = u"URL Item" |
|
136 |
verbose_name_plural = u"URL Items" |
|
137 |
ordering = ['published'] |
|
138 |
||
2 | 139 |
def get_absolute_url (self) : |
43
3b1f1a928283
rename qrurls image view to item view
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
140 |
if self.url : |
3b1f1a928283
rename qrurls image view to item view
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
141 |
return self.url |
44 | 142 |
elif self.shorturl and self.id : |
143 |
return reverse('shorturl_item', kwargs=dict(shorturl=self.shorturl, item_id=self.id)) |
|
35
acc1a366fa7c
move URLItem save() override to just get_absolute_url(), since we won't have an item_id at save() time when adding
Tero Marttila <terom@fixme.fi>
parents:
33
diff
changeset
|
144 |
else : |
44 | 145 |
return None |
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
146 |
|
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
147 |
def published_age (self) : |
47
35a8e63648c8
clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
Tero Marttila <terom@fixme.fi>
parents:
45
diff
changeset
|
148 |
now = self.shorturl.now() # UTC |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
149 |
|
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
150 |
if now > self.published: |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
151 |
td = now - self.published |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
152 |
else : |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
153 |
td = self.published - now |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
154 |
|
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
155 |
days, seconds = td.days, td.seconds |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
156 |
m, s = divmod(seconds, 60) |
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
157 |
h, m = divmod(m, 60) |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
158 |
|
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
159 |
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
|
160 |
|
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
161 |
def published_state (self) : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
162 |
date = self.published.strftime("%Y-%m-%d") |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
163 |
published, days, age = self.published_age() |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
164 |
|
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
165 |
if published and days : |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
166 |
return "[{date}]".format(date=date) |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
167 |
elif published : |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
168 |
return "[{age}]".format(age=age) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
169 |
elif days : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
170 |
return "({when})".format(when=date) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
171 |
else : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
172 |
return "({age})".format(age=age) |
6
e821a59bf3a7
show published state for url items
Tero Marttila <terom@fixme.fi>
parents:
4
diff
changeset
|
173 |
|
2 | 174 |
def __unicode__ (self) : |
9
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
175 |
return u"{published_state} {url}".format( |
ccb1736fba1a
consistent published_state prefix format
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
176 |
published_state=self.published_state(), |
7
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
177 |
url=self.get_absolute_url(), |
8202196630d3
better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
178 |
) |
32 | 179 |