from django.contrib import auth
from django.contrib.auth.models import User
-from django.contrib.auth.decorators import login_required
+from django.contrib.auth.decorators import login_required, permission_required
from django.core.urlresolvers import reverse
-from django.db.models import Count
+from django.db.models import Count, Q
from django import http
from django.http import Http404
-from django.shortcuts import get_object_or_404
+from django.shortcuts import get_object_or_404, render
from django.utils.http import urlquote_plus
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.http import require_POST
import librarian.html
import librarian.text
-from apiclient import api_call
+from apiclient import NotAuthorizedError
from catalogue import forms
from catalogue import helpers
from catalogue.helpers import active_tab
-from catalogue.models import Book, Chunk
+from catalogue.models import Book, Chunk, BookPublishRecord, ChunkPublishRecord
from catalogue import xml_tools
#
logger = logging.getLogger("fnp.catalogue")
-def slug_filter(qs, value, filter_field, model, model_field='slug', unset=''):
- if value == unset:
- return qs.filter(**{filter_field: None})
- if value is None:
- return qs
- try:
- obj = model._default_manager.get(**{model_field: value})
- except model.DoesNotExist:
- return qs.none()
- else:
- return qs.filter(**{filter_field: obj})
-
-
@active_tab('all')
@never_cache
-def document_list(request, filters=None):
- chunks = Chunk.objects.order_by('book__title', 'book', 'number')
-
- chunks = slug_filter(chunks, request.GET.get('user', None), 'user', User, 'username')
- chunks = slug_filter(chunks, request.GET.get('stage', None), 'stage', Chunk.tag_model, 'slug')
-
- chunks_list = helpers.ChunksList(chunks)
-
- return direct_to_template(request, 'catalogue/document_list.html', extra_context={
- 'books': chunks_list,
- 'last_books': sorted(request.session.get("wiki_last_books", {}).items(),
- key=lambda x: x[1]['time'], reverse=True),
- 'stages': Chunk.tag_model.objects.all(),
- 'users': User.objects.annotate(count=Count('chunk')).order_by('-count', 'last_name', 'first_name'),
- })
+def document_list(request):
+ return render(request, 'catalogue/document_list.html')
-@active_tab('unassigned')
@never_cache
-def unassigned(request):
- chunks_list = helpers.ChunksList(Chunk.objects.filter(
- user=None).order_by('book__title', 'book__id', 'number'))
-
- return direct_to_template(request, 'catalogue/document_list.html', extra_context={
- 'books': chunks_list,
- 'last_books': sorted(request.session.get("wiki_last_books", {}).items(),
- key=lambda x: x[1]['time'], reverse=True),
- })
+def user(request, username):
+ user = get_object_or_404(User, username=username)
+ return render(request, 'catalogue/user_page.html', {"viewed_user": user})
+@login_required
+@active_tab('my')
@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_list = helpers.ChunksList(Chunk.objects.filter(
- user=user).order_by('book__title', 'book', 'number'))
-
- return direct_to_template(request, 'catalogue/document_list.html', extra_context={
- 'books': chunks_list,
+def my(request):
+ return render(request, 'catalogue/my_page.html', {
'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')
})
+@active_tab('activity')
+def activity(request):
+ return render(request, 'catalogue/activity.html')
+
+
@never_cache
def logout_then_redirect(request):
auth.logout(request)
return http.HttpResponseRedirect(urlquote_plus(request.GET.get('next', '/'), safe='/?='))
+@permission_required('catalogue.add_book')
@active_tab('create')
def create_missing(request, slug=None):
if slug is None:
creator = request.user
else:
creator = None
- book = Book.create(creator=creator,
+ book = Book.create(
+ text=form.cleaned_data['text'],
+ creator=creator,
slug=form.cleaned_data['slug'],
title=form.cleaned_data['title'],
- text=form.cleaned_data['text'],
)
return http.HttpResponseRedirect(reverse("wiki_editor", args=[book.slug]))
})
+@permission_required('catalogue.add_book')
@active_tab('upload')
def upload(request):
if request.method == "POST":
if not error_list:
for filename, slug, title in ok_list:
- Book.create(creator=creator,
+ book = Book.create(
+ text=zip.read(filename).decode('utf-8'),
+ creator=creator,
slug=slug,
title=title,
- text=zip.read(filename).decode('utf-8'),
)
return direct_to_template(request, "catalogue/document_upload.html", extra_context={
else:
form = None
+ try:
+ book.assert_publishable()
+ except AssertionError, e:
+ publishable = False
+ publishable_error = e
+ else:
+ publishable = True
+ publishable_error = None
+
return direct_to_template(request, "catalogue/book_detail.html", extra_context={
"book": book,
+ "publishable": publishable,
+ "publishable_error": publishable_error,
"chunks": chunks,
"need_fixing": need_fixing,
"choose_master": choose_master,
})
+@permission_required('catalogue.add_chunk')
def chunk_add(request, slug, chunk):
try:
doc = Chunk.get(slug, chunk)
creator = None
doc.split(creator=creator,
slug=form.cleaned_data['slug'],
- comment=form.cleaned_data['comment'],
+ title=form.cleaned_data['title'],
)
return http.HttpResponseRedirect(doc.book.get_absolute_url())
else:
form = forms.ChunkAddForm(initial={
"slug": str(doc.number + 1),
- "comment": "cz. %d" % (doc.number + 1, ),
+ "title": "cz. %d" % (doc.number + 1, ),
})
return direct_to_template(request, "catalogue/chunk_add.html", extra_context={
})
+@permission_required('catalogue.change_book')
def book_append(request, slug):
book = get_object_or_404(Book, slug=slug)
if request.method == "POST":
- form = forms.BookAppendForm(request.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()
+ form = forms.BookAppendForm(book)
return direct_to_template(request, "catalogue/book_append_to.html", extra_context={
"book": book,
"form": form,
})
+@permission_required('catalogue.change_book')
def book_edit(request, slug):
book = get_object_or_404(Book, slug=slug)
if request.method == "POST":
def publish(request, slug):
book = get_object_or_404(Book, slug=slug)
try:
- ret = api_call(request.user, "books", {"book_xml": book.materialize()})
+ book.publish(request.user)
+ except NotAuthorizedError:
+ return http.HttpResponseRedirect(reverse('apiclient_oauth'))
except BaseException, e:
return http.HttpResponse(e)
else:
- book.last_published = datetime.now()
- book.save()
return http.HttpResponseRedirect(book.get_absolute_url())