from apps.am.models import Access, Area from apps.am.serializers import AccessCreateSerializer, AccessSerializer, AreaCreateUpdateSerializer, AreaSerializer from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from django.db import transaction from rest_framework.decorators import action from rest_framework import serializers from apps.third.clients import xxClient from apps.third.tapis import xxapis from rest_framework.response import Response from rest_framework.exceptions import ParseError from rest_framework.mixins import ListModelMixin, CreateModelMixin, DestroyModelMixin # Create your views here. class AreaViewSet(CustomModelViewSet): queryset = Area.objects.all() create_serializer_class = AreaCreateUpdateSerializer update_serializer_class = AreaCreateUpdateSerializer serializer_class = AreaSerializer ordering = ['number'] @transaction.atomic @action(methods=['post'], detail=True, perms_map={'post': 'area:bind_rail'}, serializer_class=serializers.Serializer) def bind_rail(self, request, pk=None): """ 绑定围栏 """ data = request.data obj = self.get_object() third_info = obj.third_info if 'xx_rail' in third_info: data['id'] = third_info['xx_rail']['id'] _, res = xxClient.request(**xxapis['rail_update'], json=data) third_info['xx_rail']['detail'] = data obj.third_info = third_info obj.save() else: _, res = xxClient.request(**xxapis['rail_create'], json=data) rail_info = {'id': res, 'detail': data} third_info['xx_rail'] = rail_info obj.third_info = third_info obj.save() return Response() class AccessViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): perms_map = {'get': '*', 'post': 'access:create', 'delete': 'access:delete'} queryset = Access.objects.all() create_serializer_class = AccessCreateSerializer serializer_class = AccessSerializer filterset_fields = ['area', 'type', 'obj_cate', 'post', 'dept', 'employee'] select_related_fields = ['area', 'post', 'dept', 'employee']