Skip to content

Commit 4a95026

Browse files
committed
fix: 修改公共流程报错提示信息 #7824
# Reviewed, transaction id: 51702
1 parent 85bb27a commit 4a95026

File tree

2 files changed

+48
-29
lines changed

2 files changed

+48
-29
lines changed

gcloud/core/apis/drf/serilaziers/common_template.py

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -136,50 +136,68 @@ def _validate_scope_changes(self, scope_value):
136136
return
137137

138138
scope_set = set(scope_value)
139-
140-
invalid_projects = []
141-
invalid_common_templates = []
139+
conflict_projects = set()
140+
conflicts_project_templates = set()
141+
conflicts_common_templates = []
142142
for item in references:
143143
if item.get("template_type") != COMMON:
144144
project_id = str(item["project_id"])
145145
if project_id not in scope_value:
146-
invalid_projects.append(project_id)
146+
conflicts_project_templates.add(item["project_name"])
147147
else:
148148
if not set(item.get("project_scope", [])).issubset(scope_set):
149-
invalid_common_templates.append(str(item["name"]))
150-
151-
if invalid_common_templates:
152-
invalid_common_templates = ",".join(invalid_common_templates)
153-
raise serializers.ValidationError(f"流程在公共流程 {invalid_common_templates} 中被引用,使用范围存在冲突,请检查配置")
154-
155-
if invalid_projects:
156-
invalid_projects = ",".join(invalid_projects)
157-
raise serializers.ValidationError(f"流程在项目 {invalid_projects} 中被引用,请检查使用范围配置")
158-
159-
def _validate_child_scope(self, project_scope):
160-
pipeline_tree = self.instance.pipeline_tree
149+
conflicting_projects = sorted(set(item.get("project_scope")) - scope_set)
150+
project_names = Project.objects.filter(id__in=conflicting_projects).values_list("name", flat=True)
151+
conflicts_common_templates.append(item["name"])
152+
conflict_projects.update(project_names)
153+
154+
if conflicts_common_templates:
155+
err_message = (
156+
f"当前流程与父流程 {', '.join(conflicts_common_templates)} 的可见范围存在冲突,"
157+
f"请遵循父流程的可见范围不能超出子流程的规则,至少包含项目 {', '.join(sorted(conflict_projects))}"
158+
)
159+
raise serializers.ValidationError(err_message)
160+
161+
if conflicts_project_templates:
162+
err_message = f"当前流程在项目 {', '.join(conflicts_project_templates)} 中被引用,请遵循流程可见范围限制"
163+
raise serializers.ValidationError(err_message)
164+
165+
def _validate_child_scope(self, pipeline_tree, project_scope):
161166
project_scope_set = set(project_scope)
167+
conflict_details = set()
168+
subprocess = []
162169
for activity in pipeline_tree.get("activities", {}).values():
163170
if activity.get("type") != "SubProcess" or activity.get("template_source") != "common":
164171
continue
165-
common_template_id = activity.get("template_id")
166-
result = CommonTemplate.objects.get(id=common_template_id)
167-
common_project_scope = result.extra_info.get("project_scope")
168-
if common_project_scope == ["*"]:
172+
common_template = CommonTemplate.objects.get(id=activity["template_id"])
173+
common_scope = set(common_template.extra_info.get("project_scope", []))
174+
if common_scope == ["*"]:
169175
continue
170-
if not project_scope_set.issubset(set(common_project_scope)):
171-
raise serializers.ValidationError(f"保存流程失败,子流程 {result.pipeline_template.name} 的可见范围与当前流程的可见范围存在冲突")
176+
if not project_scope_set.issubset(common_scope):
177+
conflicting_projects = sorted(common_scope - project_scope_set)
178+
project_names = Project.objects.filter(id__in=conflicting_projects).values_list("name", flat=True)
179+
subprocess.append(common_template.pipeline_template.name)
180+
conflict_details.update(project_names)
181+
182+
if subprocess:
183+
error_messages = (
184+
f"当前流程与子流程 {', '.join(subprocess)} 的可见范围存在冲突,"
185+
f"请遵循父流程的可见范围不能超出子流程的规则,至少包含项目 {', '.join(set(conflict_details))}"
186+
)
187+
raise serializers.ValidationError(error_messages)
172188
return pipeline_tree
173189

174-
def validate_project_scope(self, value):
190+
def validate(self, attrs):
191+
project_scope = attrs.get("extra_info").get("project_scope")
175192
request = self.context.get("request")
193+
# 检测其引用的子流程
194+
self._validate_child_scope(json.loads(attrs["pipeline_tree"]), project_scope)
176195

177196
if request.method in ("PUT", "PATCH"):
178197
# 检测其被作为子流程引用的父流程
179-
self._validate_scope_changes(value)
180-
# 检测其引用的子流程
181-
self._validate_child_scope(value)
182-
return value
198+
self._validate_scope_changes(project_scope)
199+
200+
return attrs
183201

184202
class Meta:
185203
model = CommonTemplate
@@ -213,5 +231,5 @@ class Meta:
213231

214232
def validate_project_scope(self, value):
215233
self._validate_scope_changes(value)
216-
self._validate_child_scope(value)
234+
self._validate_child_scope(self.instance.pipeline_tree, value)
217235
return value

gcloud/template_base/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,13 +412,14 @@ def referencer(self):
412412
task_template_cls = apps.get_model("tasktmpl3", "TaskTemplate")
413413
task_template_qs = task_template_cls.objects.filter(
414414
pipeline_template_id__in=pipeline_template_referencer, is_deleted=False
415-
).values("id", "pipeline_template__name", "project__id")
415+
).values("id", "pipeline_template__name", "project__id", "project__name")
416416
result = [
417417
{
418418
"template_type": PROJECT,
419419
"id": template_info["id"],
420420
"name": template_info["pipeline_template__name"],
421421
"project_id": template_info["project__id"],
422+
"project_name": template_info["project__name"],
422423
}
423424
for template_info in task_template_qs
424425
]

0 commit comments

Comments
 (0)