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
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
from .helpers import active_tab
from .models import (Book, Chunk, Image, BookPublishRecord,
ChunkPublishRecord, ImagePublishRecord, Project)
+import catalogue.models
from fileupload.views import UploadView
#
@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)
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,
"editable": editable,
"has_audio": has_audio,
"can_sell_audio": can_sell_audio,
+ "cbook_by_slug": cbook_by_slug,
})
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']
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())