135 lines
5.4 KiB
Python
135 lines
5.4 KiB
Python
|
|
from threading import Thread
|
|
from apps.ecm.models import AlgoChannel, Event, EventCate, Remind, NotifySetting
|
|
from apps.ecm.serializers import (AlgoChannelCreateSerializer, AlgoChannelCreatesSerializer, AlgoChannelSerializer, EventCateCreateUpdateSerializer, EventCateListSerializer, EventCateUpdateSerializer, EventHandleSerializer,
|
|
EventSerializer, RemindSerializer, NotifySettingsSerializer)
|
|
from apps.ecm.service import update_remind_read
|
|
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
|
from rest_framework.mixins import UpdateModelMixin, ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin
|
|
from django.db import transaction
|
|
from rest_framework.decorators import action
|
|
from rest_framework import serializers
|
|
from django.utils import timezone
|
|
from rest_framework.response import Response
|
|
from rest_framework.exceptions import PermissionDenied
|
|
from apps.utils.snowflake import idWorker
|
|
|
|
|
|
# Create your views here.
|
|
class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, CustomGenericViewSet):
|
|
perms_map = {'get': '*', 'put': 'event_cate:update', 'post': 'event_cate:create'}
|
|
queryset = EventCate.objects.all()
|
|
list_serializer_class = EventCateListSerializer
|
|
create_serializer_class = EventCateCreateUpdateSerializer
|
|
update_serializer_class = EventCateCreateUpdateSerializer
|
|
serializer_class = EventCateListSerializer
|
|
filterset_fields = ['self_algo']
|
|
|
|
|
|
class AlgoChannelViewSet(CreateModelMixin, DestroyModelMixin, ListModelMixin, CustomGenericViewSet):
|
|
perms_map = {'get': '*', 'post': 'event_cate:update', 'delete': 'event_cate:create'}
|
|
queryset = AlgoChannel.objects.all()
|
|
create_serializer_class = AlgoChannelCreateSerializer
|
|
serializer_class = AlgoChannelSerializer
|
|
filterset_fields = ['algo']
|
|
|
|
@transaction.atomic
|
|
@action(methods=['post'], detail=False, perms_map={'post': 'event_cate:update'},
|
|
serializer_class=AlgoChannelCreatesSerializer)
|
|
def creates(self, request, pk=None):
|
|
"""批量添加摄像头
|
|
|
|
批量添加摄像头
|
|
"""
|
|
serializer = AlgoChannelCreatesSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
acs = []
|
|
for i in vdata['vchannels']:
|
|
acs.append(AlgoChannel(id=idWorker.get_id(), algo=vdata['algo'], vchannel=i))
|
|
AlgoChannel.objects.bulk_create(objs=acs, ignore_conflicts=False)
|
|
return Response()
|
|
|
|
|
|
class NotifySettingViewSet(CustomModelViewSet):
|
|
queryset = NotifySetting.objects.all()
|
|
serializer_class = NotifySettingsSerializer
|
|
filterset_fields = ['event_cate', 'obj_cate', 'post', 'user']
|
|
|
|
|
|
class EventViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet):
|
|
perms_map = {'get': 'event:view'}
|
|
queryset = Event.objects.all()
|
|
serializer_class = EventSerializer
|
|
select_related_fields = ['area', 'employee', 'handle_user']
|
|
prefetch_related_fields = ['cates']
|
|
filterset_fields = ['cates']
|
|
|
|
@transaction.atomic
|
|
@action(methods=['post'], detail=True, perms_map={'post': 'event:handle'},
|
|
serializer_class=EventHandleSerializer)
|
|
def handle(self, request, pk=None):
|
|
"""处理事件
|
|
|
|
处理事件
|
|
"""
|
|
obj = self.get_object()
|
|
# 判断当前用户有无处理权限
|
|
if (not Remind.objects.filter(event=obj, recipient=request.user, can_handle=True).exists()) and (not request.user.is_superuser):
|
|
raise PermissionDenied('您无权处理该事件')
|
|
data = request.data
|
|
obj.mark = data.get('mark')
|
|
obj.handle_desc = data.get('handle_desc', '')
|
|
obj.handle_user = request.user
|
|
obj.handle_time = timezone.now()
|
|
obj.save()
|
|
return Response()
|
|
|
|
def retrieve(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
Thread(target=update_remind_read, args=(obj, request.user), daemon=True).start()
|
|
return super().retrieve(request, *args, **kwargs)
|
|
|
|
|
|
class RemindViewSet(ListModelMixin, CustomGenericViewSet):
|
|
perms_map = {'get': 'envent:view'}
|
|
queryset = Remind.objects.all()
|
|
serializer_class = RemindSerializer
|
|
select_related_fields = ['recipient', 'event']
|
|
prefetch_related_fields = ['event__cates']
|
|
filterset_fields = ['event', 'event__cates']
|
|
|
|
@action(methods=['get'], detail=False, perms_map={'get': '*'})
|
|
def my(self, request, *args, **kwargs):
|
|
"""推送给我的
|
|
|
|
推送给我的
|
|
"""
|
|
user = self.request.user
|
|
queryset = self.filter_queryset(self.get_queryset().filter(recipient=user))
|
|
|
|
page = self.paginate_queryset(queryset)
|
|
if page is not None:
|
|
serializer = self.get_serializer(page, many=True)
|
|
return self.get_paginated_response(serializer.data)
|
|
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
return Response(serializer.data)
|
|
|
|
|
|
# class MyRemindViewSet(ListModelMixin, CustomGenericViewSet):
|
|
# perms_map = {'get': '*'}
|
|
# serializer_class = RemindSerializer
|
|
# select_related_fields = ['recipient', 'event']
|
|
# prefetch_related_fields = ['event__cates']
|
|
|
|
# def get_queryset(self):
|
|
# return Remind.objects.filter(recipient=self.request.user)
|
|
|
|
# @action(methods=['post'], detail=True, perms_map={'post': '*'})
|
|
# def label_read(self, request, *args, **kwargs):
|
|
# """标记已读
|
|
|
|
# 标记已读
|
|
# """
|