nautobot 2.1.7__py3-none-any.whl → 2.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (338) hide show
  1. nautobot/apps/api.py +1 -2
  2. nautobot/apps/utils.py +4 -0
  3. nautobot/apps/views.py +2 -0
  4. nautobot/circuits/api/urls.py +1 -2
  5. nautobot/circuits/api/views.py +0 -12
  6. nautobot/circuits/tests/integration/test_relationships.py +0 -4
  7. nautobot/core/api/routers.py +25 -3
  8. nautobot/core/api/utils.py +4 -0
  9. nautobot/core/api/views.py +21 -15
  10. nautobot/core/celery/schedulers.py +13 -0
  11. nautobot/core/choices.py +0 -21
  12. nautobot/core/models/__init__.py +1 -1
  13. nautobot/core/models/tree_queries.py +29 -7
  14. nautobot/core/releases.py +1 -1
  15. nautobot/core/settings.py +9 -0
  16. nautobot/core/settings_funcs.py +0 -18
  17. nautobot/core/signals.py +5 -5
  18. nautobot/core/tasks.py +7 -3
  19. nautobot/core/templates/admin/base.html +23 -94
  20. nautobot/core/templates/generic/object_list.html +2 -0
  21. nautobot/core/templates/graphene/graphiql.html +18 -47
  22. nautobot/core/templates/inc/footer.html +5 -5
  23. nautobot/core/templates/inc/nav_menu.html +0 -7
  24. nautobot/core/templates/nautobot_config.py.j2 +6 -0
  25. nautobot/core/templates/rest_framework/api.html +12 -5
  26. nautobot/core/testing/mixins.py +13 -5
  27. nautobot/core/tests/integration/test_plugin_navbar.py +7 -21
  28. nautobot/core/tests/integration/test_view_authentication.py +67 -0
  29. nautobot/core/tests/runner.py +25 -2
  30. nautobot/core/tests/test_graphql.py +2 -14
  31. nautobot/core/tests/test_models.py +3 -3
  32. nautobot/core/tests/test_navigations.py +67 -10
  33. nautobot/core/tests/test_releases.py +9 -3
  34. nautobot/core/tests/test_views.py +23 -16
  35. nautobot/core/utils/lookup.py +124 -0
  36. nautobot/core/views/__init__.py +3 -7
  37. nautobot/core/views/generic.py +9 -0
  38. nautobot/dcim/api/urls.py +1 -2
  39. nautobot/dcim/api/views.py +1 -12
  40. nautobot/dcim/choices.py +56 -0
  41. nautobot/dcim/models/racks.py +1 -3
  42. nautobot/dcim/navigation.py +1 -1
  43. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +67 -43
  44. nautobot/dcim/tests/test_api.py +3 -0
  45. nautobot/dcim/tests/test_filters.py +0 -28
  46. nautobot/dcim/views.py +5 -2
  47. nautobot/extras/api/urls.py +1 -2
  48. nautobot/extras/api/views.py +0 -10
  49. nautobot/extras/choices.py +14 -0
  50. nautobot/extras/models/customfields.py +93 -34
  51. nautobot/extras/models/groups.py +1 -1
  52. nautobot/extras/models/relationships.py +32 -19
  53. nautobot/extras/navigation.py +3 -2
  54. nautobot/extras/plugins/__init__.py +8 -0
  55. nautobot/extras/plugins/views.py +6 -9
  56. nautobot/extras/querysets.py +1 -1
  57. nautobot/extras/signals.py +12 -6
  58. nautobot/extras/templates/extras/customfield.html +22 -14
  59. nautobot/extras/templatetags/job_buttons.py +7 -0
  60. nautobot/extras/templatetags/plugins.py +5 -1
  61. nautobot/extras/tests/test_customfields.py +323 -287
  62. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  63. nautobot/extras/tests/test_jobs.py +2 -2
  64. nautobot/extras/tests/test_plugins.py +41 -0
  65. nautobot/extras/tests/test_relationships.py +31 -14
  66. nautobot/extras/tests/test_views.py +124 -1
  67. nautobot/extras/utils.py +7 -3
  68. nautobot/extras/views.py +10 -10
  69. nautobot/ipam/api/urls.py +1 -2
  70. nautobot/ipam/api/views.py +6 -13
  71. nautobot/ipam/tables.py +0 -1
  72. nautobot/ipam/tests/test_graphql.py +2 -3
  73. nautobot/ipam/views.py +12 -10
  74. nautobot/project-static/css/base.css +1 -0
  75. nautobot/project-static/docs/404.html +30 -2
  76. nautobot/project-static/docs/apps/index.html +30 -2
  77. nautobot/project-static/docs/apps/nautobot-apps.html +30 -2
  78. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +30 -2
  79. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +30 -2
  80. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +410 -410
  81. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +30 -2
  82. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +386 -358
  83. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +30 -2
  84. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +30 -2
  85. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +30 -2
  86. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +30 -2
  87. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +45 -17
  88. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +30 -2
  89. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +30 -2
  90. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +30 -2
  91. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +759 -602
  92. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +30 -2
  93. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +30 -2
  94. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +30 -2
  95. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +528 -467
  96. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +205 -109
  97. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +30 -2
  98. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1265 -785
  99. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1827 -1746
  100. nautobot/project-static/docs/development/apps/api/configuration-view.html +30 -2
  101. nautobot/project-static/docs/development/apps/api/database-backend-config.html +30 -2
  102. nautobot/project-static/docs/development/apps/api/models/django-admin.html +30 -2
  103. nautobot/project-static/docs/development/apps/api/models/global-search.html +30 -2
  104. nautobot/project-static/docs/development/apps/api/models/graphql.html +30 -2
  105. nautobot/project-static/docs/development/apps/api/models/index.html +30 -2
  106. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +31 -3
  107. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +30 -2
  108. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +30 -2
  109. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +30 -2
  110. nautobot/project-static/docs/development/apps/api/platform-features/index.html +30 -2
  111. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +30 -2
  112. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +30 -2
  113. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +30 -2
  114. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +30 -2
  115. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +30 -2
  116. nautobot/project-static/docs/development/apps/api/prometheus.html +30 -2
  117. nautobot/project-static/docs/development/apps/api/setup.html +30 -2
  118. nautobot/project-static/docs/development/apps/api/testing.html +33 -5
  119. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +30 -2
  120. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +30 -2
  121. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +30 -2
  122. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +33 -5
  123. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +13 -5559
  124. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +5594 -0
  125. nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +3 -3
  126. nautobot/project-static/docs/development/apps/api/views/base-template.html +30 -2
  127. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +44 -11
  128. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +47 -14
  129. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +30 -2
  130. nautobot/project-static/docs/development/apps/api/views/index.html +30 -2
  131. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +30 -2
  132. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +30 -2
  133. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +30 -2
  134. nautobot/project-static/docs/development/apps/api/views/notes.html +30 -2
  135. nautobot/project-static/docs/development/apps/api/views/rest-api.html +30 -2
  136. nautobot/project-static/docs/development/apps/api/views/urls.html +30 -2
  137. nautobot/project-static/docs/development/apps/index.html +30 -2
  138. nautobot/project-static/docs/development/apps/migration/code-updates.html +30 -2
  139. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +30 -2
  140. nautobot/project-static/docs/development/apps/migration/from-v1.html +30 -2
  141. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +30 -2
  142. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +30 -2
  143. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +30 -2
  144. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +30 -2
  145. nautobot/project-static/docs/development/apps/porting-from-netbox.html +30 -2
  146. nautobot/project-static/docs/development/core/application-registry.html +30 -2
  147. nautobot/project-static/docs/development/core/best-practices.html +33 -5
  148. nautobot/project-static/docs/development/core/bootstrap-ui.html +30 -2
  149. nautobot/project-static/docs/development/core/caching.html +5481 -0
  150. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +30 -2
  151. nautobot/project-static/docs/development/core/extending-models.html +33 -5
  152. nautobot/project-static/docs/development/core/generic-views.html +30 -2
  153. nautobot/project-static/docs/development/core/getting-started.html +49 -12
  154. nautobot/project-static/docs/development/core/homepage.html +30 -2
  155. nautobot/project-static/docs/development/core/index.html +30 -2
  156. nautobot/project-static/docs/development/core/model-features.html +30 -2
  157. nautobot/project-static/docs/development/core/natural-keys.html +30 -2
  158. nautobot/project-static/docs/development/core/navigation-menu.html +30 -2
  159. nautobot/project-static/docs/development/core/release-checklist.html +30 -2
  160. nautobot/project-static/docs/development/core/role-internals.html +30 -2
  161. nautobot/project-static/docs/development/core/style-guide.html +30 -2
  162. nautobot/project-static/docs/development/core/templates.html +30 -2
  163. nautobot/project-static/docs/development/core/testing.html +30 -2
  164. nautobot/project-static/docs/development/core/user-preferences.html +30 -2
  165. nautobot/project-static/docs/development/index.html +30 -2
  166. nautobot/project-static/docs/development/jobs/index.html +30 -2
  167. nautobot/project-static/docs/development/jobs/migration/from-v1.html +30 -2
  168. nautobot/project-static/docs/index.html +30 -2
  169. nautobot/project-static/docs/objects.inv +0 -0
  170. nautobot/project-static/docs/release-notes/index.html +30 -2
  171. nautobot/project-static/docs/release-notes/version-1.0.html +30 -2
  172. nautobot/project-static/docs/release-notes/version-1.1.html +30 -2
  173. nautobot/project-static/docs/release-notes/version-1.2.html +30 -2
  174. nautobot/project-static/docs/release-notes/version-1.3.html +30 -2
  175. nautobot/project-static/docs/release-notes/version-1.4.html +31 -3
  176. nautobot/project-static/docs/release-notes/version-1.5.html +30 -2
  177. nautobot/project-static/docs/release-notes/version-1.6.html +573 -134
  178. nautobot/project-static/docs/release-notes/version-2.0.html +30 -2
  179. nautobot/project-static/docs/release-notes/version-2.1.html +539 -170
  180. nautobot/project-static/docs/search/search_index.json +1 -1
  181. nautobot/project-static/docs/sitemap.xml +250 -240
  182. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  183. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +30 -2
  184. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +30 -2
  185. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +30 -2
  186. nautobot/project-static/docs/user-guide/administration/configuration/index.html +30 -2
  187. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +49 -2
  188. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +30 -2
  189. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +30 -2
  190. nautobot/project-static/docs/user-guide/administration/guides/caching.html +30 -2
  191. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +30 -2
  192. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +30 -2
  193. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +30 -2
  194. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +30 -2
  195. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +30 -2
  196. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +30 -2
  197. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +30 -2
  198. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +30 -2
  199. nautobot/project-static/docs/user-guide/administration/installation/docker.html +37 -5
  200. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +30 -2
  201. nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +6019 -0
  202. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +30 -2
  203. nautobot/project-static/docs/user-guide/administration/installation/index.html +30 -2
  204. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +30 -2
  205. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +30 -2
  206. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +33 -5
  207. nautobot/project-static/docs/user-guide/administration/installation/services.html +30 -2
  208. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +30 -2
  209. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +30 -2
  210. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +30 -2
  211. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +30 -2
  212. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +30 -2
  213. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +30 -2
  214. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +30 -2
  215. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +30 -2
  216. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +30 -2
  217. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +30 -2
  218. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +30 -2
  219. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +30 -2
  220. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +30 -2
  221. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +30 -2
  222. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +30 -2
  223. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +30 -2
  224. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +30 -2
  225. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +30 -2
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +30 -2
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +30 -2
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +30 -2
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +30 -2
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +30 -2
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +30 -2
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +30 -2
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +30 -2
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +30 -2
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +30 -2
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +30 -2
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +30 -2
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +30 -2
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +30 -2
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +30 -2
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +30 -2
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +30 -2
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +30 -2
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +30 -2
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +30 -2
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +30 -2
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +30 -2
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +30 -2
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +30 -2
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +30 -2
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +30 -2
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +30 -2
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +30 -2
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +30 -2
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +30 -2
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +30 -2
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +30 -2
  258. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +30 -2
  259. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +30 -2
  260. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +30 -2
  261. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +30 -2
  262. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +30 -2
  263. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +30 -2
  264. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +30 -2
  265. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +30 -2
  266. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +30 -2
  267. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +30 -2
  268. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +30 -2
  269. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +30 -2
  270. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +30 -2
  271. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +30 -2
  272. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +30 -2
  273. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +30 -2
  274. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +30 -2
  275. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +30 -2
  276. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +30 -2
  277. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +33 -5
  278. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +30 -2
  279. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +30 -2
  280. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +30 -2
  281. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +30 -2
  282. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +30 -2
  283. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +30 -2
  284. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +30 -2
  285. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +30 -2
  286. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +30 -2
  287. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +30 -2
  288. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +30 -2
  289. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +30 -2
  290. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +30 -2
  291. nautobot/project-static/docs/user-guide/index.html +30 -2
  292. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +30 -2
  293. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +30 -2
  294. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +111 -15
  295. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +30 -2
  296. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +30 -2
  297. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +30 -2
  298. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +30 -2
  299. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +30 -2
  300. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +30 -2
  301. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +30 -2
  302. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +30 -2
  303. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +30 -2
  304. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +30 -2
  305. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +30 -2
  306. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +30 -2
  307. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +30 -2
  308. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +30 -2
  309. nautobot/project-static/docs/user-guide/platform-functionality/note.html +30 -2
  310. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +30 -2
  311. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +30 -2
  312. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +30 -2
  313. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +30 -2
  314. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +30 -2
  315. nautobot/project-static/docs/user-guide/platform-functionality/role.html +30 -2
  316. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +30 -2
  317. nautobot/project-static/docs/user-guide/platform-functionality/status.html +30 -2
  318. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +30 -2
  319. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +30 -2
  320. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +30 -2
  321. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +30 -2
  322. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +30 -2
  323. nautobot/tenancy/api/urls.py +1 -2
  324. nautobot/tenancy/api/views.py +0 -12
  325. nautobot/tenancy/navigation.py +1 -1
  326. nautobot/tenancy/tests/test_filters.py +0 -168
  327. nautobot/users/api/urls.py +1 -2
  328. nautobot/users/api/views.py +2 -65
  329. nautobot/users/views.py +8 -8
  330. nautobot/virtualization/api/urls.py +1 -2
  331. nautobot/virtualization/api/views.py +0 -12
  332. nautobot/virtualization/tests/test_filters.py +0 -28
  333. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/METADATA +2 -2
  334. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/RECORD +338 -334
  335. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/LICENSE.txt +0 -0
  336. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/NOTICE +0 -0
  337. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/WHEEL +0 -0
  338. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/entry_points.txt +0 -0
@@ -550,6 +550,20 @@
550
550
 
551
551
 
552
552
 
553
+ <li class="md-nav__item">
554
+ <a href="../../../user-guide/administration/installation/health-checks.html" class="md-nav__link">
555
+ Health Checks
556
+ </a>
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
553
567
  <li class="md-nav__item">
554
568
  <a href="../../../user-guide/administration/installation/selinux-troubleshooting.html" class="md-nav__link">
555
569
  SELinux Troubleshooting
@@ -3888,8 +3902,8 @@
3888
3902
 
3889
3903
 
3890
3904
  <li class="md-nav__item">
3891
- <a href="../../../development/apps/api/ui-extensions/object-detail-views.html" class="md-nav__link">
3892
- Object Detail Views and Tabs
3905
+ <a href="../../../development/apps/api/ui-extensions/object-views.html" class="md-nav__link">
3906
+ Object Detail & List Views
3893
3907
  </a>
3894
3908
  </li>
3895
3909
 
@@ -4890,6 +4904,19 @@
4890
4904
  TreeManager
4891
4905
  </a>
4892
4906
 
4907
+ <nav class="md-nav" aria-label="TreeManager">
4908
+ <ul class="md-nav__list">
4909
+
4910
+ <li class="md-nav__item">
4911
+ <a href="#nautobot.core.models.tree_queries.TreeManager.max_depth" class="md-nav__link">
4912
+ max_depth
4913
+ </a>
4914
+
4915
+ </li>
4916
+
4917
+ </ul>
4918
+ </nav>
4919
+
4893
4920
  </li>
4894
4921
 
4895
4922
  <li class="md-nav__item">
@@ -5577,6 +5604,20 @@
5577
5604
 
5578
5605
 
5579
5606
 
5607
+ <li class="md-nav__item">
5608
+ <a href="../../../development/core/caching.html" class="md-nav__link">
5609
+ Caching
5610
+ </a>
5611
+ </li>
5612
+
5613
+
5614
+
5615
+
5616
+
5617
+
5618
+
5619
+
5620
+
5580
5621
  <li class="md-nav__item">
5581
5622
  <a href="../../../development/core/extending-models.html" class="md-nav__link">
5582
5623
  Extending Models
@@ -6899,6 +6940,19 @@
6899
6940
  TreeManager
6900
6941
  </a>
6901
6942
 
6943
+ <nav class="md-nav" aria-label="TreeManager">
6944
+ <ul class="md-nav__list">
6945
+
6946
+ <li class="md-nav__item">
6947
+ <a href="#nautobot.core.models.tree_queries.TreeManager.max_depth" class="md-nav__link">
6948
+ max_depth
6949
+ </a>
6950
+
6951
+ </li>
6952
+
6953
+ </ul>
6954
+ </nav>
6955
+
6902
6956
  </li>
6903
6957
 
6904
6958
  <li class="md-nav__item">
@@ -7955,7 +8009,7 @@ can be used for the same purpose in most cases.</p>
7955
8009
  <a id="__codelineno-0-94" name="__codelineno-0-94"></a>
7956
8010
  <a id="__codelineno-0-95" name="__codelineno-0-95"></a><span class="sd"> Necessary for use with _content_type_cached and management commands.</span>
7957
8011
  <a id="__codelineno-0-96" name="__codelineno-0-96"></a><span class="sd"> &quot;&quot;&quot;</span>
7958
- <a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="si">}</span><span class="s2">._content_type&quot;</span>
8012
+ <a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;nautobot.</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="si">}</span><span class="s2">._content_type&quot;</span>
7959
8013
  <a id="__codelineno-0-98" name="__codelineno-0-98"></a>
7960
8014
  <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="nd">@classproperty</span> <span class="c1"># https://github.com/PyCQA/pylint-django/issues/240</span>
7961
8015
  <a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">def</span> <span class="nf">_content_type_cached</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="c1"># pylint: disable=no-self-argument</span>
@@ -9836,15 +9890,7 @@ ConfigContexts.</p>
9836
9890
 
9837
9891
  <details class="quote">
9838
9892
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
9839
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-127">127</a></span>
9840
- <span class="normal"><a href="#__codelineno-0-128">128</a></span>
9841
- <span class="normal"><a href="#__codelineno-0-129">129</a></span>
9842
- <span class="normal"><a href="#__codelineno-0-130">130</a></span>
9843
- <span class="normal"><a href="#__codelineno-0-131">131</a></span>
9844
- <span class="normal"><a href="#__codelineno-0-132">132</a></span>
9845
- <span class="normal"><a href="#__codelineno-0-133">133</a></span>
9846
- <span class="normal"><a href="#__codelineno-0-134">134</a></span>
9847
- <span class="normal"><a href="#__codelineno-0-135">135</a></span>
9893
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-135">135</a></span>
9848
9894
  <span class="normal"><a href="#__codelineno-0-136">136</a></span>
9849
9895
  <span class="normal"><a href="#__codelineno-0-137">137</a></span>
9850
9896
  <span class="normal"><a href="#__codelineno-0-138">138</a></span>
@@ -10004,175 +10050,183 @@ ConfigContexts.</p>
10004
10050
  <span class="normal"><a href="#__codelineno-0-292">292</a></span>
10005
10051
  <span class="normal"><a href="#__codelineno-0-293">293</a></span>
10006
10052
  <span class="normal"><a href="#__codelineno-0-294">294</a></span>
10007
- <span class="normal"><a href="#__codelineno-0-295">295</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-127" name="__codelineno-0-127"></a><span class="k">class</span> <span class="nc">CustomFieldModel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
10008
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10009
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a><span class="sd"> Abstract class for any model which may have custom fields associated with it.</span>
10010
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a><span class="sd"> &quot;&quot;&quot;</span>
10011
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a>
10012
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="n">_custom_field_data</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">JSONField</span><span class="p">(</span><span class="n">encoder</span><span class="o">=</span><span class="n">DjangoJSONEncoder</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="nb">dict</span><span class="p">)</span>
10013
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a>
10014
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
10015
- <a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
10016
- <a id="__codelineno-0-136" name="__codelineno-0-136"></a>
10017
- <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="nd">@property</span>
10018
- <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="k">def</span> <span class="nf">custom_field_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10019
- <a id="__codelineno-0-139" name="__codelineno-0-139"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10020
- <a id="__codelineno-0-140" name="__codelineno-0-140"></a><span class="sd"> Legacy interface to raw custom field data</span>
10053
+ <span class="normal"><a href="#__codelineno-0-295">295</a></span>
10054
+ <span class="normal"><a href="#__codelineno-0-296">296</a></span>
10055
+ <span class="normal"><a href="#__codelineno-0-297">297</a></span>
10056
+ <span class="normal"><a href="#__codelineno-0-298">298</a></span>
10057
+ <span class="normal"><a href="#__codelineno-0-299">299</a></span>
10058
+ <span class="normal"><a href="#__codelineno-0-300">300</a></span>
10059
+ <span class="normal"><a href="#__codelineno-0-301">301</a></span>
10060
+ <span class="normal"><a href="#__codelineno-0-302">302</a></span>
10061
+ <span class="normal"><a href="#__codelineno-0-303">303</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-135" name="__codelineno-0-135"></a><span class="k">class</span> <span class="nc">CustomFieldModel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
10062
+ <a id="__codelineno-0-136" name="__codelineno-0-136"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10063
+ <a id="__codelineno-0-137" name="__codelineno-0-137"></a><span class="sd"> Abstract class for any model which may have custom fields associated with it.</span>
10064
+ <a id="__codelineno-0-138" name="__codelineno-0-138"></a><span class="sd"> &quot;&quot;&quot;</span>
10065
+ <a id="__codelineno-0-139" name="__codelineno-0-139"></a>
10066
+ <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="n">_custom_field_data</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">JSONField</span><span class="p">(</span><span class="n">encoder</span><span class="o">=</span><span class="n">DjangoJSONEncoder</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="nb">dict</span><span class="p">)</span>
10021
10067
  <a id="__codelineno-0-141" name="__codelineno-0-141"></a>
10022
- <a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd"> TODO(John): remove this entirely when the cf property is enhanced</span>
10023
- <a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> &quot;&quot;&quot;</span>
10024
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span>
10025
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a>
10026
- <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="nd">@property</span>
10027
- <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="k">def</span> <span class="nf">cf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10028
- <a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10029
- <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> Convenience wrapper for custom field data.</span>
10030
- <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> &quot;&quot;&quot;</span>
10031
- <a id="__codelineno-0-151" name="__codelineno-0-151"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span>
10032
- <a id="__codelineno-0-152" name="__codelineno-0-152"></a>
10033
- <a id="__codelineno-0-153" name="__codelineno-0-153"></a> <span class="k">def</span> <span class="nf">get_custom_fields_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10034
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10035
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10036
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10037
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> which have advanced_ui set to False</span>
10068
+ <a id="__codelineno-0-142" name="__codelineno-0-142"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
10069
+ <a id="__codelineno-0-143" name="__codelineno-0-143"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
10070
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a>
10071
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="nd">@property</span>
10072
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">def</span> <span class="nf">custom_field_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10073
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10074
+ <a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> Legacy interface to raw custom field data</span>
10075
+ <a id="__codelineno-0-149" name="__codelineno-0-149"></a>
10076
+ <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> TODO(John): remove this entirely when the cf property is enhanced</span>
10077
+ <a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd"> &quot;&quot;&quot;</span>
10078
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span>
10079
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a>
10080
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a> <span class="nd">@property</span>
10081
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="k">def</span> <span class="nf">cf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10082
+ <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10083
+ <a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> Convenience wrapper for custom field data.</span>
10038
10084
  <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> &quot;&quot;&quot;</span>
10039
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10085
+ <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span>
10040
10086
  <a id="__codelineno-0-160" name="__codelineno-0-160"></a>
10041
- <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="k">def</span> <span class="nf">get_custom_fields_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10087
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="k">def</span> <span class="nf">get_custom_fields_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10042
10088
  <a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10043
10089
  <a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10044
10090
  <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10045
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> which have advanced_ui set to True</span>
10091
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> which have advanced_ui set to False</span>
10046
10092
  <a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> &quot;&quot;&quot;</span>
10047
- <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10093
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10048
10094
  <a id="__codelineno-0-168" name="__codelineno-0-168"></a>
