From 85936d86c8a425269f0706c0641a74ffb9f6e6b2 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 29 Mar 2023 00:33:50 +0800 Subject: [PATCH] fix: simplify i18n table --- pkg/cloudcommon/db/i18n.go | 162 +++++++---------------------- pkg/compute/models/i18nresource.go | 12 +-- pkg/compute/models/zones.go | 2 +- 3 files changed, 44 insertions(+), 132 deletions(-) diff --git a/pkg/cloudcommon/db/i18n.go b/pkg/cloudcommon/db/i18n.go index 37bc51d46f..f50409d281 100644 --- a/pkg/cloudcommon/db/i18n.go +++ b/pkg/cloudcommon/db/i18n.go @@ -18,7 +18,6 @@ import ( "context" "yunion.io/x/pkg/errors" - "yunion.io/x/pkg/util/compare" "yunion.io/x/onecloud/pkg/i18n" "yunion.io/x/onecloud/pkg/mcclient" @@ -51,28 +50,28 @@ func NewSModelI18nEntry(keyName string, model IModel, i18nEntry IModelI18nBase) return &SModelI18nEntry{model: model, modelKeyName: keyName, i18nEntry: i18nEntry} } -func (self *SModelI18nEntry) GetObjType() string { - return self.model.Keyword() +func (in *SModelI18nEntry) GetObjType() string { + return in.model.Keyword() } -func (self *SModelI18nEntry) GetObjId() string { - return self.model.GetId() +func (in *SModelI18nEntry) GetObjId() string { + return in.model.GetId() } -func (self *SModelI18nEntry) GetKeyName() string { - return self.modelKeyName +func (in *SModelI18nEntry) GetKeyName() string { + return in.modelKeyName } -func (self *SModelI18nEntry) GetKeyValue() string { - return self.i18nEntry.GetKeyValue() +func (in *SModelI18nEntry) GetKeyValue() string { + return in.i18nEntry.GetKeyValue() } -func (self *SModelI18nEntry) Lookup(tag i18n.Tag) string { - return self.i18nEntry.Lookup(tag) +func (in *SModelI18nEntry) Lookup(tag i18n.Tag) string { + return in.i18nEntry.Lookup(tag) } -func (self *SModelI18nEntry) GetGlobalId() string { - return self.model.Keyword() + "::" + self.model.GetId() + "::" + self.modelKeyName +func (in *SModelI18nEntry) GetGlobalId() string { + return in.model.Keyword() + "::" + in.model.GetId() + "::" + in.modelKeyName } type SModelI18nTable struct { @@ -94,42 +93,44 @@ func (t *SModelI18nTable) GetI18nEntries() map[string]IModelI18nEntry { } type SI18nManager struct { - SStandaloneAnonResourceBaseManager + SModelBaseManager + // SStandaloneAnonResourceBaseManager } type SI18n struct { - SStandaloneAnonResourceBase + SModelBase + // SStandaloneAnonResourceBase // 资源类型 // example: network - ObjType string `width:"40" charset:"ascii" index:"true" list:"user" get:"user"` + ObjType string `width:"40" charset:"ascii" list:"user" get:"user" primary:"true"` // 资源ID // example: 87321a70-1ecb-422a-8b0c-c9aa632a46a7 - ObjId string `width:"88" charset:"ascii" index:"true" list:"user" get:"user"` + ObjId string `width:"88" charset:"ascii" list:"user" get:"user" primary:"true"` // 资源KEY // exmaple: name - KeyName string `width:"64" charset:"utf8" primary:"true" list:"user" get:"user"` + KeyName string `width:"64" charset:"utf8" list:"user" get:"user" primary:"true"` // 资源原始值 // example: 技术部 KeyValue string `charset:"utf8" list:"user" get:"user"` // KeyValue 对应中文翻译 - Cn string `charset:"utf8" list:"user" get:"user" update:"admin_required" update:"admin"` + Cn string `charset:"utf8" list:"user" get:"user"` // KeyValue 对应英文翻译 - En string `charset:"utf8" list:"user" get:"user" update:"admin_required" update:"admin"` + En string `charset:"utf8" list:"user" get:"user"` } var I18nManager *SI18nManager func init() { I18nManager = &SI18nManager{ - SStandaloneAnonResourceBaseManager: NewStandaloneAnonResourceBaseManager( + SModelBaseManager: NewModelBaseManager( SI18n{}, - "i18n_tbl", + "i18n2_tbl", "i18n", "i18ns", ), @@ -137,7 +138,7 @@ func init() { I18nManager.SetVirtualObject(I18nManager) } -func (manager *SModelBaseManager) GetModelI18N(ctx context.Context, model IModel) ([]SI18n, error) { +func (manager *SI18nManager) GetModelI18N(ctx context.Context, model IModel) ([]SI18n, error) { ret := []SI18n{} q := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId()) err := FetchModelObjects(manager, q, &ret) @@ -148,7 +149,7 @@ func (manager *SModelBaseManager) GetModelI18N(ctx context.Context, model IModel return ret, err } -func (manager *SModelBaseManager) GetModelKeyI18N(ctx context.Context, model IModel, keyName string) ([]SI18n, error) { +func (manager *SI18nManager) GetModelKeyI18N(ctx context.Context, model IModel, keyName string) ([]SI18n, error) { ret := []SI18n{} q := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId()).Equals("key_name", keyName) err := FetchModelObjects(manager, q, &ret) @@ -169,83 +170,20 @@ func (manager *SI18nManager) getExternalI18nItems(ctx context.Context, table IMo return ret } -func (manager *SI18nManager) RemoveI18ns(ctx context.Context, userCred mcclient.TokenCredential, model IModel) error { - dbItems := []SI18n{} - q := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId()) - err := FetchModelObjects(manager, q, &dbItems) - if err != nil { - return err - } +func (manager *SI18nManager) SyncI18ns(ctx context.Context, userCred mcclient.TokenCredential, model IModel, table IModelI18nTable) error { + //// No need to lock SI18nManager, the resources has been lock in the upper layer - QIU Jian, 20210405 + extItems := manager.getExternalI18nItems(ctx, table) - for i := 0; i < len(dbItems); i += 1 { - err = dbItems[i].removeI18n(ctx, userCred) + for i := range extItems { + _, err := manager.newFromI18n(ctx, userCred, extItems[i]) if err != nil { - return err + return errors.Wrap(err, "newFromI18n") } } return nil } -func (manager *SI18nManager) SyncI18ns(ctx context.Context, userCred mcclient.TokenCredential, model IModel, table IModelI18nTable) ([]SI18n, []IModelI18nEntry, compare.SyncResult) { - //// No need to lock SI18nManager, the resources has been lock in the upper layer - QIU Jian, 20210405 - syncResult := compare.SyncResult{} - - extItems := manager.getExternalI18nItems(ctx, table) - dbItems := make([]SI18n, 0) - q := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId()) - err := FetchModelObjects(manager, q, &dbItems) - if err != nil { - syncResult.Error(err) - return nil, nil, syncResult - } - - removed := make([]SI18n, 0) - commondb := make([]SI18n, 0) - commonext := make([]IModelI18nEntry, 0) - added := make([]IModelI18nEntry, 0) - - err = compare.CompareSets(dbItems, extItems, &removed, &commondb, &commonext, &added) - if err != nil { - syncResult.Error(err) - return nil, nil, syncResult - } - - for i := 0; i < len(removed); i += 1 { - err = removed[i].removeI18n(ctx, userCred) - if err != nil { - syncResult.DeleteError(err) - } else { - syncResult.Delete() - } - } - - locals := make([]SI18n, 0) - remotes := make([]IModelI18nEntry, 0) - for i := 0; i < len(commondb); i += 1 { - err = commondb[i].updateFromI18n(ctx, userCred, commonext[i]) - if err != nil { - syncResult.UpdateError(err) - } else { - locals = append(locals, commondb[i]) - remotes = append(remotes, commonext[i]) - syncResult.Update() - } - } - for i := 0; i < len(added); i += 1 { - new, err := manager.newFromI18n(ctx, userCred, added[i]) - if err != nil { - syncResult.AddError(err) - } else { - locals = append(locals, *new) - remotes = append(remotes, added[i]) - syncResult.Add() - } - } - - return locals, remotes, syncResult -} - func (manager *SI18nManager) newFromI18n(ctx context.Context, userCred mcclient.TokenCredential, entry IModelI18nEntry) (*SI18n, error) { in := SI18n{} in.SetModelManager(manager, &in) @@ -257,7 +195,7 @@ func (manager *SI18nManager) newFromI18n(ctx context.Context, userCred mcclient. in.Cn = entry.Lookup(i18n.I18N_TAG_CHINESE) in.En = entry.Lookup(i18n.I18N_TAG_ENGLISH) - err := manager.TableSpec().Insert(ctx, &in) + err := manager.TableSpec().InsertOrUpdate(ctx, &in) if err != nil { return nil, errors.Wrapf(err, "newFromI18n.Insert") } @@ -265,41 +203,15 @@ func (manager *SI18nManager) newFromI18n(ctx context.Context, userCred mcclient. return &in, nil } -func (self *SI18n) updateFromI18n(ctx context.Context, userCred mcclient.TokenCredential, entry IModelI18nEntry) error { - zh := entry.Lookup(i18n.I18N_TAG_CHINESE) - en := entry.Lookup(i18n.I18N_TAG_ENGLISH) - if self.Cn != zh || self.En != en { - _, err := Update(self, func() error { - self.KeyValue = entry.GetKeyValue() - self.Cn = zh - self.En = en - return nil - }) - if err != nil { - return errors.Wrapf(err, "updateFromI18n.Update") - } - } - - return nil +func (in SI18n) GetExternalId() string { + return in.ObjType + "::" + in.ObjId + "::" + in.KeyName } -func (self *SI18n) removeI18n(ctx context.Context, userCred mcclient.TokenCredential) error { - // lockman.LockObject(ctx, self) - // defer lockman.ReleaseObject(ctx, self) - - err := self.Delete(ctx, userCred) - return err -} - -func (self SI18n) GetExternalId() string { - return self.ObjType + "::" + self.ObjId + "::" + self.KeyName -} - -func (self *SI18n) Lookup(ctx context.Context) string { - entry := i18n.NewTableEntry().CN(self.Cn).EN(self.En) +func (in *SI18n) Lookup(ctx context.Context) string { + entry := i18n.NewTableEntry().CN(in.Cn).EN(in.En) if v, ok := entry.Lookup(ctx); ok { return v } - return self.KeyValue + return in.KeyValue } diff --git a/pkg/compute/models/i18nresource.go b/pkg/compute/models/i18nresource.go index 33bc128f8f..bc517ee893 100644 --- a/pkg/compute/models/i18nresource.go +++ b/pkg/compute/models/i18nresource.go @@ -43,23 +43,23 @@ func (man *SI18nResourceBaseManager) getSModelI18nTable(model db.IModel, table c func (man *SI18nResourceBaseManager) SyncI18ns(ctx context.Context, userCred mcclient.TokenCredential, model db.IModel, table cloudprovider.SModelI18nTable) error { itable := man.getSModelI18nTable(model, table) - _, _, r := db.I18nManager.SyncI18ns(ctx, userCred, model, itable) - if r.IsError() { - log.Errorf("SyncI18ns for %s %s result: %s", model.Keyword(), model.GetId(), r.Result()) - return errors.Wrap(r.AllError(), "SyncI18ns") + err := db.I18nManager.SyncI18ns(ctx, userCred, model, itable) + if err != nil { + log.Errorf("SyncI18ns for %s %s result: %s", model.Keyword(), model.GetId(), err) + return errors.Wrap(err, "SyncI18ns") } - return nil } +/* func (self *SI18nResourceBase) RemoveI18ns(ctx context.Context, userCred mcclient.TokenCredential, model db.IModel) error { err := db.I18nManager.RemoveI18ns(ctx, userCred, model) if err != nil { return errors.Wrap(err, "RemoveI18ns") } - return nil } +*/ func (self *SI18nResourceBase) GetModelI18N(ctx context.Context, model db.IModel) *jsonutils.JSONDict { entries, err := db.I18nManager.GetModelI18N(ctx, model) diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 8e9a649390..56afa5eb54 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -347,7 +347,7 @@ func (self *SZone) syncRemoveCloudZone(ctx context.Context, userCred mcclient.To if err != nil { return errors.Wrapf(err, "ValidateDeleteCondition") } - self.RemoveI18ns(ctx, userCred, self) + // self.RemoveI18ns(ctx, userCred, self) return self.Delete(ctx, userCred) }