Commit baa2c068 by Bridger Maxwell

Got history and view revision working on wiki.

parent 0c4b6f30
...@@ -47,14 +47,29 @@ class Article(models.Model): ...@@ -47,14 +47,29 @@ class Article(models.Model):
def attachments(self): def attachments(self):
return ArticleAttachment.objects.filter(article__exact = 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 @classmethod
def get_root(cls): def get_root(cls, namespace):
"""Return the root article, which should ALWAYS exist.. """Return the root article, which should ALWAYS exist..
except the very first time the wiki is loaded, in which except the very first time the wiki is loaded, in which
case the user is prompted to create this article.""" case the user is prompted to create this article."""
try: try:
return Article.objects.filter(slug__exact = "")[0] return Article.objects.filter(slug__exact = "", namespace__name__exact = namespace)[0]
except: except:
raise ShouldHaveExactlyOneRootSlug() raise ShouldHaveExactlyOneRootSlug()
......
...@@ -14,16 +14,16 @@ from multicourse import multicourse_settings ...@@ -14,16 +14,16 @@ from multicourse import multicourse_settings
from models import Revision, Article, CreateArticleForm, RevisionFormWithTitle, RevisionForm from models import Revision, Article, CreateArticleForm, RevisionFormWithTitle, RevisionForm
import wiki_settings import wiki_settings
def view(request, course_id, slug, namespace=None): def get_course(course_id):
try: try:
course = settings.COURSES_BY_ID[course_id] course = settings.COURSES_BY_ID[course_id]
if not namespace:
namespace = course.wiki_namespace
except KeyError: except KeyError:
raise Http404("Course not found") raise Http404("Course not found")
return course
(article, err) = get_article(request, slug, namespace if namespace else course_id ) def view(request, course_id, article_path):
course = get_course(course_id)
(article, err) = get_article(request, article_path, course )
if err: if err:
return err return err
...@@ -39,11 +39,11 @@ def view(request, course_id, slug, namespace=None): ...@@ -39,11 +39,11 @@ def view(request, course_id, slug, namespace=None):
'course' : course, 'course' : course,
} }
d.update(csrf(request)) d.update(csrf(request))
print d
return render_to_response('simplewiki/simplewiki_view.html', d) return render_to_response('simplewiki/simplewiki_view.html', d)
def view_revision(request, course_id, slug, revision_number, namespace=None): def view_revision(request, course_id, revision_number, article_path):
(article, err) = get_article(request, slug, namespace if namespace else course_id ) course = get_course(course_id)
(article, err) = get_article(request, article_path, course )
if err: if err:
return err return err
...@@ -65,23 +65,24 @@ def view_revision(request, course_id, slug, revision_number, namespace=None): ...@@ -65,23 +65,24 @@ def view_revision(request, course_id, slug, revision_number, namespace=None):
'wiki_write': article.can_write_l(request.user), 'wiki_write': article.can_write_l(request.user),
'wiki_attachments_write': article.can_attach(request.user), 'wiki_attachments_write': article.can_attach(request.user),
'wiki_current_revision_deleted' : not (revision.deleted == 0), 'wiki_current_revision_deleted' : not (revision.deleted == 0),
'course' : course,
} }
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki/simplewiki_view.html', d) return render_to_response('simplewiki/simplewiki_view.html', d)
def root_redirect(request): def root_redirect(request, course_id):
# TODO: What is going on here? Why don't we just return the redirect? course = get_course(course_id)
try: try:
root = Article.get_root() root = Article.get_root(course.wiki_namespace)
except: except:
#TODO: If we don't find a root article, we should create it
err = not_found(request, '/') err = not_found(request, '/')
return err 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): def create(request, wiki_url):
url_path = get_url_path(wiki_url) url_path = get_url_path(wiki_url)
if url_path != [] and url_path[0].startswith('_'): if url_path != [] and url_path[0].startswith('_'):
...@@ -204,8 +205,9 @@ def edit(request, course_id, slug, namespace = None): ...@@ -204,8 +205,9 @@ def edit(request, course_id, slug, namespace = None):
return render_to_response('simplewiki/simplewiki_edit.html', d) return render_to_response('simplewiki/simplewiki_edit.html', d)
def history(request, course_id, slug, namespace = None, page=1): def history(request, course_id, article_path, page=1):
(article, err) = get_article(request, slug, namespace if namespace else course_id ) course = get_course(course_id)
(article, err) = get_article(request, article_path, course )
if err: if err:
return err return err
...@@ -216,6 +218,8 @@ def history(request, course_id, slug, namespace = None, page=1): ...@@ -216,6 +218,8 @@ def history(request, course_id, slug, namespace = None, page=1):
page_size = 10 page_size = 10
if page == None:
page = 1
try: try:
p = int(page) p = int(page)
except ValueError: except ValueError:
...@@ -229,7 +233,7 @@ def history(request, course_id, slug, namespace = None, page=1): ...@@ -229,7 +233,7 @@ def history(request, course_id, slug, namespace = None, page=1):
if perm_err: if perm_err:
return 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: try:
r = int(request.POST['revision']) r = int(request.POST['revision'])
revision = Revision.objects.get(id=r) revision = Revision.objects.get(id=r)
...@@ -237,8 +241,9 @@ def history(request, course_id, slug, namespace = None, page=1): ...@@ -237,8 +241,9 @@ def history(request, course_id, slug, namespace = None, page=1):
article.current_revision = revision article.current_revision = revision
article.save() article.save()
elif request.POST.__contains__('view'): 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 #The rese of these are admin functions
elif request.POST.__contains__('delete') and request.user.is_superuser: elif request.POST.__contains__('delete') and request.user.is_superuser:
if (revision.deleted == 0): if (revision.deleted == 0):
...@@ -253,7 +258,8 @@ def history(request, course_id, slug, namespace = None, page=1): ...@@ -253,7 +258,8 @@ def history(request, course_id, slug, namespace = None, page=1):
article.locked = not article.locked article.locked = not article.locked
print "changed locked article " , article.locked print "changed locked article " , article.locked
article.save() article.save()
except: except Exception as e:
print str(e)
pass pass
finally: finally:
return HttpResponseRedirect(redirectURL) return HttpResponseRedirect(redirectURL)
...@@ -282,7 +288,8 @@ def history(request, course_id, slug, namespace = None, page=1): ...@@ -282,7 +288,8 @@ def history(request, course_id, slug, namespace = None, page=1):
'wiki_article': article, 'wiki_article': article,
'wiki_title': article.title, 'wiki_title': article.title,
'wiki_history': history[beginItem:beginItem+page_size], '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)) d.update(csrf(request))
return render_to_response('simplewiki/simplewiki_history.html', d) return render_to_response('simplewiki/simplewiki_history.html', d)
...@@ -361,7 +368,7 @@ def search_articles(request, course_id): ...@@ -361,7 +368,7 @@ def search_articles(request, course_id):
return render_to_response('simplewiki/simplewiki_searchresults.html', d) 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 ) (article, err) = get_article(request, slug, namespace if namespace else course_id )
if err: if err:
return err return err
...@@ -391,7 +398,7 @@ def search_add_related(request, course_id, slug, namespace=None): ...@@ -391,7 +398,7 @@ def search_add_related(request, course_id, slug, namespace=None):
json = simplejson.dumps({'results': results}) json = simplejson.dumps({'results': results})
return HttpResponse(json, mimetype='application/json') 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 ) (article, err) = get_article(request, slug, namespace if namespace else course_id )
if err: if err:
return err return err
...@@ -412,7 +419,7 @@ def add_related(request, course_id, slug, namespace=None): ...@@ -412,7 +419,7 @@ def add_related(request, course_id, slug, namespace=None):
finally: finally:
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) 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 ) (article, err) = get_article(request, slug, namespace if namespace else course_id )
if err: if err:
...@@ -438,27 +445,29 @@ def random_article(request, course_id): ...@@ -438,27 +445,29 @@ def random_article(request, course_id):
article = Article.objects.all()[randint(0, num_arts-1)] article = Article.objects.all()[randint(0, num_arts-1)]
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
def encode_err(request, url): def encode_err(request, url, course):
d = {'wiki_err_encode': True} d = {'wiki_err_encode': True,
'course' : course}
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki/simplewiki_error.html', d) 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""" """Generate a NOT FOUND message for some URL"""
d = {'wiki_err_notfound': True, d = {'wiki_err_notfound': True,
'wiki_url': wiki_url} 'wiki_url': wiki_url,
'course' : course}
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki/simplewiki_error.html', d) return render_to_response('simplewiki/simplewiki_error.html', d)
def get_article(request, slug, namespace): def get_article(request, article_path, course):
err = None err = None
article = None article = None
try: try:
article = Article.objects.get( slug__exact = slug )#, namespace__name__exact = namespace) article = Article.get_article(article_path)
except Article.DoesNotExist: except Article.DoesNotExist, ValueError:
#TODO: We need to pass a url for creating the article here #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) return (article, err)
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
%> %>
## A convenience function that calls reverse with the kwargs course_id, namespace, and slug ## A convenience function that calls reverse with the kwargs course_id, namespace, and slug
<%def name="wiki_reverse(wiki_page)"> <%def name="wiki_reverse(wiki_page, args=[], kwargs={})">
${reverse(wiki_page, kwargs={'course_id': course.id, 'namespace' : wiki_article.namespace.name, 'slug' : wiki_article.slug})} ${reverse(wiki_page, kwargs=dict({'course_id': course.id, 'article_path' : wiki_article.get_path()}, **kwargs), args=args) }
</%def> </%def>
<%block name="headextra"> <%block name="headextra">
......
...@@ -64,10 +64,10 @@ ${ wiki_article.title } ...@@ -64,10 +64,10 @@ ${ wiki_article.title }
<tr> <tr>
<td colspan="4"> <td colspan="4">
%if wiki_prev_page: %if wiki_prev_page:
<a href="${reverse("wiki_history", args=[wiki_article.get_url(), wiki_prev_page])}">Previous page</a> <a href="${self.wiki_reverse('wiki_history', kwargs={'page' : wiki_prev_page})}">Previous page</a>
%endif %endif
%if wiki_next_page: %if wiki_next_page:
<a href="${reverse("wiki_history", args=[wiki_article.get_url(), wiki_next_page])}">Next page</a> <a href="${self.wiki_reverse('wiki_history', kwargs={'page' : wiki_next_page})}">Next page</a>
%endif %endif
</td> </td>
</tr> </tr>
......
...@@ -85,17 +85,17 @@ if settings.COURSEWARE_ENABLED: ...@@ -85,17 +85,17 @@ if settings.COURSEWARE_ENABLED:
) )
# Multicourse wiki # Multicourse wiki
article_slug = r"(?:/(?P<namespace>[a-zA-Z\d_-]*))?/(?P<slug>[a-zA-Z\d_-]*)" article_slug = r"/(?P<article_path>[a-zA-Z\d_-]+/[a-zA-Z\d_-]*)"
urlpatterns += ( urlpatterns += (
url(r'^courses/(?P<course_id>[^/]*)/wiki/$', 'simplewiki.views.root_redirect', name='wiki_root'), url(r'^courses/(?P<course_id>[^/]*)/wiki/$', 'simplewiki.views.root_redirect', name='wiki_root'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/view' + article_slug + r'/?$', 'simplewiki.views.view', name='wiki_view'), url(r'^courses/(?P<course_id>[^/]*)/wiki/view' + article_slug + r'/?$', 'simplewiki.views.view', name='wiki_view'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/view_revision/([0-9]*)(/[a-zA-Z\d/_-]*)/?$', 'simplewiki.views.view_revision', name='wiki_view_revision'), url(r'^courses/(?P<course_id>[^/]*)/wiki/view_revision/(?P<revision_number>[0-9]+)' + article_slug + r'/?$', 'simplewiki.views.view_revision', name='wiki_view_revision'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/edit' + article_slug + r'/?$', 'simplewiki.views.edit', name='wiki_edit'), url(r'^courses/(?P<course_id>[^/]*)/wiki/edit' + article_slug + r'/?$', 'simplewiki.views.edit', name='wiki_edit'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/create/?$', 'simplewiki.views.create', name='wiki_create'), url(r'^courses/(?P<course_id>[^/]*)/wiki/create/?$', 'simplewiki.views.create', name='wiki_create'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/history' + article_slug + r'(?:/([0-9]*))?/?$', 'simplewiki.views.history', name='wiki_history'), url(r'^courses/(?P<course_id>[^/]*)/wiki/history' + article_slug + r'(?:/(?P<page>[0-9]+))?/?$', 'simplewiki.views.history', name='wiki_history'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/search_related' + article_slug + r'/?$', 'simplewiki.views.search_add_related', name='search_related'), url(r'^courses/(?P<course_id>[^/]*)/wiki/search_related' + article_slug + r'/?$', 'simplewiki.views.search_add_related', name='search_related'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/random/?$', 'simplewiki.views.random_article', name='wiki_random'), url(r'^courses/(?P<course_id>[^/]*)/wiki/random/?$', 'simplewiki.views.random_article', name='wiki_random'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/revision_feed/([0-9]*)/?$', 'simplewiki.views.revision_feed', name='wiki_revision_feed'), url(r'^courses/(?P<course_id>[^/]*)/wiki/revision_feed/([0-9]+)/?$', 'simplewiki.views.revision_feed', name='wiki_revision_feed'),
url(r'^courses/(?P<course_id>[^/]*)/wiki/search/?$', 'simplewiki.views.search_articles', name='wiki_search_articles'), url(r'^courses/(?P<course_id>[^/]*)/wiki/search/?$', 'simplewiki.views.search_articles', name='wiki_search_articles'),
url(r'^courses/(?P<course_id>[^/]*)/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 url(r'^courses/(?P<course_id>[^/]*)/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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment