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 from piston.utils import rc 2 from piston.utils import rc
5 from piston.handler import BaseHandler 3 from piston.handler import BaseHandler
6 4
7 from colab.deprecated import solrutils 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 class SearchHandler(BaseHandler): 8 class SearchHandler(BaseHandler):
42 allowed_methods = ('GET', ) 9 allowed_methods = ('GET', )
src/api/urls.py
@@ -2,15 +2,12 @@ from django.conf.urls import patterns, include, url @@ -2,15 +2,12 @@ from django.conf.urls import patterns, include, url
2 2
3 from piston.resource import Resource 3 from piston.resource import Resource
4 4
5 -from .handlers import CountHandler, SearchHandler 5 +from .handlers import SearchHandler
6 from .views import VoteView 6 from .views import VoteView
7 7
8 -  
9 -count_handler = Resource(CountHandler)  
10 search_handler = Resource(SearchHandler) 8 search_handler = Resource(SearchHandler)
11 9
12 urlpatterns = patterns('', 10 urlpatterns = patterns('',
13 url(r'message/(?P<msg_id>\d+)/vote$', VoteView.as_view()), 11 url(r'message/(?P<msg_id>\d+)/vote$', VoteView.as_view()),
14 - url(r'hit/$', count_handler),  
15 url(r'search/$', search_handler), 12 url(r'search/$', search_handler),
16 ) 13 )
src/static/js/base.js
@@ -1,7 +0,0 @@ @@ -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 @@ @@ -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,8 +7,6 @@
7 src="{{ STATIC_URL }}img/{{ doc.Type }}.png" /> 7 src="{{ STATIC_URL }}img/{{ doc.Type }}.png" />
8 {% else %} 8 {% else %}
9 <span class="glyphicon glyphicon-envelope"></span> 9 <span class="glyphicon glyphicon-envelope"></span>
10 -<!-- <img alt="thread" title="thread"  
11 - src="{{ STATIC_URL }}img/thread.png" /> -->  
12 {% endif %} 10 {% endif %}
13 11
14 {% if doc.mailinglist %} 12 {% if doc.mailinglist %}
src/super_archives/templates/message-thread.html
@@ -200,9 +200,5 @@ @@ -200,9 +200,5 @@
200 </ul> 200 </ul>
201 </div> 201 </div>
202 202
203 - <script type="text/javascript" charset="utf-8">  
204 - pagehit("{{ request.path_info }}");  
205 - </script>  
206 -  
207 </div> 203 </div>
208 {% endblock %} 204 {% endblock %}
src/super_archives/views.py
@@ -9,8 +9,10 @@ from django.core.exceptions import ObjectDoesNotExist @@ -9,8 +9,10 @@ from django.core.exceptions import ObjectDoesNotExist
9 from django.shortcuts import render, get_list_or_404 9 from django.shortcuts import render, get_list_or_404
10 10
11 from .models import MailingList, Thread 11 from .models import MailingList, Thread
  12 +from .decorators import count_hit
12 13
13 14
  15 +@count_hit
14 def thread(request, mailinglist, thread_token): 16 def thread(request, mailinglist, thread_token):
15 17
16 try: 18 try:
src/templates/base.html
@@ -22,9 +22,6 @@ @@ -22,9 +22,6 @@
22 <script type="text/javascript" src="{{ STATIC_URL }}third-party/jquery.cookie.js"></script> 22 <script type="text/javascript" src="{{ STATIC_URL }}third-party/jquery.cookie.js"></script>
23 <script src="{{ STATIC_URL }}third-party/bootstrap/js/bootstrap.js"></script> 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 {% block head_js %}{% endblock %} 25 {% block head_js %}{% endblock %}
29 {% block head_css %}{% endblock %} 26 {% block head_css %}{% endblock %}
30 27