From baa2c068034b2e16d2fe7c67992e1ec02a20f9f0 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Fri, 29 Jun 2012 20:53:36 -0400 Subject: [PATCH] Got history and view revision working on wiki. --- lms/djangoapps/simplewiki/models.py | 19 ++++- lms/djangoapps/simplewiki/views.py | 73 +++++++++++-------- lms/templates/simplewiki/simplewiki_base.html | 4 +- .../simplewiki/simplewiki_history.html | 4 +- lms/urls.py | 8 +- 5 files changed, 66 insertions(+), 42 deletions(-) diff --git a/lms/djangoapps/simplewiki/models.py b/lms/djangoapps/simplewiki/models.py index 4c3f393d1d..354ff85921 100644 --- a/lms/djangoapps/simplewiki/models.py +++ b/lms/djangoapps/simplewiki/models.py @@ -47,14 +47,29 @@ class Article(models.Model): def attachments(self): return ArticleAttachment.objects.filter(article__exact = self) + + def get_path(self): + return self.namespace.name + "/" + self.slug + + @classmethod + def get_article(cls, article_path): + """ + Given an article_path like namespace/slug, this returns the article. It may raise + a Article.DoesNotExist if no matching article is found or ValueError if the + article_path is not constructed properly. + """ + #TODO: Verify the path, throw a meaningful error? + namespace, slug = article_path.split("/") + return Article.objects.get( slug__exact = slug, namespace__name__exact = namespace) + @classmethod - def get_root(cls): + def get_root(cls, namespace): """Return the root article, which should ALWAYS exist.. except the very first time the wiki is loaded, in which case the user is prompted to create this article.""" try: - return Article.objects.filter(slug__exact = "")[0] + return Article.objects.filter(slug__exact = "", namespace__name__exact = namespace)[0] except: raise ShouldHaveExactlyOneRootSlug() diff --git a/lms/djangoapps/simplewiki/views.py b/lms/djangoapps/simplewiki/views.py index ea4d7e2542..88524a74d9 100644 --- a/lms/djangoapps/simplewiki/views.py +++ b/lms/djangoapps/simplewiki/views.py @@ -14,16 +14,16 @@ from multicourse import multicourse_settings from models import Revision, Article, CreateArticleForm, RevisionFormWithTitle, RevisionForm import wiki_settings -def view(request, course_id, slug, namespace=None): +def get_course(course_id): try: course = settings.COURSES_BY_ID[course_id] - if not namespace: - namespace = course.wiki_namespace except KeyError: raise Http404("Course not found") - - - (article, err) = get_article(request, slug, namespace if namespace else course_id ) + return course + +def view(request, course_id, article_path): + course = get_course(course_id) + (article, err) = get_article(request, article_path, course ) if err: return err @@ -39,11 +39,11 @@ def view(request, course_id, slug, namespace=None): 'course' : course, } d.update(csrf(request)) - print d return render_to_response('simplewiki/simplewiki_view.html', d) -def view_revision(request, course_id, slug, revision_number, namespace=None): - (article, err) = get_article(request, slug, namespace if namespace else course_id ) +def view_revision(request, course_id, revision_number, article_path): + course = get_course(course_id) + (article, err) = get_article(request, article_path, course ) if err: return err @@ -65,23 +65,24 @@ def view_revision(request, course_id, slug, revision_number, namespace=None): 'wiki_write': article.can_write_l(request.user), 'wiki_attachments_write': article.can_attach(request.user), 'wiki_current_revision_deleted' : not (revision.deleted == 0), + 'course' : course, } d.update(csrf(request)) return render_to_response('simplewiki/simplewiki_view.html', d) -def root_redirect(request): - # TODO: What is going on here? Why don't we just return the redirect? +def root_redirect(request, course_id): + course = get_course(course_id) try: - root = Article.get_root() + root = Article.get_root(course.wiki_namespace) except: + #TODO: If we don't find a root article, we should create it err = not_found(request, '/') return err - return HttpResponseRedirect(reverse('wiki_view', args=(root.get_url()))) + return HttpResponseRedirect(reverse('wiki_view', kwargs={'course_id' : course_id, 'article_path' : root.get_path()} )) def create(request, wiki_url): - url_path = get_url_path(wiki_url) if url_path != [] and url_path[0].startswith('_'): @@ -204,8 +205,9 @@ def edit(request, course_id, slug, namespace = None): return render_to_response('simplewiki/simplewiki_edit.html', d) -def history(request, course_id, slug, namespace = None, page=1): - (article, err) = get_article(request, slug, namespace if namespace else course_id ) +def history(request, course_id, article_path, page=1): + course = get_course(course_id) + (article, err) = get_article(request, article_path, course ) if err: return err @@ -216,6 +218,8 @@ def history(request, course_id, slug, namespace = None, page=1): page_size = 10 + if page == None: + page = 1 try: p = int(page) except ValueError: @@ -229,7 +233,7 @@ def history(request, course_id, slug, namespace = None, page=1): if perm_err: return perm_err - redirectURL = reverse('wiki_view', args=(article.get_url(),)) + redirectURL = reverse('wiki_view', kwargs={'course_id' : course.id, 'article_path' : article.get_path()}) try: r = int(request.POST['revision']) revision = Revision.objects.get(id=r) @@ -237,8 +241,9 @@ def history(request, course_id, slug, namespace = None, page=1): article.current_revision = revision article.save() elif request.POST.__contains__('view'): - redirectURL = reverse('wiki_view_revision', args=(revision.counter, article.get_url(),)) - + redirectURL = reverse('wiki_view_revision', kwargs={'course_id' : course.id, + 'revision_number' : revision.counter, + 'article_path' : article.get_path()}) #The rese of these are admin functions elif request.POST.__contains__('delete') and request.user.is_superuser: if (revision.deleted == 0): @@ -253,7 +258,8 @@ def history(request, course_id, slug, namespace = None, page=1): article.locked = not article.locked print "changed locked article " , article.locked article.save() - except: + except Exception as e: + print str(e) pass finally: return HttpResponseRedirect(redirectURL) @@ -282,7 +288,8 @@ def history(request, course_id, slug, namespace = None, page=1): 'wiki_article': article, 'wiki_title': article.title, 'wiki_history': history[beginItem:beginItem+page_size], - 'show_delete_revision' : request.user.is_superuser,} + 'show_delete_revision' : request.user.is_superuser, + 'course' : course} d.update(csrf(request)) return render_to_response('simplewiki/simplewiki_history.html', d) @@ -361,7 +368,7 @@ def search_articles(request, course_id): return render_to_response('simplewiki/simplewiki_searchresults.html', d) -def search_add_related(request, course_id, slug, namespace=None): +def search_add_related(request, course_id, slug, namespace): (article, err) = get_article(request, slug, namespace if namespace else course_id ) if err: return err @@ -391,7 +398,7 @@ def search_add_related(request, course_id, slug, namespace=None): json = simplejson.dumps({'results': results}) return HttpResponse(json, mimetype='application/json') -def add_related(request, course_id, slug, namespace=None): +def add_related(request, course_id, slug, namespace): (article, err) = get_article(request, slug, namespace if namespace else course_id ) if err: return err @@ -412,7 +419,7 @@ def add_related(request, course_id, slug, namespace=None): finally: return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) -def remove_related(request, course_id, slug, related_id, namespace=None,): +def remove_related(request, course_id, namespace, slug, related_id): (article, err) = get_article(request, slug, namespace if namespace else course_id ) if err: @@ -438,27 +445,29 @@ def random_article(request, course_id): article = Article.objects.all()[randint(0, num_arts-1)] return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) -def encode_err(request, url): - d = {'wiki_err_encode': True} +def encode_err(request, url, course): + d = {'wiki_err_encode': True, + 'course' : course} d.update(csrf(request)) return render_to_response('simplewiki/simplewiki_error.html', d) -def not_found(request, wiki_url): +def not_found(request, wiki_url, course): """Generate a NOT FOUND message for some URL""" d = {'wiki_err_notfound': True, - 'wiki_url': wiki_url} + 'wiki_url': wiki_url, + 'course' : course} d.update(csrf(request)) return render_to_response('simplewiki/simplewiki_error.html', d) -def get_article(request, slug, namespace): +def get_article(request, article_path, course): err = None article = None try: - article = Article.objects.get( slug__exact = slug )#, namespace__name__exact = namespace) - except Article.DoesNotExist: + article = Article.get_article(article_path) + except Article.DoesNotExist, ValueError: #TODO: We need to pass a url for creating the article here - err = not_found(request, slug) + err = not_found(request, article_path, course) return (article, err) diff --git a/lms/templates/simplewiki/simplewiki_base.html b/lms/templates/simplewiki/simplewiki_base.html index 81ea188088..b68ffe7241 100644 --- a/lms/templates/simplewiki/simplewiki_base.html +++ b/lms/templates/simplewiki/simplewiki_base.html @@ -7,8 +7,8 @@ from django.core.urlresolvers import reverse %> ## A convenience function that calls reverse with the kwargs course_id, namespace, and slug -<%def name="wiki_reverse(wiki_page)"> - ${reverse(wiki_page, kwargs={'course_id': course.id, 'namespace' : wiki_article.namespace.name, 'slug' : wiki_article.slug})} +<%def name="wiki_reverse(wiki_page, args=[], kwargs={})"> + ${reverse(wiki_page, kwargs=dict({'course_id': course.id, 'article_path' : wiki_article.get_path()}, **kwargs), args=args) } <%block name="headextra"> diff --git a/lms/templates/simplewiki/simplewiki_history.html b/lms/templates/simplewiki/simplewiki_history.html index 65f9e71a33..02204cce3f 100644 --- a/lms/templates/simplewiki/simplewiki_history.html +++ b/lms/templates/simplewiki/simplewiki_history.html @@ -64,10 +64,10 @@ ${ wiki_article.title } %if wiki_prev_page: - Previous page + Previous page %endif %if wiki_next_page: - Next page + Next page %endif diff --git a/lms/urls.py b/lms/urls.py index 1288400410..6c2c26fd85 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -85,17 +85,17 @@ if settings.COURSEWARE_ENABLED: ) # Multicourse wiki - article_slug = r"(?:/(?P[a-zA-Z\d_-]*))?/(?P[a-zA-Z\d_-]*)" + article_slug = r"/(?P[a-zA-Z\d_-]+/[a-zA-Z\d_-]*)" urlpatterns += ( url(r'^courses/(?P[^/]*)/wiki/$', 'simplewiki.views.root_redirect', name='wiki_root'), url(r'^courses/(?P[^/]*)/wiki/view' + article_slug + r'/?$', 'simplewiki.views.view', name='wiki_view'), - url(r'^courses/(?P[^/]*)/wiki/view_revision/([0-9]*)(/[a-zA-Z\d/_-]*)/?$', 'simplewiki.views.view_revision', name='wiki_view_revision'), + url(r'^courses/(?P[^/]*)/wiki/view_revision/(?P[0-9]+)' + article_slug + r'/?$', 'simplewiki.views.view_revision', name='wiki_view_revision'), url(r'^courses/(?P[^/]*)/wiki/edit' + article_slug + r'/?$', 'simplewiki.views.edit', name='wiki_edit'), url(r'^courses/(?P[^/]*)/wiki/create/?$', 'simplewiki.views.create', name='wiki_create'), - url(r'^courses/(?P[^/]*)/wiki/history' + article_slug + r'(?:/([0-9]*))?/?$', 'simplewiki.views.history', name='wiki_history'), + url(r'^courses/(?P[^/]*)/wiki/history' + article_slug + r'(?:/(?P[0-9]+))?/?$', 'simplewiki.views.history', name='wiki_history'), url(r'^courses/(?P[^/]*)/wiki/search_related' + article_slug + r'/?$', 'simplewiki.views.search_add_related', name='search_related'), url(r'^courses/(?P[^/]*)/wiki/random/?$', 'simplewiki.views.random_article', name='wiki_random'), - url(r'^courses/(?P[^/]*)/wiki/revision_feed/([0-9]*)/?$', 'simplewiki.views.revision_feed', name='wiki_revision_feed'), + url(r'^courses/(?P[^/]*)/wiki/revision_feed/([0-9]+)/?$', 'simplewiki.views.revision_feed', name='wiki_revision_feed'), url(r'^courses/(?P[^/]*)/wiki/search/?$', 'simplewiki.views.search_articles', name='wiki_search_articles'), url(r'^courses/(?P[^/]*)/wiki/list/?$', 'simplewiki.views.search_articles', name='wiki_list_articles'), #Just an alias for the search, but you usually don't submit a search term