X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/0f2ac86f03177aebee66a3890120d9926272cf27..fa491172e51c164fd620f73859788dfce2ebc9ac:/src/documents/views.py diff --git a/src/documents/views.py b/src/documents/views.py index 8f403034..e87dc6db 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -5,6 +5,7 @@ from collections import defaultdict from copy import deepcopy from datetime import datetime, date, timedelta from itertools import zip_longest +import json import logging import os from urllib.parse import quote_plus, unquote, urlsplit, urlunsplit @@ -25,6 +26,7 @@ from django.utils.translation import gettext_lazy as _ from django.views.decorators.http import require_POST from django_cas_ng.decorators import user_passes_test import requests +from lxml import etree from librarian import epubcheck from librarian.html import raw_printable_text @@ -35,6 +37,7 @@ from . import helpers from .helpers import active_tab from .models import (Book, Chunk, Image, BookPublishRecord, ChunkPublishRecord, ImagePublishRecord, Project) +import catalogue.models from fileupload.views import UploadView # @@ -237,7 +240,7 @@ def book_xml(request, slug): @never_cache def book_xml_dc(request, slug): - book = get_object_or_404(Book, catalogue_book_id=slug) + book = get_object_or_404(Book, dc_slug=slug) return serve_xml(request, book, slug) @@ -409,14 +412,18 @@ def book(request, slug): except: pass - if book.catalogue_book_id: - audio_items = requests.get(f'https://audio.wolnelektury.pl/archive/book/{book.catalogue_book_id}.json').json()['items'] + cbook_by_slug = None + if book.dc_slug: + audio_items = requests.get(f'https://audio.wolnelektury.pl/archive/book/{book.dc_slug}.json').json()['items'] has_audio = bool(audio_items) can_sell_audio = has_audio and all(x['project']['can_sell'] for x in audio_items) + + if book.catalogue_book is None or book.dc_slug != book.catalogue_book.slug: + cbook_by_slug = catalogue.models.Book.objects.filter(slug=book.dc_slug).first() else: has_audio = None can_sell_audio = None - + return render(request, "documents/book_detail.html", { "book": book, "doc": doc, @@ -428,6 +435,7 @@ def book(request, slug): "editable": editable, "has_audio": has_audio, "can_sell_audio": can_sell_audio, + "cbook_by_slug": cbook_by_slug, }) @@ -764,14 +772,29 @@ def mark_final_completed(request): return render(request, 'documents/mark_final_completed.html') +@login_required def synchro(request, slug): book = get_object_or_404(Book, slug=slug) if not book.accessible(request): return HttpResponseForbidden("Not authorized.") - document = book.wldocument(librarian2=True) + if request.method == 'POST': + #hints = json.loads(request.POST.get('hints')) + chunk = book[0] + tree = etree.fromstring(chunk.head.materialize()) + m = tree.find('.//meta[@id="synchro"]') + if m is None: + rdf = tree.find('.//{http://www.w3.org/1999/02/22-rdf-syntax-ns#}Description') + m = etree.SubElement(rdf, 'meta', id="synchro") + m.tail = '\n' + m.text = request.POST.get('hints') + text = etree.tostring(tree, encoding='unicode') + chunk.commit(text, author=request.user, description='Synchronizacja') + return HttpResponseRedirect('') + + document = book.wldocument(librarian2=True, publishable=False) + slug = document.meta.url.slug - print(f'https://audio.wolnelektury.pl/archive/book/{slug}.json') error = None try: items = requests.get(f'https://audio.wolnelektury.pl/archive/book/{slug}.json').json()['items'] @@ -786,57 +809,57 @@ def synchro(request, slug): split_on = ( 'naglowek_rozdzial', 'naglowek_scena', - ) - - if split_on: - documents = [] - headers = [('Początek', 0, 0)] - present = True - n = 0 - while present: - present = False - n += 1 - newdoc = deepcopy(document) - newdoc.tree.getroot().document = newdoc - - master = newdoc.tree.getroot()[-1] - i = 0 - for item in list(master): - #chunkno, sourceline = 0, self.sourceline - #if builder.splits: - # chunkno, sourceline = len(builder.splits), sourceline - builder.splits[-1] - - if 'forcesplit' in item.attrib or (item.tag in split_on and 'nosplit' not in item.attrib): - # TODO: clear - i += 1 - if n > 1 and i == n: - headers.append(( - raw_printable_text(item), - 0, - item.sourceline, - )) - if i != n and not (n == 1 and not i): - master.remove(item) - else: - present = True - if present: - documents.append(newdoc) - else: - documents = [document] - headers = [( - document.meta.title, 0 ,0 - )] - - length_ok = len(headers) == len(mp3) - table = zip_longest(headers, mp3) - + ) + split_other = ( + 'naglowek_czesc', + 'naglowek_akt', + 'naglowek_podrozdzial', + 'srodtytul', + ) + + headers = [] + headers_other = [] + master = document.tree.getroot()[-1] + for item in master: + if item.tag in split_on: + headers.append([ + item.tag, + raw_printable_text(item), + 0, + item.sourceline, + ]) + if item.tag in split_other: + headers_other.append([ + item.tag, + raw_printable_text(item), + 0, + item.sourceline, + ]) + + hints = [] + m = document.tree.find('.//meta[@id="synchro"]') + if m is not None: + try: + hints = json.loads(m.text) + except: + raise + pass return render(request, 'documents/synchro.html', { 'book': book, - 'documents': documents, 'headers': headers, + 'headers_other': headers_other, 'mp3': mp3, - 'length_ok': length_ok, - 'table': table, 'error': error, + 'hints': hints, }) + + +@permission_required('documents.change_book') +def attach_book_to_catalogue(request, pk): + dbook = get_object_or_404(Book, pk=pk) + if dbook.dc_slug: + cbook = get_object_or_404(catalogue.models.Book, slug=dbook.dc_slug) + dbook.catalogue_book = cbook + dbook.save() + return http.HttpResponseRedirect(dbook.get_absolute_url())