Browse Source

add ABIDModel.update_for_workers to update-in-place + bump retry_at time

Nick Sweeting 1 year ago
parent
commit
c8b830b8dc
1 changed files with 28 additions and 4 deletions
  1. 28 4
      archivebox/abid_utils/models.py

+ 28 - 4
archivebox/abid_utils/models.py

@@ -7,6 +7,7 @@ from typing import Any, Dict, Union, List, Set, cast
 
 from uuid import uuid4
 from functools import partial
+from pathlib import Path
 from charidfield import CharIDField  # type: ignore[import-untyped]
 
 from django.contrib import admin
@@ -73,7 +74,7 @@ class ABIDError(Exception):
 
 class ABIDModel(models.Model):
     """
-    Abstract Base Model for other models to depend on. Provides ArchiveBox ID (ABID) interface.
+    Abstract Base Model for other models to depend on. Provides ArchiveBox ID (ABID) interface and other helper methods.
     """
     abid_prefix: str = DEFAULT_ABID_PREFIX            # e.g. 'tag_'
     abid_ts_src = 'self.created_at'                  # e.g. 'self.created_at'
@@ -86,10 +87,28 @@ class ABIDModel(models.Model):
     # id = models.UUIDField(primary_key=True, default=None, null=False, editable=False, unique=True, verbose_name='ID')
     # abid = ABIDField(prefix=abid_prefix)
 
-    # created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None, null=False)
+    # created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None, null=False, db_index=True)
     # created_at = AutoDateTimeField(default=None, null=False, db_index=True)
     # modified_at = models.DateTimeField(auto_now=True)
-
+    
+    # if ModelWithNotesMixin model:
+    #   notes = models.TextField(blank=True, null=False, default='', help_text='Any extra notes this snapshot should have')
+    
+    # if StateMachineMixin model:
+    #   retry_at = models.DateTimeField(default=None, null=True, db_index=True)
+    #   status = models.CharField(max_length=16, choices=StatusChoices.choices, default=StatusChoices.QUEUED)
+    #
+    #   StatusChoices: ClassVar[Type[DefaultStatusChoices]] = DefaultStatusChoices
+    #   state_machine_attr: ClassVar[str]      = 'sm'
+    #   state_machine_name: ClassVar[str]      = 'core.statemachines.ArchiveResultMachine'
+    #   retry_at_field_name: ClassVar[str]     = 'retry_at'
+    #   state_field_name: ClassVar[str]        = 'status'
+    #   active_state: ClassVar[str]            = StatusChoices.STARTED
+    
+    # if ModelWithHealthStats model:
+    #   num_uses_failed = models.PositiveIntegerField(default=0)
+    #   num_uses_succeeded = models.PositiveIntegerField(default=0)
+    
     _prefetched_objects_cache: Dict[str, Any]
 
     class Meta(TypedModelMeta):
@@ -329,7 +348,12 @@ class ABIDModel(models.Model):
 
     def get_absolute_url(self):
         return self.api_docs_url
-
+    
+    def update_for_workers(self, **update_kwargs) -> bool:
+        """Immediately update the **kwargs on the object in DB, and reset the retry_at to now()"""
+        updated = bool(self._meta.model.objects.filter(pk=self.pk).update(retry_at=timezone.now(), **update_kwargs))
+        self.refresh_from_db()
+        return updated
 
 
 class ModelWithHealthStats(models.Model):