Skip to content

Commit 2394980

Browse files
committed
add collaborative document, views and update signals
1 parent fdfc078 commit 2394980

6 files changed

Lines changed: 742 additions & 0 deletions

File tree

DataSpace/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@
277277
"search.documents.dataset_document": "dataset",
278278
"search.documents.usecase_document": "usecase",
279279
"search.documents.aimodel_document": "aimodel",
280+
"search.documents.collaborative_document": "collaborative",
280281
}
281282

282283

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from typing import Any
2+
3+
import structlog
4+
from django.core.cache import cache
5+
from django.db.models.signals import pre_save
6+
from django.dispatch import receiver
7+
8+
from api.models.Collaborative import Collaborative
9+
from api.utils.enums import CollaborativeStatus
10+
from search.documents import CollaborativeDocument
11+
12+
from .dataset_signals import SEARCH_CACHE_VERSION_KEY
13+
14+
logger = structlog.get_logger(__name__)
15+
16+
17+
@receiver(pre_save, sender=Collaborative)
18+
def handle_collaborative_publication(sender: Any, instance: Collaborative, **kwargs: Any) -> None:
19+
"""Sync Elasticsearch index when collaborative publication state changes."""
20+
21+
try:
22+
if not instance.pk:
23+
return
24+
25+
original = Collaborative.objects.get(pk=instance.pk)
26+
27+
status_changing_to_published = (
28+
original.status != CollaborativeStatus.PUBLISHED
29+
and instance.status == CollaborativeStatus.PUBLISHED
30+
)
31+
status_changing_from_published = (
32+
original.status == CollaborativeStatus.PUBLISHED
33+
and instance.status != CollaborativeStatus.PUBLISHED
34+
)
35+
remains_published = (
36+
original.status == CollaborativeStatus.PUBLISHED
37+
and instance.status == CollaborativeStatus.PUBLISHED
38+
)
39+
40+
if status_changing_to_published or status_changing_from_published:
41+
version = cache.get(SEARCH_CACHE_VERSION_KEY, 0)
42+
cache.set(SEARCH_CACHE_VERSION_KEY, version + 1)
43+
logger.info("Invalidated search cache for collaborative", collaborative_id=instance.id)
44+
45+
if status_changing_from_published:
46+
document = CollaborativeDocument.get(id=instance.id, ignore=404)
47+
if document:
48+
document.delete()
49+
logger.info(
50+
"Removed collaborative from Elasticsearch index",
51+
collaborative_id=instance.id,
52+
)
53+
elif status_changing_to_published or remains_published:
54+
document = CollaborativeDocument.get(id=instance.id, ignore=404)
55+
if document:
56+
document.update(instance)
57+
else:
58+
CollaborativeDocument().update(instance)
59+
logger.info(
60+
"Synced collaborative to Elasticsearch index",
61+
collaborative_id=instance.id,
62+
)
63+
64+
except Exception as exc: # pragma: no cover - logging only
65+
logger.error(
66+
"Error in collaborative publication signal handler",
67+
collaborative_id=getattr(instance, "id", None),
68+
error=str(exc),
69+
)
70+
# Avoid raising to prevent save failures

api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
download,
1515
generate_dynamic_chart,
1616
search_aimodel,
17+
search_collaborative,
1718
search_dataset,
1819
search_unified,
1920
search_usecase,
@@ -48,6 +49,11 @@
4849
path("search/dataset/", search_dataset.SearchDataset.as_view(), name="search_dataset"),
4950
path("search/usecase/", search_usecase.SearchUseCase.as_view(), name="search_usecase"),
5051
path("search/aimodel/", search_aimodel.SearchAIModel.as_view(), name="search_aimodel"),
52+
path(
53+
"search/collaborative/",
54+
search_collaborative.SearchCollaborative.as_view(),
55+
name="search_collaborative",
56+
),
5157
path("search/unified/", search_unified.UnifiedSearch.as_view(), name="search_unified"),
5258
path(
5359
"aimodels/<model_id>/",

0 commit comments

Comments
 (0)