From f804dfc0a48130eefe7048938c20d7d19a69caaf Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 22 Apr 2025 15:16:08 +0200 Subject: 🐛 fix table export with json fields in search (refs #6292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/models.py | 8 ++++++++ ishtar_common/models_common.py | 12 ++++++++++++ ishtar_common/views.py | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) (limited to 'ishtar_common') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1ac95dd7e..ffe078efd 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2656,6 +2656,9 @@ class Organization(Address, Merge, OwnPerms, BaseGenderedType, ValueGetter, Main "museum_museofile_id__iexact", ), } + + DEFAULT_SEARCH_FORM = ("ishtar_common.forms_common", "OrganizationSelect") + QA_EDIT = QuickAction( url="organization-qa-bulk-update", icon_class="fa fa-pencil", @@ -2937,6 +2940,9 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem): "profiles__profile_type__label__iexact", ), } + + DEFAULT_SEARCH_FORM = ("ishtar_common.forms_common", "PersonSelect") + QA_EDIT = QuickAction( url="person-qa-bulk-update", icon_class="fa fa-pencil", @@ -4498,6 +4504,8 @@ class Document( } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) + DEFAULT_SEARCH_FORM = ("ishtar_common.forms_common", "DocumentSelect") + # search parameters REVERSED_BOOL_FIELDS = ["image__isnull", "associated_file__isnull"] DATED_FIELDS = BaseHistorizedItem.DATED_FIELDS + [ diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 91a3619ce..d932abf66 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -9,6 +9,7 @@ import copy from collections import OrderedDict import datetime import fiona +from importlib import import_module import json import logging import os @@ -895,10 +896,21 @@ class FullSearch(models.Model): PARENT_SEARCH_VECTORS = [] # prevent circular dependency PARENT_ONLY_SEARCH_VECTORS = [] + # tuple (module, class) in text for dynamic import + DEFAULT_SEARCH_FORM = tuple() class Meta: abstract = True + @classmethod + def get_default_search_form(cls): + # DEFAULT_SEARCH_FORM is used to get the form when exporting tables + if not cls.DEFAULT_SEARCH_FORM: + return + form = getattr(import_module(cls.DEFAULT_SEARCH_FORM[0]), + cls.DEFAULT_SEARCH_FORM[1]) + return form + @classmethod def general_types(cls): for k in get_all_field_names(cls): diff --git a/ishtar_common/views.py b/ishtar_common/views.py index a6c3b373d..7e0c01cd8 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1577,7 +1577,8 @@ class GenerateLabelView(GenerateView): def get_items(self, request, model): # rights are managed by get_item - get_list = get_item(model, None, model.SLUG, own_table_cols=["id"])( + get_list = get_item(model, None, model.SLUG, own_table_cols=["id"], + search_form=model.get_default_search_form())( request, no_link=True, no_limit=True ) item_list = json.loads(get_list.content.decode("utf-8"))["rows"] -- cgit v1.2.3