10049
- <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="k">def</span> <span class="nf">get_custom_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10095
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="k">def</span> <span class="nf">get_custom_fields_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10050
10096
  <a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10051
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}.</span>
10052
- <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> &quot;&quot;&quot;</span>
10053
- <a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10054
- <a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10055
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10056
- <a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">return</span> <span class="n">OrderedDict</span><span class="p">([(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">])</span>
10057
- <a id="__codelineno-0-177" name="__codelineno-0-177"></a>
10058
- <a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="k">def</span> <span class="nf">get_custom_field_groupings_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10059
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10060
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10061
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10062
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> {</span>
10063
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10064
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> ...</span>
10065
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10066
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="sd"> ...</span>
10067
- <a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="sd"> }</span>
10068
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="sd"> which have advanced_ui set to False</span>
10069
- <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="sd"> &quot;&quot;&quot;</span>
10070
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10071
- <a id="__codelineno-0-191" name="__codelineno-0-191"></a>
10072
- <a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="k">def</span> <span class="nf">get_custom_field_groupings_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10073
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10074
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10075
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10076
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> {</span>
10077
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10078
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="sd"> ...</span>
10079
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10080
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a><span class="sd"> ...</span>
10081
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="sd"> }</span>
10082
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> which have advanced_ui set to True</span>
10083
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> &quot;&quot;&quot;</span>
10084
- <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10085
- <a id="__codelineno-0-205" name="__codelineno-0-205"></a>
10086
- <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="k">def</span> <span class="nf">get_custom_field_groupings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10087
- <a id="__codelineno-0-207" name="__codelineno-0-207"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10088
- <a id="__codelineno-0-208" name="__codelineno-0-208"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10089
- <a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="sd"> {</span>
10090
- <a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10091
- <a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> ...</span>
10092
- <a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10093
- <a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="sd"> ...</span>
10094
- <a id="__codelineno-0-214" name="__codelineno-0-214"></a><span class="sd"> }</span>
10095
- <a id="__codelineno-0-215" name="__codelineno-0-215"></a><span class="sd"> &quot;&quot;&quot;</span>
10096
- <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="n">record</span> <span class="o">=</span> <span class="p">{}</span>
10097
- <a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10098
- <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10099
- <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10100
- <a id="__codelineno-0-220" name="__codelineno-0-220"></a>
10101
- <a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
10102
- <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
10103
- <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="n">record</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
10104
- <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="n">record</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
10105
- <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="k">return</span> <span class="n">record</span>
10106
- <a id="__codelineno-0-226" name="__codelineno-0-226"></a>
10107
- <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10108
- <a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span>
10109
- <a id="__codelineno-0-229" name="__codelineno-0-229"></a>
10110
- <a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="n">custom_fields</span> <span class="o">=</span> <span class="p">{</span><span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">:</span> <span class="n">cf</span> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)}</span>
10111
- <a id="__codelineno-0-231" name="__codelineno-0-231"></a>
10112
- <a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="c1"># Validate all field values</span>
10113
- <a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="k">for</span> <span class="n">field_key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
10114
- <a id="__codelineno-0-234" name="__codelineno-0-234"></a> <span class="k">if</span> <span class="n">field_key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">custom_fields</span><span class="p">:</span>
10115
- <a id="__codelineno-0-235" name="__codelineno-0-235"></a> <span class="c1"># log a warning instead of raising a ValidationError so as not to break the UI</span>
10116
- <a id="__codelineno-0-236" name="__codelineno-0-236"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown field key &#39;</span><span class="si">{</span><span class="n">field_key</span><span class="si">}</span><span class="s2">&#39; in custom field data for </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="si">}</span><span class="s2">).&quot;</span><span class="p">)</span>
10117
- <a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="k">continue</span>
10118
- <a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="k">try</span><span class="p">:</span>
10119
- <a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">custom_fields</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
10120
- <a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
10121
- <a id="__codelineno-0-241" name="__codelineno-0-241"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid value for custom field &#39;</span><span class="si">{</span><span class="n">field_key</span><span class="si">}</span><span class="s2">&#39;: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
10122
- <a id="__codelineno-0-242" name="__codelineno-0-242"></a>
10123
- <a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="c1"># Check for missing values, erroring on required ones and populating non-required ones automatically</span>
10124
- <a id="__codelineno-0-244" name="__codelineno-0-244"></a> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">custom_fields</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
10125
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="k">if</span> <span class="n">cf</span><span class="o">.</span><span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="p">:</span>
10126
- <a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="k">if</span> <span class="n">cf</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10127
- <a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="p">[</span><span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">cf</span><span class="o">.</span><span class="n">default</span>
10128
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="k">elif</span> <span class="n">cf</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
10129
- <a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Missing required custom field &#39;</span><span class="si">{</span><span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">&#39;.&quot;</span><span class="p">)</span>
10097
+ <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10098
+ <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10099
+ <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="sd"> which have advanced_ui set to True</span>
10100
+ <a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="sd"> &quot;&quot;&quot;</span>
10101
+ <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10102
+ <a id="__codelineno-0-176" name="__codelineno-0-176"></a>
10103
+ <a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="k">def</span> <span class="nf">get_custom_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10104
+ <a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10105
+ <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}.</span>
10106
+ <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> &quot;&quot;&quot;</span>
10107
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10108
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10109
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10110
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="k">return</span> <span class="n">OrderedDict</span><span class="p">([(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">])</span>
10111
+ <a id="__codelineno-0-185" name="__codelineno-0-185"></a>
10112
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="k">def</span> <span class="nf">get_custom_field_groupings_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10113
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10114
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10115
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10116
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="sd"> {</span>
10117
+ <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10118
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> ...</span>
10119
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10120
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> ...</span>
10121
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> }</span>
10122
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> which have advanced_ui set to False</span>
10123
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> &quot;&quot;&quot;</span>
10124
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10125
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a>
10126
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="k">def</span> <span class="nf">get_custom_field_groupings_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10127
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10128
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10129
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10130
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a><span class="sd"> {</span>
10131
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10132
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a><span class="sd"> ...</span>
10133
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10134
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a><span class="sd"> ...</span>
10135
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="sd"> }</span>
10136
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="sd"> which have advanced_ui set to True</span>
10137
+ <a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> &quot;&quot;&quot;</span>
10138
+ <a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10139
+ <a id="__codelineno-0-213" name="__codelineno-0-213"></a>
10140
+ <a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="k">def</span> <span class="nf">get_custom_field_groupings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10141
+ <a id="__codelineno-0-215" name="__codelineno-0-215"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10142
+ <a id="__codelineno-0-216" name="__codelineno-0-216"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10143
+ <a id="__codelineno-0-217" name="__codelineno-0-217"></a><span class="sd"> {</span>
10144
+ <a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10145
+ <a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="sd"> ...</span>
10146
+ <a id="__codelineno-0-220" name="__codelineno-0-220"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10147
+ <a id="__codelineno-0-221" name="__codelineno-0-221"></a><span class="sd"> ...</span>
10148
+ <a id="__codelineno-0-222" name="__codelineno-0-222"></a><span class="sd"> }</span>
10149
+ <a id="__codelineno-0-223" name="__codelineno-0-223"></a><span class="sd"> &quot;&quot;&quot;</span>
10150
+ <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="n">record</span> <span class="o">=</span> <span class="p">{}</span>
10151
+ <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10152
+ <a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10153
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10154
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a>
10155
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
10156
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
10157
+ <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="n">record</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
10158
+ <a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="n">record</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
10159
+ <a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="k">return</span> <span class="n">record</span>
10160
+ <a id="__codelineno-0-234" name="__codelineno-0-234"></a>
10161
+ <a id="__codelineno-0-235" name="__codelineno-0-235"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10162
+ <a id="__codelineno-0-236" name="__codelineno-0-236"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span>
10163
+ <a id="__codelineno-0-237" name="__codelineno-0-237"></a>
10164
+ <a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="n">custom_fields</span> <span class="o">=</span> <span class="p">{</span><span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">:</span> <span class="n">cf</span> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)}</span>
10165
+ <a id="__codelineno-0-239" name="__codelineno-0-239"></a>
10166
+ <a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="c1"># Validate all field values</span>
10167
+ <a id="__codelineno-0-241" name="__codelineno-0-241"></a> <span class="k">for</span> <span class="n">field_key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
10168
+ <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="k">if</span> <span class="n">field_key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">custom_fields</span><span class="p">:</span>
10169
+ <a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="c1"># log a warning instead of raising a ValidationError so as not to break the UI</span>
10170
+ <a id="__codelineno-0-244" name="__codelineno-0-244"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown field key &#39;</span><span class="si">{</span><span class="n">field_key</span><span class="si">}</span><span class="s2">&#39; in custom field data for </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="si">}</span><span class="s2">).&quot;</span><span class="p">)</span>
10171
+ <a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="k">continue</span>
10172
+ <a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="k">try</span><span class="p">:</span>
10173
+ <a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">custom_fields</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
10174
+ <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
10175
+ <a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid value for custom field &#39;</span><span class="si">{</span><span class="n">field_key</span><span class="si">}</span><span class="s2">&#39;: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
10130
10176
  <a id="__codelineno-0-250" name="__codelineno-0-250"></a>
10131
- <a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="c1"># Computed Field Methods</span>
10132
- <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">def</span> <span class="nf">has_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10133
- <a id="__codelineno-0-253" name="__codelineno-0-253"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10134
- <a id="__codelineno-0-254" name="__codelineno-0-254"></a><span class="sd"> Return a boolean indicating whether or not this content type has computed fields associated with it.</span>
10135
- <a id="__codelineno-0-255" name="__codelineno-0-255"></a><span class="sd"> This can also check whether the advanced_ui attribute is True or False for UI display purposes.</span>
10136
- <a id="__codelineno-0-256" name="__codelineno-0-256"></a><span class="sd"> &quot;&quot;&quot;</span>
10137
- <a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10138
- <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10139
- <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10140
- <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="k">return</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
10141
- <a id="__codelineno-0-261" name="__codelineno-0-261"></a>
10142
- <a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="k">def</span> <span class="nf">has_computed_fields_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10143
- <a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_computed_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10144
- <a id="__codelineno-0-264" name="__codelineno-0-264"></a>
10145
- <a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="k">def</span> <span class="nf">has_computed_fields_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10146
- <a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_computed_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10147
- <a id="__codelineno-0-267" name="__codelineno-0-267"></a>
10148
- <a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="k">def</span> <span class="nf">get_computed_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">render</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
10149
- <a id="__codelineno-0-269" name="__codelineno-0-269"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10150
- <a id="__codelineno-0-270" name="__codelineno-0-270"></a><span class="sd"> Get a computed field for this model, lookup via key.</span>
10151
- <a id="__codelineno-0-271" name="__codelineno-0-271"></a><span class="sd"> Returns the template of this field if render is False, otherwise returns the rendered value.</span>
10152
- <a id="__codelineno-0-272" name="__codelineno-0-272"></a><span class="sd"> &quot;&quot;&quot;</span>
10153
- <a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="k">try</span><span class="p">:</span>
10154
- <a id="__codelineno-0-274" name="__codelineno-0-274"></a> <span class="n">computed_field</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
10155
- <a id="__codelineno-0-275" name="__codelineno-0-275"></a> <span class="k">except</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
10156
- <a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Computed Field with key </span><span class="si">%s</span><span class="s2"> does not exist for model </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
10157
- <a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="k">return</span> <span class="kc">None</span>
10158
- <a id="__codelineno-0-278" name="__codelineno-0-278"></a> <span class="k">if</span> <span class="n">render</span><span class="p">:</span>
10159
- <a id="__codelineno-0-279" name="__codelineno-0-279"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10160
- <a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">template</span>
10161
- <a id="__codelineno-0-281" name="__codelineno-0-281"></a>
10162
- <a id="__codelineno-0-282" name="__codelineno-0-282"></a> <span class="k">def</span> <span class="nf">get_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label_as_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10163
- <a id="__codelineno-0-283" name="__codelineno-0-283"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10164
- <a id="__codelineno-0-284" name="__codelineno-0-284"></a><span class="sd"> Return a dictionary of all computed fields and their rendered values for this model.</span>
10165
- <a id="__codelineno-0-285" name="__codelineno-0-285"></a><span class="sd"> Keys are the `key` value of each field. If label_as_key is True, `label` values of each field are used as keys.</span>
10166
- <a id="__codelineno-0-286" name="__codelineno-0-286"></a><span class="sd"> &quot;&quot;&quot;</span>
10167
- <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="n">computed_fields_dict</span> <span class="o">=</span> <span class="p">{}</span>
10168
- <a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10169
- <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10170
- <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10171
- <a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">computed_fields</span><span class="p">:</span>
10172
- <a id="__codelineno-0-292" name="__codelineno-0-292"></a> <span class="k">return</span> <span class="p">{}</span>
10173
- <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">computed_fields</span><span class="p">:</span>
10174
- <a id="__codelineno-0-294" name="__codelineno-0-294"></a> <span class="n">computed_fields_dict</span><span class="p">[</span><span class="n">cf</span><span class="o">.</span><span class="n">label</span> <span class="k">if</span> <span class="n">label_as_key</span> <span class="k">else</span> <span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">cf</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10175
- <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="k">return</span> <span class="n">computed_fields_dict</span>
10177
+ <a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="c1"># Check for missing values, erroring on required ones and populating non-required ones automatically</span>
10178
+ <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">custom_fields</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
10179
+ <a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="k">if</span> <span class="n">cf</span><span class="o">.</span><span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="p">:</span>
10180
+ <a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="k">if</span> <span class="n">cf</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10181
+ <a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_field_data</span><span class="p">[</span><span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">cf</span><span class="o">.</span><span class="n">default</span>
10182
+ <a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="k">elif</span> <span class="n">cf</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
10183
+ <a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Missing required custom field &#39;</span><span class="si">{</span><span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">&#39;.&quot;</span><span class="p">)</span>
10184
+ <a id="__codelineno-0-258" name="__codelineno-0-258"></a>
10185
+ <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="c1"># Computed Field Methods</span>
10186
+ <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="k">def</span> <span class="nf">has_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10187
+ <a id="__codelineno-0-261" name="__codelineno-0-261"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10188
+ <a id="__codelineno-0-262" name="__codelineno-0-262"></a><span class="sd"> Return a boolean indicating whether or not this content type has computed fields associated with it.</span>
10189
+ <a id="__codelineno-0-263" name="__codelineno-0-263"></a><span class="sd"> This can also check whether the advanced_ui attribute is True or False for UI display purposes.</span>
10190
+ <a id="__codelineno-0-264" name="__codelineno-0-264"></a><span class="sd"> &quot;&quot;&quot;</span>
10191
+ <a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10192
+ <a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10193
+ <a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10194
+ <a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="k">return</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
10195
+ <a id="__codelineno-0-269" name="__codelineno-0-269"></a>
10196
+ <a id="__codelineno-0-270" name="__codelineno-0-270"></a> <span class="k">def</span> <span class="nf">has_computed_fields_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10197
+ <a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_computed_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10198
+ <a id="__codelineno-0-272" name="__codelineno-0-272"></a>
10199
+ <a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="k">def</span> <span class="nf">has_computed_fields_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10200
+ <a id="__codelineno-0-274" name="__codelineno-0-274"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_computed_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10201
+ <a id="__codelineno-0-275" name="__codelineno-0-275"></a>
10202
+ <a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="k">def</span> <span class="nf">get_computed_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">render</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
10203
+ <a id="__codelineno-0-277" name="__codelineno-0-277"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10204
+ <a id="__codelineno-0-278" name="__codelineno-0-278"></a><span class="sd"> Get a computed field for this model, lookup via key.</span>
10205
+ <a id="__codelineno-0-279" name="__codelineno-0-279"></a><span class="sd"> Returns the template of this field if render is False, otherwise returns the rendered value.</span>
10206
+ <a id="__codelineno-0-280" name="__codelineno-0-280"></a><span class="sd"> &quot;&quot;&quot;</span>
10207
+ <a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="k">try</span><span class="p">:</span>
10208
+ <a id="__codelineno-0-282" name="__codelineno-0-282"></a> <span class="n">computed_field</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
10209
+ <a id="__codelineno-0-283" name="__codelineno-0-283"></a> <span class="k">except</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
10210
+ <a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Computed Field with key </span><span class="si">%s</span><span class="s2"> does not exist for model </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
10211
+ <a id="__codelineno-0-285" name="__codelineno-0-285"></a> <span class="k">return</span> <span class="kc">None</span>
10212
+ <a id="__codelineno-0-286" name="__codelineno-0-286"></a> <span class="k">if</span> <span class="n">render</span><span class="p">:</span>
10213
+ <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10214
+ <a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">template</span>
10215
+ <a id="__codelineno-0-289" name="__codelineno-0-289"></a>
10216
+ <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="k">def</span> <span class="nf">get_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label_as_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10217
+ <a id="__codelineno-0-291" name="__codelineno-0-291"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10218
+ <a id="__codelineno-0-292" name="__codelineno-0-292"></a><span class="sd"> Return a dictionary of all computed fields and their rendered values for this model.</span>
10219
+ <a id="__codelineno-0-293" name="__codelineno-0-293"></a><span class="sd"> Keys are the `key` value of each field. If label_as_key is True, `label` values of each field are used as keys.</span>
10220
+ <a id="__codelineno-0-294" name="__codelineno-0-294"></a><span class="sd"> &quot;&quot;&quot;</span>
10221
+ <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="n">computed_fields_dict</span> <span class="o">=</span> <span class="p">{}</span>
10222
+ <a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10223
+ <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10224
+ <a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10225
+ <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">computed_fields</span><span class="p">:</span>
10226
+ <a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="k">return</span> <span class="p">{}</span>
10227
+ <a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">computed_fields</span><span class="p">:</span>
10228
+ <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="n">computed_fields_dict</span><span class="p">[</span><span class="n">cf</span><span class="o">.</span><span class="n">label</span> <span class="k">if</span> <span class="n">label_as_key</span> <span class="k">else</span> <span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">cf</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10229
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">return</span> <span class="n">computed_fields_dict</span>
10176
10230
  </code></pre></div></td></tr></table></div>
10177
10231
  </details>
10178
10232
 
@@ -10249,31 +10303,31 @@ Returns the template of this field if render is False, otherwise returns the ren
10249
10303
 
10250
10304
  <details class="quote">
10251
10305
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10252
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-268">268</a></span>
10253
- <span class="normal"><a href="#__codelineno-0-269">269</a></span>
10254
- <span class="normal"><a href="#__codelineno-0-270">270</a></span>
10255
- <span class="normal"><a href="#__codelineno-0-271">271</a></span>
10256
- <span class="normal"><a href="#__codelineno-0-272">272</a></span>
10257
- <span class="normal"><a href="#__codelineno-0-273">273</a></span>
10258
- <span class="normal"><a href="#__codelineno-0-274">274</a></span>
10259
- <span class="normal"><a href="#__codelineno-0-275">275</a></span>
10260
- <span class="normal"><a href="#__codelineno-0-276">276</a></span>
10306
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-276">276</a></span>
10261
10307
  <span class="normal"><a href="#__codelineno-0-277">277</a></span>
10262
10308
  <span class="normal"><a href="#__codelineno-0-278">278</a></span>
10263
10309
  <span class="normal"><a href="#__codelineno-0-279">279</a></span>
10264
- <span class="normal"><a href="#__codelineno-0-280">280</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-268" name="__codelineno-0-268"></a><span class="k">def</span> <span class="nf">get_computed_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">render</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
10265
- <a id="__codelineno-0-269" name="__codelineno-0-269"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10266
- <a id="__codelineno-0-270" name="__codelineno-0-270"></a><span class="sd"> Get a computed field for this model, lookup via key.</span>
10267
- <a id="__codelineno-0-271" name="__codelineno-0-271"></a><span class="sd"> Returns the template of this field if render is False, otherwise returns the rendered value.</span>
10268
- <a id="__codelineno-0-272" name="__codelineno-0-272"></a><span class="sd"> &quot;&quot;&quot;</span>
10269
- <a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="k">try</span><span class="p">:</span>
10270
- <a id="__codelineno-0-274" name="__codelineno-0-274"></a> <span class="n">computed_field</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
10271
- <a id="__codelineno-0-275" name="__codelineno-0-275"></a> <span class="k">except</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
10272
- <a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Computed Field with key </span><span class="si">%s</span><span class="s2"> does not exist for model </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
10273
- <a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="k">return</span> <span class="kc">None</span>
10274
- <a id="__codelineno-0-278" name="__codelineno-0-278"></a> <span class="k">if</span> <span class="n">render</span><span class="p">:</span>
10275
- <a id="__codelineno-0-279" name="__codelineno-0-279"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10276
- <a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">template</span>
10310
+ <span class="normal"><a href="#__codelineno-0-280">280</a></span>
10311
+ <span class="normal"><a href="#__codelineno-0-281">281</a></span>
10312
+ <span class="normal"><a href="#__codelineno-0-282">282</a></span>
10313
+ <span class="normal"><a href="#__codelineno-0-283">283</a></span>
10314
+ <span class="normal"><a href="#__codelineno-0-284">284</a></span>
10315
+ <span class="normal"><a href="#__codelineno-0-285">285</a></span>
10316
+ <span class="normal"><a href="#__codelineno-0-286">286</a></span>
10317
+ <span class="normal"><a href="#__codelineno-0-287">287</a></span>
10318
+ <span class="normal"><a href="#__codelineno-0-288">288</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-276" name="__codelineno-0-276"></a><span class="k">def</span> <span class="nf">get_computed_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">render</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
10319
+ <a id="__codelineno-0-277" name="__codelineno-0-277"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10320
+ <a id="__codelineno-0-278" name="__codelineno-0-278"></a><span class="sd"> Get a computed field for this model, lookup via key.</span>
10321
+ <a id="__codelineno-0-279" name="__codelineno-0-279"></a><span class="sd"> Returns the template of this field if render is False, otherwise returns the rendered value.</span>
10322
+ <a id="__codelineno-0-280" name="__codelineno-0-280"></a><span class="sd"> &quot;&quot;&quot;</span>
10323
+ <a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="k">try</span><span class="p">:</span>
10324
+ <a id="__codelineno-0-282" name="__codelineno-0-282"></a> <span class="n">computed_field</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
10325
+ <a id="__codelineno-0-283" name="__codelineno-0-283"></a> <span class="k">except</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
10326
+ <a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Computed Field with key </span><span class="si">%s</span><span class="s2"> does not exist for model </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
10327
+ <a id="__codelineno-0-285" name="__codelineno-0-285"></a> <span class="k">return</span> <span class="kc">None</span>
10328
+ <a id="__codelineno-0-286" name="__codelineno-0-286"></a> <span class="k">if</span> <span class="n">render</span><span class="p">:</span>
10329
+ <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10330
+ <a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="k">return</span> <span class="n">computed_field</span><span class="o">.</span><span class="n">template</span>
10277
10331
  </code></pre></div></td></tr></table></div>
10278
10332
  </details>
10279
10333
  </div>
@@ -10298,33 +10352,33 @@ Keys are the <code>key</code> value of each field. If label_as_key is True, <cod
10298
10352
 
10299
10353
  <details class="quote">
10300
10354
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10301
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-282">282</a></span>
10302
- <span class="normal"><a href="#__codelineno-0-283">283</a></span>
10303
- <span class="normal"><a href="#__codelineno-0-284">284</a></span>
10304
- <span class="normal"><a href="#__codelineno-0-285">285</a></span>
10305
- <span class="normal"><a href="#__codelineno-0-286">286</a></span>
10306
- <span class="normal"><a href="#__codelineno-0-287">287</a></span>
10307
- <span class="normal"><a href="#__codelineno-0-288">288</a></span>
10308
- <span class="normal"><a href="#__codelineno-0-289">289</a></span>
10309
- <span class="normal"><a href="#__codelineno-0-290">290</a></span>
10355
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-290">290</a></span>
10310
10356
  <span class="normal"><a href="#__codelineno-0-291">291</a></span>
10311
10357
  <span class="normal"><a href="#__codelineno-0-292">292</a></span>
10312
10358
  <span class="normal"><a href="#__codelineno-0-293">293</a></span>
10313
10359
  <span class="normal"><a href="#__codelineno-0-294">294</a></span>
10314
- <span class="normal"><a href="#__codelineno-0-295">295</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-282" name="__codelineno-0-282"></a><span class="k">def</span> <span class="nf">get_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label_as_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10315
- <a id="__codelineno-0-283" name="__codelineno-0-283"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10316
- <a id="__codelineno-0-284" name="__codelineno-0-284"></a><span class="sd"> Return a dictionary of all computed fields and their rendered values for this model.</span>
10317
- <a id="__codelineno-0-285" name="__codelineno-0-285"></a><span class="sd"> Keys are the `key` value of each field. If label_as_key is True, `label` values of each field are used as keys.</span>
10318
- <a id="__codelineno-0-286" name="__codelineno-0-286"></a><span class="sd"> &quot;&quot;&quot;</span>
10319
- <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="n">computed_fields_dict</span> <span class="o">=</span> <span class="p">{}</span>
10320
- <a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10321
- <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10322
- <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10323
- <a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">computed_fields</span><span class="p">:</span>
10324
- <a id="__codelineno-0-292" name="__codelineno-0-292"></a> <span class="k">return</span> <span class="p">{}</span>
10325
- <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">computed_fields</span><span class="p">:</span>
10326
- <a id="__codelineno-0-294" name="__codelineno-0-294"></a> <span class="n">computed_fields_dict</span><span class="p">[</span><span class="n">cf</span><span class="o">.</span><span class="n">label</span> <span class="k">if</span> <span class="n">label_as_key</span> <span class="k">else</span> <span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">cf</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10327
- <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="k">return</span> <span class="n">computed_fields_dict</span>
10360
+ <span class="normal"><a href="#__codelineno-0-295">295</a></span>
10361
+ <span class="normal"><a href="#__codelineno-0-296">296</a></span>
10362
+ <span class="normal"><a href="#__codelineno-0-297">297</a></span>
10363
+ <span class="normal"><a href="#__codelineno-0-298">298</a></span>
10364
+ <span class="normal"><a href="#__codelineno-0-299">299</a></span>
10365
+ <span class="normal"><a href="#__codelineno-0-300">300</a></span>
10366
+ <span class="normal"><a href="#__codelineno-0-301">301</a></span>
10367
+ <span class="normal"><a href="#__codelineno-0-302">302</a></span>
10368
+ <span class="normal"><a href="#__codelineno-0-303">303</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-290" name="__codelineno-0-290"></a><span class="k">def</span> <span class="nf">get_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label_as_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10369
+ <a id="__codelineno-0-291" name="__codelineno-0-291"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10370
+ <a id="__codelineno-0-292" name="__codelineno-0-292"></a><span class="sd"> Return a dictionary of all computed fields and their rendered values for this model.</span>
10371
+ <a id="__codelineno-0-293" name="__codelineno-0-293"></a><span class="sd"> Keys are the `key` value of each field. If label_as_key is True, `label` values of each field are used as keys.</span>
10372
+ <a id="__codelineno-0-294" name="__codelineno-0-294"></a><span class="sd"> &quot;&quot;&quot;</span>
10373
+ <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="n">computed_fields_dict</span> <span class="o">=</span> <span class="p">{}</span>
10374
+ <a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10375
+ <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10376
+ <a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10377
+ <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">computed_fields</span><span class="p">:</span>
10378
+ <a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="k">return</span> <span class="p">{}</span>
10379
+ <a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="k">for</span> <span class="n">cf</span> <span class="ow">in</span> <span class="n">computed_fields</span><span class="p">:</span>
10380
+ <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="n">computed_fields_dict</span><span class="p">[</span><span class="n">cf</span><span class="o">.</span><span class="n">label</span> <span class="k">if</span> <span class="n">label_as_key</span> <span class="k">else</span> <span class="n">cf</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">cf</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">})</span>
10381
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">return</span> <span class="n">computed_fields_dict</span>
10328
10382
  </code></pre></div></td></tr></table></div>
10329
10383
  </details>
10330
10384
  </div>
@@ -10354,15 +10408,7 @@ Keys are the <code>key</code> value of each field. If label_as_key is True, <cod
10354
10408
 
10355
10409
  <details class="quote">
10356
10410
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10357
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-206">206</a></span>
10358
- <span class="normal"><a href="#__codelineno-0-207">207</a></span>
10359
- <span class="normal"><a href="#__codelineno-0-208">208</a></span>
10360
- <span class="normal"><a href="#__codelineno-0-209">209</a></span>
10361
- <span class="normal"><a href="#__codelineno-0-210">210</a></span>
10362
- <span class="normal"><a href="#__codelineno-0-211">211</a></span>
10363
- <span class="normal"><a href="#__codelineno-0-212">212</a></span>
10364
- <span class="normal"><a href="#__codelineno-0-213">213</a></span>
10365
- <span class="normal"><a href="#__codelineno-0-214">214</a></span>
10411
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-214">214</a></span>
10366
10412
  <span class="normal"><a href="#__codelineno-0-215">215</a></span>
10367
10413
  <span class="normal"><a href="#__codelineno-0-216">216</a></span>
10368
10414
  <span class="normal"><a href="#__codelineno-0-217">217</a></span>
@@ -10373,26 +10419,34 @@ Keys are the <code>key</code> value of each field. If label_as_key is True, <cod
10373
10419
  <span class="normal"><a href="#__codelineno-0-222">222</a></span>
10374
10420
  <span class="normal"><a href="#__codelineno-0-223">223</a></span>
10375
10421
  <span class="normal"><a href="#__codelineno-0-224">224</a></span>
10376
- <span class="normal"><a href="#__codelineno-0-225">225</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-206" name="__codelineno-0-206"></a><span class="k">def</span> <span class="nf">get_custom_field_groupings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10377
- <a id="__codelineno-0-207" name="__codelineno-0-207"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10378
- <a id="__codelineno-0-208" name="__codelineno-0-208"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10379
- <a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="sd"> {</span>
10380
- <a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10381
- <a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> ...</span>
10382
- <a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10383
- <a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="sd"> ...</span>
10384
- <a id="__codelineno-0-214" name="__codelineno-0-214"></a><span class="sd"> }</span>
10385
- <a id="__codelineno-0-215" name="__codelineno-0-215"></a><span class="sd"> &quot;&quot;&quot;</span>
10386
- <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="n">record</span> <span class="o">=</span> <span class="p">{}</span>
10387
- <a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10388
- <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10389
- <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10390
- <a id="__codelineno-0-220" name="__codelineno-0-220"></a>
10391
- <a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
10392
- <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
10393
- <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="n">record</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
10394
- <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="n">record</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
10395
- <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="k">return</span> <span class="n">record</span>
10422
+ <span class="normal"><a href="#__codelineno-0-225">225</a></span>
10423
+ <span class="normal"><a href="#__codelineno-0-226">226</a></span>
10424
+ <span class="normal"><a href="#__codelineno-0-227">227</a></span>
10425
+ <span class="normal"><a href="#__codelineno-0-228">228</a></span>
10426
+ <span class="normal"><a href="#__codelineno-0-229">229</a></span>
10427
+ <span class="normal"><a href="#__codelineno-0-230">230</a></span>
10428
+ <span class="normal"><a href="#__codelineno-0-231">231</a></span>
10429
+ <span class="normal"><a href="#__codelineno-0-232">232</a></span>
10430
+ <span class="normal"><a href="#__codelineno-0-233">233</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-214" name="__codelineno-0-214"></a><span class="k">def</span> <span class="nf">get_custom_field_groupings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10431
+ <a id="__codelineno-0-215" name="__codelineno-0-215"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10432
+ <a id="__codelineno-0-216" name="__codelineno-0-216"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10433
+ <a id="__codelineno-0-217" name="__codelineno-0-217"></a><span class="sd"> {</span>
10434
+ <a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10435
+ <a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="sd"> ...</span>
10436
+ <a id="__codelineno-0-220" name="__codelineno-0-220"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10437
+ <a id="__codelineno-0-221" name="__codelineno-0-221"></a><span class="sd"> ...</span>
10438
+ <a id="__codelineno-0-222" name="__codelineno-0-222"></a><span class="sd"> }</span>
10439
+ <a id="__codelineno-0-223" name="__codelineno-0-223"></a><span class="sd"> &quot;&quot;&quot;</span>
10440
+ <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="n">record</span> <span class="o">=</span> <span class="p">{}</span>
10441
+ <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10442
+ <a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10443
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10444
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a>
10445
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
10446
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
10447
+ <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="n">record</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
10448
+ <a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="n">record</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
10449
+ <a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="k">return</span> <span class="n">record</span>
10396
10450
  </code></pre></div></td></tr></table></div>
10397
10451
  </details>
10398
10452
  </div>
@@ -10424,31 +10478,31 @@ which have advanced_ui set to True</p>
10424
10478
 
10425
10479
  <details class="quote">
10426
10480
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10427
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-192">192</a></span>
10428
- <span class="normal"><a href="#__codelineno-0-193">193</a></span>
10429
- <span class="normal"><a href="#__codelineno-0-194">194</a></span>
10430
- <span class="normal"><a href="#__codelineno-0-195">195</a></span>
10431
- <span class="normal"><a href="#__codelineno-0-196">196</a></span>
10432
- <span class="normal"><a href="#__codelineno-0-197">197</a></span>
10433
- <span class="normal"><a href="#__codelineno-0-198">198</a></span>
10434
- <span class="normal"><a href="#__codelineno-0-199">199</a></span>
10435
- <span class="normal"><a href="#__codelineno-0-200">200</a></span>
10481
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-200">200</a></span>
10436
10482
  <span class="normal"><a href="#__codelineno-0-201">201</a></span>
10437
10483
  <span class="normal"><a href="#__codelineno-0-202">202</a></span>
10438
10484
  <span class="normal"><a href="#__codelineno-0-203">203</a></span>
10439
- <span class="normal"><a href="#__codelineno-0-204">204</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="k">def</span> <span class="nf">get_custom_field_groupings_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10440
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10441
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10442
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10443
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> {</span>
10444
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10445
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="sd"> ...</span>
10446
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10447
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a><span class="sd"> ...</span>
10448
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="sd"> }</span>
10449
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> which have advanced_ui set to True</span>
10450
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> &quot;&quot;&quot;</span>
10451
- <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10485
+ <span class="normal"><a href="#__codelineno-0-204">204</a></span>
10486
+ <span class="normal"><a href="#__codelineno-0-205">205</a></span>
10487
+ <span class="normal"><a href="#__codelineno-0-206">206</a></span>
10488
+ <span class="normal"><a href="#__codelineno-0-207">207</a></span>
10489
+ <span class="normal"><a href="#__codelineno-0-208">208</a></span>
10490
+ <span class="normal"><a href="#__codelineno-0-209">209</a></span>
10491
+ <span class="normal"><a href="#__codelineno-0-210">210</a></span>
10492
+ <span class="normal"><a href="#__codelineno-0-211">211</a></span>
10493
+ <span class="normal"><a href="#__codelineno-0-212">212</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-200" name="__codelineno-0-200"></a><span class="k">def</span> <span class="nf">get_custom_field_groupings_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10494
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10495
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10496
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10497
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a><span class="sd"> {</span>
10498
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10499
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a><span class="sd"> ...</span>
10500
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10501
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a><span class="sd"> ...</span>
10502
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="sd"> }</span>
10503
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="sd"> which have advanced_ui set to True</span>
10504
+ <a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> &quot;&quot;&quot;</span>
10505
+ <a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10452
10506
  </code></pre></div></td></tr></table></div>
10453
10507
  </details>
10454
10508
  </div>
@@ -10480,31 +10534,31 @@ which have advanced_ui set to False</p>
10480
10534
 
10481
10535
  <details class="quote">
10482
10536
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10483
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-178">178</a></span>
10484
- <span class="normal"><a href="#__codelineno-0-179">179</a></span>
10485
- <span class="normal"><a href="#__codelineno-0-180">180</a></span>
10486
- <span class="normal"><a href="#__codelineno-0-181">181</a></span>
10487
- <span class="normal"><a href="#__codelineno-0-182">182</a></span>
10488
- <span class="normal"><a href="#__codelineno-0-183">183</a></span>
10489
- <span class="normal"><a href="#__codelineno-0-184">184</a></span>
10490
- <span class="normal"><a href="#__codelineno-0-185">185</a></span>
10491
- <span class="normal"><a href="#__codelineno-0-186">186</a></span>
10537
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-186">186</a></span>
10492
10538
  <span class="normal"><a href="#__codelineno-0-187">187</a></span>
10493
10539
  <span class="normal"><a href="#__codelineno-0-188">188</a></span>
10494
10540
  <span class="normal"><a href="#__codelineno-0-189">189</a></span>
10495
- <span class="normal"><a href="#__codelineno-0-190">190</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="k">def</span> <span class="nf">get_custom_field_groupings_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10496
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10497
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10498
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10499
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> {</span>
10500
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10501
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> ...</span>
10502
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10503
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="sd"> ...</span>
10504
- <a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="sd"> }</span>
10505
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="sd"> which have advanced_ui set to False</span>
10506
- <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="sd"> &quot;&quot;&quot;</span>
10507
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10541
+ <span class="normal"><a href="#__codelineno-0-190">190</a></span>
10542
+ <span class="normal"><a href="#__codelineno-0-191">191</a></span>
10543
+ <span class="normal"><a href="#__codelineno-0-192">192</a></span>
10544
+ <span class="normal"><a href="#__codelineno-0-193">193</a></span>
10545
+ <span class="normal"><a href="#__codelineno-0-194">194</a></span>
10546
+ <span class="normal"><a href="#__codelineno-0-195">195</a></span>
10547
+ <span class="normal"><a href="#__codelineno-0-196">196</a></span>
10548
+ <span class="normal"><a href="#__codelineno-0-197">197</a></span>
10549
+ <span class="normal"><a href="#__codelineno-0-198">198</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="k">def</span> <span class="nf">get_custom_field_groupings_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10550
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10551
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="sd"> This method exists to help call get_custom_field_groupings() in templates where a function argument (advanced_ui) cannot be specified.</span>
10552
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="sd"> Return a dictonary of custom fields grouped by the same grouping in the form</span>
10553
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="sd"> {</span>
10554
+ <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> &lt;grouping_1&gt;: [(cf1, &lt;value for cf1&gt;), (cf2, &lt;value for cf2&gt;), ...],</span>
10555
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> ...</span>
10556
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> &lt;grouping_5&gt;: [(cf8, &lt;value for cf8&gt;), (cf9, &lt;value for cf9&gt;), ...],</span>
10557
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> ...</span>
10558
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> }</span>
10559
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> which have advanced_ui set to False</span>
10560
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> &quot;&quot;&quot;</span>
10561
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_field_groupings</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10508
10562
  </code></pre></div></td></tr></table></div>
10509
10563
  </details>
10510
10564
  </div>
@@ -10528,21 +10582,21 @@ which have advanced_ui set to False</p>
10528
10582
 
10529
10583
  <details class="quote">
10530
10584
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10531
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-169">169</a></span>
10532
- <span class="normal"><a href="#__codelineno-0-170">170</a></span>
10533
- <span class="normal"><a href="#__codelineno-0-171">171</a></span>
10534
- <span class="normal"><a href="#__codelineno-0-172">172</a></span>
10535
- <span class="normal"><a href="#__codelineno-0-173">173</a></span>
10536
- <span class="normal"><a href="#__codelineno-0-174">174</a></span>
10537
- <span class="normal"><a href="#__codelineno-0-175">175</a></span>
10538
- <span class="normal"><a href="#__codelineno-0-176">176</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-169" name="__codelineno-0-169"></a><span class="k">def</span> <span class="nf">get_custom_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10539
- <a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10540
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}.</span>
10541
- <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> &quot;&quot;&quot;</span>
10542
- <a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10543
- <a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10544
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10545
- <a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">return</span> <span class="n">OrderedDict</span><span class="p">([(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">])</span>
10585
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-177">177</a></span>
10586
+ <span class="normal"><a href="#__codelineno-0-178">178</a></span>
10587
+ <span class="normal"><a href="#__codelineno-0-179">179</a></span>
10588
+ <span class="normal"><a href="#__codelineno-0-180">180</a></span>
10589
+ <span class="normal"><a href="#__codelineno-0-181">181</a></span>
10590
+ <span class="normal"><a href="#__codelineno-0-182">182</a></span>
10591
+ <span class="normal"><a href="#__codelineno-0-183">183</a></span>
10592
+ <span class="normal"><a href="#__codelineno-0-184">184</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="k">def</span> <span class="nf">get_custom_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10593
+ <a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10594
+ <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}.</span>
10595
+ <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> &quot;&quot;&quot;</span>
10596
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">CustomField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10597
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10598
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10599
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="k">return</span> <span class="n">OrderedDict</span><span class="p">([(</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">key</span><span class="p">))</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">])</span>
10546
10600
  </code></pre></div></td></tr></table></div>
10547
10601
  </details>
10548
10602
  </div>
@@ -10568,19 +10622,19 @@ which have advanced_ui set to True</p>
10568
10622
 
10569
10623
  <details class="quote">
10570
10624
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10571
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-161">161</a></span>
10572
- <span class="normal"><a href="#__codelineno-0-162">162</a></span>
10573
- <span class="normal"><a href="#__codelineno-0-163">163</a></span>
10574
- <span class="normal"><a href="#__codelineno-0-164">164</a></span>
10575
- <span class="normal"><a href="#__codelineno-0-165">165</a></span>
10576
- <span class="normal"><a href="#__codelineno-0-166">166</a></span>
10577
- <span class="normal"><a href="#__codelineno-0-167">167</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="k">def</span> <span class="nf">get_custom_fields_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10578
- <a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10579
- <a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10580
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10581
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> which have advanced_ui set to True</span>
10582
- <a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> &quot;&quot;&quot;</span>
10583
- <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10625
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-169">169</a></span>
10626
+ <span class="normal"><a href="#__codelineno-0-170">170</a></span>
10627
+ <span class="normal"><a href="#__codelineno-0-171">171</a></span>
10628
+ <span class="normal"><a href="#__codelineno-0-172">172</a></span>
10629
+ <span class="normal"><a href="#__codelineno-0-173">173</a></span>
10630
+ <span class="normal"><a href="#__codelineno-0-174">174</a></span>
10631
+ <span class="normal"><a href="#__codelineno-0-175">175</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-169" name="__codelineno-0-169"></a><span class="k">def</span> <span class="nf">get_custom_fields_advanced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10632
+ <a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10633
+ <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10634
+ <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10635
+ <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="sd"> which have advanced_ui set to True</span>
10636
+ <a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="sd"> &quot;&quot;&quot;</span>
10637
+ <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
10584
10638
  </code></pre></div></td></tr></table></div>
10585
10639
  </details>
10586
10640
  </div>
@@ -10606,19 +10660,19 @@ which have advanced_ui set to False</p>
10606
10660
 
10607
10661
  <details class="quote">
10608
10662
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10609
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-153">153</a></span>
10610
- <span class="normal"><a href="#__codelineno-0-154">154</a></span>
10611
- <span class="normal"><a href="#__codelineno-0-155">155</a></span>
10612
- <span class="normal"><a href="#__codelineno-0-156">156</a></span>
10613
- <span class="normal"><a href="#__codelineno-0-157">157</a></span>
10614
- <span class="normal"><a href="#__codelineno-0-158">158</a></span>
10615
- <span class="normal"><a href="#__codelineno-0-159">159</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="k">def</span> <span class="nf">get_custom_fields_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10616
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10617
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10618
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10619
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> which have advanced_ui set to False</span>
10620
- <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> &quot;&quot;&quot;</span>
10621
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10663
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-161">161</a></span>
10664
+ <span class="normal"><a href="#__codelineno-0-162">162</a></span>
10665
+ <span class="normal"><a href="#__codelineno-0-163">163</a></span>
10666
+ <span class="normal"><a href="#__codelineno-0-164">164</a></span>
10667
+ <span class="normal"><a href="#__codelineno-0-165">165</a></span>
10668
+ <span class="normal"><a href="#__codelineno-0-166">166</a></span>
10669
+ <span class="normal"><a href="#__codelineno-0-167">167</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="k">def</span> <span class="nf">get_custom_fields_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10670
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10671
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> This method exists to help call get_custom_fields() in templates where a function argument (advanced_ui) cannot be specified.</span>
10672
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> Return a dictionary of custom fields for a single object in the form {&lt;field&gt;: value}</span>
10673
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> which have advanced_ui set to False</span>
10674
+ <a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> &quot;&quot;&quot;</span>
10675
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_custom_fields</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
10622
10676
  </code></pre></div></td></tr></table></div>
10623
10677
  </details>
10624
10678
  </div>
@@ -10643,23 +10697,23 @@ This can also check whether the advanced_ui attribute is True or False for UI di
10643
10697
 
10644
10698
  <details class="quote">
10645
10699
  <summary>Source code in <code>nautobot/extras/models/customfields.py</code></summary>
10646
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-252">252</a></span>
10647
- <span class="normal"><a href="#__codelineno-0-253">253</a></span>
10648
- <span class="normal"><a href="#__codelineno-0-254">254</a></span>
10649
- <span class="normal"><a href="#__codelineno-0-255">255</a></span>
10650
- <span class="normal"><a href="#__codelineno-0-256">256</a></span>
10651
- <span class="normal"><a href="#__codelineno-0-257">257</a></span>
10652
- <span class="normal"><a href="#__codelineno-0-258">258</a></span>
10653
- <span class="normal"><a href="#__codelineno-0-259">259</a></span>
10654
- <span class="normal"><a href="#__codelineno-0-260">260</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-252" name="__codelineno-0-252"></a><span class="k">def</span> <span class="nf">has_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10655
- <a id="__codelineno-0-253" name="__codelineno-0-253"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10656
- <a id="__codelineno-0-254" name="__codelineno-0-254"></a><span class="sd"> Return a boolean indicating whether or not this content type has computed fields associated with it.</span>
10657
- <a id="__codelineno-0-255" name="__codelineno-0-255"></a><span class="sd"> This can also check whether the advanced_ui attribute is True or False for UI display purposes.</span>
10658
- <a id="__codelineno-0-256" name="__codelineno-0-256"></a><span class="sd"> &quot;&quot;&quot;</span>
10659
- <a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10660
- <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10661
- <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10662
- <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="k">return</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
10700
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-260">260</a></span>
10701
+ <span class="normal"><a href="#__codelineno-0-261">261</a></span>
10702
+ <span class="normal"><a href="#__codelineno-0-262">262</a></span>
10703
+ <span class="normal"><a href="#__codelineno-0-263">263</a></span>
10704
+ <span class="normal"><a href="#__codelineno-0-264">264</a></span>
10705
+ <span class="normal"><a href="#__codelineno-0-265">265</a></span>
10706
+ <span class="normal"><a href="#__codelineno-0-266">266</a></span>
10707
+ <span class="normal"><a href="#__codelineno-0-267">267</a></span>
10708
+ <span class="normal"><a href="#__codelineno-0-268">268</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-260" name="__codelineno-0-260"></a><span class="k">def</span> <span class="nf">has_computed_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10709
+ <a id="__codelineno-0-261" name="__codelineno-0-261"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10710
+ <a id="__codelineno-0-262" name="__codelineno-0-262"></a><span class="sd"> Return a boolean indicating whether or not this content type has computed fields associated with it.</span>
10711
+ <a id="__codelineno-0-263" name="__codelineno-0-263"></a><span class="sd"> This can also check whether the advanced_ui attribute is True or False for UI display purposes.</span>
10712
+ <a id="__codelineno-0-264" name="__codelineno-0-264"></a><span class="sd"> &quot;&quot;&quot;</span>
10713
+ <a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">ComputedField</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
10714
+ <a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
10715
+ <a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="n">computed_fields</span> <span class="o">=</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
10716
+ <a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="k">return</span> <span class="n">computed_fields</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
10663
10717
  </code></pre></div></td></tr></table></div>
10664
10718
  </details>
10665
10719
  </div>
@@ -10697,15 +10751,7 @@ should be set as a string in the form <code>&lt;app_label&gt;.&lt;model_name&gt;
10697
10751
 
10698
10752
  <details class="quote">
10699
10753
  <summary>Source code in <code>nautobot/extras/plugins/__init__.py</code></summary>
10700
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-527">527</a></span>
10701
- <span class="normal"><a href="#__codelineno-0-528">528</a></span>
10702
- <span class="normal"><a href="#__codelineno-0-529">529</a></span>
10703
- <span class="normal"><a href="#__codelineno-0-530">530</a></span>
10704
- <span class="normal"><a href="#__codelineno-0-531">531</a></span>
10705
- <span class="normal"><a href="#__codelineno-0-532">532</a></span>
10706
- <span class="normal"><a href="#__codelineno-0-533">533</a></span>
10707
- <span class="normal"><a href="#__codelineno-0-534">534</a></span>
10708
- <span class="normal"><a href="#__codelineno-0-535">535</a></span>
10754
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-535">535</a></span>
10709
10755
  <span class="normal"><a href="#__codelineno-0-536">536</a></span>
10710
10756
  <span class="normal"><a href="#__codelineno-0-537">537</a></span>
10711
10757
  <span class="normal"><a href="#__codelineno-0-538">538</a></span>
@@ -10727,37 +10773,45 @@ should be set as a string in the form <code>&lt;app_label&gt;.&lt;model_name&gt;
10727
10773
  <span class="normal"><a href="#__codelineno-0-554">554</a></span>
10728
10774
  <span class="normal"><a href="#__codelineno-0-555">555</a></span>
10729
10775
  <span class="normal"><a href="#__codelineno-0-556">556</a></span>
10730
- <span class="normal"><a href="#__codelineno-0-557">557</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-527" name="__codelineno-0-527"></a><span class="k">class</span> <span class="nc">CustomValidator</span><span class="p">:</span>
10731
- <a id="__codelineno-0-528" name="__codelineno-0-528"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10732
- <a id="__codelineno-0-529" name="__codelineno-0-529"></a><span class="sd"> This class is used to register plugin custom model validators which act on specified models. It contains the clean</span>
10733
- <a id="__codelineno-0-530" name="__codelineno-0-530"></a><span class="sd"> method which is overridden by plugin authors to execute custom validation logic. Plugin authors must raise</span>
10734
- <a id="__codelineno-0-531" name="__codelineno-0-531"></a><span class="sd"> ValidationError within this method to trigger validation error messages which are propagated to the user.</span>
10735
- <a id="__codelineno-0-532" name="__codelineno-0-532"></a><span class="sd"> A convenience method `validation_error(&lt;message&gt;)` may be used for this purpose.</span>
10736
- <a id="__codelineno-0-533" name="__codelineno-0-533"></a>
10737
- <a id="__codelineno-0-534" name="__codelineno-0-534"></a><span class="sd"> The `model` attribute on the class defines the model to which this validator is registered. It</span>
10738
- <a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="sd"> should be set as a string in the form `&lt;app_label&gt;.&lt;model_name&gt;`.</span>
10739
- <a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="sd"> &quot;&quot;&quot;</span>
10740
- <a id="__codelineno-0-537" name="__codelineno-0-537"></a>
10741
- <a id="__codelineno-0-538" name="__codelineno-0-538"></a> <span class="n">model</span> <span class="o">=</span> <span class="kc">None</span>
10742
- <a id="__codelineno-0-539" name="__codelineno-0-539"></a>
10743
- <a id="__codelineno-0-540" name="__codelineno-0-540"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
10744
- <a id="__codelineno-0-541" name="__codelineno-0-541"></a> <span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="n">obj</span><span class="p">}</span>
10745
- <a id="__codelineno-0-542" name="__codelineno-0-542"></a>
10746
- <a id="__codelineno-0-543" name="__codelineno-0-543"></a> <span class="k">def</span> <span class="nf">validation_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
10747
- <a id="__codelineno-0-544" name="__codelineno-0-544"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10748
- <a id="__codelineno-0-545" name="__codelineno-0-545"></a><span class="sd"> Convenience method for raising `django.core.exceptions.ValidationError` which is required in order to</span>
10749
- <a id="__codelineno-0-546" name="__codelineno-0-546"></a><span class="sd"> trigger validation error messages which are propagated to the user.</span>
10750
- <a id="__codelineno-0-547" name="__codelineno-0-547"></a><span class="sd"> &quot;&quot;&quot;</span>
10751
- <a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
10752
- <a id="__codelineno-0-549" name="__codelineno-0-549"></a>
10753
- <a id="__codelineno-0-550" name="__codelineno-0-550"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10754
- <a id="__codelineno-0-551" name="__codelineno-0-551"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10755
- <a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="sd"> Implement custom model validation in the standard Django clean method pattern. The model instance is accessed</span>
10756
- <a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd"> with the `object` key within `self.context`, e.g. `self.context[&#39;object&#39;]`. ValidationError must be raised to</span>
10757
- <a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd"> prevent saving model instance changes, and propagate messages to the user. For convenience,</span>
10758
- <a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd"> `self.validation_error(&lt;message&gt;)` may be called to raise a ValidationError.</span>
10759
- <a id="__codelineno-0-556" name="__codelineno-0-556"></a><span class="sd"> &quot;&quot;&quot;</span>
10760
- <a id="__codelineno-0-557" name="__codelineno-0-557"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
10776
+ <span class="normal"><a href="#__codelineno-0-557">557</a></span>
10777
+ <span class="normal"><a href="#__codelineno-0-558">558</a></span>
10778
+ <span class="normal"><a href="#__codelineno-0-559">559</a></span>
10779
+ <span class="normal"><a href="#__codelineno-0-560">560</a></span>
10780
+ <span class="normal"><a href="#__codelineno-0-561">561</a></span>
10781
+ <span class="normal"><a href="#__codelineno-0-562">562</a></span>
10782
+ <span class="normal"><a href="#__codelineno-0-563">563</a></span>
10783
+ <span class="normal"><a href="#__codelineno-0-564">564</a></span>
10784
+ <span class="normal"><a href="#__codelineno-0-565">565</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="k">class</span> <span class="nc">CustomValidator</span><span class="p">:</span>
10785
+ <a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10786
+ <a id="__codelineno-0-537" name="__codelineno-0-537"></a><span class="sd"> This class is used to register plugin custom model validators which act on specified models. It contains the clean</span>
10787
+ <a id="__codelineno-0-538" name="__codelineno-0-538"></a><span class="sd"> method which is overridden by plugin authors to execute custom validation logic. Plugin authors must raise</span>
10788
+ <a id="__codelineno-0-539" name="__codelineno-0-539"></a><span class="sd"> ValidationError within this method to trigger validation error messages which are propagated to the user.</span>
10789
+ <a id="__codelineno-0-540" name="__codelineno-0-540"></a><span class="sd"> A convenience method `validation_error(&lt;message&gt;)` may be used for this purpose.</span>
10790
+ <a id="__codelineno-0-541" name="__codelineno-0-541"></a>
10791
+ <a id="__codelineno-0-542" name="__codelineno-0-542"></a><span class="sd"> The `model` attribute on the class defines the model to which this validator is registered. It</span>
10792
+ <a id="__codelineno-0-543" name="__codelineno-0-543"></a><span class="sd"> should be set as a string in the form `&lt;app_label&gt;.&lt;model_name&gt;`.</span>
10793
+ <a id="__codelineno-0-544" name="__codelineno-0-544"></a><span class="sd"> &quot;&quot;&quot;</span>
10794
+ <a id="__codelineno-0-545" name="__codelineno-0-545"></a>
10795
+ <a id="__codelineno-0-546" name="__codelineno-0-546"></a> <span class="n">model</span> <span class="o">=</span> <span class="kc">None</span>
10796
+ <a id="__codelineno-0-547" name="__codelineno-0-547"></a>
10797
+ <a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
10798
+ <a id="__codelineno-0-549" name="__codelineno-0-549"></a> <span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="n">obj</span><span class="p">}</span>
10799
+ <a id="__codelineno-0-550" name="__codelineno-0-550"></a>
10800
+ <a id="__codelineno-0-551" name="__codelineno-0-551"></a> <span class="k">def</span> <span class="nf">validation_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
10801
+ <a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10802
+ <a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd"> Convenience method for raising `django.core.exceptions.ValidationError` which is required in order to</span>
10803
+ <a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd"> trigger validation error messages which are propagated to the user.</span>
10804
+ <a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd"> &quot;&quot;&quot;</span>
10805
+ <a id="__codelineno-0-556" name="__codelineno-0-556"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
10806
+ <a id="__codelineno-0-557" name="__codelineno-0-557"></a>
10807
+ <a id="__codelineno-0-558" name="__codelineno-0-558"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10808
+ <a id="__codelineno-0-559" name="__codelineno-0-559"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10809
+ <a id="__codelineno-0-560" name="__codelineno-0-560"></a><span class="sd"> Implement custom model validation in the standard Django clean method pattern. The model instance is accessed</span>
10810
+ <a id="__codelineno-0-561" name="__codelineno-0-561"></a><span class="sd"> with the `object` key within `self.context`, e.g. `self.context[&#39;object&#39;]`. ValidationError must be raised to</span>
10811
+ <a id="__codelineno-0-562" name="__codelineno-0-562"></a><span class="sd"> prevent saving model instance changes, and propagate messages to the user. For convenience,</span>
10812
+ <a id="__codelineno-0-563" name="__codelineno-0-563"></a><span class="sd"> `self.validation_error(&lt;message&gt;)` may be called to raise a ValidationError.</span>
10813
+ <a id="__codelineno-0-564" name="__codelineno-0-564"></a><span class="sd"> &quot;&quot;&quot;</span>
10814
+ <a id="__codelineno-0-565" name="__codelineno-0-565"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
10761
10815
  </code></pre></div></td></tr></table></div>
10762
10816
  </details>
10763
10817
 
@@ -10793,21 +10847,21 @@ prevent saving model instance changes, and propagate messages to the user. For c
10793
10847
 
10794
10848
  <details class="quote">
10795
10849
  <summary>Source code in <code>nautobot/extras/plugins/__init__.py</code></summary>
10796
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-550">550</a></span>
10797
- <span class="normal"><a href="#__codelineno-0-551">551</a></span>
10798
- <span class="normal"><a href="#__codelineno-0-552">552</a></span>
10799
- <span class="normal"><a href="#__codelineno-0-553">553</a></span>
10800
- <span class="normal"><a href="#__codelineno-0-554">554</a></span>
10801
- <span class="normal"><a href="#__codelineno-0-555">555</a></span>
10802
- <span class="normal"><a href="#__codelineno-0-556">556</a></span>
10803
- <span class="normal"><a href="#__codelineno-0-557">557</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-550" name="__codelineno-0-550"></a><span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10804
- <a id="__codelineno-0-551" name="__codelineno-0-551"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10805
- <a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="sd"> Implement custom model validation in the standard Django clean method pattern. The model instance is accessed</span>
10806
- <a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd"> with the `object` key within `self.context`, e.g. `self.context[&#39;object&#39;]`. ValidationError must be raised to</span>
10807
- <a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd"> prevent saving model instance changes, and propagate messages to the user. For convenience,</span>
10808
- <a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd"> `self.validation_error(&lt;message&gt;)` may be called to raise a ValidationError.</span>
10809
- <a id="__codelineno-0-556" name="__codelineno-0-556"></a><span class="sd"> &quot;&quot;&quot;</span>
10810
- <a id="__codelineno-0-557" name="__codelineno-0-557"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
10850
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-558">558</a></span>
10851
+ <span class="normal"><a href="#__codelineno-0-559">559</a></span>
10852
+ <span class="normal"><a href="#__codelineno-0-560">560</a></span>
10853
+ <span class="normal"><a href="#__codelineno-0-561">561</a></span>
10854
+ <span class="normal"><a href="#__codelineno-0-562">562</a></span>
10855
+ <span class="normal"><a href="#__codelineno-0-563">563</a></span>
10856
+ <span class="normal"><a href="#__codelineno-0-564">564</a></span>
10857
+ <span class="normal"><a href="#__codelineno-0-565">565</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-558" name="__codelineno-0-558"></a><span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
10858
+ <a id="__codelineno-0-559" name="__codelineno-0-559"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10859
+ <a id="__codelineno-0-560" name="__codelineno-0-560"></a><span class="sd"> Implement custom model validation in the standard Django clean method pattern. The model instance is accessed</span>
10860
+ <a id="__codelineno-0-561" name="__codelineno-0-561"></a><span class="sd"> with the `object` key within `self.context`, e.g. `self.context[&#39;object&#39;]`. ValidationError must be raised to</span>
10861
+ <a id="__codelineno-0-562" name="__codelineno-0-562"></a><span class="sd"> prevent saving model instance changes, and propagate messages to the user. For convenience,</span>
10862
+ <a id="__codelineno-0-563" name="__codelineno-0-563"></a><span class="sd"> `self.validation_error(&lt;message&gt;)` may be called to raise a ValidationError.</span>
10863
+ <a id="__codelineno-0-564" name="__codelineno-0-564"></a><span class="sd"> &quot;&quot;&quot;</span>
10864
+ <a id="__codelineno-0-565" name="__codelineno-0-565"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
10811
10865
  </code></pre></div></td></tr></table></div>
10812
10866
  </details>
10813
10867
  </div>
@@ -10832,17 +10886,17 @@ trigger validation error messages which are propagated to the user.</p>
10832
10886
 
10833
10887
  <details class="quote">
10834
10888
  <summary>Source code in <code>nautobot/extras/plugins/__init__.py</code></summary>
10835
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-543">543</a></span>
10836
- <span class="normal"><a href="#__codelineno-0-544">544</a></span>
10837
- <span class="normal"><a href="#__codelineno-0-545">545</a></span>
10838
- <span class="normal"><a href="#__codelineno-0-546">546</a></span>
10839
- <span class="normal"><a href="#__codelineno-0-547">547</a></span>
10840
- <span class="normal"><a href="#__codelineno-0-548">548</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-543" name="__codelineno-0-543"></a><span class="k">def</span> <span class="nf">validation_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
10841
- <a id="__codelineno-0-544" name="__codelineno-0-544"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10842
- <a id="__codelineno-0-545" name="__codelineno-0-545"></a><span class="sd"> Convenience method for raising `django.core.exceptions.ValidationError` which is required in order to</span>
10843
- <a id="__codelineno-0-546" name="__codelineno-0-546"></a><span class="sd"> trigger validation error messages which are propagated to the user.</span>
10844
- <a id="__codelineno-0-547" name="__codelineno-0-547"></a><span class="sd"> &quot;&quot;&quot;</span>
10845
- <a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
10889
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-551">551</a></span>
10890
+ <span class="normal"><a href="#__codelineno-0-552">552</a></span>
10891
+ <span class="normal"><a href="#__codelineno-0-553">553</a></span>
10892
+ <span class="normal"><a href="#__codelineno-0-554">554</a></span>
10893
+ <span class="normal"><a href="#__codelineno-0-555">555</a></span>
10894
+ <span class="normal"><a href="#__codelineno-0-556">556</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-551" name="__codelineno-0-551"></a><span class="k">def</span> <span class="nf">validation_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
10895
+ <a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10896
+ <a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd"> Convenience method for raising `django.core.exceptions.ValidationError` which is required in order to</span>
10897
+ <a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd"> trigger validation error messages which are propagated to the user.</span>
10898
+ <a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd"> &quot;&quot;&quot;</span>
10899
+ <a id="__codelineno-0-556" name="__codelineno-0-556"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
10846
10900
  </code></pre></div></td></tr></table></div>
10847
10901
  </details>
10848
10902
  </div>
@@ -15621,27 +15675,51 @@ having to define it on the model yourself.</p>
15621
15675
 
15622
15676
  <details class="quote">
15623
15677
  <summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
15624
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-53">53</a></span>
15625
- <span class="normal"><a href="#__codelineno-0-54">54</a></span>
15626
- <span class="normal"><a href="#__codelineno-0-55">55</a></span>
15627
- <span class="normal"><a href="#__codelineno-0-56">56</a></span>
15628
- <span class="normal"><a href="#__codelineno-0-57">57</a></span>
15629
- <span class="normal"><a href="#__codelineno-0-58">58</a></span>
15630
- <span class="normal"><a href="#__codelineno-0-59">59</a></span>
15631
- <span class="normal"><a href="#__codelineno-0-60">60</a></span>
15632
- <span class="normal"><a href="#__codelineno-0-61">61</a></span>
15633
- <span class="normal"><a href="#__codelineno-0-62">62</a></span>
15634
- <span class="normal"><a href="#__codelineno-0-63">63</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="k">class</span> <span class="nc">TreeManager</span><span class="p">(</span><span class="n">TreeManager_</span><span class="p">,</span> <span class="n">BaseManager</span><span class="o">.</span><span class="n">from_queryset</span><span class="p">(</span><span class="n">TreeQuerySet</span><span class="p">)):</span>
15635
- <a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15636
- <a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> Extend django-tree-queries&#39; TreeManager to incorporate RestrictedQuerySet.</span>
15637
- <a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> &quot;&quot;&quot;</span>
15638
- <a id="__codelineno-0-57" name="__codelineno-0-57"></a>
15639
- <a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="n">_with_tree_fields</span> <span class="o">=</span> <span class="kc">True</span>
15640
- <a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="n">use_in_migrations</span> <span class="o">=</span> <span class="kc">True</span>
15641
- <a id="__codelineno-0-60" name="__codelineno-0-60"></a>
15642
- <a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="nd">@cached_property</span>
15643
- <a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="k">def</span> <span class="nf">max_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15644
- <a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_tree_depth</span><span class="p">()</span>
15678
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-63">63</a></span>
15679
+ <span class="normal"><a href="#__codelineno-0-64">64</a></span>
15680
+ <span class="normal"><a href="#__codelineno-0-65">65</a></span>
15681
+ <span class="normal"><a href="#__codelineno-0-66">66</a></span>
15682
+ <span class="normal"><a href="#__codelineno-0-67">67</a></span>
15683
+ <span class="normal"><a href="#__codelineno-0-68">68</a></span>
15684
+ <span class="normal"><a href="#__codelineno-0-69">69</a></span>
15685
+ <span class="normal"><a href="#__codelineno-0-70">70</a></span>
15686
+ <span class="normal"><a href="#__codelineno-0-71">71</a></span>
15687
+ <span class="normal"><a href="#__codelineno-0-72">72</a></span>
15688
+ <span class="normal"><a href="#__codelineno-0-73">73</a></span>
15689
+ <span class="normal"><a href="#__codelineno-0-74">74</a></span>
15690
+ <span class="normal"><a href="#__codelineno-0-75">75</a></span>
15691
+ <span class="normal"><a href="#__codelineno-0-76">76</a></span>
15692
+ <span class="normal"><a href="#__codelineno-0-77">77</a></span>
15693
+ <span class="normal"><a href="#__codelineno-0-78">78</a></span>
15694
+ <span class="normal"><a href="#__codelineno-0-79">79</a></span>
15695
+ <span class="normal"><a href="#__codelineno-0-80">80</a></span>
15696
+ <span class="normal"><a href="#__codelineno-0-81">81</a></span>
15697
+ <span class="normal"><a href="#__codelineno-0-82">82</a></span>
15698
+ <span class="normal"><a href="#__codelineno-0-83">83</a></span>
15699
+ <span class="normal"><a href="#__codelineno-0-84">84</a></span>
15700
+ <span class="normal"><a href="#__codelineno-0-85">85</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-63" name="__codelineno-0-63"></a><span class="k">class</span> <span class="nc">TreeManager</span><span class="p">(</span><span class="n">TreeManager_</span><span class="p">,</span> <span class="n">BaseManager</span><span class="o">.</span><span class="n">from_queryset</span><span class="p">(</span><span class="n">TreeQuerySet</span><span class="p">)):</span>
15701
+ <a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15702
+ <a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="sd"> Extend django-tree-queries&#39; TreeManager to incorporate RestrictedQuerySet.</span>
15703
+ <a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="sd"> &quot;&quot;&quot;</span>
15704
+ <a id="__codelineno-0-67" name="__codelineno-0-67"></a>
15705
+ <a id="__codelineno-0-68" name="__codelineno-0-68"></a> <span class="n">_with_tree_fields</span> <span class="o">=</span> <span class="kc">True</span>
15706
+ <a id="__codelineno-0-69" name="__codelineno-0-69"></a> <span class="n">use_in_migrations</span> <span class="o">=</span> <span class="kc">True</span>
15707
+ <a id="__codelineno-0-70" name="__codelineno-0-70"></a>
15708
+ <a id="__codelineno-0-71" name="__codelineno-0-71"></a> <span class="nd">@property</span>
15709
+ <a id="__codelineno-0-72" name="__codelineno-0-72"></a> <span class="k">def</span> <span class="nf">max_depth_cache_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15710
+ <a id="__codelineno-0-73" name="__codelineno-0-73"></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;nautobot.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="si">}</span><span class="s2">.max_depth&quot;</span>
15711
+ <a id="__codelineno-0-74" name="__codelineno-0-74"></a>
15712
+ <a id="__codelineno-0-75" name="__codelineno-0-75"></a> <span class="nd">@property</span>
15713
+ <a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="k">def</span> <span class="nf">max_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15714
+ <a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cacheable version of `TreeQuerySet.max_tree_depth()`.</span>
15715
+ <a id="__codelineno-0-78" name="__codelineno-0-78"></a>
15716
+ <a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> Generally TreeManagers are persistent objects while TreeQuerySets are not, hence the difference in behavior.</span>
15717
+ <a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> &quot;&quot;&quot;</span>
15718
+ <a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="n">max_depth</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_depth_cache_key</span><span class="p">)</span>
15719
+ <a id="__codelineno-0-82" name="__codelineno-0-82"></a> <span class="k">if</span> <span class="n">max_depth</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
15720
+ <a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="n">max_depth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_tree_depth</span><span class="p">()</span>
15721
+ <a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_depth_cache_key</span><span class="p">,</span> <span class="n">max_depth</span><span class="p">)</span>
15722
+ <a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="k">return</span> <span class="n">max_depth</span>
15645
15723
  </code></pre></div></td></tr></table></div>
