Skip to content

Commit

Permalink
fix: 应用结构修改 #7626
Browse files Browse the repository at this point in the history
  • Loading branch information
guohelu committed Dec 5, 2024
1 parent 747f95a commit 88d4c52
Show file tree
Hide file tree
Showing 19 changed files with 189 additions and 242 deletions.
4 changes: 2 additions & 2 deletions config/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
"gcloud.contrib.develop",
"gcloud.contrib.collection",
"gcloud.contrib.operate_record",
"gcloud.contrib.templatemaker",
"gcloud.contrib.template_maker",
"gcloud.apigw",
"gcloud.common_template",
"gcloud.label",
Expand Down Expand Up @@ -887,6 +887,6 @@ def check_engine_admin_permission(request, *args, **kwargs):


# 共享模板开关
ENABLE_FLOW_MARKET = env.ENABLE_FLOW_MARKET
ENABLE_TEMPLATE_MARKET = env.ENABLE_TEMPLATE_MARKET
# SRE 商店路由
FLOW_MARKET_API_URL = env.FLOW_MARKET_API_URL
2 changes: 1 addition & 1 deletion config/urls_custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
url(r"^plugin_service/", include("plugin_service.urls")),
url(r"^mako_operations/", include("gcloud.mako_template_helper.urls")),
url(r"^engine_admin/", include("pipeline.contrib.engine_admin.urls")),
url(r"^template_maker/", include("gcloud.contrib.templatemaker.urls")),
url(r"^template_maker/", include("gcloud.contrib.template_maker.urls")),
]

schema_view = get_schema_view(
Expand Down
2 changes: 1 addition & 1 deletion env.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,6 @@
BK_AUDIT_DATA_TOKEN = os.getenv("BK_AUDIT_DATA_TOKEN", None)

# 共享模板开关
ENABLE_FLOW_MARKET = False if os.getenv("BKAPP_ENABLE_FLOW_MARKET") is None else True
ENABLE_TEMPLATE_MARKET = False if os.getenv("ENABLE_TEMPLATE_MARKET") is None else True
# SRE 商店路由
FLOW_MARKET_API_URL = os.getenv("FLOW_MARKET_API_URL", "")
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@

from django.contrib import admin

from gcloud.contrib.templatemaker import models
from gcloud.contrib.template_maker import models


@admin.register(models.TemplateSharedRecord)
class AppMakerAdmin(admin.ModelAdmin):
list_display = ["project_id", "template_id", "template_source", "create", "create_time"]
list_filter = ["project_id", "template_source", "create", "create_time"]
search_fields = ["project_id", "create"]
list_display = ["project_id", "template_id", "creator", "create_at", "extra_info"]
list_filter = ["project_id", "template_id", "creator", "create_at"]
search_fields = ["project_id", "creator"]
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@

class TemplatemakerConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "gcloud.contrib.templatemaker"
name = "gcloud.contrib.template_maker"
28 changes: 28 additions & 0 deletions gcloud/contrib/template_maker/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 3.2.15 on 2024-12-05 07:07

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="TemplateSharedRecord",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("project_id", models.IntegerField(default=-1, help_text="项目 ID", verbose_name="项目 ID")),
("template_id", models.IntegerField(db_index=True, help_text="模版 ID", verbose_name="模版 ID")),
("creator", models.CharField(help_text="执行者", max_length=128, verbose_name="执行者")),
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
("extra_info", models.TextField(blank=True, null=True, verbose_name="额外信息")),
],
options={
"verbose_name": "模板共享记录 TemplateSharedRecord",
"verbose_name_plural": "模板共享记录 TemplateSharedRecord",
},
),
]
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,14 @@
from django.db import models
from django.utils.translation import ugettext_lazy as _

from gcloud.constants import TEMPLATE_SOURCE, PROJECT


class TemplateSharedRecord(models.Model):
project_id = models.IntegerField(_("项目 ID"), default=-1, help_text="项目 ID")
template_id = models.IntegerField(_("模版ID"), db_index=True)
template_source = models.CharField(_("流程模板来源"), max_length=32, choices=TEMPLATE_SOURCE, default=PROJECT)
create = models.CharField(_("执行者"), max_length=128, help_text="执行者")
create_time = models.DateTimeField(_("执行时间"), auto_now_add=True, help_text="执行时间")
template_id = models.IntegerField(_("模版 ID"), db_index=True, help_text="模版 ID")
creator = models.CharField(_("执行者"), max_length=128, help_text="执行者")
create_at = models.DateTimeField(_("创建时间"), auto_now_add=True)
extra_info = models.TextField(_("额外信息"), blank=True, null=True)

class Meta:
verbose_name = _("模板共享记录 TemplateSharedRecord")
verbose_name_plural = _("模板共享记录 TemplateSharedRecord")
unique_together = ("project_id", "template_id")
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,23 @@
specific language governing permissions and limitations under the License.
"""

import logging
import ujson as json
from rest_framework import serializers
from gcloud.contrib.template_maker.models import TemplateSharedRecord

from django.utils.translation import ugettext_lazy as _

from gcloud.utils.validate import RequestValidator
class TemplateSharedRecordSerializer(serializers.ModelSerializer):
class Meta:
model = TemplateSharedRecord
fields = "__all__"

logger = logging.getLogger("root")
def validate(self, attrs):
project_id = attrs.get("project_id")
template_id = attrs.get("template_id")

if not project_id or not template_id:
raise serializers.ValidationError("Project ID and Template ID cannot be empty.")

class JsonValidator(RequestValidator):
def validate(self, request, *args, **kwargs):
try:
json.loads(request.body)
except Exception:
message = _("非法请求: 数据错误, 请求不是合法的Json格式 | validate")
logger.error(message)
return False, message
if TemplateSharedRecord.objects.filter(project_id=project_id, template_id=template_id).exists():
raise serializers.ValidationError("The template has been shared")

return True, ""
return attrs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,13 @@

from django.conf.urls import include, url
from rest_framework.routers import DefaultRouter
from gcloud.contrib.templatemaker.apis.drf.viewsets import TemplateMakerViewSet
from gcloud.contrib.templatemaker.apis.django import api
from gcloud.contrib.template_maker.viewsets import TemplateMarketViewSet, SharedTemplateViewSet


drf_api = DefaultRouter()
drf_api.register(r"template", TemplateMakerViewSet)
drf_api.register(r"template", TemplateMarketViewSet)
drf_api.register(r"shared", SharedTemplateViewSet)

urlpatterns = [
url(r"^api/maker/", include(drf_api.urls)),
url(r"^api/process_maker/(?P<template_id>\d+)/", api.maker_template),
url(r"^api/template_detail/(?P<template_id>\d+)/", api.get_template_market_details),
url(r"^api/", include(drf_api.urls)),
]
129 changes: 129 additions & 0 deletions gcloud/contrib/template_maker/viewsets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# -*- coding: utf-8 -*-
"""
Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community
Edition) available.
Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://opensource.org/licenses/MIT
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
"""

import logging
import requests

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import permissions

from gcloud.conf import settings
from gcloud import err_code
from gcloud.contrib.template_maker.serializers import TemplateSharedRecordSerializer
from gcloud.contrib.template_maker.models import TemplateSharedRecord
from gcloud.core.apis.drf.serilaziers.task_template import TaskTemplateSerializer, TaskTemplateListSerializer
from gcloud.taskflow3.models import TaskTemplate
from gcloud.core.apis.drf.viewsets.base import GcloudModelViewSet


class TemplateMarkerPermission(permissions.BasePermission):
def has_permission(self, request, view):
template_id = view.kwargs.get("pk")
project_id = request.GET.get("project_id")

if not template_id or not project_id:
logging.warning("template_id is required.")
return False
try:
TemplateSharedRecord.objects.get(template_id=template_id, project_id=project_id)
except Exception:
logging.warning("template_id {} does not exist.".format(template_id))
return False
return True


class SharedTemplatePermission(permissions.BasePermission):
def has_permission(self, request, view):
if not settings.ENABLE_TEMPLATE_MARKET:
return False
return True


class TemplateMarketViewSet(GcloudModelViewSet):
queryset = TaskTemplate.objects.filter(pipeline_template__isnull=False, is_deleted=False)
permission_classes = [permissions.IsAuthenticated, TemplateMarkerPermission]

def get_serializer_class(self):
if self.action == "list":
return TaskTemplateListSerializer
return TaskTemplateSerializer

def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)

return Response(serializer.data)


class SharedTemplateViewSet(viewsets.ModelViewSet):
queryset = TemplateSharedRecord.objects.all()
serializer_class = TemplateSharedRecordSerializer
permission_classes = [permissions.IsAuthenticated, SharedTemplatePermission]

def _get_market_routing(self, market_url):
return f"{settings.FLOW_MARKET_API_URL}/{market_url}"

def retrieve(self, request, *args, **kwargs):
project_id = kwargs.get("pk")
template_id = request.GET.get("template_id")

url = self._get_market_routing("market/details/")
data = {"project_id": project_id, "template_id": template_id}

# 根据业务id和模板id从第三方接口获取模板详情
result = requests.post(url, data=data)

if not result or result.status_code != 200:
logging.exception("Get market template details from third party fails")
return Response(
{
"result": False,
"message": "Get market template details from third party fails",
"code": err_code.OPERATION_FAIL.code,
}
)

return Response(result.json())

def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)

project_id = serializer.validated_data.get("project_id")
template_id = serializer.validated_data.get("template_id")

try:
TaskTemplate.objects.get(project_id=project_id, id=template_id)
except TaskTemplate.DoesNotExist:
logging.warning(f"Template with project_id {project_id} and template_id {template_id} not found.")
return Response({"result": False, "message": "Template not found", "code": err_code.OPERATION_FAIL.code})

# 执行第三方接口调用
url = self._get_market_routing("prod/api/")
data = {}
headers = None
result = requests.post(url, headers=headers, data=data)
if not result:
logging.exception("Sharing template to SRE store fails")
return Response(
{
"result": False,
"message": "Sharing template to SRE store fails",
"code": err_code.OPERATION_FAIL.code,
},
)

self.perform_create(serializer)

return Response({"result": True, "message": "Share template successfully", "code": err_code.SUCCESS.code})
Empty file.
98 changes: 0 additions & 98 deletions gcloud/contrib/templatemaker/apis/django/api.py

This file was deleted.

Empty file.
Loading

0 comments on commit 88d4c52

Please sign in to comment.