Skip to content

Commit 80e0df7

Browse files
committed
Increment version when dataset is published
1 parent 8f718e7 commit 80e0df7

File tree

3 files changed

+102
-2
lines changed

3 files changed

+102
-2
lines changed

api/apps.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@
22

33

44
class ApiConfig(AppConfig):
5-
default_auto_field = 'django.db.models.BigAutoField'
6-
name = 'api'
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "api"
7+
8+
def ready(self) -> None:
9+
# Import signals to register them
10+
import api.signals

api/signals/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Import signals to register them
2+
from api.signals import dataset_signals

api/signals/dataset_signals.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from typing import Any, Optional
2+
3+
import structlog
4+
from django.conf import settings
5+
from django.db.models.signals import pre_save
6+
from django.dispatch import receiver
7+
8+
from api.managers.dvc_manager import DVCManager
9+
from api.models.Dataset import Dataset
10+
from api.models.Resource import Resource, ResourceVersion, _increment_version
11+
from api.utils.enums import DatasetStatus
12+
13+
logger = structlog.getLogger(__name__)
14+
15+
16+
@receiver(pre_save, sender=Dataset)
17+
def handle_dataset_publication(sender: Any, instance: Dataset, **kwargs: Any) -> None:
18+
"""
19+
Signal handler to increment resource versions when a dataset is published.
20+
21+
This will trigger a minor version increment for all resources in the dataset
22+
when the dataset status changes from DRAFT to PUBLISHED.
23+
"""
24+
try:
25+
# Check if this is an existing dataset (not a new one)
26+
if instance.pk:
27+
# Get the original dataset from the database
28+
original = Dataset.objects.get(pk=instance.pk)
29+
30+
# Check if status is changing to PUBLISHED
31+
if (
32+
original.status != DatasetStatus.PUBLISHED
33+
and instance.status == DatasetStatus.PUBLISHED
34+
):
35+
logger.info(
36+
f"Dataset {instance.title} is being published, incrementing resource versions"
37+
)
38+
39+
# Get all resources for this dataset
40+
resources = instance.resources.all()
41+
42+
# Initialize DVC manager
43+
dvc = DVCManager(settings.DVC_REPO_PATH)
44+
45+
# Increment version for each resource
46+
for resource in resources: # type: Resource
47+
try:
48+
# Get the latest version
49+
last_version: Optional[ResourceVersion] = (
50+
resource.versions.order_by("-created_at").first()
51+
)
52+
53+
if last_version:
54+
# Increment minor version (publication is a significant change)
55+
new_version = _increment_version(
56+
last_version.version_number, increment_type="minor"
57+
)
58+
59+
# Get the resource file path
60+
file_path: str = resource.resourcefiledetails.file.path
61+
62+
# Track with DVC
63+
dvc_file = dvc.track_resource(file_path)
64+
message: str = (
65+
f"Publishing resource: {resource.name} to version {new_version}"
66+
)
67+
dvc.commit_version(dvc_file, message)
68+
dvc.tag_version(f"{resource.name}-{new_version}")
69+
70+
# Create version record
71+
ResourceVersion.objects.create(
72+
resource=resource,
73+
version_number=new_version,
74+
change_description=f"Version created due to dataset publication",
75+
)
76+
77+
# Update resource version field
78+
resource.version = new_version
79+
resource.save(update_fields=["version"])
80+
81+
logger.info(
82+
f"Incremented version for resource {resource.name} to {new_version}"
83+
)
84+
else:
85+
logger.warning(
86+
f"No previous version found for resource {resource.name}"
87+
)
88+
except Exception as e:
89+
logger.error(
90+
f"Failed to increment version for resource {resource.name}: {str(e)}"
91+
)
92+
except Exception as e:
93+
logger.error(f"Error in dataset publication signal handler: {str(e)}")
94+
# Don't raise the exception to avoid blocking the save operation

0 commit comments

Comments
 (0)