+# def book(request, slug):
+# book = get_object_or_404(Book, slug=slug)
+# if not book.accessible(request):
+# return HttpResponseForbidden("Not authorized.")
+#
+# if request.user.has_perm('catalogue.change_book'):
+# if request.method == "POST":
+# form = forms.BookForm(request.POST, instance=book)
+# if form.is_valid():
+# form.save()
+# return http.HttpResponseRedirect(book.get_absolute_url())
+# else:
+# form = forms.BookForm(instance=book)
+# editable = True
+# else:
+# form = forms.ReadonlyBookForm(instance=book)
+# editable = False
+#
+# publish_error = book.publishable_error()
+# publishable = publish_error is None
+#
+# return render(request, "catalogue/book_detail.html", {
+# "book": book,
+# "publishable": publishable,
+# "publishable_error": publish_error,
+# "form": form,
+# "editable": editable,
+# })
+
+
+# @permission_required('catalogue.add_chunk')
+# def chunk_add(request, slug, chunk):
+# try:
+# doc = Chunk.get(slug, chunk)
+# except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist):
+# raise Http404
+# if not doc.book.accessible(request):
+# return HttpResponseForbidden("Not authorized.")
+#
+# if request.method == "POST":
+# form = forms.ChunkAddForm(request.POST, instance=doc)
+# if form.is_valid():
+# if request.user.is_authenticated():
+# creator = request.user
+# else:
+# creator = None
+# doc.split(creator=creator,
+# slug=form.cleaned_data['slug'],
+# title=form.cleaned_data['title'],
+# gallery_start=form.cleaned_data['gallery_start'],
+# user=form.cleaned_data['user'],
+# stage=form.cleaned_data['stage']
+# )
+#
+# return http.HttpResponseRedirect(doc.book.get_absolute_url())
+# else:
+# form = forms.ChunkAddForm(initial={
+# "slug": str(doc.number + 1),
+# "title": "cz. %d" % (doc.number + 1, ),
+# })
+#
+# return render(request, "catalogue/chunk_add.html", {
+# "chunk": doc,
+# "form": form,
+# })
+
+
+# @login_required
+# def chunk_edit(request, slug, chunk):
+# try:
+# doc = Chunk.get(slug, chunk)
+# except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist):
+# raise Http404
+# if not doc.book.accessible(request):
+# return HttpResponseForbidden("Not authorized.")
+#
+# if request.method == "POST":
+# form = forms.ChunkForm(request.POST, instance=doc)
+# if form.is_valid():
+# form.save()
+# go_next = request.GET.get('next', None)
+# if go_next:
+# go_next = urlquote_plus(unquote(iri_to_uri(go_next)), safe='/?=&')
+# else:
+# go_next = doc.book.get_absolute_url()
+# return http.HttpResponseRedirect(go_next)
+# else:
+# form = forms.ChunkForm(instance=doc)
+#
+# referer = request.META.get('HTTP_REFERER')
+# if referer:
+# parts = urlsplit(referer)
+# parts = ['', ''] + list(parts[2:])
+# go_next = urlquote_plus(urlunsplit(parts))
+# else:
+# go_next = ''
+#
+# return render(request, "catalogue/chunk_edit.html", {
+# "chunk": doc,
+# "form": form,
+# "go_next": go_next,
+# })
+
+
+# @transaction.atomic
+# @login_required
+# def chunk_mass_edit(request):
+# if request.method == 'POST':
+# ids = map(int, filter(lambda i: i.strip()!='', request.POST.get('ids').split(',')))
+# chunks = map(lambda i: Chunk.objects.get(id=i), ids)
+#
+# stage = request.POST.get('stage')
+# if stage:
+# try:
+# stage = Chunk.tag_model.objects.get(slug=stage)
+# except Chunk.DoesNotExist, e:
+# stage = None
+#
+# for c in chunks: c.stage = stage
+#
+# username = request.POST.get('user')
+# logger.info("username: %s" % username)
+# logger.info(request.POST)
+# if username:
+# try:
+# user = User.objects.get(username=username)
+# except User.DoesNotExist, e:
+# user = None
+#
+# for c in chunks: c.user = user
+#
+# status = request.POST.get('status')
+# if status:
+# books_affected = set()
+# for c in chunks:
+# if status == 'publish':
+# c.head.publishable = True
+# c.head.save()
+# elif status == 'unpublish':
+# c.head.publishable = False
+# c.head.save()
+# c.touch() # cache
+# books_affected.add(c.book)
+# for b in books_affected:
+# b.touch() # cache
+#
+# project_id = request.POST.get('project')
+# if project_id:
+# try:
+# project = Project.objects.get(pk=int(project_id))
+# except (Project.DoesNotExist, ValueError), e:
+# project = None
+# for c in chunks:
+# book = c.book
+# book.project = project
+# book.save()
+#
+# for c in chunks: c.save()
+#
+# return HttpResponse("", content_type="text/plain")
+# else:
+# raise Http404
+
+
+# @permission_required('catalogue.change_book')
+# def book_append(request, slug):
+# book = get_object_or_404(Book, slug=slug)
+# if not book.accessible(request):
+# return HttpResponseForbidden("Not authorized.")
+#
+# if request.method == "POST":
+# form = forms.BookAppendForm(book, request.POST)
+# if form.is_valid():
+# append_to = form.cleaned_data['append_to']
+# append_to.append(book)
+# return http.HttpResponseRedirect(append_to.get_absolute_url())
+# else:
+# form = forms.BookAppendForm(book)
+# return render(request, "catalogue/book_append_to.html", {
+# "book": book,
+# "form": form,
+#
+# "logout_to": '/',
+# })
+
+
+@require_POST
+@login_required
+def publish(request, pk):
+ from wiki import forms
+ from .models import PublishRecord
+ from dvcs.models import Revision
+
+ # FIXME: check permissions
+
+ doc = get_object_or_404(Document, pk=pk, deleted=False)
+ form = forms.DocumentTextPublishForm(request.POST, prefix="textpublish")
+ if form.is_valid():
+ rev = Revision.objects.get(pk=form.cleaned_data['revision'])
+ # FIXME: check if in tree
+ # if PublishRecord.objects.filter(revision=rev, document=doc).exists():
+ # return http.HttpResponse('exists')
+ PublishRecord.objects.create(revision=rev, document=doc, user=request.user)
+ if request.is_ajax():
+ return http.HttpResponse('ok')
+ else:
+ return redirect('catalogue_html', doc.pk)