From 77cba1bd0510ea9d75e51b64217cd84b80f0e2a6 Mon Sep 17 00:00:00 2001 From: Uday Sagar Date: Tue, 12 Mar 2024 01:15:35 +0530 Subject: [PATCH] adds bulk import support for assets --- care/facility/api/viewsets/asset.py | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/care/facility/api/viewsets/asset.py b/care/facility/api/viewsets/asset.py index 45299b7c79..98df9b8a86 100644 --- a/care/facility/api/viewsets/asset.py +++ b/care/facility/api/viewsets/asset.py @@ -412,6 +412,44 @@ def operate_assets(self, request, *args, **kwargs): status=status.HTTP_500_INTERNAL_SERVER_ERROR, ) + @extend_schema(tags=["asset"]) + @action(methods=["POST"], detail=False) + def bulk_upsert(self, request, *args, **kwargs): + if "assets" not in request.data: + raise ValidationError({"assets": "No Data was provided"}) + if not isinstance(request.data["assets"], list): + raise ValidationError({"assets": "Invalid Data"}) + if "location" not in request.data: + raise ValidationError({"location": "Location is required"}) + + assets = request.data.get("assets", []) + location = request.data.get("location") + errors = [] + counter = 0 + ser_objects = [] + invalid = False + for asset in assets: + counter += 1 + asset["location"] = location + serialiser_obj = AssetSerializer(data=asset, context={"request": request}) + valid = serialiser_obj.is_valid() + current_error = serialiser_obj.errors + if current_error and (not valid): + errors.append({"index": counter, "error": current_error}) + invalid = True + ser_objects.append(serialiser_obj) + + if invalid: + return Response(errors, status=status.HTTP_400_BAD_REQUEST) + + for ser in ser_objects: + ser.save() + + return Response( + {"message": f"Successfully created {counter} assets"}, + status=status.HTTP_201_CREATED, + ) + class AssetTransactionFilter(filters.FilterSet): qr_code_id = filters.CharFilter(field_name="asset__qr_code_id")