Metadata editing: auto-add record and more suggestions.
[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             'pol',
108             'eng',
109             'fre',
110             'ger',
111             'lit',
112         ],
113     },
114     "publisher": {
115         "autocomplete": {
116             "source": ["Fundacja Nowoczesna Polska"]
117         }
118     },
119
120 }
121
122
123
124 class MetaTagsView(View):
125     def get(self, request):
126         fields = []
127         for f in BookInfo.FIELDS:
128             d = {
129                 'name': f.name,
130                 'required': f.required,
131                 'multiple': f.multiple,
132                 'uri': f.uri,
133                 'value_type': {
134                     'hasLanguage': f.value_type.has_language,
135                     'name': f.value_type.__name__,
136                 }
137             }
138             d['value_type'].update(
139                 VALUE_TYPES.get(
140                     f.value_type,
141                     VALUE_TYPES.get(
142                         f.name,
143                         {}
144                     )
145                 )
146             )
147             fields.append(d)
148
149         return HttpResponse(
150             'let META_FIELDS = ' + json.dumps(fields),
151             content_type='text/javascript')
152