from datetime import datetime from django.conf import settings from django.db import transaction from django.shortcuts import render from django.utils import timezone from rest_framework import exceptions, serializers, status from rest_framework.decorators import action from rest_framework.exceptions import ParseError from rest_framework.generics import CreateAPIView from rest_framework.mixins import (CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin) from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework_simplejwt.tokens import RefreshToken from apps.hrm.errors import NO_NEED_LEVEL_REMARK from apps.hrm.filters import (ClockRecordFilterSet, EmployeeFilterSet, NotWorkRemarkFilterSet) from apps.hrm.models import ClockRecord, Employee, NotWorkRemark from apps.hrm.serializers import (ChannelAuthoritySerializer, ClockRecordListSerializer, EmployeeCreateUpdateSerializer, EmployeeNotWorkRemarkSerializer, EmployeeSerializer, NotWorkRemarkListSerializer) from apps.system.models import User from apps.system.serializers import UserSimpleSerializer from apps.third.clients import dhClient from apps.third.tapis import dhapis from apps.utils.serializers import PkSerializer from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet # Create your views here. class EmployeeViewSet(CustomModelViewSet): """ 人员管理 """ queryset = Employee.objects.all() select_related_fields = ['user'] filterset_class = EmployeeFilterSet serializer_class = EmployeeSerializer create_serializer_class = EmployeeCreateUpdateSerializer update_serializer_class = EmployeeCreateUpdateSerializer partial_update_serializer_class = EmployeeCreateUpdateSerializer search_fields = ['name', 'number', 'user__username'] ordering = ['-pk'] @action(methods=['post'], detail=True, perms_map={'post': 'employee:notworkremark'} , serializer_class=EmployeeNotWorkRemarkSerializer) def not_work_remark(self, request, pk=None): """ 填写离岗说明 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) obj = self.get_object() if not obj.is_atwork: remark = request.data.get('not_work_remark', '') obj.not_work_remark = remark obj.save() now = timezone.now() instance, created = NotWorkRemark.objects.get_or_create( not_work_date = now.date(), user = obj.user, defaults={ "not_work_date":now.date(), "user":obj.user, "remark":remark, "create_by":request.user, } ) if not created: instance.remark = remark instance.update_by = request.user instance.save() return Response() raise ParseError(**NO_NEED_LEVEL_REMARK) @transaction.atomic @action(methods=['post'], detail=False, perms_map={'post': 'employee:channel_authority'} , serializer_class=ChannelAuthoritySerializer) def channel_authority(self, request, pk=None): """门通道授权 门通道授权 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) vdata = serializer.validated_data objs = Employee.objects.filter(pk__in=vdata['pks'], third_info__dh_face_card__isnull=False) infos = objs.values('third_info') cards = [] for i in infos: if isinstance(i['third_info'], dict) and 'dh_face_card' in i['third_info']: cards.append(i['third_info']['dh_face_card']) details = [] for i in vdata['channels']: details.append({ "privilegeType": 1, "resouceCode": i }) if cards and details: json_data = { "cardNumbers": cards, "timeQuantumId": 1, "cardPrivilegeDetails": details } dhClient.request(**dhapis['card_door_authority'], json=json_data) for i in objs: i.third_info['dh_channels'] = vdata['channels'] Employee.objects.bulk_update(objs, fields = ['third_info']) return Response() @transaction.atomic @action(methods=['post'], detail=False, perms_map={'post': 'employee:face_bind_1'} , serializer_class=serializers.Serializer) def face_bind_1(self, request, pk=None): """同步人脸库1 全部人脸库 """ # 获取设备 json_data = { "pageNum":1, "pageSize":1000, "ownerCodes":['001'], "showChildNodeData":1, # "isOnline":1 } _, res = dhClient.request(**dhapis['dev_page'], json=json_data) devs = [] if res['pageData']: for i in res['pageData']: devs.append(i['deviceCode']) # 编辑人像库 json_data = { "groupid":settings.DAHUA_FACEGROUPID_1, "groupname":"全体人员", "groupdetail":"全体人员", "grouptype":3, "deviceCodeList":devs, "syncState":0 } dhClient.request(**dhapis['face_group_update'], json=json_data) # 人像绑定 json_data = { "deptId":1, "groupIdList":[settings.DAHUA_FACEGROUPID_1], "cascade":True } dhClient.request(**dhapis['face_bind'], json=json_data) return Response() @action(methods=['get'], detail=False, perms_map={'get': 'employee:face_bind_1'} , serializer_class=serializers.Serializer) def face_status_1(self, request, pk=None): """人像下发状态 人像下发状态 """ params = {'id':settings.DAHUA_FACEGROUPID_1} _, res = dhClient.request(**dhapis['face_group_info'], params=params) return Response(res) class ClockRecordViewSet(ListModelMixin, CustomGenericViewSet): """ 打卡记录 """ perms_map = {'get':'*', 'post':'*'} authentication_classes = [] permission_classes = [AllowAny] queryset = ClockRecord.objects.all() select_related_fields = ['create_by'] serializer_class = ClockRecordListSerializer filterset_class = ClockRecordFilterSet ordering = ['-pk'] class NotWorkRemarkViewSet(ListModelMixin, CustomGenericViewSet): """ 离岗说明 """ perms_map = {'get':'*'} queryset = NotWorkRemark.objects.all() select_related_fields = ['user'] serializer_class = NotWorkRemarkListSerializer filterset_class = NotWorkRemarkFilterSet ordering = ['-pk']