From 4a7e55b77ead6048bc5d307daf56ca8ad4365872 Mon Sep 17 00:00:00 2001 From: gouqi11 <66834753+gouqi11@users.noreply.github.com> Date: Wed, 8 Nov 2023 20:36:32 +0800 Subject: [PATCH] feat(usage): support project count (#18608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 马鸿飞 --- pkg/keystone/models/usages.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pkg/keystone/models/usages.go b/pkg/keystone/models/usages.go index 482da0192d..a81050e51c 100644 --- a/pkg/keystone/models/usages.go +++ b/pkg/keystone/models/usages.go @@ -15,9 +15,12 @@ package models import ( + "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/util/rbacutils" + "yunion.io/x/onecloud/pkg/util/tagutils" ) func Usage(result rbacutils.SPolicyResult) map[string]int { @@ -30,6 +33,24 @@ func Usage(result rbacutils.SPolicyResult) map[string]int { pq := ProjectManager.Query() pq = db.ObjectIdQueryWithPolicyResult(pq, ProjectManager, result) + + // 根据项目标签过滤 + tagFilters := tagutils.STagFilters{} + tagFilters.AddFilters(result.ProjectTags) + orConditions := []sqlchemy.ICondition{} + metadataResSQ := db.Metadata.Query().SubQuery() + for _, filter := range tagFilters.Filters { + for key, val := range filter { + orConditions = append(orConditions, + sqlchemy.AND( + sqlchemy.Equals(metadataResSQ.Field("key"), key), + sqlchemy.In(metadataResSQ.Field("value"), val), + ), + ) + } + } + metadataResSQ = metadataResSQ.Query().Filter(sqlchemy.OR(orConditions...)).SubQuery() + pq = pq.Join(metadataResSQ, sqlchemy.Equals(pq.Field("id"), metadataResSQ.Field("obj_id"))) projCnt, _ := pq.IsFalse("is_domain").CountWithError() results["projects"] = projCnt