Commit 1749e8ced2c702ab422f6d8fd3dceb59365af18a

Authored by Sergio Oliveira
1 parent 56fc1188

Counting hits in trac objects

requirements.txt
... ... @@ -24,7 +24,7 @@ tornado
24 24  
25 25 # Deps for Single SignOn (SSO)
26 26 django-browserid
27   -git+https://github.com/TracyWebTech/django-revproxy/
  27 +django-revproxy
28 28  
29 29 # Converse.js (XMPP client)
30 30 django-conversejs==0.2.8
... ...
src/colab/custom_settings.py
... ... @@ -91,6 +91,7 @@ INSTALLED_APPS = INSTALLED_APPS + (
91 91 'accounts',
92 92 'proxy',
93 93 'search',
  94 + 'hitcount',
94 95  
95 96 # Feedzilla and deps
96 97 'feedzilla',
... ...
src/proxy/models.py
... ... @@ -3,13 +3,10 @@
3 3 from django.db import models
4 4  
5 5 from accounts.models import User
  6 +from hitcount.models import HitCountModelMixin
6 7  
7 8  
8   -# get_absolute_url em todos
9   -# get_author_url em todos
10   -
11   -
12   -class Revision(models.Model):
  9 +class Revision(models.Model, HitCountModelMixin):
13 10 rev = models.TextField(blank=True, primary_key=True)
14 11 author = models.TextField(blank=True)
15 12 message = models.TextField(blank=True)
... ... @@ -29,7 +26,7 @@ class Revision(models.Model):
29 26 except User.DoesNotExist:
30 27 return None
31 28  
32   -class Ticket(models.Model):
  29 +class Ticket(models.Model, HitCountModelMixin):
33 30 id = models.IntegerField(primary_key=True)
34 31 summary = models.TextField(blank=True)
35 32 description = models.TextField(blank=True)
... ... @@ -60,7 +57,7 @@ class Ticket(models.Model):
60 57 return None
61 58  
62 59  
63   -class Wiki(models.Model):
  60 +class Wiki(models.Model, HitCountModelMixin):
64 61 name = models.TextField(primary_key=True)
65 62 wiki_text = models.TextField(blank=True)
66 63 author = models.TextField(blank=True)
... ...
src/proxy/views.py
... ... @@ -4,19 +4,47 @@ import os
4 4 from django.conf import settings
5 5  
6 6 from revproxy.views import ProxyView
  7 +from .models import Wiki, Ticket, Revision
  8 +from hitcount.views import HitCountViewMixin
7 9  
8 10  
9 11 CWD = os.path.abspath(os.path.dirname(__file__))
10 12 DIAZO_RULES_DIR = os.path.join(CWD, 'diazo')
11 13  
12   -
13   -class TracProxyView(ProxyView):
  14 +class TracProxyView(HitCountViewMixin, ProxyView):
14 15 base_url = settings.COLAB_TRAC_URL
15 16 add_remote_user = settings.REVPROXY_ADD_REMOTE_USER
16 17 diazo_theme_template = 'proxy/trac.html'
17 18 diazo_rules = os.path.join(DIAZO_RULES_DIR, 'trac.xml')
18 19 html5 = True
19 20  
  21 + def get_object(self):
  22 + obj = None
  23 +
  24 + if self.request.path_info.startswith('/wiki'):
  25 + wiki_name = self.request.path_info.split('/', 2)[-1]
  26 + if not wiki_name:
  27 + wiki_name = 'WikiStart'
  28 + try:
  29 + obj = Wiki.objects.get(name=wiki_name)
  30 + except Wiki.DoesNotExist:
  31 + return None
  32 + elif self.request.path_info.startswith('/ticket'):
  33 + ticket_id = self.request.path_info.split('/')[2]
  34 + try:
  35 + obj = Ticket.objects.get(id=ticket_id)
  36 + except (Ticket.DoesNotExist, ValueError):
  37 + return None
  38 + elif self.request.path_info.startswith('/changeset'):
  39 + changeset, repo = self.request.path_info.split('/')[2:4]
  40 + try:
  41 + obj = Revision.objects.get(rev=changeset,
  42 + repository_name=repo)
  43 + except Revision.DoesNotExist:
  44 + return None
  45 +
  46 + return obj
  47 +
20 48  
21 49 class JenkinsProxyView(ProxyView):
22 50 base_url = settings.COLAB_CI_URL
... ...
src/super_archives/models.py
... ... @@ -14,6 +14,7 @@ from django.utils.translation import ugettext_lazy as _
14 14 from html2text import html2text
15 15 from haystack.query import SearchQuerySet
16 16 from taggit.managers import TaggableManager
  17 +from hitcount.models import HitCountModelMixin
17 18  
18 19 from .utils import blocks
19 20 from .utils.etiquetador import etiquetador
... ... @@ -107,7 +108,7 @@ class Keyword(models.Model):
107 108 return self.keyword
108 109  
109 110  
110   -class Thread(models.Model):
  111 +class Thread(models.Model, HitCountModelMixin):
111 112  
112 113 subject_token = models.CharField(max_length=512)
113 114 mailinglist = models.ForeignKey(MailingList,
... ...
src/super_archives/views.py
... ... @@ -16,12 +16,10 @@ from django.contrib.auth.decorators import login_required
16 16 from django.shortcuts import render, redirect
17 17  
18 18 from . import queries
19   -from .decorators import count_hit
20 19 from .utils.email import send_verification_email
21 20 from .models import MailingList, Thread, EmailAddress, EmailAddressValidation
22 21  
23 22  
24   -@count_hit
25 23 def thread(request, mailinglist, thread_token):
26 24  
27 25 try:
... ... @@ -29,6 +27,12 @@ def thread(request, mailinglist, thread_token):
29 27 thread_token)
30 28 except ObjectDoesNotExist:
31 29 raise http.Http404
  30 +
  31 + thread = Thread.objects.get(subject_token=thread_token,
  32 + mailinglist__name=mailinglist)
  33 +
  34 + thread.hit()
  35 +
32 36 order_by = request.GET.get('order')
33 37 if order_by == 'voted':
34 38 msgs_query = queries.get_messages_by_voted()
... ... @@ -44,8 +48,6 @@ def thread(request, mailinglist, thread_token):
44 48 total_votes += email.votes_count()
45 49  
46 50 # Update relevance score
47   - thread = Thread.objects.get(subject_token=thread_token,
48   - mailinglist__name=mailinglist)
49 51 thread.update_score()
50 52  
51 53 context = {
... ...