-from django.contrib.auth.decorators import login_required, permission_required
-from django.urls import reverse
-from django.db.models import Count, Q
-from django.db import transaction
-from django import http
-from django.http import Http404, HttpResponse, HttpResponseForbidden
-from django.http.response import HttpResponseRedirect
-from django.shortcuts import get_object_or_404, render
-from django.utils.encoding import iri_to_uri
-from django.utils.http import urlquote_plus
-from django.utils.translation import ugettext_lazy as _
-from django.views.decorators.http import require_POST
-from django_cas_ng.decorators import user_passes_test
-
-from apiclient import NotAuthorizedError
-from catalogue import forms
-from catalogue import helpers
-from catalogue.helpers import active_tab
-from catalogue.models import (Book, Chunk, Image, BookPublishRecord,
- ChunkPublishRecord, ImagePublishRecord, Project)
-from fileupload.views import UploadView
-
-#
-# Quick hack around caching problems, TODO: use ETags
-#
-from django.views.decorators.cache import never_cache
-
-logger = logging.getLogger("fnp.catalogue")
-
-
-@active_tab('all')
-@never_cache
-def document_list(request):
- return render(request, 'catalogue/document_list.html')
-
-
-@active_tab('images')
-@never_cache
-def image_list(request, user=None):
- return render(request, 'catalogue/image_list.html')
-
-
-@never_cache
-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 my(request):
- last_books = sorted(request.session.get("wiki_last_books", {}).items(),
- key=lambda x: x[1]['time'], reverse=True)
- for k, v in last_books:
- v['time'] = datetime.fromtimestamp(v['time'])
- return render(request, 'catalogue/my_page.html', {
- 'last_books': last_books,
- "logout_to": '/',
- })
-
-
-@active_tab('users')
-def users(request):
- return render(request, 'catalogue/user_list.html', {
- 'users': User.objects.all().annotate(count=Count('chunk')).order_by(
- '-count', 'last_name', 'first_name'),
- })
-
-
-@active_tab('activity')
-def activity(request, isodate=None):
- today = date.today()
- try:
- day = helpers.parse_isodate(isodate)
- except ValueError:
- day = today
-
- if day > today:
- raise Http404
- if day != today:
- next_day = day + timedelta(1)
- prev_day = day - timedelta(1)
-
- return render(request, 'catalogue/activity.html', locals())
-
-
-@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:
- slug = ''
- slug = slug.replace(' ', '-')
-
- if request.method == "POST":
- form = forms.DocumentCreateForm(request.POST, request.FILES)
- if form.is_valid():
-
- if request.user.is_authenticated:
- creator = request.user
- else:
- creator = None
- book = Book.create(
- text=form.cleaned_data['text'],
- creator=creator,
- slug=form.cleaned_data['slug'],
- title=form.cleaned_data['title'],
- gallery=form.cleaned_data['gallery'],
- )
-
- return http.HttpResponseRedirect(reverse("catalogue_book", args=[book.slug]))
- else:
- form = forms.DocumentCreateForm(initial={
- "slug": slug,
- "title": slug.replace('-', ' ').title(),
- "gallery": slug,
- })
-
- return render(request, "catalogue/document_create_missing.html", {
- "slug": slug,
- "form": form,
-
- "logout_to": '/',
- })
-
-
-@permission_required('catalogue.add_book')
-@active_tab('upload')
-def upload(request):
- if request.method == "POST":
- form = forms.DocumentsUploadForm(request.POST, request.FILES)
- if form.is_valid():
- from slugify import slugify
-
- 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 = slugify(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 = Book.create(
- text=zip.read(filename).decode('utf-8'),
- creator=creator,
- slug=slug,
- title=title,
- )
-
- return render(request, "catalogue/document_upload.html", {
- "form": form,
- "ok_list": ok_list,
- "skipped_list": skipped_list,
- "error_list": error_list,
-
- "logout_to": '/',
- })
- else:
- form = forms.DocumentsUploadForm()
-
- return render(request, "catalogue/document_upload.html", {
- "form": form,
-
- "logout_to": '/',
- })
-
-
-def serve_xml(request, book, slug):
- if not book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
- xml = book.materialize(publishable=True)
- response = http.HttpResponse(xml, content_type='application/xml')
- response['Content-Disposition'] = 'attachment; filename=%s.xml' % slug
- return response
-
-
-@never_cache
-def book_xml(request, slug):
- book = get_object_or_404(Book, slug=slug)
- return serve_xml(request, book, slug)
-
-
-@never_cache
-def book_xml_dc(request, slug):
- book = get_object_or_404(Book, dc_slug=slug)
- return serve_xml(request, book, slug)
-
-
-@never_cache
-def book_txt(request, slug):
- book = get_object_or_404(Book, slug=slug)
- if not book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
-
- doc = book.wldocument()
- text = doc.as_text().get_bytes()
- response = http.HttpResponse(text, content_type='text/plain')
- response['Content-Disposition'] = 'attachment; filename=%s.txt' % slug
- return response