Use meta types in editor.
[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.text import LegimiCategory, Epoch, Kind, Genre, Audience
10 from depot.legimi import legimi
11
12
13 class XslView(TemplateView):
14     template_name = 'wlxml/wl2html.xsl'
15     content_type = 'application/xslt+xml'
16
17     def get_context_data(self):
18         ctx = super().get_context_data()
19         tags = {}
20         for t in models.Tag.objects.all():
21             tags.setdefault(t.type, []).append(t.name)
22         ctx['tags'] = tags
23         ctx['namespaces'] = {
24             "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
25             "http://purl.org/dc/elements/1.1/": "dc",
26             "http://www.w3.org/XML/1998/namespace": "xml",
27             "": "wl",
28         }
29         return ctx
30
31
32 class EditorCSS(ListView):
33     template_name = 'wlxml/editor.css'
34     content_type = 'text/css'
35     queryset = models.Tag.objects.all()
36         
37
38 class TagsView(ListView):
39     queryset = models.Tag.objects.all()
40
41
42 class TagView(DetailView):
43     queryset = models.Tag.objects.all()
44     slug_field = 'name'
45
46
47 VALUE_TYPES = {
48     LegimiCategory: {
49         'widget': 'select',
50         'options': list(legimi.CATEGORIES.keys()),
51     },
52     Epoch: {
53         'autocomplete': {
54             'source': '/catalogue/terms/epoch/',
55         }
56     },
57     Kind: {
58         'autocomplete': {
59             'source': '/catalogue/terms/kind/',
60         }
61     },
62     Genre: {
63         'autocomplete': {
64             'source': '/catalogue/terms/genre/',
65         }
66     },
67 }
68
69    
70 class MetaTagsView(View):
71     def get(self, request):
72         fields = []
73         for f in BookInfo.FIELDS:
74             d = {
75                 'name': f.name,
76                 'required': f.required,
77                 'multiple': f.multiple,
78                 'uri': f.uri,
79                 'value_type': {
80                     'hasLanguage': f.value_type.has_language,
81                     'name': f.value_type.__name__,
82                 }
83             }
84             d['value_type'].update(VALUE_TYPES.get(f.value_type, {}))
85             fields.append(d)
86
87         return HttpResponse(
88             'let META_FIELDS = ' + json.dumps(fields),
89             content_type='text/javascript')
90