qrurls/models.py
changeset 47 35a8e63648c8
parent 45 33b4a60ce759
child 48 5df9ed6b5976
equal deleted inserted replaced
46:24061881238b 47:35a8e63648c8
    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