Coverage for src/shopping_bags/services.py: 77%
22 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-08-04 12:59 +0300
« prev ^ index » next coverage.py v7.9.2, created at 2025-08-04 12:59 +0300
1from rest_framework.exceptions import ValidationError, NotFound
3from src.shopping_bags.models import ShoppingBag
4from src.common.services import UserIdentificationService
5from src.shopping_bags.constants import ShoppingBagErrorMessages
6from src.products.models.inventory import Inventory
9class ShoppingBagService:
10 """
11 This class encapsulates all business logic related to shopping bag functionality,
12 including user identification, inventory validation, and quantity management.
14 Key Responsibilities:
15 - Inventory object retrieval and validation
16 - Stock quantity validation
17 - Atomic database operations for inventory updates
18 - Shopping bag item creation and retrieval
19 """
21 @staticmethod
22 def get_user_identifier(request):
23 return UserIdentificationService.get_user_identifier(request)
25 @staticmethod
26 def get_inventory_object(inventory_id):
27 """
28 Retrieve an inventory object by its ID.
29 """
30 try:
31 return Inventory.objects.get(pk=inventory_id)
32 except Inventory.DoesNotExist:
33 raise NotFound(ShoppingBagErrorMessages.PRODUCT_NOT_FOUND)
35 @staticmethod
36 def validate_inventory_quantity(inventory_obj, required_quantity):
37 if required_quantity > inventory_obj.quantity:
38 raise ValidationError(
39 {
40 'quantity': ShoppingBagErrorMessages.INSUFFICIENT_STOCK.format(
41 quantity=inventory_obj.quantity
42 )
43 }
44 )
46 @staticmethod
47 def get_or_create_bag_item(filters, defaults):
48 return ShoppingBag.objects.get_or_create(**filters, defaults=defaults)