diff --git a/apps/pos_device/migrations/0018_alter_deviceactivationcode_expires_at.py b/apps/pos_device/migrations/0018_alter_deviceactivationcode_expires_at.py new file mode 100644 index 0000000..73bd6a7 --- /dev/null +++ b/apps/pos_device/migrations/0018_alter_deviceactivationcode_expires_at.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0 on 2025-08-02 04:25 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pos_device', '0017_alter_deviceactivationcode_expires_at'), + ] + + operations = [ + migrations.AlterField( + model_name='deviceactivationcode', + name='expires_at', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 2, 7, 55, 41, 619525)), + ), + ] diff --git a/apps/product/signals.py b/apps/product/signals.py index cecbc95..d29a138 100644 --- a/apps/product/signals.py +++ b/apps/product/signals.py @@ -51,7 +51,13 @@ def update_quota_remaining(sender, instance, **kwargs): # if _from_signal=True prevent from maximum recursion loop if getattr(instance, '_from_signal', False): return - remaining_distribution_weight(instance) + + # when delete object, prevent from update fields error + if kwargs.get('signal') == post_delete: + if instance.parent_distribution: + remaining_distribution_weight(instance.parent_distribution) + else: + remaining_distribution_weight(instance) def update_product_stats(instance: Product): diff --git a/apps/product/web/api/v1/viewsets/quota_distribution_api.py b/apps/product/web/api/v1/viewsets/quota_distribution_api.py index 15a0197..a4aa8db 100644 --- a/apps/product/web/api/v1/viewsets/quota_distribution_api.py +++ b/apps/product/web/api/v1/viewsets/quota_distribution_api.py @@ -147,16 +147,10 @@ class QuotaDistributionViewSet(viewsets.ModelViewSet, DynamicSearchMixin): except APIException as e: return Response(e, status.HTTP_204_NO_CONTENT) - @action( - methods=['post'], - detail=True, - url_name='delete', - url_path='delete', - name='delete' - ) @transaction.atomic - def delete(self, request, pk=None): + def destroy(self, request, pk=None, *args, **kwargs): """ Full delete of quota distribution object """ + quota_distribution = self.get_object() # check if distribution has inventory entry @@ -168,5 +162,5 @@ class QuotaDistributionViewSet(viewsets.ModelViewSet, DynamicSearchMixin): try: delete(self.queryset, pk) return Response(status=status.HTTP_200_OK) - except APIException as e: + except Exception as e: return Response(e, status=status.HTTP_204_NO_CONTENT)