equal
deleted
inserted
replaced
|
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'] = '' |