Commit 4f61f1ad352f42d8e6f7743d87d70dbf217596e4

Authored by Sergio Oliveira
1 parent cfde3435

Moving pagehit counter to decorator

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
... ... @@ -1,7 +0,0 @@
1   -function pagehit(path_info) {
2   - jQuery.ajax({
3   - url: '/api/hit/',
4   - type: 'POST',
5   - data: {'path_info': path_info},
6   - });
7   -}
src/super_archives/decorators.py 0 → 100644
... ... @@ -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
... ... @@ -7,8 +7,6 @@
7 7 src="{{ STATIC_URL }}img/{{ doc.Type }}.png" />
8 8 {% else %}
9 9 <span class="glyphicon glyphicon-envelope"></span>
10   -<!-- <img alt="thread" title="thread"
11   - src="{{ STATIC_URL }}img/thread.png" /> -->
12 10 {% endif %}
13 11  
14 12 {% if doc.mailinglist %}
... ...
src/super_archives/templates/message-thread.html
... ... @@ -200,9 +200,5 @@
200 200 </ul>
201 201 </div>
202 202  
203   - <script type="text/javascript" charset="utf-8">
204   - pagehit("{{ request.path_info }}");
205   - </script>
206   -
207 203 </div>
208 204 {% endblock %}
... ...
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  
... ...