+from django.views.decorators.http import require_POST, require_GET
+from django.core.urlresolvers import reverse
+from wiki.helpers import (JSONResponse, JSONFormInvalid, JSONServerError,
+ ajax_require_permission, recursive_groupby, active_tab)
+from wiki import helpers
+from django import http
+from django.shortcuts import get_object_or_404, redirect
+from django.http import Http404
+
+from wiki.models import Book, Chunk, Theme
+from wiki import forms
+from datetime import datetime
+from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+from django.utils.decorators import decorator_from_middleware
+from django.middleware.gzip import GZipMiddleware
+
+import librarian.html
+import librarian.text
+from wiki import xml_tools
+from apiclient import api_call
+
+#
+# Quick hack around caching problems, TODO: use ETags
+#
+from django.views.decorators.cache import never_cache
+
+import nice_diff
+import operator
+
+MAX_LAST_DOCS = 10
+
+
+@active_tab('all')
+@never_cache
+def document_list(request):
+ return direct_to_template(request, 'wiki/document_list.html', extra_context={
+ 'books': [helpers.BookChunks(b) for b in Book.objects.all()],
+ 'last_books': sorted(request.session.get("wiki_last_books", {}).items(),
+ key=lambda x: x[1]['time'], reverse=True),
+ })
+
+
+@active_tab('unassigned')
+@never_cache
+def unassigned(request):
+ chunks = Chunk.objects.filter(user=None).order_by('book__title', 'book', 'number')
+ books = []
+ book = None
+ for chunk in chunks:
+ if chunk.book != book:
+ book = chunk.book
+ books.append(helpers.ChoiceChunks(book, [chunk]))
+ else:
+ books[-1].chunks.append(chunk)
+
+ return direct_to_template(request, 'wiki/document_list.html', extra_context={
+ 'books': books,
+ 'last_books': sorted(request.session.get("wiki_last_books", {}).items(),
+ key=lambda x: x[1]['time'], reverse=True),
+ })
+
+
+@never_cache
+def user(request, username=None):
+ if username is None:
+ if request.user.is_authenticated():
+ user = request.user
+ else:
+ raise Http404
+ else:
+ user = get_object_or_404(User, username=username)
+
+ chunks = Chunk.objects.filter(user=user).order_by('book__title', 'number')
+ books = []
+ book = None
+ for chunk in chunks:
+ if chunk.book != book:
+ book = chunk.book
+ books.append(helpers.ChoiceChunks(book, [chunk]))
+ else:
+ books[-1].chunks.append(chunk)
+
+ return direct_to_template(request, 'wiki/document_list.html', extra_context={
+ 'books': books,
+ 'last_books': sorted(request.session.get("wiki_last_books", {}).items(),
+ key=lambda x: x[1]['time'], reverse=True),
+ })
+my = login_required(active_tab('my')(user))
+
+
+@active_tab('users')
+def users(request):
+ return direct_to_template(request, 'wiki/user_list.html', extra_context={
+ 'users': User.objects.all().annotate(count=Count('document')).order_by(
+ '-count', 'last_name', 'first_name'),
+ })
+
+
+@never_cache
+def editor(request, slug, chunk=None, template_name='wiki/document_details.html'):
+ try:
+ chunk = Chunk.get(slug, chunk)
+ except Chunk.MultipleObjectsReturned:
+ # TODO: choice page
+ raise Http404
+ except Chunk.DoesNotExist:
+ if chunk is None:
+ try:
+ book = Book.objects.get(slug=slug)
+ except Book.DoesNotExist:
+ return http.HttpResponseRedirect(reverse("wiki_create_missing", args=[slug]))
+ else:
+ raise Http404
+
+ access_time = datetime.now()
+ last_books = request.session.get("wiki_last_books", {})
+ last_books[slug, chunk.slug] = {
+ 'time': access_time,
+ 'title': chunk.pretty_name(),
+ }
+
+ if len(last_books) > MAX_LAST_DOCS:
+ oldest_key = min(last_books, key=lambda x: last_books[x]['time'])
+ del last_books[oldest_key]
+ request.session['wiki_last_books'] = last_books
+
+ return direct_to_template(request, template_name, extra_context={
+ 'chunk': chunk,
+ 'forms': {
+ "text_save": forms.DocumentTextSaveForm(prefix="textsave"),
+ "text_revert": forms.DocumentTextRevertForm(prefix="textrevert"),
+ "add_tag": forms.DocumentTagForm(prefix="addtag"),
+ "pubmark": forms.DocumentPubmarkForm(prefix="pubmark"),
+ },
+ 'REDMINE_URL': settings.REDMINE_URL,
+ })
+
+
+@require_GET
+def editor_readonly(request, slug, chunk=None, template_name='wiki/document_details_readonly.html'):
+ try:
+ chunk = Chunk.get(slug, chunk)
+ revision = request.GET['revision']
+ except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist, KeyError):
+ raise Http404