New covers.
[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, ThemaCategory
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     ThemaCategory: {
54         'autocomplete': {
55             'source': '/catalogue/terms/thema/',
56         }
57     },
58     Epoch: {
59         'autocomplete': {
60             'source': '/catalogue/terms/epoch/',
61         }
62     },
63     Kind: {
64         'autocomplete': {
65             'source': '/catalogue/terms/kind/',
66         }
67     },
68     Genre: {
69         'autocomplete': {
70             'source': '/catalogue/terms/genre/',
71         }
72     },
73     WLURI: {
74         "autocomplete": {
75             "source": "/catalogue/terms/wluri/",
76         }
77     },
78     "authors": {
79         "autocomplete": {
80             "source": "/catalogue/terms/author/",
81         }
82     },
83     "translators": {
84         "autocomplete": {
85             "source": "/catalogue/terms/author/",
86         }
87     },
88     "editors": {
89         "autocomplete": {
90             "source": "/catalogue/terms/editor/",
91         }
92     },
93     "technical_editors": {
94         "autocomplete": {
95             "source": "/catalogue/terms/editor/",
96         }
97     },
98     "type": {
99         "autocomplete": {
100             "source": ["text"]
101         }
102     },
103     "title": {
104         "autocomplete": {
105             "source": "/catalogue/terms/book_title/",
106         }
107     },
108
109     "language": {
110         'widget': 'select',
111         'options': [
112             '',
113             'pol',
114             'eng',
115             'fre',
116             'ger',
117             'lit',
118         ],
119     },
120     "publisher": {
121         "autocomplete": {
122             "source": ["Fundacja Nowoczesna Polska"]
123         }
124     },
125
126 }
127
128
129
130 class MetaTagsView(View):
131     def get(self, request):
132         fields = []
133         for f in BookInfo.FIELDS:
134             d = {
135                 'name': f.name,
136                 'required': f.required,
137                 'multiple': f.multiple,
138                 'uri': f.uri,
139                 'value_type': {
140                     'hasLanguage': f.value_type.has_language,
141                     'name': f.value_type.__name__,
142                 }
143             }
144             d['value_type'].update(
145                 VALUE_TYPES.get(
146                     f.value_type,
147                     VALUE_TYPES.get(
148                         f.name,
149                         {}
150                     )
151                 )
152             )
153             fields.append(d)
154
155         return HttpResponse(
156             'let META_FIELDS = ' + json.dumps(fields),
157             content_type='text/javascript')
158