factory/apps/hrm/views.py

130 lines
4.9 KiB
Python

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.utils.dahua import dhClient
from apps.third.tapis import dhapis
# 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'])
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
})
json_data = {
"cardNumbers": cards,
"timeQuantumId": 1,
"cardPrivilegeDetails": details
}
dhClient.request(**dhapis['card_door_authority'], json=json_data)
objs.update(third_info__dh_channels = vdata['channels'])
return Response()
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']