qrurls/views.py
changeset 80 3aaac91a6654
parent 79 b125b3fcd52d
child 81 3a2fdc820c41
equal deleted inserted replaced
79:b125b3fcd52d 80:3aaac91a6654
       
     1 import calendar # timegm
       
     2 import logging
       
     3 
     1 from django.core.cache import cache
     4 from django.core.cache import cache
     2 from django.http import HttpResponse, HttpResponseRedirect, Http404
     5 from django.http import HttpResponse, HttpResponseRedirect, Http404
     3 from django.shortcuts import render
     6 from django.shortcuts import render
     4 from django.utils import timezone, http
     7 from django.utils import timezone, http
     5 
     8 
     6 from qrurls.models import URL, URLItem
     9 from qrurls.models import URL, URLItem
     7 
    10 
     8 import calendar # timegm
    11 log = logging.getLogger('qrurls.views')
     9 
    12 
    10 """
    13 """
    11     Public frontend UI.
    14     Public frontend UI.
    12 """
    15 """
    13 
    16 
    17 class URLItemNotFound (Http404):
    20 class URLItemNotFound (Http404):
    18     pass
    21     pass
    19 
    22 
    20 def http_datetime (dt) :
    23 def http_datetime (dt) :
    21     return http.http_date(calendar.timegm(dt.utctimetuple()))
    24     return http.http_date(calendar.timegm(dt.utctimetuple()))
    22 
       
    23 def _get_url_item (shorturl=None, shorturl_id=None, item_id=None, related=()) :
       
    24     # JOIN against shorturl, urlimage
       
    25     url_item = URLItem.objects.select_related(*related)
       
    26 
       
    27     if shorturl:
       
    28         url_item = url_item.filter(shorturl__shorturl=shorturl)
       
    29     elif shorturl_id:
       
    30         shorturl_id = int(shorturl_id)
       
    31         url_item = url_item.filter(shorturl__id=shorturl_id)
       
    32     else:
       
    33         raise URLNotFound()
       
    34     
       
    35     # match for published items
       
    36     now = timezone.now()
       
    37     url_item = url_item.filter(published__lt=now).order_by('-published')
       
    38    
       
    39     if item_id :
       
    40         try :
       
    41             return url_item.get(id=int(item_id))
       
    42         except URLItem.DoesNotExist:
       
    43             raise URLItemNotFound()
       
    44     else :
       
    45         # most recent
       
    46         try:
       
    47             return url_item[0]
       
    48         except IndexError:
       
    49             raise URLItemNotFound()
       
    50 
    25 
    51 def index (request) :
    26 def index (request) :
    52     urls = URL.objects.all()
    27     urls = URL.objects.all()
    53     return render(request, 'qrurls/index.html', dict(
    28     return render(request, 'qrurls/index.html', dict(
    54         urls    = urls,
    29         urls    = urls,
    62     key = 'qrurls/urlfeed/{shorturl}'.format(shorturl=(shorturl or shorturl_id)) # format as dict
    37     key = 'qrurls/urlfeed/{shorturl}'.format(shorturl=(shorturl or shorturl_id)) # format as dict
    63     data = cache.get(key)
    38     data = cache.get(key)
    64     
    39     
    65     if data :
    40     if data :
    66         url, modified = data
    41         url, modified = data
       
    42         log.info("get cache: %s: %s", key, url)
    67     else:
    43     else:
    68         url_item = _get_url_item(shorturl=shorturl, shorturl_id=shorturl_id)
    44         url_item = URLItem.search(shorturl=shorturl, shorturl_id=shorturl_id)
    69 
    45 
    70         modified = url_item.last_modified()
    46         modified = url_item.last_modified()
    71         url = url_item.get_absolute_url()
    47         url = url_item.get_absolute_url()
    72 
    48         
       
    49         log.info("set cache: %s: %s", key, url)
    73         cache.set(key, (url, modified)) # XXX: expiry
    50         cache.set(key, (url, modified)) # XXX: expiry
    74 
    51 
    75     # redirect, either directly, or to image()
    52     # redirect, either directly, or to image()
    76     response = HttpResponseRedirect(url)
    53     response = HttpResponseRedirect(url)
    77     response['Vary'] = ''
    54     response['Vary'] = ''