from django.shortcuts import render from django.utils import timezone from rest_framework.response import Response from rest_framework.mixins import UpdateModelMixin, RetrieveModelMixin, CreateModelMixin, ListModelMixin 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 ClockRecordListSerializer, ChannelAuthoritySerializer, EmployeeCreateUpdateSerializer, EmployeeNotWorkRemarkSerializer, EmployeeSerializer, NotWorkRemarkListSerializer from rest_framework.generics import CreateAPIView from rest_framework import status from rest_framework_simplejwt.tokens import RefreshToken from rest_framework import exceptions from apps.system.models import User from apps.system.serializers import UserSimpleSerializer from rest_framework.permissions import AllowAny from rest_framework.decorators import action from apps.utils.serializers import PkSerializer from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from rest_framework.exceptions import ParseError from django.db import transaction from datetime import datetime from rest_framework import serializers from apps.third.clients import dhClient from apps.third.tapis import dhapis from server import settings # 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']