From 84471d176e09fe355a3aafb3340b8f16e9f69fa1 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Tue, 6 Mar 2012 15:26:34 -0500 Subject: [PATCH] Added revision feed, which shows latest edits across the wiki. Also brought down wiki queries using select_related and caching article slugs --HG-- branch : bridger-dev --- simplewiki/models.py | 13 ++++++++++--- simplewiki/urls.py | 1 + simplewiki/views.py | 38 ++++++++++++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/simplewiki/models.py b/simplewiki/models.py index 50d752099b..58173e0ca0 100644 --- a/simplewiki/models.py +++ b/simplewiki/models.py @@ -3,6 +3,7 @@ import os from django import forms from django.contrib.auth.models import User +from django.core.cache import cache from django.core.urlresolvers import reverse from django.db import models from django.db.models import signals @@ -55,10 +56,16 @@ class Article(models.Model): raise ShouldHaveExactlyOneRootSlug() def get_url(self): - """Return the Wiki URL for an article""" + """Return the Wiki URL for an article""" url = self.slug + "/" - if (self.parent): - url = self.parent.get_url() + url + if self.parent_id: + parent_url = cache.get("wiki_url-" + str(self.parent_id)) + if parent_url is None: + parent_url = self.parent.get_url() + + url = parent_url + url + + cache.set("wiki_url-" + str(self.id), url, 60*60) return url diff --git a/simplewiki/urls.py b/simplewiki/urls.py index 0a95fc305a..a41ce3617b 100644 --- a/simplewiki/urls.py +++ b/simplewiki/urls.py @@ -9,6 +9,7 @@ urlpatterns = patterns('', url(r'^history(/[a-zA-Z\d/_-]*)/([0-9]*)/?$', 'simplewiki.views.history', name='wiki_history'), url(r'^search_related(/[a-zA-Z\d/_-]*)/?$', 'simplewiki.views.search_add_related', name='search_related'), url(r'^random/?$', 'simplewiki.views.random_article', name='wiki_random'), + url(r'^revision_feed/([0-9]*)/?$', 'simplewiki.views.revision_feed', name='wiki_revision_feed'), url(r'^search/?$', 'simplewiki.views.search_articles', name='wiki_search_articles'), url(r'^list/?$', 'simplewiki.views.search_articles', name='wiki_list_articles'), #Just an alias for the search, but you usually don't submit a search term # url(r'^/?([a-zA-Z\d/_-]*)/_related/add/$', 'simplewiki.views.add_related', name='add_related'), diff --git a/simplewiki/views.py b/simplewiki/views.py index e2324c8e3b..7b30b74907 100644 --- a/simplewiki/views.py +++ b/simplewiki/views.py @@ -232,7 +232,7 @@ def history(request, wiki_url, page=1): except ValueError: p = 1 - history = Revision.objects.filter(article__exact = article).order_by('-counter') + history = Revision.objects.filter(article__exact = article).order_by('-counter').select_related('previous_revision__counter', 'revision_user', 'wiki_article') if request.method == 'POST': if request.POST.__contains__('revision'): #They selected a version, but they can be either deleting or changing the version @@ -297,6 +297,37 @@ def history(request, wiki_url, page=1): d.update(csrf(request)) return render_to_response('simplewiki_history.html', d) + + +def revision_feed(request, page=1): + if not request.user.is_superuser: + return redirect('/') + + page_size = 10 + + try: + p = int(page) + except ValueError: + p = 1 + + history = Revision.objects.order_by('-revision_date').select_related('revision_user', 'article', 'previous_revision') + + page_count = (history.count()+(page_size-1)) / page_size + if p > page_count: + p = 1 + beginItem = (p-1) * page_size + + next_page = p + 1 if page_count > p else None + prev_page = p - 1 if p > 1 else None + + d = {'wiki_page': p, + 'wiki_next_page': next_page, + 'wiki_prev_page': prev_page, + 'wiki_history': history[beginItem:beginItem+page_size], + 'show_delete_revision' : request.user.is_superuser,} + d.update(csrf(request)) + + return render_to_response('simplewiki_revision_feed.html', d) def search_articles(request): if not request.user.is_authenticated(): @@ -333,9 +364,8 @@ def search_articles(request): results = results._search(Q(current_revision__contents__icontains = queryword) | \ Q(title__icontains = queryword)) - results.select_related('current_revision__deleted') - - print [(article.title.lower(), article.get_url()) for article in results] + results = results.select_related('current_revision__deleted') + results = sorted(results, key=lambda article: (article.current_revision.deleted, article.get_url().lower()) ) if len(results) == 1 and querystring: