+
+            return http.HttpResponseRedirect(reverse("wiki_editor", args=[book.slug]))
+    else:
+        form = DocumentCreateForm(initial={
+                "slug": slug,
+                "title": slug.replace('-', ' ').title(),
+        })
+
+    return direct_to_template(request, "wiki/document_create_missing.html", extra_context={
+        "slug": slug,
+        "form": form,
+    })
+
+
+def upload(request):
+    if request.method == "POST":
+        form = DocumentsUploadForm(request.POST, request.FILES)
+        if form.is_valid():
+            import slughifi
+
+            if request.user.is_authenticated():
+                creator = request.user
+            else:
+                creator = None
+
+            zip = form.cleaned_data['zip']
+            skipped_list = []
+            ok_list = []
+            error_list = []
+            slugs = {}
+            existing = [book.slug for book in Book.objects.all()]
+            for filename in zip.namelist():
+                if filename[-1] == '/':
+                    continue
+                title = os.path.basename(filename)[:-4]
+                slug = slughifi(title)
+                if not (slug and filename.endswith('.xml')):
+                    skipped_list.append(filename)
+                elif slug in slugs:
+                    error_list.append((filename, slug, _('Slug already used for %s' % slugs[slug])))
+                elif slug in existing:
+                    error_list.append((filename, slug, _('Slug already used in repository.')))
+                else:
+                    try:
+                        zip.read(filename).decode('utf-8') # test read
+                        ok_list.append((filename, slug, title))
+                    except UnicodeDecodeError:
+                        error_list.append((filename, title, _('File should be UTF-8 encoded.')))
+                    slugs[slug] = filename
+
+            if not error_list:
+                for filename, slug, title in ok_list:
+                    Book.create(creator=creator,
+                        slug=slug,
+                        title=title,
+                        text=zip.read(filename).decode('utf-8'),
+                    )
+
+            return direct_to_template(request, "wiki/document_upload.html", extra_context={
+                "form": form,
+                "ok_list": ok_list,
+                "skipped_list": skipped_list,
+                "error_list": error_list,
+            })
+    else:
+        form = DocumentsUploadForm()
+
+    return direct_to_template(request, "wiki/document_upload.html", extra_context={
+        "form": form,
+    })
+
+
+@never_cache
+@decorator_from_middleware(GZipMiddleware)
+def text(request, slug, chunk=None):
+    try:
+        doc = Chunk.get(slug, chunk)
+    except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist):
+        raise Http404
+
+    if request.method == 'POST':
+        form = DocumentTextSaveForm(request.POST, prefix="textsave")
+        if form.is_valid():
+            # TODO:
+            # - stage completion should be stored (as a relation)
+
+            if request.user.is_authenticated():
+                author = request.user
+            else:
+                author = None
+            text = form.cleaned_data['text']
+            parent_revision = form.cleaned_data['parent_revision']
+            parent = doc.at_revision(parent_revision)
+            doc.commit(author=author,
+                       text=text,
+                       parent=parent,
+                       description=form.cleaned_data['comment'],
+                       )
+            revision = doc.revision()