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
 
@@ -4642,6 +4656,20 @@
4642
4656
  get_table_for_model()
4643
4657
  </a>
4644
4658
 
4659
+ </li>
4660
+
4661
+ <li class="md-nav__item">
4662
+ <a href="#nautobot.apps.utils.get_url_for_url_pattern" class="md-nav__link">
4663
+ get_url_for_url_pattern()
4664
+ </a>
4665
+
4666
+ </li>
4667
+
4668
+ <li class="md-nav__item">
4669
+ <a href="#nautobot.apps.utils.get_url_patterns" class="md-nav__link">
4670
+ get_url_patterns()
4671
+ </a>
4672
+
4645
4673
  </li>
4646
4674
 
4647
4675
  <li class="md-nav__item">
@@ -5157,6 +5185,20 @@
5157
5185
 
5158
5186
 
5159
5187
 
5188
+ <li class="md-nav__item">
5189
+ <a href="../../../development/core/caching.html" class="md-nav__link">
5190
+ Caching
5191
+ </a>
5192
+ </li>
5193
+
5194
+
5195
+
5196
+
5197
+
5198
+
5199
+
5200
+
5201
+
5160
5202
  <li class="md-nav__item">
5161
5203
  <a href="../../../development/core/extending-models.html" class="md-nav__link">
5162
5204
  Extending Models
@@ -6133,6 +6175,20 @@
6133
6175
  get_table_for_model()
6134
6176
  </a>
6135
6177
 
6178
+ </li>
6179
+
6180
+ <li class="md-nav__item">
6181
+ <a href="#nautobot.apps.utils.get_url_for_url_pattern" class="md-nav__link">
6182
+ get_url_for_url_pattern()
6183
+ </a>
6184
+
6185
+ </li>
6186
+
6187
+ <li class="md-nav__item">
6188
+ <a href="#nautobot.apps.utils.get_url_patterns" class="md-nav__link">
6189
+ get_url_patterns()
6190
+ </a>
6191
+
6136
6192
  </li>
6137
6193
 
6138
6194
  <li class="md-nav__item">
@@ -6447,11 +6503,7 @@ until it has been populated.</p>
6447
6503
 
6448
6504
  <details class="quote">
6449
6505
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
6450
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-115">115</a></span>
6451
- <span class="normal"><a href="#__codelineno-0-116">116</a></span>
6452
- <span class="normal"><a href="#__codelineno-0-117">117</a></span>
6453
- <span class="normal"><a href="#__codelineno-0-118">118</a></span>
6454
- <span class="normal"><a href="#__codelineno-0-119">119</a></span>
6506
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-119">119</a></span>
6455
6507
  <span class="normal"><a href="#__codelineno-0-120">120</a></span>
6456
6508
  <span class="normal"><a href="#__codelineno-0-121">121</a></span>
6457
6509
  <span class="normal"><a href="#__codelineno-0-122">122</a></span>
@@ -6497,57 +6549,61 @@ until it has been populated.</p>
6497
6549
  <span class="normal"><a href="#__codelineno-0-162">162</a></span>
6498
6550
  <span class="normal"><a href="#__codelineno-0-163">163</a></span>
6499
6551
  <span class="normal"><a href="#__codelineno-0-164">164</a></span>
6500
- <span class="normal"><a href="#__codelineno-0-165">165</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-115" name="__codelineno-0-115"></a><span class="nd">@deconstructible</span>
6501
- <a id="__codelineno-0-116" name="__codelineno-0-116"></a><span class="k">class</span> <span class="nc">FeatureQuery</span><span class="p">:</span>
6502
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6503
- <a id="__codelineno-0-118" name="__codelineno-0-118"></a><span class="sd"> Helper class that delays evaluation of the registry contents for the functionality store</span>
6504
- <a id="__codelineno-0-119" name="__codelineno-0-119"></a><span class="sd"> until it has been populated.</span>
6505
- <a id="__codelineno-0-120" name="__codelineno-0-120"></a><span class="sd"> &quot;&quot;&quot;</span>
6506
- <a id="__codelineno-0-121" name="__codelineno-0-121"></a>
6507
- <a id="__codelineno-0-122" name="__codelineno-0-122"></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">feature</span><span class="p">):</span>
6508
- <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="bp">self</span><span class="o">.</span><span class="n">feature</span> <span class="o">=</span> <span class="n">feature</span>
6509
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a>
6510
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6511
- <a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">()</span>
6512
- <a id="__codelineno-0-127" name="__codelineno-0-127"></a>
6513
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="k">def</span> <span class="nf">get_query</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6514
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6515
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a><span class="sd"> Given an extras feature, return a Q object for content type lookup</span>
6516
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a><span class="sd"> &quot;&quot;&quot;</span>
6517
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a>
6518
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="c1"># The `populate_model_features_registry` function is called in the `FeatureQuery().get_query` method instead of</span>
6519
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="c1"># `ExtrasConfig.ready` because `FeatureQuery().get_query` is called before `ExtrasConfig.ready`.</span>
6520
- <a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="c1"># This is because `FeatureQuery` is a helper class used in `Forms` and `Serializers` that are called during the</span>
6521
- <a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="c1"># initialization of the application, before `ExtrasConfig.ready` is called.</span>
6522
- <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="c1"># Calling `populate_model_features_registry` in `ExtrasConfig.ready` would lead to an outdated `model_features`</span>
6523
- <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="c1"># `registry` record being used by `FeatureQuery`.</span>
6524
- <a id="__codelineno-0-139" name="__codelineno-0-139"></a>
6525
- <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="n">populate_model_features_registry</span><span class="p">()</span>
6526
- <a id="__codelineno-0-141" name="__codelineno-0-141"></a> <span class="n">query</span> <span class="o">=</span> <span class="n">Q</span><span class="p">()</span>
6527
- <a id="__codelineno-0-142" name="__codelineno-0-142"></a> <span class="k">for</span> <span class="n">app_label</span><span class="p">,</span> <span class="n">models</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_dict</span><span class="p">():</span>
6528
- <a id="__codelineno-0-143" name="__codelineno-0-143"></a> <span class="n">query</span> <span class="o">|=</span> <span class="n">Q</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model__in</span><span class="o">=</span><span class="n">models</span><span class="p">)</span>
6529
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a>
6530
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">return</span> <span class="n">query</span>
6531
- <a id="__codelineno-0-146" name="__codelineno-0-146"></a>
6532
- <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6533
- <a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6534
- <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> Given an extras feature, return a dict of app_label: [models] for content type lookup</span>
6535
- <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> &quot;&quot;&quot;</span>
6536
- <a id="__codelineno-0-151" name="__codelineno-0-151"></a> <span class="k">return</span> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">][</span><span class="bp">self</span><span class="o">.</span><span class="n">feature</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
6537
- <a id="__codelineno-0-152" name="__codelineno-0-152"></a>
6538
- <a id="__codelineno-0-153" name="__codelineno-0-153"></a> <span class="k">def</span> <span class="nf">get_choices</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6539
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6540
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> Given an extras feature, return a list of 2-tuple of `(model_label, pk)`</span>
6541
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> suitable for use as `choices` on a choice field:</span>
6542
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a>
6543
- <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> &gt;&gt;&gt; FeatureQuery(&#39;statuses&#39;).get_choices()</span>
6544
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> [(&#39;dcim.device&#39;, 13), (&#39;dcim.rack&#39;, 34)]</span>
6545
- <a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd"> &quot;&quot;&quot;</span>
6546
- <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="k">return</span> <span class="p">[(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">ct</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6547
- <a id="__codelineno-0-162" name="__codelineno-0-162"></a>
6548
- <a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6549
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a list of model classes that declare this feature.&quot;&quot;&quot;</span>
6550
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="k">return</span> <span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6552
+ <span class="normal"><a href="#__codelineno-0-165">165</a></span>
6553
+ <span class="normal"><a href="#__codelineno-0-166">166</a></span>
6554
+ <span class="normal"><a href="#__codelineno-0-167">167</a></span>
6555
+ <span class="normal"><a href="#__codelineno-0-168">168</a></span>
6556
+ <span class="normal"><a href="#__codelineno-0-169">169</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-119" name="__codelineno-0-119"></a><span class="nd">@deconstructible</span>
6557
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a><span class="k">class</span> <span class="nc">FeatureQuery</span><span class="p">:</span>
6558
+ <a id="__codelineno-0-121" name="__codelineno-0-121"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6559
+ <a id="__codelineno-0-122" name="__codelineno-0-122"></a><span class="sd"> Helper class that delays evaluation of the registry contents for the functionality store</span>
6560
+ <a id="__codelineno-0-123" name="__codelineno-0-123"></a><span class="sd"> until it has been populated.</span>
6561
+ <a id="__codelineno-0-124" name="__codelineno-0-124"></a><span class="sd"> &quot;&quot;&quot;</span>
6562
+ <a id="__codelineno-0-125" name="__codelineno-0-125"></a>
6563
+ <a id="__codelineno-0-126" name="__codelineno-0-126"></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">feature</span><span class="p">):</span>
6564
+ <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="bp">self</span><span class="o">.</span><span class="n">feature</span> <span class="o">=</span> <span class="n">feature</span>
6565
+ <a id="__codelineno-0-128" name="__codelineno-0-128"></a>
6566
+ <a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6567
+ <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">()</span>
6568
+ <a id="__codelineno-0-131" name="__codelineno-0-131"></a>
6569
+ <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="k">def</span> <span class="nf">get_query</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6570
+ <a id="__codelineno-0-133" name="__codelineno-0-133"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6571
+ <a id="__codelineno-0-134" name="__codelineno-0-134"></a><span class="sd"> Given an extras feature, return a Q object for content type lookup</span>
6572
+ <a id="__codelineno-0-135" name="__codelineno-0-135"></a><span class="sd"> &quot;&quot;&quot;</span>
6573
+ <a id="__codelineno-0-136" name="__codelineno-0-136"></a>
6574
+ <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="c1"># The `populate_model_features_registry` function is called in the `FeatureQuery().get_query` method instead of</span>
6575
+ <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="c1"># `ExtrasConfig.ready` because `FeatureQuery().get_query` is called before `ExtrasConfig.ready`.</span>
6576
+ <a id="__codelineno-0-139" name="__codelineno-0-139"></a> <span class="c1"># This is because `FeatureQuery` is a helper class used in `Forms` and `Serializers` that are called during the</span>
6577
+ <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="c1"># initialization of the application, before `ExtrasConfig.ready` is called.</span>
6578
+ <a id="__codelineno-0-141" name="__codelineno-0-141"></a> <span class="c1"># Calling `populate_model_features_registry` in `ExtrasConfig.ready` would lead to an outdated `model_features`</span>
6579
+ <a id="__codelineno-0-142" name="__codelineno-0-142"></a> <span class="c1"># `registry` record being used by `FeatureQuery`.</span>
6580
+ <a id="__codelineno-0-143" name="__codelineno-0-143"></a>
6581
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a> <span class="n">populate_model_features_registry</span><span class="p">()</span>
6582
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="n">query</span> <span class="o">=</span> <span class="n">Q</span><span class="p">()</span>
6583
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">for</span> <span class="n">app_label</span><span class="p">,</span> <span class="n">models</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_dict</span><span class="p">():</span>
6584
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="n">query</span> <span class="o">|=</span> <span class="n">Q</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model__in</span><span class="o">=</span><span class="n">models</span><span class="p">)</span>
6585
+ <a id="__codelineno-0-148" name="__codelineno-0-148"></a>
6586
+ <a id="__codelineno-0-149" name="__codelineno-0-149"></a> <span class="k">return</span> <span class="n">query</span>
6587
+ <a id="__codelineno-0-150" name="__codelineno-0-150"></a>
6588
+ <a id="__codelineno-0-151" name="__codelineno-0-151"></a> <span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6589
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6590
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> Given an extras feature, return a dict of app_label: [models] for content type lookup</span>
6591
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> &quot;&quot;&quot;</span>
6592
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="k">return</span> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">][</span><span class="bp">self</span><span class="o">.</span><span class="n">feature</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
6593
+ <a id="__codelineno-0-156" name="__codelineno-0-156"></a>
6594
+ <a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="k">def</span> <span class="nf">get_choices</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6595
+ <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6596
+ <a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> Given an extras feature, return a list of 2-tuple of `(model_label, pk)`</span>
6597
+ <a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd"> suitable for use as `choices` on a choice field:</span>
6598
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a>
6599
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd"> &gt;&gt;&gt; FeatureQuery(&#39;statuses&#39;).get_choices()</span>
6600
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> [(&#39;dcim.device&#39;, 13), (&#39;dcim.rack&#39;, 34)]</span>
6601
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> &quot;&quot;&quot;</span>
6602
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="k">return</span> <span class="p">[(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">ct</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6603
+ <a id="__codelineno-0-166" name="__codelineno-0-166"></a>
6604
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6605
+ <a id="__codelineno-0-168" name="__codelineno-0-168"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a list of model classes that declare this feature.&quot;&quot;&quot;</span>
6606
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="k">return</span> <span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6551
6607
  </code></pre></div></td></tr></table></div>
6552
6608
  </details>
6553
6609
 
@@ -6580,15 +6636,15 @@ until it has been populated.</p>
6580
6636
 
6581
6637
  <details class="quote">
6582
6638
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
6583
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-147">147</a></span>
6584
- <span class="normal"><a href="#__codelineno-0-148">148</a></span>
6585
- <span class="normal"><a href="#__codelineno-0-149">149</a></span>
6586
- <span class="normal"><a href="#__codelineno-0-150">150</a></span>
6587
- <span class="normal"><a href="#__codelineno-0-151">151</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6588
- <a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6589
- <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> Given an extras feature, return a dict of app_label: [models] for content type lookup</span>
6590
- <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> &quot;&quot;&quot;</span>
6591
- <a id="__codelineno-0-151" name="__codelineno-0-151"></a> <span class="k">return</span> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">][</span><span class="bp">self</span><span class="o">.</span><span class="n">feature</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
6639
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-151">151</a></span>
6640
+ <span class="normal"><a href="#__codelineno-0-152">152</a></span>
6641
+ <span class="normal"><a href="#__codelineno-0-153">153</a></span>
6642
+ <span class="normal"><a href="#__codelineno-0-154">154</a></span>
6643
+ <span class="normal"><a href="#__codelineno-0-155">155</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6644
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6645
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> Given an extras feature, return a dict of app_label: [models] for content type lookup</span>
6646
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> &quot;&quot;&quot;</span>
6647
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="k">return</span> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;model_features&quot;</span><span class="p">][</span><span class="bp">self</span><span class="o">.</span><span class="n">feature</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
6592
6648
  </code></pre></div></td></tr></table></div>
6593
6649
  </details>
6594
6650
  </div>
@@ -6616,23 +6672,23 @@ suitable for use as <code>choices</code> on a choice field:</p>
6616
6672
 
6617
6673
  <details class="quote">
6618
6674
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
6619
- <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>
6620
- <span class="normal"><a href="#__codelineno-0-154">154</a></span>
6621
- <span class="normal"><a href="#__codelineno-0-155">155</a></span>
6622
- <span class="normal"><a href="#__codelineno-0-156">156</a></span>
6623
- <span class="normal"><a href="#__codelineno-0-157">157</a></span>
6675
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-157">157</a></span>
6624
6676
  <span class="normal"><a href="#__codelineno-0-158">158</a></span>
6625
6677
  <span class="normal"><a href="#__codelineno-0-159">159</a></span>
6626
6678
  <span class="normal"><a href="#__codelineno-0-160">160</a></span>
6627
- <span class="normal"><a href="#__codelineno-0-161">161</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_choices</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6628
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6629
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> Given an extras feature, return a list of 2-tuple of `(model_label, pk)`</span>
6630
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> suitable for use as `choices` on a choice field:</span>
6631
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a>
6632
- <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> &gt;&gt;&gt; FeatureQuery(&#39;statuses&#39;).get_choices()</span>
6633
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> [(&#39;dcim.device&#39;, 13), (&#39;dcim.rack&#39;, 34)]</span>
6634
- <a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd"> &quot;&quot;&quot;</span>
6635
- <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="k">return</span> <span class="p">[(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">ct</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6679
+ <span class="normal"><a href="#__codelineno-0-161">161</a></span>
6680
+ <span class="normal"><a href="#__codelineno-0-162">162</a></span>
6681
+ <span class="normal"><a href="#__codelineno-0-163">163</a></span>
6682
+ <span class="normal"><a href="#__codelineno-0-164">164</a></span>
6683
+ <span class="normal"><a href="#__codelineno-0-165">165</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="k">def</span> <span class="nf">get_choices</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6684
+ <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6685
+ <a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> Given an extras feature, return a list of 2-tuple of `(model_label, pk)`</span>
6686
+ <a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd"> suitable for use as `choices` on a choice field:</span>
6687
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a>
6688
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd"> &gt;&gt;&gt; FeatureQuery(&#39;statuses&#39;).get_choices()</span>
6689
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> [(&#39;dcim.device&#39;, 13), (&#39;dcim.rack&#39;, 34)]</span>
6690
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> &quot;&quot;&quot;</span>
6691
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="k">return</span> <span class="p">[(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">ct</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6636
6692
  </code></pre></div></td></tr></table></div>
6637
6693
  </details>
6638
6694
  </div>
@@ -6656,11 +6712,7 @@ suitable for use as <code>choices</code> on a choice field:</p>
6656
6712
 
6657
6713
  <details class="quote">
6658
6714
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
6659
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-128">128</a></span>
6660
- <span class="normal"><a href="#__codelineno-0-129">129</a></span>
6661
- <span class="normal"><a href="#__codelineno-0-130">130</a></span>
6662
- <span class="normal"><a href="#__codelineno-0-131">131</a></span>
6663
- <span class="normal"><a href="#__codelineno-0-132">132</a></span>
6715
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-132">132</a></span>
6664
6716
  <span class="normal"><a href="#__codelineno-0-133">133</a></span>
6665
6717
  <span class="normal"><a href="#__codelineno-0-134">134</a></span>
6666
6718
  <span class="normal"><a href="#__codelineno-0-135">135</a></span>
@@ -6673,24 +6725,28 @@ suitable for use as <code>choices</code> on a choice field:</p>
6673
6725
  <span class="normal"><a href="#__codelineno-0-142">142</a></span>
6674
6726
  <span class="normal"><a href="#__codelineno-0-143">143</a></span>
6675
6727
  <span class="normal"><a href="#__codelineno-0-144">144</a></span>
6676
- <span class="normal"><a href="#__codelineno-0-145">145</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-128" name="__codelineno-0-128"></a><span class="k">def</span> <span class="nf">get_query</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6677
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6678
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a><span class="sd"> Given an extras feature, return a Q object for content type lookup</span>
6679
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a><span class="sd"> &quot;&quot;&quot;</span>
6680
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a>
6681
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="c1"># The `populate_model_features_registry` function is called in the `FeatureQuery().get_query` method instead of</span>
6682
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="c1"># `ExtrasConfig.ready` because `FeatureQuery().get_query` is called before `ExtrasConfig.ready`.</span>
6683
- <a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="c1"># This is because `FeatureQuery` is a helper class used in `Forms` and `Serializers` that are called during the</span>
6684
- <a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="c1"># initialization of the application, before `ExtrasConfig.ready` is called.</span>
6685
- <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="c1"># Calling `populate_model_features_registry` in `ExtrasConfig.ready` would lead to an outdated `model_features`</span>
6686
- <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="c1"># `registry` record being used by `FeatureQuery`.</span>
6687
- <a id="__codelineno-0-139" name="__codelineno-0-139"></a>
6688
- <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="n">populate_model_features_registry</span><span class="p">()</span>
6689
- <a id="__codelineno-0-141" name="__codelineno-0-141"></a> <span class="n">query</span> <span class="o">=</span> <span class="n">Q</span><span class="p">()</span>
6690
- <a id="__codelineno-0-142" name="__codelineno-0-142"></a> <span class="k">for</span> <span class="n">app_label</span><span class="p">,</span> <span class="n">models</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_dict</span><span class="p">():</span>
6691
- <a id="__codelineno-0-143" name="__codelineno-0-143"></a> <span class="n">query</span> <span class="o">|=</span> <span class="n">Q</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model__in</span><span class="o">=</span><span class="n">models</span><span class="p">)</span>
6692
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a>
6693
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">return</span> <span class="n">query</span>
6728
+ <span class="normal"><a href="#__codelineno-0-145">145</a></span>
6729
+ <span class="normal"><a href="#__codelineno-0-146">146</a></span>
6730
+ <span class="normal"><a href="#__codelineno-0-147">147</a></span>
6731
+ <span class="normal"><a href="#__codelineno-0-148">148</a></span>
6732
+ <span class="normal"><a href="#__codelineno-0-149">149</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-132" name="__codelineno-0-132"></a><span class="k">def</span> <span class="nf">get_query</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6733
+ <a id="__codelineno-0-133" name="__codelineno-0-133"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6734
+ <a id="__codelineno-0-134" name="__codelineno-0-134"></a><span class="sd"> Given an extras feature, return a Q object for content type lookup</span>
6735
+ <a id="__codelineno-0-135" name="__codelineno-0-135"></a><span class="sd"> &quot;&quot;&quot;</span>
6736
+ <a id="__codelineno-0-136" name="__codelineno-0-136"></a>
6737
+ <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="c1"># The `populate_model_features_registry` function is called in the `FeatureQuery().get_query` method instead of</span>
6738
+ <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="c1"># `ExtrasConfig.ready` because `FeatureQuery().get_query` is called before `ExtrasConfig.ready`.</span>
6739
+ <a id="__codelineno-0-139" name="__codelineno-0-139"></a> <span class="c1"># This is because `FeatureQuery` is a helper class used in `Forms` and `Serializers` that are called during the</span>
6740
+ <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="c1"># initialization of the application, before `ExtrasConfig.ready` is called.</span>
6741
+ <a id="__codelineno-0-141" name="__codelineno-0-141"></a> <span class="c1"># Calling `populate_model_features_registry` in `ExtrasConfig.ready` would lead to an outdated `model_features`</span>
6742
+ <a id="__codelineno-0-142" name="__codelineno-0-142"></a> <span class="c1"># `registry` record being used by `FeatureQuery`.</span>
6743
+ <a id="__codelineno-0-143" name="__codelineno-0-143"></a>
6744
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a> <span class="n">populate_model_features_registry</span><span class="p">()</span>
6745
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="n">query</span> <span class="o">=</span> <span class="n">Q</span><span class="p">()</span>
6746
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">for</span> <span class="n">app_label</span><span class="p">,</span> <span class="n">models</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_dict</span><span class="p">():</span>
6747
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="n">query</span> <span class="o">|=</span> <span class="n">Q</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model__in</span><span class="o">=</span><span class="n">models</span><span class="p">)</span>
6748
+ <a id="__codelineno-0-148" name="__codelineno-0-148"></a>
6749
+ <a id="__codelineno-0-149" name="__codelineno-0-149"></a> <span class="k">return</span> <span class="n">query</span>
6694
6750
  </code></pre></div></td></tr></table></div>
6695
6751
  </details>
6696
6752
  </div>
@@ -6714,11 +6770,11 @@ suitable for use as <code>choices</code> on a choice field:</p>
6714
6770
 
6715
6771
  <details class="quote">
6716
6772
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
6717
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-163">163</a></span>
6718
- <span class="normal"><a href="#__codelineno-0-164">164</a></span>
6719
- <span class="normal"><a href="#__codelineno-0-165">165</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6720
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a list of model classes that declare this feature.&quot;&quot;&quot;</span>
6721
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="k">return</span> <span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6773
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-167">167</a></span>
6774
+ <span class="normal"><a href="#__codelineno-0-168">168</a></span>
6775
+ <span class="normal"><a href="#__codelineno-0-169">169</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-167" name="__codelineno-0-167"></a><span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6776
+ <a id="__codelineno-0-168" name="__codelineno-0-168"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a list of model classes that declare this feature.&quot;&quot;&quot;</span>
6777
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="k">return</span> <span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_query</span><span class="p">())]</span>
6722
6778
  </code></pre></div></td></tr></table></div>
6723
6779
  </details>
6724
6780
  </div>
@@ -7446,11 +7502,7 @@ suitable for use as <code>choices</code> on a choice field:</p>
7446
7502
 
7447
7503
  <details class="quote">
7448
7504
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
7449
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-189">189</a></span>
7450
- <span class="normal"><a href="#__codelineno-0-190">190</a></span>
7451
- <span class="normal"><a href="#__codelineno-0-191">191</a></span>
7452
- <span class="normal"><a href="#__codelineno-0-192">192</a></span>
7453
- <span class="normal"><a href="#__codelineno-0-193">193</a></span>
7505
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-193">193</a></span>
7454
7506
  <span class="normal"><a href="#__codelineno-0-194">194</a></span>
7455
7507
  <span class="normal"><a href="#__codelineno-0-195">195</a></span>
7456
7508
  <span class="normal"><a href="#__codelineno-0-196">196</a></span>
@@ -7463,24 +7515,28 @@ suitable for use as <code>choices</code> on a choice field:</p>
7463
7515
  <span class="normal"><a href="#__codelineno-0-203">203</a></span>
7464
7516
  <span class="normal"><a href="#__codelineno-0-204">204</a></span>
7465
7517
  <span class="normal"><a href="#__codelineno-0-205">205</a></span>
7466
- <span class="normal"><a href="#__codelineno-0-206">206</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="nd">@deconstructible</span>
7467
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="k">class</span> <span class="nc">RoleModelsQuery</span><span class="p">(</span><span class="n">FeaturedQueryMixin</span><span class="p">):</span>
7468
- <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7469
- <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> Helper class to get ContentType models that implements role.</span>
7470
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> &quot;&quot;&quot;</span>
7471
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a>
7472
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7473
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7474
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> Return a list of classes that implements roles e.g roles = ...</span>
7475
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="sd"> &quot;&quot;&quot;</span>
7476
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="c1"># Avoid circular imports</span>
7477
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.roles</span> <span class="kn">import</span> <span class="n">RoleField</span>
7478
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a>
7479
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="n">model_classes</span> <span class="o">=</span> <span class="p">[]</span>
7480
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="k">for</span> <span class="n">model_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">():</span>
7481
- <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;role&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="s2">&quot;role&quot;</span><span class="p">),</span> <span class="n">RoleField</span><span class="p">):</span>
7482
- <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="n">model_classes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_class</span><span class="p">)</span>
7483
- <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="k">return</span> <span class="n">model_classes</span>
7518
+ <span class="normal"><a href="#__codelineno-0-206">206</a></span>
7519
+ <span class="normal"><a href="#__codelineno-0-207">207</a></span>
7520
+ <span class="normal"><a href="#__codelineno-0-208">208</a></span>
7521
+ <span class="normal"><a href="#__codelineno-0-209">209</a></span>
7522
+ <span class="normal"><a href="#__codelineno-0-210">210</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="nd">@deconstructible</span>
7523
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="k">class</span> <span class="nc">RoleModelsQuery</span><span class="p">(</span><span class="n">FeaturedQueryMixin</span><span class="p">):</span>
7524
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7525
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> Helper class to get ContentType models that implements role.</span>
7526
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> &quot;&quot;&quot;</span>
7527
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a>
7528
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7529
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7530
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="sd"> Return a list of classes that implements roles e.g roles = ...</span>
7531
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> &quot;&quot;&quot;</span>
7532
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># Avoid circular imports</span>
7533
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.roles</span> <span class="kn">import</span> <span class="n">RoleField</span>
7534
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a>
7535
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="n">model_classes</span> <span class="o">=</span> <span class="p">[]</span>
7536
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">for</span> <span class="n">model_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">():</span>
7537
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;role&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="s2">&quot;role&quot;</span><span class="p">),</span> <span class="n">RoleField</span><span class="p">):</span>
7538
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="n">model_classes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_class</span><span class="p">)</span>
7539
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">return</span> <span class="n">model_classes</span>
7484
7540
  </code></pre></div></td></tr></table></div>
7485
7541
  </details>
7486
7542
 
@@ -7513,29 +7569,29 @@ suitable for use as <code>choices</code> on a choice field:</p>
7513
7569
 
7514
7570
  <details class="quote">
7515
7571
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
7516
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-195">195</a></span>
7517
- <span class="normal"><a href="#__codelineno-0-196">196</a></span>
7518
- <span class="normal"><a href="#__codelineno-0-197">197</a></span>
7519
- <span class="normal"><a href="#__codelineno-0-198">198</a></span>
7520
- <span class="normal"><a href="#__codelineno-0-199">199</a></span>
7572
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-199">199</a></span>
7521
7573
  <span class="normal"><a href="#__codelineno-0-200">200</a></span>
7522
7574
  <span class="normal"><a href="#__codelineno-0-201">201</a></span>
7523
7575
  <span class="normal"><a href="#__codelineno-0-202">202</a></span>
7524
7576
  <span class="normal"><a href="#__codelineno-0-203">203</a></span>
7525
7577
  <span class="normal"><a href="#__codelineno-0-204">204</a></span>
7526
7578
  <span class="normal"><a href="#__codelineno-0-205">205</a></span>
7527
- <span class="normal"><a href="#__codelineno-0-206">206</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7528
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7529
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> Return a list of classes that implements roles e.g roles = ...</span>
7530
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="sd"> &quot;&quot;&quot;</span>
7531
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="c1"># Avoid circular imports</span>
7532
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.roles</span> <span class="kn">import</span> <span class="n">RoleField</span>
7533
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a>
7534
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="n">model_classes</span> <span class="o">=</span> <span class="p">[]</span>
7535
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="k">for</span> <span class="n">model_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">():</span>
7536
- <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;role&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="s2">&quot;role&quot;</span><span class="p">),</span> <span class="n">RoleField</span><span class="p">):</span>
7537
- <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="n">model_classes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_class</span><span class="p">)</span>
7538
- <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="k">return</span> <span class="n">model_classes</span>
7579
+ <span class="normal"><a href="#__codelineno-0-206">206</a></span>
7580
+ <span class="normal"><a href="#__codelineno-0-207">207</a></span>
7581
+ <span class="normal"><a href="#__codelineno-0-208">208</a></span>
7582
+ <span class="normal"><a href="#__codelineno-0-209">209</a></span>
7583
+ <span class="normal"><a href="#__codelineno-0-210">210</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-199" name="__codelineno-0-199"></a><span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7584
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7585
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="sd"> Return a list of classes that implements roles e.g roles = ...</span>
7586
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> &quot;&quot;&quot;</span>
7587
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># Avoid circular imports</span>
7588
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.roles</span> <span class="kn">import</span> <span class="n">RoleField</span>
7589
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a>
7590
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="n">model_classes</span> <span class="o">=</span> <span class="p">[]</span>
7591
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">for</span> <span class="n">model_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">():</span>
7592
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;role&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="s2">&quot;role&quot;</span><span class="p">),</span> <span class="n">RoleField</span><span class="p">):</span>
7593
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="n">model_classes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_class</span><span class="p">)</span>
7594
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">return</span> <span class="n">model_classes</span>
7539
7595
  </code></pre></div></td></tr></table></div>
7540
7596
  </details>
7541
7597
  </div>
@@ -7570,11 +7626,7 @@ suitable for use as <code>choices</code> on a choice field:</p>
7570
7626
 
7571
7627
  <details class="quote">
7572
7628
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
7573
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-168">168</a></span>
7574
- <span class="normal"><a href="#__codelineno-0-169">169</a></span>
7575
- <span class="normal"><a href="#__codelineno-0-170">170</a></span>
7576
- <span class="normal"><a href="#__codelineno-0-171">171</a></span>
7577
- <span class="normal"><a href="#__codelineno-0-172">172</a></span>
7629
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-172">172</a></span>
7578
7630
  <span class="normal"><a href="#__codelineno-0-173">173</a></span>
7579
7631
  <span class="normal"><a href="#__codelineno-0-174">174</a></span>
7580
7632
  <span class="normal"><a href="#__codelineno-0-175">175</a></span>
@@ -7588,25 +7640,29 @@ suitable for use as <code>choices</code> on a choice field:</p>
7588
7640
  <span class="normal"><a href="#__codelineno-0-183">183</a></span>
7589
7641
  <span class="normal"><a href="#__codelineno-0-184">184</a></span>
7590
7642
  <span class="normal"><a href="#__codelineno-0-185">185</a></span>
7591
- <span class="normal"><a href="#__codelineno-0-186">186</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-168" name="__codelineno-0-168"></a><span class="nd">@deconstructible</span>
7592
- <a id="__codelineno-0-169" name="__codelineno-0-169"></a><span class="k">class</span> <span class="nc">TaggableClassesQuery</span><span class="p">(</span><span class="n">FeaturedQueryMixin</span><span class="p">):</span>
7593
- <a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7594
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> Helper class to get ContentType models that implements tags(TagsField)</span>
7595
- <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> &quot;&quot;&quot;</span>
7596
- <a id="__codelineno-0-173" name="__codelineno-0-173"></a>
7597
- <a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7598
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7599
- <a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="sd"> Return a list of classes that has implements tags e.g tags = TagsField(...)</span>
7600
- <a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="sd"> &quot;&quot;&quot;</span>
7601
- <a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="k">return</span> <span class="p">[</span>
7602
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="n">_class</span>
7603
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="k">for</span> <span class="n">_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span>
7604
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="k">if</span> <span class="p">(</span>
7605
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="nb">hasattr</span><span class="p">(</span><span class="n">_class</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="p">)</span>
7606
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_class</span><span class="o">.</span><span class="n">tags</span><span class="p">,</span> <span class="n">TagsManager</span><span class="p">)</span>
7607
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="ow">and</span> <span class="s2">&quot;.tests.&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_class</span><span class="o">.</span><span class="vm">__module__</span> <span class="c1"># avoid leakage from nautobot.core.tests.test_filters</span>
7608
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="p">)</span>
7609
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="p">]</span>
7643
+ <span class="normal"><a href="#__codelineno-0-186">186</a></span>
7644
+ <span class="normal"><a href="#__codelineno-0-187">187</a></span>
7645
+ <span class="normal"><a href="#__codelineno-0-188">188</a></span>
7646
+ <span class="normal"><a href="#__codelineno-0-189">189</a></span>
7647
+ <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-172" name="__codelineno-0-172"></a><span class="nd">@deconstructible</span>
7648
+ <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="k">class</span> <span class="nc">TaggableClassesQuery</span><span class="p">(</span><span class="n">FeaturedQueryMixin</span><span class="p">):</span>
7649
+ <a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7650
+ <a id="__codelineno-0-175" name="__codelineno-0-175"></a><span class="sd"> Helper class to get ContentType models that implements tags(TagsField)</span>
7651
+ <a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="sd"> &quot;&quot;&quot;</span>
7652
+ <a id="__codelineno-0-177" name="__codelineno-0-177"></a>
7653
+ <a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7654
+ <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7655
+ <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> Return a list of classes that has implements tags e.g tags = TagsField(...)</span>
7656
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> &quot;&quot;&quot;</span>
7657
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="k">return</span> <span class="p">[</span>
7658
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="n">_class</span>
7659
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="k">for</span> <span class="n">_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span>
7660
+ <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="k">if</span> <span class="p">(</span>
7661
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="nb">hasattr</span><span class="p">(</span><span class="n">_class</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="p">)</span>
7662
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_class</span><span class="o">.</span><span class="n">tags</span><span class="p">,</span> <span class="n">TagsManager</span><span class="p">)</span>
7663
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a> <span class="ow">and</span> <span class="s2">&quot;.tests.&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_class</span><span class="o">.</span><span class="vm">__module__</span> <span class="c1"># avoid leakage from nautobot.core.tests.test_filters</span>
7664
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="p">)</span>
7665
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="p">]</span>
7610
7666
  </code></pre></div></td></tr></table></div>
