1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# -*- coding: utf-8 -*-
"""
@File    : variables.py
@Time    : 2023/2/22 10:42
@Author  : geekbing
@LastEditTime : -
@LastEditors : -
@Description : 全局变量视图
"""
from copy import deepcopy
 
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from django.utils.decorators import method_decorator
from django.utils import timezone
from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
 
from lunarlink import models, serializers
from lunarlink.utils import response
from lunarlink.utils.decorator import request_log
 
 
class VariablesView(GenericViewSet):
    serializer_class = serializers.VariablesSerializer
    queryset = models.Variables.objects
 
    @method_decorator(request_log(level="DEBUG"))
    def list(self, request):
        """查询全局变量"""
        project = request.query_params.get("project")
        search = request.query_params.get("search")
 
        queryset = (
            self.get_queryset().filter(project__id=project).order_by("-update_time")
        )
 
        if search:
            queryset = queryset.filter(
                Q(key__contains=search)
                | Q(value__contains=search)
                | Q(description__contains=search)
            )
 
        pagination_queryset = self.paginate_queryset(queryset)
        serializer = self.get_serializer(pagination_queryset, many=True)
 
        return self.get_paginated_response(serializer.data)
 
    @method_decorator(request_log(level="INFO"))
    def add(self, request):
        """添加全局变量
        {
            key: str
            value: str
            project: int
        }
        """
        ser = self.serializer_class(data=request.data)
        if ser.is_valid():
            try:
                project = models.Project.objects.get(id=request.data["project"])
            except ObjectDoesNotExist:
                return Response(response.PROJECT_NOT_EXISTS)
 
            if models.Variables.objects.filter(
                key=request.data["key"], project=project
            ).filter():
                return Response(response.VARIABLES_EXISTS)
 
            request.data["project"] = project
 
            models.Variables.objects.create(
                **request.data,
                creator=request.user,
            )
            return Response(response.VARIABLES_ADD_SUCCESS)
        else:
            res = deepcopy(response.PROJECT_NOT_EXISTS)
            res["msg"] = ser.errors
            return Response(res)
 
    @method_decorator(request_log(level="INFO"))
    def update(self, request, pk):
        """更新全局变量
        pk: int - 项目id
        {
            id: int - 变量id
            key: str
            value: str
            description: str
        }
        """
        try:
            variable_id = request.data["id"]
            variable_key = request.data["key"]
            variable_value = request.data["value"]
            variable_description = request.data["description"]
        except KeyError:
            return Response(response.KEY_MISS)
 
        try:
            variables = models.Variables.objects.get(id=variable_id)
        except ObjectDoesNotExist:
            return Response(response.VARIABLES_NOT_EXISTS)
 
        if (
            models.Variables.objects.exclude(id=variable_id)
            .filter(
                project_id=pk,
                key=variable_key,
            )
            .first()
        ):
            return Response(response.VARIABLES_EXISTS)
 
        variables.key = variable_key
        variables.value = variable_value
        variables.description = variable_description
        variables.updater = request.user.id
        variables.update_time = timezone.now()
        variables.save()
 
        return Response(response.VARIABLES_UPDATE_SUCCESS)
 
    @method_decorator(request_log(level="INFO"))
    def destroy(self, request, pk):
        """
        单个删除
 
        pk: id
        """
        obj = models.Variables.objects.filter(id=pk)
        if not obj:
            return Response(response.VARIABLES_NOT_EXISTS)
 
        obj.update(
            is_deleted=True,
            update_time=timezone.now(),
            updater=request.user.id,
        )
        return Response(response.VARIABLES_DEL_SUCCESS)
 
    @method_decorator(request_log(level="INFO"))
    def bulk_destroy(self, request):
        """批量删除全局变量
 
        [{id:int}]
        :param request:
        :return:
        """
        ids = [content["id"] for content in request.data]
        objs = models.Variables.objects.filter(id__in=ids)
        if not objs:
            return Response(response.VARIABLES_NOT_EXISTS)
        objs.update(
            is_deleted=True,
            update_time=timezone.now(),
            updater=request.user.id,
        )
 
        return Response(response.VARIABLES_DEL_SUCCESS)