from rest_framework import viewsets from utils.page import MyPageNumberPagination from utils.datasolve import sumOfList, transportation_calculate 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.utils import timezone from .models import AsnListModel, AsnDetailModel from .filter import AsnListFilter, AsnDetailFilter from .serializers import ASNListGetSerializer, ASNListPostSerializer, ASNDetailGetSerializer,ASNDetailPostSerializer from .files import FileListRenderCN, FileDetailRenderCN from warehouse.models import ListModel as warehouse from warehouse.models import ListModel as warehouse from staff.models import ListModel as staff from rest_framework.permissions import AllowAny class AsnListViewSet(viewsets.ModelViewSet): """ retrieve: Response a data list(get) list: Response a data list(all) create: Create a data line(post) delete: Delete a data line(delete) """ authentication_classes = [] # 禁用所有认证类 permission_classes = [AllowAny] # 允许任意访问 pagination_class = MyPageNumberPagination filter_backends = [DjangoFilterBackend, OrderingFilter, ] ordering_fields = ['id', "create_time", "update_time", ] filter_class = AsnListFilter 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 AsnListModel.objects.filter( is_delete=False) else: return AsnListModel.objects.filter( id=id, is_delete=False) else: return AsnListModel.objects.none() def get_serializer_class(self): if self.action in ['list', 'destroy']: return ASNListGetSerializer elif self.action in ['create', 'update']: return ASNListPostSerializer else: return self.http_method_not_allowed(request=self.request) def create(self, request, *args, **kwargs): data = self.request.data if AsnListModel.objects.filter(code=data['code'], is_delete=False).exists(): raise APIException({"detail": "Data exists"}) else: data['openid'] = self.request.auth.openid qs_set = AsnListModel.objects.filter(openid=self.request.auth.openid,asn_type=data['asn_type'], is_delete=False) order_day =str(timezone.now().strftime('%Y%m%d')) if len(qs_set) > 0: asn_last_code = qs_set.order_by('-id').first().asn_code if str(asn_last_code[3:11]) == order_day: order_create_no = f"{int(asn_last_code[11:]) + 1:03d}" data['asn_code'] = data['asn_type'] + order_day + order_create_no else: data['asn_code'] = data['asn_type'] + order_day + '001' else: data['asn_code'] = data['asn_type'] + order_day + '001' serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) serializer.save() AsnDetailModel.objects.create( openid=self.request.auth.openid, asn_code=serializer.data['asn_code'], asn_type=serializer.data['asn_type'], asn_status=serializer.data['asn_status'], goods_code=serializer.data['goods_code'], goods_desc=serializer.data['goods_desc'], goods_qty=serializer.data['goods_qty'], goods_weight=serializer.data['goods_weight'], creater = serializer.data['creater'], ) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=200, headers=headers) def update(self, request, pk): qs = self.get_object() data = self.request.data serializer = self.get_serializer(qs, data=data) serializer.is_valid(raise_exception=True) serializer.save() qs_detail = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=data['asn_code'], is_delete=False) serializer_detail = ASNDetailPostSerializer(qs_detail.first(), data=data) serializer_detail.is_valid(raise_exception=True) serializer_detail.save() headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=200, headers=headers) def destroy(self, request, pk): qs = self.get_object() if qs.openid != self.request.auth.openid: raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"}) else: qs.is_delete = True asn_detail_list = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=qs.asn_code, is_delete=False) asn_detail_list.update(is_delete=True) qs.save() serializer = self.get_serializer(qs, many=False) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=200, headers=headers) class AsnDetailViewSet(viewsets.ModelViewSet): """ retrieve: Response a data list(get) list: Response a data list(all) create: Create a data line(post) update: Update a data(put:update) """ pagination_class = MyPageNumberPagination filter_backends = [DjangoFilterBackend, OrderingFilter, ] ordering_fields = ['id', "create_time", "update_time", ] filter_class = AsnDetailFilter 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 AsnDetailModel.objects.filter( is_delete=False) else: return AsnDetailModel.objects.filter( id=id, is_delete=False) else: return AsnDetailModel.objects.none() def get_serializer_class(self): if self.action in ['list', 'destroy']: return ASNDetailGetSerializer elif self.action in ['update']: return ASNDetailPostSerializer else: return self.http_method_not_allowed(request=self.request) def update(self, request, pk): qs = self.get_object() data = self.request.data serializer = self.get_serializer(qs, data=data) serializer.is_valid(raise_exception=True) serializer.save() qs_detail = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=data['asn_code'], is_delete=False) serializer_detail = ASNDetailPostSerializer(qs_detail.first(), data=data) serializer_detail.is_valid(raise_exception=True) serializer_detail.save() headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=200, headers=headers) def destroy(self, request, pk): qs = self.get_object() if qs.openid != self.request.auth.openid: raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"}) else: qs.is_delete = True asn_detail_list = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=qs.asn_code, is_delete=False) asn_detail_list.update(is_delete=True) qs.save() serializer = self.get_serializer(qs, many=False) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=200, headers=headers)