from rest_framework import viewsets from utils.page import MyPageNumberPagination from utils.md5 import Md5 from rest_framework.filters import OrderingFilter from django_filters.rest_framework import DjangoFilterBackend from rest_framework.response import Response from rest_framework.exceptions import APIException from django.http import StreamingHttpResponse from stock.models import StockshelfModel as shelflist from . import serializers from .filter import StockBinFilter,StockshelfFilter from .files import FileListRenderCN, FileListRenderEN, FileBinListRenderCN, FileBinListRenderEN from rest_framework.settings import api_settings from django.db import transaction from rest_framework import status class stockshelfViewSet(viewsets.ModelViewSet): filter_backends = [DjangoFilterBackend, OrderingFilter, ] ordering_fields = ['id', "create_time", "update_time", ] filter_class = StockshelfFilter pagination_class = MyPageNumberPagination """ list: Response a data list(all) post: Create a new data(create) """ def get_project(self): try: id = self.kwargs.get('pk') return id except: return None def get_queryset(self): id = self.get_project() if self.request.user: if id is None: return shelflist.objects.filter() else: return shelflist.objects.filter(id=id) else: return shelflist.objects.none() def get_serializer_class(self): if self.action in ['list', 'create', ]: return serializers.stockShelfSerializer elif self.action in ['retrieve','update',]: return serializers.stockShelfpartialSerializer else: return self.http_method_not_allowed(request=self.request) def create(self, request, *args, **kwargs): data = request.data.copy() warehouse_code = data.get('warehouse_code') warehouse_name = data.get('warehouse_name') shelf_type = data.get('shelf_type') shelf_name = data.get('shelf_name') rows = int(data.get('rows', 0)) cols = int(data.get('cols', 0)) layers = int(data.get('layers', 0)) existing_positions = shelflist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers) # 生成所有可能的坐标 instances = [] for r in range(1, rows+1): for c in range(1, cols+1): for l in range(1, layers+1): if (r, c, l) not in existing_positions : instances.append(shelflist( warehouse_code=warehouse_code, warehouse_name=warehouse_name, shelf_type=shelf_type, shelf_name=shelf_name, row=r, col=c, layer=l, )) try: with transaction.atomic(): shelflist.objects.bulk_create(instances, batch_size=1000) except Exception as e: return Response( {"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR ) return Response({ "created": len(instances), "skipped": (rows*cols*layers) - len(instances) }, status=status.HTTP_201_CREATED) def update(self, request, pk): qs = self.get_object() print(qs.id) # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST) data = self.request.data print(data) serializer = self.get_serializer(qs, data=data) serializer.is_valid(raise_exception=True) serializer.save() headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=200, headers=headers) def retrieve(self, request, pk): qs = self.get_object() serializer = self.get_serializer(qs) return Response(serializer.data) class StockBinViewSet(viewsets.ModelViewSet): filter_backends = [DjangoFilterBackend, OrderingFilter, ] ordering_fields = ['id', "create_time", "update_time", ] filter_class = StockBinFilter pagination_class = MyPageNumberPagination """ list: Response a data list(all) post: Create a new data(create) """ def get_project(self): try: id = self.kwargs.get('pk') return id except: return None def get_queryset(self): id = self.get_project() if self.request.user: if id is None: return shelflist.objects.filter() else: return shelflist.objects.filter(id=id) else: return shelflist.objects.none() def get_serializer_class(self): if self.action in ['list', 'create', ]: return serializers.stocklistSerializer # elif self.action in ['retrieve','update',]: # return serializers.stocklistpartialSerializer else: return self.http_method_not_allowed(request=self.request) # def create(self, request, *args, **kwargs): # data = request.data.copy() # warehouse_code = data.get('warehouse_code') # warehouse_name = data.get('warehouse_name') # shelf_type = data.get('shelf_type') # shelf_name = data.get('shelf_name') # rows = int(data.get('rows', 0)) # cols = int(data.get('cols', 0)) # layers = int(data.get('layers', 0)) # existing_positions = shelflist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers) # # 生成所有可能的坐标 # instances = [] # for r in range(1, rows+1): # for c in range(1, cols+1): # for l in range(1, layers+1): # if (r, c, l) not in existing_positions : # instances.append(shelflist( # warehouse_code=warehouse_code, # warehouse_name=warehouse_name, # shelf_type=shelf_type, # shelf_name=shelf_name, # row=r, # col=c, # layer=l, # )) # try: # with transaction.atomic(): # shelflist.objects.bulk_create(instances, batch_size=1000) # except Exception as e: # return Response( # {"error": str(e)}, # status=status.HTTP_500_INTERNAL_SERVER_ERROR # ) # return Response({ # "created": len(instances), # "skipped": (rows*cols*layers) - len(instances) # }, status=status.HTTP_201_CREATED) # def update(self, request, pk): # qs = self.get_object() # print(qs.id) # # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST) # data = self.request.data # print(data) # serializer = self.get_serializer(qs, data=data) # serializer.is_valid(raise_exception=True) # serializer.save() # headers = self.get_success_headers(serializer.data) # return Response(serializer.data, status=200, headers=headers) # def retrieve(self, request, pk): # qs = self.get_object() # serializer = self.get_serializer(qs) # return Response(serializer.data)