15646
15724
  </details>
15647
15725
 
@@ -15655,6 +15733,28 @@ having to define it on the model yourself.</p>
15655
15733
 
15656
15734
 
15657
15735
 
15736
+ <div class="doc doc-object doc-attribute">
15737
+
15738
+
15739
+
15740
+ <h3 id="nautobot.core.models.tree_queries.TreeManager.max_depth" class="doc doc-heading">
15741
+ <code class="highlight language-python"><span class="n">max_depth</span></code>
15742
+
15743
+ <span class="doc doc-labels">
15744
+ <small class="doc doc-label doc-label-property"><code>property</code></small>
15745
+ </span>
15746
+
15747
+ <a href="#nautobot.core.models.tree_queries.TreeManager.max_depth" class="headerlink" title="Permanent link">&para;</a></h3>
15748
+
15749
+
15750
+ <div class="doc doc-contents ">
15751
+
15752
+ <p>Cacheable version of <code>TreeQuerySet.max_tree_depth()</code>.</p>
15753
+ <p>Generally TreeManagers are persistent objects while TreeQuerySets are not, hence the difference in behavior.</p>
15754
+ </div>
15755
+
15756
+ </div>
15757
+
15658
15758
 
15659
15759
 
15660
15760
 
@@ -15685,71 +15785,71 @@ having to define it on the model yourself.</p>
15685
15785
 
