Enhancements for wikidata imports.
[redakcja.git] / src / wlxml / views.py
1 from io import BytesIO
2 import json
3 from django.http import HttpResponse
4 from django.views.generic import TemplateView, ListView, DetailView, View
5 from . import models
6 from librarian.dcparser import BookInfo
7 from librarian.document import WLDocument
8 from librarian.builders import StandaloneHtmlBuilder
9 from librarian.meta.types.wluri import WLURI
10 from librarian.meta.types.text import LegimiCategory, Epoch, Kind, Genre, Audience
11 from depot.legimi import legimi
12
13
14 class XslView(TemplateView):
15     template_name = 'wlxml/wl2html.xsl'
16     content_type = 'application/xslt+xml'
17
18     def get_context_data(self):
19         ctx = super().get_context_data()
20         tags = {}
21         for t in models.Tag.objects.all():
22             tags.setdefault(t.type, []).append(t.name)
23         ctx['tags'] = tags
24         ctx['namespaces'] = {
25             "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
26             "http://purl.org/dc/elements/1.1/": "dc",
27             "http://www.w3.org/XML/1998/namespace": "xml",
28             "": "wl",
29         }
30         return ctx
31
32
33 class EditorCSS(ListView):
34     template_name = 'wlxml/editor.css'
35     content_type = 'text/css'
36     queryset = models.Tag.objects.all()
37         
38
39 class TagsView(ListView):
40     queryset = models.Tag.objects.all()
41
42
43 class TagView(DetailView):
44     queryset = models.Tag.objects.all()
45     slug_field = 'name'
46
47
48 VALUE_TYPES = {
49     LegimiCategory: {
50         'widget': 'select',
51         'options': [''] + list(legimi.CATEGORIES.keys()),
52     },
53     Epoch: {
54         'autocomplete': {
55             'source': '/catalogue/terms/epoch/',
56         }
57     },
58     Kind: {
59         'autocomplete': {
60             'source': '/catalogue/terms/kind/',
61         }
62     },
63     Genre: {
64         'autocomplete': {
65             'source': '/catalogue/terms/genre/',
66         }
67     },
68     WLURI: {
69         "autocomplete": {
70             "source": "/catalogue/terms/wluri/",
71         }
72     },
73     "authors": {
74         "autocomplete": {
75             "source": "/catalogue/terms/author/",
76         }
77     },
78     "translators": {
79         "autocomplete": {
80             "source": "/catalogue/terms/author/",
81         }
82     },
83     "editors": {
84         "autocomplete": {
85             "source": "/catalogue/terms/editor/",
86         }
87     },
88     "technical_editors": {
89         "autocomplete": {
90             "source": "/catalogue/terms/editor/",
91         }
92     },
93     "type": {
94         "autocomplete": {
95             "source": ["text"]
96         }
97     },
98     "title": {
99         "autocomplete": {
100             "source": "/catalogue/terms/book_title/",
101         }
102     },
103
104     "language": {
105         'widget': 'select',
106         'options': [
107             '',
108             'pol',
109             'eng',
110             'fre',
111             'ger',
112             'lit',
113         ],
114     },
115     "publisher": {
116         "autocomplete": {
117             "source": ["Fundacja Nowoczesna Polska"]
118         }
119     },
120
121 }
122
123
124
125 class MetaTagsView(View):
126     def get(self, request):
127         fields = []
128         for f in BookInfo.FIELDS:
129             d = {
130                 'name': f.name,
131                 'required': f.required,
132                 'multiple': f.multiple,
133                 'uri': f.uri,
134                 'value_type': {
135                     'hasLanguage': f.value_type.has_language,
136                     'name': f.value_type.__name__,
137                 }
138             }
139             d['value_type'].update(
140                 VALUE_TYPES.get(
141                     f.value_type,
142                     VALUE_TYPES.get(
143                         f.name,
144                         {}
145                     )
146                 )
147             )
148             fields.append(d)
149
150         return HttpResponse(
151             'let META_FIELDS = ' + json.dumps(fields),
152             content_type='text/javascript')
153