7611
7667
  </details>
7612
7668
 
@@ -7639,11 +7695,7 @@ suitable for use as <code>choices</code> on a choice field:</p>
7639
7695
 
7640
7696
  <details class="quote">
7641
7697
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
7642
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-174">174</a></span>
7643
- <span class="normal"><a href="#__codelineno-0-175">175</a></span>
7644
- <span class="normal"><a href="#__codelineno-0-176">176</a></span>
7645
- <span class="normal"><a href="#__codelineno-0-177">177</a></span>
7646
- <span class="normal"><a href="#__codelineno-0-178">178</a></span>
7698
+ <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>
7647
7699
  <span class="normal"><a href="#__codelineno-0-179">179</a></span>
7648
7700
  <span class="normal"><a href="#__codelineno-0-180">180</a></span>
7649
7701
  <span class="normal"><a href="#__codelineno-0-181">181</a></span>
@@ -7651,19 +7703,23 @@ suitable for use as <code>choices</code> on a choice field:</p>
7651
7703
  <span class="normal"><a href="#__codelineno-0-183">183</a></span>
7652
7704
  <span class="normal"><a href="#__codelineno-0-184">184</a></span>
7653
7705
  <span class="normal"><a href="#__codelineno-0-185">185</a></span>
7654
- <span class="normal"><a href="#__codelineno-0-186">186</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="k">def</span> <span class="nf">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7655
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7656
- <a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="sd"> Return a list of classes that has implements tags e.g tags = TagsField(...)</span>
7657
- <a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="sd"> &quot;&quot;&quot;</span>
7658
- <a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="k">return</span> <span class="p">[</span>
7659
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="n">_class</span>
7660
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="k">for</span> <span class="n">_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span>
7661
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="k">if</span> <span class="p">(</span>
7662
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="nb">hasattr</span><span class="p">(</span><span class="n">_class</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="p">)</span>
7663
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_class</span><span class="o">.</span><span class="n">tags</span><span class="p">,</span> <span class="n">TagsManager</span><span class="p">)</span>
7664
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="ow">and</span> <span class="s2">&quot;.tests.&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_class</span><span class="o">.</span><span class="vm">__module__</span> <span class="c1"># avoid leakage from nautobot.core.tests.test_filters</span>
7665
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="p">)</span>
7666
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="p">]</span>
7706
+ <span class="normal"><a href="#__codelineno-0-186">186</a></span>
7707
+ <span class="normal"><a href="#__codelineno-0-187">187</a></span>
7708
+ <span class="normal"><a href="#__codelineno-0-188">188</a></span>
7709
+ <span class="normal"><a href="#__codelineno-0-189">189</a></span>
7710
+ <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">list_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
7711
+ <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7712
+ <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> Return a list of classes that has implements tags e.g tags = TagsField(...)</span>
7713
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> &quot;&quot;&quot;</span>
7714
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="k">return</span> <span class="p">[</span>
7715
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="n">_class</span>
7716
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="k">for</span> <span class="n">_class</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span>
7717
+ <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="k">if</span> <span class="p">(</span>
7718
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="nb">hasattr</span><span class="p">(</span><span class="n">_class</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="p">)</span>
7719
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_class</span><span class="o">.</span><span class="n">tags</span><span class="p">,</span> <span class="n">TagsManager</span><span class="p">)</span>
7720
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a> <span class="ow">and</span> <span class="s2">&quot;.tests.&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_class</span><span class="o">.</span><span class="vm">__module__</span> <span class="c1"># avoid leakage from nautobot.core.tests.test_filters</span>
7721
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="p">)</span>
7722
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="p">]</span>
7667
7723
  </code></pre></div></td></tr></table></div>
7668
7724
  </details>
7669
7725
  </div>
@@ -7812,29 +7868,29 @@ Used in CustomField, ComputedField and Relationship models.</p>
7812
7868
 
7813
7869
  <details class="quote">
7814
7870
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
7815
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-483">483</a></span>
7816
- <span class="normal"><a href="#__codelineno-0-484">484</a></span>
7817
- <span class="normal"><a href="#__codelineno-0-485">485</a></span>
7818
- <span class="normal"><a href="#__codelineno-0-486">486</a></span>
7819
- <span class="normal"><a href="#__codelineno-0-487">487</a></span>
7871
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-487">487</a></span>
7820
7872
  <span class="normal"><a href="#__codelineno-0-488">488</a></span>
7821
7873
  <span class="normal"><a href="#__codelineno-0-489">489</a></span>
7822
7874
  <span class="normal"><a href="#__codelineno-0-490">490</a></span>
7823
7875
  <span class="normal"><a href="#__codelineno-0-491">491</a></span>
7824
7876
  <span class="normal"><a href="#__codelineno-0-492">492</a></span>
7825
7877
  <span class="normal"><a href="#__codelineno-0-493">493</a></span>
7826
- <span class="normal"><a href="#__codelineno-0-494">494</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-483" name="__codelineno-0-483"></a><span class="k">def</span> <span class="nf">check_if_key_is_graphql_safe</span><span class="p">(</span><span class="n">model_name</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">field_name</span><span class="o">=</span><span class="s2">&quot;key&quot;</span><span class="p">):</span>
7827
- <a id="__codelineno-0-484" name="__codelineno-0-484"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7828
- <a id="__codelineno-0-485" name="__codelineno-0-485"></a><span class="sd"> Helper method to check if a key field is Python/GraphQL safe.</span>
7829
- <a id="__codelineno-0-486" name="__codelineno-0-486"></a><span class="sd"> Used in CustomField, ComputedField and Relationship models.</span>
7830
- <a id="__codelineno-0-487" name="__codelineno-0-487"></a><span class="sd"> &quot;&quot;&quot;</span>
7831
- <a id="__codelineno-0-488" name="__codelineno-0-488"></a> <span class="n">graphql_safe_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s2">&quot;[_A-Za-z][_0-9A-Za-z]*&quot;</span><span class="p">)</span>
7832
- <a id="__codelineno-0-489" name="__codelineno-0-489"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">graphql_safe_pattern</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
7833
- <a id="__codelineno-0-490" name="__codelineno-0-490"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
7834
- <a id="__codelineno-0-491" name="__codelineno-0-491"></a> <span class="p">{</span>
7835
- <a id="__codelineno-0-492" name="__codelineno-0-492"></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;This </span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2"> is not Python/GraphQL safe. Please do not start the </span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2"> with a digit and do not use hyphens or whitespace&quot;</span>
7836
- <a id="__codelineno-0-493" name="__codelineno-0-493"></a> <span class="p">}</span>
7837
- <a id="__codelineno-0-494" name="__codelineno-0-494"></a> <span class="p">)</span>
7878
+ <span class="normal"><a href="#__codelineno-0-494">494</a></span>
7879
+ <span class="normal"><a href="#__codelineno-0-495">495</a></span>
7880
+ <span class="normal"><a href="#__codelineno-0-496">496</a></span>
7881
+ <span class="normal"><a href="#__codelineno-0-497">497</a></span>
7882
+ <span class="normal"><a href="#__codelineno-0-498">498</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-487" name="__codelineno-0-487"></a><span class="k">def</span> <span class="nf">check_if_key_is_graphql_safe</span><span class="p">(</span><span class="n">model_name</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">field_name</span><span class="o">=</span><span class="s2">&quot;key&quot;</span><span class="p">):</span>
7883
+ <a id="__codelineno-0-488" name="__codelineno-0-488"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7884
+ <a id="__codelineno-0-489" name="__codelineno-0-489"></a><span class="sd"> Helper method to check if a key field is Python/GraphQL safe.</span>
7885
+ <a id="__codelineno-0-490" name="__codelineno-0-490"></a><span class="sd"> Used in CustomField, ComputedField and Relationship models.</span>
7886
+ <a id="__codelineno-0-491" name="__codelineno-0-491"></a><span class="sd"> &quot;&quot;&quot;</span>
7887
+ <a id="__codelineno-0-492" name="__codelineno-0-492"></a> <span class="n">graphql_safe_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s2">&quot;[_A-Za-z][_0-9A-Za-z]*&quot;</span><span class="p">)</span>
7888
+ <a id="__codelineno-0-493" name="__codelineno-0-493"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">graphql_safe_pattern</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
7889
+ <a id="__codelineno-0-494" name="__codelineno-0-494"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
7890
+ <a id="__codelineno-0-495" name="__codelineno-0-495"></a> <span class="p">{</span>
7891
+ <a id="__codelineno-0-496" name="__codelineno-0-496"></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;This </span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2"> is not Python/GraphQL safe. Please do not start the </span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2"> with a digit and do not use hyphens or whitespace&quot;</span>
7892
+ <a id="__codelineno-0-497" name="__codelineno-0-497"></a> <span class="p">}</span>
7893
+ <a id="__codelineno-0-498" name="__codelineno-0-498"></a> <span class="p">)</span>
7838
7894
  </code></pre></div></td></tr></table></div>
7839
7895
  </details>
7840
7896
  </div>
@@ -8412,11 +8468,7 @@ while discarding <code>querydict</code> params which are not part of <code>filte
8412
8468
 
8413
8469
  <details class="quote">
8414
8470
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
8415
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-497">497</a></span>
8416
- <span class="normal"><a href="#__codelineno-0-498">498</a></span>
8417
- <span class="normal"><a href="#__codelineno-0-499">499</a></span>
8418
- <span class="normal"><a href="#__codelineno-0-500">500</a></span>
8419
- <span class="normal"><a href="#__codelineno-0-501">501</a></span>
8471
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-501">501</a></span>
8420
8472
  <span class="normal"><a href="#__codelineno-0-502">502</a></span>
8421
8473
  <span class="normal"><a href="#__codelineno-0-503">503</a></span>
8422
8474
  <span class="normal"><a href="#__codelineno-0-504">504</a></span>
@@ -8425,20 +8477,24 @@ while discarding <code>querydict</code> params which are not part of <code>filte
8425
8477
  <span class="normal"><a href="#__codelineno-0-507">507</a></span>
8426
8478
  <span class="normal"><a href="#__codelineno-0-508">508</a></span>
8427
8479
  <span class="normal"><a href="#__codelineno-0-509">509</a></span>
8428
- <span class="normal"><a href="#__codelineno-0-510">510</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-497" name="__codelineno-0-497"></a><span class="k">def</span> <span class="nf">fixup_null_statuses</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">model_contenttype</span><span class="p">,</span> <span class="n">status_model</span><span class="p">):</span>
8429
- <a id="__codelineno-0-498" name="__codelineno-0-498"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;For instances of model that have an invalid NULL status field, create and use a special status_model instance.&quot;&quot;&quot;</span>
8430
- <a id="__codelineno-0-499" name="__codelineno-0-499"></a> <span class="n">instances_to_fixup</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status__isnull</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
8431
- <a id="__codelineno-0-500" name="__codelineno-0-500"></a> <span class="k">if</span> <span class="n">instances_to_fixup</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
8432
- <a id="__codelineno-0-501" name="__codelineno-0-501"></a> <span class="n">null_status</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">status_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
8433
- <a id="__codelineno-0-502" name="__codelineno-0-502"></a> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;NULL&quot;</span><span class="p">,</span>
8434
- <a id="__codelineno-0-503" name="__codelineno-0-503"></a> <span class="n">defaults</span><span class="o">=</span><span class="p">{</span>
8435
- <a id="__codelineno-0-504" name="__codelineno-0-504"></a> <span class="s2">&quot;color&quot;</span><span class="p">:</span> <span class="n">ColorChoices</span><span class="o">.</span><span class="n">COLOR_BLACK</span><span class="p">,</span>
8436
- <a id="__codelineno-0-505" name="__codelineno-0-505"></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;Created by Nautobot to replace invalid null references&quot;</span><span class="p">,</span>
8437
- <a id="__codelineno-0-506" name="__codelineno-0-506"></a> <span class="p">},</span>
8438
- <a id="__codelineno-0-507" name="__codelineno-0-507"></a> <span class="p">)</span>
8439
- <a id="__codelineno-0-508" name="__codelineno-0-508"></a> <span class="n">null_status</span><span class="o">.</span><span class="n">content_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">model_contenttype</span><span class="p">)</span>
8440
- <a id="__codelineno-0-509" name="__codelineno-0-509"></a> <span class="n">updated_count</span> <span class="o">=</span> <span class="n">instances_to_fixup</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="n">null_status</span><span class="p">)</span>
8441
- <a id="__codelineno-0-510" name="__codelineno-0-510"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; Found and fixed </span><span class="si">{</span><span class="n">updated_count</span><span class="si">}</span><span class="s2"> instances of </span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> that had null &#39;status&#39; fields.&quot;</span><span class="p">)</span>
8480
+ <span class="normal"><a href="#__codelineno-0-510">510</a></span>
8481
+ <span class="normal"><a href="#__codelineno-0-511">511</a></span>
8482
+ <span class="normal"><a href="#__codelineno-0-512">512</a></span>
8483
+ <span class="normal"><a href="#__codelineno-0-513">513</a></span>
8484
+ <span class="normal"><a href="#__codelineno-0-514">514</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-501" name="__codelineno-0-501"></a><span class="k">def</span> <span class="nf">fixup_null_statuses</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">model_contenttype</span><span class="p">,</span> <span class="n">status_model</span><span class="p">):</span>
8485
+ <a id="__codelineno-0-502" name="__codelineno-0-502"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;For instances of model that have an invalid NULL status field, create and use a special status_model instance.&quot;&quot;&quot;</span>
8486
+ <a id="__codelineno-0-503" name="__codelineno-0-503"></a> <span class="n">instances_to_fixup</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status__isnull</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
8487
+ <a id="__codelineno-0-504" name="__codelineno-0-504"></a> <span class="k">if</span> <span class="n">instances_to_fixup</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
8488
+ <a id="__codelineno-0-505" name="__codelineno-0-505"></a> <span class="n">null_status</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">status_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
8489
+ <a id="__codelineno-0-506" name="__codelineno-0-506"></a> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;NULL&quot;</span><span class="p">,</span>
8490
+ <a id="__codelineno-0-507" name="__codelineno-0-507"></a> <span class="n">defaults</span><span class="o">=</span><span class="p">{</span>
8491
+ <a id="__codelineno-0-508" name="__codelineno-0-508"></a> <span class="s2">&quot;color&quot;</span><span class="p">:</span> <span class="n">ColorChoices</span><span class="o">.</span><span class="n">COLOR_BLACK</span><span class="p">,</span>
8492
+ <a id="__codelineno-0-509" name="__codelineno-0-509"></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;Created by Nautobot to replace invalid null references&quot;</span><span class="p">,</span>
8493
+ <a id="__codelineno-0-510" name="__codelineno-0-510"></a> <span class="p">},</span>
8494
+ <a id="__codelineno-0-511" name="__codelineno-0-511"></a> <span class="p">)</span>
8495
+ <a id="__codelineno-0-512" name="__codelineno-0-512"></a> <span class="n">null_status</span><span class="o">.</span><span class="n">content_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">model_contenttype</span><span class="p">)</span>
8496
+ <a id="__codelineno-0-513" name="__codelineno-0-513"></a> <span class="n">updated_count</span> <span class="o">=</span> <span class="n">instances_to_fixup</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="n">null_status</span><span class="p">)</span>
8497
+ <a id="__codelineno-0-514" name="__codelineno-0-514"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; Found and fixed </span><span class="si">{</span><span class="n">updated_count</span><span class="si">}</span><span class="s2"> instances of </span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> that had null &#39;status&#39; fields.&quot;</span><span class="p">)</span>
8442
8498
  </code></pre></div></td></tr></table></div>
8443
8499
  </details>
8444
8500
  </div>
@@ -8611,17 +8667,17 @@ while discarding <code>querydict</code> params which are not part of <code>filte
8611
8667
 
8612
8668
  <details class="quote">
8613
8669
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
8614
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-280">280</a></span>
8615
- <span class="normal"><a href="#__codelineno-0-281">281</a></span>
8616
- <span class="normal"><a href="#__codelineno-0-282">282</a></span>
8617
- <span class="normal"><a href="#__codelineno-0-283">283</a></span>
8618
- <span class="normal"><a href="#__codelineno-0-284">284</a></span>
8619
- <span class="normal"><a href="#__codelineno-0-285">285</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-280" name="__codelineno-0-280"></a><span class="k">def</span> <span class="nf">generate_signature</span><span class="p">(</span><span class="n">request_body</span><span class="p">,</span> <span class="n">secret</span><span class="p">):</span>
8620
- <a id="__codelineno-0-281" name="__codelineno-0-281"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8621
- <a id="__codelineno-0-282" name="__codelineno-0-282"></a><span class="sd"> Return a cryptographic signature that can be used to verify the authenticity of webhook data.</span>
8622
- <a id="__codelineno-0-283" name="__codelineno-0-283"></a><span class="sd"> &quot;&quot;&quot;</span>
8623
- <a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="n">hmac_prep</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">secret</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf8&quot;</span><span class="p">),</span> <span class="n">msg</span><span class="o">=</span><span class="n">request_body</span><span class="p">,</span> <span class="n">digestmod</span><span class="o">=</span><span class="n">hashlib</span><span class="o">.</span><span class="n">sha512</span><span class="p">)</span>
8624
- <a id="__codelineno-0-285" name="__codelineno-0-285"></a> <span class="k">return</span> <span class="n">hmac_prep</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
8670
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-284">284</a></span>
8671
+ <span class="normal"><a href="#__codelineno-0-285">285</a></span>
8672
+ <span class="normal"><a href="#__codelineno-0-286">286</a></span>
8673
+ <span class="normal"><a href="#__codelineno-0-287">287</a></span>
8674
+ <span class="normal"><a href="#__codelineno-0-288">288</a></span>
8675
+ <span class="normal"><a href="#__codelineno-0-289">289</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-284" name="__codelineno-0-284"></a><span class="k">def</span> <span class="nf">generate_signature</span><span class="p">(</span><span class="n">request_body</span><span class="p">,</span> <span class="n">secret</span><span class="p">):</span>
8676
+ <a id="__codelineno-0-285" name="__codelineno-0-285"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8677
+ <a id="__codelineno-0-286" name="__codelineno-0-286"></a><span class="sd"> Return a cryptographic signature that can be used to verify the authenticity of webhook data.</span>
8678
+ <a id="__codelineno-0-287" name="__codelineno-0-287"></a><span class="sd"> &quot;&quot;&quot;</span>
8679
+ <a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">hmac_prep</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">secret</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf8&quot;</span><span class="p">),</span> <span class="n">msg</span><span class="o">=</span><span class="n">request_body</span><span class="p">,</span> <span class="n">digestmod</span><span class="o">=</span><span class="n">hashlib</span><span class="o">.</span><span class="n">sha512</span><span class="p">)</span>
8680
+ <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">return</span> <span class="n">hmac_prep</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
8625
8681
  </code></pre></div></td></tr></table></div>
8626
8682
  </details>
8627
8683
  </div>
@@ -8795,11 +8851,7 @@ the form {queue_name: num_workers}</p>
8795
8851
 
8796
8852
  <details class="quote">
8797
8853
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
8798
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-288">288</a></span>
8799
- <span class="normal"><a href="#__codelineno-0-289">289</a></span>
8800
- <span class="normal"><a href="#__codelineno-0-290">290</a></span>
8801
- <span class="normal"><a href="#__codelineno-0-291">291</a></span>
8802
- <span class="normal"><a href="#__codelineno-0-292">292</a></span>
8854
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-292">292</a></span>
8803
8855
  <span class="normal"><a href="#__codelineno-0-293">293</a></span>
8804
8856
  <span class="normal"><a href="#__codelineno-0-294">294</a></span>
8805
8857
  <span class="normal"><a href="#__codelineno-0-295">295</a></span>
@@ -8814,26 +8866,30 @@ the form {queue_name: num_workers}</p>
8814
8866
  <span class="normal"><a href="#__codelineno-0-304">304</a></span>
8815
8867
  <span class="normal"><a href="#__codelineno-0-305">305</a></span>
8816
8868
  <span class="normal"><a href="#__codelineno-0-306">306</a></span>
