# HG changeset patch # User Tero Marttila # Date 1378557356 -10800 # Node ID 3aaac91a6654192e0c9415d3d73f3de69ff3fae6 # Parent b125b3fcd52d2e777590076af084c3db368a89c5 move URLItem lookup to models URLItem.search() diff -r b125b3fcd52d -r 3aaac91a6654 qrurls/models.py --- a/qrurls/models.py Fri Sep 06 01:36:33 2013 +0300 +++ b/qrurls/models.py Sat Sep 07 15:35:56 2013 +0300 @@ -1,5 +1,6 @@ import datetime import hashlib +import logging import os.path from django.db import models @@ -9,6 +10,8 @@ from django.contrib.sites.models import get_current_site from django.utils import timezone +log = logging.getLogger('qrurls.models') + QRCODE_API = 'https://chart.googleapis.com/chart?cht=qr&chs={width}x{height}&chl={url}&chld=H' IMAGES_MEDIA = 'qrurls-images' @@ -179,6 +182,41 @@ verbose_name_plural = u"URL Items" ordering = ['published'] + @classmethod + def search (cls, shorturl=None, shorturl_id=None, item_id=None, related=()) : + """ + Return the URLItem for a given shorturl, either the given specific one, + or the latest, from the database. + + Raises URLItem.NotFound + """ + # JOIN against shorturl, urlimage + url_item = cls.objects.select_related(*related) + + if shorturl: + url_item = url_item.filter(shorturl__shorturl=shorturl) + elif shorturl_id: + shorturl_id = int(shorturl_id) + url_item = url_item.filter(shorturl__id=shorturl_id) + else: + raise cls.DoesNotExist() + + # match for published items + now = timezone.now() + url_item = url_item.filter(published__lt=now).order_by('-published') + + log.info("Search URLItem @ %s", now) + + if item_id : + # specific, but still the published on + return url_item.get(id=int(item_id)) # raises DoesNotExist + else : + # most recent + try: + return url_item[0] + except IndexError: + raise DoesNotExist() + def get_absolute_url (self) : if self.url : return self.url diff -r b125b3fcd52d -r 3aaac91a6654 qrurls/views.py --- a/qrurls/views.py Fri Sep 06 01:36:33 2013 +0300 +++ b/qrurls/views.py Sat Sep 07 15:35:56 2013 +0300 @@ -1,3 +1,6 @@ +import calendar # timegm +import logging + from django.core.cache import cache from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.shortcuts import render @@ -5,7 +8,7 @@ from qrurls.models import URL, URLItem -import calendar # timegm +log = logging.getLogger('qrurls.views') """ Public frontend UI. @@ -20,34 +23,6 @@ def http_datetime (dt) : return http.http_date(calendar.timegm(dt.utctimetuple())) -def _get_url_item (shorturl=None, shorturl_id=None, item_id=None, related=()) : - # JOIN against shorturl, urlimage - url_item = URLItem.objects.select_related(*related) - - if shorturl: - url_item = url_item.filter(shorturl__shorturl=shorturl) - elif shorturl_id: - shorturl_id = int(shorturl_id) - url_item = url_item.filter(shorturl__id=shorturl_id) - else: - raise URLNotFound() - - # match for published items - now = timezone.now() - url_item = url_item.filter(published__lt=now).order_by('-published') - - if item_id : - try : - return url_item.get(id=int(item_id)) - except URLItem.DoesNotExist: - raise URLItemNotFound() - else : - # most recent - try: - return url_item[0] - except IndexError: - raise URLItemNotFound() - def index (request) : urls = URL.objects.all() return render(request, 'qrurls/index.html', dict( @@ -64,12 +39,14 @@ if data : url, modified = data + log.info("get cache: %s: %s", key, url) else: - url_item = _get_url_item(shorturl=shorturl, shorturl_id=shorturl_id) + url_item = URLItem.search(shorturl=shorturl, shorturl_id=shorturl_id) modified = url_item.last_modified() url = url_item.get_absolute_url() - + + log.info("set cache: %s: %s", key, url) cache.set(key, (url, modified)) # XXX: expiry # redirect, either directly, or to image()