Skip to content

Commit

Permalink
delete cached asset object only on update (#1013)
Browse files Browse the repository at this point in the history
  • Loading branch information
sainak authored Sep 9, 2022
1 parent 53aadd9 commit 527f585
Showing 1 changed file with 23 additions and 13 deletions.
36 changes: 23 additions & 13 deletions care/facility/api/serializers/asset.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from re import L
from django.core.cache import cache
from django.db import transaction
from django.shortcuts import get_object_or_404
Expand All @@ -8,7 +7,12 @@

from care.facility.api.serializers import TIMESTAMP_FIELDS
from care.facility.api.serializers.facility import FacilityBareMinimumSerializer
from care.facility.models.asset import Asset, AssetLocation, AssetTransaction, UserDefaultAssetLocation
from care.facility.models.asset import (
Asset,
AssetLocation,
AssetTransaction,
UserDefaultAssetLocation,
)
from care.users.api.serializers.user import UserBaseMinimumSerializer
from care.utils.queryset.facility import get_facility_queryset
from config.serializers import ChoiceField
Expand Down Expand Up @@ -40,18 +44,20 @@ class Meta:
read_only_fields = TIMESTAMP_FIELDS

def validate_qr_code_id(self, value):
value = value or None # treat empty string as null
value = value or None # treat empty string as null
UniqueValidator(
queryset=Asset.objects.filter(qr_code_id__isnull=False),
message="QR code already assigned"
message="QR code already assigned",
)(value, self.fields.get("qr_code_id"))
return value

def validate(self, attrs):

user = self.context["request"].user
if "location" in attrs:
location = get_object_or_404(AssetLocation.objects.filter(external_id=attrs["location"]))
location = get_object_or_404(
AssetLocation.objects.filter(external_id=attrs["location"])
)

facilities = get_facility_queryset(user)
if not facilities.filter(id=location.facility.id).exists():
Expand All @@ -64,23 +70,27 @@ def validate(self, attrs):
def update(self, instance, validated_data):
user = self.context["request"].user
with transaction.atomic():
if "current_location" in validated_data and instance.current_location != validated_data["current_location"]:
if instance.current_location.facility.id != validated_data["current_location"].facility.id:
raise ValidationError({"location": "Interfacility transfer is not allowed here"})
if (
"current_location" in validated_data
and instance.current_location != validated_data["current_location"]
):
if (
instance.current_location.facility.id
!= validated_data["current_location"].facility.id
):
raise ValidationError(
{"location": "Interfacility transfer is not allowed here"}
)
AssetTransaction(
from_location=instance.current_location,
to_location=validated_data["current_location"],
asset=instance,
performed_by=user,
).save()
updated_instance = super().update(instance, validated_data)
cache.delete(f"asset:{instance.external_id}")
return updated_instance

def save(self, **kwargs):
cache_key = "asset:" + str(self.instance.external_id)
cache.delete(cache_key)
return super().save(**kwargs)


class AssetBareMinimumSerializer(ModelSerializer):
id = UUIDField(source="external_id", read_only=True)
Expand Down

0 comments on commit 527f585

Please sign in to comment.