Skip to content

Commit

Permalink
fix: update archive field cache
Browse files Browse the repository at this point in the history
* Set varialbe cached_value property name, for the case were a single model might have
multiple archived fields
* Concentrate all archive getting/setting in the `__get__` and `__set__` functions
  • Loading branch information
giovanni-guidini committed Aug 11, 2023
1 parent 3331efc commit 322dc17
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions database/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ def __set_name__(self, owner, name):
self.public_name = name
self.db_field_name = "_" + name
self.archive_field_name = "_" + name + "_storage_path"
self.cached_value_property_name = f"__{self.public_name}_cached_value"

def _get_value_from_archive(self, obj):
repository = obj.get_repository()
Expand All @@ -84,9 +85,7 @@ def _get_value_from_archive(self, obj):
if archive_field:
try:
file_str = archive_service.read_file(archive_field)
value = self.rehydrate_fn(obj, json.loads(file_str))
setattr(obj, "__archive_field_cached_value", value)
return value
return self.rehydrate_fn(obj, json.loads(file_str))
except FileNotInStorageError:
log.error(
"Archive enabled field not in storage",
Expand All @@ -107,15 +106,16 @@ def _get_value_from_archive(self, obj):
return self.default_value

def __get__(self, obj, objtype=None):
cached_value = getattr(obj, "__archive_field_cached_value", None)
cached_value = getattr(obj, self.cached_value_property_name, None)
if cached_value:
return cached_value
db_field = getattr(obj, self.db_field_name)
if db_field is not None:
value = self.rehydrate_fn(obj, db_field)
setattr(obj, "__archive_field_cached_value", value)
return value
return self._get_value_from_archive(obj)
else:
value = self._get_value_from_archive(obj)
setattr(obj, self.cached_value_property_name, value)
return value

def __set__(self, obj, value):
# Set the new value
Expand All @@ -138,4 +138,4 @@ def __set__(self, obj, value):
setattr(obj, self.db_field_name, None)
else:
setattr(obj, self.db_field_name, value)
setattr(obj, "__archive_field_cached_value", value)
setattr(obj, self.cached_value_property_name, value)

0 comments on commit 322dc17

Please sign in to comment.