@@ -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
6673class 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
111114class 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