qrurls/views.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Sep 2013 15:48:23 +0300
changeset 82 6442e5c97b48
parent 81 3a2fdc820c41
child 84 e5d8e17f307f
permissions -rw-r--r--
move cache to models URLItem.get_url(), fix image 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
    """
76
04b5035f5775 touchup cache keys
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
    45
    
82
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    46
    try :
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    47
        url_item = URLItem.get_item(shorturl, item_id=item_id,
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    48
            related=('shorturl', 'image'),
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    49
        )
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    50
    except URLItem.DoesNotExist:
6442e5c97b48 move cache to models URLItem.get_url(), fix image view
Tero Marttila <terom@fixme.fi>
parents: 81
diff changeset
    51
        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
    52
43
3b1f1a928283 rename qrurls image view to item view
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
    53
    if url_item.url :
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    54
        response = HttpResponseRedirect(url_item.url)
43
3b1f1a928283 rename qrurls image view to item view
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
    55
    elif url_item.image :
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    56
        response = render(request, 'qrurls/image.html', dict(
78
7e40b1d2be3e move urlitem title logic to URLItem.title()
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    57
            title   = url_item.title(),
40
5eefe5a294dc qrurl image title
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    58
            image   = url_item.image,
5eefe5a294dc qrurl image title
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    59
        ))
5eefe5a294dc qrurl image title
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    60
    else :
33
b714115da724 use seprate frontend view for url_images in url_items
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    61
        raise Http404()
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    62
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    63
    # 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
    64
    response['Vary'] = ''
72
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    65
    response['Last-Modified'] = http_datetime(url_item.last_modified())
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    66
    return response
ea7a5a5ce7d4 add Last-Modified to urlitem responses (redirect and html)
Tero Marttila <terom@fixme.fi>
parents: 71
diff changeset
    67