diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-12-18 18:56:31 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-04-16 16:38:33 +0200 |
commit | 56c5f6e31f34e47d9a6c31767840c9d949d63abf (patch) | |
tree | c293968531fba747a39d464ac6b571dc39d99b2e /ishtar_common | |
parent | ef878c317f8aa33b5fdd92417a12e1385454e86e (diff) | |
download | Ishtar-56c5f6e31f34e47d9a6c31767840c9d949d63abf.tar.bz2 Ishtar-56c5f6e31f34e47d9a6c31767840c9d949d63abf.zip |
✨ imports: add search criteria
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/forms.py | 25 | ||||
-rw-r--r-- | ishtar_common/models.py | 2 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 27 | ||||
-rw-r--r-- | ishtar_common/urls.py | 1 | ||||
-rw-r--r-- | ishtar_common/views.py | 27 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 2 |
6 files changed, 71 insertions, 13 deletions
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index c560dc5ec..b81b42bc6 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -1000,7 +1000,28 @@ class HistorySelect(CustomForm, TableSelect): self.custom_form_ordering() -class DocumentItemSelect(HistorySelect): +class ImportSelect(HistorySelect): + imports = forms.IntegerField( + label=_("Imported from"), + widget=widgets.JQueryAutoComplete( + reverse_lazy( + 'autocomplete-import', + ), + associated_model=models.Import), + validators=[models.valid_id(models.Import)]) + CURRENT_FIELDS = [ + "imports", + ] + HistorySelect.CURRENT_FIELDS + _explicit_ordering = True + + def __init__(self, *args, **kwargs): + user = kwargs.get("user", None) + super().__init__(*args, **kwargs) + if not user or (not user.has_perm("view_import") and not user.has_perm("view_own_import")): + self.fields.pop("imports") + + +class DocumentItemSelect(ImportSelect): documents__image__isnull = forms.NullBooleanField(label=_("Has an image?")) documents__associated_file__isnull = forms.NullBooleanField( label=_("Has an attached file?") @@ -1012,7 +1033,7 @@ class DocumentItemSelect(HistorySelect): "documents__image__isnull", "documents__associated_file__isnull", "documents__associated_url__isnull", - ] + HistorySelect.CURRENT_FIELDS + ] + ImportSelect.CURRENT_FIELDS _explicit_ordering = True diff --git a/ishtar_common/models.py b/ishtar_common/models.py index d7a546696..696020c58 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -147,6 +147,7 @@ from ishtar_common.models_common import ( SearchAltName, OwnPerms, Cached, + Imported, Address, post_save_cache, TemplateItem, @@ -188,6 +189,7 @@ __all__ = [ "ImporterDefaultValues", "ImporterColumn", "ImporterDuplicateField", + "Imported", "Regexp", "ImportTarget", "ItemKey", diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 658c7d157..c8686d7b3 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -1094,6 +1094,16 @@ class FullSearch(models.Model): return changed +class SearchAltName(object): + def __init__( + self, search_key, search_query, extra_query=None, distinct_query=False + ): + self.search_key = search_key + self.search_query = search_query + self.extra_query = extra_query or {} + self.distinct_query = distinct_query + + class Imported(models.Model): imports = models.ManyToManyField( Import, blank=True, related_name="imported_%(app_label)s_%(class)s" @@ -1104,6 +1114,13 @@ class Imported(models.Model): Import, blank=True, related_name="import_updated_%(app_label)s_%(class)s" ) + ALT_NAMES = { + "imports": SearchAltName( + pgettext_lazy("key for text search", "imports"), + "imports__name__iexact", + ), + } + class Meta: abstract = True @@ -1303,16 +1320,6 @@ class FixAssociated: setattr(item, subkey, new_value) -class SearchAltName(object): - def __init__( - self, search_key, search_query, extra_query=None, distinct_query=False - ): - self.search_key = search_key - self.search_query = search_query - self.extra_query = extra_query or {} - self.distinct_query = distinct_query - - class HistoryError(Exception): def __init__(self, value): self.value = value diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index c3d614ac6..85d56aeb7 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -464,6 +464,7 @@ urlpatterns += [ views.show_import, name="show-import", ), + url(r"autocomplete-import/$", views.autocomplete_import, name="autocomplete-import"), url( r"show-importgroup(?:/(?P<pk>\d+))?/(?P<type>odt|pdf)?$", views.show_import_group, diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 55a5947c0..3d86583b1 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -886,6 +886,33 @@ def autocomplete_person( return HttpResponse(data, content_type="text/plain") +def autocomplete_import(request): + all_items = request.user.has_perm("ishtar_common.view_import", models.Import) + own_items = False + if not all_items: + own_items = request.user.has_perm( + "ishtar_common.view_own_import", models.Import + ) + if not all_items and not own_items or not request.GET.get("term"): + return HttpResponse("[]", content_type="text/plain") + q = request.GET.get("term") + limit = request.GET.get("limit", 20) + try: + limit = int(limit) + except ValueError: + return HttpResponseBadRequest() + query = Q() + for q in q.split(" "): + query = query & (Q(name__unaccent__icontains=q) | Q(group__name__unaccent__icontains=q)) + if own_items: + if not hasattr(request.user, "ishtaruser"): + return HttpResponse(json.dumps([]), content_type="text/plain") + query &= models.Import.get_query_owns(request.user.ishtaruser) + items = models.Import.objects.filter(query).distinct()[:limit] + data = [{"id": item.pk, "value": item.name} for item in items if item] + return HttpResponse(json.dumps(data), content_type="text/plain") + + def autocomplete_area(request): if not request.GET.get("term"): return HttpResponse("[]", content_type="text/plain") diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index d71775921..846646d6b 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -2237,7 +2237,7 @@ def get_item( items_nb = 0 if count: return items_nb - # print(str(items.values("id").query).encode('utf-8')) + # print(str(items.values("id").query)) if search_vector: # for serialization dct["search_vector"] = search_vector |