Commit 1749e8ced2c702ab422f6d8fd3dceb59365af18a

Authored by Sergio Oliveira
1 parent 56fc1188

Counting hits in trac objects

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