Skip to content

Commit c2d4721

Browse files
committed
Indexes API | can index resources by uri filter
1 parent a49615a commit c2d4721

9 files changed

Lines changed: 54 additions & 7 deletions

File tree

core/collections/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ class Meta:
6767
immutable = models.BooleanField(null=True, blank=True, default=None)
6868
locked_date = models.DateTimeField(null=True, blank=True)
6969

70+
@staticmethod
71+
def get_search_document():
72+
from core.collections.documents import CollectionDocument
73+
return CollectionDocument
74+
7075
@classmethod
7176
def get_base_queryset(cls, params):
7277
collection = params.pop('collection', None)

core/common/swagger_parameters.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@
9898
ids_param = openapi.Parameter(
9999
'ids', openapi.IN_FORM, description="Resource Ids", type=openapi.TYPE_STRING
100100
)
101+
uri_param = openapi.Parameter(
102+
'uri', openapi.IN_FORM, description="Relative URI", type=openapi.TYPE_STRING
103+
)
101104
resources_body_param = openapi.Parameter(
102105
'resource', openapi.IN_PATH, type=openapi.TYPE_STRING,
103106
enum=['mappings', 'concepts', 'sources', 'orgs', 'users', 'collections']

core/common/tasks.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,3 +414,14 @@ def delete_concept(concept_id): # pragma: no cover
414414
concept.delete()
415415

416416
return 1
417+
418+
419+
@app.task
420+
def batch_index_resources(resource, filters):
421+
model = get_resource_class_from_resource_name(resource)
422+
if not model:
423+
return
424+
425+
model.batch_index(model.objects.filter(**filters), model.get_search_document())
426+
427+
return 1

core/concepts/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,11 @@ class Meta:
175175
'external_id': {'sortable': False, 'filterable': True, 'facet': False, 'exact': False},
176176
}
177177

178+
@staticmethod
179+
def get_search_document():
180+
from core.concepts.documents import ConceptDocument
181+
return ConceptDocument
182+
178183
@property
179184
def concept(self): # for url kwargs
180185
return self.mnemonic # pragma: no cover

core/indexes/views.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from rest_framework.response import Response
77
from rest_framework.views import APIView
88

9-
from core.common.swagger_parameters import apps_param, ids_param, resources_body_param
10-
from core.common.tasks import rebuild_indexes, populate_indexes
9+
from core.common.swagger_parameters import apps_param, ids_param, resources_body_param, uri_param
10+
from core.common.tasks import rebuild_indexes, populate_indexes, batch_index_resources
1111
from core.common.utils import get_resource_class_from_resource_name
1212

1313

@@ -41,21 +41,24 @@ class ResourceIndexView(APIView):
4141
permission_classes = (IsAdminUser,)
4242
parser_classes = (MultiPartParser,)
4343

44-
@swagger_auto_schema(manual_parameters=[ids_param, resources_body_param])
44+
@swagger_auto_schema(manual_parameters=[ids_param, uri_param, resources_body_param])
4545
def post(self, _, resource):
4646
model = get_resource_class_from_resource_name(resource)
4747

4848
if not model:
4949
return Response(status=status.HTTP_404_NOT_FOUND)
5050

5151
ids = self.request.data.get('ids', None)
52+
uri = self.request.data.get('uri', None)
53+
5254
if ids:
5355
ids = compact([i.strip() for i in compact(ids.split(','))])
54-
55-
if not ids:
56+
filters = {"{}__in".format(model.mnemonic_attr): ids}
57+
elif uri:
58+
filters = dict(uri__icontains=uri)
59+
else:
5660
return Response(status=status.HTTP_400_BAD_REQUEST)
5761

58-
for instance in model.objects.filter(**{"{}__in".format(model.mnemonic_attr): ids}):
59-
instance.save()
62+
batch_index_resources.delay(resource, filters)
6063

6164
return Response(status=status.HTTP_202_ACCEPTED)

core/mappings/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ class Meta:
9797
'external_id': {'sortable': False, 'filterable': True, 'facet': False, 'exact': False},
9898
}
9999

100+
@staticmethod
101+
def get_search_document():
102+
from core.mappings.documents import MappingDocument
103+
return MappingDocument
104+
100105
@property
101106
def mapping(self): # for url kwargs
102107
return self.mnemonic

core/orgs/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ class Meta:
3636
client_configs = GenericRelation(ClientConfig, object_id_field='resource_id', content_type_field='resource_type')
3737
text = models.TextField(null=True, blank=True) # for about description (markup)
3838

39+
@staticmethod
40+
def get_search_document():
41+
from core.orgs.documents import OrganizationDocument
42+
return OrganizationDocument
43+
3944
@property
4045
def org(self):
4146
return self.mnemonic

core/sources/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class Meta:
5757
OBJECT_TYPE = SOURCE_TYPE
5858
OBJECT_VERSION_TYPE = SOURCE_VERSION_TYPE
5959

60+
@staticmethod
61+
def get_search_document():
62+
from core.sources.documents import SourceDocument
63+
return SourceDocument
64+
6065
@classmethod
6166
def head_from_uri(cls, uri):
6267
queryset = cls.objects.none()

core/users/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ class Meta:
4242
'is_admin': {'sortable': False, 'filterable': False, 'exact': False, 'facet': True}
4343
}
4444

45+
@staticmethod
46+
def get_search_document():
47+
from core.users.documents import UserProfileDocument
48+
return UserProfileDocument
49+
4550
@property
4651
def user(self):
4752
return self.username

0 commit comments

Comments
 (0)