Skip to content

Commit ebc2b39

Browse files
committed
add unique number to slug to avoid conflicts
1 parent 6e308d8 commit ebc2b39

1 file changed

Lines changed: 16 additions & 19 deletions

File tree

api/models/Resource.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,22 @@ class Resource(models.Model):
5656
version = models.CharField(max_length=50, default="v1.0")
5757

5858
def save(self, *args: Any, **kwargs: Any) -> None:
59-
self.slug = slugify(self.name)
59+
if not self.slug:
60+
base_slug = slugify(self.name)
61+
slug = base_slug
62+
counter = 1
63+
while Resource.objects.filter(slug=slug).exclude(pk=self.pk).exists():
64+
slug = f"{base_slug}-{counter}"
65+
counter += 1
66+
self.slug = slug
6067
super().save(*args, **kwargs)
6168

6269
def __str__(self) -> str:
6370
return f"{self.name} ({self.type})"
6471

6572

6673
class ResourceFileDetails(models.Model):
67-
resource = models.OneToOneField(
68-
Resource, on_delete=models.CASCADE, null=False, blank=False
69-
)
74+
resource = models.OneToOneField(Resource, on_delete=models.CASCADE, null=False, blank=False)
7075
file = models.FileField(upload_to="resources/", max_length=300)
7176
size = models.FloatField(blank=True, null=True)
7277
created = models.DateTimeField(auto_now_add=True)
@@ -84,9 +89,7 @@ class ResourceDataTable(models.Model):
8489
"""Model to store indexed CSV data for a resource."""
8590

8691
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
87-
resource = models.OneToOneField(
88-
Resource, on_delete=models.CASCADE, null=False, blank=False
89-
)
92+
resource = models.OneToOneField(Resource, on_delete=models.CASCADE, null=False, blank=False)
9093
table_name = models.CharField(max_length=255, unique=True)
9194
created = models.DateTimeField(auto_now_add=True)
9295
modified = models.DateTimeField(auto_now=True)
@@ -109,9 +112,7 @@ def save(self, *args, **kwargs):
109112

110113

111114
class ResourceVersion(models.Model):
112-
resource = models.ForeignKey(
113-
Resource, on_delete=models.CASCADE, related_name="versions"
114-
)
115+
resource = models.ForeignKey(Resource, on_delete=models.CASCADE, related_name="versions")
115116
version_number = models.CharField(max_length=50)
116117
commit_hash = models.CharField(max_length=64, null=True)
117118
created_at = models.DateTimeField(auto_now_add=True)
@@ -167,9 +168,9 @@ def version_resource_with_dvc(sender, instance: ResourceFileDetails, created, **
167168
return
168169

169170
# Get the latest version
170-
last_version: Optional[ResourceVersion] = (
171-
instance.resource.versions.order_by("-created_at").first()
172-
)
171+
last_version: Optional[ResourceVersion] = instance.resource.versions.order_by(
172+
"-created_at"
173+
).first()
173174

174175
# Handle case when there are no versions yet
175176
if last_version is None:
@@ -193,9 +194,7 @@ def version_resource_with_dvc(sender, instance: ResourceFileDetails, created, **
193194
# Use DVC to get the previous version
194195
try:
195196
# Try to checkout the previous version using DVC
196-
rel_path = Path(instance.file.path).relative_to(
197-
settings.DVC_REPO_PATH
198-
)
197+
rel_path = Path(instance.file.path).relative_to(settings.DVC_REPO_PATH)
199198
tag_name = f"{instance.resource.name}-{last_version.version_number}"
200199

201200
# Save current file to temp location
@@ -245,9 +244,7 @@ def version_resource_with_dvc(sender, instance: ResourceFileDetails, created, **
245244

246245
# Update using DVC
247246
dvc_file = dvc.track_resource(instance.file.path, chunked=use_chunked)
248-
message = (
249-
f"Update resource: {instance.resource.name} to version {new_version}"
250-
)
247+
message = f"Update resource: {instance.resource.name} to version {new_version}"
251248
dvc.commit_version(dvc_file, message)
252249
dvc.tag_version(f"{instance.resource.name}-{new_version}")
253250

0 commit comments

Comments
 (0)