From 216e996982c5ab0db8e0ce99d313ab7805c52867 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Fri, 2 Mar 2012 14:47:54 -0500 Subject: [PATCH 1/3] Tracking now logs to a file including the pid instead of syslog --HG-- branch : bridger-dev --- settings.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/settings.py b/settings.py index cba1535cf3..a708f71446 100644 --- a/settings.py +++ b/settings.py @@ -174,6 +174,7 @@ execfile(os.path.join(BASE_DIR, "settings.py")) pid = os.getpid() hostname = platform.node().split(".")[0] SYSLOG_ADDRESS = ('syslog.m.i4x.org', 514) +LOGGING_FILENAME = 'trackinglog-' + str(pid) handlers = ['console'] if not DEBUG: @@ -213,6 +214,11 @@ LOGGING = { 'address' : SYSLOG_ADDRESS, 'formatter' : 'syslog_format', }, + 'filelogger' : { + 'level' : 'INFO', + 'class' : 'logging.FileHandler', + 'filename' : LOGGING_FILENAME, + }, 'mail_admins' : { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', @@ -225,7 +231,7 @@ LOGGING = { 'level' : 'INFO' }, 'tracking' : { - 'handlers' : [] if DEBUG else ['syslogger'], # handlers, + 'handlers' : [] if DEBUG else ['filelogger'], # handlers, 'level' : 'DEBUG', 'propagate' : False, }, @@ -242,8 +248,6 @@ LOGGING = { } } - - if PERFSTATS : MIDDLEWARE_CLASSES = ( 'perfstats.middleware.ProfileMiddleware',) + MIDDLEWARE_CLASSES From f58f08edbea47bf07b477b7287900d32dce279a4 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Tue, 6 Mar 2012 12:53:39 -0500 Subject: [PATCH 2/3] Changed hoverling labels of profile graph to give real name of homework or lab section --HG-- branch : bridger-dev --- courseware/views.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/courseware/views.py b/courseware/views.py index 876c0563e1..b157f7f408 100644 --- a/courseware/views.py +++ b/courseware/views.py @@ -127,7 +127,7 @@ def profile(request): subtitle = s.get('subtitle') if s.get('subtitle') else format if format and graded_total[1] > 0: format_scores = total_scores[ format ] if format in total_scores else [] - format_scores.append( graded_total ) + format_scores.append( graded_total + (s.get("name"),) ) total_scores[ format ] = format_scores score={'section':s.get("name"), @@ -165,18 +165,17 @@ def profile(request): for i in range(12): if i < len(homework_scores): percentage = homework_scores[i][0] / float(homework_scores[i][1]) - summary = "{0:.0%} ({1:g}/{2:g})".format( percentage, homework_scores[i][0], homework_scores[i][1] ) + summary = "Homework {0} - {1} - {2:.0%} ({3:g}/{4:g})".format( i + 1, homework_scores[i][2] , percentage, homework_scores[i][0], homework_scores[i][1] ) else: percentage = 0 - summary = "0% (?/?)" + summary = "Unreleased Homework {0} - 0% (?/?)".format(i + 1) if settings.GENERATE_PROFILE_SCORES: points_possible = random.randrange(10, 50) points_earned = random.randrange(5, points_possible) percentage = points_earned / float(points_possible) - summary = "{0:.0%} ({1:g}/{2:g})".format( percentage, points_earned, points_possible ) + summary = "Random Homework - {0:.0%} ({1:g}/{2:g})".format( percentage, points_earned, points_possible ) - summary = "Homework {0} - {1}".format(i + 1, summary) label = "HW {0:02d}".format(i + 1) homework_percentages.append( {'percentage': percentage, 'summary': summary, 'label' : label} ) @@ -189,18 +188,17 @@ def profile(request): for i in range(12): if i < len(lab_scores): percentage = lab_scores[i][0] / float(lab_scores[i][1]) - summary = "{0:.0%} ({1:g}/{2:g})".format( percentage, lab_scores[i][0], lab_scores[i][1] ) + summary = "Lab {0} - {1} - {2:.0%} ({3:g}/{4:g})".format( i + 1, lab_scores[i][2] , percentage, lab_scores[i][0], lab_scores[i][1] ) else: percentage = 0 - summary = "0% (?/?)" + summary = "Unreleased Lab {0} - 0% (?/?)".format(i + 1) if settings.GENERATE_PROFILE_SCORES: points_possible = random.randrange(10, 50) points_earned = random.randrange(5, points_possible) percentage = points_earned / float(points_possible) - summary = "{0:.0%} ({1:g}/{2:g})".format( percentage, points_earned, points_possible ) + summary = "Random Lab - {0:.0%} ({1:g}/{2:g})".format( percentage, points_earned, points_possible ) - summary = "Lab {0} - {1}".format(i + 1, summary) label = "Lab {0:02d}".format(i + 1) lab_percentages.append( {'percentage': percentage, 'summary': summary, 'label' : label} ) From 84471d176e09fe355a3aafb3340b8f16e9f69fa1 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Tue, 6 Mar 2012 15:26:34 -0500 Subject: [PATCH 3/3] 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: