diff --git a/TODO.rst b/TODO.rst index 68323cc..5ea386d 100644 --- a/TODO.rst +++ b/TODO.rst @@ -52,6 +52,7 @@ Interface Outros ======= +* Contabilizar votos dentro do modelo de mensagem. Com a implementação atual ordenar uma thread por votos é uma operação muito cara. * Utilizar SOLR para listar documentos relevantes ao inves de thread.score * Escrever casos de teste * Criacao de repositorios distribuidos pela interface do colab diff --git a/src/home/views.py b/src/home/views.py index 3b513e3..a4bc709 100644 --- a/src/home/views.py +++ b/src/home/views.py @@ -4,16 +4,18 @@ from collections import OrderedDict from django.shortcuts import render from django.utils import timezone -from haystack.query import SearchQuerySet -from super_archives import queries from search.utils import trans +from haystack.query import SearchQuerySet + +from super_archives.models import Thread def index(request): """Index page view""" - latest_threads = queries.get_latest_threads() - hottest_threads = queries.get_hottest_threads() + + latest_threads = Thread.objects.all()[:6] + hottest_threads = Thread.highest_score.from_haystack()[:6] count_types = OrderedDict() six_months = timezone.now() - timezone.timedelta(days=180) @@ -25,7 +27,7 @@ def index(request): context = { 'hottest_threads': hottest_threads[:6], - 'latest_threads': latest_threads[:6], + 'latest_threads': latest_threads, 'type_count': count_types, 'latest_results': SearchQuerySet().all().order_by( '-modified', '-created' diff --git a/src/rss/feeds.py b/src/rss/feeds.py index 8a467f7..7bec55f 100644 --- a/src/rss/feeds.py +++ b/src/rss/feeds.py @@ -7,7 +7,6 @@ from django.utils.translation import ugettext as _ from haystack.query import SearchQuerySet from super_archives.models import Thread -from super_archives import queries class LatestThreadsFeeds(Feed): @@ -15,7 +14,7 @@ class LatestThreadsFeeds(Feed): link = '/rss/threads/latest/' def items(self): - return queries.get_latest_threads()[:20] + return Thread.objects.all()[:20] def item_link(self, item): return item.latest_message.url @@ -34,7 +33,7 @@ class HottestThreadsFeeds(Feed): link = '/rss/threads/hottest/' def items(self): - return queries.get_hottest_threads()[:20] + return Thread.highest_score.all()[:20] def item_link(self, item): return item.latest_message.url diff --git a/src/search/forms.py b/src/search/forms.py index 21cf911..025cfd7 100644 --- a/src/search/forms.py +++ b/src/search/forms.py @@ -158,7 +158,4 @@ class ColabSearchForm(SearchForm): if self.cleaned_data['filename']: sqs = sqs.filter(filename=self.cleaned_data['filename']) - if self.load_all: - sqs = sqs.load_all() - return sqs diff --git a/src/super_archives/managers.py b/src/super_archives/managers.py new file mode 100644 index 0000000..e09ff07 --- /dev/null +++ b/src/super_archives/managers.py @@ -0,0 +1,44 @@ + +from django.db import models + +from haystack.query import SearchQuerySet + + +class NotSpamManager(models.Manager): + """Only return objects which are not marked as spam.""" + + def get_query_set(self): + return super(NotSpamManager, self).get_query_set().exclude(spam=True) + + +class HighestScore(NotSpamManager): + def get_query_set(self): + queryset = super(HighestScore, self).get_query_set() + return queryset.order_by('-score', '-latest_message__received_time') + + def from_haystack(self): + return SearchQuerySet().filter(type='thread') + + +class MostVotedManager(NotSpamManager): + def get_query_set(self): + """Query for the most voted messages sorting by the sum of + voted and after by date.""" + + queryset = super(MostVotedManager, self).get_query_set() + + sql = """ + SELECT + count(sav.id) + FROM + super_archives_vote AS sav + WHERE + super_archives_message.id = sav.message_id + """ + + messages = queryset.extra( + select={ + 'vote_count': sql, + } + ) + return messages.order_by('-vote_count', 'received_time') diff --git a/src/super_archives/models.py b/src/super_archives/models.py index aaac885..03c84d3 100644 --- a/src/super_archives/models.py +++ b/src/super_archives/models.py @@ -16,6 +16,7 @@ from haystack.query import SearchQuerySet from taggit.managers import TaggableManager from hitcounter.models import HitCounterModelMixin +from .managers import NotSpamManager, MostVotedManager, HighestScore from .utils import blocks from .utils.etiquetador import etiquetador @@ -23,13 +24,6 @@ from .utils.etiquetador import etiquetador User = get_user_model() -class NotSpamManager(models.Manager): - """Only return objects which are not marked as spam.""" - - def get_query_set(self): - return super(NotSpamManager, self).get_query_set().exclude(spam=True) - - class EmailAddressValidation(models.Model): address = models.EmailField(unique=True) user = models.ForeignKey(User, null=True, @@ -116,6 +110,7 @@ class Thread(models.Model, HitCounterModelMixin): score = models.IntegerField(default=0, verbose_name=_(u"Score"), help_text=_(u"Thread score")) spam = models.BooleanField(default=False) + highest_score = HighestScore() all_objects = models.Manager() objects = NotSpamManager() tags = TaggableManager() @@ -252,6 +247,7 @@ class Message(models.Model): all_objects = models.Manager() objects = NotSpamManager() + most_voted = MostVotedManager() class Meta: verbose_name = _(u"Message") diff --git a/src/super_archives/queries.py b/src/super_archives/queries.py deleted file mode 100644 index 999426e..0000000 --- a/src/super_archives/queries.py +++ /dev/null @@ -1,45 +0,0 @@ - -from django.core.exceptions import ObjectDoesNotExist -from .models import Thread, Vote, Message - - -def get_messages_by_date(): - return Message.objects.order_by('received_time') - - -def get_messages_by_voted(): - """Query for the most voted messages sorting by the sum of - voted and after by date.""" - - sql = """ - SELECT - count(sav.id) - FROM - super_archives_vote AS sav - WHERE - super_archives_message.id = sav.message_id - """ - messages = Message.objects.extra( - select={ - 'vote_count': sql, - } - ) - return messages.order_by('-vote_count', 'received_time') - - -def get_first_message_in_thread(mailinglist, thread_token): - query = get_messages_by_date() - query = query.filter(thread__mailinglist__name=mailinglist) - try: - query = query.filter(thread__subject_token=thread_token)[0] - except IndexError: - raise ObjectDoesNotExist - return query - - -def get_latest_threads(): - return Thread.objects.order_by('-latest_message__received_time') - - -def get_hottest_threads(): - return Thread.objects.order_by('-score', '-latest_message__received_time') diff --git a/src/super_archives/views.py b/src/super_archives/views.py index 8ba6187..ab362d4 100644 --- a/src/super_archives/views.py +++ b/src/super_archives/views.py @@ -20,30 +20,30 @@ from django.shortcuts import render, redirect from haystack.query import SearchQuerySet -from . import queries from .utils.email import send_verification_email -from .models import MailingList, Thread, EmailAddress, EmailAddressValidation +from .models import MailingList, Thread, EmailAddress, \ + EmailAddressValidation, Message class ThreadView(View): http_method_names = [u'get', u'post'] def get(self, request, mailinglist, thread_token): - try: - first_message = queries.get_first_message_in_thread(mailinglist, - thread_token) - except ObjectDoesNotExist: - raise http.Http404 thread = Thread.objects.get(subject_token=thread_token, mailinglist__name=mailinglist) thread.hit(request) + try: + first_message = thread.message_set.first() + except ObjectDoesNotExist: + raise http.Http404 + order_by = request.GET.get('order') if order_by == 'voted': - msgs_query = queries.get_messages_by_voted() + msgs_query = Message.most_voted else: - msgs_query = queries.get_messages_by_date() + msgs_query = Message.objects msgs_query = msgs_query.filter(thread__subject_token=thread_token) msgs_query = msgs_query.filter(thread__mailinglist__name=mailinglist) diff --git a/src/templates/home.html b/src/templates/home.html index 7b2c042..4281d5e 100644 --- a/src/templates/home.html +++ b/src/templates/home.html @@ -50,11 +50,10 @@ - + {% trans "View more discussions..." %}
 
@@ -73,7 +72,7 @@ {% include "message-preview.html" with result=thread.latest_message %} {% endfor %} - + {% trans "View more discussions..." %}
 
-- libgit2 0.21.2