15686
15786
  <details class="quote">
15687
15787
  <summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
15688
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-66">66</a></span>
15689
- <span class="normal"><a href="#__codelineno-0-67">67</a></span>
15690
- <span class="normal"><a href="#__codelineno-0-68">68</a></span>
15691
- <span class="normal"><a href="#__codelineno-0-69">69</a></span>
15692
- <span class="normal"><a href="#__codelineno-0-70">70</a></span>
15693
- <span class="normal"><a href="#__codelineno-0-71">71</a></span>
15694
- <span class="normal"><a href="#__codelineno-0-72">72</a></span>
15695
- <span class="normal"><a href="#__codelineno-0-73">73</a></span>
15696
- <span class="normal"><a href="#__codelineno-0-74">74</a></span>
15697
- <span class="normal"><a href="#__codelineno-0-75">75</a></span>
15698
- <span class="normal"><a href="#__codelineno-0-76">76</a></span>
15699
- <span class="normal"><a href="#__codelineno-0-77">77</a></span>
15700
- <span class="normal"><a href="#__codelineno-0-78">78</a></span>
15701
- <span class="normal"><a href="#__codelineno-0-79">79</a></span>
15702
- <span class="normal"><a href="#__codelineno-0-80">80</a></span>
15703
- <span class="normal"><a href="#__codelineno-0-81">81</a></span>
15704
- <span class="normal"><a href="#__codelineno-0-82">82</a></span>
15705
- <span class="normal"><a href="#__codelineno-0-83">83</a></span>
15706
- <span class="normal"><a href="#__codelineno-0-84">84</a></span>
15707
- <span class="normal"><a href="#__codelineno-0-85">85</a></span>
15708
- <span class="normal"><a href="#__codelineno-0-86">86</a></span>
15709
- <span class="normal"><a href="#__codelineno-0-87">87</a></span>
15710
- <span class="normal"><a href="#__codelineno-0-88">88</a></span>
15711
- <span class="normal"><a href="#__codelineno-0-89">89</a></span>
15712
- <span class="normal"><a href="#__codelineno-0-90">90</a></span>
15713
- <span class="normal"><a href="#__codelineno-0-91">91</a></span>
15714
- <span class="normal"><a href="#__codelineno-0-92">92</a></span>
15715
- <span class="normal"><a href="#__codelineno-0-93">93</a></span>
15716
- <span class="normal"><a href="#__codelineno-0-94">94</a></span>
15717
- <span class="normal"><a href="#__codelineno-0-95">95</a></span>
15718
- <span class="normal"><a href="#__codelineno-0-96">96</a></span>
15719
- <span class="normal"><a href="#__codelineno-0-97">97</a></span>
15720
- <span class="normal"><a href="#__codelineno-0-98">98</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="k">class</span> <span class="nc">TreeModel</span><span class="p">(</span><span class="n">TreeNode</span><span class="p">):</span>
15721
- <a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15722
- <a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> Nautobot-specific base class for models that exist in a self-referential tree.</span>
15723
- <a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> &quot;&quot;&quot;</span>
15724
- <a id="__codelineno-0-70" name="__codelineno-0-70"></a>
15725
- <a id="__codelineno-0-71" name="__codelineno-0-71"></a> <span class="n">objects</span> <span class="o">=</span> <span class="n">TreeManager</span><span class="p">()</span>
15726
- <a id="__codelineno-0-72" name="__codelineno-0-72"></a>
15727
- <a id="__codelineno-0-73" name="__codelineno-0-73"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
15728
- <a id="__codelineno-0-74" name="__codelineno-0-74"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
15729
- <a id="__codelineno-0-75" name="__codelineno-0-75"></a>
15730
- <a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="nd">@property</span>
15731
- <a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="k">def</span> <span class="nf">display</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15732
- <a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15733
- <a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> By default, TreeModels display their full ancestry for clarity.</span>
15734
- <a id="__codelineno-0-80" name="__codelineno-0-80"></a>
15735
- <a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd"> As this is an expensive thing to calculate, we cache it for a few seconds in the case of repeated lookups.</span>
15736
- <a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd"> &quot;&quot;&quot;</span>
15737
- <a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">):</span>
15738
- <a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;default TreeModel.display implementation requires a `name` attribute!&quot;</span><span class="p">)</span>
15739
- <a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="n">cache_key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">.display&quot;</span>
15740
- <a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">display_str</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
15741
- <a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="k">if</span> <span class="n">display_str</span><span class="p">:</span>
15742
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a> <span class="k">return</span> <span class="n">display_str</span>
15743
- <a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="k">try</span><span class="p">:</span>
15744
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
15745
- <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="n">display_str</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">display</span> <span class="o">+</span> <span class="s2">&quot; → &quot;</span>
15746
- <a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
15747
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="c1"># Expected to occur at times during bulk-delete operations</span>
15748
- <a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="k">pass</span>
15749
- <a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="k">finally</span><span class="p">:</span>
15750
- <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">display_str</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
15751
- <a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="n">display_str</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
15752
- <a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="k">return</span> <span class="n">display_str</span> <span class="c1"># pylint: disable=lost-exception</span>
15788
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-88"> 88</a></span>
15789
+ <span class="normal"><a href="#__codelineno-0-89"> 89</a></span>
15790
+ <span class="normal"><a href="#__codelineno-0-90"> 90</a></span>
15791
+ <span class="normal"><a href="#__codelineno-0-91"> 91</a></span>
15792
+ <span class="normal"><a href="#__codelineno-0-92"> 92</a></span>
15793
+ <span class="normal"><a href="#__codelineno-0-93"> 93</a></span>
15794
+ <span class="normal"><a href="#__codelineno-0-94"> 94</a></span>
15795
+ <span class="normal"><a href="#__codelineno-0-95"> 95</a></span>
15796
+ <span class="normal"><a href="#__codelineno-0-96"> 96</a></span>
15797
+ <span class="normal"><a href="#__codelineno-0-97"> 97</a></span>
15798
+ <span class="normal"><a href="#__codelineno-0-98"> 98</a></span>
15799
+ <span class="normal"><a href="#__codelineno-0-99"> 99</a></span>
15800
+ <span class="normal"><a href="#__codelineno-0-100">100</a></span>
15801
+ <span class="normal"><a href="#__codelineno-0-101">101</a></span>
15802
+ <span class="normal"><a href="#__codelineno-0-102">102</a></span>
15803
+ <span class="normal"><a href="#__codelineno-0-103">103</a></span>
15804
+ <span class="normal"><a href="#__codelineno-0-104">104</a></span>
15805
+ <span class="normal"><a href="#__codelineno-0-105">105</a></span>
15806
+ <span class="normal"><a href="#__codelineno-0-106">106</a></span>
15807
+ <span class="normal"><a href="#__codelineno-0-107">107</a></span>
15808
+ <span class="normal"><a href="#__codelineno-0-108">108</a></span>
15809
+ <span class="normal"><a href="#__codelineno-0-109">109</a></span>
15810
+ <span class="normal"><a href="#__codelineno-0-110">110</a></span>
15811
+ <span class="normal"><a href="#__codelineno-0-111">111</a></span>
15812
+ <span class="normal"><a href="#__codelineno-0-112">112</a></span>
15813
+ <span class="normal"><a href="#__codelineno-0-113">113</a></span>
15814
+ <span class="normal"><a href="#__codelineno-0-114">114</a></span>
15815
+ <span class="normal"><a href="#__codelineno-0-115">115</a></span>
15816
+ <span class="normal"><a href="#__codelineno-0-116">116</a></span>
15817
+ <span class="normal"><a href="#__codelineno-0-117">117</a></span>
15818
+ <span class="normal"><a href="#__codelineno-0-118">118</a></span>
15819
+ <span class="normal"><a href="#__codelineno-0-119">119</a></span>
15820
+ <span class="normal"><a href="#__codelineno-0-120">120</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="k">class</span> <span class="nc">TreeModel</span><span class="p">(</span><span class="n">TreeNode</span><span class="p">):</span>
15821
+ <a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15822
+ <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> Nautobot-specific base class for models that exist in a self-referential tree.</span>
15823
+ <a id="__codelineno-0-91" name="__codelineno-0-91"></a><span class="sd"> &quot;&quot;&quot;</span>
15824
+ <a id="__codelineno-0-92" name="__codelineno-0-92"></a>
15825
+ <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="n">objects</span> <span class="o">=</span> <span class="n">TreeManager</span><span class="p">()</span>
15826
+ <a id="__codelineno-0-94" name="__codelineno-0-94"></a>
15827
+ <a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
15828
+ <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
15829
+ <a id="__codelineno-0-97" name="__codelineno-0-97"></a>
15830
+ <a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="nd">@property</span>
15831
+ <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="k">def</span> <span class="nf">display</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15832
+ <a id="__codelineno-0-100" name="__codelineno-0-100"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15833
+ <a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="sd"> By default, TreeModels display their full ancestry for clarity.</span>
15834
+ <a id="__codelineno-0-102" name="__codelineno-0-102"></a>
15835
+ <a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> As this is an expensive thing to calculate, we cache it for a few seconds in the case of repeated lookups.</span>
15836
+ <a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="sd"> &quot;&quot;&quot;</span>
15837
+ <a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">):</span>
15838
+ <a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;default TreeModel.display implementation requires a `name` attribute!&quot;</span><span class="p">)</span>
15839
+ <a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="n">cache_key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;nautobot.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">.display&quot;</span>
15840
+ <a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="n">display_str</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
15841
+ <a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="k">if</span> <span class="n">display_str</span><span class="p">:</span>
15842
+ <a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">return</span> <span class="n">display_str</span>
15843
+ <a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="k">try</span><span class="p">:</span>
15844
+ <a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
15845
+ <a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="n">display_str</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">display</span> <span class="o">+</span> <span class="s2">&quot; → &quot;</span>
15846
+ <a id="__codelineno-0-114" name="__codelineno-0-114"></a> <span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
15847
+ <a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="c1"># Expected to occur at times during bulk-delete operations</span>
15848
+ <a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="k">pass</span>
15849
+ <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="k">finally</span><span class="p">:</span>
15850
+ <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="n">display_str</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
15851
+ <a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="n">display_str</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
15852
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="k">return</span> <span class="n">display_str</span> <span class="c1"># pylint: disable=lost-exception</span>
15753
15853
  </code></pre></div></td></tr></table></div>
