Commit 4f61f1ad352f42d8e6f7743d87d70dbf217596e4
1 parent
cfde3435
Exists in
master
and in
39 other branches
Moving pagehit counter to decorator
Showing
8 changed files
with
27 additions
and
53 deletions
Show diff stats
src/api/handlers.py
1 | 1 | |
2 | -from django.core.cache import cache | |
3 | - | |
4 | 2 | from piston.utils import rc |
5 | 3 | from piston.handler import BaseHandler |
6 | 4 | |
7 | 5 | from colab.deprecated import solrutils |
8 | -from super_archives.models import PageHit | |
9 | - | |
10 | - | |
11 | -class CountHandler(BaseHandler): | |
12 | - allowed_methods = ('POST') | |
13 | - | |
14 | - def create(self, request): | |
15 | - """Add one page view for the given url""" | |
16 | - | |
17 | - # If missing the path_info argument we can't do anything | |
18 | - path_info = request.POST.get('path_info') | |
19 | - if not path_info: | |
20 | - return rc.BAD_REQUEST | |
21 | 6 | |
22 | - # Here we cache the user's IP to ensure that the same | |
23 | - # IP won't hit the same page again for while | |
24 | - ip_addr = request.META.get('REMOTE_ADDR') | |
25 | - page_hits_cache = cache.get('page_hits', {}) | |
26 | - duplicate = page_hits_cache.get(path_info, {}).get(ip_addr) | |
27 | - | |
28 | - if duplicate: | |
29 | - return rc.DUPLICATE_ENTRY | |
30 | - else: | |
31 | - page_hits_cache.update({path_info: {ip_addr: True }}) | |
32 | - cache.set('page_hits', page_hits_cache) | |
33 | - | |
34 | - # Everything ok, so just increment the page count | |
35 | - page_hit = PageHit.objects.get_or_create(url_path=path_info)[0] | |
36 | - page_hit.hit_count += 1 | |
37 | - page_hit.save() | |
38 | - | |
39 | - return rc.CREATED | |
40 | 7 | |
41 | 8 | class SearchHandler(BaseHandler): |
42 | 9 | allowed_methods = ('GET', ) | ... | ... |
src/api/urls.py
... | ... | @@ -2,15 +2,12 @@ from django.conf.urls import patterns, include, url |
2 | 2 | |
3 | 3 | from piston.resource import Resource |
4 | 4 | |
5 | -from .handlers import CountHandler, SearchHandler | |
5 | +from .handlers import SearchHandler | |
6 | 6 | from .views import VoteView |
7 | 7 | |
8 | - | |
9 | -count_handler = Resource(CountHandler) | |
10 | 8 | search_handler = Resource(SearchHandler) |
11 | 9 | |
12 | 10 | urlpatterns = patterns('', |
13 | 11 | url(r'message/(?P<msg_id>\d+)/vote$', VoteView.as_view()), |
14 | - url(r'hit/$', count_handler), | |
15 | 12 | url(r'search/$', search_handler), |
16 | 13 | ) | ... | ... |
src/static/js/base.js
... | ... | @@ -0,0 +1,24 @@ |
1 | + | |
2 | +from django.core.cache import cache | |
3 | + | |
4 | +from super_archives.models import PageHit | |
5 | + | |
6 | + | |
7 | +def count_hit(view): | |
8 | + def wrapper(request, *args, **kwargs): | |
9 | + # Here we cache the user's IP to ensure that the same | |
10 | + # IP won't hit the same page again for while | |
11 | + ip_addr = request.META.get('REMOTE_ADDR') | |
12 | + cache_key = u'page_hits-{}-{}'.format(request.path_info, ip_addr) | |
13 | + duplicate = cache.get(cache_key) | |
14 | + if duplicate: | |
15 | + return view(request, *args, **kwargs) | |
16 | + cache.set(cache_key, True) | |
17 | + | |
18 | + # Everything ok, so just increment the page count | |
19 | + page_hit = PageHit.objects.get_or_create(url_path=request.path_info)[0] | |
20 | + page_hit.hit_count += 1 | |
21 | + page_hit.save() | |
22 | + | |
23 | + return view(request, *args, **kwargs) | |
24 | + return wrapper | ... | ... |
src/super_archives/templates/message-preview.html
src/super_archives/templates/message-thread.html
src/super_archives/views.py
... | ... | @@ -9,8 +9,10 @@ from django.core.exceptions import ObjectDoesNotExist |
9 | 9 | from django.shortcuts import render, get_list_or_404 |
10 | 10 | |
11 | 11 | from .models import MailingList, Thread |
12 | +from .decorators import count_hit | |
12 | 13 | |
13 | 14 | |
15 | +@count_hit | |
14 | 16 | def thread(request, mailinglist, thread_token): |
15 | 17 | |
16 | 18 | try: | ... | ... |
src/templates/base.html
... | ... | @@ -22,9 +22,6 @@ |
22 | 22 | <script type="text/javascript" src="{{ STATIC_URL }}third-party/jquery.cookie.js"></script> |
23 | 23 | <script src="{{ STATIC_URL }}third-party/bootstrap/js/bootstrap.js"></script> |
24 | 24 | |
25 | - <script type="text/javascript" src="{{ STATIC_URL }}js/base.js"></script> | |
26 | - | |
27 | - | |
28 | 25 | {% block head_js %}{% endblock %} |
29 | 26 | {% block head_css %}{% endblock %} |
30 | 27 | ... | ... |