1 # -*- coding: utf-8 -*-
3 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
9 from django.contrib.auth.models import User
10 from lxml import etree
11 from collections import defaultdict
12 from django.core.management import BaseCommand
14 from catalogue.models import Book
15 from librarian import RDFNS, DCNS
18 'pdf': 'application/pdf',
19 'epub': 'application/epub+zip',
20 'mobi': 'application/x-mobipocket-ebook',
27 r'<dc:relation.hasFormat id="%(format)s" xmlns:dc="http://purl.org/dc/elements/1.1/">%(url)s'
28 r'</dc:relation.hasFormat>',
29 r'<meta refines="#%(format)s" id="%(format)s-id" property="dcterms:identifier">ISBN-%(isbn)s</meta>',
30 r'<meta refines="#%(format)s-id" property="identifier-type">ISBN</meta>',
31 r'<meta refines="#%(format)s" property="dcterms:format">%(content_type)s</meta>',
35 def url_for_format(slug, format):
37 return 'https://wolnelektury.pl/katalog/lektura/%s.html' % slug
39 return 'http://wolnelektury.pl/media/book/%(format)s/%(slug)s.%(format)s' % {'slug': slug, 'format': format}
42 class Command(BaseCommand):
45 def add_arguments(self, parser):
47 '-u', '--username', dest='username', metavar='USER',
48 help='Assign commits to this user (required, preferably yourself).')
50 def handle(self, csv_file, **options):
51 username = options.get('username')
54 user = User.objects.get(username=username)
56 print('Please provide a username.')
59 csvfile = open(csv_file, 'rb')
60 isbn_lists = defaultdict(list)
61 for slug, format, isbn in csv.reader(csvfile, delimiter=','):
62 isbn_lists[slug].append((format, isbn))
65 for slug, isbn_list in isbn_lists.iteritems():
66 print('processing %s' % slug)
67 book = Book.objects.get(dc_slug=slug)
68 chunk = book.chunk_set.first()
70 src = old_head.materialize()
71 tree = etree.fromstring(src)
72 isbn_node = tree.find('.//' + DCNS("relation.hasFormat"))
73 if isbn_node is not None:
74 print('%s already contains ISBN metadata, skipping' % slug)
76 desc = tree.find(".//" + RDFNS("Description"))
77 for format, isbn in isbn_list:
78 for template in ISBN_TEMPLATES:
79 isbn_xml = template % {
82 'content_type': CONTENT_TYPES[format],
83 'url': url_for_format(slug, format),
85 element = etree.XML(isbn_xml)
88 new_head = chunk.commit(
89 etree.tostring(tree, encoding='unicode'),
91 description='automatyczne dodanie isbn'
93 print('committed %s' % slug)
94 if old_head.publishable:
95 new_head.set_publishable(True)
97 print('Warning: %s not publishable' % slug)