15754
15854
  </details>
15755
15855
 
@@ -15815,7 +15915,9 @@ having to define it on the model yourself.</p>
15815
15915
 
15816
15916
  <details class="quote">
15817
15917
  <summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
15818
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-11">11</a></span>
15918
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
15919
+ <span class="normal"><a href="#__codelineno-0-10">10</a></span>
15920
+ <span class="normal"><a href="#__codelineno-0-11">11</a></span>
15819
15921
  <span class="normal"><a href="#__codelineno-0-12">12</a></span>
15820
15922
  <span class="normal"><a href="#__codelineno-0-13">13</a></span>
15821
15923
  <span class="normal"><a href="#__codelineno-0-14">14</a></span>
@@ -15854,46 +15956,68 @@ having to define it on the model yourself.</p>
15854
15956
  <span class="normal"><a href="#__codelineno-0-47">47</a></span>
15855
15957
  <span class="normal"><a href="#__codelineno-0-48">48</a></span>
15856
15958
  <span class="normal"><a href="#__codelineno-0-49">49</a></span>
15857
- <span class="normal"><a href="#__codelineno-0-50">50</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="k">class</span> <span class="nc">TreeQuerySet</span><span class="p">(</span><span class="n">TreeQuerySet_</span><span class="p">,</span> <span class="n">querysets</span><span class="o">.</span><span class="n">RestrictedQuerySet</span><span class="p">):</span>
15858
- <a id="__codelineno-0-12" name="__codelineno-0-12"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15859
- <a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="sd"> Combine django-tree-queries&#39; TreeQuerySet with our RestrictedQuerySet for permissions enforcement.</span>
15860
- <a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="sd"> &quot;&quot;&quot;</span>
15861
- <a id="__codelineno-0-15" name="__codelineno-0-15"></a>
15862
- <a id="__codelineno-0-16" name="__codelineno-0-16"></a> <span class="k">def</span> <span class="nf">ancestors</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">of</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
15863
- <a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom ancestors method for optimization purposes.</span>
15864
- <a id="__codelineno-0-18" name="__codelineno-0-18"></a>
15865
- <a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="sd"> Dynamically computes ancestors either through the tree or through the `parent` foreign key depending on whether</span>
15866
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="sd"> tree fields are present on `of`.</span>
15867
- <a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> &quot;&quot;&quot;</span>
15868
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="c1"># If `of` has `tree_depth` defined, i.e. if it was retrieved from the database on a queryset where tree fields</span>
15869
- <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="c1"># were enabled (see `TreeQuerySet.with_tree_fields` and `TreeQuerySet.without_tree_fields`), use the default</span>
15870
- <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="c1"># implementation from `tree_queries.query.TreeQuerySet`.</span>
15871
- <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="c1"># Furthermore, if `of` doesn&#39;t have a parent field we also have to defer to the tree-based implementation which</span>
15872
- <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="c1"># will then annotate the tree fields and proceed as usual.</span>
15873
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;tree_depth&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;parent&quot;</span><span class="p">):</span>
15874
- <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="n">include_self</span><span class="p">)</span>
15875
- <a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="c1"># In the other case, traverse the `parent` foreign key until the root.</span>
15876
- <a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="n">model_class</span> <span class="o">=</span> <span class="n">of</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
15877
- <a id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="n">ancestor_pks</span> <span class="o">=</span> <span class="p">[]</span>
15878
- <a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="k">if</span> <span class="n">include_self</span><span class="p">:</span>
15879
- <a id="__codelineno-0-33" name="__codelineno-0-33"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
15880
- <a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="k">while</span> <span class="n">of</span> <span class="o">:=</span> <span class="n">of</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
15881
- <a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1"># Insert in reverse order so that the root is the first element</span>
15882
- <a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
15883
- <a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1"># Maintain API compatibility by returning a queryset instead of a list directly.</span>
15884
- <a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1"># Reference:</span>
15885
- <a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="c1"># https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order</span>
15886
- <a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="n">preserve_order</span> <span class="o">=</span> <span class="n">Case</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">When</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">pk</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="n">position</span><span class="p">)</span> <span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="n">pk</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ancestor_pks</span><span class="p">)])</span>
15887
- <a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">return</span> <span class="n">model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">without_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="n">ancestor_pks</span><span class="p">)</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">preserve_order</span><span class="p">)</span>
15888
- <a id="__codelineno-0-42" name="__codelineno-0-42"></a>
15889
- <a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="k">def</span> <span class="nf">max_tree_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15890
- <a id="__codelineno-0-44" name="__codelineno-0-44"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15891
- <a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="sd"> Get the maximum depth of any tree in this queryset.</span>
15892
- <a id="__codelineno-0-46" name="__codelineno-0-46"></a><span class="sd"> &quot;&quot;&quot;</span>
15893
- <a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="n">deepest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">order_by</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;-__tree.tree_depth&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
15894
- <a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="k">if</span> <span class="n">deepest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
15895
- <a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
15896
- <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">return</span> <span class="mi">0</span>
15959
+ <span class="normal"><a href="#__codelineno-0-50">50</a></span>
15960
+ <span class="normal"><a href="#__codelineno-0-51">51</a></span>
15961
+ <span class="normal"><a href="#__codelineno-0-52">52</a></span>
15962
+ <span class="normal"><a href="#__codelineno-0-53">53</a></span>
15963
+ <span class="normal"><a href="#__codelineno-0-54">54</a></span>
15964
+ <span class="normal"><a href="#__codelineno-0-55">55</a></span>
15965
+ <span class="normal"><a href="#__codelineno-0-56">56</a></span>
15966
+ <span class="normal"><a href="#__codelineno-0-57">57</a></span>
15967
+ <span class="normal"><a href="#__codelineno-0-58">58</a></span>
15968
+ <span class="normal"><a href="#__codelineno-0-59">59</a></span>
15969
+ <span class="normal"><a href="#__codelineno-0-60">60</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-9" name="__codelineno-0-9"></a><span class="k">class</span> <span class="nc">TreeQuerySet</span><span class="p">(</span><span class="n">TreeQuerySet_</span><span class="p">,</span> <span class="n">querysets</span><span class="o">.</span><span class="n">RestrictedQuerySet</span><span class="p">):</span>
15970
+ <a id="__codelineno-0-10" name="__codelineno-0-10"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15971
+ <a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="sd"> Combine django-tree-queries&#39; TreeQuerySet with our RestrictedQuerySet for permissions enforcement.</span>
15972
+ <a id="__codelineno-0-12" name="__codelineno-0-12"></a><span class="sd"> &quot;&quot;&quot;</span>
15973
+ <a id="__codelineno-0-13" name="__codelineno-0-13"></a>
15974
+ <a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="k">def</span> <span class="nf">ancestors</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">of</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
15975
+ <a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom ancestors method for optimization purposes.</span>
15976
+ <a id="__codelineno-0-16" name="__codelineno-0-16"></a>
15977
+ <a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="sd"> Dynamically computes ancestors either through the tree or through the `parent` foreign key depending on whether</span>
15978
+ <a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="sd"> tree fields are present on `of`.</span>
15979
+ <a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="sd"> &quot;&quot;&quot;</span>
15980
+ <a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="c1"># If `of` has `tree_depth` defined, i.e. if it was retrieved from the database on a queryset where tree fields</span>
15981
+ <a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="c1"># were enabled (see `TreeQuerySet.with_tree_fields` and `TreeQuerySet.without_tree_fields`), use the default</span>
15982
+ <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="c1"># implementation from `tree_queries.query.TreeQuerySet`.</span>
15983
+ <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="c1"># Furthermore, if `of` doesn&#39;t have a parent field we also have to defer to the tree-based implementation which</span>
15984
+ <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="c1"># will then annotate the tree fields and proceed as usual.</span>
15985
+ <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;tree_depth&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;parent&quot;</span><span class="p">):</span>
15986
+ <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="n">include_self</span><span class="p">)</span>
15987
+ <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="c1"># In the other case, traverse the `parent` foreign key until the root.</span>
15988
+ <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="n">model_class</span> <span class="o">=</span> <span class="n">of</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
15989
+ <a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="n">ancestor_pks</span> <span class="o">=</span> <span class="p">[]</span>
15990
+ <a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="k">if</span> <span class="n">include_self</span><span class="p">:</span>
15991
+ <a id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
15992
+ <a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="k">while</span> <span class="n">of</span> <span class="o">:=</span> <span class="n">of</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
15993
+ <a id="__codelineno-0-33" name="__codelineno-0-33"></a> <span class="c1"># Insert in reverse order so that the root is the first element</span>
15994
+ <a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
15995
+ <a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1"># Maintain API compatibility by returning a queryset instead of a list directly.</span>
15996
+ <a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="c1"># Reference:</span>
15997
+ <a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1"># https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order</span>
15998
+ <a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="n">preserve_order</span> <span class="o">=</span> <span class="n">Case</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">When</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">pk</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="n">position</span><span class="p">)</span> <span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="n">pk</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ancestor_pks</span><span class="p">)])</span>
15999
+ <a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="k">return</span> <span class="n">model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">without_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="n">ancestor_pks</span><span class="p">)</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">preserve_order</span><span class="p">)</span>
16000
+ <a id="__codelineno-0-40" name="__codelineno-0-40"></a>
16001
+ <a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">def</span> <span class="nf">max_tree_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
16002
+ <a id="__codelineno-0-42" name="__codelineno-0-42"></a><span class="w"> </span><span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
16003
+ <a id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="sd"> Get the maximum tree depth of any node in this queryset.</span>
16004
+ <a id="__codelineno-0-44" name="__codelineno-0-44"></a>
16005
+ <a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="sd"> In most cases you should use TreeManager.max_depth instead as it&#39;s cached and this is not.</span>
16006
+ <a id="__codelineno-0-46" name="__codelineno-0-46"></a>
16007
+ <a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="sd"> root - depth 0</span>
16008
+ <a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="sd"> \</span>
16009
+ <a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="sd"> branch - depth 1</span>
16010
+ <a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="sd"> \</span>
16011
+ <a id="__codelineno-0-51" name="__codelineno-0-51"></a><span class="sd"> leaf - depth 2</span>
16012
+ <a id="__codelineno-0-52" name="__codelineno-0-52"></a>
16013
+ <a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="sd"> Note that a queryset with only root nodes will return zero, and an empty queryset will also return zero.</span>
16014
+ <a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="sd"> This is probably a bug, we should really return -1 in the case of an empty queryset, but this is</span>
16015
+ <a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> &quot;working as implemented&quot; and changing it would possibly be a breaking change at this point.</span>
16016
+ <a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> &quot;&quot;&quot;</span>
16017
+ <a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="n">deepest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">order_by</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;-__tree.tree_depth&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
16018
+ <a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">if</span> <span class="n">deepest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
16019
+ <a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
16020
+ <a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">return</span> <span class="mi">0</span>
15897
16021
  </code></pre></div></td></tr></table></div>
