fixes #4475: Split thema into separate fields.
authorRadek Czajka <rczajka@rczajka.pl>
Tue, 11 Jun 2024 20:21:02 +0000 (22:21 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Tue, 11 Jun 2024 20:21:02 +0000 (22:21 +0200)
src/catalogue/views.py
src/redakcja/static/js/wiki/view_properties.js
src/wlxml/views.py

index 2ed4216..097c549 100644 (file)
@@ -1,8 +1,9 @@
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+import json
 from django.apps import apps
 from django.apps import apps
-from django.db.models import Prefetch
+from django.db.models import Prefetch, Q
 from django.http import Http404, JsonResponse
 from django.urls import reverse
 from django.utils.formats import localize_input
 from django.http import Http404, JsonResponse
 from django.urls import reverse
 from django.utils.formats import localize_input
@@ -219,7 +220,29 @@ class ThemaChooser(Chooser):
                 res = res[0]['sub']
             return res
 
                 res = res[0]['sub']
             return res
 
-        for thema in self.queryset.all():
+        def apply_filter(filt):
+            if 'not' in filt:
+                return ~apply_filter(filt['not'])
+            if 'startswith' in filt:
+                q = None
+                for prefix in filt['startswith']:
+                    q2 = Q(code__startswith=prefix)
+                    if q:
+                        q |= q2
+                    else:
+                        q = q2
+                return q
+            assert False
+
+        qs = self.queryset
+        try:
+            filt = json.loads(request.GET.get('filter'))
+        except:
+            pass
+        else:
+            qs = qs.filter(apply_filter(filt))
+
+        for thema in qs:
             populate(thema)
 
         missing = list(getmissing(tree))
             populate(thema)
 
         missing = list(getmissing(tree))
index 51f26d5..7101c5c 100644 (file)
                         rdfdesc.append('\n    ');
                         rdf.append('\n  ');
                     }
                         rdfdesc.append('\n    ');
                         rdf.append('\n  ');
                     }
+                    if (field.filter && field.filter.startswith) {
+                        span.text(field.filter.startswith[0]);
+                    }
                     span.appendTo(rdfdesc);
                     rdfdesc.append('\n    ');
 
                     span.appendTo(rdfdesc);
                     rdfdesc.append('\n    ');
 
 
                 $.ajax({
                     url: field.value_type.chooser.source,
 
                 $.ajax({
                     url: field.value_type.chooser.source,
+                    data: field.filter ? {'filter': JSON.stringify(field.filter)} : '',
                     success: function(data) {
                         add_options(body, data, input.val());
                     }
                     success: function(data) {
                         add_options(body, data, input.val());
                     }
             // lang
         }
 
             // lang
         }
 
+        applyFilter(filter, text) {
+            if (filter.not) {
+                return !this.applyFilter(filter.not, text)
+            } else if (filter.startswith) {
+                for (prefix of filter.startswith) {
+                    if (text.startsWith(prefix))
+                        return true;
+                }
+                return false;
+            }
+        }
+        
         displayMetaProperty($fg) {
             let self = this;
             let ns = $fg.data('ns');
         displayMetaProperty($fg) {
             let self = this;
             let ns = $fg.data('ns');
                 selector += "[x-ns='"+ns+"']";
             }
             $(selector, self.$edited).each(function() {
                 selector += "[x-ns='"+ns+"']";
             }
             $(selector, self.$edited).each(function() {
+                if (field.filter) {
+                    let text = $(this).text();
+                    if (!self.applyFilter(field.filter, text))
+                        return;
+                }
                 self.addMetaInput(
                     $('.c', $fg),
                     field,
                 self.addMetaInput(
                     $('.c', $fg),
                     field,
index 3375b0d..8c03e05 100644 (file)
@@ -166,7 +166,17 @@ class MetaTagsView(View):
                     )
                 )
             )
                     )
                 )
             )
-            fields.append(d)
+            if d['name'] == 'thema':
+                d_loc = d.copy()
+                d_time = d.copy()
+                d['filter'] = {'not': {'startswith': ['1', '3']}}
+                d_loc['filter'] = {'startswith': ['1']}
+                d_loc['name'] += ' (miejsca)'
+                d_time['filter'] = {'startswith': ['3']}
+                d_time['name'] += ' (czas)'
+                fields.extend([d, d_loc, d_time])
+            else:
+                fields.append(d)
 
         return HttpResponse(
             'let META_FIELDS = ' + json.dumps(fields),
 
         return HttpResponse(
             'let META_FIELDS = ' + json.dumps(fields),