From 90d42d4ad556041015c2f625de79017d559b066f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Fri, 1 Jul 2022 14:28:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0access=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/am/views.py | 1 + .../0003_alter_algochannel_unique_together.py | 18 ++++++++++ apps/ecm/models.py | 3 ++ apps/ecm/serializers.py | 29 ++++++++++++++-- apps/ecm/urls.py | 3 +- apps/ecm/views.py | 33 ++++++++++++++++--- .../migrations/0002_alter_tdevice_name.py | 18 ++++++++++ apps/third/models.py | 2 +- apps/third/serializers.py | 6 ++++ apps/third/views_d.py | 9 +++-- 10 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 apps/ecm/migrations/0003_alter_algochannel_unique_together.py create mode 100644 apps/third/migrations/0002_alter_tdevice_name.py diff --git a/apps/am/views.py b/apps/am/views.py index 47a37ad6..82f75971 100755 --- a/apps/am/views.py +++ b/apps/am/views.py @@ -48,3 +48,4 @@ class AccessViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, CustomG queryset = Access.objects.all() create_serializer_class = AccessCreateSerializer serializer_class = AccessSerializer + filterset_fields = ['area', 'type', 'obj_cate', 'post', 'dept'] diff --git a/apps/ecm/migrations/0003_alter_algochannel_unique_together.py b/apps/ecm/migrations/0003_alter_algochannel_unique_together.py new file mode 100644 index 00000000..deeba754 --- /dev/null +++ b/apps/ecm/migrations/0003_alter_algochannel_unique_together.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-07-01 06:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('third', '0002_alter_tdevice_name'), + ('ecm', '0002_initial'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='algochannel', + unique_together={('algo', 'vchannel')}, + ), + ] diff --git a/apps/ecm/models.py b/apps/ecm/models.py index c48132d3..33f257c2 100644 --- a/apps/ecm/models.py +++ b/apps/ecm/models.py @@ -38,6 +38,9 @@ class AlgoChannel(BaseModel): vchannel = models.ForeignKey(TDevice, verbose_name='视频通道', on_delete=models.CASCADE) always_on = models.BooleanField("始终开启", default=True) + class Meta: + unique_together = ('algo', 'vchannel') + class NotifySetting(CommonAModel): """ diff --git a/apps/ecm/serializers.py b/apps/ecm/serializers.py index c35eb7a4..fdfa99fb 100644 --- a/apps/ecm/serializers.py +++ b/apps/ecm/serializers.py @@ -1,5 +1,7 @@ from apps.am.serializers import AreaSimpleSerializer -from apps.ecm.models import EventCate, Remind, NotifySetting, Event +from apps.ecm.models import AlgoChannel, EventCate, Remind, NotifySetting, Event +from apps.third.serializers import TDeviceSimpleSerializer +from apps.third.models import TDevice from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from apps.system.serializers import UserSimpleSerializer @@ -61,4 +63,27 @@ class RemindSerializer(CustomModelSerializer): class Meta: model = Remind - fields = '__all__' \ No newline at end of file + fields = '__all__' + + +class AlgoChannelCreateSerializer(CustomModelSerializer): + class Meta: + model = AlgoChannel + fields = ['algo', 'vchannel', 'always_on'] + + +class AlgoChannelCreatesSerializer(CustomModelSerializer): + vchannels = serializers.PrimaryKeyRelatedField(queryset=TDevice.objects.all(), many=True, label="视频通道列表") + + class Meta: + model = AlgoChannel + fields = ['algo', 'vchannels'] + + +class AlgoChannelSerializer(CustomModelSerializer): + algo_ = EventCateSimpleSerializer(source='algo', read_only=True) + vchannel_ = TDeviceSimpleSerializer(source='vchannel', read_only=True) + + class Meta: + model = AlgoChannel + fields = '__all__' diff --git a/apps/ecm/urls.py b/apps/ecm/urls.py index 5b989d5a..acd22c86 100644 --- a/apps/ecm/urls.py +++ b/apps/ecm/urls.py @@ -1,5 +1,5 @@ -from apps.ecm.views import EventCateViewSet, NotifySettingViewSet, EventViewSet, RemindViewSet +from apps.ecm.views import AlgoChannelViewSet, EventCateViewSet, NotifySettingViewSet, EventViewSet, RemindViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -11,6 +11,7 @@ router.register('event_cate', EventCateViewSet, basename='event_cate') router.register('event', EventViewSet, basename='event') router.register('notify_setting', NotifySettingViewSet, basename='notify_setting') router.register('remind', RemindViewSet, basename='remind') +router.register('algo_vchannel', AlgoChannelViewSet, basename='algo_vchannel') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/ecm/views.py b/apps/ecm/views.py index 5ff2e9ad..6f8cbb34 100644 --- a/apps/ecm/views.py +++ b/apps/ecm/views.py @@ -1,9 +1,9 @@ -from apps.ecm.models import Event, EventCate, Remind, NotifySetting -from apps.ecm.serializers import (EventCateCreateUpdateSerializer, EventCateListSerializer, EventCateUpdateSerializer, EventHandleSerializer, +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.utils.viewsets import CustomGenericViewSet, CustomModelViewSet -from rest_framework.mixins import UpdateModelMixin, ListModelMixin, RetrieveModelMixin, CreateModelMixin +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 @@ -13,7 +13,7 @@ from rest_framework.response import Response # Create your views here. class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, CustomGenericViewSet): - perms_map = {'put': 'event_cate:update', 'post': 'event_cate:create'} + perms_map = {'get': '*', 'put': 'event_cate:update', 'post': 'event_cate:create'} queryset = EventCate.objects.all() list_serializer_class = EventCateListSerializer create_serializer_class = EventCateCreateUpdateSerializer @@ -22,6 +22,30 @@ class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, Custo 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 + + @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(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 @@ -70,4 +94,3 @@ class RemindViewSet(ListModelMixin, CustomGenericViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) - diff --git a/apps/third/migrations/0002_alter_tdevice_name.py b/apps/third/migrations/0002_alter_tdevice_name.py new file mode 100644 index 00000000..50b89ea2 --- /dev/null +++ b/apps/third/migrations/0002_alter_tdevice_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-07-01 05:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('third', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='tdevice', + name='name', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='名称'), + ), + ] diff --git a/apps/third/models.py b/apps/third/models.py index ac284caf..8901f0e1 100755 --- a/apps/third/models.py +++ b/apps/third/models.py @@ -32,7 +32,7 @@ class TDevice(BaseModel): ) type = models.PositiveSmallIntegerField('设备类型', choices=DEVICE_CHOICE) code = models.CharField('设备唯一标识', max_length=50, db_index=True) - name = models.CharField('设备名称', max_length=50) + name = models.CharField('名称', max_length=50, null=True, blank=True) location = models.JSONField('位置信息', default=dict, null=False, blank=True) area = models.ForeignKey(Area, on_delete=models.CASCADE, diff --git a/apps/third/serializers.py b/apps/third/serializers.py index a1719f23..e600fe92 100755 --- a/apps/third/serializers.py +++ b/apps/third/serializers.py @@ -15,6 +15,12 @@ class TDeviceSerializer(CustomModelSerializer): fields = '__all__' +class TDeviceSimpleSerializer(CustomModelSerializer): + class Meta: + model = TDevice + fields = ['id', 'name', 'code'] + + class RequestCommonSerializer(serializers.Serializer): method_choice = ( ('post', 'post'), diff --git a/apps/third/views_d.py b/apps/third/views_d.py index c40473b3..28c0dfa7 100644 --- a/apps/third/views_d.py +++ b/apps/third/views_d.py @@ -11,10 +11,15 @@ from apps.am.models import Area from rest_framework.views import APIView -class TDeviceViewSet(CustomGenericViewSet): +class TDeviceViewSet(ListModelMixin, CustomGenericViewSet): """ 三方设备接口 """ + queryset = TDevice.objects.all() + serializer_class = TDeviceSerializer + ordering = ['code', '-create_time'] + filterset_fields = ['type'] + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) def vchannel(self, request): @@ -23,7 +28,7 @@ class TDeviceViewSet(CustomGenericViewSet): 视频通道列表 """ - request.data.update({'channelTypeList': ["1", "2", "3"]}) + request.data.update({'channelTypeList': ["1"]}) _, res = dhClient.request(**dhapis['channel_list'], json=request.data) codes = [] if res.get('pageData', None):