15898
16022
  </details>
15899
16023
 
@@ -15928,7 +16052,9 @@ tree fields are present on <code>of</code>.</p>
15928
16052
 
15929
16053
  <details class="quote">
15930
16054
  <summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
15931
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-16">16</a></span>
16055
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-14">14</a></span>
16056
+ <span class="normal"><a href="#__codelineno-0-15">15</a></span>
16057
+ <span class="normal"><a href="#__codelineno-0-16">16</a></span>
15932
16058
  <span class="normal"><a href="#__codelineno-0-17">17</a></span>
15933
16059
  <span class="normal"><a href="#__codelineno-0-18">18</a></span>
15934
16060
  <span class="normal"><a href="#__codelineno-0-19">19</a></span>
@@ -15951,34 +16077,32 @@ tree fields are present on <code>of</code>.</p>
15951
16077
  <span class="normal"><a href="#__codelineno-0-36">36</a></span>
15952
16078
  <span class="normal"><a href="#__codelineno-0-37">37</a></span>
15953
16079
  <span class="normal"><a href="#__codelineno-0-38">38</a></span>
15954
- <span class="normal"><a href="#__codelineno-0-39">39</a></span>
15955
- <span class="normal"><a href="#__codelineno-0-40">40</a></span>
15956
- <span class="normal"><a href="#__codelineno-0-41">41</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="k">def</span> <span class="nf">ancestors</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">of</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
15957
- <a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom ancestors method for optimization purposes.</span>
15958
- <a id="__codelineno-0-18" name="__codelineno-0-18"></a>
15959
- <a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="sd"> Dynamically computes ancestors either through the tree or through the `parent` foreign key depending on whether</span>
15960
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="sd"> tree fields are present on `of`.</span>
15961
- <a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> &quot;&quot;&quot;</span>
15962
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="c1"># If `of` has `tree_depth` defined, i.e. if it was retrieved from the database on a queryset where tree fields</span>
15963
- <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="c1"># were enabled (see `TreeQuerySet.with_tree_fields` and `TreeQuerySet.without_tree_fields`), use the default</span>
15964
- <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="c1"># implementation from `tree_queries.query.TreeQuerySet`.</span>
15965
- <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="c1"># Furthermore, if `of` doesn&#39;t have a parent field we also have to defer to the tree-based implementation which</span>
15966
- <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="c1"># will then annotate the tree fields and proceed as usual.</span>
15967
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;tree_depth&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;parent&quot;</span><span class="p">):</span>
15968
- <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="n">include_self</span><span class="p">)</span>
15969
- <a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="c1"># In the other case, traverse the `parent` foreign key until the root.</span>
15970
- <a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="n">model_class</span> <span class="o">=</span> <span class="n">of</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
15971
- <a id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="n">ancestor_pks</span> <span class="o">=</span> <span class="p">[]</span>
15972
- <a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="k">if</span> <span class="n">include_self</span><span class="p">:</span>
15973
- <a id="__codelineno-0-33" name="__codelineno-0-33"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
15974
- <a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="k">while</span> <span class="n">of</span> <span class="o">:=</span> <span class="n">of</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
15975
- <a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1"># Insert in reverse order so that the root is the first element</span>
15976
- <a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
15977
- <a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1"># Maintain API compatibility by returning a queryset instead of a list directly.</span>
15978
- <a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1"># Reference:</span>
15979
- <a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="c1"># https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order</span>
15980
- <a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="n">preserve_order</span> <span class="o">=</span> <span class="n">Case</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">When</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">pk</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="n">position</span><span class="p">)</span> <span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="n">pk</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ancestor_pks</span><span class="p">)])</span>
15981
- <a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">return</span> <span class="n">model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">without_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="n">ancestor_pks</span><span class="p">)</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">preserve_order</span><span class="p">)</span>
16080
+ <span class="normal"><a href="#__codelineno-0-39">39</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="k">def</span> <span class="nf">ancestors</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">of</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
16081
+ <a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom ancestors method for optimization purposes.</span>
16082
+ <a id="__codelineno-0-16" name="__codelineno-0-16"></a>
16083
+ <a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="sd"> Dynamically computes ancestors either through the tree or through the `parent` foreign key depending on whether</span>
16084
+ <a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="sd"> tree fields are present on `of`.</span>
16085
+ <a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="sd"> &quot;&quot;&quot;</span>
16086
+ <a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="c1"># If `of` has `tree_depth` defined, i.e. if it was retrieved from the database on a queryset where tree fields</span>
16087
+ <a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="c1"># were enabled (see `TreeQuerySet.with_tree_fields` and `TreeQuerySet.without_tree_fields`), use the default</span>
16088
+ <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="c1"># implementation from `tree_queries.query.TreeQuerySet`.</span>
16089
+ <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="c1"># Furthermore, if `of` doesn&#39;t have a parent field we also have to defer to the tree-based implementation which</span>
16090
+ <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="c1"># will then annotate the tree fields and proceed as usual.</span>
16091
+ <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;tree_depth&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="s2">&quot;parent&quot;</span><span class="p">):</span>
16092
+ <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">of</span><span class="p">,</span> <span class="n">include_self</span><span class="o">=</span><span class="n">include_self</span><span class="p">)</span>
16093
+ <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="c1"># In the other case, traverse the `parent` foreign key until the root.</span>
16094
+ <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="n">model_class</span> <span class="o">=</span> <span class="n">of</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
16095
+ <a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="n">ancestor_pks</span> <span class="o">=</span> <span class="p">[]</span>
16096
+ <a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="k">if</span> <span class="n">include_self</span><span class="p">:</span>
16097
+ <a id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
16098
+ <a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="k">while</span> <span class="n">of</span> <span class="o">:=</span> <span class="n">of</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
16099
+ <a id="__codelineno-0-33" name="__codelineno-0-33"></a> <span class="c1"># Insert in reverse order so that the root is the first element</span>
16100
+ <a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="n">ancestor_pks</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">of</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
16101
+ <a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1"># Maintain API compatibility by returning a queryset instead of a list directly.</span>
16102
+ <a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="c1"># Reference:</span>
16103
+ <a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1"># https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order</span>
16104
+ <a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="n">preserve_order</span> <span class="o">=</span> <span class="n">Case</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">When</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">pk</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="n">position</span><span class="p">)</span> <span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="n">pk</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ancestor_pks</span><span class="p">)])</span>
16105
+ <a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="k">return</span> <span class="n">model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">without_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="n">ancestor_pks</span><span class="p">)</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">preserve_order</span><span class="p">)</span>
15982
16106
  </code></pre></div></td></tr></table></div>
