equal
deleted
inserted
replaced
41 |
41 |
42 return super(SecretFileSystemStorage, self).save(name, content) |
42 return super(SecretFileSystemStorage, self).save(name, content) |
43 |
43 |
44 class URL(models.Model): |
44 class URL(models.Model): |
45 shorturl = models.SlugField(unique=True) |
45 shorturl = models.SlugField(unique=True) |
46 publishing_schedule = models.TimeField(default=datetime.time(), |
46 publishing_time = models.TimeField(default=datetime.time(), |
47 help_text="Default time to publish new URLItems") |
47 help_text="Default time to publish new URLItems (in timezone)") |
48 |
48 |
49 class Meta: |
49 class Meta: |
50 verbose_name = u"URL Feed" |
50 verbose_name = u"URL Feed" |
51 verbose_name_plural = u"URL Feeds" |
51 verbose_name_plural = u"URL Feeds" |
52 |
52 |
63 ) |
63 ) |
64 |
64 |
65 def get_absolute_url (self) : |
65 def get_absolute_url (self) : |
66 return reverse('shorturl', args=[self.shorturl]) |
66 return reverse('shorturl', args=[self.shorturl]) |
67 |
67 |
68 def active_item(self, now=None) : |
68 def now (self, now=None) : |
|
69 """ |
|
70 Return database-compatible concept of "now". |
|
71 |
|
72 All datetimes are strictly stored and compared as UTC. Any |
|
73 timezone-aware logic should happen in the admin. |
|
74 """ |
|
75 if now : |
|
76 return now |
|
77 else : |
|
78 return timezone.now() |
|
79 |
|
80 def active_item (self, now=None) : |
69 """Currently published URLItem.""" |
81 """Currently published URLItem.""" |
70 if now is None : |
82 now = self.now(now) |
71 now = timezone.now() |
|
72 |
83 |
73 try : |
84 try : |
74 return URLItem.objects.filter(shorturl=self, published__lt=now).order_by('-published')[0] |
85 return URLItem.objects.filter(shorturl=self, published__lt=now).order_by('-published')[0] |
75 except IndexError : |
86 except IndexError : |
76 return None |
87 return None |
77 |
88 |
78 def upcoming_item (self, now=None) : |
89 def upcoming_item (self, now=None) : |
79 """Following published URLItem.""" |
90 """Next-up to-be-published URLItem.""" |
80 if now is None : |
91 now = self.now(now) |
81 now = timezone.now() |
|
82 |
92 |
83 try : |
93 try : |
84 return URLItem.objects.filter(shorturl=self, published__gt=now).order_by('published')[0] |
94 return URLItem.objects.filter(shorturl=self, published__gt=now).order_by('published')[0] |
85 except IndexError : |
95 except IndexError : |
86 return None |
96 return None |
112 def __unicode__ (self) : |
122 def __unicode__ (self) : |
113 return "[%s] %s" % (self.uploaded.strftime("%Y-%m-%d"), self.title) |
123 return "[%s] %s" % (self.uploaded.strftime("%Y-%m-%d"), self.title) |
114 |
124 |
115 class URLItem(models.Model): |
125 class URLItem(models.Model): |
116 shorturl = models.ForeignKey(URL) |
126 shorturl = models.ForeignKey(URL) |
117 published = models.DateTimeField() |
127 published = models.DateTimeField() # UTC |
118 |
128 |
119 # either-or |
129 # either-or |
120 url = models.URLField(blank=True) # populated from image |
130 url = models.URLField(blank=True) # populated from image |
121 image = models.ForeignKey(URLImage, null=True, blank=True) |
131 image = models.ForeignKey(URLImage, null=True, blank=True) |
122 |
132 |
130 return self.url |
140 return self.url |
131 elif self.shorturl and self.id : |
141 elif self.shorturl and self.id : |
132 return reverse('shorturl_item', kwargs=dict(shorturl=self.shorturl, item_id=self.id)) |
142 return reverse('shorturl_item', kwargs=dict(shorturl=self.shorturl, item_id=self.id)) |
133 else : |
143 else : |
134 return None |
144 return None |
135 |
145 |
136 def published_age (self) : |
146 def published_age (self) : |
137 now = timezone.now() |
147 now = self.shorturl.now() # UTC |
138 |
148 |
139 if now > self.published: |
149 if now > self.published: |
140 td = now - self.published |
150 td = now - self.published |
141 else : |
151 else : |
142 td = self.published - now |
152 td = self.published - now |