from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.auth.decorators import login_required
+from django.db.models import Count
from django.views.generic.simple import direct_to_template
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)
+ 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
import librarian.html
import librarian.text
from wiki import xml_tools
+from apiclient import api_call
#
# Quick hack around caching problems, TODO: use ETags
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': Book.objects.all(),
+ '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:
"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,
})
})
-def create_missing(request, slug):
+@active_tab('create')
+def create_missing(request, slug=None):
+ if slug is None:
+ slug = ''
slug = slug.replace(' ', '-')
if request.method == "POST":
})
+@active_tab('upload')
def upload(request):
if request.method == "POST":
form = forms.DocumentsUploadForm(request.POST, request.FILES)
@never_cache
def book_xml(request, slug):
- xml = get_object_or_404(Book, slug=slug).materialize(Book.publish_tag())
+ xml = get_object_or_404(Book, slug=slug).materialize()
response = http.HttpResponse(xml, content_type='application/xml', mimetype='application/wl+xml')
response['Content-Disposition'] = 'attachment; filename=%s.xml' % slug
@never_cache
def book_txt(request, slug):
- xml = get_object_or_404(Book, slug=slug).materialize(Book.publish_tag())
+ xml = get_object_or_404(Book, slug=slug).materialize()
output = StringIO()
# errors?
librarian.text.transform(StringIO(xml), output)
@never_cache
def book_html(request, slug):
- xml = get_object_or_404(Book, slug=slug).materialize(Book.publish_tag())
+ xml = get_object_or_404(Book, slug=slug).materialize()
output = StringIO()
# errors?
librarian.html.transform(StringIO(xml), output, parse_dublincore=False,
"description": change.description,
"author": change.author_str(),
"date": change.created_at,
+ "publishable": "Publishable\n" if change.publishable else "",
"tag": ',\n'.join(unicode(tag) for tag in change.tags.all()),
})
return JSONResponse(changes)
raise Http404
tag = form.cleaned_data['tag']
- revision = revision=form.cleaned_data['revision']
+ revision = form.cleaned_data['revision']
doc.at_revision(revision).tags.add(tag)
return JSONResponse({"message": _("Tag added")})
else:
return JSONFormInvalid(form)
-"""
-import wlapi
-
-
@require_POST
-@ajax_require_permission('wiki.can_publish')
-def publish(request, name):
- name = normalize_name(name)
+@ajax_require_permission('wiki.can_pubmark')
+def pubmark(request, slug, chunk=None):
+ form = forms.DocumentPubmarkForm(request.POST, prefix="pubmark")
+ if form.is_valid():
+ try:
+ doc = Chunk.get(slug, chunk)
+ except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist):
+ raise Http404
- storage = getstorage()
- document = storage.get_by_tag(name, "ready_to_publish")
+ revision = form.cleaned_data['revision']
+ publishable = form.cleaned_data['publishable']
+ change = doc.at_revision(revision)
+ print publishable, change.publishable
+ if publishable != change.publishable:
+ change.publishable = publishable
+ change.save()
+ return JSONResponse({"message": _("Revision marked")})
+ else:
+ return JSONResponse({"message": _("Nothing changed")})
+ else:
+ return JSONFormInvalid(form)
- api = wlapi.WLAPI(**settings.WL_API_CONFIG)
+@require_POST
+@login_required
+def publish(request, slug):
+ book = get_object_or_404(Book, slug=slug)
try:
- return JSONResponse({"result": api.publish_book(document)})
- except wlapi.APICallException, e:
- return JSONServerError({"message": str(e)})
-"""
+ ret = api_call(request.user, "books", {"book_xml": book.materialize()})
+ except BaseException, e:
+ return http.HttpResponse(e)
+ else:
+ book.last_published = datetime.now()
+ book.save()
+ return http.HttpResponseRedirect(book.get_absolute_url())
+
def themes(request):
prefix = request.GET.get('q', '')