15983
16107
  </details>
15984
16108
  </div>
@@ -15998,25 +16122,58 @@ tree fields are present on <code>of</code>.</p>
15998
16122
 
15999
16123
  <div class="doc doc-contents ">
16000
16124
 
16001
- <p>Get the maximum depth of any tree in this queryset.</p>
16125
+ <p>Get the maximum tree depth of any node in this queryset.</p>
16126
+ <p>In most cases you should use TreeManager.max_depth instead as it's cached and this is not.</p>
16127
+ <p>root - depth 0
16128
+ \
16129
+ branch - depth 1
16130
+ \
16131
+ leaf - depth 2</p>
16132
+ <p>Note that a queryset with only root nodes will return zero, and an empty queryset will also return zero.
16133
+ This is probably a bug, we should really return -1 in the case of an empty queryset, but this is
16134
+ "working as implemented" and changing it would possibly be a breaking change at this point.</p>
16002
16135
 
16003
16136
  <details class="quote">
16004
16137
  <summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
16005
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-43">43</a></span>
16138
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-41">41</a></span>
16139
+ <span class="normal"><a href="#__codelineno-0-42">42</a></span>
16140
+ <span class="normal"><a href="#__codelineno-0-43">43</a></span>
16006
16141
  <span class="normal"><a href="#__codelineno-0-44">44</a></span>
16007
16142
  <span class="normal"><a href="#__codelineno-0-45">45</a></span>
16008
16143
  <span class="normal"><a href="#__codelineno-0-46">46</a></span>
16009
16144
  <span class="normal"><a href="#__codelineno-0-47">47</a></span>
16010
16145
  <span class="normal"><a href="#__codelineno-0-48">48</a></span>
16011
16146
  <span class="normal"><a href="#__codelineno-0-49">49</a></span>
16012
- <span class="normal"><a href="#__codelineno-0-50">50</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="k">def</span> <span class="nf">max_tree_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
16013
- <a id="__codelineno-0-44" name="__codelineno-0-44"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
16014
- <a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="sd"> Get the maximum depth of any tree in this queryset.</span>
16015
- <a id="__codelineno-0-46" name="__codelineno-0-46"></a><span class="sd"> &quot;&quot;&quot;</span>
16016
- <a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="n">deepest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">order_by</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;-__tree.tree_depth&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
16017
- <a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="k">if</span> <span class="n">deepest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
16018
- <a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
16019
- <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">return</span> <span class="mi">0</span>
16147
+ <span class="normal"><a href="#__codelineno-0-50">50</a></span>
16148
+ <span class="normal"><a href="#__codelineno-0-51">51</a></span>
16149
+ <span class="normal"><a href="#__codelineno-0-52">52</a></span>
16150
+ <span class="normal"><a href="#__codelineno-0-53">53</a></span>
16151
+ <span class="normal"><a href="#__codelineno-0-54">54</a></span>
16152
+ <span class="normal"><a href="#__codelineno-0-55">55</a></span>
16153
+ <span class="normal"><a href="#__codelineno-0-56">56</a></span>
16154
+ <span class="normal"><a href="#__codelineno-0-57">57</a></span>
16155
+ <span class="normal"><a href="#__codelineno-0-58">58</a></span>
16156
+ <span class="normal"><a href="#__codelineno-0-59">59</a></span>
16157
+ <span class="normal"><a href="#__codelineno-0-60">60</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-41" name="__codelineno-0-41"></a><span class="k">def</span> <span class="nf">max_tree_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
16158
+ <a id="__codelineno-0-42" name="__codelineno-0-42"></a><span class="w"> </span><span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
16159
+ <a id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="sd"> Get the maximum tree depth of any node in this queryset.</span>
16160
+ <a id="__codelineno-0-44" name="__codelineno-0-44"></a>
16161
+ <a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="sd"> In most cases you should use TreeManager.max_depth instead as it&#39;s cached and this is not.</span>
16162
+ <a id="__codelineno-0-46" name="__codelineno-0-46"></a>
16163
+ <a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="sd"> root - depth 0</span>
16164
+ <a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="sd"> \</span>
16165
+ <a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="sd"> branch - depth 1</span>
16166
+ <a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="sd"> \</span>
16167
+ <a id="__codelineno-0-51" name="__codelineno-0-51"></a><span class="sd"> leaf - depth 2</span>
16168
+ <a id="__codelineno-0-52" name="__codelineno-0-52"></a>
16169
+ <a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="sd"> Note that a queryset with only root nodes will return zero, and an empty queryset will also return zero.</span>
16170
+ <a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="sd"> This is probably a bug, we should really return -1 in the case of an empty queryset, but this is</span>
16171
+ <a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> &quot;working as implemented&quot; and changing it would possibly be a breaking change at this point.</span>
16172
+ <a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> &quot;&quot;&quot;</span>
16173
+ <a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="n">deepest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">order_by</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;-__tree.tree_depth&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
16174
+ <a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">if</span> <span class="n">deepest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
16175
+ <a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
16176
+ <a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">return</span> <span class="mi">0</span>
16020
16177
  </code></pre></div></td></tr></table></div>
16021
16178
  </details>
16022
16179
  </div>
@@ -16914,11 +17071,7 @@ slug, and then they are joined with an underscore.</p>
16914
17071
 
16915
17072
  <details class="quote">
16916
17073
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
16917
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-209">209</a></span>
16918
- <span class="normal"><a href="#__codelineno-0-210">210</a></span>
16919
- <span class="normal"><a href="#__codelineno-0-211">211</a></span>
16920
- <span class="normal"><a href="#__codelineno-0-212">212</a></span>
16921
- <span class="normal"><a href="#__codelineno-0-213">213</a></span>
17074
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-213">213</a></span>
16922
17075
  <span class="normal"><a href="#__codelineno-0-214">214</a></span>
16923
17076
  <span class="normal"><a href="#__codelineno-0-215">215</a></span>
16924
17077
  <span class="normal"><a href="#__codelineno-0-216">216</a></span>
@@ -16931,24 +17084,28 @@ slug, and then they are joined with an underscore.</p>
16931
17084
  <span class="normal"><a href="#__codelineno-0-223">223</a></span>
16932
17085
  <span class="normal"><a href="#__codelineno-0-224">224</a></span>
16933
17086
  <span class="normal"><a href="#__codelineno-0-225">225</a></span>
16934
- <span class="normal"><a href="#__codelineno-0-226">226</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="k">def</span> <span class="nf">extras_features</span><span class="p">(</span><span class="o">*</span><span class="n">features</span><span class="p">):</span>
16935
- <a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
16936
- <a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> Decorator used to register extras provided features to a model</span>
16937
- <a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd"> &quot;&quot;&quot;</span>
16938
- <a id="__codelineno-0-213" name="__codelineno-0-213"></a>
16939
- <a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">model_class</span><span class="p">):</span>
16940
- <a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="c1"># Initialize the model_features store if not already defined</span>
16941
- <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="k">if</span> <span class="s2">&quot;model_features&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">registry</span><span class="p">:</span>
16942
- <a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">f</span><span class="p">:</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">EXTRAS_FEATURES</span><span class="p">}</span>
16943
- <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">for</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">features</span><span class="p">:</span>
16944
- <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="k">if</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">EXTRAS_FEATURES</span><span class="p">:</span>
16945
- <a id="__codelineno-0-220" name="__codelineno-0-220"></a> <span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
16946
- <a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">][</span><span class="n">feature</span><span class="p">][</span><span class="n">app_label</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
16947
- <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="k">else</span><span class="p">:</span>
16948
- <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">feature</span><span class="si">}</span><span class="s2"> is not a valid extras feature!&quot;</span><span class="p">)</span>
16949
- <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="k">return</span> <span class="n">model_class</span>
16950
- <a id="__codelineno-0-225" name="__codelineno-0-225"></a>
16951
- <a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="k">return</span> <span class="n">wrapper</span>
17087
+ <span class="normal"><a href="#__codelineno-0-226">226</a></span>
17088
+ <span class="normal"><a href="#__codelineno-0-227">227</a></span>
17089
+ <span class="normal"><a href="#__codelineno-0-228">228</a></span>
17090
+ <span class="normal"><a href="#__codelineno-0-229">229</a></span>
17091
+ <span class="normal"><a href="#__codelineno-0-230">230</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="k">def</span> <span class="nf">extras_features</span><span class="p">(</span><span class="o">*</span><span class="n">features</span><span class="p">):</span>
17092
+ <a id="__codelineno-0-214" name="__codelineno-0-214"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
17093
+ <a id="__codelineno-0-215" name="__codelineno-0-215"></a><span class="sd"> Decorator used to register extras provided features to a model</span>
17094
+ <a id="__codelineno-0-216" name="__codelineno-0-216"></a><span class="sd"> &quot;&quot;&quot;</span>
17095
+ <a id="__codelineno-0-217" name="__codelineno-0-217"></a>
17096
+ <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">model_class</span><span class="p">):</span>
17097
+ <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="c1"># Initialize the model_features store if not already defined</span>
17098
+ <a id="__codelineno-0-220" name="__codelineno-0-220"></a> <span class="k">if</span> <span class="s2">&quot;model_features&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">registry</span><span class="p">:</span>
17099
+ <a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">f</span><span class="p">:</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">EXTRAS_FEATURES</span><span class="p">}</span>
17100
+ <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="k">for</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">features</span><span class="p">:</span>
17101
+ <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="k">if</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">EXTRAS_FEATURES</span><span class="p">:</span>
17102
+ <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
17103
+ <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">][</span><span class="n">feature</span><span class="p">][</span><span class="n">app_label</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
17104
+ <a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="k">else</span><span class="p">:</span>
17105
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">feature</span><span class="si">}</span><span class="s2"> is not a valid extras feature!&quot;</span><span class="p">)</span>
17106
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="k">return</span> <span class="n">model_class</span>
17107
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a>
17108
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="k">return</span> <span class="n">wrapper</span>
16952
17109
  </code></pre></div></td></tr></table></div>
16953
17110
  </details>
16954
17111
  </div>