+@login_required
+def book_schedule(request, pk):
+ book = get_object_or_404(Document, pk=pk, deleted=False)
+ if request.method == 'POST':
+ Plan.objects.filter(document=book).delete()
+ for i, s in enumerate(STAGES):
+ user_id = request.POST.get('s%d-user' % i)
+ deadline = request.POST.get('s%d-deadline' % i) or None
+ Plan.objects.create(document=book, stage=s, user_id=user_id, deadline=deadline)
+
+ book.set_stage(request.POST.get('stage', ''))
+ return redirect('catalogue_user')
+
+ current = {}
+ for p in Plan.objects.filter(document=book):
+ current[p.stage] = (getattr(p.user, 'pk', None), (p.deadline.isoformat() if p.deadline else None))
+
+ schedule = [(i, s, current.get(s, ())) for (i, s) in enumerate(STAGES)]
+
+ if book.owner_organization:
+ people = [m.user for m in book.owner_organization.membership_set.exclude(status='pending')]
+ else:
+ people = [book.owner_user]
+ return render(request, 'catalogue/book_schedule.html', {
+ 'book': book,
+ 'schedule': schedule,
+ 'people': people,
+ })
+
+
+@login_required
+def book_owner(request, pk):
+ doc = get_object_or_404(Document, pk=pk, deleted=False)
+ if not (doc.owner_user == request.user or doc.owner_organization.is_member(request.user)):
+ raise Http404
+
+ error = ''
+
+ if request.method == 'POST':
+ # TODO: real form
+ new_org_pk = request.POST.get('owner_organization')
+ if not new_org_pk:
+ doc.owner_organization = None
+ doc.owner_user = request.user
+ doc.save()
+ else:
+ org = Organization.objects.get(pk=new_org_pk)
+ if not org.is_member(request.user):
+ error = 'Bad organization'
+ else:
+ doc.owner_organization = org
+ doc.owner_user = None
+ doc.save()
+ if not error:
+ return redirect('catalogue_user')
+
+ return render(request, 'catalogue/book_owner.html', {
+ 'doc': doc,
+ 'error': error,
+ })
+
+
+@login_required
+def book_delete(request, pk):
+ doc = get_object_or_404(Document, pk=pk, deleted=False)
+ if not (doc.owner_user == request.user or doc.owner_organization.is_member(request.user)):
+ raise Http404
+
+ if request.method == 'POST':
+ doc.deleted = True
+ doc.save()
+ return redirect('catalogue_user')
+
+ return render(request, 'catalogue/book_delete.html', {
+ 'doc': doc,
+ })
+
+
+