Extending catalogue.
[redakcja.git] / src / documents / management / commands / add_parent.py
1 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
3 #
4 import sys
5
6 from datetime import date
7 from lxml import etree
8
9 from django.core.management import BaseCommand
10
11 from documents.models import Book
12 from librarian import RDFNS, DCNS
13
14 TEMPLATE = '''<utwor>
15 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
16 <rdf:Description rdf:about="http://redakcja.wolnelektury.pl/documents/book/%(slug)s/">
17 %(dc)s
18 </rdf:Description>
19 </rdf:RDF>
20
21 </utwor>
22 '''
23
24 DC_TEMPLATE = '<dc:%(tag)s xml:lang="pl" xmlns:dc="http://purl.org/dc/elements/1.1/">%(value)s</dc:%(tag)s>'
25
26 DC_TAGS = (
27     'creator',
28     'title',
29     'relation.hasPart',
30     'contributor.translator',
31     'contributor.editor',
32     'contributor.technical_editor',
33     'contributor.funding',
34     'contributor.thanks',
35     'publisher',
36     'subject.period',
37     'subject.type',
38     'subject.genre',
39     'description',
40     'identifier.url',
41     'source',
42     'source.URL',
43     'rights.license',
44     'rights',
45     'date.pd',
46     'format',
47     'type',
48     'date',
49     'audience',
50     'language',
51 )
52
53 IDENTIFIER_PREFIX = 'http://wolnelektury.pl/katalog/lektura/'
54
55
56 def dc_desc_element(book):
57     xml = book.materialize()
58     tree = etree.fromstring(xml)
59     return tree.find(".//" + RDFNS("Description"))
60
61
62 def distinct_dc_values(tag, desc_elements):
63     values = set()
64     for desc in desc_elements:
65         values.update(elem.text for elem in desc.findall(DCNS(tag)))
66     return values
67
68
69 class Command(BaseCommand):
70     args = 'slug'
71
72     def handle(self, slug, **options):
73         children_slugs = [line.strip() for line in sys.stdin]
74         children = Book.objects.filter(dc_slug__in=children_slugs)
75         desc_elements = [dc_desc_element(child) for child in children]
76         title = u'Utwory wybrane'
77         own_attributes = {
78             'title': title,
79             'relation.hasPart': [IDENTIFIER_PREFIX + child_slug for child_slug in children_slugs],
80             'identifier.url': IDENTIFIER_PREFIX + slug,
81             'date': date.today().isoformat(),
82         }
83         dc_tags = []
84         for tag in DC_TAGS:
85             if tag in own_attributes:
86                 values = own_attributes[tag]
87                 if not isinstance(values, list):
88                     values = [values]
89             else:
90                 values = distinct_dc_values(tag, desc_elements)
91             for value in values:
92                 dc_tags.append(DC_TEMPLATE % {'tag': tag, 'value': value})
93         xml = TEMPLATE % {'slug': slug, 'dc': '\n'.join(dc_tags)}
94         Book.create(
95             text=xml,
96             creator=None,
97             slug=slug,
98             title=title,
99             gallery=slug)