virtualjointbase.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package db
  15. import (
  16. "context"
  17. "reflect"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/pkg/util/rbacscope"
  21. "yunion.io/x/pkg/util/reflectutils"
  22. "yunion.io/x/sqlchemy"
  23. "yunion.io/x/onecloud/pkg/apis"
  24. "yunion.io/x/onecloud/pkg/mcclient"
  25. "yunion.io/x/onecloud/pkg/util/stringutils2"
  26. )
  27. type SVirtualJointResourceBase struct {
  28. SJointResourceBase
  29. }
  30. type SVirtualJointResourceBaseManager struct {
  31. SJointResourceBaseManager
  32. }
  33. func NewVirtualJointResourceBaseManager(dt interface{}, tableName string, keyword string, keywordPlural string, master IVirtualModelManager, slave IVirtualModelManager) SVirtualJointResourceBaseManager {
  34. return SVirtualJointResourceBaseManager{SJointResourceBaseManager: NewJointResourceBaseManager(dt, tableName, keyword, keywordPlural, master, slave)}
  35. }
  36. func (manager *SVirtualJointResourceBaseManager) AllowAttach(ctx context.Context, userCred mcclient.TokenCredential, master IStandaloneModel, slave IStandaloneModel) bool {
  37. masterVirtual := master.(IVirtualModel)
  38. slaveVirtual := slave.(IVirtualModel)
  39. if masterVirtual.GetOwnerId() == slaveVirtual.GetOwnerId() {
  40. return true
  41. } else {
  42. slaveValue := reflect.Indirect(reflect.ValueOf(slaveVirtual))
  43. val, find := reflectutils.FindStructFieldInterface(slaveValue, "IsPublic")
  44. if find {
  45. valBool, ok := val.(bool)
  46. if ok && valBool {
  47. return true
  48. }
  49. }
  50. }
  51. return false
  52. }
  53. func (manager *SVirtualJointResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  54. if owner != nil {
  55. masterQ := manager.GetMasterManager().Query("id")
  56. masterQ = manager.GetMasterManager().FilterByOwner(ctx, masterQ, manager.GetMasterManager(), userCred, owner, scope)
  57. slaveQ := manager.GetSlaveManager().Query("id")
  58. slaveQ = manager.GetSlaveManager().FilterByOwner(ctx, slaveQ, manager.GetSlaveManager(), userCred, owner, scope)
  59. iManager := manager.GetIJointModelManager()
  60. q = q.In(iManager.GetMasterFieldName(), masterQ.SubQuery())
  61. q = q.In(iManager.GetSlaveFieldName(), slaveQ.SubQuery())
  62. }
  63. return q
  64. }
  65. func (manager *SVirtualJointResourceBaseManager) FilterBySystemAttributes(q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  66. q = manager.SJointResourceBaseManager.FilterBySystemAttributes(q, userCred, query, scope)
  67. masterQ := manager.GetMasterManager().Query("id")
  68. masterQ = manager.GetMasterManager().FilterBySystemAttributes(masterQ, userCred, query, scope)
  69. slaveQ := manager.GetSlaveManager().Query("id")
  70. slaveQ = manager.GetSlaveManager().FilterBySystemAttributes(slaveQ, userCred, query, scope)
  71. iManager := manager.GetIJointModelManager()
  72. q = q.In(iManager.GetMasterFieldName(), masterQ.SubQuery())
  73. q = q.In(iManager.GetSlaveFieldName(), slaveQ.SubQuery())
  74. return q
  75. }
  76. func (manager *SVirtualJointResourceBaseManager) FilterByHiddenSystemAttributes(q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  77. q = manager.SJointResourceBaseManager.FilterByHiddenSystemAttributes(q, userCred, query, scope)
  78. masterQ := manager.GetMasterManager().Query("id")
  79. masterQ = manager.GetMasterManager().FilterByHiddenSystemAttributes(masterQ, userCred, query, scope)
  80. slaveQ := manager.GetSlaveManager().Query("id")
  81. slaveQ = manager.GetSlaveManager().FilterByHiddenSystemAttributes(slaveQ, userCred, query, scope)
  82. iManager := manager.GetIJointModelManager()
  83. q = q.In(iManager.GetMasterFieldName(), masterQ.SubQuery())
  84. q = q.In(iManager.GetSlaveFieldName(), slaveQ.SubQuery())
  85. return q
  86. }
  87. func (manager *SVirtualJointResourceBaseManager) FetchCustomizeColumns(
  88. ctx context.Context,
  89. userCred mcclient.TokenCredential,
  90. query jsonutils.JSONObject,
  91. objs []interface{},
  92. fields stringutils2.SSortedStrings,
  93. isList bool,
  94. ) []apis.VirtualJointResourceBaseDetails {
  95. ret := make([]apis.VirtualJointResourceBaseDetails, len(objs))
  96. upperRet := manager.SJointResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  97. for i := range objs {
  98. ret[i] = apis.VirtualJointResourceBaseDetails{
  99. JointResourceBaseDetails: upperRet[i],
  100. }
  101. }
  102. return ret
  103. }
  104. func (manager *SVirtualJointResourceBaseManager) ListItemFilter(
  105. ctx context.Context,
  106. q *sqlchemy.SQuery,
  107. userCred mcclient.TokenCredential,
  108. query apis.VirtualJointResourceBaseListInput,
  109. ) (*sqlchemy.SQuery, error) {
  110. var err error
  111. q, err = manager.SJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.JointResourceBaseListInput)
  112. if err != nil {
  113. return nil, errors.Wrap(err, "SJointResourceBaseManager.ListItemFilter")
  114. }
  115. return q, nil
  116. }
  117. func (manager *SVirtualJointResourceBaseManager) OrderByExtraFields(
  118. ctx context.Context,
  119. q *sqlchemy.SQuery,
  120. userCred mcclient.TokenCredential,
  121. query apis.VirtualJointResourceBaseListInput,
  122. ) (*sqlchemy.SQuery, error) {
  123. var err error
  124. q, err = manager.SJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.JointResourceBaseListInput)
  125. if err != nil {
  126. return nil, errors.Wrap(err, "SJointResourceBaseManager.ListItemFilter")
  127. }
  128. return q, nil
  129. }
  130. func (self *SVirtualJointResourceBase) ValidateUpdateData(
  131. ctx context.Context,
  132. userCred mcclient.TokenCredential,
  133. query jsonutils.JSONObject,
  134. input apis.VirtualJointResourceBaseUpdateInput,
  135. ) (apis.VirtualJointResourceBaseUpdateInput, error) {
  136. var err error
  137. input.JointResourceBaseUpdateInput, err = self.SJointResourceBase.ValidateUpdateData(ctx, userCred, query, input.JointResourceBaseUpdateInput)
  138. if err != nil {
  139. return input, errors.Wrap(err, "SJointResourceBase.ValidateUpdateData")
  140. }
  141. return input, nil
  142. }
  143. func (manager *SVirtualJointResourceBaseManager) FilterById(q *sqlchemy.SQuery, idStr string) *sqlchemy.SQuery {
  144. return q.Equals("row_id", idStr)
  145. }