diff --git a/apps/system/serializers.py b/apps/system/serializers.py index a9913c12..618c84dc 100755 --- a/apps/system/serializers.py +++ b/apps/system/serializers.py @@ -9,7 +9,7 @@ from apps.utils.fields import MyFilePathField from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from apps.utils.tools import check_phone_e -from .models import (Dictionary, DictType, File, Dept, Permission, Post, PostRole, +from .models import (Dictionary, DictType, File, Dept, MySchedule, Permission, Post, PostRole, Role, User, UserPost) from rest_framework.exceptions import ParseError, ValidationError from django.db import transaction @@ -385,7 +385,6 @@ class PostRoleCreateSerializer(CustomModelSerializer): class UserInfoSerializer(CustomModelSerializer): - class Meta: model = User fields = ['id', 'username', 'name', 'post', 'avatar', 'belong_dept', 'type'] @@ -394,4 +393,42 @@ class UserInfoSerializer(CustomModelSerializer): class ApkSerializer(serializers.Serializer): version = serializers.CharField(label='版本号') file = serializers.CharField(label='文件地址') - \ No newline at end of file + + +class IntervalScheduleSerializer(serializers.ModelSerializer): + class Meta: + model = IntervalSchedule + fields = '__all__' + + +class CrontabScheduleSerializer(serializers.ModelSerializer): + class Meta: + model = CrontabSchedule + exclude = ['timezone'] + + +class MyScheduleCreateSerializer(CustomModelSerializer): + interval_ = IntervalScheduleSerializer(allow_null=True, required=False) + crontab_ = CrontabScheduleSerializer(allow_null=True, required=False) + + class Meta: + model = MySchedule + fields = ['name', 'type', 'interval_', 'crontab_'] + + def validate(self, attrs): + if attrs['type'] == 10 and attrs.get('interval_', None): + pass + elif attrs['type'] == 20 and attrs.get('crontab_', None): + pass + else: + raise ValidationError('信息有误') + return super().validate(attrs) + + +class MyScheduleSerializer(CustomModelSerializer): + interval_ = IntervalScheduleSerializer(source='interval', read_only=True) + crontab = CrontabScheduleSerializer(source='crontab', read_only=True) + + class Meta: + model = MySchedule + fields = '__all__' diff --git a/apps/system/views.py b/apps/system/views.py index c7ad694b..3f11301c 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -26,7 +26,7 @@ from apps.utils.permission import ALL_PERMS, get_user_perms_map from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from server.celery import app as celery_app from .models import (Dept, Dictionary, DictType, File, Permission, Post, PostRole, Role, User, - UserPost) + UserPost, MySchedule) from .serializers import (ApkSerializer, DeptCreateUpdateSerializer, DeptSerializer, DictCreateUpdateSerializer, DictSerializer, DictTypeCreateUpdateSerializer, DictTypeSerializer, FileSerializer, PasswordChangeSerializer, PermissionCreateUpdateSerializer, @@ -35,7 +35,7 @@ from .serializers import (ApkSerializer, DeptCreateUpdateSerializer, DeptSeriali PTaskSerializer, PTaskCreateUpdateSerializer, PTaskResultSerializer, RoleCreateUpdateSerializer, RoleSerializer, TaskRunSerializer, UserCreateSerializer, UserListSerializer, UserPostCreateSerializer, - UserPostSerializer, UserUpdateSerializer) + UserPostSerializer, UserUpdateSerializer, MyScheduleCreateSerializer, MyScheduleSerializer) from rest_framework.viewsets import GenericViewSet @@ -663,4 +663,30 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe config.write(f) from shutil import copyfile copyfile(settings.BASE_DIR + vdata['file'], settings.BASE_DIR + '/media/zc_ehs.apk') - return Response() \ No newline at end of file + return Response() + + +class MyScheduleViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): + perms_map = {'get': '*', 'post': 'myschedule.create', 'delete': 'myschedule.delete'} + serializer_class = MyScheduleSerializer + create_serializer_class = MyScheduleCreateSerializer + queryset = MySchedule.objects.all() + select_related_fields = ['interval', 'crontab'] + + @transaction.atomic + def perform_create(self, serializer): + vdata = serializer.validated_data + vdata['create_by'] = self.request.user #不可少 + interval_data = vdata.pop('interval_', None) + crontab_data = vdata.pop('crontab_', None) + if vdata['type'] == 10: + interval, _ = IntervalSchedule.objects.get_or_create(**interval_data, defaults=interval_data) + obj = MySchedule(**vdata) + obj.interval = interval + obj.save() + elif vdata['type'] == 20: + crontab_data['timezone'] = 'Asia/Shanghai' + crontab, _ = CrontabSchedule.objects.get_or_create(**crontab_data, defaults=crontab_data) + obj = MySchedule(**vdata) + obj.crontab = crontab + obj.save()