8817
- <span class="normal"><a href="#__codelineno-0-307">307</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-288" name="__codelineno-0-288"></a><span class="k">def</span> <span class="nf">get_celery_queues</span><span class="p">():</span>
8818
- <a id="__codelineno-0-289" name="__codelineno-0-289"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8819
- <a id="__codelineno-0-290" name="__codelineno-0-290"></a><span class="sd"> Return a dictionary of celery queues and the number of workers active on the queue in</span>
8820
- <a id="__codelineno-0-291" name="__codelineno-0-291"></a><span class="sd"> the form {queue_name: num_workers}</span>
8821
- <a id="__codelineno-0-292" name="__codelineno-0-292"></a><span class="sd"> &quot;&quot;&quot;</span>
8822
- <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="kn">from</span> <span class="nn">nautobot.core.celery</span> <span class="kn">import</span> <span class="n">app</span> <span class="c1"># prevent circular import</span>
8823
- <a id="__codelineno-0-294" name="__codelineno-0-294"></a>
8824
- <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="n">celery_queues</span> <span class="o">=</span> <span class="p">{}</span>
8825
- <a id="__codelineno-0-296" name="__codelineno-0-296"></a>
8826
- <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">celery_inspect</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">control</span><span class="o">.</span><span class="n">inspect</span><span class="p">()</span>
8827
- <a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">active_queues</span> <span class="o">=</span> <span class="n">celery_inspect</span><span class="o">.</span><span class="n">active_queues</span><span class="p">()</span>
8828
- <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="k">if</span> <span class="n">active_queues</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
8829
- <a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="k">return</span> <span class="n">celery_queues</span>
8830
- <a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="k">for</span> <span class="n">task_queue_list</span> <span class="ow">in</span> <span class="n">active_queues</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
8831
- <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="n">distinct_queues</span> <span class="o">=</span> <span class="p">{</span><span class="n">q</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">q</span> <span class="ow">in</span> <span class="n">task_queue_list</span><span class="p">}</span>
8832
- <a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">for</span> <span class="n">queue</span> <span class="ow">in</span> <span class="n">distinct_queues</span><span class="p">:</span>
8833
- <a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="n">celery_queues</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
8834
- <a id="__codelineno-0-305" name="__codelineno-0-305"></a> <span class="n">celery_queues</span><span class="p">[</span><span class="n">queue</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
8835
- <a id="__codelineno-0-306" name="__codelineno-0-306"></a>
8836
- <a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="k">return</span> <span class="n">celery_queues</span>
8869
+ <span class="normal"><a href="#__codelineno-0-307">307</a></span>
8870
+ <span class="normal"><a href="#__codelineno-0-308">308</a></span>
8871
+ <span class="normal"><a href="#__codelineno-0-309">309</a></span>
8872
+ <span class="normal"><a href="#__codelineno-0-310">310</a></span>
8873
+ <span class="normal"><a href="#__codelineno-0-311">311</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-292" name="__codelineno-0-292"></a><span class="k">def</span> <span class="nf">get_celery_queues</span><span class="p">():</span>
8874
+ <a id="__codelineno-0-293" name="__codelineno-0-293"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8875
+ <a id="__codelineno-0-294" name="__codelineno-0-294"></a><span class="sd"> Return a dictionary of celery queues and the number of workers active on the queue in</span>
8876
+ <a id="__codelineno-0-295" name="__codelineno-0-295"></a><span class="sd"> the form {queue_name: num_workers}</span>
8877
+ <a id="__codelineno-0-296" name="__codelineno-0-296"></a><span class="sd"> &quot;&quot;&quot;</span>
8878
+ <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="kn">from</span> <span class="nn">nautobot.core.celery</span> <span class="kn">import</span> <span class="n">app</span> <span class="c1"># prevent circular import</span>
8879
+ <a id="__codelineno-0-298" name="__codelineno-0-298"></a>
8880
+ <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="n">celery_queues</span> <span class="o">=</span> <span class="p">{}</span>
8881
+ <a id="__codelineno-0-300" name="__codelineno-0-300"></a>
8882
+ <a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="n">celery_inspect</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">control</span><span class="o">.</span><span class="n">inspect</span><span class="p">()</span>
8883
+ <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="n">active_queues</span> <span class="o">=</span> <span class="n">celery_inspect</span><span class="o">.</span><span class="n">active_queues</span><span class="p">()</span>
8884
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">if</span> <span class="n">active_queues</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
8885
+ <a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="k">return</span> <span class="n">celery_queues</span>
8886
+ <a id="__codelineno-0-305" name="__codelineno-0-305"></a> <span class="k">for</span> <span class="n">task_queue_list</span> <span class="ow">in</span> <span class="n">active_queues</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
8887
+ <a id="__codelineno-0-306" name="__codelineno-0-306"></a> <span class="n">distinct_queues</span> <span class="o">=</span> <span class="p">{</span><span class="n">q</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">q</span> <span class="ow">in</span> <span class="n">task_queue_list</span><span class="p">}</span>
8888
+ <a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="k">for</span> <span class="n">queue</span> <span class="ow">in</span> <span class="n">distinct_queues</span><span class="p">:</span>
8889
+ <a id="__codelineno-0-308" name="__codelineno-0-308"></a> <span class="n">celery_queues</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
8890
+ <a id="__codelineno-0-309" name="__codelineno-0-309"></a> <span class="n">celery_queues</span><span class="p">[</span><span class="n">queue</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
8891
+ <a id="__codelineno-0-310" name="__codelineno-0-310"></a>
8892
+ <a id="__codelineno-0-311" name="__codelineno-0-311"></a> <span class="k">return</span> <span class="n">celery_queues</span>
8837
8893
  </code></pre></div></td></tr></table></div>
8838
8894
  </details>
8839
8895
  </div>
@@ -8858,9 +8914,7 @@ by the model class. If an instance is provided, the queryset will also be filter
8858
8914
 
8859
8915
  <details class="quote">
8860
8916
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
8861
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-13">13</a></span>
8862
- <span class="normal"><a href="#__codelineno-0-14">14</a></span>
8863
- <span class="normal"><a href="#__codelineno-0-15">15</a></span>
8917
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-15">15</a></span>
8864
8918
  <span class="normal"><a href="#__codelineno-0-16">16</a></span>
8865
8919
  <span class="normal"><a href="#__codelineno-0-17">17</a></span>
8866
8920
  <span class="normal"><a href="#__codelineno-0-18">18</a></span>
@@ -8872,21 +8926,23 @@ by the model class. If an instance is provided, the queryset will also be filter
8872
8926
  <span class="normal"><a href="#__codelineno-0-24">24</a></span>
8873
8927
  <span class="normal"><a href="#__codelineno-0-25">25</a></span>
8874
8928
  <span class="normal"><a href="#__codelineno-0-26">26</a></span>
8875
- <span class="normal"><a href="#__codelineno-0-27">27</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="k">def</span> <span class="nf">get_changes_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
8876
- <a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8877
- <a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="sd"> Return a queryset of ObjectChanges for a model or instance. The queryset will be filtered</span>
8878
- <a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="sd"> by the model class. If an instance is provided, the queryset will also be filtered by the instance id.</span>
8879
- <a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="sd"> &quot;&quot;&quot;</span>
8880
- <a id="__codelineno-0-18" name="__codelineno-0-18"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">ObjectChange</span> <span class="c1"># prevent circular import</span>
8881
- <a id="__codelineno-0-19" name="__codelineno-0-19"></a>
8882
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
8883
- <a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="k">return</span> <span class="n">ObjectChange</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
8884
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="n">changed_object_type</span><span class="o">=</span><span class="n">ContentType</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="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">),</span>
8885
- <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="n">changed_object_id</span><span class="o">=</span><span class="n">model</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span>
8886
- <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="p">)</span>
8887
- <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
8888
- <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="k">return</span> <span class="n">ObjectChange</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">changed_object_type</span><span class="o">=</span><span class="n">ContentType</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="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">))</span>
8889
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="si">!r}</span><span class="s2"> is not a Django Model class or instance&quot;</span><span class="p">)</span>
8929
+ <span class="normal"><a href="#__codelineno-0-27">27</a></span>
8930
+ <span class="normal"><a href="#__codelineno-0-28">28</a></span>
8931
+ <span class="normal"><a href="#__codelineno-0-29">29</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="k">def</span> <span class="nf">get_changes_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
8932
+ <a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8933
+ <a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="sd"> Return a queryset of ObjectChanges for a model or instance. The queryset will be filtered</span>
8934
+ <a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="sd"> by the model class. If an instance is provided, the queryset will also be filtered by the instance id.</span>
8935
+ <a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="sd"> &quot;&quot;&quot;</span>
8936
+ <a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">ObjectChange</span> <span class="c1"># prevent circular import</span>
8937
+ <a id="__codelineno-0-21" name="__codelineno-0-21"></a>
8938
+ <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
8939
+ <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="k">return</span> <span class="n">ObjectChange</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
8940
+ <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="n">changed_object_type</span><span class="o">=</span><span class="n">ContentType</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="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">),</span>
8941
+ <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="n">changed_object_id</span><span class="o">=</span><span class="n">model</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span>
8942
+ <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="p">)</span>
8943
+ <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
8944
+ <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="k">return</span> <span class="n">ObjectChange</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">changed_object_type</span><span class="o">=</span><span class="n">ContentType</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="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">))</span>
8945
+ <a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="si">!r}</span><span class="s2"> is not a Django Model class or instance&quot;</span><span class="p">)</span>
8890
8946
  </code></pre></div></td></tr></table></div>
8891
8947
  </details>
8892
8948
  </div>
@@ -9252,9 +9308,7 @@ associated with the model and its name is expected to be <code>{ModelName}Filter
9252
9308
 
9253
9309
  <details class="quote">
9254
9310
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
9255
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-141">141</a></span>
9256
- <span class="normal"><a href="#__codelineno-0-142">142</a></span>
9257
- <span class="normal"><a href="#__codelineno-0-143">143</a></span>
9311
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-143">143</a></span>
9258
9312
  <span class="normal"><a href="#__codelineno-0-144">144</a></span>
9259
9313
  <span class="normal"><a href="#__codelineno-0-145">145</a></span>
9260
9314
  <span class="normal"><a href="#__codelineno-0-146">146</a></span>
@@ -9266,21 +9320,23 @@ associated with the model and its name is expected to be <code>{ModelName}Filter
9266
9320
  <span class="normal"><a href="#__codelineno-0-152">152</a></span>
9267
9321
  <span class="normal"><a href="#__codelineno-0-153">153</a></span>
9268
9322
  <span class="normal"><a href="#__codelineno-0-154">154</a></span>
9269
- <span class="normal"><a href="#__codelineno-0-155">155</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="k">def</span> <span class="nf">get_filterset_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
9270
- <a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `FilterSet` class associated with a given `model`.</span>
9271
- <a id="__codelineno-0-143" name="__codelineno-0-143"></a>
9272
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> The `FilterSet` class is expected to be in the `filters` module within the application</span>
9273
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}FilterSet`.</span>
9274
- <a id="__codelineno-0-146" name="__codelineno-0-146"></a>
9275
- <a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> If a matching `FilterSet` is not found, this will return `None`.</span>
9323
+ <span class="normal"><a href="#__codelineno-0-155">155</a></span>
9324
+ <span class="normal"><a href="#__codelineno-0-156">156</a></span>
9325
+ <span class="normal"><a href="#__codelineno-0-157">157</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="k">def</span> <span class="nf">get_filterset_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
9326
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `FilterSet` class associated with a given `model`.</span>
9327
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a>
9328
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> The `FilterSet` class is expected to be in the `filters` module within the application</span>
9329
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}FilterSet`.</span>
9276
9330
  <a id="__codelineno-0-148" name="__codelineno-0-148"></a>
9277
- <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> Args:</span>
9278
- <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> model (BaseModel): A model class</span>
9279
- <a id="__codelineno-0-151" name="__codelineno-0-151"></a>
9280
- <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> Returns:</span>
9281
- <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> (Union[FilterSet,None]): Either the `FilterSet` class or `None`</span>
9282
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> &quot;&quot;&quot;</span>
9283
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="k">return</span> <span class="n">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">&quot;filters&quot;</span><span class="p">,</span> <span class="n">object_suffix</span><span class="o">=</span><span class="s2">&quot;FilterSet&quot;</span><span class="p">)</span>
9331
+ <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> If a matching `FilterSet` is not found, this will return `None`.</span>
9332
+ <a id="__codelineno-0-150" name="__codelineno-0-150"></a>
9333
+ <a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd"> Args:</span>
9334
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> model (BaseModel): A model class</span>
9335
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a>
9336
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> Returns:</span>
9337
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> (Union[FilterSet,None]): Either the `FilterSet` class or `None`</span>
9338
+ <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> &quot;&quot;&quot;</span>
9339
+ <a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="k">return</span> <span class="n">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">&quot;filters&quot;</span><span class="p">,</span> <span class="n">object_suffix</span><span class="o">=</span><span class="s2">&quot;FilterSet&quot;</span><span class="p">)</span>
9284
9340
  </code></pre></div></td></tr></table></div>
9285
9341
  </details>
9286
9342
  </div>
@@ -9548,9 +9604,7 @@ associated with the model and its name is expected to be <code>{ModelName}{form_
9548
9604
 
9549
9605
  <details class="quote">
9550
9606
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
9551
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-158">158</a></span>
9552
- <span class="normal"><a href="#__codelineno-0-159">159</a></span>
9553
- <span class="normal"><a href="#__codelineno-0-160">160</a></span>
9607
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-160">160</a></span>
9554
9608
  <span class="normal"><a href="#__codelineno-0-161">161</a></span>
9555
9609
  <span class="normal"><a href="#__codelineno-0-162">162</a></span>
9556
9610
  <span class="normal"><a href="#__codelineno-0-163">163</a></span>
@@ -9565,24 +9619,26 @@ associated with the model and its name is expected to be <code>{ModelName}{form_
9565
9619
  <span class="normal"><a href="#__codelineno-0-172">172</a></span>
9566
9620
  <span class="normal"><a href="#__codelineno-0-173">173</a></span>
9567
9621
  <span class="normal"><a href="#__codelineno-0-174">174</a></span>
9568
- <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-158" name="__codelineno-0-158"></a><span class="k">def</span> <span class="nf">get_form_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">form_prefix</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
9569
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `Form` class associated with a given `model`.</span>
9570
- <a id="__codelineno-0-160" name="__codelineno-0-160"></a>
9571
- <a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="sd"> The `Form` class is expected to be in the `forms` module within the application</span>
9572
- <a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}{form_prefix}Form`.</span>
9573
- <a id="__codelineno-0-163" name="__codelineno-0-163"></a>
9574
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> If a matching `Form` is not found, this will return `None`.</span>
9622
+ <span class="normal"><a href="#__codelineno-0-175">175</a></span>
9623
+ <span class="normal"><a href="#__codelineno-0-176">176</a></span>
9624
+ <span class="normal"><a href="#__codelineno-0-177">177</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="k">def</span> <span class="nf">get_form_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">form_prefix</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
9625
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `Form` class associated with a given `model`.</span>
9626
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a>
9627
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> The `Form` class is expected to be in the `forms` module within the application</span>
9628
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}{form_prefix}Form`.</span>
9575
9629
  <a id="__codelineno-0-165" name="__codelineno-0-165"></a>
9576
- <a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> Args:</span>
9577
- <a id="__codelineno-0-167" name="__codelineno-0-167"></a><span class="sd"> form_prefix (str):</span>
9578
- <a id="__codelineno-0-168" name="__codelineno-0-168"></a><span class="sd"> An additional prefix for the form name (e.g. `Filter`, such as to retrieve</span>
9579
- <a id="__codelineno-0-169" name="__codelineno-0-169"></a><span class="sd"> `FooFilterForm`) that will come after the model name.</span>
9580
- <a id="__codelineno-0-170" name="__codelineno-0-170"></a>
9581
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> Returns:</span>
9582
- <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> (Union[Form, None]): Either the `Form` class or `None`</span>
9583
- <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="sd"> &quot;&quot;&quot;</span>
9584
- <a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="n">object_suffix</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">form_prefix</span><span class="si">}</span><span class="s2">Form&quot;</span>
9585
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="k">return</span> <span class="n">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">&quot;forms&quot;</span><span class="p">,</span> <span class="n">object_suffix</span><span class="o">=</span><span class="n">object_suffix</span><span class="p">)</span>
9630
+ <a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> If a matching `Form` is not found, this will return `None`.</span>
9631
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a>
9632
+ <a id="__codelineno-0-168" name="__codelineno-0-168"></a><span class="sd"> Args:</span>
9633
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a><span class="sd"> form_prefix (str):</span>
9634
+ <a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="sd"> An additional prefix for the form name (e.g. `Filter`, such as to retrieve</span>
9635
+ <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="sd"> `FooFilterForm`) that will come after the model name.</span>
9636
+ <a id="__codelineno-0-172" name="__codelineno-0-172"></a>
9637
+ <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="sd"> Returns:</span>
9638
+ <a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="sd"> (Union[Form, None]): Either the `Form` class or `None`</span>
9639
+ <a id="__codelineno-0-175" name="__codelineno-0-175"></a><span class="sd"> &quot;&quot;&quot;</span>
9640
+ <a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="n">object_suffix</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">form_prefix</span><span class="si">}</span><span class="s2">Form&quot;</span>
9641
+ <a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="k">return</span> <span class="n">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">&quot;forms&quot;</span><span class="p">,</span> <span class="n">object_suffix</span><span class="o">=</span><span class="n">object_suffix</span><span class="p">)</span>
9586
9642
  </code></pre></div></td></tr></table></div>
9587
9643
  </details>
9588
9644
  </div>
@@ -9671,7 +9727,7 @@ associated with the model and its name is expected to be <code>{ModelName}{form_
9671
9727
  <a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="sd"> &quot;&quot;&quot;</span>
9672
9728
  <a id="__codelineno-0-19" name="__codelineno-0-19"></a> <span class="k">if</span> <span class="n">get_settings_or_config</span><span class="p">(</span><span class="s2">&quot;RELEASE_CHECK_URL&quot;</span><span class="p">):</span>
9673
9729
  <a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Checking for most recent release&quot;</span><span class="p">)</span>
9674
- <a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="n">latest_release</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="s2">&quot;latest_release&quot;</span><span class="p">)</span>
9730
+ <a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="n">latest_release</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="s2">&quot;nautobot.core.releases.get_latest_release&quot;</span><span class="p">)</span>
9675
9731
  <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="k">if</span> <span class="n">latest_release</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
9676
9732
  <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found cached release: </span><span class="si">{</span><span class="n">latest_release</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
9677
9733
  <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="k">return</span> <span class="n">latest_release</span>
@@ -9710,9 +9766,7 @@ associated with the model and its name is expected to be <code>{ModelName}{form_
9710
9766
 
9711
9767
  <details class="quote">
9712
9768
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
9713
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-30">30</a></span>
9714
- <span class="normal"><a href="#__codelineno-0-31">31</a></span>
9715
- <span class="normal"><a href="#__codelineno-0-32">32</a></span>
9769
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-32">32</a></span>
9716
9770
  <span class="normal"><a href="#__codelineno-0-33">33</a></span>
9717
9771
  <span class="normal"><a href="#__codelineno-0-34">34</a></span>
9718
9772
  <span class="normal"><a href="#__codelineno-0-35">35</a></span>
@@ -9724,21 +9778,23 @@ associated with the model and its name is expected to be <code>{ModelName}{form_
9724
9778
  <span class="normal"><a href="#__codelineno-0-41">41</a></span>
9725
9779
  <span class="normal"><a href="#__codelineno-0-42">42</a></span>
9726
9780
  <span class="normal"><a href="#__codelineno-0-43">43</a></span>
9727
- <span class="normal"><a href="#__codelineno-0-44">44</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-30" name="__codelineno-0-30"></a><span class="k">def</span> <span class="nf">get_model_from_name</span><span class="p">(</span><span class="n">model_name</span><span class="p">):</span>
9728
- <a id="__codelineno-0-31" name="__codelineno-0-31"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Given a full model name in dotted format (example: `dcim.model`), a model class is returned if valid.</span>
9729
- <a id="__codelineno-0-32" name="__codelineno-0-32"></a>
9730
- <a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="sd"> :param model_name: Full dotted name for a model as a string (ex: `dcim.model`)</span>
9731
- <a id="__codelineno-0-34" name="__codelineno-0-34"></a><span class="sd"> :type model_name: str</span>
9732
- <a id="__codelineno-0-35" name="__codelineno-0-35"></a>
9733
- <a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> :raises TypeError: If given model name is not found.</span>
9781
+ <span class="normal"><a href="#__codelineno-0-44">44</a></span>
9782
+ <span class="normal"><a href="#__codelineno-0-45">45</a></span>
9783
+ <span class="normal"><a href="#__codelineno-0-46">46</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="k">def</span> <span class="nf">get_model_from_name</span><span class="p">(</span><span class="n">model_name</span><span class="p">):</span>
9784
+ <a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Given a full model name in dotted format (example: `dcim.model`), a model class is returned if valid.</span>
9785
+ <a id="__codelineno-0-34" name="__codelineno-0-34"></a>
9786
+ <a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd"> :param model_name: Full dotted name for a model as a string (ex: `dcim.model`)</span>
9787
+ <a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> :type model_name: str</span>
9734
9788
  <a id="__codelineno-0-37" name="__codelineno-0-37"></a>
9735
- <a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> :return: Found model.</span>
9736
- <a id="__codelineno-0-39" name="__codelineno-0-39"></a><span class="sd"> &quot;&quot;&quot;</span>
9737
- <a id="__codelineno-0-40" name="__codelineno-0-40"></a>
9738
- <a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">try</span><span class="p">:</span>
9739
- <a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="k">return</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
9740
- <a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">LookupError</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
9741
- <a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">exc</span>
9789
+ <a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> :raises TypeError: If given model name is not found.</span>
9790
+ <a id="__codelineno-0-39" name="__codelineno-0-39"></a>
9791
+ <a id="__codelineno-0-40" name="__codelineno-0-40"></a><span class="sd"> :return: Found model.</span>
9792
+ <a id="__codelineno-0-41" name="__codelineno-0-41"></a><span class="sd"> &quot;&quot;&quot;</span>
9793
+ <a id="__codelineno-0-42" name="__codelineno-0-42"></a>
9794
+ <a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="k">try</span><span class="p">:</span>
9795
+ <a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="k">return</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
9796
+ <a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">LookupError</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
9797
+ <a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">exc</span>
9742
9798
  </code></pre></div></td></tr></table></div>
9743
9799
  </details>
9744
9800
  </div>
@@ -10054,9 +10110,7 @@ associated with the model and its name is expected to be <code>{ModelName}{objec
10054
10110
 
10055
10111
  <details class="quote">
10056
10112
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
10057
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-99"> 99</a></span>
10058
- <span class="normal"><a href="#__codelineno-0-100">100</a></span>
10059
- <span class="normal"><a href="#__codelineno-0-101">101</a></span>
10113
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-101">101</a></span>
10060
10114
  <span class="normal"><a href="#__codelineno-0-102">102</a></span>
10061
10115
  <span class="normal"><a href="#__codelineno-0-103">103</a></span>
10062
10116
  <span class="normal"><a href="#__codelineno-0-104">104</a></span>
@@ -10093,46 +10147,48 @@ associated with the model and its name is expected to be <code>{ModelName}{objec
10093
10147
  <span class="normal"><a href="#__codelineno-0-135">135</a></span>
10094
10148
  <span class="normal"><a href="#__codelineno-0-136">136</a></span>
10095
10149
  <span class="normal"><a href="#__codelineno-0-137">137</a></span>
10096
- <span class="normal"><a href="#__codelineno-0-138">138</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-99" name="__codelineno-0-99"></a><span class="k">def</span> <span class="nf">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="p">,</span> <span class="n">object_suffix</span><span class="p">):</span>
10097
- <a id="__codelineno-0-100" name="__codelineno-0-100"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the appropriate class associated with a given model matching the `module_name` and</span>
10098
- <a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="sd"> `object_suffix`.</span>
10099
- <a id="__codelineno-0-102" name="__codelineno-0-102"></a>
10100
- <a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> The given `model` can either be a model class, a model instance, or a dotted representation (ex: `dcim.device`).</span>
10150
+ <span class="normal"><a href="#__codelineno-0-138">138</a></span>
10151
+ <span class="normal"><a href="#__codelineno-0-139">139</a></span>
10152
+ <span class="normal"><a href="#__codelineno-0-140">140</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="k">def</span> <span class="nf">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="p">,</span> <span class="n">object_suffix</span><span class="p">):</span>
10153
+ <a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the appropriate class associated with a given model matching the `module_name` and</span>
10154
+ <a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> `object_suffix`.</span>
10101
10155
  <a id="__codelineno-0-104" name="__codelineno-0-104"></a>
10102
- <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="sd"> The object class is expected to be in the module within the application</span>
10103
- <a id="__codelineno-0-106" name="__codelineno-0-106"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}{object_suffix}`.</span>
10104
- <a id="__codelineno-0-107" name="__codelineno-0-107"></a>
10105
- <a id="__codelineno-0-108" name="__codelineno-0-108"></a><span class="sd"> If a matching class is not found, this will return `None`.</span>
10156
+ <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="sd"> The given `model` can either be a model class, a model instance, or a dotted representation (ex: `dcim.device`).</span>
10157
+ <a id="__codelineno-0-106" name="__codelineno-0-106"></a>
10158
+ <a id="__codelineno-0-107" name="__codelineno-0-107"></a><span class="sd"> The object class is expected to be in the module within the application</span>
10159
+ <a id="__codelineno-0-108" name="__codelineno-0-108"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}{object_suffix}`.</span>
10106
10160
  <a id="__codelineno-0-109" name="__codelineno-0-109"></a>
10107
- <a id="__codelineno-0-110" name="__codelineno-0-110"></a><span class="sd"> Args:</span>
10108
- <a id="__codelineno-0-111" name="__codelineno-0-111"></a><span class="sd"> model (Union[BaseModel, str]): A model class, instance, or dotted representation</span>
10109
- <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="sd"> module_name (str): The name of the module to search for the object class</span>
10110
- <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> object_suffix (str): The suffix to append to the model name to find the object class</span>
10111
- <a id="__codelineno-0-114" name="__codelineno-0-114"></a>
10112
- <a id="__codelineno-0-115" name="__codelineno-0-115"></a><span class="sd"> Returns:</span>
10113
- <a id="__codelineno-0-116" name="__codelineno-0-116"></a><span class="sd"> (Union[BaseModel, str]): Either the matching object class or None</span>
10114
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a><span class="sd"> &quot;&quot;&quot;</span>
10115
- <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
10116
- <a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">get_model_from_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
10117
- <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
10118
- <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">model</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
10119
- <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
10120
- <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="si">!r}</span><span class="s2"> is not a Django Model class&quot;</span><span class="p">)</span>
10121
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
10122
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="si">!r}</span><span class="s2"> is not a subclass of a Django Model class&quot;</span><span class="p">)</span>
10123
- <a id="__codelineno-0-126" name="__codelineno-0-126"></a>
10124
- <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="c1"># e.g. &quot;nautobot.dcim.forms.DeviceFilterForm&quot;</span>
10125
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="n">app_config</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_app_config</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">)</span>
10126
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="n">object_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}{</span><span class="n">object_suffix</span><span class="si">}</span><span class="s2">&quot;</span>
10127
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="n">object_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">app_config</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">module_name</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">object_name</span><span class="si">}</span><span class="s2">&quot;</span>
10128
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a>
10129
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="k">try</span><span class="p">:</span>
10130
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="k">return</span> <span class="n">import_string</span><span class="p">(</span><span class="n">object_path</span><span class="p">)</span>
10131
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="c1"># The name of the module is not correct or unable to find the desired object for this model</span>
10132
- <a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">ImportError</span><span class="p">,</span> <span class="ne">ModuleNotFoundError</span><span class="p">):</span>
10133
- <a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="k">pass</span>
10134
- <a id="__codelineno-0-137" name="__codelineno-0-137"></a>
10135
- <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="k">return</span> <span class="kc">None</span>
10161
+ <a id="__codelineno-0-110" name="__codelineno-0-110"></a><span class="sd"> If a matching class is not found, this will return `None`.</span>
10162
+ <a id="__codelineno-0-111" name="__codelineno-0-111"></a>
10163
+ <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="sd"> Args:</span>
10164
+ <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> model (Union[BaseModel, str]): A model class, instance, or dotted representation</span>
10165
+ <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> module_name (str): The name of the module to search for the object class</span>
10166
+ <a id="__codelineno-0-115" name="__codelineno-0-115"></a><span class="sd"> object_suffix (str): The suffix to append to the model name to find the object class</span>
10167
+ <a id="__codelineno-0-116" name="__codelineno-0-116"></a>
10168
+ <a id="__codelineno-0-117" name="__codelineno-0-117"></a><span class="sd"> Returns:</span>
10169
+ <a id="__codelineno-0-118" name="__codelineno-0-118"></a><span class="sd"> (Union[BaseModel, str]): Either the matching object class or None</span>
10170
+ <a id="__codelineno-0-119" name="__codelineno-0-119"></a><span class="sd"> &quot;&quot;&quot;</span>
10171
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
10172
+ <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">get_model_from_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
10173
+ <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
10174
+ <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="n">model</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
10175
+ <a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
10176
+ <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="si">!r}</span><span class="s2"> is not a Django Model class&quot;</span><span class="p">)</span>
10177
+ <a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
10178
+ <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="si">!r}</span><span class="s2"> is not a subclass of a Django Model class&quot;</span><span class="p">)</span>
10179
+ <a id="__codelineno-0-128" name="__codelineno-0-128"></a>
10180
+ <a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="c1"># e.g. &quot;nautobot.dcim.forms.DeviceFilterForm&quot;</span>
10181
+ <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="n">app_config</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_app_config</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">)</span>
10182
+ <a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="n">object_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}{</span><span class="n">object_suffix</span><span class="si">}</span><span class="s2">&quot;</span>
10183
+ <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="n">object_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">app_config</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">module_name</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">object_name</span><span class="si">}</span><span class="s2">&quot;</span>
10184
+ <a id="__codelineno-0-133" name="__codelineno-0-133"></a>
10185
+ <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="k">try</span><span class="p">:</span>
10186
+ <a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="k">return</span> <span class="n">import_string</span><span class="p">(</span><span class="n">object_path</span><span class="p">)</span>
10187
+ <a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="c1"># The name of the module is not correct or unable to find the desired object for this model</span>
10188
+ <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">ImportError</span><span class="p">,</span> <span class="ne">ModuleNotFoundError</span><span class="p">):</span>
10189
+ <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="k">pass</span>
10190
+ <a id="__codelineno-0-139" name="__codelineno-0-139"></a>
10191
+ <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="k">return</span> <span class="kc">None</span>
10136
10192
  </code></pre></div></td></tr></table></div>
