qrurls/views.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Sep 2013 16:15:34 +0300
changeset 86 656c8ff72f77
parent 84 e5d8e17f307f
child 87 88d9c9974d6a
permissions -rw-r--r--
caching for item view
80
3aaac91a6654 move URLItem lookup to models URLItem.search()
Tero Marttila <terom@fixme.fi>
parents: 79
diff changeset
     1
import calendar # timegm
3aaac91a6654 move URLItem lookup to models URLItem.search()
Tero Marttila <terom@fixme.fi>
parents: 79
diff changeset
     2
import logging
3aaac91a6654 move URLItem lookup to models URLItem.search()
Tero Marttila <terom@fixme.fi>
parents: 79
diff changeset
     3
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     4
from django.http import HttpResponse, HttpResponseRedirect, Http404
12
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     5
from django.shortcuts import render
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
     6
from django.utils import timezone, http
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     7
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     8
from qrurls.models import URL, URLItem
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     9
80
3aaac91a6654 move URLItem lookup to models URLItem.search()
Tero Marttila <terom@fixme.fi>
parents: 79
diff changeset
    10
log = logging.getLogger('qrurls.views')
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    11
54
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    12
"""
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    13
    Public frontend UI.
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    14
"""
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    15
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    16
def http_datetime (dt) :
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    17
    return http.http_date(calendar.timegm(dt.utctimetuple()))
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    18
12
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    19
def index (request) :
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    20
    urls = URL.objects.all()
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    21
    return render(request, 'qrurls/index.html', dict(
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    22
        urls    = urls,
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    23
    ))
7605af83cb14 add qrurls index
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    24
81
3a2fdc820c41 drop separate shorturl_id= lookup key, match shorturl.isdigit()
Tero Marttila <terom@fixme.fi>
parents: 80
diff changeset
    25
def shorturl (request, shorturl=None) :
70
e8a8d490df2f optimize shorturl() to use a single SELECT JOIN query
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    26
    """
e8a8d490df2f optimize shorturl() to use a single SELECT JOIN query
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    27
        Primary frontend for redirecting based on current time.
e8a8d490df2f optimize shorturl() to use a single SELECT JOIN query
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    28
    """
76
04b5035f5775 touchup cache keys
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
    29
82
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    30
    try:
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    31
        url, modified = URLItem.get_url(shorturl)
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    32
    except URLItem.DoesNotExist:
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    33
        raise Http404()
33
b714115da724 use seprate frontend view for url_images in url_items
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    34
40
5eefe5a294dc qrurl image title
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    35
    # redirect, either directly, or to image()
73
66b572c06b0a caching for shorturl redirect
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    36
    response = HttpResponseRedirect(url)
74
b8f1ae4247ad override views to drop Vary header, as we don't care about the session
Tero Marttila <terom@fixme.fi>
parents: 73
diff changeset
    37
    response['Vary'] = ''
73
66b572c06b0a caching for shorturl redirect
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    38
    response['Last-Modified'] = http_datetime(modified)
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    39
    return response
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    40
    
76
04b5035f5775 touchup cache keys
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
    41
def item (request, shorturl, item_id) :
71
04f4f312d4ad optimize item view to JOIN across models, using common _get_url_item for both views
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    42
    """
04f4f312d4ad optimize item view to JOIN across models, using common _get_url_item for both views
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    43
        Frontend for a specific item.
04f4f312d4ad optimize item view to JOIN across models, using common _get_url_item for both views
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    44
    """
86
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    45
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    46
    try:
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    47
        data = URLItem.get_item(shorturl, int(item_id))
82
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    48
    except URLItem.DoesNotExist:
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    49
        raise Http404()
71
04f4f312d4ad optimize item view to JOIN across models, using common _get_url_item for both views
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    50
86
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    51
    if data['url'] :
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    52
        response = HttpResponseRedirect(data['url'])
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    53
    elif data['image'] :
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    54
        response = render(request, 'qrurls/image.html', data)
40
5eefe5a294dc qrurl image title
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    55
    else :
33
b714115da724 use seprate frontend view for url_images in url_items
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    56
        raise Http404()
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    57
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    58
    # set cache
74
b8f1ae4247ad override views to drop Vary header, as we don't care about the session
Tero Marttila <terom@fixme.fi>
parents: 73
diff changeset
    59
    response['Vary'] = ''
86
656c8ff72f77 caching for item view
Tero Marttila <terom@fixme.fi>
parents: 84
diff changeset
    60
    response['Last-Modified'] = data['last_modified']
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    61
    return response
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    62