factory/apps/hrm/views.py

109 lines
4.1 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, EmployeeNotWorkRemarkSerializer, EmployeeSerializer, FaceClockCreateSerializer, FaceLoginSerializer, 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.viewsets import CustomModelViewSet, CustomGenericViewSet
from rest_framework.exceptions import ParseError
# Create your views here.
class EmployeeViewSet(CustomModelViewSet):
"""
员工信息管理
"""
queryset = Employee.objects.all()
select_related_fields = ['user']
filterset_class = EmployeeFilterSet
serializer_class = EmployeeSerializer
search_fields = ['name', 'number', 'user__username']
ordering = ['-pk']
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
data = request.data
serializer = self.get_serializer(instance, data=data, partial=partial)
serializer.is_valid(raise_exception=True)
photo = data.get('photo', None)
if instance.photo != photo:
f_l, msg = HRMService.get_facedata_from_img(img_path=photo)
if f_l:
serializer.save(update_by=request.user, face_data = f_l)
# 更新人脸缓存
update_all_user_facedata_cache.delay()
return Response()
return Response(msg, status=status.HTTP_400_BAD_REQUEST)
serializer.save(update_by=request.user)
return Response()
@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)
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']