synchro
[redakcja.git] / src / documents / views.py
index 8f40303..e87dc6d 100644 (file)
@@ -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())