From d458d12f9fea7501269ab65b669e64c5d2b1b253 Mon Sep 17 00:00:00 2001 From: Galen Date: Wed, 21 Aug 2024 16:01:53 -0700 Subject: [PATCH] cleanup imports, details objects in search component class files, re #10804 --- .../app/search/components/advanced_search.py | 28 +++++++------ arches/app/search/components/base.py | 28 +++---------- .../app/search/components/base_search_view.py | 41 ++++++------------- arches/app/search/components/map_filter.py | 2 +- arches/app/search/components/paging_filter.py | 2 +- .../search/components/provisional_filter.py | 2 +- .../components/related_resources_filter.py | 2 +- .../search/components/resource_type_filter.py | 3 +- .../app/search/components/saved_searches.py | 3 +- arches/app/search/components/search_export.py | 4 +- .../app/search/components/search_results.py | 6 +-- arches/app/search/components/sort_results.py | 3 +- .../search/components/standard_search_view.py | 34 ++++++++------- arches/app/search/components/term_filter.py | 2 +- arches/app/search/components/time_filter.py | 15 +++---- 15 files changed, 70 insertions(+), 105 deletions(-) diff --git a/arches/app/search/components/advanced_search.py b/arches/app/search/components/advanced_search.py index fa2f0b1e88e..756e9a25e84 100644 --- a/arches/app/search/components/advanced_search.py +++ b/arches/app/search/components/advanced_search.py @@ -1,8 +1,14 @@ -from arches.app.models import models +from arches.app.models.models import ( + Node, + DDataType, + GraphModel, + CardModel, + CardXNodeXWidget, +) from arches.app.models.system_settings import settings from arches.app.datatypes.datatypes import DataTypeFactory from arches.app.utils.betterJSONSerializer import JSONDeserializer -from arches.app.search.elasticsearch_dsl_builder import Bool, Nested, Terms +from arches.app.search.elasticsearch_dsl_builder import Bool, Nested from arches.app.search.components.base import BaseSearchFilter details = { @@ -11,7 +17,7 @@ "icon": "fa fa-check-circle-o", "modulename": "advanced_search.py", "classname": "AdvancedSearch", - "type": "filter", + "type": "advanced-search-type", "componentpath": "views/components/search/advanced-search", "componentname": "advanced-search", "config": {}, @@ -32,7 +38,7 @@ def append_dsl(self, search_query_object, **kwargs): null_query = Bool() for key, val in advanced_filter.items(): if key != "op": - node = models.Node.objects.get(pk=key) + node = Node.objects.get(pk=key) if self.request.user.has_perm("read_nodegroup", node.nodegroup): datatype = datatype_factory.get_instance(node.datatype) try: @@ -69,27 +75,25 @@ def append_dsl(self, search_query_object, **kwargs): def view_data(self): ret = {} resource_graphs = ( - models.GraphModel.objects.exclude( - pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID - ) + GraphModel.objects.exclude(pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID) .exclude(isresource=False) .exclude(publication=None) ) searchable_datatypes = [ - d.pk for d in models.DDataType.objects.filter(issearchable=True) + d.pk for d in DDataType.objects.filter(issearchable=True) ] - searchable_nodes = models.Node.objects.filter( + searchable_nodes = Node.objects.filter( graph__isresource=True, graph__publication__isnull=False, datatype__in=searchable_datatypes, issearchable=True, ) - resource_cards = models.CardModel.objects.filter( + resource_cards = CardModel.objects.filter( graph__isresource=True, graph__publication__isnull=False ).select_related("nodegroup") - cardwidgets = models.CardXNodeXWidget.objects.filter(node__in=searchable_nodes) - datatypes = models.DDataType.objects.all() + cardwidgets = CardXNodeXWidget.objects.filter(node__in=searchable_nodes) + datatypes = DDataType.objects.all() # only allow cards that the user has permission to read searchable_cards = [] diff --git a/arches/app/search/components/base.py b/arches/app/search/components/base.py index 43fcd8b14f5..b0b6e06cf46 100644 --- a/arches/app/search/components/base.py +++ b/arches/app/search/components/base.py @@ -1,29 +1,11 @@ -from typing import List, Tuple, Any, Dict +from typing import List, Tuple, Any from arches.app.const import ExtensionType -from arches.app.models import models -from arches.app.models.system_settings import settings +from arches.app.models.models import SearchComponent from arches.app.utils.module_importer import get_class_from_modulename details = {} -# details = { -# "searchcomponentid": "", # leave blank for the system to generate a uuid -# "name": "", # the name that shows up in the UI -# "icon": "", # the icon class to use -# "modulename": "base.py", # the name of this file -# "classname": "BaseSearchFilter", # the classname below", -# "type": "filter", # 'filter' if you want the component to show up dynamically -# "componentpath": "views/components/search/...", # path to ko component -# "componentname": "advanced-search", # lowercase unique name -# "config": { -# "linkedSearchFilters": [ # other components on which this one depends -# { -# "componentname": "search-results", -# "searchcomponentid": "00673743-8c1c-4cc0-bd85-c073a52e03ec", -# "sortorder": 3, -# } -# ] -# } -# } +# see docs for more info on developing search components: +# https://arches.readthedocs.io/en/latest/developing/reference/search-components/ class BaseSearchFilter: @@ -69,7 +51,7 @@ def __init__(self, request=None, user=None): self.user = user self.search_filters = { search_filter.componentname: search_filter - for search_filter in models.SearchComponent.objects.all() + for search_filter in SearchComponent.objects.all() } self.search_filters_instances = {} diff --git a/arches/app/search/components/base_search_view.py b/arches/app/search/components/base_search_view.py index 978ab174eab..a72b0af096e 100644 --- a/arches/app/search/components/base_search_view.py +++ b/arches/app/search/components/base_search_view.py @@ -1,5 +1,5 @@ from arches.app.search.components.base import BaseSearchFilter -from arches.app.models import models +from arches.app.models.models import SearchComponent details = {} # details = { @@ -13,44 +13,27 @@ # "componentname": "custom-search-view", # lowercase unique name # "config": { # "default": True, # set for search-view components; only 1 can be the default -# "availableComponents": [ # search components available to the frontend and permitted to be executed on the backend +# "linkedSearchFilters": [ # { -# "componentname":"map-filter","searchcomponentid":"09d97fc6-8c83-4319-9cef-3aaa08c3fbec","sortorder":1 +# "componentname":"map-filter","searchcomponentid":"09d97fc6-8c83-4319-9cef-3aaa08c3fbec","layoutSortorder":1 # }, # { -# "componentname":"advanced-search","searchcomponentid":"f0e56205-acb5-475b-9c98-f5e44f1dbd2c","sortorder":2 +# "componentname":"advanced-search","searchcomponentid":"f0e56205-acb5-475b-9c98-f5e44f1dbd2c","layoutSortorder":2 # }, # { -# "componentname":"related-resources-filter","searchcomponentid":"59f28272-d1f1-4805-af51-227771739aed","sortorder":3 +# "componentname":"related-resources-filter","searchcomponentid":"59f28272-d1f1-4805-af51-227771739aed","layoutSortorder":3 # }, # { -# "componentname":"provisional-filter","searchcomponentid":"073406ed-93e5-4b5b-9418-b61c26b3640f","sortorder":4 +# "componentname":"provisional-filter","searchcomponentid":"073406ed-93e5-4b5b-9418-b61c26b3640f","layoutSortorder":4 # }, # { -# "componentname":"term-filter","searchcomponentid":"1f42f501-ed70-48c5-bae1-6ff7d0d187da","sortorder":10 +# "componentname":"term-filter","searchcomponentid":"1f42f501-ed70-48c5-bae1-6ff7d0d187da","layoutSortorder":10 # }, # { -# "componentname":"paging-filter","searchcomponentid":"7aff5819-651c-4390-9b9a-a61221ba52c6","sortorder":12 +# "required": True, "componentname":"paging-filter","searchcomponentid":"7aff5819-651c-4390-9b9a-a61221ba52c6","layoutSortorder":12, "executionSortorder":2 # }, # { -# "componentname":"search-results","searchcomponentid":"00673743-8c1c-4cc0-bd85-c073a52e03ec","sortorder":13 -# } -# ], -# "linkedSearchFilters": [ # components that must be applied on the backend -# { -# "componentname": "paging-filter", -# "searchcomponentid": "7aff5819-651c-4390-9b9a-a61221ba52c6", -# "sortorder": 1, -# }, -# { -# "componentname": "provisional-filter", -# "searchcomponentid": "073406ed-93e5-4b5b-9418-b61c26b3640f", -# "sortorder": 2, -# }, -# { -# "componentname": "search-results", -# "searchcomponentid": "00673743-8c1c-4cc0-bd85-c073a52e03ec", -# "sortorder": 3, +# "required": True, "componentname":"search-results","searchcomponentid":"00673743-8c1c-4cc0-bd85-c073a52e03ec","layoutSortorder":13, "executionSortorder":1 # } # ] # } @@ -65,7 +48,7 @@ class BaseSearchView(BaseSearchFilter): def __init__(self, request=None, user=None, componentname=None): super().__init__(request=request, user=user, componentname=componentname) - self.searchview_component = models.SearchComponent.objects.get( + self.searchview_component = SearchComponent.objects.get( componentname=componentname ) required_filter_sort_order = { @@ -73,7 +56,7 @@ def __init__(self, request=None, user=None, componentname=None): for item in self.searchview_component.config["linkedSearchFilters"] } self._required_search_filters = list( - models.SearchComponent.objects.filter( + SearchComponent.objects.filter( searchcomponentid__in=[ linked_filter["searchcomponentid"] for linked_filter in self.searchview_component.config[ @@ -94,7 +77,7 @@ def __init__(self, request=None, user=None, componentname=None): for item in self.searchview_component.config["linkedSearchFilters"] } self._available_search_filters = list( - models.SearchComponent.objects.filter( + SearchComponent.objects.filter( searchcomponentid__in=[ available_filter["searchcomponentid"] for available_filter in self.searchview_component.config[ diff --git a/arches/app/search/components/map_filter.py b/arches/app/search/components/map_filter.py index ec947646946..dd48fa23e1f 100644 --- a/arches/app/search/components/map_filter.py +++ b/arches/app/search/components/map_filter.py @@ -15,7 +15,7 @@ "icon": "fa fa-map-marker", "modulename": "map_filter.py", "classname": "MapFilter", - "type": "filter", + "type": "map-filter-type", "componentpath": "views/components/search/map-filter", "componentname": "map-filter", "config": {}, diff --git a/arches/app/search/components/paging_filter.py b/arches/app/search/components/paging_filter.py index bde3b3ddb62..216208be123 100644 --- a/arches/app/search/components/paging_filter.py +++ b/arches/app/search/components/paging_filter.py @@ -8,7 +8,7 @@ "icon": "", "modulename": "paging_filter.py", "classname": "PagingFilter", - "type": "paging", + "type": "paging-filter-type", "componentpath": "views/components/search/paging-filter", "componentname": "paging-filter", "config": {}, diff --git a/arches/app/search/components/provisional_filter.py b/arches/app/search/components/provisional_filter.py index c70c56d0ec6..9f83de6dd54 100644 --- a/arches/app/search/components/provisional_filter.py +++ b/arches/app/search/components/provisional_filter.py @@ -7,7 +7,7 @@ "icon": "", "modulename": "provisional_filter.py", "classname": "ProvisionalFilter", - "type": "", + "type": "provisional-filter-type", "componentpath": "views/components/search/provisional-filter", "componentname": "provisional-filter", "config": {}, diff --git a/arches/app/search/components/related_resources_filter.py b/arches/app/search/components/related_resources_filter.py index ee258ee42cb..8caa96e4371 100644 --- a/arches/app/search/components/related_resources_filter.py +++ b/arches/app/search/components/related_resources_filter.py @@ -4,7 +4,7 @@ "icon": "fa fa-code-fork", "modulename": "", "classname": "", - "type": "filter", + "type": "related-resources-filter-type", "componentpath": "views/components/search/related-resources-filter", "componentname": "related-resources-filter", "config": {}, diff --git a/arches/app/search/components/resource_type_filter.py b/arches/app/search/components/resource_type_filter.py index 148dd901323..f7afa928d2f 100644 --- a/arches/app/search/components/resource_type_filter.py +++ b/arches/app/search/components/resource_type_filter.py @@ -1,4 +1,3 @@ -from arches.app.models.graph import Graph from arches.app.utils.betterJSONSerializer import JSONDeserializer from arches.app.search.elasticsearch_dsl_builder import Bool, Terms from arches.app.search.components.base import BaseSearchFilter @@ -11,7 +10,7 @@ "icon": "", "modulename": "resource_type_filter.py", "classname": "ResourceTypeFilter", - "type": "resource-type-filter", + "type": "resource-type-filter-type", "componentpath": "views/components/search/resource-type-filter", "componentname": "resource-type-filter", "config": {}, diff --git a/arches/app/search/components/saved_searches.py b/arches/app/search/components/saved_searches.py index 10efdfdf78e..9ab61448da7 100644 --- a/arches/app/search/components/saved_searches.py +++ b/arches/app/search/components/saved_searches.py @@ -1,5 +1,4 @@ from arches.app.models.system_settings import settings -from arches.app.utils.betterJSONSerializer import JSONSerializer from arches.app.search.components.base import BaseSearchFilter details = { @@ -8,7 +7,7 @@ "icon": "fa fa-bookmark", "modulename": "saved_searches.py", "classname": "SavedSearches", - "type": "popup", + "type": "saved-searches-type", "componentpath": "views/components/search/saved-searches", "componentname": "saved-searches", "config": {}, diff --git a/arches/app/search/components/search_export.py b/arches/app/search/components/search_export.py index f741063c703..e2c0e702aed 100644 --- a/arches/app/search/components/search_export.py +++ b/arches/app/search/components/search_export.py @@ -1,5 +1,3 @@ -from arches.app.models.system_settings import settings -from arches.app.utils.betterJSONSerializer import JSONSerializer from arches.app.search.components.base import BaseSearchFilter details = { @@ -8,7 +6,7 @@ "icon": "fa fa-download", "modulename": "search_export.py", "classname": "SearchExport", - "type": "popup", + "type": "search-export-type", "componentpath": "views/components/search/search-export", "componentname": "search-export", "config": {}, diff --git a/arches/app/search/components/search_results.py b/arches/app/search/components/search_results.py index 4d0dbbed35f..94d72fecadf 100644 --- a/arches/app/search/components/search_results.py +++ b/arches/app/search/components/search_results.py @@ -1,5 +1,5 @@ import uuid -from arches.app.models import models +from arches.app.models.models import Node from arches.app.models.system_settings import settings from arches.app.search.elasticsearch_dsl_builder import ( Bool, @@ -22,7 +22,7 @@ "icon": "", "modulename": "search_results.py", "classname": "SearchResultsFilter", - "type": "results-list", + "type": "search-results-type", "componentpath": "views/components/search/search-results", "componentname": "search-results", "config": {}, @@ -144,7 +144,7 @@ def post_search_hook(self, search_query_object, response_object, **kwargs): def get_nodegroups_by_datatype_and_perm(request, datatype, permission): nodes = [] - for node in models.Node.objects.filter(datatype=datatype): + for node in Node.objects.filter(datatype=datatype): if request.user.has_perm(permission, node.nodegroup): nodes.append(str(node.nodegroup_id)) return nodes diff --git a/arches/app/search/components/sort_results.py b/arches/app/search/components/sort_results.py index 63c049c7317..4682998560f 100644 --- a/arches/app/search/components/sort_results.py +++ b/arches/app/search/components/sort_results.py @@ -1,5 +1,4 @@ from arches.app.search.components.base import BaseSearchFilter -from arches.app.search.elasticsearch_dsl_builder import Nested from django.utils.translation import get_language details = { @@ -8,7 +7,7 @@ "icon": "", "modulename": "sort_results.py", "classname": "SortResults", - "type": "", + "type": "sort-results-type", "componentpath": "views/components/search/sort-results", "componentname": "sort-results", "config": {}, diff --git a/arches/app/search/components/standard_search_view.py b/arches/app/search/components/standard_search_view.py index a8a2a00faec..24c0bb1439e 100644 --- a/arches/app/search/components/standard_search_view.py +++ b/arches/app/search/components/standard_search_view.py @@ -31,77 +31,81 @@ { "componentname": "paging-filter", "searchcomponentid": "7aff5819-651c-4390-9b9a-a61221ba52c6", - "sortorder": 1, + "layoutSortorder": 1, + "required": True, + "executionSortorder": 2, }, { "componentname": "search-results", "searchcomponentid": "00673743-8c1c-4cc0-bd85-c073a52e03ec", - "sortorder": 2, + "layoutSortorder": 2, }, { "componentname": "map-filter", "searchcomponentid": "09d97fc6-8c83-4319-9cef-3aaa08c3fbec", - "sortorder": 1, + "layoutSortorder": 1, }, { "componentname": "advanced-search", "searchcomponentid": "f0e56205-acb5-475b-9c98-f5e44f1dbd2c", - "sortorder": 2, + "layoutSortorder": 2, }, { "componentname": "related-resources-filter", "searchcomponentid": "59f28272-d1f1-4805-af51-227771739aed", - "sortorder": 3, + "layoutSortorder": 3, }, { "componentname": "provisional-filter", "searchcomponentid": "073406ed-93e5-4b5b-9418-b61c26b3640f", - "sortorder": 4, + "layoutSortorder": 4, }, { "componentname": "resource-type-filter", "searchcomponentid": "f1c46b7d-0132-421b-b1f3-95d67f9b3980", - "sortorder": 5, + "layoutSortorder": 5, }, { "componentname": "saved-searches", "searchcomponentid": "6dc29637-43a1-4fba-adae-8d9956dcd3b9", - "sortorder": 6, + "layoutSortorder": 6, }, { "componentname": "search-export", "searchcomponentid": "9c6a5a9c-a7ec-48d2-8a25-501b55b8eff6", - "sortorder": 7, + "layoutSortorder": 7, }, { "componentname": "search-result-details", "searchcomponentid": "f5986dae-8b01-11ea-b65a-77903936669c", - "sortorder": 8, + "layoutSortorder": 8, }, { "componentname": "sort-results", "searchcomponentid": "6a2fe122-de54-4e44-8e93-b6a0cda7955c", - "sortorder": 9, + "layoutSortorder": 9, }, { "componentname": "term-filter", "searchcomponentid": "1f42f501-ed70-48c5-bae1-6ff7d0d187da", - "sortorder": 10, + "layoutSortorder": 10, }, { "componentname": "time-filter", "searchcomponentid": "7497ed4f-2085-40da-bee5-52076a48bcb1", - "sortorder": 11, + "layoutSortorder": 11, }, { "componentname": "paging-filter", "searchcomponentid": "7aff5819-651c-4390-9b9a-a61221ba52c6", - "sortorder": 12, + "layoutSortorder": 12, }, { "componentname": "search-results", "searchcomponentid": "00673743-8c1c-4cc0-bd85-c073a52e03ec", - "sortorder": 13, + "layoutSortorder": 13, + "required": True, + "executionSortorder": 1, }, ], }, diff --git a/arches/app/search/components/term_filter.py b/arches/app/search/components/term_filter.py index 2e94cdf4da0..043f50a2ef7 100644 --- a/arches/app/search/components/term_filter.py +++ b/arches/app/search/components/term_filter.py @@ -20,7 +20,7 @@ "icon": "", "modulename": "term_filter.py", "classname": "TermFilter", - "type": "text-input", + "type": "term-filter-type", "componentpath": "views/components/search/term-filter", "componentname": "term-filter", "config": {}, diff --git a/arches/app/search/components/time_filter.py b/arches/app/search/components/time_filter.py index 4cf94f2dcc7..a77b9011724 100644 --- a/arches/app/search/components/time_filter.py +++ b/arches/app/search/components/time_filter.py @@ -1,11 +1,8 @@ -from datetime import datetime -from arches.app.models import models -from arches.app.models.system_settings import settings +from arches.app.models.models import CardModel, CardXNodeXWidget, GraphModel, Node from arches.app.utils.date_utils import ExtendedDateFormat from arches.app.utils.betterJSONSerializer import JSONDeserializer from arches.app.search.elasticsearch_dsl_builder import Bool, Nested, Term, Terms, Range from arches.app.search.components.base import BaseSearchFilter -from django.db.models import Q details = { "searchcomponentid": "", @@ -13,7 +10,7 @@ "icon": "fa fa-calendar", "modulename": "time_filter.py", "classname": "TimeFilter", - "type": "popup", + "type": "time-filter-type", "componentpath": "views/components/search/time-filter", "componentname": "time-filter", "config": {}, @@ -157,7 +154,7 @@ def append_dsl(self, search_query_object, **kwargs): def view_data(self): ret = {} date_datatypes = ["date", "edtf"] - date_nodes = models.Node.objects.filter( + date_nodes = Node.objects.filter( datatype__in=date_datatypes, graph__isresource=True, graph__publication__isnull=False, @@ -168,11 +165,11 @@ def view_data(self): if self.request.user.has_perm("read_nodegroup", node.nodegroup) } - date_cardxnodesxwidgets = models.CardXNodeXWidget.objects.filter( + date_cardxnodesxwidgets = CardXNodeXWidget.objects.filter( node_id__in=list(node_graph_dict.keys()) ) card_ids = [cnw.card_id for cnw in date_cardxnodesxwidgets] - cards = models.CardModel.objects.filter(cardid__in=card_ids) + cards = CardModel.objects.filter(cardid__in=card_ids) card_name_dict = {str(card.cardid): card.name for card in cards} node_obj_list = [] for cnw in date_cardxnodesxwidgets: @@ -183,7 +180,7 @@ def view_data(self): node_obj_list.append(node_obj) ret["date_nodes"] = node_obj_list - ret["graph_models"] = models.GraphModel.objects.filter( + ret["graph_models"] = GraphModel.objects.filter( graphid__in=list(node_graph_dict.values()) ) return ret