10137
10193
  </details>
10138
10194
  </div>
@@ -10256,9 +10312,7 @@ Supports both core and plugin routes.</p>
10256
10312
 
10257
10313
  <details class="quote">
10258
10314
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
10259
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-47">47</a></span>
10260
- <span class="normal"><a href="#__codelineno-0-48">48</a></span>
10261
- <span class="normal"><a href="#__codelineno-0-49">49</a></span>
10315
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-49">49</a></span>
10262
10316
  <span class="normal"><a href="#__codelineno-0-50">50</a></span>
10263
10317
  <span class="normal"><a href="#__codelineno-0-51">51</a></span>
10264
10318
  <span class="normal"><a href="#__codelineno-0-52">52</a></span>
@@ -10305,56 +10359,58 @@ Supports both core and plugin routes.</p>
10305
10359
  <span class="normal"><a href="#__codelineno-0-93">93</a></span>
10306
10360
  <span class="normal"><a href="#__codelineno-0-94">94</a></span>
10307
10361
  <span class="normal"><a href="#__codelineno-0-95">95</a></span>
10308
- <span class="normal"><a href="#__codelineno-0-96">96</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="k">def</span> <span class="nf">get_route_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
10309
- <a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10310
- <a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="sd"> Return the URL route name for the given model and action. Does not perform any validation.</span>
10311
- <a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="sd"> Supports both core and plugin routes.</span>
10312
- <a id="__codelineno-0-51" name="__codelineno-0-51"></a>
10313
- <a id="__codelineno-0-52" name="__codelineno-0-52"></a><span class="sd"> Args:</span>
10314
- <a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="sd"> model (models.Model, str): Class, Instance, or dotted string of a Django Model</span>
10315
- <a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="sd"> action (str): name of the action in the route</span>
10316
- <a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> api (bool): If set, return an API route.</span>
10317
- <a id="__codelineno-0-56" name="__codelineno-0-56"></a>
10318
- <a id="__codelineno-0-57" name="__codelineno-0-57"></a><span class="sd"> Returns:</span>
10319
- <a id="__codelineno-0-58" name="__codelineno-0-58"></a><span class="sd"> (str): return the name of the view for the model/action provided.</span>
10320
- <a id="__codelineno-0-59" name="__codelineno-0-59"></a>
10321
- <a id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="sd"> Examples:</span>
10322
- <a id="__codelineno-0-61" name="__codelineno-0-61"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(Device, &quot;list&quot;)</span>
10323
- <a id="__codelineno-0-62" name="__codelineno-0-62"></a><span class="sd"> &quot;dcim:device_list&quot;</span>
10324
- <a id="__codelineno-0-63" name="__codelineno-0-63"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(Device, &quot;list&quot;, api=True)</span>
10325
- <a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="sd"> &quot;dcim-api:device-list&quot;</span>
10326
- <a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(&quot;dcim.location&quot;, &quot;list&quot;)</span>
10327
- <a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="sd"> &quot;dcim:location_list&quot;</span>
10328
- <a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(&quot;dcim.location&quot;, &quot;list&quot;, api=True)</span>
10329
- <a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> &quot;dcim-api:location-list&quot;</span>
10330
- <a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(ExampleModel, &quot;list&quot;)</span>
10331
- <a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> &quot;plugins:example_plugin:examplemodel_list&quot;</span>
10332
- <a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(ExampleModel, &quot;list&quot;, api=True)</span>
10333
- <a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> &quot;plugins-api:example_plugin-api:examplemodel-list&quot;</span>
10334
- <a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> &quot;&quot;&quot;</span>
10335
- <a id="__codelineno-0-74" name="__codelineno-0-74"></a>
10336
- <a id="__codelineno-0-75" name="__codelineno-0-75"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
10337
- <a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">get_model_from_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
10338
- <a id="__codelineno-0-77" name="__codelineno-0-77"></a>
10339
- <a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="n">suffix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">api</span> <span class="k">else</span> <span class="s2">&quot;-api&quot;</span>
10340
- <a id="__codelineno-0-79" name="__codelineno-0-79"></a> <span class="c1"># The `contenttypes` and `auth` app doesn&#39;t provide REST API endpoints,</span>
10341
- <a id="__codelineno-0-80" name="__codelineno-0-80"></a> <span class="c1"># but Nautobot provides one for the ContentType model in our `extras` and Group model in `users` app.</span>
10342
- <a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="k">if</span> <span class="n">model</span> <span class="ow">is</span> <span class="n">ContentType</span><span class="p">:</span>
10343
- <a id="__codelineno-0-82" name="__codelineno-0-82"></a> <span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;extras&quot;</span>
10344
- <a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="k">elif</span> <span class="n">model</span> <span class="ow">is</span> <span class="n">Group</span><span class="p">:</span>
10345
- <a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;users&quot;</span>
10346
- <a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="k">else</span><span class="p">:</span>
10347
- <a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">app_label</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">app_label</span>
10348
- <a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="n">prefix</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">app_label</span><span class="si">}{</span><span class="n">suffix</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="si">}</span><span class="s2">&quot;</span>
10349
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a> <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
10350
- <a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="k">if</span> <span class="n">action</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
10351
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;_&quot;</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">api</span> <span class="k">else</span> <span class="s2">&quot;-&quot;</span>
10352
- <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="n">viewname</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="n">sep</span><span class="si">}{</span><span class="n">action</span><span class="si">}</span><span class="s2">&quot;</span>
10353
- <a id="__codelineno-0-92" name="__codelineno-0-92"></a>
10354
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="k">if</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_app_config</span><span class="p">(</span><span class="n">app_label</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">PLUGINS</span><span class="p">:</span>
10355
- <a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="n">viewname</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;plugins</span><span class="si">{</span><span class="n">suffix</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">viewname</span><span class="si">}</span><span class="s2">&quot;</span>
10356
- <a id="__codelineno-0-95" name="__codelineno-0-95"></a>
10357
- <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="k">return</span> <span class="n">viewname</span>
10362
+ <span class="normal"><a href="#__codelineno-0-96">96</a></span>
10363
+ <span class="normal"><a href="#__codelineno-0-97">97</a></span>
10364
+ <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-49" name="__codelineno-0-49"></a><span class="k">def</span> <span class="nf">get_route_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
10365
+ <a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10366
+ <a id="__codelineno-0-51" name="__codelineno-0-51"></a><span class="sd"> Return the URL route name for the given model and action. Does not perform any validation.</span>
10367
+ <a id="__codelineno-0-52" name="__codelineno-0-52"></a><span class="sd"> Supports both core and plugin routes.</span>
10368
+ <a id="__codelineno-0-53" name="__codelineno-0-53"></a>
10369
+ <a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="sd"> Args:</span>
10370
+ <a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> model (models.Model, str): Class, Instance, or dotted string of a Django Model</span>
10371
+ <a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> action (str): name of the action in the route</span>
10372
+ <a id="__codelineno-0-57" name="__codelineno-0-57"></a><span class="sd"> api (bool): If set, return an API route.</span>
10373
+ <a id="__codelineno-0-58" name="__codelineno-0-58"></a>
10374
+ <a id="__codelineno-0-59" name="__codelineno-0-59"></a><span class="sd"> Returns:</span>
10375
+ <a id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="sd"> (str): return the name of the view for the model/action provided.</span>
10376
+ <a id="__codelineno-0-61" name="__codelineno-0-61"></a>
10377
+ <a id="__codelineno-0-62" name="__codelineno-0-62"></a><span class="sd"> Examples:</span>
10378
+ <a id="__codelineno-0-63" name="__codelineno-0-63"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(Device, &quot;list&quot;)</span>
10379
+ <a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="sd"> &quot;dcim:device_list&quot;</span>
10380
+ <a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(Device, &quot;list&quot;, api=True)</span>
10381
+ <a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="sd"> &quot;dcim-api:device-list&quot;</span>
10382
+ <a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(&quot;dcim.location&quot;, &quot;list&quot;)</span>
10383
+ <a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> &quot;dcim:location_list&quot;</span>
10384
+ <a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(&quot;dcim.location&quot;, &quot;list&quot;, api=True)</span>
10385
+ <a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> &quot;dcim-api:location-list&quot;</span>
10386
+ <a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(ExampleModel, &quot;list&quot;)</span>
10387
+ <a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> &quot;plugins:example_plugin:examplemodel_list&quot;</span>
10388
+ <a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> &gt;&gt;&gt; get_route_for_model(ExampleModel, &quot;list&quot;, api=True)</span>
10389
+ <a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd"> &quot;plugins-api:example_plugin-api:examplemodel-list&quot;</span>
10390
+ <a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> &quot;&quot;&quot;</span>
10391
+ <a id="__codelineno-0-76" name="__codelineno-0-76"></a>
10392
+ <a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
10393
+ <a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">get_model_from_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
10394
+ <a id="__codelineno-0-79" name="__codelineno-0-79"></a>
10395
+ <a id="__codelineno-0-80" name="__codelineno-0-80"></a> <span class="n">suffix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">api</span> <span class="k">else</span> <span class="s2">&quot;-api&quot;</span>
10396
+ <a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="c1"># The `contenttypes` and `auth` app doesn&#39;t provide REST API endpoints,</span>
10397
+ <a id="__codelineno-0-82" name="__codelineno-0-82"></a> <span class="c1"># but Nautobot provides one for the ContentType model in our `extras` and Group model in `users` app.</span>
10398
+ <a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="k">if</span> <span class="n">model</span> <span class="ow">is</span> <span class="n">ContentType</span><span class="p">:</span>
10399
+ <a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;extras&quot;</span>
10400
+ <a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="k">elif</span> <span class="n">model</span> <span class="ow">is</span> <span class="n">Group</span><span class="p">:</span>
10401
+ <a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;users&quot;</span>
10402
+ <a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="k">else</span><span class="p">:</span>
10403
+ <a id="__codelineno-0-88" name="__codelineno-0-88"></a> <span class="n">app_label</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">app_label</span>
10404
+ <a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="n">prefix</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">app_label</span><span class="si">}{</span><span class="n">suffix</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="si">}</span><span class="s2">&quot;</span>
10405
+ <a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
10406
+ <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="k">if</span> <span class="n">action</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
10407
+ <a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;_&quot;</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">api</span> <span class="k">else</span> <span class="s2">&quot;-&quot;</span>
10408
+ <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="n">viewname</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="n">sep</span><span class="si">}{</span><span class="n">action</span><span class="si">}</span><span class="s2">&quot;</span>
10409
+ <a id="__codelineno-0-94" name="__codelineno-0-94"></a>
10410
+ <a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="k">if</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_app_config</span><span class="p">(</span><span class="n">app_label</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">PLUGINS</span><span class="p">:</span>
10411
+ <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">viewname</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;plugins</span><span class="si">{</span><span class="n">suffix</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">viewname</span><span class="si">}</span><span class="s2">&quot;</span>
10412
+ <a id="__codelineno-0-97" name="__codelineno-0-97"></a>
10413
+ <a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="k">return</span> <span class="n">viewname</span>
10358
10414
  </code></pre></div></td></tr></table></div>
10359
10415
  </details>
10360
10416
  </div>
@@ -10469,9 +10525,7 @@ associated with the model and its name is expected to be <code>{ModelName}Table<
10469
10525
 
10470
10526
  <details class="quote">
10471
10527
  <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
10472
- <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>
10473
- <span class="normal"><a href="#__codelineno-0-179">179</a></span>
10474
- <span class="normal"><a href="#__codelineno-0-180">180</a></span>
10528
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-180">180</a></span>
10475
10529
  <span class="normal"><a href="#__codelineno-0-181">181</a></span>
10476
10530
  <span class="normal"><a href="#__codelineno-0-182">182</a></span>
10477
10531
  <span class="normal"><a href="#__codelineno-0-183">183</a></span>
@@ -10483,21 +10537,447 @@ associated with the model and its name is expected to be <code>{ModelName}Table<
10483
10537
  <span class="normal"><a href="#__codelineno-0-189">189</a></span>
10484
10538
  <span class="normal"><a href="#__codelineno-0-190">190</a></span>
10485
10539
  <span class="normal"><a href="#__codelineno-0-191">191</a></span>
10486
- <span class="normal"><a href="#__codelineno-0-192">192</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_table_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
10487
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `Table` class associated with a given `model`.</span>
10488
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a>
10489
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> The `Table` class is expected to be in the `tables` module within the application</span>
10490
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}Table`.</span>
10491
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a>
10492
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> If a matching `Table` is not found, this will return `None`.</span>
10540
+ <span class="normal"><a href="#__codelineno-0-192">192</a></span>
10541
+ <span class="normal"><a href="#__codelineno-0-193">193</a></span>
10542
+ <span class="normal"><a href="#__codelineno-0-194">194</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="k">def</span> <span class="nf">get_table_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
10543
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `Table` class associated with a given `model`.</span>
10544
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a>
10545
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="sd"> The `Table` class is expected to be in the `tables` module within the application</span>
10546
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> associated with the model and its name is expected to be `{ModelName}Table`.</span>
10493
10547
  <a id="__codelineno-0-185" name="__codelineno-0-185"></a>
10494
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="sd"> Args:</span>
10495
- <a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="sd"> model (BaseModel): A model class</span>
10496
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a>
10497
- <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="sd"> Returns:</span>
10498
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="sd"> (Union[Table, None]): Either the `Table` class or `None`</span>
10499
- <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> &quot;&quot;&quot;</span>
10500
- <a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="k">return</span> <span class="n">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">&quot;tables&quot;</span><span class="p">,</span> <span class="n">object_suffix</span><span class="o">=</span><span class="s2">&quot;Table&quot;</span><span class="p">)</span>
10548
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="sd"> If a matching `Table` is not found, this will return `None`.</span>
10549
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a>
10550
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="sd"> Args:</span>
10551
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="sd"> model (BaseModel): A model class</span>
10552
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a>
10553
+ <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> Returns:</span>
10554
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> (Union[Table, None]): Either the `Table` class or `None`</span>
10555
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> &quot;&quot;&quot;</span>
10556
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="k">return</span> <span class="n">get_related_class_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">&quot;tables&quot;</span><span class="p">,</span> <span class="n">object_suffix</span><span class="o">=</span><span class="s2">&quot;Table&quot;</span><span class="p">)</span>
10557
+ </code></pre></div></td></tr></table></div>
10558
+ </details>
10559
+ </div>
10560
+
10561
+ </div>
10562
+
10563
+
10564
+ <div class="doc doc-object doc-function">
10565
+
10566
+
10567
+
10568
+ <h2 id="nautobot.apps.utils.get_url_for_url_pattern" class="doc doc-heading">
10569
+ <code class="highlight language-python"><span class="n">nautobot</span><span class="o">.</span><span class="n">apps</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_url_for_url_pattern</span><span class="p">(</span><span class="n">url_pattern</span><span class="p">)</span></code>
10570
+
10571
+ <a href="#nautobot.apps.utils.get_url_for_url_pattern" class="headerlink" title="Permanent link">&para;</a></h2>
10572
+
10573
+
10574
+ <div class="doc doc-contents ">
10575
+
10576
+ <p>Given a URL pattern, construct a URL string that would match that pattern.</p>
10577
+
10578
+
10579
+
10580
+ <p><strong>Examples:</strong></p>
10581
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="gp">&gt;&gt;&gt; </span><span class="n">get_url_for_url_pattern</span><span class="p">(</span><span class="s2">&quot;/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/$&quot;</span><span class="p">)</span>
10582
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="go">&#39;/plugins/example-plugin/models/00000000-0000-0000-0000-000000000000/&#39;</span>
10583
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="gp">&gt;&gt;&gt; </span><span class="n">get_url_for_url_pattern</span><span class="p">(</span><span class="s2">&quot;/circuits/circuit-terminations/&lt;uuid:termination_a_id&gt;/connect/&lt;str:termination_b_type&gt;/&quot;</span><span class="p">)</span>
10584
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="go">&#39;/circuits/circuit-terminations/00000000-0000-0000-0000-000000000000/connect/string/&#39;</span>
10585
+ </code></pre></div>
10586
+
10587
+ <details class="quote">
10588
+ <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
10589
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-300">300</a></span>
10590
+ <span class="normal"><a href="#__codelineno-0-301">301</a></span>
10591
+ <span class="normal"><a href="#__codelineno-0-302">302</a></span>
10592
+ <span class="normal"><a href="#__codelineno-0-303">303</a></span>
10593
+ <span class="normal"><a href="#__codelineno-0-304">304</a></span>
10594
+ <span class="normal"><a href="#__codelineno-0-305">305</a></span>
10595
+ <span class="normal"><a href="#__codelineno-0-306">306</a></span>
10596
+ <span class="normal"><a href="#__codelineno-0-307">307</a></span>
10597
+ <span class="normal"><a href="#__codelineno-0-308">308</a></span>
10598
+ <span class="normal"><a href="#__codelineno-0-309">309</a></span>
10599
+ <span class="normal"><a href="#__codelineno-0-310">310</a></span>
10600
+ <span class="normal"><a href="#__codelineno-0-311">311</a></span>
10601
+ <span class="normal"><a href="#__codelineno-0-312">312</a></span>
10602
+ <span class="normal"><a href="#__codelineno-0-313">313</a></span>
10603
+ <span class="normal"><a href="#__codelineno-0-314">314</a></span>
10604
+ <span class="normal"><a href="#__codelineno-0-315">315</a></span>
10605
+ <span class="normal"><a href="#__codelineno-0-316">316</a></span>
10606
+ <span class="normal"><a href="#__codelineno-0-317">317</a></span>
10607
+ <span class="normal"><a href="#__codelineno-0-318">318</a></span>
10608
+ <span class="normal"><a href="#__codelineno-0-319">319</a></span>
10609
+ <span class="normal"><a href="#__codelineno-0-320">320</a></span>
10610
+ <span class="normal"><a href="#__codelineno-0-321">321</a></span>
10611
+ <span class="normal"><a href="#__codelineno-0-322">322</a></span>
10612
+ <span class="normal"><a href="#__codelineno-0-323">323</a></span>
10613
+ <span class="normal"><a href="#__codelineno-0-324">324</a></span>
10614
+ <span class="normal"><a href="#__codelineno-0-325">325</a></span>
10615
+ <span class="normal"><a href="#__codelineno-0-326">326</a></span>
10616
+ <span class="normal"><a href="#__codelineno-0-327">327</a></span>
10617
+ <span class="normal"><a href="#__codelineno-0-328">328</a></span>
10618
+ <span class="normal"><a href="#__codelineno-0-329">329</a></span>
10619
+ <span class="normal"><a href="#__codelineno-0-330">330</a></span>
10620
+ <span class="normal"><a href="#__codelineno-0-331">331</a></span>
10621
+ <span class="normal"><a href="#__codelineno-0-332">332</a></span>
10622
+ <span class="normal"><a href="#__codelineno-0-333">333</a></span>
10623
+ <span class="normal"><a href="#__codelineno-0-334">334</a></span>
10624
+ <span class="normal"><a href="#__codelineno-0-335">335</a></span>
10625
+ <span class="normal"><a href="#__codelineno-0-336">336</a></span>
10626
+ <span class="normal"><a href="#__codelineno-0-337">337</a></span>
10627
+ <span class="normal"><a href="#__codelineno-0-338">338</a></span>
10628
+ <span class="normal"><a href="#__codelineno-0-339">339</a></span>
10629
+ <span class="normal"><a href="#__codelineno-0-340">340</a></span>
10630
+ <span class="normal"><a href="#__codelineno-0-341">341</a></span>
10631
+ <span class="normal"><a href="#__codelineno-0-342">342</a></span>
10632
+ <span class="normal"><a href="#__codelineno-0-343">343</a></span>
10633
+ <span class="normal"><a href="#__codelineno-0-344">344</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-300" name="__codelineno-0-300"></a><span class="k">def</span> <span class="nf">get_url_for_url_pattern</span><span class="p">(</span><span class="n">url_pattern</span><span class="p">):</span>
10634
+ <a id="__codelineno-0-301" name="__codelineno-0-301"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10635
+ <a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="sd"> Given a URL pattern, construct a URL string that would match that pattern.</span>
10636
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a>
10637
+ <a id="__codelineno-0-304" name="__codelineno-0-304"></a><span class="sd"> Examples:</span>
10638
+ <a id="__codelineno-0-305" name="__codelineno-0-305"></a><span class="sd"> &gt;&gt;&gt; get_url_for_url_pattern(&quot;/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/$&quot;)</span>
10639
+ <a id="__codelineno-0-306" name="__codelineno-0-306"></a><span class="sd"> &#39;/plugins/example-plugin/models/00000000-0000-0000-0000-000000000000/&#39;</span>
10640
+ <a id="__codelineno-0-307" name="__codelineno-0-307"></a><span class="sd"> &gt;&gt;&gt; get_url_for_url_pattern(&quot;/circuits/circuit-terminations/&lt;uuid:termination_a_id&gt;/connect/&lt;str:termination_b_type&gt;/&quot;)</span>
10641
+ <a id="__codelineno-0-308" name="__codelineno-0-308"></a><span class="sd"> &#39;/circuits/circuit-terminations/00000000-0000-0000-0000-000000000000/connect/string/&#39;</span>
10642
+ <a id="__codelineno-0-309" name="__codelineno-0-309"></a><span class="sd"> &quot;&quot;&quot;</span>
10643
+ <a id="__codelineno-0-310" name="__codelineno-0-310"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">url_pattern</span>
10644
+ <a id="__codelineno-0-311" name="__codelineno-0-311"></a> <span class="c1"># Fixup tokens in path-style &quot;classic&quot; view URLs:</span>
10645
+ <a id="__codelineno-0-312" name="__codelineno-0-312"></a> <span class="c1"># &quot;/admin/users/user/&lt;id&gt;/password/&quot;</span>
10646
+ <a id="__codelineno-0-313" name="__codelineno-0-313"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&lt;id&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;00000000-0000-0000-0000-000000000000&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10647
+ <a id="__codelineno-0-314" name="__codelineno-0-314"></a> <span class="c1"># &quot;/silk/request/&lt;uuid:request_id&gt;/profile/&lt;int:profile_id&gt;/&quot;</span>
10648
+ <a id="__codelineno-0-315" name="__codelineno-0-315"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&lt;int:\w+&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10649
+ <a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="c1"># &quot;/admin/admin/logentry/&lt;path:object_id&gt;/&quot;</span>
10650
+ <a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&lt;path:\w+&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10651
+ <a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="c1"># &quot;/dcim/sites/&lt;slug:slug&gt;/&quot;</span>
10652
+ <a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&lt;slug:\w+&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;slug&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10653
+ <a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="c1"># &quot;/apps/installed-apps/&lt;str:app&gt;/&quot;</span>
10654
+ <a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&lt;str:\w+&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10655
+ <a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="c1"># &quot;/dcim/locations/&lt;uuid:pk&gt;/&quot;</span>
10656
+ <a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&lt;uuid:\w+&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;00000000-0000-0000-0000-000000000000&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10657
+ <a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="c1"># tokens in regexp-style router urls, including REST and NautobotUIViewSet:</span>
10658
+ <a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="c1"># &quot;/extras/^external-integrations/(?P&lt;pk&gt;[^/.]+)/$&quot;</span>
10659
+ <a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="c1"># &quot;/api/virtualization/^interfaces/(?P&lt;pk&gt;[^/.]+)/$&quot;</span>
10660
+ <a id="__codelineno-0-327" name="__codelineno-0-327"></a> <span class="c1"># &quot;/api/virtualization/^interfaces/(?P&lt;pk&gt;[^/.]+)\\.(?P&lt;format&gt;[a-z0-9]+)/?$&quot;</span>
10661
+ <a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;[$^]&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10662
+ <a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;/\?&quot;</span><span class="p">,</span> <span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10663
+ <a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;app_label&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;users&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10664
+ <a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;class_path&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;foo/bar/baz&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10665
+ <a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;format&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;json&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10666
+ <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;name&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10667
+ <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;pk&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;00000000-0000-0000-0000-000000000000&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10668
+ <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;slug&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10669
+ <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;url&gt;[^)]+\)&quot;</span><span class="p">,</span> <span class="s2">&quot;any&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10670
+ <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="c1"># Fallthru for generic URL parameters</span>
10671
+ <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\(\?P&lt;\w+&gt;[^)]+\)\??&quot;</span><span class="p">,</span> <span class="s2">&quot;unknown&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10672
+ <a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="n">url</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
10673
+ <a id="__codelineno-0-340" name="__codelineno-0-340"></a>
10674
+ <a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">char</span> <span class="ow">in</span> <span class="n">url</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="s2">&quot;&lt;&gt;[]()?+^$&quot;</span><span class="p">):</span>
10675
+ <a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unhandled token in URL </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2"> derived from </span><span class="si">{</span><span class="n">url_pattern</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
10676
+ <a id="__codelineno-0-343" name="__codelineno-0-343"></a>
10677
+ <a id="__codelineno-0-344" name="__codelineno-0-344"></a> <span class="k">return</span> <span class="n">url</span>
10678
+ </code></pre></div></td></tr></table></div>
10679
+ </details>
10680
+ </div>
10681
+
10682
+ </div>
10683
+
10684
+
10685
+ <div class="doc doc-object doc-function">
10686
+
10687
+
10688
+
10689
+ <h2 id="nautobot.apps.utils.get_url_patterns" class="doc doc-heading">
10690
+ <code class="highlight language-python"><span class="n">nautobot</span><span class="o">.</span><span class="n">apps</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_url_patterns</span><span class="p">(</span><span class="n">urlconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">patterns_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">base_path</span><span class="o">=</span><span class="s1">&#39;/&#39;</span><span class="p">)</span></code>
10691
+
10692
+ <a href="#nautobot.apps.utils.get_url_patterns" class="headerlink" title="Permanent link">&para;</a></h2>
10693
+
10694
+
10695
+ <div class="doc doc-contents ">
10696
+
10697
+ <p>Recursively yield a list of registered URL patterns.</p>
10698
+
10699
+
10700
+
10701
+ <p><strong>Parameters:</strong></p>
10702
+ <table>
10703
+ <thead>
10704
+ <tr>
10705
+ <th>Name</th>
10706
+ <th>Type</th>
10707
+ <th>Description</th>
10708
+ <th>Default</th>
10709
+ </tr>
10710
+ </thead>
10711
+ <tbody>
10712
+ <tr>
10713
+ <td><code>urlconf</code></td>
10714
+ <td>
10715
+ <code>URLConf</code>
10716
+ </td>
10717
+ <td>
10718
+ <div class="doc-md-description">
10719
+ <p>Python module such as <code>nautobot.core.urls</code>.
10720
+ Default if unspecified is the value of <code>settings.ROOT_URLCONF</code>, i.e. the <code>nautobot.core.urls</code> module.</p>
10721
+ </div>
10722
+ </td>
10723
+ <td>
10724
+ <code>None</code>
10725
+ </td>
10726
+ </tr>
10727
+ <tr>
10728
+ <td><code>patterns_list</code></td>
10729
+ <td>
10730
+ <code>list</code>
10731
+ </td>
10732
+ <td>
10733
+ <div class="doc-md-description">
10734
+ <p>Used in recursion. Generally can be omitted on initial call.
10735
+ Default if unspecified is the <code>url_patterns</code> attribute of the given <code>urlconf</code> module.</p>
10736
+ </div>
10737
+ </td>
10738
+ <td>
10739
+ <code>None</code>
10740
+ </td>
10741
+ </tr>
10742
+ <tr>
10743
+ <td><code>base_path</code></td>
10744
+ <td>
10745
+ <code>str</code>
10746
+ </td>
10747
+ <td>
10748
+ <div class="doc-md-description">
10749
+ <p>String to prepend to all URL patterns yielded.
10750
+ Default if unspecified is the string <code>"/"</code>.</p>
10751
+ </div>
10752
+ </td>
10753
+ <td>
10754
+ <code>&#39;/&#39;</code>
10755
+ </td>
10756
+ </tr>
10757
+ </tbody>
10758
+ </table>
10759
+
10760
+
10761
+
10762
+ <p><strong>Yields:</strong></p>
10763
+ <table>
10764
+ <thead>
10765
+ <tr>
10766
+ <th>Type</th>
10767
+ <th>Description</th>
10768
+ </tr>
10769
+ </thead>
10770
+ <tbody>
10771
+ <tr>
10772
+ <td>
10773
+ <code>str</code>
10774
+ </td>
10775
+ <td>
10776
+ <div class="doc-md-description">
10777
+ <p>Each URL pattern defined in the given urlconf and its descendants</p>
10778
+ </div>
10779
+ </td>
10780
+ </tr>
10781
+ </tbody>
10782
+ </table>
10783
+
10784
+
10785
+
10786
+ <p><strong>Examples:</strong></p>
10787
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="gp">&gt;&gt;&gt; </span><span class="n">generator</span> <span class="o">=</span> <span class="n">get_url_patterns</span><span class="p">()</span>
10788
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span>
10789
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="go">&#39;/&#39;</span>
10790
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span>
10791
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="go">&#39;/search/&#39;</span>
10792
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span>
10793
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="go">&#39;/login/&#39;</span>
10794
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span>
10795
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="go">&#39;/logout/&#39;</span>
10796
+ <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span>
10797
+ <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="go">&#39;/circuits/circuits/&lt;uuid:pk&gt;/terminations/swap/&#39;</span>
10798
+ </code></pre></div>
10799
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">example_plugin.urls</span> <span class="k">as</span> <span class="nn">example_urls</span>
10800
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">url_pattern</span> <span class="ow">in</span> <span class="n">get_url_patterns</span><span class="p">(</span><span class="n">example_urls</span><span class="p">,</span> <span class="n">base_path</span><span class="o">=</span><span class="s2">&quot;/plugins/example-plugin/&quot;</span><span class="p">):</span>
10801
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">url_pattern</span><span class="p">)</span>
10802
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="gp">...</span>
10803
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="go">/plugins/example-plugin/</span>
10804
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="go">/plugins/example-plugin/config/</span>
10805
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="go">/plugins/example-plugin/models/&lt;uuid:pk&gt;/dynamic-groups/</span>
10806
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="go">/plugins/example-plugin/other-models/&lt;uuid:pk&gt;/dynamic-groups/</span>
10807
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="go">/plugins/example-plugin/docs/</span>
10808
+ <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="go">/plugins/example-plugin/circuits/&lt;uuid:pk&gt;/example-plugin-tab/</span>
10809
+ <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="go">/plugins/example-plugin/devices/&lt;uuid:pk&gt;/example-plugin-tab-1/</span>
10810
+ <a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="go">/plugins/example-plugin/devices/&lt;uuid:pk&gt;/example-plugin-tab-2/</span>
10811
+ <a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="go">/plugins/example-plugin/override-target/</span>
10812
+ <a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a><span class="go">/plugins/example-plugin/^models/$</span>
10813
+ <a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="go">/plugins/example-plugin/^models/add/$</span>
10814
+ <a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="go">/plugins/example-plugin/^models/import/$</span>
10815
+ <a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a><span class="go">/plugins/example-plugin/^models/edit/$</span>
10816
+ <a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a><span class="go">/plugins/example-plugin/^models/delete/$</span>
10817
+ <a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="go">/plugins/example-plugin/^models/all-names/$</span>
10818
+ <a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="go">/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/$</span>
10819
+ <a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a><span class="go">/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/delete/$</span>
10820
+ <a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="go">/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/edit/$</span>
10821
+ <a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a><span class="go">/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/changelog/$</span>
10822
+ <a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a><span class="go">/plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/notes/$</span>
10823
+ <a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="go">/plugins/example-plugin/^other-models/$</span>
10824
+ <a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="go">/plugins/example-plugin/^other-models/add/$</span>
10825
+ <a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a><span class="go">/plugins/example-plugin/^other-models/edit/$</span>
10826
+ <a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a><span class="go">/plugins/example-plugin/^other-models/delete/$</span>
10827
+ <a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a><span class="go">/plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/$</span>
10828
+ <a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a><span class="go">/plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/delete/$</span>
10829
+ <a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="go">/plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/edit/$</span>
10830
+ <a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a><span class="go">/plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/changelog/$</span>
10831
+ <a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a><span class="go">/plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/notes/$</span>
10832
+ </code></pre></div>
10833
+
10834
+ <details class="quote">
10835
+ <summary>Source code in <code>nautobot/core/utils/lookup.py</code></summary>
10836
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-225">225</a></span>
10837
+ <span class="normal"><a href="#__codelineno-0-226">226</a></span>
10838
+ <span class="normal"><a href="#__codelineno-0-227">227</a></span>
10839
+ <span class="normal"><a href="#__codelineno-0-228">228</a></span>
10840
+ <span class="normal"><a href="#__codelineno-0-229">229</a></span>
10841
+ <span class="normal"><a href="#__codelineno-0-230">230</a></span>
10842
+ <span class="normal"><a href="#__codelineno-0-231">231</a></span>
10843
+ <span class="normal"><a href="#__codelineno-0-232">232</a></span>
10844
+ <span class="normal"><a href="#__codelineno-0-233">233</a></span>
10845
+ <span class="normal"><a href="#__codelineno-0-234">234</a></span>
10846
+ <span class="normal"><a href="#__codelineno-0-235">235</a></span>
10847
+ <span class="normal"><a href="#__codelineno-0-236">236</a></span>
10848
+ <span class="normal"><a href="#__codelineno-0-237">237</a></span>
10849
+ <span class="normal"><a href="#__codelineno-0-238">238</a></span>
10850
+ <span class="normal"><a href="#__codelineno-0-239">239</a></span>
10851
+ <span class="normal"><a href="#__codelineno-0-240">240</a></span>
10852
+ <span class="normal"><a href="#__codelineno-0-241">241</a></span>
10853
+ <span class="normal"><a href="#__codelineno-0-242">242</a></span>
10854
+ <span class="normal"><a href="#__codelineno-0-243">243</a></span>
10855
+ <span class="normal"><a href="#__codelineno-0-244">244</a></span>
10856
+ <span class="normal"><a href="#__codelineno-0-245">245</a></span>
10857
+ <span class="normal"><a href="#__codelineno-0-246">246</a></span>
10858
+ <span class="normal"><a href="#__codelineno-0-247">247</a></span>
10859
+ <span class="normal"><a href="#__codelineno-0-248">248</a></span>
10860
+ <span class="normal"><a href="#__codelineno-0-249">249</a></span>
10861
+ <span class="normal"><a href="#__codelineno-0-250">250</a></span>
10862
+ <span class="normal"><a href="#__codelineno-0-251">251</a></span>
10863
+ <span class="normal"><a href="#__codelineno-0-252">252</a></span>
10864
+ <span class="normal"><a href="#__codelineno-0-253">253</a></span>
10865
+ <span class="normal"><a href="#__codelineno-0-254">254</a></span>
10866
+ <span class="normal"><a href="#__codelineno-0-255">255</a></span>
10867
+ <span class="normal"><a href="#__codelineno-0-256">256</a></span>
10868
+ <span class="normal"><a href="#__codelineno-0-257">257</a></span>
10869
+ <span class="normal"><a href="#__codelineno-0-258">258</a></span>
10870
+ <span class="normal"><a href="#__codelineno-0-259">259</a></span>
10871
+ <span class="normal"><a href="#__codelineno-0-260">260</a></span>
10872
+ <span class="normal"><a href="#__codelineno-0-261">261</a></span>
10873
+ <span class="normal"><a href="#__codelineno-0-262">262</a></span>
10874
+ <span class="normal"><a href="#__codelineno-0-263">263</a></span>
10875
+ <span class="normal"><a href="#__codelineno-0-264">264</a></span>
10876
+ <span class="normal"><a href="#__codelineno-0-265">265</a></span>
10877
+ <span class="normal"><a href="#__codelineno-0-266">266</a></span>
10878
+ <span class="normal"><a href="#__codelineno-0-267">267</a></span>
10879
+ <span class="normal"><a href="#__codelineno-0-268">268</a></span>
10880
+ <span class="normal"><a href="#__codelineno-0-269">269</a></span>
10881
+ <span class="normal"><a href="#__codelineno-0-270">270</a></span>
10882
+ <span class="normal"><a href="#__codelineno-0-271">271</a></span>
10883
+ <span class="normal"><a href="#__codelineno-0-272">272</a></span>
10884
+ <span class="normal"><a href="#__codelineno-0-273">273</a></span>
10885
+ <span class="normal"><a href="#__codelineno-0-274">274</a></span>
10886
+ <span class="normal"><a href="#__codelineno-0-275">275</a></span>
10887
+ <span class="normal"><a href="#__codelineno-0-276">276</a></span>
10888
+ <span class="normal"><a href="#__codelineno-0-277">277</a></span>
10889
+ <span class="normal"><a href="#__codelineno-0-278">278</a></span>
10890
+ <span class="normal"><a href="#__codelineno-0-279">279</a></span>
10891
+ <span class="normal"><a href="#__codelineno-0-280">280</a></span>
10892
+ <span class="normal"><a href="#__codelineno-0-281">281</a></span>
10893
+ <span class="normal"><a href="#__codelineno-0-282">282</a></span>
10894
+ <span class="normal"><a href="#__codelineno-0-283">283</a></span>
10895
+ <span class="normal"><a href="#__codelineno-0-284">284</a></span>
10896
+ <span class="normal"><a href="#__codelineno-0-285">285</a></span>
10897
+ <span class="normal"><a href="#__codelineno-0-286">286</a></span>
10898
+ <span class="normal"><a href="#__codelineno-0-287">287</a></span>
10899
+ <span class="normal"><a href="#__codelineno-0-288">288</a></span>
10900
+ <span class="normal"><a href="#__codelineno-0-289">289</a></span>
10901
+ <span class="normal"><a href="#__codelineno-0-290">290</a></span>
10902
+ <span class="normal"><a href="#__codelineno-0-291">291</a></span>
10903
+ <span class="normal"><a href="#__codelineno-0-292">292</a></span>
10904
+ <span class="normal"><a href="#__codelineno-0-293">293</a></span>
10905
+ <span class="normal"><a href="#__codelineno-0-294">294</a></span>
10906
+ <span class="normal"><a href="#__codelineno-0-295">295</a></span>
10907
+ <span class="normal"><a href="#__codelineno-0-296">296</a></span>
10908
+ <span class="normal"><a href="#__codelineno-0-297">297</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-225" name="__codelineno-0-225"></a><span class="k">def</span> <span class="nf">get_url_patterns</span><span class="p">(</span><span class="n">urlconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">patterns_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">base_path</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
10909
+ <a id="__codelineno-0-226" name="__codelineno-0-226"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10910
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a><span class="sd"> Recursively yield a list of registered URL patterns.</span>
10911
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a>
10912
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="sd"> Args:</span>
10913
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="sd"> urlconf (URLConf): Python module such as `nautobot.core.urls`.</span>
10914
+ <a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd"> Default if unspecified is the value of `settings.ROOT_URLCONF`, i.e. the `nautobot.core.urls` module.</span>
10915
+ <a id="__codelineno-0-232" name="__codelineno-0-232"></a><span class="sd"> patterns_list (list): Used in recursion. Generally can be omitted on initial call.</span>
10916
+ <a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd"> Default if unspecified is the `url_patterns` attribute of the given `urlconf` module.</span>
10917
+ <a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="sd"> base_path (str): String to prepend to all URL patterns yielded.</span>
10918
+ <a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> Default if unspecified is the string `&quot;/&quot;`.</span>
10919
+ <a id="__codelineno-0-236" name="__codelineno-0-236"></a>
10920
+ <a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="sd"> Yields:</span>
10921
+ <a id="__codelineno-0-238" name="__codelineno-0-238"></a><span class="sd"> (str): Each URL pattern defined in the given urlconf and its descendants</span>
10922
+ <a id="__codelineno-0-239" name="__codelineno-0-239"></a>
10923
+ <a id="__codelineno-0-240" name="__codelineno-0-240"></a><span class="sd"> Examples:</span>
10924
+ <a id="__codelineno-0-241" name="__codelineno-0-241"></a><span class="sd"> &gt;&gt;&gt; generator = get_url_patterns()</span>
10925
+ <a id="__codelineno-0-242" name="__codelineno-0-242"></a><span class="sd"> &gt;&gt;&gt; next(generator)</span>
10926
+ <a id="__codelineno-0-243" name="__codelineno-0-243"></a><span class="sd"> &#39;/&#39;</span>
10927
+ <a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> &gt;&gt;&gt; next(generator)</span>
10928
+ <a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="sd"> &#39;/search/&#39;</span>
10929
+ <a id="__codelineno-0-246" name="__codelineno-0-246"></a><span class="sd"> &gt;&gt;&gt; next(generator)</span>
10930
+ <a id="__codelineno-0-247" name="__codelineno-0-247"></a><span class="sd"> &#39;/login/&#39;</span>
10931
+ <a id="__codelineno-0-248" name="__codelineno-0-248"></a><span class="sd"> &gt;&gt;&gt; next(generator)</span>
10932
+ <a id="__codelineno-0-249" name="__codelineno-0-249"></a><span class="sd"> &#39;/logout/&#39;</span>
10933
+ <a id="__codelineno-0-250" name="__codelineno-0-250"></a><span class="sd"> &gt;&gt;&gt; next(generator)</span>
10934
+ <a id="__codelineno-0-251" name="__codelineno-0-251"></a><span class="sd"> &#39;/circuits/circuits/&lt;uuid:pk&gt;/terminations/swap/&#39;</span>
10935
+ <a id="__codelineno-0-252" name="__codelineno-0-252"></a>
10936
+ <a id="__codelineno-0-253" name="__codelineno-0-253"></a><span class="sd"> &gt;&gt;&gt; import example_plugin.urls as example_urls</span>
10937
+ <a id="__codelineno-0-254" name="__codelineno-0-254"></a><span class="sd"> &gt;&gt;&gt; for url_pattern in get_url_patterns(example_urls, base_path=&quot;/plugins/example-plugin/&quot;):</span>
10938
+ <a id="__codelineno-0-255" name="__codelineno-0-255"></a><span class="sd"> ... print(url_pattern)</span>
10939
+ <a id="__codelineno-0-256" name="__codelineno-0-256"></a><span class="sd"> ...</span>
10940
+ <a id="__codelineno-0-257" name="__codelineno-0-257"></a><span class="sd"> /plugins/example-plugin/</span>
10941
+ <a id="__codelineno-0-258" name="__codelineno-0-258"></a><span class="sd"> /plugins/example-plugin/config/</span>
10942
+ <a id="__codelineno-0-259" name="__codelineno-0-259"></a><span class="sd"> /plugins/example-plugin/models/&lt;uuid:pk&gt;/dynamic-groups/</span>
10943
+ <a id="__codelineno-0-260" name="__codelineno-0-260"></a><span class="sd"> /plugins/example-plugin/other-models/&lt;uuid:pk&gt;/dynamic-groups/</span>
10944
+ <a id="__codelineno-0-261" name="__codelineno-0-261"></a><span class="sd"> /plugins/example-plugin/docs/</span>
10945
+ <a id="__codelineno-0-262" name="__codelineno-0-262"></a><span class="sd"> /plugins/example-plugin/circuits/&lt;uuid:pk&gt;/example-plugin-tab/</span>
10946
+ <a id="__codelineno-0-263" name="__codelineno-0-263"></a><span class="sd"> /plugins/example-plugin/devices/&lt;uuid:pk&gt;/example-plugin-tab-1/</span>
10947
+ <a id="__codelineno-0-264" name="__codelineno-0-264"></a><span class="sd"> /plugins/example-plugin/devices/&lt;uuid:pk&gt;/example-plugin-tab-2/</span>
10948
+ <a id="__codelineno-0-265" name="__codelineno-0-265"></a><span class="sd"> /plugins/example-plugin/override-target/</span>
10949
+ <a id="__codelineno-0-266" name="__codelineno-0-266"></a><span class="sd"> /plugins/example-plugin/^models/$</span>
10950
+ <a id="__codelineno-0-267" name="__codelineno-0-267"></a><span class="sd"> /plugins/example-plugin/^models/add/$</span>
10951
+ <a id="__codelineno-0-268" name="__codelineno-0-268"></a><span class="sd"> /plugins/example-plugin/^models/import/$</span>
10952
+ <a id="__codelineno-0-269" name="__codelineno-0-269"></a><span class="sd"> /plugins/example-plugin/^models/edit/$</span>
10953
+ <a id="__codelineno-0-270" name="__codelineno-0-270"></a><span class="sd"> /plugins/example-plugin/^models/delete/$</span>
10954
+ <a id="__codelineno-0-271" name="__codelineno-0-271"></a><span class="sd"> /plugins/example-plugin/^models/all-names/$</span>
10955
+ <a id="__codelineno-0-272" name="__codelineno-0-272"></a><span class="sd"> /plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/$</span>
10956
+ <a id="__codelineno-0-273" name="__codelineno-0-273"></a><span class="sd"> /plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/delete/$</span>
10957
+ <a id="__codelineno-0-274" name="__codelineno-0-274"></a><span class="sd"> /plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/edit/$</span>
10958
+ <a id="__codelineno-0-275" name="__codelineno-0-275"></a><span class="sd"> /plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/changelog/$</span>
10959
+ <a id="__codelineno-0-276" name="__codelineno-0-276"></a><span class="sd"> /plugins/example-plugin/^models/(?P&lt;pk&gt;[^/.]+)/notes/$</span>
10960
+ <a id="__codelineno-0-277" name="__codelineno-0-277"></a><span class="sd"> /plugins/example-plugin/^other-models/$</span>
10961
+ <a id="__codelineno-0-278" name="__codelineno-0-278"></a><span class="sd"> /plugins/example-plugin/^other-models/add/$</span>
10962
+ <a id="__codelineno-0-279" name="__codelineno-0-279"></a><span class="sd"> /plugins/example-plugin/^other-models/edit/$</span>
10963
+ <a id="__codelineno-0-280" name="__codelineno-0-280"></a><span class="sd"> /plugins/example-plugin/^other-models/delete/$</span>
10964
+ <a id="__codelineno-0-281" name="__codelineno-0-281"></a><span class="sd"> /plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/$</span>
10965
+ <a id="__codelineno-0-282" name="__codelineno-0-282"></a><span class="sd"> /plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/delete/$</span>
10966
+ <a id="__codelineno-0-283" name="__codelineno-0-283"></a><span class="sd"> /plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/edit/$</span>
10967
+ <a id="__codelineno-0-284" name="__codelineno-0-284"></a><span class="sd"> /plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/changelog/$</span>
10968
+ <a id="__codelineno-0-285" name="__codelineno-0-285"></a><span class="sd"> /plugins/example-plugin/^other-models/(?P&lt;pk&gt;[^/.]+)/notes/$</span>
10969
+ <a id="__codelineno-0-286" name="__codelineno-0-286"></a><span class="sd"> &quot;&quot;&quot;</span>
10970
+ <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">if</span> <span class="n">urlconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
10971
+ <a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">urlconf</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">ROOT_URLCONF</span>
10972
+ <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">if</span> <span class="n">patterns_list</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
10973
+ <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="n">patterns_list</span> <span class="o">=</span> <span class="n">get_resolver</span><span class="p">(</span><span class="n">urlconf</span><span class="p">)</span><span class="o">.</span><span class="n">url_patterns</span>
10974
+ <a id="__codelineno-0-291" name="__codelineno-0-291"></a>
10975
+ <a id="__codelineno-0-292" name="__codelineno-0-292"></a> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">patterns_list</span><span class="p">:</span>
10976
+ <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">URLPattern</span><span class="p">):</span>
10977
+ <a id="__codelineno-0-294" name="__codelineno-0-294"></a> <span class="k">yield</span> <span class="n">base_path</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span>
10978
+ <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">URLResolver</span><span class="p">):</span>
10979
+ <a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="c1"># Recurse!</span>
10980
+ <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="k">yield from</span> <span class="n">get_url_patterns</span><span class="p">(</span><span class="n">urlconf</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">url_patterns</span><span class="p">,</span> <span class="n">base_path</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
10501
10981
  </code></pre></div></td></tr></table></div>
10502
10982
  </details>
10503
10983
  </div>
@@ -10521,21 +11001,21 @@ associated with the model and its name is expected to be <code>{ModelName}Table<
10521
11001
 
10522
11002
  <details class="quote">
10523
11003
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
10524
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-310">310</a></span>
10525
- <span class="normal"><a href="#__codelineno-0-311">311</a></span>
10526
- <span class="normal"><a href="#__codelineno-0-312">312</a></span>
10527
- <span class="normal"><a href="#__codelineno-0-313">313</a></span>
10528
- <span class="normal"><a href="#__codelineno-0-314">314</a></span>
11004
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-314">314</a></span>
10529
11005
  <span class="normal"><a href="#__codelineno-0-315">315</a></span>
10530
11006
  <span class="normal"><a href="#__codelineno-0-316">316</a></span>
10531
- <span class="normal"><a href="#__codelineno-0-317">317</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-310" name="__codelineno-0-310"></a><span class="k">def</span> <span class="nf">get_worker_count</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">queue</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
10532
- <a id="__codelineno-0-311" name="__codelineno-0-311"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
10533
- <a id="__codelineno-0-312" name="__codelineno-0-312"></a><span class="sd"> Return a count of the active Celery workers in a specified queue. Defaults to the `CELERY_TASK_DEFAULT_QUEUE` setting.</span>
10534
- <a id="__codelineno-0-313" name="__codelineno-0-313"></a><span class="sd"> &quot;&quot;&quot;</span>
10535
- <a id="__codelineno-0-314" name="__codelineno-0-314"></a> <span class="n">celery_queues</span> <span class="o">=</span> <span class="n">get_celery_queues</span><span class="p">()</span>
10536
- <a id="__codelineno-0-315" name="__codelineno-0-315"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">queue</span><span class="p">:</span>
10537
- <a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="n">queue</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CELERY_TASK_DEFAULT_QUEUE</span>
10538
- <a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="k">return</span> <span class="n">celery_queues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
11007
+ <span class="normal"><a href="#__codelineno-0-317">317</a></span>
11008
+ <span class="normal"><a href="#__codelineno-0-318">318</a></span>
11009
+ <span class="normal"><a href="#__codelineno-0-319">319</a></span>
11010
+ <span class="normal"><a href="#__codelineno-0-320">320</a></span>
11011
+ <span class="normal"><a href="#__codelineno-0-321">321</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-314" name="__codelineno-0-314"></a><span class="k">def</span> <span class="nf">get_worker_count</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">queue</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
11012
+ <a id="__codelineno-0-315" name="__codelineno-0-315"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11013
+ <a id="__codelineno-0-316" name="__codelineno-0-316"></a><span class="sd"> Return a count of the active Celery workers in a specified queue. Defaults to the `CELERY_TASK_DEFAULT_QUEUE` setting.</span>
11014
+ <a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> &quot;&quot;&quot;</span>
11015
+ <a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="n">celery_queues</span> <span class="o">=</span> <span class="n">get_celery_queues</span><span class="p">()</span>
11016
+ <a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">queue</span><span class="p">:</span>
11017
+ <a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="n">queue</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CELERY_TASK_DEFAULT_QUEUE</span>
11018
+ <a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="k">return</span> <span class="n">celery_queues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
10539
11019
  </code></pre></div></td></tr></table></div>
10540
11020
  </details>
10541
11021
  </div>
@@ -10953,11 +11433,7 @@ associated with the model and its name is expected to be <code>{ModelName}Table<
10953
11433
 
10954
11434
  <details class="quote">
10955
11435
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
10956
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-513">513</a></span>
10957
- <span class="normal"><a href="#__codelineno-0-514">514</a></span>
10958
- <span class="normal"><a href="#__codelineno-0-515">515</a></span>
10959
- <span class="normal"><a href="#__codelineno-0-516">516</a></span>
10960
- <span class="normal"><a href="#__codelineno-0-517">517</a></span>
11436
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-517">517</a></span>
10961
11437
  <span class="normal"><a href="#__codelineno-0-518">518</a></span>
10962
11438
  <span class="normal"><a href="#__codelineno-0-519">519</a></span>
10963
11439
  <span class="normal"><a href="#__codelineno-0-520">520</a></span>
@@ -11048,102 +11524,106 @@ associated with the model and its name is expected to be <code>{ModelName}Table<
11048
11524
  <span class="normal"><a href="#__codelineno-0-605">605</a></span>
11049
11525
  <span class="normal"><a href="#__codelineno-0-606">606</a></span>
11050
11526
  <span class="normal"><a href="#__codelineno-0-607">607</a></span>
11051
- <span class="normal"><a href="#__codelineno-0-608">608</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-513" name="__codelineno-0-513"></a><span class="k">def</span> <span class="nf">migrate_role_data</span><span class="p">(</span>
11052
- <a id="__codelineno-0-514" name="__codelineno-0-514"></a> <span class="n">model_to_migrate</span><span class="p">,</span>
11053
- <a id="__codelineno-0-515" name="__codelineno-0-515"></a> <span class="o">*</span><span class="p">,</span>
11054
- <a id="__codelineno-0-516" name="__codelineno-0-516"></a> <span class="n">from_role_field_name</span><span class="p">,</span>
11055
- <a id="__codelineno-0-517" name="__codelineno-0-517"></a> <span class="n">from_role_model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11056
- <a id="__codelineno-0-518" name="__codelineno-0-518"></a> <span class="n">from_role_choiceset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11057
- <a id="__codelineno-0-519" name="__codelineno-0-519"></a> <span class="n">to_role_field_name</span><span class="p">,</span>
11058
- <a id="__codelineno-0-520" name="__codelineno-0-520"></a> <span class="n">to_role_model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11059
- <a id="__codelineno-0-521" name="__codelineno-0-521"></a> <span class="n">to_role_choiceset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11060
- <a id="__codelineno-0-522" name="__codelineno-0-522"></a> <span class="n">is_m2m_field</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
11061
- <a id="__codelineno-0-523" name="__codelineno-0-523"></a><span class="p">):</span>
11062
- <a id="__codelineno-0-524" name="__codelineno-0-524"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11063
- <a id="__codelineno-0-525" name="__codelineno-0-525"></a><span class="sd"> Update all `model_to_migrate` with a value for `to_role_field` based on `from_role_field` values.</span>
11064
- <a id="__codelineno-0-526" name="__codelineno-0-526"></a>
11065
- <a id="__codelineno-0-527" name="__codelineno-0-527"></a><span class="sd"> Args:</span>
11066
- <a id="__codelineno-0-528" name="__codelineno-0-528"></a><span class="sd"> model_to_migrate (Model): Model with role fields to alter</span>
11067
- <a id="__codelineno-0-529" name="__codelineno-0-529"></a><span class="sd"> from_role_field_name (str): Name of the field on `model_to_migrate` to use as source data</span>
11068
- <a id="__codelineno-0-530" name="__codelineno-0-530"></a><span class="sd"> from_role_model (Model): If `from_role_field` is a ForeignKey or M2M field, the corresponding model for it</span>
11069
- <a id="__codelineno-0-531" name="__codelineno-0-531"></a><span class="sd"> from_role_choiceset (ChoiceSet): If `from_role_field` is a choices field, the corresponding ChoiceSet for it</span>
11070
- <a id="__codelineno-0-532" name="__codelineno-0-532"></a><span class="sd"> to_role_field_name (str): Name of the field on `model_to_migrate` to update based on the `from_role_field`</span>
11071
- <a id="__codelineno-0-533" name="__codelineno-0-533"></a><span class="sd"> to_role_model (Model): If `to_role_field` is a ForeignKey or M2M field, the corresponding model for it</span>
11072
- <a id="__codelineno-0-534" name="__codelineno-0-534"></a><span class="sd"> to_role_choiceset (ChoiceSet): If `to_role_field` is a choices field, the corresponding ChoiceSet for it</span>
11073
- <a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="sd"> is_m2m_field (bool): True if the role fields are both ManyToManyFields, else False</span>
11074
- <a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="sd"> &quot;&quot;&quot;</span>
11075
- <a id="__codelineno-0-537" name="__codelineno-0-537"></a> <span class="k">if</span> <span class="n">from_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">from_role_choiceset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11076
- <a id="__codelineno-0-538" name="__codelineno-0-538"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;from_role_model and from_role_choiceset are mutually exclusive&quot;</span><span class="p">)</span>
11077
- <a id="__codelineno-0-539" name="__codelineno-0-539"></a> <span class="k">if</span> <span class="n">from_role_model</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">from_role_choiceset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
11078
- <a id="__codelineno-0-540" name="__codelineno-0-540"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;One of from_role_model or from_role_choiceset must be specified and not None&quot;</span><span class="p">)</span>
11079
- <a id="__codelineno-0-541" name="__codelineno-0-541"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">to_role_choiceset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11080
- <a id="__codelineno-0-542" name="__codelineno-0-542"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;to_role_model and to_role_choiceset are mutually exclusive&quot;</span><span class="p">)</span>
11081
- <a id="__codelineno-0-543" name="__codelineno-0-543"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">to_role_choiceset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
11082
- <a id="__codelineno-0-544" name="__codelineno-0-544"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;One of to_role_model or to_role_choiceset must be specified and not None&quot;</span><span class="p">)</span>
11083
- <a id="__codelineno-0-545" name="__codelineno-0-545"></a>
11084
- <a id="__codelineno-0-546" name="__codelineno-0-546"></a> <span class="k">if</span> <span class="n">from_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11085
- <a id="__codelineno-0-547" name="__codelineno-0-547"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11086
- <a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="c1"># Mapping &quot;from&quot; model instances to corresponding &quot;to&quot; model instances</span>
11087
- <a id="__codelineno-0-549" name="__codelineno-0-549"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11088
- <a id="__codelineno-0-550" name="__codelineno-0-550"></a> <span class="c1"># Use .filter().first(), not .get() because &quot;to&quot; role might not exist, especially on reverse migrations</span>
11089
- <a id="__codelineno-0-551" name="__codelineno-0-551"></a> <span class="n">from_role</span><span class="p">:</span> <span class="n">to_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">from_role</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
11090
- <a id="__codelineno-0-552" name="__codelineno-0-552"></a> <span class="k">for</span> <span class="n">from_role</span> <span class="ow">in</span> <span class="n">from_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
11091
- <a id="__codelineno-0-553" name="__codelineno-0-553"></a> <span class="p">}</span>
11092
- <a id="__codelineno-0-554" name="__codelineno-0-554"></a> <span class="k">else</span><span class="p">:</span>
11093
- <a id="__codelineno-0-555" name="__codelineno-0-555"></a> <span class="c1"># Mapping &quot;from&quot; model instances to corresponding &quot;to&quot; choices</span>
11094
- <a id="__codelineno-0-556" name="__codelineno-0-556"></a> <span class="c1"># We need to use `label` to look up the from_role instance, but `value` is what we set for the to_role_field</span>
11095
- <a id="__codelineno-0-557" name="__codelineno-0-557"></a> <span class="n">inverted_to_role_choiceset</span> <span class="o">=</span> <span class="p">{</span><span class="n">label</span><span class="p">:</span> <span class="n">value</span> <span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">to_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span><span class="p">}</span>
11096
- <a id="__codelineno-0-558" name="__codelineno-0-558"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11097
- <a id="__codelineno-0-559" name="__codelineno-0-559"></a> <span class="n">from_role</span><span class="p">:</span> <span class="n">inverted_to_role_choiceset</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">from_role</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
11098
- <a id="__codelineno-0-560" name="__codelineno-0-560"></a> <span class="k">for</span> <span class="n">from_role</span> <span class="ow">in</span> <span class="n">from_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
11099
- <a id="__codelineno-0-561" name="__codelineno-0-561"></a> <span class="p">}</span>
11100
- <a id="__codelineno-0-562" name="__codelineno-0-562"></a> <span class="k">else</span><span class="p">:</span>
11101
- <a id="__codelineno-0-563" name="__codelineno-0-563"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11102
- <a id="__codelineno-0-564" name="__codelineno-0-564"></a> <span class="c1"># Mapping &quot;from&quot; choices to corresponding &quot;to&quot; model instances</span>
11103
- <a id="__codelineno-0-565" name="__codelineno-0-565"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11104
- <a id="__codelineno-0-566" name="__codelineno-0-566"></a> <span class="c1"># Use .filter().first(), not .get() because &quot;to&quot; role might not exist, especially on reverse migrations</span>
11105
- <a id="__codelineno-0-567" name="__codelineno-0-567"></a> <span class="n">from_role_value</span><span class="p">:</span> <span class="n">to_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">from_role_label</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
11106
- <a id="__codelineno-0-568" name="__codelineno-0-568"></a> <span class="k">for</span> <span class="n">from_role_value</span><span class="p">,</span> <span class="n">from_role_label</span> <span class="ow">in</span> <span class="n">from_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span>
11107
- <a id="__codelineno-0-569" name="__codelineno-0-569"></a> <span class="p">}</span>
11108
- <a id="__codelineno-0-570" name="__codelineno-0-570"></a> <span class="k">else</span><span class="p">:</span>
11109
- <a id="__codelineno-0-571" name="__codelineno-0-571"></a> <span class="c1"># Mapping &quot;from&quot; choices to corresponding &quot;to&quot; choices; we don&#39;t currently use this case, but it should work</span>
11110
- <a id="__codelineno-0-572" name="__codelineno-0-572"></a> <span class="c1"># We need to use `label` to look up the from_role instance, but `value` is what we set for the to_role_field</span>
11111
- <a id="__codelineno-0-573" name="__codelineno-0-573"></a> <span class="n">inverted_to_role_choiceset</span> <span class="o">=</span> <span class="p">{</span><span class="n">label</span><span class="p">:</span> <span class="n">value</span> <span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">to_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span><span class="p">}</span>
11112
- <a id="__codelineno-0-574" name="__codelineno-0-574"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11113
- <a id="__codelineno-0-575" name="__codelineno-0-575"></a> <span class="n">from_role_value</span><span class="p">:</span> <span class="n">inverted_to_role_choiceset</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">from_role_label</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
11114
- <a id="__codelineno-0-576" name="__codelineno-0-576"></a> <span class="k">for</span> <span class="n">from_role_value</span><span class="p">,</span> <span class="n">from_role_label</span> <span class="ow">in</span> <span class="n">from_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span>
11115
- <a id="__codelineno-0-577" name="__codelineno-0-577"></a> <span class="p">}</span>
11116
- <a id="__codelineno-0-578" name="__codelineno-0-578"></a>
11117
- <a id="__codelineno-0-579" name="__codelineno-0-579"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">is_m2m_field</span><span class="p">:</span>
11118
- <a id="__codelineno-0-580" name="__codelineno-0-580"></a> <span class="c1"># Bulk updates of a single field are easy enough...</span>
11119
- <a id="__codelineno-0-581" name="__codelineno-0-581"></a> <span class="k">for</span> <span class="n">from_role_value</span><span class="p">,</span> <span class="n">to_role_value</span> <span class="ow">in</span> <span class="n">roles_translation_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
11120
- <a id="__codelineno-0-582" name="__codelineno-0-582"></a> <span class="k">if</span> <span class="n">to_role_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11121
- <a id="__codelineno-0-583" name="__codelineno-0-583"></a> <span class="n">updated_count</span> <span class="o">=</span> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">from_role_field_name</span><span class="p">:</span> <span class="n">from_role_value</span><span class="p">})</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
11122
- <a id="__codelineno-0-584" name="__codelineno-0-584"></a> <span class="o">**</span><span class="p">{</span><span class="n">to_role_field_name</span><span class="p">:</span> <span class="n">to_role_value</span><span class="p">}</span>
11123
- <a id="__codelineno-0-585" name="__codelineno-0-585"></a> <span class="p">)</span>
11124
- <a id="__codelineno-0-586" name="__codelineno-0-586"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
11125
- <a id="__codelineno-0-587" name="__codelineno-0-587"></a> <span class="s1">&#39;Updated </span><span class="si">%d</span><span class="s1"> </span><span class="si">%s</span><span class="s1"> records to reference </span><span class="si">%s</span><span class="s1"> &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span>
11126
- <a id="__codelineno-0-588" name="__codelineno-0-588"></a> <span class="n">updated_count</span><span class="p">,</span>
11127
- <a id="__codelineno-0-589" name="__codelineno-0-589"></a> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
11128
- <a id="__codelineno-0-590" name="__codelineno-0-590"></a> <span class="n">to_role_field_name</span><span class="p">,</span>
11129
- <a id="__codelineno-0-591" name="__codelineno-0-591"></a> <span class="n">to_role_value</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="n">to_role_model</span> <span class="k">else</span> <span class="n">to_role_value</span><span class="p">,</span>
11130
- <a id="__codelineno-0-592" name="__codelineno-0-592"></a> <span class="p">)</span>
11131
- <a id="__codelineno-0-593" name="__codelineno-0-593"></a> <span class="k">else</span><span class="p">:</span>
11132
- <a id="__codelineno-0-594" name="__codelineno-0-594"></a> <span class="c1"># ...but we have to update each instance&#39;s M2M field independently?</span>
11133
- <a id="__codelineno-0-595" name="__codelineno-0-595"></a> <span class="k">for</span> <span class="n">instance</span> <span class="ow">in</span> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
11134
- <a id="__codelineno-0-596" name="__codelineno-0-596"></a> <span class="n">to_role_set</span> <span class="o">=</span> <span class="p">{</span>
11135
- <a id="__codelineno-0-597" name="__codelineno-0-597"></a> <span class="n">roles_translation_mapping</span><span class="p">[</span><span class="n">from_role_value</span><span class="p">]</span>
11136
- <a id="__codelineno-0-598" name="__codelineno-0-598"></a> <span class="k">for</span> <span class="n">from_role_value</span> <span class="ow">in</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">from_role_field_name</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
11137
- <a id="__codelineno-0-599" name="__codelineno-0-599"></a> <span class="p">}</span>
11138
- <a id="__codelineno-0-600" name="__codelineno-0-600"></a> <span class="c1"># Discard any null values</span>
11139
- <a id="__codelineno-0-601" name="__codelineno-0-601"></a> <span class="n">to_role_set</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
11140
- <a id="__codelineno-0-602" name="__codelineno-0-602"></a> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">to_role_field_name</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">to_role_set</span><span class="p">)</span>
11141
- <a id="__codelineno-0-603" name="__codelineno-0-603"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
11142
- <a id="__codelineno-0-604" name="__codelineno-0-604"></a> <span class="s2">&quot;Updated </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> record </span><span class="si">%s</span><span class="s2"> M2M fields&quot;</span><span class="p">,</span>
11143
- <a id="__codelineno-0-605" name="__codelineno-0-605"></a> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">(),</span>
11144
- <a id="__codelineno-0-606" name="__codelineno-0-606"></a> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
11145
- <a id="__codelineno-0-607" name="__codelineno-0-607"></a> <span class="n">to_role_field_name</span><span class="p">,</span>
11146
- <a id="__codelineno-0-608" name="__codelineno-0-608"></a> <span class="p">)</span>
11527
+ <span class="normal"><a href="#__codelineno-0-608">608</a></span>
11528
+ <span class="normal"><a href="#__codelineno-0-609">609</a></span>
11529
+ <span class="normal"><a href="#__codelineno-0-610">610</a></span>
11530
+ <span class="normal"><a href="#__codelineno-0-611">611</a></span>
11531
+ <span class="normal"><a href="#__codelineno-0-612">612</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-517" name="__codelineno-0-517"></a><span class="k">def</span> <span class="nf">migrate_role_data</span><span class="p">(</span>
11532
+ <a id="__codelineno-0-518" name="__codelineno-0-518"></a> <span class="n">model_to_migrate</span><span class="p">,</span>
11533
+ <a id="__codelineno-0-519" name="__codelineno-0-519"></a> <span class="o">*</span><span class="p">,</span>
11534
+ <a id="__codelineno-0-520" name="__codelineno-0-520"></a> <span class="n">from_role_field_name</span><span class="p">,</span>
11535
+ <a id="__codelineno-0-521" name="__codelineno-0-521"></a> <span class="n">from_role_model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11536
+ <a id="__codelineno-0-522" name="__codelineno-0-522"></a> <span class="n">from_role_choiceset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11537
+ <a id="__codelineno-0-523" name="__codelineno-0-523"></a> <span class="n">to_role_field_name</span><span class="p">,</span>
11538
+ <a id="__codelineno-0-524" name="__codelineno-0-524"></a> <span class="n">to_role_model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11539
+ <a id="__codelineno-0-525" name="__codelineno-0-525"></a> <span class="n">to_role_choiceset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
11540
+ <a id="__codelineno-0-526" name="__codelineno-0-526"></a> <span class="n">is_m2m_field</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
11541
+ <a id="__codelineno-0-527" name="__codelineno-0-527"></a><span class="p">):</span>
11542
+ <a id="__codelineno-0-528" name="__codelineno-0-528"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11543
+ <a id="__codelineno-0-529" name="__codelineno-0-529"></a><span class="sd"> Update all `model_to_migrate` with a value for `to_role_field` based on `from_role_field` values.</span>
11544
+ <a id="__codelineno-0-530" name="__codelineno-0-530"></a>
11545
+ <a id="__codelineno-0-531" name="__codelineno-0-531"></a><span class="sd"> Args:</span>
11546
+ <a id="__codelineno-0-532" name="__codelineno-0-532"></a><span class="sd"> model_to_migrate (Model): Model with role fields to alter</span>
11547
+ <a id="__codelineno-0-533" name="__codelineno-0-533"></a><span class="sd"> from_role_field_name (str): Name of the field on `model_to_migrate` to use as source data</span>
11548
+ <a id="__codelineno-0-534" name="__codelineno-0-534"></a><span class="sd"> from_role_model (Model): If `from_role_field` is a ForeignKey or M2M field, the corresponding model for it</span>
11549
+ <a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="sd"> from_role_choiceset (ChoiceSet): If `from_role_field` is a choices field, the corresponding ChoiceSet for it</span>
11550
+ <a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="sd"> to_role_field_name (str): Name of the field on `model_to_migrate` to update based on the `from_role_field`</span>
11551
+ <a id="__codelineno-0-537" name="__codelineno-0-537"></a><span class="sd"> to_role_model (Model): If `to_role_field` is a ForeignKey or M2M field, the corresponding model for it</span>
11552
+ <a id="__codelineno-0-538" name="__codelineno-0-538"></a><span class="sd"> to_role_choiceset (ChoiceSet): If `to_role_field` is a choices field, the corresponding ChoiceSet for it</span>
11553
+ <a id="__codelineno-0-539" name="__codelineno-0-539"></a><span class="sd"> is_m2m_field (bool): True if the role fields are both ManyToManyFields, else False</span>
11554
+ <a id="__codelineno-0-540" name="__codelineno-0-540"></a><span class="sd"> &quot;&quot;&quot;</span>
11555
+ <a id="__codelineno-0-541" name="__codelineno-0-541"></a> <span class="k">if</span> <span class="n">from_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">from_role_choiceset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11556
+ <a id="__codelineno-0-542" name="__codelineno-0-542"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;from_role_model and from_role_choiceset are mutually exclusive&quot;</span><span class="p">)</span>
11557
+ <a id="__codelineno-0-543" name="__codelineno-0-543"></a> <span class="k">if</span> <span class="n">from_role_model</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">from_role_choiceset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
11558
+ <a id="__codelineno-0-544" name="__codelineno-0-544"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;One of from_role_model or from_role_choiceset must be specified and not None&quot;</span><span class="p">)</span>
11559
+ <a id="__codelineno-0-545" name="__codelineno-0-545"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">to_role_choiceset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11560
+ <a id="__codelineno-0-546" name="__codelineno-0-546"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;to_role_model and to_role_choiceset are mutually exclusive&quot;</span><span class="p">)</span>
11561
+ <a id="__codelineno-0-547" name="__codelineno-0-547"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">to_role_choiceset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
11562
+ <a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;One of to_role_model or to_role_choiceset must be specified and not None&quot;</span><span class="p">)</span>
11563
+ <a id="__codelineno-0-549" name="__codelineno-0-549"></a>
11564
+ <a id="__codelineno-0-550" name="__codelineno-0-550"></a> <span class="k">if</span> <span class="n">from_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11565
+ <a id="__codelineno-0-551" name="__codelineno-0-551"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11566
+ <a id="__codelineno-0-552" name="__codelineno-0-552"></a> <span class="c1"># Mapping &quot;from&quot; model instances to corresponding &quot;to&quot; model instances</span>
11567
+ <a id="__codelineno-0-553" name="__codelineno-0-553"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11568
+ <a id="__codelineno-0-554" name="__codelineno-0-554"></a> <span class="c1"># Use .filter().first(), not .get() because &quot;to&quot; role might not exist, especially on reverse migrations</span>
11569
+ <a id="__codelineno-0-555" name="__codelineno-0-555"></a> <span class="n">from_role</span><span class="p">:</span> <span class="n">to_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">from_role</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
11570
+ <a id="__codelineno-0-556" name="__codelineno-0-556"></a> <span class="k">for</span> <span class="n">from_role</span> <span class="ow">in</span> <span class="n">from_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
11571
+ <a id="__codelineno-0-557" name="__codelineno-0-557"></a> <span class="p">}</span>
11572
+ <a id="__codelineno-0-558" name="__codelineno-0-558"></a> <span class="k">else</span><span class="p">:</span>
11573
+ <a id="__codelineno-0-559" name="__codelineno-0-559"></a> <span class="c1"># Mapping &quot;from&quot; model instances to corresponding &quot;to&quot; choices</span>
11574
+ <a id="__codelineno-0-560" name="__codelineno-0-560"></a> <span class="c1"># We need to use `label` to look up the from_role instance, but `value` is what we set for the to_role_field</span>
11575
+ <a id="__codelineno-0-561" name="__codelineno-0-561"></a> <span class="n">inverted_to_role_choiceset</span> <span class="o">=</span> <span class="p">{</span><span class="n">label</span><span class="p">:</span> <span class="n">value</span> <span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">to_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span><span class="p">}</span>
11576
+ <a id="__codelineno-0-562" name="__codelineno-0-562"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11577
+ <a id="__codelineno-0-563" name="__codelineno-0-563"></a> <span class="n">from_role</span><span class="p">:</span> <span class="n">inverted_to_role_choiceset</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">from_role</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
11578
+ <a id="__codelineno-0-564" name="__codelineno-0-564"></a> <span class="k">for</span> <span class="n">from_role</span> <span class="ow">in</span> <span class="n">from_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
11579
+ <a id="__codelineno-0-565" name="__codelineno-0-565"></a> <span class="p">}</span>
11580
+ <a id="__codelineno-0-566" name="__codelineno-0-566"></a> <span class="k">else</span><span class="p">:</span>
11581
+ <a id="__codelineno-0-567" name="__codelineno-0-567"></a> <span class="k">if</span> <span class="n">to_role_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11582
+ <a id="__codelineno-0-568" name="__codelineno-0-568"></a> <span class="c1"># Mapping &quot;from&quot; choices to corresponding &quot;to&quot; model instances</span>
11583
+ <a id="__codelineno-0-569" name="__codelineno-0-569"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11584
+ <a id="__codelineno-0-570" name="__codelineno-0-570"></a> <span class="c1"># Use .filter().first(), not .get() because &quot;to&quot; role might not exist, especially on reverse migrations</span>
11585
+ <a id="__codelineno-0-571" name="__codelineno-0-571"></a> <span class="n">from_role_value</span><span class="p">:</span> <span class="n">to_role_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">from_role_label</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
11586
+ <a id="__codelineno-0-572" name="__codelineno-0-572"></a> <span class="k">for</span> <span class="n">from_role_value</span><span class="p">,</span> <span class="n">from_role_label</span> <span class="ow">in</span> <span class="n">from_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span>
11587
+ <a id="__codelineno-0-573" name="__codelineno-0-573"></a> <span class="p">}</span>
11588
+ <a id="__codelineno-0-574" name="__codelineno-0-574"></a> <span class="k">else</span><span class="p">:</span>
11589
+ <a id="__codelineno-0-575" name="__codelineno-0-575"></a> <span class="c1"># Mapping &quot;from&quot; choices to corresponding &quot;to&quot; choices; we don&#39;t currently use this case, but it should work</span>
11590
+ <a id="__codelineno-0-576" name="__codelineno-0-576"></a> <span class="c1"># We need to use `label` to look up the from_role instance, but `value` is what we set for the to_role_field</span>
11591
+ <a id="__codelineno-0-577" name="__codelineno-0-577"></a> <span class="n">inverted_to_role_choiceset</span> <span class="o">=</span> <span class="p">{</span><span class="n">label</span><span class="p">:</span> <span class="n">value</span> <span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">to_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span><span class="p">}</span>
11592
+ <a id="__codelineno-0-578" name="__codelineno-0-578"></a> <span class="n">roles_translation_mapping</span> <span class="o">=</span> <span class="p">{</span>
11593
+ <a id="__codelineno-0-579" name="__codelineno-0-579"></a> <span class="n">from_role_value</span><span class="p">:</span> <span class="n">inverted_to_role_choiceset</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">from_role_label</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
11594
+ <a id="__codelineno-0-580" name="__codelineno-0-580"></a> <span class="k">for</span> <span class="n">from_role_value</span><span class="p">,</span> <span class="n">from_role_label</span> <span class="ow">in</span> <span class="n">from_role_choiceset</span><span class="o">.</span><span class="n">CHOICES</span>
11595
+ <a id="__codelineno-0-581" name="__codelineno-0-581"></a> <span class="p">}</span>
11596
+ <a id="__codelineno-0-582" name="__codelineno-0-582"></a>
11597
+ <a id="__codelineno-0-583" name="__codelineno-0-583"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">is_m2m_field</span><span class="p">:</span>
11598
+ <a id="__codelineno-0-584" name="__codelineno-0-584"></a> <span class="c1"># Bulk updates of a single field are easy enough...</span>
11599
+ <a id="__codelineno-0-585" name="__codelineno-0-585"></a> <span class="k">for</span> <span class="n">from_role_value</span><span class="p">,</span> <span class="n">to_role_value</span> <span class="ow">in</span> <span class="n">roles_translation_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
11600
+ <a id="__codelineno-0-586" name="__codelineno-0-586"></a> <span class="k">if</span> <span class="n">to_role_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11601
+ <a id="__codelineno-0-587" name="__codelineno-0-587"></a> <span class="n">updated_count</span> <span class="o">=</span> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">from_role_field_name</span><span class="p">:</span> <span class="n">from_role_value</span><span class="p">})</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
11602
+ <a id="__codelineno-0-588" name="__codelineno-0-588"></a> <span class="o">**</span><span class="p">{</span><span class="n">to_role_field_name</span><span class="p">:</span> <span class="n">to_role_value</span><span class="p">}</span>
11603
+ <a id="__codelineno-0-589" name="__codelineno-0-589"></a> <span class="p">)</span>
11604
+ <a id="__codelineno-0-590" name="__codelineno-0-590"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
11605
+ <a id="__codelineno-0-591" name="__codelineno-0-591"></a> <span class="s1">&#39;Updated </span><span class="si">%d</span><span class="s1"> </span><span class="si">%s</span><span class="s1"> records to reference </span><span class="si">%s</span><span class="s1"> &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span>
11606
+ <a id="__codelineno-0-592" name="__codelineno-0-592"></a> <span class="n">updated_count</span><span class="p">,</span>
11607
+ <a id="__codelineno-0-593" name="__codelineno-0-593"></a> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
11608
+ <a id="__codelineno-0-594" name="__codelineno-0-594"></a> <span class="n">to_role_field_name</span><span class="p">,</span>
11609
+ <a id="__codelineno-0-595" name="__codelineno-0-595"></a> <span class="n">to_role_value</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="n">to_role_model</span> <span class="k">else</span> <span class="n">to_role_value</span><span class="p">,</span>
11610
+ <a id="__codelineno-0-596" name="__codelineno-0-596"></a> <span class="p">)</span>
11611
+ <a id="__codelineno-0-597" name="__codelineno-0-597"></a> <span class="k">else</span><span class="p">:</span>
11612
+ <a id="__codelineno-0-598" name="__codelineno-0-598"></a> <span class="c1"># ...but we have to update each instance&#39;s M2M field independently?</span>
11613
+ <a id="__codelineno-0-599" name="__codelineno-0-599"></a> <span class="k">for</span> <span class="n">instance</span> <span class="ow">in</span> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
11614
+ <a id="__codelineno-0-600" name="__codelineno-0-600"></a> <span class="n">to_role_set</span> <span class="o">=</span> <span class="p">{</span>
11615
+ <a id="__codelineno-0-601" name="__codelineno-0-601"></a> <span class="n">roles_translation_mapping</span><span class="p">[</span><span class="n">from_role_value</span><span class="p">]</span>
11616
+ <a id="__codelineno-0-602" name="__codelineno-0-602"></a> <span class="k">for</span> <span class="n">from_role_value</span> <span class="ow">in</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">from_role_field_name</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
11617
+ <a id="__codelineno-0-603" name="__codelineno-0-603"></a> <span class="p">}</span>
11618
+ <a id="__codelineno-0-604" name="__codelineno-0-604"></a> <span class="c1"># Discard any null values</span>
11619
+ <a id="__codelineno-0-605" name="__codelineno-0-605"></a> <span class="n">to_role_set</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
11620
+ <a id="__codelineno-0-606" name="__codelineno-0-606"></a> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">to_role_field_name</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">to_role_set</span><span class="p">)</span>
11621
+ <a id="__codelineno-0-607" name="__codelineno-0-607"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
11622
+ <a id="__codelineno-0-608" name="__codelineno-0-608"></a> <span class="s2">&quot;Updated </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> record </span><span class="si">%s</span><span class="s2"> M2M fields&quot;</span><span class="p">,</span>
11623
+ <a id="__codelineno-0-609" name="__codelineno-0-609"></a> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">(),</span>
11624
+ <a id="__codelineno-0-610" name="__codelineno-0-610"></a> <span class="n">model_to_migrate</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
11625
+ <a id="__codelineno-0-611" name="__codelineno-0-611"></a> <span class="n">to_role_field_name</span><span class="p">,</span>
11626
+ <a id="__codelineno-0-612" name="__codelineno-0-612"></a> <span class="p">)</span>
11147
11627
  </code></pre></div></td></tr></table></div>
11148
11628
  </details>
11149
11629
  </div>
@@ -11341,11 +11821,7 @@ values.</p>
11341
11821
 
11342
11822
  <details class="quote">
11343
11823
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
11344
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-229">229</a></span>
11345
- <span class="normal"><a href="#__codelineno-0-230">230</a></span>
11346
- <span class="normal"><a href="#__codelineno-0-231">231</a></span>
11347
- <span class="normal"><a href="#__codelineno-0-232">232</a></span>
11348
- <span class="normal"><a href="#__codelineno-0-233">233</a></span>
11824
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-233">233</a></span>
11349
11825
  <span class="normal"><a href="#__codelineno-0-234">234</a></span>
11350
11826
  <span class="normal"><a href="#__codelineno-0-235">235</a></span>
11351
11827
  <span class="normal"><a href="#__codelineno-0-236">236</a></span>
@@ -11389,55 +11865,59 @@ values.</p>
11389
11865
  <span class="normal"><a href="#__codelineno-0-274">274</a></span>
11390
11866
  <span class="normal"><a href="#__codelineno-0-275">275</a></span>
11391
11867
  <span class="normal"><a href="#__codelineno-0-276">276</a></span>
11392
- <span class="normal"><a href="#__codelineno-0-277">277</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="k">def</span> <span class="nf">populate_model_features_registry</span><span class="p">(</span><span class="n">refresh</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
11393
- <a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11394
- <a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd"> Populate the registry model features with new apps.</span>
11395
- <a id="__codelineno-0-232" name="__codelineno-0-232"></a>
11396
- <a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd"> This function updates the registry model features.</span>
11397
- <a id="__codelineno-0-234" name="__codelineno-0-234"></a>
11398
- <a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> Behavior:</span>
11399
- <a id="__codelineno-0-236" name="__codelineno-0-236"></a><span class="sd"> - Defines a list of dictionaries called lookup_confs. Each dictionary contains:</span>
11400
- <a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="sd"> - &#39;feature_name&#39;: The name of the feature to be updated in the registry.</span>
11401
- <a id="__codelineno-0-238" name="__codelineno-0-238"></a><span class="sd"> - &#39;field_names&#39;: A list of names of fields that must be present in order for the model to be considered</span>
11402
- <a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="sd"> a valid model_feature.</span>
11403
- <a id="__codelineno-0-240" name="__codelineno-0-240"></a><span class="sd"> - &#39;field_attributes&#39;: Optional dictionary of attributes to filter the fields by. Only model which fields match</span>
11404
- <a id="__codelineno-0-241" name="__codelineno-0-241"></a><span class="sd"> all the attributes specified in the dictionary will be considered. This parameter can be</span>
11405
- <a id="__codelineno-0-242" name="__codelineno-0-242"></a><span class="sd"> useful to narrow down the search for fields that match certain criteria. For example, if</span>
11406
- <a id="__codelineno-0-243" name="__codelineno-0-243"></a><span class="sd"> `field_attributes` is set to {&quot;related_model&quot;: RelationshipAssociation}, only fields with</span>
11407
- <a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> a related model of RelationshipAssociation will be considered.</span>
11408
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="sd"> - Looks up all the models in the installed apps.</span>
11409
- <a id="__codelineno-0-246" name="__codelineno-0-246"></a><span class="sd"> - For each dictionary in lookup_confs, calls lookup_by_field() function to look for all models that have fields with the names given in the dictionary.</span>
11410
- <a id="__codelineno-0-247" name="__codelineno-0-247"></a><span class="sd"> - Groups the results by app and updates the registry model features for each app.</span>
11411
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a><span class="sd"> &quot;&quot;&quot;</span>
11412
- <a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="k">if</span> <span class="n">registry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;populate_model_features_registry_called&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">refresh</span><span class="p">:</span>
11413
- <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="k">return</span>
11414
- <a id="__codelineno-0-251" name="__codelineno-0-251"></a>
11415
- <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="n">RelationshipAssociation</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;extras&quot;</span><span class="p">,</span> <span class="n">model_name</span><span class="o">=</span><span class="s2">&quot;relationshipassociation&quot;</span><span class="p">)</span>
11416
- <a id="__codelineno-0-253" name="__codelineno-0-253"></a>
11417
- <a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="n">lookup_confs</span> <span class="o">=</span> <span class="p">[</span>
11418
- <a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="p">{</span>
11419
- <a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="s2">&quot;feature_name&quot;</span><span class="p">:</span> <span class="s2">&quot;custom_fields&quot;</span><span class="p">,</span>
11420
- <a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="s2">&quot;field_names&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;_custom_field_data&quot;</span><span class="p">],</span>
11421
- <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="p">},</span>
11868
+ <span class="normal"><a href="#__codelineno-0-277">277</a></span>
11869
+ <span class="normal"><a href="#__codelineno-0-278">278</a></span>
11870
+ <span class="normal"><a href="#__codelineno-0-279">279</a></span>
11871
+ <span class="normal"><a href="#__codelineno-0-280">280</a></span>
11872
+ <span class="normal"><a href="#__codelineno-0-281">281</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="k">def</span> <span class="nf">populate_model_features_registry</span><span class="p">(</span><span class="n">refresh</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
11873
+ <a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11874
+ <a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> Populate the registry model features with new apps.</span>
11875
+ <a id="__codelineno-0-236" name="__codelineno-0-236"></a>
11876
+ <a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="sd"> This function updates the registry model features.</span>
11877
+ <a id="__codelineno-0-238" name="__codelineno-0-238"></a>
11878
+ <a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="sd"> Behavior:</span>
11879
+ <a id="__codelineno-0-240" name="__codelineno-0-240"></a><span class="sd"> - Defines a list of dictionaries called lookup_confs. Each dictionary contains:</span>
11880
+ <a id="__codelineno-0-241" name="__codelineno-0-241"></a><span class="sd"> - &#39;feature_name&#39;: The name of the feature to be updated in the registry.</span>
11881
+ <a id="__codelineno-0-242" name="__codelineno-0-242"></a><span class="sd"> - &#39;field_names&#39;: A list of names of fields that must be present in order for the model to be considered</span>
11882
+ <a id="__codelineno-0-243" name="__codelineno-0-243"></a><span class="sd"> a valid model_feature.</span>
11883
+ <a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> - &#39;field_attributes&#39;: Optional dictionary of attributes to filter the fields by. Only model which fields match</span>
11884
+ <a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="sd"> all the attributes specified in the dictionary will be considered. This parameter can be</span>
11885
+ <a id="__codelineno-0-246" name="__codelineno-0-246"></a><span class="sd"> useful to narrow down the search for fields that match certain criteria. For example, if</span>
11886
+ <a id="__codelineno-0-247" name="__codelineno-0-247"></a><span class="sd"> `field_attributes` is set to {&quot;related_model&quot;: RelationshipAssociation}, only fields with</span>
11887
+ <a id="__codelineno-0-248" name="__codelineno-0-248"></a><span class="sd"> a related model of RelationshipAssociation will be considered.</span>
11888
+ <a id="__codelineno-0-249" name="__codelineno-0-249"></a><span class="sd"> - Looks up all the models in the installed apps.</span>
11889
+ <a id="__codelineno-0-250" name="__codelineno-0-250"></a><span class="sd"> - For each dictionary in lookup_confs, calls lookup_by_field() function to look for all models that have fields with the names given in the dictionary.</span>
11890
+ <a id="__codelineno-0-251" name="__codelineno-0-251"></a><span class="sd"> - Groups the results by app and updates the registry model features for each app.</span>
11891
+ <a id="__codelineno-0-252" name="__codelineno-0-252"></a><span class="sd"> &quot;&quot;&quot;</span>
11892
+ <a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="k">if</span> <span class="n">registry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;populate_model_features_registry_called&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">refresh</span><span class="p">:</span>
11893
+ <a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="k">return</span>
11894
+ <a id="__codelineno-0-255" name="__codelineno-0-255"></a>
11895
+ <a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="n">RelationshipAssociation</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;extras&quot;</span><span class="p">,</span> <span class="n">model_name</span><span class="o">=</span><span class="s2">&quot;relationshipassociation&quot;</span><span class="p">)</span>
11896
+ <a id="__codelineno-0-257" name="__codelineno-0-257"></a>
11897
+ <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="n">lookup_confs</span> <span class="o">=</span> <span class="p">[</span>
11422
11898
  <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="p">{</span>
11423
- <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="s2">&quot;feature_name&quot;</span><span class="p">:</span> <span class="s2">&quot;relationships&quot;</span><span class="p">,</span>
11424
- <a id="__codelineno-0-261" name="__codelineno-0-261"></a> <span class="s2">&quot;field_names&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;source_for_associations&quot;</span><span class="p">,</span> <span class="s2">&quot;destination_for_associations&quot;</span><span class="p">],</span>
11425
- <a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="s2">&quot;field_attributes&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;related_model&quot;</span><span class="p">:</span> <span class="n">RelationshipAssociation</span><span class="p">},</span>
11426
- <a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="p">},</span>
11427
- <a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="p">]</span>
11428
- <a id="__codelineno-0-265" name="__codelineno-0-265"></a>
11429
- <a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">app_models</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span>
11430
- <a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="k">for</span> <span class="n">lookup_conf</span> <span class="ow">in</span> <span class="n">lookup_confs</span><span class="p">:</span>
11431
- <a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="n">registry_items</span> <span class="o">=</span> <span class="n">find_models_with_matching_fields</span><span class="p">(</span>
11432
- <a id="__codelineno-0-269" name="__codelineno-0-269"></a> <span class="n">app_models</span><span class="o">=</span><span class="n">app_models</span><span class="p">,</span>
11433
- <a id="__codelineno-0-270" name="__codelineno-0-270"></a> <span class="n">field_names</span><span class="o">=</span><span class="n">lookup_conf</span><span class="p">[</span><span class="s2">&quot;field_names&quot;</span><span class="p">],</span>
11434
- <a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="n">field_attributes</span><span class="o">=</span><span class="n">lookup_conf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;field_attributes&quot;</span><span class="p">),</span>
11435
- <a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="p">)</span>
11436
- <a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="n">feature_name</span> <span class="o">=</span> <span class="n">lookup_conf</span><span class="p">[</span><span class="s2">&quot;feature_name&quot;</span><span class="p">]</span>
11437
- <a id="__codelineno-0-274" name="__codelineno-0-274"></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_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">registry_items</span>
11438
- <a id="__codelineno-0-275" name="__codelineno-0-275"></a>
11439
- <a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">registry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;populate_model_features_registry_called&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
11440
- <a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;populate_model_features_registry_called&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
11899
+ <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="s2">&quot;feature_name&quot;</span><span class="p">:</span> <span class="s2">&quot;custom_fields&quot;</span><span class="p">,</span>
11900
+ <a id="__codelineno-0-261" name="__codelineno-0-261"></a> <span class="s2">&quot;field_names&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;_custom_field_data&quot;</span><span class="p">],</span>
11901
+ <a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="p">},</span>
11902
+ <a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="p">{</span>
11903
+ <a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="s2">&quot;feature_name&quot;</span><span class="p">:</span> <span class="s2">&quot;relationships&quot;</span><span class="p">,</span>
11904
+ <a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="s2">&quot;field_names&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;source_for_associations&quot;</span><span class="p">,</span> <span class="s2">&quot;destination_for_associations&quot;</span><span class="p">],</span>
11905
+ <a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="s2">&quot;field_attributes&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;related_model&quot;</span><span class="p">:</span> <span class="n">RelationshipAssociation</span><span class="p">},</span>
11906
+ <a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="p">},</span>
11907
+ <a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="p">]</span>
11908
+ <a id="__codelineno-0-269" name="__codelineno-0-269"></a>
11909
+ <a id="__codelineno-0-270" name="__codelineno-0-270"></a> <span class="n">app_models</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span>
11910
+ <a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="k">for</span> <span class="n">lookup_conf</span> <span class="ow">in</span> <span class="n">lookup_confs</span><span class="p">:</span>
11911
+ <a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="n">registry_items</span> <span class="o">=</span> <span class="n">find_models_with_matching_fields</span><span class="p">(</span>
11912
+ <a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="n">app_models</span><span class="o">=</span><span class="n">app_models</span><span class="p">,</span>
11913
+ <a id="__codelineno-0-274" name="__codelineno-0-274"></a> <span class="n">field_names</span><span class="o">=</span><span class="n">lookup_conf</span><span class="p">[</span><span class="s2">&quot;field_names&quot;</span><span class="p">],</span>
11914
+ <a id="__codelineno-0-275" name="__codelineno-0-275"></a> <span class="n">field_attributes</span><span class="o">=</span><span class="n">lookup_conf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;field_attributes&quot;</span><span class="p">),</span>
11915
+ <a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="p">)</span>
11916
+ <a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="n">feature_name</span> <span class="o">=</span> <span class="n">lookup_conf</span><span class="p">[</span><span class="s2">&quot;feature_name&quot;</span><span class="p">]</span>
11917
+ <a id="__codelineno-0-278" name="__codelineno-0-278"></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_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">registry_items</span>
11918
+ <a id="__codelineno-0-279" name="__codelineno-0-279"></a>
11919
+ <a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">registry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;populate_model_features_registry_called&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
11920
+ <a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">&quot;populate_model_features_registry_called&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
11441
11921
  </code></pre></div></td></tr></table></div>
11442
11922
  </details>
11443
11923
  </div>
@@ -11464,11 +11944,7 @@ and in that case we need to not import models ourselves.</p>
11464
11944
 
11465
11945
  <details class="quote">
11466
11946
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
11467
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-340">340</a></span>
11468
- <span class="normal"><a href="#__codelineno-0-341">341</a></span>
11469
- <span class="normal"><a href="#__codelineno-0-342">342</a></span>
11470
- <span class="normal"><a href="#__codelineno-0-343">343</a></span>
11471
- <span class="normal"><a href="#__codelineno-0-344">344</a></span>
11947
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-344">344</a></span>
11472
11948
  <span class="normal"><a href="#__codelineno-0-345">345</a></span>
11473
11949
  <span class="normal"><a href="#__codelineno-0-346">346</a></span>
11474
11950
  <span class="normal"><a href="#__codelineno-0-347">347</a></span>
@@ -11595,138 +12071,142 @@ and in that case we need to not import models ourselves.</p>
11595
12071
  <span class="normal"><a href="#__codelineno-0-468">468</a></span>
11596
12072
  <span class="normal"><a href="#__codelineno-0-469">469</a></span>
11597
12073
  <span class="normal"><a href="#__codelineno-0-470">470</a></span>
11598
- <span class="normal"><a href="#__codelineno-0-471">471</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-340" name="__codelineno-0-340"></a><span class="k">def</span> <span class="nf">refresh_job_model_from_job_class</span><span class="p">(</span><span class="n">job_model_class</span><span class="p">,</span> <span class="n">job_class</span><span class="p">):</span>
11599
- <a id="__codelineno-0-341" name="__codelineno-0-341"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11600
- <a id="__codelineno-0-342" name="__codelineno-0-342"></a><span class="sd"> Create or update a job_model record based on the metadata of the provided job_class.</span>
11601
- <a id="__codelineno-0-343" name="__codelineno-0-343"></a>
11602
- <a id="__codelineno-0-344" name="__codelineno-0-344"></a><span class="sd"> Note that job_model_class is a parameter (rather than doing a &quot;from nautobot.extras.models import Job&quot;) because</span>
11603
- <a id="__codelineno-0-345" name="__codelineno-0-345"></a><span class="sd"> this function may be called from various initialization processes (such as the &quot;nautobot_database_ready&quot; signal)</span>
11604
- <a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="sd"> and in that case we need to not import models ourselves.</span>
11605
- <a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> &quot;&quot;&quot;</span>
11606
- <a id="__codelineno-0-348" name="__codelineno-0-348"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.jobs</span> <span class="kn">import</span> <span class="p">(</span>
11607
- <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="n">JobButtonReceiver</span><span class="p">,</span>
11608
- <a id="__codelineno-0-350" name="__codelineno-0-350"></a> <span class="n">JobHookReceiver</span><span class="p">,</span>
11609
- <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="p">)</span>
11610
- <a id="__codelineno-0-352" name="__codelineno-0-352"></a>
11611
- <a id="__codelineno-0-353" name="__codelineno-0-353"></a> <span class="c1"># Unrecoverable errors</span>
11612
- <a id="__codelineno-0-354" name="__codelineno-0-354"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">:</span>
11613
- <a id="__codelineno-0-355" name="__codelineno-0-355"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
11614
- <a id="__codelineno-0-356" name="__codelineno-0-356"></a> <span class="s1">&#39;Unable to store Jobs from module &quot;</span><span class="si">%s</span><span class="s1">&quot; as Job models because the module exceeds </span><span class="si">%d</span><span class="s1"> characters in length!&#39;</span><span class="p">,</span>
11615
- <a id="__codelineno-0-357" name="__codelineno-0-357"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span>
11616
- <a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">,</span>
11617
- <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="p">)</span>
11618
- <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
11619
- <a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">:</span>
11620
- <a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
11621
- <a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="s1">&#39;Unable to represent Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; as a Job model because the class name exceeds </span><span class="si">%d</span><span class="s1"> characters in length!&#39;</span><span class="p">,</span>
11622
- <a id="__codelineno-0-364" name="__codelineno-0-364"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
11623
- <a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">,</span>
11624
- <a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="p">)</span>
11625
- <a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
11626
- <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobHookReceiver</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobButtonReceiver</span><span class="p">):</span>
11627
- <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
11628
- <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; must not sub-class from both JobHookReceiver and JobButtonReceiver!&#39;</span><span class="p">,</span>
11629
- <a id="__codelineno-0-371" name="__codelineno-0-371"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
11630
- <a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="p">)</span>
11631
- <a id="__codelineno-0-373" name="__codelineno-0-373"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
11632
- <a id="__codelineno-0-374" name="__codelineno-0-374"></a>
11633
- <a id="__codelineno-0-375" name="__codelineno-0-375"></a> <span class="c1"># Recoverable errors</span>
11634
- <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="n">grouping</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_GROUPING_LENGTH</span><span class="p">:</span>
11635
- <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
11636
- <a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; grouping &quot;</span><span class="si">%s</span><span class="s1">&quot; exceeds </span><span class="si">%d</span><span class="s1"> characters in length, it will be truncated in the database.&#39;</span><span class="p">,</span>
11637
- <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
11638
- <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="n">job_class</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span>
11639
- <a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="n">JOB_MAX_GROUPING_LENGTH</span><span class="p">,</span>
11640
- <a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="p">)</span>
11641
- <a id="__codelineno-0-383" name="__codelineno-0-383"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">:</span>
11642
- <a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
11643
- <a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; name &quot;</span><span class="si">%s</span><span class="s1">&quot; exceeds </span><span class="si">%d</span><span class="s1"> characters in length, it will be truncated in the database.&#39;</span><span class="p">,</span>
11644
- <a id="__codelineno-0-386" name="__codelineno-0-386"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
11645
- <a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="n">job_class</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
11646
- <a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">,</span>
11647
- <a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="p">)</span>
11648
- <a id="__codelineno-0-390" name="__codelineno-0-390"></a>
11649
- <a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="c1"># handle duplicate names by appending an incrementing counter to the end</span>
11650
- <a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="n">default_job_name</span> <span class="o">=</span> <span class="n">job_class</span><span class="o">.</span><span class="n">name</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">]</span>
11651
- <a id="__codelineno-0-393" name="__codelineno-0-393"></a> <span class="n">job_name</span> <span class="o">=</span> <span class="n">default_job_name</span>
11652
- <a id="__codelineno-0-394" name="__codelineno-0-394"></a> <span class="n">append_counter</span> <span class="o">=</span> <span class="mi">2</span>
11653
- <a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="n">existing_job_names</span> <span class="o">=</span> <span class="p">(</span>
11654
- <a id="__codelineno-0-396" name="__codelineno-0-396"></a> <span class="n">job_model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">name__startswith</span><span class="o">=</span><span class="n">job_name</span><span class="p">)</span>
11655
- <a id="__codelineno-0-397" name="__codelineno-0-397"></a> <span class="o">.</span><span class="n">exclude</span><span class="p">(</span>
11656
- <a id="__codelineno-0-398" name="__codelineno-0-398"></a> <span class="n">module_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
11657
- <a id="__codelineno-0-399" name="__codelineno-0-399"></a> <span class="n">job_class_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
11658
- <a id="__codelineno-0-400" name="__codelineno-0-400"></a> <span class="p">)</span>
11659
- <a id="__codelineno-0-401" name="__codelineno-0-401"></a> <span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
11660
- <a id="__codelineno-0-402" name="__codelineno-0-402"></a> <span class="p">)</span>
11661
- <a id="__codelineno-0-403" name="__codelineno-0-403"></a> <span class="k">while</span> <span class="n">job_name</span> <span class="ow">in</span> <span class="n">existing_job_names</span><span class="p">:</span>
11662
- <a id="__codelineno-0-404" name="__codelineno-0-404"></a> <span class="n">job_name_append</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; (</span><span class="si">{</span><span class="n">append_counter</span><span class="si">}</span><span class="s2">)&quot;</span>
11663
- <a id="__codelineno-0-405" name="__codelineno-0-405"></a> <span class="n">max_name_length</span> <span class="o">=</span> <span class="n">JOB_MAX_NAME_LENGTH</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_name_append</span><span class="p">)</span>
11664
- <a id="__codelineno-0-406" name="__codelineno-0-406"></a> <span class="n">job_name</span> <span class="o">=</span> <span class="n">default_job_name</span><span class="p">[:</span><span class="n">max_name_length</span><span class="p">]</span> <span class="o">+</span> <span class="n">job_name_append</span>
11665
- <a id="__codelineno-0-407" name="__codelineno-0-407"></a> <span class="n">append_counter</span> <span class="o">+=</span> <span class="mi">1</span>
11666
- <a id="__codelineno-0-408" name="__codelineno-0-408"></a> <span class="k">if</span> <span class="n">job_name</span> <span class="o">!=</span> <span class="n">default_job_name</span> <span class="ow">and</span> <span class="s2">&quot;test&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">:</span>
11667
- <a id="__codelineno-0-409" name="__codelineno-0-409"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
11668
- <a id="__codelineno-0-410" name="__codelineno-0-410"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; name &quot;</span><span class="si">%s</span><span class="s1">&quot; is not unique, changing to &quot;</span><span class="si">%s</span><span class="s1">&quot;.&#39;</span><span class="p">,</span>
11669
- <a id="__codelineno-0-411" name="__codelineno-0-411"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
11670
- <a id="__codelineno-0-412" name="__codelineno-0-412"></a> <span class="n">default_job_name</span><span class="p">,</span>
11671
- <a id="__codelineno-0-413" name="__codelineno-0-413"></a> <span class="n">job_name</span><span class="p">,</span>
11672
- <a id="__codelineno-0-414" name="__codelineno-0-414"></a> <span class="p">)</span>
11673
- <a id="__codelineno-0-415" name="__codelineno-0-415"></a>
11674
- <a id="__codelineno-0-416" name="__codelineno-0-416"></a> <span class="k">try</span><span class="p">:</span>
11675
- <a id="__codelineno-0-417" name="__codelineno-0-417"></a> <span class="k">with</span> <span class="n">transaction</span><span class="o">.</span><span class="n">atomic</span><span class="p">():</span>
11676
- <a id="__codelineno-0-418" name="__codelineno-0-418"></a> <span class="n">job_model</span><span class="p">,</span> <span class="n">created</span> <span class="o">=</span> <span class="n">job_model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
11677
- <a id="__codelineno-0-419" name="__codelineno-0-419"></a> <span class="n">module_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
11678
- <a id="__codelineno-0-420" name="__codelineno-0-420"></a> <span class="n">job_class_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
11679
- <a id="__codelineno-0-421" name="__codelineno-0-421"></a> <span class="n">defaults</span><span class="o">=</span><span class="p">{</span>
11680
- <a id="__codelineno-0-422" name="__codelineno-0-422"></a> <span class="s2">&quot;grouping&quot;</span><span class="p">:</span> <span class="n">job_class</span><span class="o">.</span><span class="n">grouping</span><span class="p">[:</span><span class="n">JOB_MAX_GROUPING_LENGTH</span><span class="p">],</span>
11681
- <a id="__codelineno-0-423" name="__codelineno-0-423"></a> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">job_name</span><span class="p">,</span>
11682
- <a id="__codelineno-0-424" name="__codelineno-0-424"></a> <span class="s2">&quot;is_job_hook_receiver&quot;</span><span class="p">:</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobHookReceiver</span><span class="p">),</span>
11683
- <a id="__codelineno-0-425" name="__codelineno-0-425"></a> <span class="s2">&quot;is_job_button_receiver&quot;</span><span class="p">:</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobButtonReceiver</span><span class="p">),</span>
11684
- <a id="__codelineno-0-426" name="__codelineno-0-426"></a> <span class="s2">&quot;read_only&quot;</span><span class="p">:</span> <span class="n">job_class</span><span class="o">.</span><span class="n">read_only</span><span class="p">,</span>
11685
- <a id="__codelineno-0-427" name="__codelineno-0-427"></a> <span class="s2">&quot;supports_dryrun&quot;</span><span class="p">:</span> <span class="n">job_class</span><span class="o">.</span><span class="n">supports_dryrun</span><span class="p">,</span>
11686
- <a id="__codelineno-0-428" name="__codelineno-0-428"></a> <span class="s2">&quot;installed&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
11687
- <a id="__codelineno-0-429" name="__codelineno-0-429"></a> <span class="s2">&quot;enabled&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
11688
- <a id="__codelineno-0-430" name="__codelineno-0-430"></a> <span class="p">},</span>
11689
- <a id="__codelineno-0-431" name="__codelineno-0-431"></a> <span class="p">)</span>
11690
- <a id="__codelineno-0-432" name="__codelineno-0-432"></a>
11691
- <a id="__codelineno-0-433" name="__codelineno-0-433"></a> <span class="k">if</span> <span class="n">job_name</span> <span class="o">!=</span> <span class="n">default_job_name</span><span class="p">:</span>
11692
- <a id="__codelineno-0-434" name="__codelineno-0-434"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">name_override</span> <span class="o">=</span> <span class="kc">True</span>
11693
- <a id="__codelineno-0-435" name="__codelineno-0-435"></a>
11694
- <a id="__codelineno-0-436" name="__codelineno-0-436"></a> <span class="k">if</span> <span class="n">created</span> <span class="ow">and</span> <span class="n">job_model</span><span class="o">.</span><span class="n">module_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;nautobot.&quot;</span><span class="p">):</span>
11695
- <a id="__codelineno-0-437" name="__codelineno-0-437"></a> <span class="c1"># System jobs should be enabled by default when first created</span>
11696
- <a id="__codelineno-0-438" name="__codelineno-0-438"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="kc">True</span>
12074
+ <span class="normal"><a href="#__codelineno-0-471">471</a></span>
12075
+ <span class="normal"><a href="#__codelineno-0-472">472</a></span>
12076
+ <span class="normal"><a href="#__codelineno-0-473">473</a></span>
12077
+ <span class="normal"><a href="#__codelineno-0-474">474</a></span>
12078
+ <span class="normal"><a href="#__codelineno-0-475">475</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-344" name="__codelineno-0-344"></a><span class="k">def</span> <span class="nf">refresh_job_model_from_job_class</span><span class="p">(</span><span class="n">job_model_class</span><span class="p">,</span> <span class="n">job_class</span><span class="p">):</span>
12079
+ <a id="__codelineno-0-345" name="__codelineno-0-345"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12080
+ <a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="sd"> Create or update a job_model record based on the metadata of the provided job_class.</span>
12081
+ <a id="__codelineno-0-347" name="__codelineno-0-347"></a>
12082
+ <a id="__codelineno-0-348" name="__codelineno-0-348"></a><span class="sd"> Note that job_model_class is a parameter (rather than doing a &quot;from nautobot.extras.models import Job&quot;) because</span>
12083
+ <a id="__codelineno-0-349" name="__codelineno-0-349"></a><span class="sd"> this function may be called from various initialization processes (such as the &quot;nautobot_database_ready&quot; signal)</span>
12084
+ <a id="__codelineno-0-350" name="__codelineno-0-350"></a><span class="sd"> and in that case we need to not import models ourselves.</span>
12085
+ <a id="__codelineno-0-351" name="__codelineno-0-351"></a><span class="sd"> &quot;&quot;&quot;</span>
12086
+ <a id="__codelineno-0-352" name="__codelineno-0-352"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.jobs</span> <span class="kn">import</span> <span class="p">(</span>
12087
+ <a id="__codelineno-0-353" name="__codelineno-0-353"></a> <span class="n">JobButtonReceiver</span><span class="p">,</span>
12088
+ <a id="__codelineno-0-354" name="__codelineno-0-354"></a> <span class="n">JobHookReceiver</span><span class="p">,</span>
12089
+ <a id="__codelineno-0-355" name="__codelineno-0-355"></a> <span class="p">)</span>
12090
+ <a id="__codelineno-0-356" name="__codelineno-0-356"></a>
12091
+ <a id="__codelineno-0-357" name="__codelineno-0-357"></a> <span class="c1"># Unrecoverable errors</span>
12092
+ <a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">:</span>
12093
+ <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
12094
+ <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="s1">&#39;Unable to store Jobs from module &quot;</span><span class="si">%s</span><span class="s1">&quot; as Job models because the module exceeds </span><span class="si">%d</span><span class="s1"> characters in length!&#39;</span><span class="p">,</span>
12095
+ <a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span>
12096
+ <a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">,</span>
12097
+ <a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="p">)</span>
12098
+ <a id="__codelineno-0-364" name="__codelineno-0-364"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
12099
+ <a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">:</span>
12100
+ <a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
12101
+ <a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="s1">&#39;Unable to represent Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; as a Job model because the class name exceeds </span><span class="si">%d</span><span class="s1"> characters in length!&#39;</span><span class="p">,</span>
12102
+ <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
12103
+ <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">,</span>
12104
+ <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="p">)</span>
12105
+ <a id="__codelineno-0-371" name="__codelineno-0-371"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
12106
+ <a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobHookReceiver</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobButtonReceiver</span><span class="p">):</span>
12107
+ <a id="__codelineno-0-373" name="__codelineno-0-373"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
12108
+ <a id="__codelineno-0-374" name="__codelineno-0-374"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; must not sub-class from both JobHookReceiver and JobButtonReceiver!&#39;</span><span class="p">,</span>
12109
+ <a id="__codelineno-0-375" name="__codelineno-0-375"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
12110
+ <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="p">)</span>
12111
+ <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
12112
+ <a id="__codelineno-0-378" name="__codelineno-0-378"></a>
12113
+ <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="c1"># Recoverable errors</span>
12114
+ <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="n">grouping</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_GROUPING_LENGTH</span><span class="p">:</span>
12115
+ <a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
12116
+ <a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; grouping &quot;</span><span class="si">%s</span><span class="s1">&quot; exceeds </span><span class="si">%d</span><span class="s1"> characters in length, it will be truncated in the database.&#39;</span><span class="p">,</span>
12117
+ <a id="__codelineno-0-383" name="__codelineno-0-383"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
12118
+ <a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="n">job_class</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span>
12119
+ <a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="n">JOB_MAX_GROUPING_LENGTH</span><span class="p">,</span>
12120
+ <a id="__codelineno-0-386" name="__codelineno-0-386"></a> <span class="p">)</span>
12121
+ <a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_class</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">:</span>
12122
+ <a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
12123
+ <a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; name &quot;</span><span class="si">%s</span><span class="s1">&quot; exceeds </span><span class="si">%d</span><span class="s1"> characters in length, it will be truncated in the database.&#39;</span><span class="p">,</span>
12124
+ <a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
12125
+ <a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="n">job_class</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
12126
+ <a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">,</span>
12127
+ <a id="__codelineno-0-393" name="__codelineno-0-393"></a> <span class="p">)</span>
12128
+ <a id="__codelineno-0-394" name="__codelineno-0-394"></a>
12129
+ <a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="c1"># handle duplicate names by appending an incrementing counter to the end</span>
12130
+ <a id="__codelineno-0-396" name="__codelineno-0-396"></a> <span class="n">default_job_name</span> <span class="o">=</span> <span class="n">job_class</span><span class="o">.</span><span class="n">name</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">]</span>
12131
+ <a id="__codelineno-0-397" name="__codelineno-0-397"></a> <span class="n">job_name</span> <span class="o">=</span> <span class="n">default_job_name</span>
12132
+ <a id="__codelineno-0-398" name="__codelineno-0-398"></a> <span class="n">append_counter</span> <span class="o">=</span> <span class="mi">2</span>
12133
+ <a id="__codelineno-0-399" name="__codelineno-0-399"></a> <span class="n">existing_job_names</span> <span class="o">=</span> <span class="p">(</span>
12134
+ <a id="__codelineno-0-400" name="__codelineno-0-400"></a> <span class="n">job_model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">name__startswith</span><span class="o">=</span><span class="n">job_name</span><span class="p">)</span>
12135
+ <a id="__codelineno-0-401" name="__codelineno-0-401"></a> <span class="o">.</span><span class="n">exclude</span><span class="p">(</span>
12136
+ <a id="__codelineno-0-402" name="__codelineno-0-402"></a> <span class="n">module_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
12137
+ <a id="__codelineno-0-403" name="__codelineno-0-403"></a> <span class="n">job_class_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
12138
+ <a id="__codelineno-0-404" name="__codelineno-0-404"></a> <span class="p">)</span>
12139
+ <a id="__codelineno-0-405" name="__codelineno-0-405"></a> <span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
12140
+ <a id="__codelineno-0-406" name="__codelineno-0-406"></a> <span class="p">)</span>
12141
+ <a id="__codelineno-0-407" name="__codelineno-0-407"></a> <span class="k">while</span> <span class="n">job_name</span> <span class="ow">in</span> <span class="n">existing_job_names</span><span class="p">:</span>
12142
+ <a id="__codelineno-0-408" name="__codelineno-0-408"></a> <span class="n">job_name_append</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; (</span><span class="si">{</span><span class="n">append_counter</span><span class="si">}</span><span class="s2">)&quot;</span>
12143
+ <a id="__codelineno-0-409" name="__codelineno-0-409"></a> <span class="n">max_name_length</span> <span class="o">=</span> <span class="n">JOB_MAX_NAME_LENGTH</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">job_name_append</span><span class="p">)</span>
12144
+ <a id="__codelineno-0-410" name="__codelineno-0-410"></a> <span class="n">job_name</span> <span class="o">=</span> <span class="n">default_job_name</span><span class="p">[:</span><span class="n">max_name_length</span><span class="p">]</span> <span class="o">+</span> <span class="n">job_name_append</span>
12145
+ <a id="__codelineno-0-411" name="__codelineno-0-411"></a> <span class="n">append_counter</span> <span class="o">+=</span> <span class="mi">1</span>
12146
+ <a id="__codelineno-0-412" name="__codelineno-0-412"></a> <span class="k">if</span> <span class="n">job_name</span> <span class="o">!=</span> <span class="n">default_job_name</span> <span class="ow">and</span> <span class="s2">&quot;test&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">:</span>
12147
+ <a id="__codelineno-0-413" name="__codelineno-0-413"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
12148
+ <a id="__codelineno-0-414" name="__codelineno-0-414"></a> <span class="s1">&#39;Job class &quot;</span><span class="si">%s</span><span class="s1">&quot; name &quot;</span><span class="si">%s</span><span class="s1">&quot; is not unique, changing to &quot;</span><span class="si">%s</span><span class="s1">&quot;.&#39;</span><span class="p">,</span>
12149
+ <a id="__codelineno-0-415" name="__codelineno-0-415"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
12150
+ <a id="__codelineno-0-416" name="__codelineno-0-416"></a> <span class="n">default_job_name</span><span class="p">,</span>
12151
+ <a id="__codelineno-0-417" name="__codelineno-0-417"></a> <span class="n">job_name</span><span class="p">,</span>
12152
+ <a id="__codelineno-0-418" name="__codelineno-0-418"></a> <span class="p">)</span>
12153
+ <a id="__codelineno-0-419" name="__codelineno-0-419"></a>
12154
+ <a id="__codelineno-0-420" name="__codelineno-0-420"></a> <span class="k">try</span><span class="p">:</span>
12155
+ <a id="__codelineno-0-421" name="__codelineno-0-421"></a> <span class="k">with</span> <span class="n">transaction</span><span class="o">.</span><span class="n">atomic</span><span class="p">():</span>
12156
+ <a id="__codelineno-0-422" name="__codelineno-0-422"></a> <span class="n">job_model</span><span class="p">,</span> <span class="n">created</span> <span class="o">=</span> <span class="n">job_model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
12157
+ <a id="__codelineno-0-423" name="__codelineno-0-423"></a> <span class="n">module_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__module__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
12158
+ <a id="__codelineno-0-424" name="__codelineno-0-424"></a> <span class="n">job_class_name</span><span class="o">=</span><span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">[:</span><span class="n">JOB_MAX_NAME_LENGTH</span><span class="p">],</span>
12159
+ <a id="__codelineno-0-425" name="__codelineno-0-425"></a> <span class="n">defaults</span><span class="o">=</span><span class="p">{</span>
12160
+ <a id="__codelineno-0-426" name="__codelineno-0-426"></a> <span class="s2">&quot;grouping&quot;</span><span class="p">:</span> <span class="n">job_class</span><span class="o">.</span><span class="n">grouping</span><span class="p">[:</span><span class="n">JOB_MAX_GROUPING_LENGTH</span><span class="p">],</span>
12161
+ <a id="__codelineno-0-427" name="__codelineno-0-427"></a> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">job_name</span><span class="p">,</span>
12162
+ <a id="__codelineno-0-428" name="__codelineno-0-428"></a> <span class="s2">&quot;is_job_hook_receiver&quot;</span><span class="p">:</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobHookReceiver</span><span class="p">),</span>
12163
+ <a id="__codelineno-0-429" name="__codelineno-0-429"></a> <span class="s2">&quot;is_job_button_receiver&quot;</span><span class="p">:</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobButtonReceiver</span><span class="p">),</span>
12164
+ <a id="__codelineno-0-430" name="__codelineno-0-430"></a> <span class="s2">&quot;read_only&quot;</span><span class="p">:</span> <span class="n">job_class</span><span class="o">.</span><span class="n">read_only</span><span class="p">,</span>
12165
+ <a id="__codelineno-0-431" name="__codelineno-0-431"></a> <span class="s2">&quot;supports_dryrun&quot;</span><span class="p">:</span> <span class="n">job_class</span><span class="o">.</span><span class="n">supports_dryrun</span><span class="p">,</span>
12166
+ <a id="__codelineno-0-432" name="__codelineno-0-432"></a> <span class="s2">&quot;installed&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
12167
+ <a id="__codelineno-0-433" name="__codelineno-0-433"></a> <span class="s2">&quot;enabled&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
12168
+ <a id="__codelineno-0-434" name="__codelineno-0-434"></a> <span class="p">},</span>
12169
+ <a id="__codelineno-0-435" name="__codelineno-0-435"></a> <span class="p">)</span>
12170
+ <a id="__codelineno-0-436" name="__codelineno-0-436"></a>
12171
+ <a id="__codelineno-0-437" name="__codelineno-0-437"></a> <span class="k">if</span> <span class="n">job_name</span> <span class="o">!=</span> <span class="n">default_job_name</span><span class="p">:</span>
12172
+ <a id="__codelineno-0-438" name="__codelineno-0-438"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">name_override</span> <span class="o">=</span> <span class="kc">True</span>
11697
12173
  <a id="__codelineno-0-439" name="__codelineno-0-439"></a>
11698
- <a id="__codelineno-0-440" name="__codelineno-0-440"></a> <span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">JOB_OVERRIDABLE_FIELDS</span><span class="p">:</span>
11699
- <a id="__codelineno-0-441" name="__codelineno-0-441"></a> <span class="c1"># Was this field directly inherited from the job before, or was it overridden in the database?</span>
11700
- <a id="__codelineno-0-442" name="__codelineno-0-442"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">job_model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2">_override&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
11701
- <a id="__codelineno-0-443" name="__codelineno-0-443"></a> <span class="c1"># It was inherited and not overridden</span>
11702
- <a id="__codelineno-0-444" name="__codelineno-0-444"></a> <span class="nb">setattr</span><span class="p">(</span><span class="n">job_model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">field_name</span><span class="p">))</span>
11703
- <a id="__codelineno-0-445" name="__codelineno-0-445"></a>
11704
- <a id="__codelineno-0-446" name="__codelineno-0-446"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">created</span><span class="p">:</span>
11705
- <a id="__codelineno-0-447" name="__codelineno-0-447"></a> <span class="c1"># Mark it as installed regardless</span>
11706
- <a id="__codelineno-0-448" name="__codelineno-0-448"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">installed</span> <span class="o">=</span> <span class="kc">True</span>
11707
- <a id="__codelineno-0-449" name="__codelineno-0-449"></a> <span class="c1"># Update the non-overridable flags in case they&#39;ve changed in the source</span>
11708
- <a id="__codelineno-0-450" name="__codelineno-0-450"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">is_job_hook_receiver</span> <span class="o">=</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobHookReceiver</span><span class="p">)</span>
11709
- <a id="__codelineno-0-451" name="__codelineno-0-451"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">is_job_button_receiver</span> <span class="o">=</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobButtonReceiver</span><span class="p">)</span>
11710
- <a id="__codelineno-0-452" name="__codelineno-0-452"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">read_only</span> <span class="o">=</span> <span class="n">job_class</span><span class="o">.</span><span class="n">read_only</span>
11711
- <a id="__codelineno-0-453" name="__codelineno-0-453"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">supports_dryrun</span> <span class="o">=</span> <span class="n">job_class</span><span class="o">.</span><span class="n">supports_dryrun</span>
11712
- <a id="__codelineno-0-454" name="__codelineno-0-454"></a>
11713
- <a id="__codelineno-0-455" name="__codelineno-0-455"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
11714
- <a id="__codelineno-0-456" name="__codelineno-0-456"></a>
11715
- <a id="__codelineno-0-457" name="__codelineno-0-457"></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
11716
- <a id="__codelineno-0-458" name="__codelineno-0-458"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
11717
- <a id="__codelineno-0-459" name="__codelineno-0-459"></a> <span class="s1">&#39;Exception while trying to create/update a database record for Job class &quot;</span><span class="si">%s</span><span class="s1">&quot;: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">exc</span>
11718
- <a id="__codelineno-0-460" name="__codelineno-0-460"></a> <span class="p">)</span>
11719
- <a id="__codelineno-0-461" name="__codelineno-0-461"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
11720
- <a id="__codelineno-0-462" name="__codelineno-0-462"></a>
11721
- <a id="__codelineno-0-463" name="__codelineno-0-463"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
11722
- <a id="__codelineno-0-464" name="__codelineno-0-464"></a> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> Job &quot;</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&quot; from &lt;</span><span class="si">%s</span><span class="s1">&gt;&#39;</span><span class="p">,</span>
11723
- <a id="__codelineno-0-465" name="__codelineno-0-465"></a> <span class="s2">&quot;Created&quot;</span> <span class="k">if</span> <span class="n">created</span> <span class="k">else</span> <span class="s2">&quot;Refreshed&quot;</span><span class="p">,</span>
11724
- <a id="__codelineno-0-466" name="__codelineno-0-466"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span>
11725
- <a id="__codelineno-0-467" name="__codelineno-0-467"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
11726
- <a id="__codelineno-0-468" name="__codelineno-0-468"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
11727
- <a id="__codelineno-0-469" name="__codelineno-0-469"></a> <span class="p">)</span>
11728
- <a id="__codelineno-0-470" name="__codelineno-0-470"></a>
11729
- <a id="__codelineno-0-471" name="__codelineno-0-471"></a> <span class="k">return</span> <span class="p">(</span><span class="n">job_model</span><span class="p">,</span> <span class="n">created</span><span class="p">)</span>
12174
+ <a id="__codelineno-0-440" name="__codelineno-0-440"></a> <span class="k">if</span> <span class="n">created</span> <span class="ow">and</span> <span class="n">job_model</span><span class="o">.</span><span class="n">module_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;nautobot.&quot;</span><span class="p">):</span>
12175
+ <a id="__codelineno-0-441" name="__codelineno-0-441"></a> <span class="c1"># System jobs should be enabled by default when first created</span>
12176
+ <a id="__codelineno-0-442" name="__codelineno-0-442"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="kc">True</span>
12177
+ <a id="__codelineno-0-443" name="__codelineno-0-443"></a>
12178
+ <a id="__codelineno-0-444" name="__codelineno-0-444"></a> <span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">JOB_OVERRIDABLE_FIELDS</span><span class="p">:</span>
12179
+ <a id="__codelineno-0-445" name="__codelineno-0-445"></a> <span class="c1"># Was this field directly inherited from the job before, or was it overridden in the database?</span>
12180
+ <a id="__codelineno-0-446" name="__codelineno-0-446"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">job_model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">}</span><span class="s2">_override&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
12181
+ <a id="__codelineno-0-447" name="__codelineno-0-447"></a> <span class="c1"># It was inherited and not overridden</span>
12182
+ <a id="__codelineno-0-448" name="__codelineno-0-448"></a> <span class="nb">setattr</span><span class="p">(</span><span class="n">job_model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">field_name</span><span class="p">))</span>
12183
+ <a id="__codelineno-0-449" name="__codelineno-0-449"></a>
12184
+ <a id="__codelineno-0-450" name="__codelineno-0-450"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">created</span><span class="p">:</span>
12185
+ <a id="__codelineno-0-451" name="__codelineno-0-451"></a> <span class="c1"># Mark it as installed regardless</span>
12186
+ <a id="__codelineno-0-452" name="__codelineno-0-452"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">installed</span> <span class="o">=</span> <span class="kc">True</span>
12187
+ <a id="__codelineno-0-453" name="__codelineno-0-453"></a> <span class="c1"># Update the non-overridable flags in case they&#39;ve changed in the source</span>
12188
+ <a id="__codelineno-0-454" name="__codelineno-0-454"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">is_job_hook_receiver</span> <span class="o">=</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobHookReceiver</span><span class="p">)</span>
12189
+ <a id="__codelineno-0-455" name="__codelineno-0-455"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">is_job_button_receiver</span> <span class="o">=</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">job_class</span><span class="p">,</span> <span class="n">JobButtonReceiver</span><span class="p">)</span>
12190
+ <a id="__codelineno-0-456" name="__codelineno-0-456"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">read_only</span> <span class="o">=</span> <span class="n">job_class</span><span class="o">.</span><span class="n">read_only</span>
12191
+ <a id="__codelineno-0-457" name="__codelineno-0-457"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">supports_dryrun</span> <span class="o">=</span> <span class="n">job_class</span><span class="o">.</span><span class="n">supports_dryrun</span>
12192
+ <a id="__codelineno-0-458" name="__codelineno-0-458"></a>
12193
+ <a id="__codelineno-0-459" name="__codelineno-0-459"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
12194
+ <a id="__codelineno-0-460" name="__codelineno-0-460"></a>
12195
+ <a id="__codelineno-0-461" name="__codelineno-0-461"></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
12196
+ <a id="__codelineno-0-462" name="__codelineno-0-462"></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
12197
+ <a id="__codelineno-0-463" name="__codelineno-0-463"></a> <span class="s1">&#39;Exception while trying to create/update a database record for Job class &quot;</span><span class="si">%s</span><span class="s1">&quot;: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">exc</span>
12198
+ <a id="__codelineno-0-464" name="__codelineno-0-464"></a> <span class="p">)</span>
12199
+ <a id="__codelineno-0-465" name="__codelineno-0-465"></a> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
12200
+ <a id="__codelineno-0-466" name="__codelineno-0-466"></a>
12201
+ <a id="__codelineno-0-467" name="__codelineno-0-467"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
12202
+ <a id="__codelineno-0-468" name="__codelineno-0-468"></a> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> Job &quot;</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&quot; from &lt;</span><span class="si">%s</span><span class="s1">&gt;&#39;</span><span class="p">,</span>
12203
+ <a id="__codelineno-0-469" name="__codelineno-0-469"></a> <span class="s2">&quot;Created&quot;</span> <span class="k">if</span> <span class="n">created</span> <span class="k">else</span> <span class="s2">&quot;Refreshed&quot;</span><span class="p">,</span>
12204
+ <a id="__codelineno-0-470" name="__codelineno-0-470"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">grouping</span><span class="p">,</span>
12205
+ <a id="__codelineno-0-471" name="__codelineno-0-471"></a> <span class="n">job_model</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
12206
+ <a id="__codelineno-0-472" name="__codelineno-0-472"></a> <span class="n">job_class</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
12207
+ <a id="__codelineno-0-473" name="__codelineno-0-473"></a> <span class="p">)</span>
12208
+ <a id="__codelineno-0-474" name="__codelineno-0-474"></a>
12209
+ <a id="__codelineno-0-475" name="__codelineno-0-475"></a> <span class="k">return</span> <span class="p">(</span><span class="n">job_model</span><span class="p">,</span> <span class="n">created</span><span class="p">)</span>
11730
12210
  </code></pre></div></td></tr></table></div>
11731
12211
  </details>
11732
12212
  </div>
@@ -11751,19 +12231,19 @@ and in that case we need to not import models ourselves.</p>
11751
12231
 
11752
12232
  <details class="quote">
11753
12233
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
11754
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-474">474</a></span>
11755
- <span class="normal"><a href="#__codelineno-0-475">475</a></span>
11756
- <span class="normal"><a href="#__codelineno-0-476">476</a></span>
11757
- <span class="normal"><a href="#__codelineno-0-477">477</a></span>
11758
- <span class="normal"><a href="#__codelineno-0-478">478</a></span>
12234
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-478">478</a></span>
11759
12235
  <span class="normal"><a href="#__codelineno-0-479">479</a></span>
11760
- <span class="normal"><a href="#__codelineno-0-480">480</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-474" name="__codelineno-0-474"></a><span class="k">def</span> <span class="nf">remove_prefix_from_cf_key</span><span class="p">(</span><span class="n">field_name</span><span class="p">):</span>
11761
- <a id="__codelineno-0-475" name="__codelineno-0-475"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11762
- <a id="__codelineno-0-476" name="__codelineno-0-476"></a><span class="sd"> field_name (str): f&quot;cf_{cf.key}&quot;</span>
11763
- <a id="__codelineno-0-477" name="__codelineno-0-477"></a>
11764
- <a id="__codelineno-0-478" name="__codelineno-0-478"></a><span class="sd"> Helper method to remove the &quot;cf_&quot; prefix</span>
11765
- <a id="__codelineno-0-479" name="__codelineno-0-479"></a><span class="sd"> &quot;&quot;&quot;</span>
11766
- <a id="__codelineno-0-480" name="__codelineno-0-480"></a> <span class="k">return</span> <span class="n">field_name</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span>
12236
+ <span class="normal"><a href="#__codelineno-0-480">480</a></span>
12237
+ <span class="normal"><a href="#__codelineno-0-481">481</a></span>
12238
+ <span class="normal"><a href="#__codelineno-0-482">482</a></span>
12239
+ <span class="normal"><a href="#__codelineno-0-483">483</a></span>
12240
+ <span class="normal"><a href="#__codelineno-0-484">484</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-478" name="__codelineno-0-478"></a><span class="k">def</span> <span class="nf">remove_prefix_from_cf_key</span><span class="p">(</span><span class="n">field_name</span><span class="p">):</span>
12241
+ <a id="__codelineno-0-479" name="__codelineno-0-479"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12242
+ <a id="__codelineno-0-480" name="__codelineno-0-480"></a><span class="sd"> field_name (str): f&quot;cf_{cf.key}&quot;</span>
12243
+ <a id="__codelineno-0-481" name="__codelineno-0-481"></a>
12244
+ <a id="__codelineno-0-482" name="__codelineno-0-482"></a><span class="sd"> Helper method to remove the &quot;cf_&quot; prefix</span>
12245
+ <a id="__codelineno-0-483" name="__codelineno-0-483"></a><span class="sd"> &quot;&quot;&quot;</span>
12246
+ <a id="__codelineno-0-484" name="__codelineno-0-484"></a> <span class="k">return</span> <span class="n">field_name</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span>
11767
12247
  </code></pre></div></td></tr></table></div>
11768
12248
  </details>
11769
12249
  </div>
@@ -12151,11 +12631,7 @@ worker count to the description.</p>
12151
12631
 
12152
12632
  <details class="quote">
12153
12633
  <summary>Source code in <code>nautobot/extras/utils.py</code></summary>
12154
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-320">320</a></span>
12155
- <span class="normal"><a href="#__codelineno-0-321">321</a></span>
12156
- <span class="normal"><a href="#__codelineno-0-322">322</a></span>
12157
- <span class="normal"><a href="#__codelineno-0-323">323</a></span>
12158
- <span class="normal"><a href="#__codelineno-0-324">324</a></span>
12634
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-324">324</a></span>
12159
12635
  <span class="normal"><a href="#__codelineno-0-325">325</a></span>
12160
12636
  <span class="normal"><a href="#__codelineno-0-326">326</a></span>
12161
12637
  <span class="normal"><a href="#__codelineno-0-327">327</a></span>
@@ -12168,24 +12644,28 @@ worker count to the description.</p>
12168
12644
  <span class="normal"><a href="#__codelineno-0-334">334</a></span>
12169
12645
  <span class="normal"><a href="#__codelineno-0-335">335</a></span>
12170
12646
  <span class="normal"><a href="#__codelineno-0-336">336</a></span>
12171
- <span class="normal"><a href="#__codelineno-0-337">337</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-320" name="__codelineno-0-320"></a><span class="k">def</span> <span class="nf">task_queues_as_choices</span><span class="p">(</span><span class="n">task_queues</span><span class="p">):</span>
12172
- <a id="__codelineno-0-321" name="__codelineno-0-321"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12173
- <a id="__codelineno-0-322" name="__codelineno-0-322"></a><span class="sd"> Returns a list of 2-tuples for use in the form field `choices` argument. Appends</span>
12174
- <a id="__codelineno-0-323" name="__codelineno-0-323"></a><span class="sd"> worker count to the description.</span>
12175
- <a id="__codelineno-0-324" name="__codelineno-0-324"></a><span class="sd"> &quot;&quot;&quot;</span>
12176
- <a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">task_queues</span><span class="p">:</span>
12177
- <a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">task_queues</span> <span class="o">=</span> <span class="p">[</span><span class="n">settings</span><span class="o">.</span><span class="n">CELERY_TASK_DEFAULT_QUEUE</span><span class="p">]</span>
12178
- <a id="__codelineno-0-327" name="__codelineno-0-327"></a>
12179
- <a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="n">choices</span> <span class="o">=</span> <span class="p">[]</span>
12180
- <a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="n">celery_queues</span> <span class="o">=</span> <span class="n">get_celery_queues</span><span class="p">()</span>
12181
- <a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">for</span> <span class="n">queue</span> <span class="ow">in</span> <span class="n">task_queues</span><span class="p">:</span>
12182
- <a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">queue</span><span class="p">:</span>
12183
- <a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">worker_count</span> <span class="o">=</span> <span class="n">celery_queues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">CELERY_TASK_DEFAULT_QUEUE</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
12184
- <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="k">else</span><span class="p">:</span>
12185
- <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="n">worker_count</span> <span class="o">=</span> <span class="n">celery_queues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
12186
- <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="n">description</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">queue</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">queue</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s1">&#39;default queue&#39;</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">worker_count</span><span class="si">}</span><span class="s2"> worker</span><span class="si">{</span><span class="s1">&#39;s&#39;</span><span class="p">[:</span><span class="n">worker_count</span><span class="o">^</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">)&quot;</span>
12187
- <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">choices</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">queue</span><span class="p">,</span> <span class="n">description</span><span class="p">))</span>
12188
- <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="k">return</span> <span class="n">choices</span>
12647
+ <span class="normal"><a href="#__codelineno-0-337">337</a></span>
12648
+ <span class="normal"><a href="#__codelineno-0-338">338</a></span>
12649
+ <span class="normal"><a href="#__codelineno-0-339">339</a></span>
12650
+ <span class="normal"><a href="#__codelineno-0-340">340</a></span>
12651
+ <span class="normal"><a href="#__codelineno-0-341">341</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-324" name="__codelineno-0-324"></a><span class="k">def</span> <span class="nf">task_queues_as_choices</span><span class="p">(</span><span class="n">task_queues</span><span class="p">):</span>
12652
+ <a id="__codelineno-0-325" name="__codelineno-0-325"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12653
+ <a id="__codelineno-0-326" name="__codelineno-0-326"></a><span class="sd"> Returns a list of 2-tuples for use in the form field `choices` argument. Appends</span>
12654
+ <a id="__codelineno-0-327" name="__codelineno-0-327"></a><span class="sd"> worker count to the description.</span>
12655
+ <a id="__codelineno-0-328" name="__codelineno-0-328"></a><span class="sd"> &quot;&quot;&quot;</span>
12656
+ <a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">task_queues</span><span class="p">:</span>
12657
+ <a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="n">task_queues</span> <span class="o">=</span> <span class="p">[</span><span class="n">settings</span><span class="o">.</span><span class="n">CELERY_TASK_DEFAULT_QUEUE</span><span class="p">]</span>
12658
+ <a id="__codelineno-0-331" name="__codelineno-0-331"></a>
12659
+ <a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">choices</span> <span class="o">=</span> <span class="p">[]</span>
12660
+ <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">celery_queues</span> <span class="o">=</span> <span class="n">get_celery_queues</span><span class="p">()</span>
12661
+ <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="k">for</span> <span class="n">queue</span> <span class="ow">in</span> <span class="n">task_queues</span><span class="p">:</span>
12662
+ <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">queue</span><span class="p">:</span>
12663
+ <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">worker_count</span> <span class="o">=</span> <span class="n">celery_queues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">CELERY_TASK_DEFAULT_QUEUE</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
12664
+ <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="k">else</span><span class="p">:</span>
12665
+ <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="n">worker_count</span> <span class="o">=</span> <span class="n">celery_queues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
12666
+ <a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="n">description</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">queue</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">queue</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s1">&#39;default queue&#39;</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">worker_count</span><span class="si">}</span><span class="s2"> worker</span><span class="si">{</span><span class="s1">&#39;s&#39;</span><span class="p">[:</span><span class="n">worker_count</span><span class="o">^</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">)&quot;</span>
12667
+ <a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="n">choices</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">queue</span><span class="p">,</span> <span class="n">description</span><span class="p">))</span>
12668
+ <a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="k">return</span> <span class="n">choices</span>
12189
12669
  </code></pre></div></td></tr></table></div>
12190
12670
  </details>
12191
12671
  </div>