nautobot 2.0.5__py3-none-any.whl → 2.1.0b1__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 (376) hide show
  1. nautobot/circuits/navigation.py +0 -25
  2. nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -9
  3. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +0 -2
  4. nautobot/circuits/tests/test_filters.py +1 -0
  5. nautobot/core/api/serializers.py +15 -5
  6. nautobot/core/api/views.py +18 -19
  7. nautobot/core/choices.py +1 -1
  8. nautobot/core/filters.py +12 -4
  9. nautobot/core/jobs/__init__.py +125 -3
  10. nautobot/core/management/commands/generate_test_data.py +4 -1
  11. nautobot/core/models/fields.py +12 -2
  12. nautobot/core/settings.py +8 -7
  13. nautobot/core/templates/base_django.html +2 -2
  14. nautobot/core/templates/buttons/export.html +57 -30
  15. nautobot/core/templates/generic/object_list.html +2 -2
  16. nautobot/core/templates/generic/object_retrieve.html +8 -1
  17. nautobot/core/templates/home.html +5 -5
  18. nautobot/core/templates/inc/created_updated.html +2 -2
  19. nautobot/core/templates/inc/footer.html +2 -2
  20. nautobot/core/templates/inc/javascript.html +0 -10
  21. nautobot/core/templates/inc/media.html +2 -0
  22. nautobot/core/templates/inc/nav_menu.html +66 -68
  23. nautobot/core/templates/inc/object_details_advanced_panel.html +19 -0
  24. nautobot/core/templates/nautobot_config.py.j2 +10 -4
  25. nautobot/core/templates/panel_table.html +1 -1
  26. nautobot/core/templates/template.css +89 -0
  27. nautobot/core/templates/utilities/templatetags/table_config_form.html +1 -0
  28. nautobot/core/templatetags/buttons.py +7 -2
  29. nautobot/core/testing/views.py +34 -4
  30. nautobot/core/tests/integration/test_home.py +1 -43
  31. nautobot/core/tests/integration/test_navbar.py +10 -64
  32. nautobot/core/tests/integration/test_plugin_home.py +4 -5
  33. nautobot/core/tests/integration/test_plugin_navbar.py +20 -16
  34. nautobot/core/tests/integration/test_theme.py +4 -0
  35. nautobot/core/tests/test_api.py +14 -66
  36. nautobot/core/tests/test_filters.py +127 -0
  37. nautobot/core/tests/test_forms.py +1 -1
  38. nautobot/core/tests/test_graphql.py +165 -2
  39. nautobot/core/tests/test_jobs.py +112 -0
  40. nautobot/core/tests/test_openapi.py +6 -0
  41. nautobot/core/tests/test_views.py +11 -85
  42. nautobot/core/urls.py +6 -1
  43. nautobot/core/utils/lookup.py +28 -0
  44. nautobot/core/utils/requests.py +2 -3
  45. nautobot/core/views/__init__.py +3 -4
  46. nautobot/core/views/generic.py +9 -4
  47. nautobot/core/views/mixins.py +4 -2
  48. nautobot/core/views/renderers.py +5 -0
  49. nautobot/dcim/models/device_components.py +1 -0
  50. nautobot/dcim/navigation.py +10 -165
  51. nautobot/dcim/templates/dcim/location.html +1 -1
  52. nautobot/dcim/tests/features/locations.feature +143 -0
  53. nautobot/dcim/tests/test_api.py +1 -1
  54. nautobot/dcim/tests/test_filters.py +11 -3
  55. nautobot/extras/admin.py +1 -1
  56. nautobot/extras/api/serializers.py +33 -0
  57. nautobot/extras/api/urls.py +6 -0
  58. nautobot/extras/api/views.py +45 -6
  59. nautobot/extras/factory.py +28 -2
  60. nautobot/extras/filters/__init__.py +52 -0
  61. nautobot/extras/filters/mixins.py +4 -29
  62. nautobot/extras/forms/forms.py +43 -0
  63. nautobot/extras/jobs.py +31 -9
  64. nautobot/extras/migrations/0100_fileproxy_job_result.py +32 -0
  65. nautobot/extras/migrations/0101_externalintegration.py +61 -0
  66. nautobot/extras/migrations/0102_set_null_objectchange_contenttype.py +32 -0
  67. nautobot/extras/models/__init__.py +2 -0
  68. nautobot/extras/models/change_logging.py +2 -2
  69. nautobot/extras/models/models.py +96 -16
  70. nautobot/extras/navigation.py +17 -29
  71. nautobot/extras/signals.py +15 -0
  72. nautobot/extras/tables.py +27 -0
  73. nautobot/extras/templates/extras/externalintegration_retrieve.html +37 -0
  74. nautobot/extras/templates/extras/inc/jobresult.html +24 -0
  75. nautobot/extras/templates/extras/jobresult.html +24 -0
  76. nautobot/extras/test_jobs/file_output.py +16 -0
  77. nautobot/extras/tests/test_api.py +92 -0
  78. nautobot/extras/tests/test_filters.py +64 -2
  79. nautobot/extras/tests/test_jobs.py +39 -0
  80. nautobot/extras/tests/test_models.py +34 -0
  81. nautobot/extras/tests/test_views.py +22 -2
  82. nautobot/extras/urls.py +1 -0
  83. nautobot/extras/views.py +15 -0
  84. nautobot/ipam/forms.py +16 -0
  85. nautobot/ipam/models.py +3 -0
  86. nautobot/ipam/navigation.py +2 -59
  87. nautobot/ipam/templates/ipam/ipaddress.html +0 -9
  88. nautobot/ipam/templates/ipam/prefix.html +0 -9
  89. nautobot/ipam/tests/features/prefixes.feature +134 -0
  90. nautobot/ipam/tests/test_filters.py +5 -10
  91. nautobot/ipam/tests/test_views.py +8 -1
  92. nautobot/ipam/views.py +3 -0
  93. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +191 -191
  94. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  95. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +1 -1
  96. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  97. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +874 -881
  98. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  99. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  100. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  101. nautobot/project-static/css/base.css +135 -99
  102. nautobot/project-static/css/dark.css +65 -6
  103. nautobot/project-static/docs/404.html +44 -16
  104. nautobot/project-static/docs/apps/index.html +44 -16
  105. nautobot/project-static/docs/apps/nautobot-apps.html +44 -16
  106. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +44 -16
  107. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +44 -16
  108. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1597 -1457
  109. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +44 -16
  110. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +45 -17
  111. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +44 -16
  112. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +44 -16
  113. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +44 -16
  114. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +44 -16
  115. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +353 -432
  116. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +66 -38
  117. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +44 -16
  118. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2154 -2307
  119. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +807 -691
  120. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +44 -16
  121. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +44 -16
  122. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +58 -30
  123. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3600 -3456
  124. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +44 -16
  125. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +44 -16
  126. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +101 -75
  127. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3083 -3019
  128. nautobot/project-static/docs/development/apps/api/configuration-view.html +44 -16
  129. nautobot/project-static/docs/development/apps/api/database-backend-config.html +44 -16
  130. nautobot/project-static/docs/development/apps/api/models/django-admin.html +44 -16
  131. nautobot/project-static/docs/development/apps/api/models/global-search.html +44 -16
  132. nautobot/project-static/docs/development/apps/api/models/graphql.html +44 -16
  133. nautobot/project-static/docs/development/apps/api/models/index.html +44 -16
  134. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +44 -16
  135. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +44 -16
  136. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +44 -16
  137. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +44 -16
  138. nautobot/project-static/docs/development/apps/api/platform-features/index.html +44 -16
  139. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +44 -16
  140. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +44 -16
  141. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +44 -16
  142. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +44 -16
  143. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +44 -16
  144. nautobot/project-static/docs/development/apps/api/prometheus.html +44 -16
  145. nautobot/project-static/docs/development/apps/api/setup.html +44 -16
  146. nautobot/project-static/docs/development/apps/api/testing.html +44 -16
  147. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +44 -16
  148. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +44 -16
  149. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +44 -16
  150. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +44 -16
  151. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +44 -16
  152. nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +44 -16
  153. nautobot/project-static/docs/development/apps/api/views/base-template.html +44 -16
  154. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +44 -16
  155. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +44 -16
  156. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +44 -16
  157. nautobot/project-static/docs/development/apps/api/views/index.html +44 -16
  158. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +44 -16
  159. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +44 -16
  160. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +44 -16
  161. nautobot/project-static/docs/development/apps/api/views/notes.html +44 -16
  162. nautobot/project-static/docs/development/apps/api/views/rest-api.html +44 -16
  163. nautobot/project-static/docs/development/apps/api/views/urls.html +44 -16
  164. nautobot/project-static/docs/development/apps/api/views/view-overrides.html +44 -16
  165. nautobot/project-static/docs/development/apps/index.html +44 -16
  166. nautobot/project-static/docs/development/apps/migration/code-updates.html +44 -16
  167. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +44 -16
  168. nautobot/project-static/docs/development/apps/migration/from-v1.html +44 -16
  169. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +44 -16
  170. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +44 -16
  171. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +44 -16
  172. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +44 -16
  173. nautobot/project-static/docs/development/apps/porting-from-netbox.html +44 -16
  174. nautobot/project-static/docs/development/core/application-registry.html +44 -16
  175. nautobot/project-static/docs/development/core/best-practices.html +44 -16
  176. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +44 -16
  177. nautobot/project-static/docs/development/core/extending-models.html +44 -16
  178. nautobot/project-static/docs/development/core/generic-views.html +44 -16
  179. nautobot/project-static/docs/development/core/getting-started.html +44 -16
  180. nautobot/project-static/docs/development/core/homepage.html +44 -16
  181. nautobot/project-static/docs/development/core/index.html +44 -16
  182. nautobot/project-static/docs/development/core/model-features.html +44 -16
  183. nautobot/project-static/docs/development/core/natural-keys.html +44 -16
  184. nautobot/project-static/docs/development/core/navigation-menu.html +44 -21
  185. nautobot/project-static/docs/development/core/react-ui.html +44 -16
  186. nautobot/project-static/docs/development/core/release-checklist.html +44 -16
  187. nautobot/project-static/docs/development/core/role-internals.html +44 -16
  188. nautobot/project-static/docs/development/core/style-guide.html +44 -16
  189. nautobot/project-static/docs/development/core/templates.html +44 -16
  190. nautobot/project-static/docs/development/core/testing.html +44 -16
  191. nautobot/project-static/docs/development/core/user-preferences.html +44 -16
  192. nautobot/project-static/docs/development/index.html +44 -16
  193. nautobot/project-static/docs/development/jobs/index.html +280 -234
  194. nautobot/project-static/docs/development/jobs/migration/from-v1.html +44 -16
  195. nautobot/project-static/docs/index.html +44 -16
  196. nautobot/project-static/docs/objects.inv +0 -0
  197. nautobot/project-static/docs/release-notes/index.html +47 -19
  198. nautobot/project-static/docs/release-notes/version-1.0.html +44 -16
  199. nautobot/project-static/docs/release-notes/version-1.1.html +44 -16
  200. nautobot/project-static/docs/release-notes/version-1.2.html +44 -16
  201. nautobot/project-static/docs/release-notes/version-1.3.html +44 -16
  202. nautobot/project-static/docs/release-notes/version-1.4.html +44 -16
  203. nautobot/project-static/docs/release-notes/version-1.5.html +44 -16
  204. nautobot/project-static/docs/release-notes/version-1.6.html +44 -16
  205. nautobot/project-static/docs/release-notes/version-2.0.html +47 -19
  206. nautobot/project-static/docs/release-notes/version-2.1.html +5724 -0
  207. nautobot/project-static/docs/search/search_index.json +1 -1
  208. nautobot/project-static/docs/sitemap.xml +247 -237
  209. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  210. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +44 -16
  211. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +44 -16
  212. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +44 -16
  213. nautobot/project-static/docs/user-guide/administration/configuration/index.html +44 -16
  214. nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +44 -16
  215. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +109 -43
  216. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +44 -16
  217. nautobot/project-static/docs/user-guide/administration/guides/caching.html +44 -16
  218. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +44 -16
  219. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +44 -16
  220. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +44 -16
  221. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +44 -16
  222. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +44 -16
  223. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +48 -19
  224. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +44 -16
  225. nautobot/project-static/docs/user-guide/administration/installation/docker.html +44 -16
  226. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +44 -16
  227. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +44 -16
  228. nautobot/project-static/docs/user-guide/administration/installation/index.html +44 -16
  229. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +44 -16
  230. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +44 -16
  231. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +44 -16
  232. nautobot/project-static/docs/user-guide/administration/installation/services.html +44 -16
  233. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +44 -16
  234. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +44 -16
  235. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +44 -16
  236. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +44 -16
  237. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +44 -16
  238. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +44 -16
  239. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +44 -16
  240. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +44 -16
  241. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +44 -16
  242. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +44 -16
  243. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +44 -16
  244. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +44 -16
  245. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +44 -16
  246. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +44 -16
  247. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +44 -16
  248. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +44 -16
  249. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +44 -16
  250. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +44 -16
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +44 -16
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +44 -16
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +44 -16
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +44 -16
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +44 -16
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +44 -16
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +44 -16
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +44 -16
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +44 -16
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +44 -16
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +44 -16
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +44 -16
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +44 -16
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +44 -16
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +44 -16
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +44 -16
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +44 -16
  268. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +44 -16
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +44 -16
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +44 -16
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +44 -16
  272. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +44 -16
  273. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +44 -16
  274. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +44 -16
  275. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +44 -16
  276. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +44 -16
  277. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +44 -16
  278. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +44 -16
  279. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +44 -16
  280. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +44 -16
  281. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +44 -16
  282. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +44 -16
  283. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +44 -16
  284. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +44 -16
  285. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +44 -16
  286. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +44 -16
  287. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +44 -16
  288. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +44 -16
  289. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +44 -16
  290. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +44 -16
  291. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +44 -16
  292. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +44 -16
  293. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +44 -16
  294. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +44 -16
  295. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +44 -16
  296. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +44 -16
  297. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +44 -16
  298. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +44 -16
  299. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +44 -16
  300. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +44 -16
  301. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +44 -16
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +44 -16
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +44 -16
  304. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +44 -16
  305. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +44 -16
  306. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +44 -16
  307. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +44 -16
  308. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +44 -16
  309. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +44 -16
  310. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +44 -16
  311. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +44 -16
  312. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +44 -16
  313. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +44 -16
  314. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +44 -16
  315. nautobot/project-static/docs/user-guide/index.html +44 -16
  316. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +110 -16
  317. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +44 -16
  318. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +44 -16
  319. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +44 -16
  320. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +44 -16
  321. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +47 -19
  322. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +5359 -0
  323. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +47 -19
  324. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +44 -16
  325. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +44 -16
  326. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +44 -16
  327. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +44 -16
  328. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +44 -16
  329. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +44 -16
  330. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +44 -16
  331. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +44 -16
  332. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +44 -16
  333. nautobot/project-static/docs/user-guide/platform-functionality/note.html +44 -16
  334. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +44 -16
  335. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +44 -16
  336. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +113 -44
  337. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +44 -16
  338. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +44 -16
  339. nautobot/project-static/docs/user-guide/platform-functionality/role.html +44 -16
  340. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +44 -16
  341. nautobot/project-static/docs/user-guide/platform-functionality/status.html +44 -16
  342. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +44 -16
  343. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +44 -16
  344. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +44 -16
  345. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +44 -16
  346. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +44 -16
  347. nautobot/project-static/fonts/UFL.txt +96 -0
  348. nautobot/project-static/fonts/Ubuntu-Bold.woff2 +0 -0
  349. nautobot/project-static/fonts/Ubuntu-BoldItalic.woff2 +0 -0
  350. nautobot/project-static/fonts/Ubuntu-Italic.woff2 +0 -0
  351. nautobot/project-static/fonts/Ubuntu-Medium.woff2 +0 -0
  352. nautobot/project-static/fonts/Ubuntu-MediumItalic.woff2 +0 -0
  353. nautobot/project-static/fonts/Ubuntu-Regular.woff2 +0 -0
  354. nautobot/project-static/fonts/UbuntuMono-Bold.woff2 +0 -0
  355. nautobot/project-static/fonts/UbuntuMono-BoldItalic.woff2 +0 -0
  356. nautobot/project-static/fonts/UbuntuMono-Italic.woff2 +0 -0
  357. nautobot/project-static/fonts/UbuntuMono-Regular.woff2 +0 -0
  358. nautobot/project-static/img/dark-theme.png +0 -0
  359. nautobot/project-static/img/light-theme.png +0 -0
  360. nautobot/project-static/img/nautobot_chevron.svg +5 -0
  361. nautobot/project-static/img/nautobot_chevron_header.svg +5 -0
  362. nautobot/project-static/img/system-theme.png +0 -0
  363. nautobot/tenancy/navigation.py +0 -13
  364. nautobot/ui/package-lock.json +2 -2
  365. nautobot/ui/package.json +1 -1
  366. nautobot/users/admin.py +44 -0
  367. nautobot/users/migrations/0007_alter_objectpermission_object_types.py +33 -0
  368. nautobot/users/models.py +3 -2
  369. nautobot/virtualization/navigation.py +1 -33
  370. nautobot/virtualization/tests/test_api.py +1 -1
  371. nautobot/virtualization/tests/test_filters.py +1 -1
  372. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/METADATA +1 -1
  373. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/RECORD +376 -351
  374. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/LICENSE.txt +0 -0
  375. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/WHEEL +0 -0
  376. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/entry_points.txt +0 -0
@@ -2659,6 +2659,20 @@
2659
2659
 
2660
2660
 
2661
2661
 
2662
+ <li class="md-nav__item">
2663
+ <a href="../../../user-guide/platform-functionality/externalintegration.html" class="md-nav__link">
2664
+ External Integrations
2665
+ </a>
2666
+ </li>
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+
2662
2676
  <li class="md-nav__item">
2663
2677
  <a href="../../../user-guide/platform-functionality/gitrepository.html" class="md-nav__link">
2664
2678
  Git Repositories
@@ -2679,7 +2693,7 @@
2679
2693
 
2680
2694
 
2681
2695
 
2682
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_8" >
2696
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_9" >
2683
2697
 
2684
2698
 
2685
2699
 
@@ -2688,14 +2702,14 @@
2688
2702
  <div class="md-nav__link md-nav__link--index ">
2689
2703
  <a href="../../../user-guide/platform-functionality/graphql.html">GraphQL</a>
2690
2704
 
2691
- <label for="__nav_2_4_8">
2705
+ <label for="__nav_2_4_9">
2692
2706
  <span class="md-nav__icon md-icon"></span>
2693
2707
  </label>
2694
2708
 
2695
2709
  </div>
2696
2710
 
2697
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_8_label" aria-expanded="false">
2698
- <label class="md-nav__title" for="__nav_2_4_8">
2711
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_9_label" aria-expanded="false">
2712
+ <label class="md-nav__title" for="__nav_2_4_9">
2699
2713
  <span class="md-nav__icon md-icon"></span>
2700
2714
  GraphQL
2701
2715
  </label>
@@ -2747,7 +2761,7 @@
2747
2761
 
2748
2762
 
2749
2763
 
2750
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_10" >
2764
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_11" >
2751
2765
 
2752
2766
 
2753
2767
 
@@ -2756,14 +2770,14 @@
2756
2770
  <div class="md-nav__link md-nav__link--index ">
2757
2771
  <a href="../../../user-guide/platform-functionality/jobs/index.html">Jobs</a>
2758
2772
 
2759
- <label for="__nav_2_4_10">
2773
+ <label for="__nav_2_4_11">
2760
2774
  <span class="md-nav__icon md-icon"></span>
2761
2775
  </label>
2762
2776
 
2763
2777
  </div>
2764
2778
 
2765
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_10_label" aria-expanded="false">
2766
- <label class="md-nav__title" for="__nav_2_4_10">
2779
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_11_label" aria-expanded="false">
2780
+ <label class="md-nav__title" for="__nav_2_4_11">
2767
2781
  <span class="md-nav__icon md-icon"></span>
2768
2782
  Jobs
2769
2783
  </label>
@@ -2885,7 +2899,7 @@
2885
2899
 
2886
2900
 
2887
2901
 
2888
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_14" >
2902
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_15" >
2889
2903
 
2890
2904
 
2891
2905
 
@@ -2894,14 +2908,14 @@
2894
2908
  <div class="md-nav__link md-nav__link--index ">
2895
2909
  <a href="../../../user-guide/platform-functionality/rest-api/overview.html">REST API</a>
2896
2910
 
2897
- <label for="__nav_2_4_14">
2911
+ <label for="__nav_2_4_15">
2898
2912
  <span class="md-nav__icon md-icon"></span>
2899
2913
  </label>
2900
2914
 
2901
2915
  </div>
2902
2916
 
2903
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_14_label" aria-expanded="false">
2904
- <label class="md-nav__title" for="__nav_2_4_14">
2917
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_15_label" aria-expanded="false">
2918
+ <label class="md-nav__title" for="__nav_2_4_15">
2905
2919
  <span class="md-nav__icon md-icon"></span>
2906
2920
  REST API
2907
2921
  </label>
@@ -3037,17 +3051,17 @@
3037
3051
 
3038
3052
 
3039
3053
 
3040
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_20" >
3054
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_21" >
3041
3055
 
3042
3056
 
3043
3057
 
3044
- <label class="md-nav__link" for="__nav_2_4_20" id="__nav_2_4_20_label" tabindex="0">
3058
+ <label class="md-nav__link" for="__nav_2_4_21" id="__nav_2_4_21_label" tabindex="0">
3045
3059
  Users
3046
3060
  <span class="md-nav__icon md-icon"></span>
3047
3061
  </label>
3048
3062
 
3049
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_20_label" aria-expanded="false">
3050
- <label class="md-nav__title" for="__nav_2_4_20">
3063
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_21_label" aria-expanded="false">
3064
+ <label class="md-nav__title" for="__nav_2_4_21">
3051
3065
  <span class="md-nav__icon md-icon"></span>
3052
3066
  Users
3053
3067
  </label>
@@ -4584,6 +4598,13 @@
4584
4598
  formfield()
4585
4599
  </a>
4586
4600
 
4601
+ </li>
4602
+
4603
+ <li class="md-nav__item">
4604
+ <a href="#nautobot.core.models.fields.ForeignKeyLimitedByContentTypes.get_limit_choices_to" class="md-nav__link">
4605
+ get_limit_choices_to()
4606
+ </a>
4607
+
4587
4608
  </li>
4588
4609
 
4589
4610
  </ul>
@@ -5745,6 +5766,20 @@
5745
5766
 
5746
5767
 
5747
5768
 
5769
+ <li class="md-nav__item">
5770
+ <a href="../../../release-notes/version-2.1.html" class="md-nav__link">
5771
+ Version 2.1
5772
+ </a>
5773
+ </li>
5774
+
5775
+
5776
+
5777
+
5778
+
5779
+
5780
+
5781
+
5782
+
5748
5783
  <li class="md-nav__item">
5749
5784
  <a href="../../../release-notes/version-2.0.html" class="md-nav__link">
5750
5785
  Version 2.0
@@ -6551,6 +6586,13 @@
6551
6586
  formfield()
6552
6587
  </a>
6553
6588
 
6589
+ </li>
6590
+
6591
+ <li class="md-nav__item">
6592
+ <a href="#nautobot.core.models.fields.ForeignKeyLimitedByContentTypes.get_limit_choices_to" class="md-nav__link">
6593
+ get_limit_choices_to()
6594
+ </a>
6595
+
6554
6596
  </li>
6555
6597
 
6556
6598
  </ul>
@@ -7139,7 +7181,8 @@ class MyModel(models.Model):
7139
7181
 
7140
7182
  <details class="quote">
7141
7183
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
7142
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-84"> 84</a></span>
7184
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-83"> 83</a></span>
7185
+ <span class="normal"><a href="#__codelineno-0-84"> 84</a></span>
7143
7186
  <span class="normal"><a href="#__codelineno-0-85"> 85</a></span>
7144
7187
  <span class="normal"><a href="#__codelineno-0-86"> 86</a></span>
7145
7188
  <span class="normal"><a href="#__codelineno-0-87"> 87</a></span>
@@ -7202,72 +7245,71 @@ class MyModel(models.Model):
7202
7245
  <span class="normal"><a href="#__codelineno-0-144">144</a></span>
7203
7246
  <span class="normal"><a href="#__codelineno-0-145">145</a></span>
7204
7247
  <span class="normal"><a href="#__codelineno-0-146">146</a></span>
7205
- <span class="normal"><a href="#__codelineno-0-147">147</a></span>
7206
- <span class="normal"><a href="#__codelineno-0-148">148</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-84" name="__codelineno-0-84"></a><span class="k">class</span> <span class="nc">AutoSlugField</span><span class="p">(</span><span class="n">_AutoSlugField</span><span class="p">):</span>
7207
- <a id="__codelineno-0-85" name="__codelineno-0-85"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;AutoSlugField</span>
7208
- <a id="__codelineno-0-86" name="__codelineno-0-86"></a>
7209
- <a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="sd"> By default, sets editable=True, blank=True, max_length=100, overwrite_on_add=False, unique=True</span>
7210
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="sd"> Required arguments:</span>
7211
- <a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="sd"> populate_from</span>
7212
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> Specifies which field, list of fields, or model method</span>
7213
- <a id="__codelineno-0-91" name="__codelineno-0-91"></a><span class="sd"> the slug will be populated from.</span>
7214
- <a id="__codelineno-0-92" name="__codelineno-0-92"></a>
7215
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a><span class="sd"> populate_from can traverse a ForeignKey relationship</span>
7216
- <a id="__codelineno-0-94" name="__codelineno-0-94"></a><span class="sd"> by using Django ORM syntax:</span>
7217
- <a id="__codelineno-0-95" name="__codelineno-0-95"></a><span class="sd"> populate_from = &#39;related_model__field&#39;</span>
7218
- <a id="__codelineno-0-96" name="__codelineno-0-96"></a>
7219
- <a id="__codelineno-0-97" name="__codelineno-0-97"></a><span class="sd"> Optional arguments:</span>
7220
- <a id="__codelineno-0-98" name="__codelineno-0-98"></a>
7221
- <a id="__codelineno-0-99" name="__codelineno-0-99"></a><span class="sd"> separator</span>
7222
- <a id="__codelineno-0-100" name="__codelineno-0-100"></a><span class="sd"> Defines the used separator (default: &#39;-&#39;)</span>
7223
- <a id="__codelineno-0-101" name="__codelineno-0-101"></a>
7224
- <a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="sd"> overwrite</span>
7225
- <a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> If set to True, overwrites the slug on every save (default: False)</span>
7226
- <a id="__codelineno-0-104" name="__codelineno-0-104"></a>
7227
- <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="sd"> overwrite_on_add</span>
7228
- <a id="__codelineno-0-106" name="__codelineno-0-106"></a><span class="sd"> If set to True, overwrites the provided slug on initial creation (default: False)</span>
7229
- <a id="__codelineno-0-107" name="__codelineno-0-107"></a>
7230
- <a id="__codelineno-0-108" name="__codelineno-0-108"></a><span class="sd"> slugify_function</span>
7231
- <a id="__codelineno-0-109" name="__codelineno-0-109"></a><span class="sd"> Defines the function which will be used to &quot;slugify&quot; a content</span>
7232
- <a id="__codelineno-0-110" name="__codelineno-0-110"></a><span class="sd"> (default: :py:func:`~django.template.defaultfilters.slugify` )</span>
7233
- <a id="__codelineno-0-111" name="__codelineno-0-111"></a>
7234
- <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="sd"> It is possible to provide custom &quot;slugify&quot; function with</span>
7235
- <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> the ``slugify_function`` function in a model class.</span>
7236
- <a id="__codelineno-0-114" name="__codelineno-0-114"></a>
7237
- <a id="__codelineno-0-115" name="__codelineno-0-115"></a><span class="sd"> ``slugify_function`` function in a model class takes priority over</span>
7238
- <a id="__codelineno-0-116" name="__codelineno-0-116"></a><span class="sd"> ``slugify_function`` given as an argument to :py:class:`~AutoSlugField`.</span>
7239
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a>
7240
- <a id="__codelineno-0-118" name="__codelineno-0-118"></a><span class="sd"> Example</span>
7241
- <a id="__codelineno-0-119" name="__codelineno-0-119"></a>
7242
- <a id="__codelineno-0-120" name="__codelineno-0-120"></a><span class="sd"> .. code-block:: python</span>
7243
- <a id="__codelineno-0-121" name="__codelineno-0-121"></a><span class="sd"> # models.py</span>
7244
- <a id="__codelineno-0-122" name="__codelineno-0-122"></a>
7245
- <a id="__codelineno-0-123" name="__codelineno-0-123"></a><span class="sd"> from django.db import models</span>
7246
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a><span class="sd"> from django_extensions.db.fields import AutoSlugField</span>
7247
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a>
7248
- <a id="__codelineno-0-126" name="__codelineno-0-126"></a><span class="sd"> class MyModel(models.Model):</span>
7249
- <a id="__codelineno-0-127" name="__codelineno-0-127"></a><span class="sd"> def slugify_function(self, content):</span>
7250
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a><span class="sd"> return content.replace(&#39;_&#39;, &#39;-&#39;).lower()</span>
7251
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a>
7252
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a><span class="sd"> title = models.CharField(max_length=42)</span>
7253
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a><span class="sd"> slug = AutoSlugField(populate_from=&#39;title&#39;)</span>
7254
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a>
7255
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a><span class="sd"> Taken from django_extensions AutoSlugField Documentation.</span>
7256
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a><span class="sd"> &quot;&quot;&quot;</span>
7257
- <a id="__codelineno-0-135" name="__codelineno-0-135"></a>
7258
- <a id="__codelineno-0-136" name="__codelineno-0-136"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
7259
- <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7260
- <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;editable&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
7261
- <a id="__codelineno-0-139" name="__codelineno-0-139"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;overwrite_on_add&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
7262
- <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;unique&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
7263
- <a id="__codelineno-0-141" name="__codelineno-0-141"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
7264
- <a id="__codelineno-0-142" name="__codelineno-0-142"></a>
7265
- <a id="__codelineno-0-143" name="__codelineno-0-143"></a> <span class="k">def</span> <span class="nf">get_slug_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">):</span>
7266
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Workaround for https://github.com/django-extensions/django-extensions/issues/1713.&quot;&quot;&quot;</span>
7267
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">try</span><span class="p">:</span>
7268
- <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_slug_fields</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">)</span>
7269
- <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
7270
- <a id="__codelineno-0-148" name="__codelineno-0-148"></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
7248
+ <span class="normal"><a href="#__codelineno-0-147">147</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="k">class</span> <span class="nc">AutoSlugField</span><span class="p">(</span><span class="n">_AutoSlugField</span><span class="p">):</span>
7249
+ <a id="__codelineno-0-84" name="__codelineno-0-84"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;AutoSlugField</span>
7250
+ <a id="__codelineno-0-85" name="__codelineno-0-85"></a>
7251
+ <a id="__codelineno-0-86" name="__codelineno-0-86"></a><span class="sd"> By default, sets editable=True, blank=True, max_length=100, overwrite_on_add=False, unique=True</span>
7252
+ <a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="sd"> Required arguments:</span>
7253
+ <a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="sd"> populate_from</span>
7254
+ <a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="sd"> Specifies which field, list of fields, or model method</span>
7255
+ <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> the slug will be populated from.</span>
7256
+ <a id="__codelineno-0-91" name="__codelineno-0-91"></a>
7257
+ <a id="__codelineno-0-92" name="__codelineno-0-92"></a><span class="sd"> populate_from can traverse a ForeignKey relationship</span>
7258
+ <a id="__codelineno-0-93" name="__codelineno-0-93"></a><span class="sd"> by using Django ORM syntax:</span>
7259
+ <a id="__codelineno-0-94" name="__codelineno-0-94"></a><span class="sd"> populate_from = &#39;related_model__field&#39;</span>
7260
+ <a id="__codelineno-0-95" name="__codelineno-0-95"></a>
7261
+ <a id="__codelineno-0-96" name="__codelineno-0-96"></a><span class="sd"> Optional arguments:</span>
7262
+ <a id="__codelineno-0-97" name="__codelineno-0-97"></a>
7263
+ <a id="__codelineno-0-98" name="__codelineno-0-98"></a><span class="sd"> separator</span>
7264
+ <a id="__codelineno-0-99" name="__codelineno-0-99"></a><span class="sd"> Defines the used separator (default: &#39;-&#39;)</span>
7265
+ <a id="__codelineno-0-100" name="__codelineno-0-100"></a>
7266
+ <a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="sd"> overwrite</span>
7267
+ <a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="sd"> If set to True, overwrites the slug on every save (default: False)</span>
7268
+ <a id="__codelineno-0-103" name="__codelineno-0-103"></a>
7269
+ <a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="sd"> overwrite_on_add</span>
7270
+ <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="sd"> If set to True, overwrites the provided slug on initial creation (default: False)</span>
7271
+ <a id="__codelineno-0-106" name="__codelineno-0-106"></a>
7272
+ <a id="__codelineno-0-107" name="__codelineno-0-107"></a><span class="sd"> slugify_function</span>
7273
+ <a id="__codelineno-0-108" name="__codelineno-0-108"></a><span class="sd"> Defines the function which will be used to &quot;slugify&quot; a content</span>
7274
+ <a id="__codelineno-0-109" name="__codelineno-0-109"></a><span class="sd"> (default: :py:func:`~django.template.defaultfilters.slugify` )</span>
7275
+ <a id="__codelineno-0-110" name="__codelineno-0-110"></a>
7276
+ <a id="__codelineno-0-111" name="__codelineno-0-111"></a><span class="sd"> It is possible to provide custom &quot;slugify&quot; function with</span>
7277
+ <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="sd"> the ``slugify_function`` function in a model class.</span>
7278
+ <a id="__codelineno-0-113" name="__codelineno-0-113"></a>
7279
+ <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> ``slugify_function`` function in a model class takes priority over</span>
7280
+ <a id="__codelineno-0-115" name="__codelineno-0-115"></a><span class="sd"> ``slugify_function`` given as an argument to :py:class:`~AutoSlugField`.</span>
7281
+ <a id="__codelineno-0-116" name="__codelineno-0-116"></a>
7282
+ <a id="__codelineno-0-117" name="__codelineno-0-117"></a><span class="sd"> Example</span>
7283
+ <a id="__codelineno-0-118" name="__codelineno-0-118"></a>
7284
+ <a id="__codelineno-0-119" name="__codelineno-0-119"></a><span class="sd"> .. code-block:: python</span>
7285
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a><span class="sd"> # models.py</span>
7286
+ <a id="__codelineno-0-121" name="__codelineno-0-121"></a>
7287
+ <a id="__codelineno-0-122" name="__codelineno-0-122"></a><span class="sd"> from django.db import models</span>
7288
+ <a id="__codelineno-0-123" name="__codelineno-0-123"></a><span class="sd"> from django_extensions.db.fields import AutoSlugField</span>
7289
+ <a id="__codelineno-0-124" name="__codelineno-0-124"></a>
7290
+ <a id="__codelineno-0-125" name="__codelineno-0-125"></a><span class="sd"> class MyModel(models.Model):</span>
7291
+ <a id="__codelineno-0-126" name="__codelineno-0-126"></a><span class="sd"> def slugify_function(self, content):</span>
7292
+ <a id="__codelineno-0-127" name="__codelineno-0-127"></a><span class="sd"> return content.replace(&#39;_&#39;, &#39;-&#39;).lower()</span>
7293
+ <a id="__codelineno-0-128" name="__codelineno-0-128"></a>
7294
+ <a id="__codelineno-0-129" name="__codelineno-0-129"></a><span class="sd"> title = models.CharField(max_length=42)</span>
7295
+ <a id="__codelineno-0-130" name="__codelineno-0-130"></a><span class="sd"> slug = AutoSlugField(populate_from=&#39;title&#39;)</span>
7296
+ <a id="__codelineno-0-131" name="__codelineno-0-131"></a>
7297
+ <a id="__codelineno-0-132" name="__codelineno-0-132"></a><span class="sd"> Taken from django_extensions AutoSlugField Documentation.</span>
7298
+ <a id="__codelineno-0-133" name="__codelineno-0-133"></a><span class="sd"> &quot;&quot;&quot;</span>
7299
+ <a id="__codelineno-0-134" name="__codelineno-0-134"></a>
7300
+ <a id="__codelineno-0-135" name="__codelineno-0-135"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
7301
+ <a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7302
+ <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;editable&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
7303
+ <a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;overwrite_on_add&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
7304
+ <a id="__codelineno-0-139" name="__codelineno-0-139"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;unique&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
7305
+ <a id="__codelineno-0-140" name="__codelineno-0-140"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
7306
+ <a id="__codelineno-0-141" name="__codelineno-0-141"></a>
7307
+ <a id="__codelineno-0-142" name="__codelineno-0-142"></a> <span class="k">def</span> <span class="nf">get_slug_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">):</span>
7308
+ <a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Workaround for https://github.com/django-extensions/django-extensions/issues/1713.&quot;&quot;&quot;</span>
7309
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a> <span class="k">try</span><span class="p">:</span>
7310
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_slug_fields</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">)</span>
7311
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
7312
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
7271
7313
  </code></pre></div></td></tr></table></div>
7272
7314
  </details>
7273
7315
 
@@ -7300,17 +7342,17 @@ class MyModel(models.Model):
7300
7342
 
7301
7343
  <details class="quote">
7302
7344
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
7303
- <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>
7345
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-142">142</a></span>
7346
+ <span class="normal"><a href="#__codelineno-0-143">143</a></span>
7304
7347
  <span class="normal"><a href="#__codelineno-0-144">144</a></span>
7305
7348
  <span class="normal"><a href="#__codelineno-0-145">145</a></span>
7306
7349
  <span class="normal"><a href="#__codelineno-0-146">146</a></span>
7307
- <span class="normal"><a href="#__codelineno-0-147">147</a></span>
7308
- <span class="normal"><a href="#__codelineno-0-148">148</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_slug_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">):</span>
7309
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Workaround for https://github.com/django-extensions/django-extensions/issues/1713.&quot;&quot;&quot;</span>
7310
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">try</span><span class="p">:</span>
7311
- <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_slug_fields</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">)</span>
7312
- <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
7313
- <a id="__codelineno-0-148" name="__codelineno-0-148"></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
7350
+ <span class="normal"><a href="#__codelineno-0-147">147</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="k">def</span> <span class="nf">get_slug_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">):</span>
7351
+ <a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Workaround for https://github.com/django-extensions/django-extensions/issues/1713.&quot;&quot;&quot;</span>
7352
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a> <span class="k">try</span><span class="p">:</span>
7353
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_slug_fields</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">lookup_value</span><span class="p">)</span>
7354
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
7355
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
7314
7356
  </code></pre></div></td></tr></table></div>
7315
7357
  </details>
7316
7358
  </div>
@@ -9256,10 +9298,7 @@ ConfigContexts.</p>
9256
9298
 
9257
9299
  <details class="quote">
9258
9300
  <summary>Source code in <code>nautobot/extras/models/models.py</code></summary>
9259
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-148">148</a></span>
9260
- <span class="normal"><a href="#__codelineno-0-149">149</a></span>
9261
- <span class="normal"><a href="#__codelineno-0-150">150</a></span>
9262
- <span class="normal"><a href="#__codelineno-0-151">151</a></span>
9301
+ <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>
9263
9302
  <span class="normal"><a href="#__codelineno-0-152">152</a></span>
9264
9303
  <span class="normal"><a href="#__codelineno-0-153">153</a></span>
9265
9304
  <span class="normal"><a href="#__codelineno-0-154">154</a></span>
@@ -9356,107 +9395,110 @@ ConfigContexts.</p>
9356
9395
  <span class="normal"><a href="#__codelineno-0-245">245</a></span>
9357
9396
  <span class="normal"><a href="#__codelineno-0-246">246</a></span>
9358
9397
  <span class="normal"><a href="#__codelineno-0-247">247</a></span>
9359
- <span class="normal"><a href="#__codelineno-0-248">248</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="k">class</span> <span class="nc">ConfigContextModel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span> <span class="n">ConfigContextSchemaValidationMixin</span><span class="p">):</span>
9360
- <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9361
- <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> A model which includes local configuration context data. This local data will override any inherited data from</span>
9362
- <a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd"> ConfigContexts.</span>
9363
- <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> &quot;&quot;&quot;</span>
9364
- <a id="__codelineno-0-153" name="__codelineno-0-153"></a>
9365
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a> <span class="n">local_config_context_data</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">JSONField</span><span class="p">(</span>
9366
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="n">encoder</span><span class="o">=</span><span class="n">DjangoJSONEncoder</span><span class="p">,</span>
9367
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9368
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9369
- <a id="__codelineno-0-158" name="__codelineno-0-158"></a> <span class="p">)</span>
9370
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="n">local_config_context_schema</span> <span class="o">=</span> <span class="n">ForeignKeyWithAutoRelatedName</span><span class="p">(</span>
9371
- <a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="n">to</span><span class="o">=</span><span class="s2">&quot;extras.ConfigContextSchema&quot;</span><span class="p">,</span>
9372
- <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">SET_NULL</span><span class="p">,</span>
9373
- <a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9374
- <a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9375
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;Optional schema to validate the structure of the data&quot;</span><span class="p">,</span>
9376
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="p">)</span>
9377
- <a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="c1"># The local context data *may* be owned by another model, such as a GitRepository, or it may be un-owned</span>
9378
- <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="n">local_config_context_data_owner_content_type</span> <span class="o">=</span> <span class="n">ForeignKeyWithAutoRelatedName</span><span class="p">(</span>
9379
- <a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="n">to</span><span class="o">=</span><span class="n">ContentType</span><span class="p">,</span>
9380
- <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">CASCADE</span><span class="p">,</span>
9381
- <a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">limit_choices_to</span><span class="o">=</span><span class="n">FeatureQuery</span><span class="p">(</span><span class="s2">&quot;config_context_owners&quot;</span><span class="p">),</span>
9382
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
9383
- <a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9384
- <a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9385
- <a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="p">)</span>
9386
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="n">local_config_context_data_owner_object_id</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">UUIDField</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9387
- <a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="n">local_config_context_data_owner</span> <span class="o">=</span> <span class="n">GenericForeignKey</span><span class="p">(</span>
9388
- <a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="n">ct_field</span><span class="o">=</span><span class="s2">&quot;local_config_context_data_owner_content_type&quot;</span><span class="p">,</span>
9389
- <a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="n">fk_field</span><span class="o">=</span><span class="s2">&quot;local_config_context_data_owner_object_id&quot;</span><span class="p">,</span>
9390
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="p">)</span>
9391
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a>
9392
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
9393
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
9394
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="n">indexes</span> <span class="o">=</span> <span class="p">[</span>
9395
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="n">models</span><span class="o">.</span><span class="n">Index</span><span class="p">(</span>
9396
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="n">fields</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;local_config_context_data_owner_content_type&quot;</span><span class="p">,</span> <span class="s2">&quot;local_config_context_data_owner_object_id&quot;</span><span class="p">)</span>
9397
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="p">),</span>
9398
- <a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="p">]</span>
9399
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a>
9400
- <a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="k">def</span> <span class="nf">get_config_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9401
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9402
- <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> Return the rendered configuration context for a device or VM.</span>
9403
- <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> &quot;&quot;&quot;</span>
9404
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a>
9405
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;config_context_data&quot;</span><span class="p">):</span>
9406
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="c1"># Annotation not available, so fall back to manually querying for the config context</span>
9407
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9408
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">else</span><span class="p">:</span>
9409
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config_context_data</span> <span class="ow">or</span> <span class="p">[]</span>
9410
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="c1"># Device and VirtualMachine&#39;s Location has its own ConfigContext and its parent Locations&#39; ConfigContext, if any, should</span>
9411
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="c1"># also be applied. However, since moving from mptt to django-tree-queries https://github.com/nautobot/nautobot/issues/510,</span>
9412
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="c1"># we lost the ability to query the ancestors for a particular tree node for subquery https://github.com/matthiask/django-tree-queries/issues/54.</span>
9413
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="c1"># So instead of constructing the location related query in ConfigContextModelQueryset._get_config_context_filters(), which is complicated across databases</span>
9414
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># We append the missing parent location query here as a patch.</span>
9415
- <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">none</span><span class="p">()</span>
9416
- <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="o">==</span> <span class="s2">&quot;device&quot;</span><span class="p">:</span>
9417
- <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9418
- <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9419
- <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9420
- <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="k">else</span><span class="p">:</span>
9421
- <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
9422
- <a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9423
- <a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9424
- <a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9425
- <a id="__codelineno-0-214" name="__codelineno-0-214"></a>
9426
- <a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="c1"># Annotation has keys &quot;weight&quot; and &quot;name&quot; (used for ordering) and &quot;data&quot; (the actual config context data)</span>
9427
- <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="k">for</span> <span class="n">cc</span> <span class="ow">in</span> <span class="n">location_config_context_queryset</span><span class="p">:</span>
9428
- <a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="n">config_context_data</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">weight</span><span class="p">})</span>
9429
- <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="p">[</span>
9430
- <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">config_context_data</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">k</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">[</span><span class="s2">&quot;weight&quot;</span><span class="p">],</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]))</span>
9431
- <a id="__codelineno-0-220" name="__codelineno-0-220"></a> <span class="p">]</span>
9432
- <a id="__codelineno-0-221" name="__codelineno-0-221"></a>
9433
- <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="c1"># Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs</span>
9434
- <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
9435
- <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="k">for</span> <span class="n">context</span> <span class="ow">in</span> <span class="n">config_context_data</span><span class="p">:</span>
9436
- <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
9437
- <a id="__codelineno-0-226" name="__codelineno-0-226"></a>
9438
- <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="c1"># If the object has local config context data defined, merge it last</span>
9439
- <a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">:</span>
9440
- <a id="__codelineno-0-229" name="__codelineno-0-229"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">)</span>
9441
- <a id="__codelineno-0-230" name="__codelineno-0-230"></a>
9442
- <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="k">return</span> <span class="n">data</span>
9443
- <a id="__codelineno-0-232" name="__codelineno-0-232"></a>
9444
- <a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9445
- <a id="__codelineno-0-234" name="__codelineno-0-234"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span>
9398
+ <span class="normal"><a href="#__codelineno-0-248">248</a></span>
9399
+ <span class="normal"><a href="#__codelineno-0-249">249</a></span>
9400
+ <span class="normal"><a href="#__codelineno-0-250">250</a></span>
9401
+ <span class="normal"><a href="#__codelineno-0-251">251</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">class</span> <span class="nc">ConfigContextModel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span> <span class="n">ConfigContextSchemaValidationMixin</span><span class="p">):</span>
9402
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9403
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> A model which includes local configuration context data. This local data will override any inherited data from</span>
9404
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> ConfigContexts.</span>
9405
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> &quot;&quot;&quot;</span>
9406
+ <a id="__codelineno-0-156" name="__codelineno-0-156"></a>
9407
+ <a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="n">local_config_context_data</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">JSONField</span><span class="p">(</span>
9408
+ <a id="__codelineno-0-158" name="__codelineno-0-158"></a> <span class="n">encoder</span><span class="o">=</span><span class="n">DjangoJSONEncoder</span><span class="p">,</span>
9409
+ <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9410
+ <a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9411
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="p">)</span>
9412
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="n">local_config_context_schema</span> <span class="o">=</span> <span class="n">ForeignKeyWithAutoRelatedName</span><span class="p">(</span>
9413
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">to</span><span class="o">=</span><span class="s2">&quot;extras.ConfigContextSchema&quot;</span><span class="p">,</span>
9414
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">SET_NULL</span><span class="p">,</span>
9415
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9416
+ <a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9417
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;Optional schema to validate the structure of the data&quot;</span><span class="p">,</span>
9418
+ <a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="p">)</span>
9419
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="c1"># The local context data *may* be owned by another model, such as a GitRepository, or it may be un-owned</span>
9420
+ <a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">local_config_context_data_owner_content_type</span> <span class="o">=</span> <span class="n">ForeignKeyWithAutoRelatedName</span><span class="p">(</span>
9421
+ <a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">to</span><span class="o">=</span><span class="n">ContentType</span><span class="p">,</span>
9422
+ <a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">CASCADE</span><span class="p">,</span>
9423
+ <a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">limit_choices_to</span><span class="o">=</span><span class="n">FeatureQuery</span><span class="p">(</span><span class="s2">&quot;config_context_owners&quot;</span><span class="p">),</span>
9424
+ <a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
9425
+ <a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9426
+ <a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
9427
+ <a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="p">)</span>
9428
+ <a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="n">local_config_context_data_owner_object_id</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">UUIDField</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9429
+ <a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="n">local_config_context_data_owner</span> <span class="o">=</span> <span class="n">GenericForeignKey</span><span class="p">(</span>
9430
+ <a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="n">ct_field</span><span class="o">=</span><span class="s2">&quot;local_config_context_data_owner_content_type&quot;</span><span class="p">,</span>
9431
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="n">fk_field</span><span class="o">=</span><span class="s2">&quot;local_config_context_data_owner_object_id&quot;</span><span class="p">,</span>
9432
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="p">)</span>
9433
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a>
9434
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
9435
+ <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
9436
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="n">indexes</span> <span class="o">=</span> <span class="p">[</span>
9437
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">models</span><span class="o">.</span><span class="n">Index</span><span class="p">(</span>
9438
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a> <span class="n">fields</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;local_config_context_data_owner_content_type&quot;</span><span class="p">,</span> <span class="s2">&quot;local_config_context_data_owner_object_id&quot;</span><span class="p">)</span>
9439
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="p">),</span>
9440
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="p">]</span>
9441
+ <a id="__codelineno-0-191" name="__codelineno-0-191"></a>
9442
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="k">def</span> <span class="nf">get_config_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9443
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9444
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> Return the rendered configuration context for a device or VM.</span>
9445
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> &quot;&quot;&quot;</span>
9446
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a>
9447
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;config_context_data&quot;</span><span class="p">):</span>
9448
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="c1"># Annotation not available, so fall back to manually querying for the config context</span>
9449
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9450
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="k">else</span><span class="p">:</span>
9451
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config_context_data</span> <span class="ow">or</span> <span class="p">[]</span>
9452
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="c1"># Device and VirtualMachine&#39;s Location has its own ConfigContext and its parent Locations&#39; ConfigContext, if any, should</span>
9453
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># also be applied. However, since moving from mptt to django-tree-queries https://github.com/nautobot/nautobot/issues/510,</span>
9454
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="c1"># we lost the ability to query the ancestors for a particular tree node for subquery https://github.com/matthiask/django-tree-queries/issues/54.</span>
9455
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="c1"># So instead of constructing the location related query in ConfigContextModelQueryset._get_config_context_filters(), which is complicated across databases</span>
9456
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="c1"># We append the missing parent location query here as a patch.</span>
9457
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">none</span><span class="p">()</span>
9458
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="o">==</span> <span class="s2">&quot;device&quot;</span><span class="p">:</span>
9459
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9460
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9461
+ <a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9462
+ <a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="k">else</span><span class="p">:</span>
9463
+ <a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
9464
+ <a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9465
+ <a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9466
+ <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9467
+ <a id="__codelineno-0-217" name="__codelineno-0-217"></a>
9468
+ <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="c1"># Annotation has keys &quot;weight&quot; and &quot;name&quot; (used for ordering) and &quot;data&quot; (the actual config context data)</span>
9469
+ <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="k">for</span> <span class="n">cc</span> <span class="ow">in</span> <span class="n">location_config_context_queryset</span><span class="p">:</span>
9470
+ <a id="__codelineno-0-220" name="__codelineno-0-220"></a> <span class="n">config_context_data</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">weight</span><span class="p">})</span>
9471
+ <a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="p">[</span>
9472
+ <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">config_context_data</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">k</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">[</span><span class="s2">&quot;weight&quot;</span><span class="p">],</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]))</span>
9473
+ <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="p">]</span>
9474
+ <a id="__codelineno-0-224" name="__codelineno-0-224"></a>
9475
+ <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="c1"># Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs</span>
9476
+ <a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
9477
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="k">for</span> <span class="n">context</span> <span class="ow">in</span> <span class="n">config_context_data</span><span class="p">:</span>
9478
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
9479
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a>
9480
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="c1"># If the object has local config context data defined, merge it last</span>
9481
+ <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">:</span>
9482
+ <a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">)</span>
9483
+ <a id="__codelineno-0-233" name="__codelineno-0-233"></a>
9484
+ <a id="__codelineno-0-234" name="__codelineno-0-234"></a> <span class="k">return</span> <span class="n">data</span>
9446
9485
  <a id="__codelineno-0-235" name="__codelineno-0-235"></a>
9447
- <a id="__codelineno-0-236" name="__codelineno-0-236"></a> <span class="c1"># Verify that JSON data is provided as an object</span>
9448
- <a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
9449
- <a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
9450
- <a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="p">{</span><span class="s2">&quot;local_config_context_data&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON data must be in object form. Example: {&quot;foo&quot;: 123}&#39;</span><span class="p">}</span>
9451
- <a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="p">)</span>
9452
- <a id="__codelineno-0-241" name="__codelineno-0-241"></a>
9453
- <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_schema</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">:</span>
9454
- <a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
9455
- <a id="__codelineno-0-244" name="__codelineno-0-244"></a> <span class="p">{</span><span class="s2">&quot;local_config_context_schema&quot;</span><span class="p">:</span> <span class="s2">&quot;Local config context data must exist for a schema to be applied.&quot;</span><span class="p">}</span>
9456
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="p">)</span>
9457
- <a id="__codelineno-0-246" name="__codelineno-0-246"></a>
9458
- <a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="c1"># Validate data against schema</span>
9459
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_validate_with_schema</span><span class="p">(</span><span class="s2">&quot;local_config_context_data&quot;</span><span class="p">,</span> <span class="s2">&quot;local_config_context_schema&quot;</span><span class="p">)</span>
9486
+ <a id="__codelineno-0-236" name="__codelineno-0-236"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9487
+ <a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span>
9488
+ <a id="__codelineno-0-238" name="__codelineno-0-238"></a>
9489
+ <a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="c1"># Verify that JSON data is provided as an object</span>
9490
+ <a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
9491
+ <a id="__codelineno-0-241" name="__codelineno-0-241"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
9492
+ <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="p">{</span><span class="s2">&quot;local_config_context_data&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON data must be in object form. Example: {&quot;foo&quot;: 123}&#39;</span><span class="p">}</span>
9493
+ <a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="p">)</span>
9494
+ <a id="__codelineno-0-244" name="__codelineno-0-244"></a>
9495
+ <a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_schema</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">:</span>
9496
+ <a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
9497
+ <a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="p">{</span><span class="s2">&quot;local_config_context_schema&quot;</span><span class="p">:</span> <span class="s2">&quot;Local config context data must exist for a schema to be applied.&quot;</span><span class="p">}</span>
9498
+ <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="p">)</span>
9499
+ <a id="__codelineno-0-249" name="__codelineno-0-249"></a>
9500
+ <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="c1"># Validate data against schema</span>
9501
+ <a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_validate_with_schema</span><span class="p">(</span><span class="s2">&quot;local_config_context_data&quot;</span><span class="p">,</span> <span class="s2">&quot;local_config_context_schema&quot;</span><span class="p">)</span>
9460
9502
  </code></pre></div></td></tr></table></div>
9461
9503
  </details>
9462
9504
 
@@ -9489,10 +9531,7 @@ ConfigContexts.</p>
9489
9531
 
9490
9532
  <details class="quote">
9491
9533
  <summary>Source code in <code>nautobot/extras/models/models.py</code></summary>
9492
- <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>
9493
- <span class="normal"><a href="#__codelineno-0-190">190</a></span>
9494
- <span class="normal"><a href="#__codelineno-0-191">191</a></span>
9495
- <span class="normal"><a href="#__codelineno-0-192">192</a></span>
9534
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-192">192</a></span>
9496
9535
  <span class="normal"><a href="#__codelineno-0-193">193</a></span>
9497
9536
  <span class="normal"><a href="#__codelineno-0-194">194</a></span>
9498
9537
  <span class="normal"><a href="#__codelineno-0-195">195</a></span>
@@ -9531,49 +9570,52 @@ ConfigContexts.</p>
9531
9570
  <span class="normal"><a href="#__codelineno-0-228">228</a></span>
9532
9571
  <span class="normal"><a href="#__codelineno-0-229">229</a></span>
9533
9572
  <span class="normal"><a href="#__codelineno-0-230">230</a></span>
9534
- <span class="normal"><a href="#__codelineno-0-231">231</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="k">def</span> <span class="nf">get_config_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9535
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9536
- <a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> Return the rendered configuration context for a device or VM.</span>
9537
- <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> &quot;&quot;&quot;</span>
9538
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a>
9539
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;config_context_data&quot;</span><span class="p">):</span>
9540
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="c1"># Annotation not available, so fall back to manually querying for the config context</span>
9541
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9542
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">else</span><span class="p">:</span>
9543
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config_context_data</span> <span class="ow">or</span> <span class="p">[]</span>
9544
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="c1"># Device and VirtualMachine&#39;s Location has its own ConfigContext and its parent Locations&#39; ConfigContext, if any, should</span>
9545
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="c1"># also be applied. However, since moving from mptt to django-tree-queries https://github.com/nautobot/nautobot/issues/510,</span>
9546
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="c1"># we lost the ability to query the ancestors for a particular tree node for subquery https://github.com/matthiask/django-tree-queries/issues/54.</span>
9547
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="c1"># So instead of constructing the location related query in ConfigContextModelQueryset._get_config_context_filters(), which is complicated across databases</span>
9548
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># We append the missing parent location query here as a patch.</span>
9549
- <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">none</span><span class="p">()</span>
9550
- <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="o">==</span> <span class="s2">&quot;device&quot;</span><span class="p">:</span>
9551
- <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9552
- <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9553
- <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9554
- <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="k">else</span><span class="p">:</span>
9555
- <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
9556
- <a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9557
- <a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9558
- <a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9559
- <a id="__codelineno-0-214" name="__codelineno-0-214"></a>
9560
- <a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="c1"># Annotation has keys &quot;weight&quot; and &quot;name&quot; (used for ordering) and &quot;data&quot; (the actual config context data)</span>
9561
- <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="k">for</span> <span class="n">cc</span> <span class="ow">in</span> <span class="n">location_config_context_queryset</span><span class="p">:</span>
9562
- <a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="n">config_context_data</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">weight</span><span class="p">})</span>
9563
- <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="p">[</span>
9564
- <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">config_context_data</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">k</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">[</span><span class="s2">&quot;weight&quot;</span><span class="p">],</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]))</span>
9565
- <a id="__codelineno-0-220" name="__codelineno-0-220"></a> <span class="p">]</span>
9566
- <a id="__codelineno-0-221" name="__codelineno-0-221"></a>
9567
- <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="c1"># Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs</span>
9568
- <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
9569
- <a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="k">for</span> <span class="n">context</span> <span class="ow">in</span> <span class="n">config_context_data</span><span class="p">:</span>
9570
- <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
9571
- <a id="__codelineno-0-226" name="__codelineno-0-226"></a>
9572
- <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="c1"># If the object has local config context data defined, merge it last</span>
9573
- <a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">:</span>
9574
- <a id="__codelineno-0-229" name="__codelineno-0-229"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">)</span>
9575
- <a id="__codelineno-0-230" name="__codelineno-0-230"></a>
9576
- <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="k">return</span> <span class="n">data</span>
9573
+ <span class="normal"><a href="#__codelineno-0-231">231</a></span>
9574
+ <span class="normal"><a href="#__codelineno-0-232">232</a></span>
9575
+ <span class="normal"><a href="#__codelineno-0-233">233</a></span>
9576
+ <span class="normal"><a href="#__codelineno-0-234">234</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="k">def</span> <span class="nf">get_config_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9577
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9578
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> Return the rendered configuration context for a device or VM.</span>
9579
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> &quot;&quot;&quot;</span>
9580
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a>
9581
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;config_context_data&quot;</span><span class="p">):</span>
9582
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="c1"># Annotation not available, so fall back to manually querying for the config context</span>
9583
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9584
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="k">else</span><span class="p">:</span>
9585
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config_context_data</span> <span class="ow">or</span> <span class="p">[]</span>
9586
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="c1"># Device and VirtualMachine&#39;s Location has its own ConfigContext and its parent Locations&#39; ConfigContext, if any, should</span>
9587
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># also be applied. However, since moving from mptt to django-tree-queries https://github.com/nautobot/nautobot/issues/510,</span>
9588
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="c1"># we lost the ability to query the ancestors for a particular tree node for subquery https://github.com/matthiask/django-tree-queries/issues/54.</span>
9589
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="c1"># So instead of constructing the location related query in ConfigContextModelQueryset._get_config_context_filters(), which is complicated across databases</span>
9590
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="c1"># We append the missing parent location query here as a patch.</span>
9591
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">none</span><span class="p">()</span>
9592
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="o">==</span> <span class="s2">&quot;device&quot;</span><span class="p">:</span>
9593
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9594
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9595
+ <a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9596
+ <a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="k">else</span><span class="p">:</span>
9597
+ <a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
9598
+ <a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="n">location_config_context_queryset</span> <span class="o">=</span> <span class="n">ConfigContext</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
9599
+ <a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="n">locations__in</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cluster</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">include_self</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9600
+ <a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
9601
+ <a id="__codelineno-0-217" name="__codelineno-0-217"></a>
9602
+ <a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="c1"># Annotation has keys &quot;weight&quot; and &quot;name&quot; (used for ordering) and &quot;data&quot; (the actual config context data)</span>
9603
+ <a id="__codelineno-0-219" name="__codelineno-0-219"></a> <span class="k">for</span> <span class="n">cc</span> <span class="ow">in</span> <span class="n">location_config_context_queryset</span><span class="p">:</span>
9604
+ <a id="__codelineno-0-220" name="__codelineno-0-220"></a> <span class="n">config_context_data</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="n">cc</span><span class="o">.</span><span class="n">weight</span><span class="p">})</span>
9605
+ <a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="n">config_context_data</span> <span class="o">=</span> <span class="p">[</span>
9606
+ <a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">config_context_data</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">k</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">[</span><span class="s2">&quot;weight&quot;</span><span class="p">],</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]))</span>
9607
+ <a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="p">]</span>
9608
+ <a id="__codelineno-0-224" name="__codelineno-0-224"></a>
9609
+ <a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="c1"># Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs</span>
9610
+ <a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
9611
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="k">for</span> <span class="n">context</span> <span class="ow">in</span> <span class="n">config_context_data</span><span class="p">:</span>
9612
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
9613
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a>
9614
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="c1"># If the object has local config context data defined, merge it last</span>
9615
+ <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">:</span>
9616
+ <a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">deepmerge</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_config_context_data</span><span class="p">)</span>
9617
+ <a id="__codelineno-0-233" name="__codelineno-0-233"></a>
9618
+ <a id="__codelineno-0-234" name="__codelineno-0-234"></a> <span class="k">return</span> <span class="n">data</span>
9577
9619
  </code></pre></div></td></tr></table></div>
9578
9620
  </details>
9579
9621
  </div>
@@ -9606,10 +9648,7 @@ ConfigContexts.</p>
9606
9648
 
9607
9649
  <details class="quote">
9608
9650
  <summary>Source code in <code>nautobot/extras/models/models.py</code></summary>
9609
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-44">44</a></span>
9610
- <span class="normal"><a href="#__codelineno-0-45">45</a></span>
9611
- <span class="normal"><a href="#__codelineno-0-46">46</a></span>
9612
- <span class="normal"><a href="#__codelineno-0-47">47</a></span>
9651
+ <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>
9613
9652
  <span class="normal"><a href="#__codelineno-0-48">48</a></span>
9614
9653
  <span class="normal"><a href="#__codelineno-0-49">49</a></span>
9615
9654
  <span class="normal"><a href="#__codelineno-0-50">50</a></span>
@@ -9620,21 +9659,24 @@ ConfigContexts.</p>
9620
9659
  <span class="normal"><a href="#__codelineno-0-55">55</a></span>
9621
9660
  <span class="normal"><a href="#__codelineno-0-56">56</a></span>
9622
9661
  <span class="normal"><a href="#__codelineno-0-57">57</a></span>
9623
- <span class="normal"><a href="#__codelineno-0-58">58</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-44" name="__codelineno-0-44"></a><span class="k">class</span> <span class="nc">ConfigContextSchemaValidationMixin</span><span class="p">:</span>
9624
- <a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9625
- <a id="__codelineno-0-46" name="__codelineno-0-46"></a><span class="sd"> Mixin that provides validation of config context data against a json schema.</span>
9626
- <a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="sd"> &quot;&quot;&quot;</span>
9627
- <a id="__codelineno-0-48" name="__codelineno-0-48"></a>
9628
- <a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="k">def</span> <span class="nf">_validate_with_schema</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_field</span><span class="p">,</span> <span class="n">schema_field</span><span class="p">):</span>
9629
- <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="n">schema</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema_field</span><span class="p">)</span>
9630
- <a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">data</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_field</span><span class="p">)</span>
9631
- <a id="__codelineno-0-52" name="__codelineno-0-52"></a>
9632
- <a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="c1"># If schema is None, then no schema has been specified on the instance and thus no validation should occur.</span>
9633
- <a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="k">if</span> <span class="n">schema</span><span class="p">:</span>
9634
- <a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="k">try</span><span class="p">:</span>
9635
- <a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="n">Draft7Validator</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">data_schema</span><span class="p">,</span> <span class="n">format_checker</span><span class="o">=</span><span class="n">Draft7Validator</span><span class="o">.</span><span class="n">FORMAT_CHECKER</span><span class="p">)</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
9636
- <a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">except</span> <span class="n">JSONSchemaValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
9637
- <a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">({</span><span class="n">data_field</span><span class="p">:</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;Validation using the JSON Schema </span><span class="si">{</span><span class="n">schema</span><span class="si">}</span><span class="s2"> failed.&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="p">]})</span>
9662
+ <span class="normal"><a href="#__codelineno-0-58">58</a></span>
9663
+ <span class="normal"><a href="#__codelineno-0-59">59</a></span>
9664
+ <span class="normal"><a href="#__codelineno-0-60">60</a></span>
9665
+ <span class="normal"><a href="#__codelineno-0-61">61</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">class</span> <span class="nc">ConfigContextSchemaValidationMixin</span><span class="p">:</span>
9666
+ <a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9667
+ <a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="sd"> Mixin that provides validation of config context data against a json schema.</span>
9668
+ <a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="sd"> &quot;&quot;&quot;</span>
9669
+ <a id="__codelineno-0-51" name="__codelineno-0-51"></a>
9670
+ <a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="k">def</span> <span class="nf">_validate_with_schema</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_field</span><span class="p">,</span> <span class="n">schema_field</span><span class="p">):</span>
9671
+ <a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="n">schema</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema_field</span><span class="p">)</span>
9672
+ <a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="n">data</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_field</span><span class="p">)</span>
9673
+ <a id="__codelineno-0-55" name="__codelineno-0-55"></a>
9674
+ <a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="c1"># If schema is None, then no schema has been specified on the instance and thus no validation should occur.</span>
9675
+ <a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">if</span> <span class="n">schema</span><span class="p">:</span>
9676
+ <a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">try</span><span class="p">:</span>
9677
+ <a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="n">Draft7Validator</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">data_schema</span><span class="p">,</span> <span class="n">format_checker</span><span class="o">=</span><span class="n">Draft7Validator</span><span class="o">.</span><span class="n">FORMAT_CHECKER</span><span class="p">)</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
9678
+ <a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">except</span> <span class="n">JSONSchemaValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
9679
+ <a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">({</span><span class="n">data_field</span><span class="p">:</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;Validation using the JSON Schema </span><span class="si">{</span><span class="n">schema</span><span class="si">}</span><span class="s2"> failed.&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="p">]})</span>
9638
9680
  </code></pre></div></td></tr></table></div>
9639
9681
  </details>
9640
9682
 
@@ -11486,7 +11528,8 @@ while role_1 &amp; role_2 are both available for the Location model.</p>
11486
11528
  </details>
11487
11529
  <details class="quote">
11488
11530
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
11489
- <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>
11531
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-173">173</a></span>
11532
+ <span class="normal"><a href="#__codelineno-0-174">174</a></span>
11490
11533
  <span class="normal"><a href="#__codelineno-0-175">175</a></span>
11491
11534
  <span class="normal"><a href="#__codelineno-0-176">176</a></span>
11492
11535
  <span class="normal"><a href="#__codelineno-0-177">177</a></span>
@@ -11513,34 +11556,55 @@ while role_1 &amp; role_2 are both available for the Location model.</p>
11513
11556
  <span class="normal"><a href="#__codelineno-0-198">198</a></span>
11514
11557
  <span class="normal"><a href="#__codelineno-0-199">199</a></span>
11515
11558
  <span class="normal"><a href="#__codelineno-0-200">200</a></span>
11516
- <span class="normal"><a href="#__codelineno-0-201">201</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">class</span> <span class="nc">ForeignKeyLimitedByContentTypes</span><span class="p">(</span><span class="n">ForeignKeyWithAutoRelatedName</span><span class="p">):</span>
11517
- <a id="__codelineno-0-175" name="__codelineno-0-175"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11518
- <a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="sd"> An abstract model field that automatically restricts ForeignKey options based on content_types.</span>
11519
- <a id="__codelineno-0-177" name="__codelineno-0-177"></a>
11520
- <a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="sd"> For instance, if the model &quot;Role&quot; contains two records: role_1 and role_2, role_1&#39;s content_types</span>
11521
- <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="sd"> are set to &quot;dcim.location&quot; and &quot;dcim.device&quot; while the role_2&#39;s content_types are set to</span>
11522
- <a id="__codelineno-0-180" name="__codelineno-0-180"></a><span class="sd"> &quot;circuit.circuit&quot; and &quot;dcim.location.&quot;</span>
11523
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a>
11524
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> Then, for the field `role` on the Device model, role_1 is the only Role that is available,</span>
11525
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="sd"> while role_1 &amp; role_2 are both available for the Location model.</span>
11526
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a>
11527
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a><span class="sd"> The limit_choices_to for the field are automatically derived from:</span>
11528
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="sd"> - the content-type to which the field is attached (e.g. `dcim.device`)</span>
11529
- <a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="sd"> &quot;&quot;&quot;</span>
11530
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a>
11531
- <a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="k">def</span> <span class="nf">get_limit_choices_to</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11532
- <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</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="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)}</span>
11559
+ <span class="normal"><a href="#__codelineno-0-201">201</a></span>
11560
+ <span class="normal"><a href="#__codelineno-0-202">202</a></span>
11561
+ <span class="normal"><a href="#__codelineno-0-203">203</a></span>
11562
+ <span class="normal"><a href="#__codelineno-0-204">204</a></span>
11563
+ <span class="normal"><a href="#__codelineno-0-205">205</a></span>
11564
+ <span class="normal"><a href="#__codelineno-0-206">206</a></span>
11565
+ <span class="normal"><a href="#__codelineno-0-207">207</a></span>
11566
+ <span class="normal"><a href="#__codelineno-0-208">208</a></span>
11567
+ <span class="normal"><a href="#__codelineno-0-209">209</a></span>
11568
+ <span class="normal"><a href="#__codelineno-0-210">210</a></span>
11569
+ <span class="normal"><a href="#__codelineno-0-211">211</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="k">class</span> <span class="nc">ForeignKeyLimitedByContentTypes</span><span class="p">(</span><span class="n">ForeignKeyWithAutoRelatedName</span><span class="p">):</span>
11570
+ <a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11571
+ <a id="__codelineno-0-175" name="__codelineno-0-175"></a><span class="sd"> An abstract model field that automatically restricts ForeignKey options based on content_types.</span>
11572
+ <a id="__codelineno-0-176" name="__codelineno-0-176"></a>
11573
+ <a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="sd"> For instance, if the model &quot;Role&quot; contains two records: role_1 and role_2, role_1&#39;s content_types</span>
11574
+ <a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="sd"> are set to &quot;dcim.location&quot; and &quot;dcim.device&quot; while the role_2&#39;s content_types are set to</span>
11575
+ <a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="sd"> &quot;circuit.circuit&quot; and &quot;dcim.location.&quot;</span>
11576
+ <a id="__codelineno-0-180" name="__codelineno-0-180"></a>
11577
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> Then, for the field `role` on the Device model, role_1 is the only Role that is available,</span>
11578
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> while role_1 &amp; role_2 are both available for the Location model.</span>
11579
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a>
11580
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> The limit_choices_to for the field are automatically derived from:</span>
11581
+ <a id="__codelineno-0-185" name="__codelineno-0-185"></a><span class="sd"> - the content-type to which the field is attached (e.g. `dcim.device`)</span>
11582
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a><span class="sd"> &quot;&quot;&quot;</span>
11583
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a>
11584
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a> <span class="k">def</span> <span class="nf">get_limit_choices_to</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11585
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11586
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="sd"> Limit this field to only objects which are assigned to this model&#39;s content-type.</span>
11533
11587
  <a id="__codelineno-0-191" name="__codelineno-0-191"></a>
11534
- <a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11535
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a prepped formfield for use in model forms.&quot;&quot;&quot;</span>
11536
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
11537
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">DynamicModelChoiceField</span><span class="p">,</span>
11538
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="s2">&quot;queryset&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
11539
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="c1"># label_lower e.g. &quot;dcim.device&quot;</span>
11540
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="s2">&quot;query_params&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="p">},</span>
11541
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="p">}</span>
11542
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11543
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
11588
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> Note that this is implemented via specifying `content_types__app_label=` and `content_types__model=`</span>
11589
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> rather than via the more obvious `content_types=ContentType.objects.get_for_model(self.model)`</span>
11590
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> because the latter approach would involve a database query, and in some cases</span>
11591
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> (most notably FilterSet definition) this function is called **before** database migrations can be run.</span>
11592
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> &quot;&quot;&quot;</span>
11593
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">return</span> <span class="p">{</span>
11594
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="s2">&quot;content_types__app_label&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span>
11595
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="s2">&quot;content_types__model&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">,</span>
11596
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="p">}</span>
11597
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a>
11598
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11599
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a prepped formfield for use in model forms.&quot;&quot;&quot;</span>
11600
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
11601
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">DynamicModelChoiceField</span><span class="p">,</span>
11602
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="s2">&quot;queryset&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
11603
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="c1"># label_lower e.g. &quot;dcim.device&quot;</span>
11604
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="s2">&quot;query_params&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="p">},</span>
11605
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="p">}</span>
11606
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11607
+ <a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
11544
11608
  </code></pre></div></td></tr></table></div>
11545
11609
  </details>
11546
11610
 
@@ -11573,7 +11637,57 @@ while role_1 &amp; role_2 are both available for the Location model.</p>
11573
11637
 
11574
11638
  <details class="quote">
11575
11639
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
11576
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-192">192</a></span>
11640
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-202">202</a></span>
11641
+ <span class="normal"><a href="#__codelineno-0-203">203</a></span>
11642
+ <span class="normal"><a href="#__codelineno-0-204">204</a></span>
11643
+ <span class="normal"><a href="#__codelineno-0-205">205</a></span>
11644
+ <span class="normal"><a href="#__codelineno-0-206">206</a></span>
11645
+ <span class="normal"><a href="#__codelineno-0-207">207</a></span>
11646
+ <span class="normal"><a href="#__codelineno-0-208">208</a></span>
11647
+ <span class="normal"><a href="#__codelineno-0-209">209</a></span>
11648
+ <span class="normal"><a href="#__codelineno-0-210">210</a></span>
11649
+ <span class="normal"><a href="#__codelineno-0-211">211</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11650
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a prepped formfield for use in model forms.&quot;&quot;&quot;</span>
11651
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
11652
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">DynamicModelChoiceField</span><span class="p">,</span>
11653
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="s2">&quot;queryset&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
11654
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="c1"># label_lower e.g. &quot;dcim.device&quot;</span>
11655
+ <a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="s2">&quot;query_params&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="p">},</span>
11656
+ <a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="p">}</span>
11657
+ <a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11658
+ <a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
11659
+ </code></pre></div></td></tr></table></div>
11660
+ </details>
11661
+ </div>
11662
+
11663
+ </div>
11664
+
11665
+
11666
+ <div class="doc doc-object doc-function">
11667
+
11668
+
11669
+
11670
+ <h3 id="nautobot.core.models.fields.ForeignKeyLimitedByContentTypes.get_limit_choices_to" class="doc doc-heading">
11671
+ <code class="highlight language-python"><span class="n">get_limit_choices_to</span><span class="p">()</span></code>
11672
+
11673
+ <a href="#nautobot.core.models.fields.ForeignKeyLimitedByContentTypes.get_limit_choices_to" class="headerlink" title="Permanent link">&para;</a></h3>
11674
+
11675
+
11676
+ <div class="doc doc-contents ">
11677
+
11678
+ <p>Limit this field to only objects which are assigned to this model's content-type.</p>
11679
+ <p>Note that this is implemented via specifying <code>content_types__app_label=</code> and <code>content_types__model=</code>
11680
+ rather than via the more obvious <code>content_types=ContentType.objects.get_for_model(self.model)</code>
11681
+ because the latter approach would involve a database query, and in some cases
11682
+ (most notably FilterSet definition) this function is called <strong>before</strong> database migrations can be run.</p>
11683
+
11684
+ <details class="quote">
11685
+ <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
11686
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-188">188</a></span>
11687
+ <span class="normal"><a href="#__codelineno-0-189">189</a></span>
11688
+ <span class="normal"><a href="#__codelineno-0-190">190</a></span>
11689
+ <span class="normal"><a href="#__codelineno-0-191">191</a></span>
11690
+ <span class="normal"><a href="#__codelineno-0-192">192</a></span>
11577
11691
  <span class="normal"><a href="#__codelineno-0-193">193</a></span>
11578
11692
  <span class="normal"><a href="#__codelineno-0-194">194</a></span>
11579
11693
  <span class="normal"><a href="#__codelineno-0-195">195</a></span>
@@ -11581,17 +11695,19 @@ while role_1 &amp; role_2 are both available for the Location model.</p>
11581
11695
  <span class="normal"><a href="#__codelineno-0-197">197</a></span>
11582
11696
  <span class="normal"><a href="#__codelineno-0-198">198</a></span>
11583
11697
  <span class="normal"><a href="#__codelineno-0-199">199</a></span>
11584
- <span class="normal"><a href="#__codelineno-0-200">200</a></span>
11585
- <span class="normal"><a href="#__codelineno-0-201">201</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11586
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a prepped formfield for use in model forms.&quot;&quot;&quot;</span>
11587
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
11588
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">DynamicModelChoiceField</span><span class="p">,</span>
11589
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="s2">&quot;queryset&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
11590
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="c1"># label_lower e.g. &quot;dcim.device&quot;</span>
11591
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="s2">&quot;query_params&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="p">},</span>
11592
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="p">}</span>
11593
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11594
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
11698
+ <span class="normal"><a href="#__codelineno-0-200">200</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="k">def</span> <span class="nf">get_limit_choices_to</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11699
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11700
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="sd"> Limit this field to only objects which are assigned to this model&#39;s content-type.</span>
11701
+ <a id="__codelineno-0-191" name="__codelineno-0-191"></a>
11702
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> Note that this is implemented via specifying `content_types__app_label=` and `content_types__model=`</span>
11703
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> rather than via the more obvious `content_types=ContentType.objects.get_for_model(self.model)`</span>
11704
+ <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> because the latter approach would involve a database query, and in some cases</span>
11705
+ <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> (most notably FilterSet definition) this function is called **before** database migrations can be run.</span>
11706
+ <a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> &quot;&quot;&quot;</span>
11707
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">return</span> <span class="p">{</span>
11708
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="s2">&quot;content_types__app_label&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span>
11709
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="s2">&quot;content_types__model&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">,</span>
11710
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="p">}</span>
11595
11711
  </code></pre></div></td></tr></table></div>
11596
11712
  </details>
11597
11713
  </div>
@@ -11629,7 +11745,8 @@ while role_1 &amp; role_2 are both available for the Location model.</p>
11629
11745
 
11630
11746
  <details class="quote">
11631
11747
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
11632
- <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>
11748
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-150">150</a></span>
11749
+ <span class="normal"><a href="#__codelineno-0-151">151</a></span>
11633
11750
  <span class="normal"><a href="#__codelineno-0-152">152</a></span>
11634
11751
  <span class="normal"><a href="#__codelineno-0-153">153</a></span>
11635
11752
  <span class="normal"><a href="#__codelineno-0-154">154</a></span>
@@ -11648,28 +11765,27 @@ while role_1 &amp; role_2 are both available for the Location model.</p>
11648
11765
  <span class="normal"><a href="#__codelineno-0-167">167</a></span>
11649
11766
  <span class="normal"><a href="#__codelineno-0-168">168</a></span>
11650
11767
  <span class="normal"><a href="#__codelineno-0-169">169</a></span>
11651
- <span class="normal"><a href="#__codelineno-0-170">170</a></span>
11652
- <span class="normal"><a href="#__codelineno-0-171">171</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">class</span> <span class="nc">ForeignKeyWithAutoRelatedName</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">):</span>
11653
- <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11654
- <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> Extend base ForeignKey functionality to create a smarter default `related_name`.</span>
11655
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a>
11656
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> For example, &quot;ip_addresses&quot; instead of &quot;ipaddress_set&quot;, &quot;ipaddresss&quot;, or &quot;ipam_ipaddress_related&quot;.</span>
11657
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a>
11658
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> Primarily useful for cases of abstract base classes that define ForeignKeys, such as</span>
11659
- <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> `nautobot.dcim.models.device_components.ComponentModel`.</span>
11660
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> &quot;&quot;&quot;</span>
11661
- <a id="__codelineno-0-160" name="__codelineno-0-160"></a>
11662
- <a id="__codelineno-0-161" name="__codelineno-0-161"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11663
- <a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="n">related_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11664
- <a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_autogenerate_related_name</span> <span class="o">=</span> <span class="n">related_name</span> <span class="ow">is</span> <span class="kc">None</span>
11665
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a>
11666
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="k">def</span> <span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11667
- <a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11668
- <a id="__codelineno-0-167" name="__codelineno-0-167"></a>
11669
- <a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_autogenerate_related_name</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="p">,</span> <span class="s2">&quot;verbose_name_plural&quot;</span><span class="p">):</span>
11670
- <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="c1"># &quot;IP addresses&quot; -&gt; &quot;ip_addresses&quot;</span>
11671
- <a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">related_name</span> <span class="o">=</span> <span class="s2">&quot;_&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\w+&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">)))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
11672
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">related_name</span> <span class="o">=</span> <span class="n">related_name</span>
11768
+ <span class="normal"><a href="#__codelineno-0-170">170</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="k">class</span> <span class="nc">ForeignKeyWithAutoRelatedName</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">):</span>
11769
+ <a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11770
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> Extend base ForeignKey functionality to create a smarter default `related_name`.</span>
11771
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a>
11772
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> For example, &quot;ip_addresses&quot; instead of &quot;ipaddress_set&quot;, &quot;ipaddresss&quot;, or &quot;ipam_ipaddress_related&quot;.</span>
11773
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a>
11774
+ <a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> Primarily useful for cases of abstract base classes that define ForeignKeys, such as</span>
11775
+ <a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> `nautobot.dcim.models.device_components.ComponentModel`.</span>
11776
+ <a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> &quot;&quot;&quot;</span>
11777
+ <a id="__codelineno-0-159" name="__codelineno-0-159"></a>
11778
+ <a id="__codelineno-0-160" name="__codelineno-0-160"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11779
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="n">related_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11780
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_autogenerate_related_name</span> <span class="o">=</span> <span class="n">related_name</span> <span class="ow">is</span> <span class="kc">None</span>
11781
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a>
11782
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="k">def</span> <span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11783
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11784
+ <a id="__codelineno-0-166" name="__codelineno-0-166"></a>
11785
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_autogenerate_related_name</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="p">,</span> <span class="s2">&quot;verbose_name_plural&quot;</span><span class="p">):</span>
11786
+ <a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="c1"># &quot;IP addresses&quot; -&gt; &quot;ip_addresses&quot;</span>
11787
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="n">related_name</span> <span class="o">=</span> <span class="s2">&quot;_&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\w+&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">)))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
11788
+ <a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">related_name</span> <span class="o">=</span> <span class="n">related_name</span>
11673
11789
  </code></pre></div></td></tr></table></div>
11674
11790
  </details>
11675
11791
 
@@ -11714,17 +11830,7 @@ Replicates ArrayField's base field validation.</p>
11714
11830
 
11715
11831
  <details class="quote">
11716
11832
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
11717
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-265">265</a></span>
11718
- <span class="normal"><a href="#__codelineno-0-266">266</a></span>
11719
- <span class="normal"><a href="#__codelineno-0-267">267</a></span>
11720
- <span class="normal"><a href="#__codelineno-0-268">268</a></span>
11721
- <span class="normal"><a href="#__codelineno-0-269">269</a></span>
11722
- <span class="normal"><a href="#__codelineno-0-270">270</a></span>
11723
- <span class="normal"><a href="#__codelineno-0-271">271</a></span>
11724
- <span class="normal"><a href="#__codelineno-0-272">272</a></span>
11725
- <span class="normal"><a href="#__codelineno-0-273">273</a></span>
11726
- <span class="normal"><a href="#__codelineno-0-274">274</a></span>
11727
- <span class="normal"><a href="#__codelineno-0-275">275</a></span>
11833
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-275">275</a></span>
11728
11834
  <span class="normal"><a href="#__codelineno-0-276">276</a></span>
11729
11835
  <span class="normal"><a href="#__codelineno-0-277">277</a></span>
11730
11836
  <span class="normal"><a href="#__codelineno-0-278">278</a></span>
@@ -11819,112 +11925,122 @@ Replicates ArrayField's base field validation.</p>
11819
11925
  <span class="normal"><a href="#__codelineno-0-367">367</a></span>
11820
11926
  <span class="normal"><a href="#__codelineno-0-368">368</a></span>
11821
11927
  <span class="normal"><a href="#__codelineno-0-369">369</a></span>
11822
- <span class="normal"><a href="#__codelineno-0-370">370</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-265" name="__codelineno-0-265"></a><span class="k">class</span> <span class="nc">JSONArrayField</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">JSONField</span><span class="p">):</span>
11823
- <a id="__codelineno-0-266" name="__codelineno-0-266"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11824
- <a id="__codelineno-0-267" name="__codelineno-0-267"></a><span class="sd"> An ArrayField implementation backed JSON storage.</span>
11825
- <a id="__codelineno-0-268" name="__codelineno-0-268"></a><span class="sd"> Replicates ArrayField&#39;s base field validation.</span>
11826
- <a id="__codelineno-0-269" name="__codelineno-0-269"></a><span class="sd"> &quot;&quot;&quot;</span>
11827
- <a id="__codelineno-0-270" name="__codelineno-0-270"></a>
11828
- <a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="n">_default_hint</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;list&quot;</span><span class="p">,</span> <span class="s2">&quot;[]&quot;</span><span class="p">)</span>
11829
- <a id="__codelineno-0-272" name="__codelineno-0-272"></a>
11830
- <a id="__codelineno-0-273" name="__codelineno-0-273"></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">base_field</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11831
- <a id="__codelineno-0-274" name="__codelineno-0-274"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base_field</span><span class="p">,</span> <span class="n">JSONArrayField</span><span class="p">):</span>
11832
- <a id="__codelineno-0-275" name="__codelineno-0-275"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;cannot nest JSONArrayFields&quot;</span><span class="p">)</span>
11833
- <a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span> <span class="o">=</span> <span class="n">base_field</span>
11834
- <a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11835
- <a id="__codelineno-0-278" name="__codelineno-0-278"></a>
11836
- <a id="__codelineno-0-279" name="__codelineno-0-279"></a> <span class="k">def</span> <span class="nf">set_attributes_from_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
11837
- <a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">set_attributes_from_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
11838
- <a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">set_attributes_from_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
11928
+ <span class="normal"><a href="#__codelineno-0-370">370</a></span>
11929
+ <span class="normal"><a href="#__codelineno-0-371">371</a></span>
11930
+ <span class="normal"><a href="#__codelineno-0-372">372</a></span>
11931
+ <span class="normal"><a href="#__codelineno-0-373">373</a></span>
11932
+ <span class="normal"><a href="#__codelineno-0-374">374</a></span>
11933
+ <span class="normal"><a href="#__codelineno-0-375">375</a></span>
11934
+ <span class="normal"><a href="#__codelineno-0-376">376</a></span>
11935
+ <span class="normal"><a href="#__codelineno-0-377">377</a></span>
11936
+ <span class="normal"><a href="#__codelineno-0-378">378</a></span>
11937
+ <span class="normal"><a href="#__codelineno-0-379">379</a></span>
11938
+ <span class="normal"><a href="#__codelineno-0-380">380</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-275" name="__codelineno-0-275"></a><span class="k">class</span> <span class="nc">JSONArrayField</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">JSONField</span><span class="p">):</span>
11939
+ <a id="__codelineno-0-276" name="__codelineno-0-276"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11940
+ <a id="__codelineno-0-277" name="__codelineno-0-277"></a><span class="sd"> An ArrayField implementation backed JSON storage.</span>
11941
+ <a id="__codelineno-0-278" name="__codelineno-0-278"></a><span class="sd"> Replicates ArrayField&#39;s base field validation.</span>
11942
+ <a id="__codelineno-0-279" name="__codelineno-0-279"></a><span class="sd"> &quot;&quot;&quot;</span>
11943
+ <a id="__codelineno-0-280" name="__codelineno-0-280"></a>
11944
+ <a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">_default_hint</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;list&quot;</span><span class="p">,</span> <span class="s2">&quot;[]&quot;</span><span class="p">)</span>
11839
11945
  <a id="__codelineno-0-282" name="__codelineno-0-282"></a>
11840
- <a id="__codelineno-0-283" name="__codelineno-0-283"></a> <span class="nd">@property</span>
11841
- <a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11842
- <a id="__codelineno-0-285" name="__codelineno-0-285"></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON Array of </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">description</span><span class="si">}</span><span class="s2">&quot;</span>
11843
- <a id="__codelineno-0-286" name="__codelineno-0-286"></a>
11844
- <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">def</span> <span class="nf">get_prep_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
11845
- <a id="__codelineno-0-288" name="__codelineno-0-288"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Perform preliminary non-db specific value checks and conversions.&quot;&quot;&quot;</span>
11846
- <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11847
- <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
11848
- <a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;value </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2"> is not list or tuple&quot;</span><span class="p">)</span>
11849
- <a id="__codelineno-0-292" name="__codelineno-0-292"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
11850
- <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
11851
- <a id="__codelineno-0-294" name="__codelineno-0-294"></a>
11852
- <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11853
- <a id="__codelineno-0-296" name="__codelineno-0-296"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11854
- <a id="__codelineno-0-297" name="__codelineno-0-297"></a><span class="sd"> Return enough information to recreate the field as a 4-tuple:</span>
11855
- <a id="__codelineno-0-298" name="__codelineno-0-298"></a><span class="sd"> * The name of the field on the model, if contribute_to_class() has</span>
11856
- <a id="__codelineno-0-299" name="__codelineno-0-299"></a><span class="sd"> been run.</span>
11857
- <a id="__codelineno-0-300" name="__codelineno-0-300"></a><span class="sd"> * The import path of the field, including the class:e.g.</span>
11858
- <a id="__codelineno-0-301" name="__codelineno-0-301"></a><span class="sd"> django.db.models.IntegerField This should be the most portable</span>
11859
- <a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="sd"> version, so less specific may be better.</span>
11860
- <a id="__codelineno-0-303" name="__codelineno-0-303"></a><span class="sd"> * A list of positional arguments.</span>
11861
- <a id="__codelineno-0-304" name="__codelineno-0-304"></a><span class="sd"> * A dict of keyword arguments.</span>
11862
- <a id="__codelineno-0-305" name="__codelineno-0-305"></a><span class="sd"> &quot;&quot;&quot;</span>
11863
- <a id="__codelineno-0-306" name="__codelineno-0-306"></a> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
11864
- <a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
11865
- <a id="__codelineno-0-308" name="__codelineno-0-308"></a> <span class="p">{</span>
11866
- <a id="__codelineno-0-309" name="__codelineno-0-309"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">clone</span><span class="p">(),</span>
11867
- <a id="__codelineno-0-310" name="__codelineno-0-310"></a> <span class="p">}</span>
11868
- <a id="__codelineno-0-311" name="__codelineno-0-311"></a> <span class="p">)</span>
11869
- <a id="__codelineno-0-312" name="__codelineno-0-312"></a> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
11870
- <a id="__codelineno-0-313" name="__codelineno-0-313"></a>
11871
- <a id="__codelineno-0-314" name="__codelineno-0-314"></a> <span class="k">def</span> <span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
11872
- <a id="__codelineno-0-315" name="__codelineno-0-315"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11873
- <a id="__codelineno-0-316" name="__codelineno-0-316"></a><span class="sd"> Convert `value` into JSON, raising django.core.exceptions.ValidationError</span>
11874
- <a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> if the data can&#39;t be converted. Return the converted value.</span>
11875
- <a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> &quot;&quot;&quot;</span>
11876
- <a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
11877
- <a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="k">try</span><span class="p">:</span>
11878
- <a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="c1"># Assume we&#39;re deserializing</span>
11879
- <a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="n">vals</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
11880
- <a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">]</span>
11881
- <a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
11882
- <a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
11883
- <a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="k">return</span> <span class="n">value</span>
11884
- <a id="__codelineno-0-327" name="__codelineno-0-327"></a>
11885
- <a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="k">def</span> <span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
11886
- <a id="__codelineno-0-329" name="__codelineno-0-329"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11887
- <a id="__codelineno-0-330" name="__codelineno-0-330"></a><span class="sd"> Return a string value of this field from the passed obj.</span>
11888
- <a id="__codelineno-0-331" name="__codelineno-0-331"></a><span class="sd"> This is used by the serialization framework.</span>
11889
- <a id="__codelineno-0-332" name="__codelineno-0-332"></a><span class="sd"> &quot;&quot;&quot;</span>
11890
- <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
11891
- <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="n">vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
11892
- <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="n">base_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span>
11893
- <a id="__codelineno-0-336" name="__codelineno-0-336"></a>
11894
- <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">:</span>
11895
- <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
11896
- <a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
11897
- <a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="k">else</span><span class="p">:</span>
11898
- <a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">AttributeSetter</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
11899
- <a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">value_to_string</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
11900
- <a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
11901
- <a id="__codelineno-0-344" name="__codelineno-0-344"></a>
11902
- <a id="__codelineno-0-345" name="__codelineno-0-345"></a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">):</span>
11903
- <a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11904
- <a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> Validate `value` and raise ValidationError if necessary.</span>
11905
- <a id="__codelineno-0-348" name="__codelineno-0-348"></a><span class="sd"> &quot;&quot;&quot;</span>
11906
- <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
11907
- <a id="__codelineno-0-350" name="__codelineno-0-350"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
11908
- <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
11909
- <a id="__codelineno-0-352" name="__codelineno-0-352"></a>
11910
- <a id="__codelineno-0-353" name="__codelineno-0-353"></a> <span class="k">def</span> <span class="nf">run_validators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
11911
- <a id="__codelineno-0-354" name="__codelineno-0-354"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11912
- <a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="sd"> Runs all validators against `value` and raise ValidationError if necessary.</span>
11913
- <a id="__codelineno-0-356" name="__codelineno-0-356"></a><span class="sd"> Some validators can&#39;t be created at field initialization time.</span>
11914
- <a id="__codelineno-0-357" name="__codelineno-0-357"></a><span class="sd"> &quot;&quot;&quot;</span>
11915
- <a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
11916
- <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
11917
- <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
11918
- <a id="__codelineno-0-361" name="__codelineno-0-361"></a>
11919
- <a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11920
- <a id="__codelineno-0-363" name="__codelineno-0-363"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a django.forms.Field instance for this field.&quot;&quot;&quot;</span>
11921
- <a id="__codelineno-0-364" name="__codelineno-0-364"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
11922
- <a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="o">**</span><span class="p">{</span>
11923
- <a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">JSONArrayFormField</span><span class="p">,</span>
11924
- <a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">formfield</span><span class="p">(),</span>
11925
- <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
11926
- <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="p">}</span>
11927
- <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="p">)</span>
11946
+ <a id="__codelineno-0-283" name="__codelineno-0-283"></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">base_field</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
11947
+ <a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base_field</span><span class="p">,</span> <span class="n">JSONArrayField</span><span class="p">):</span>
11948
+ <a id="__codelineno-0-285" name="__codelineno-0-285"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;cannot nest JSONArrayFields&quot;</span><span class="p">)</span>
11949
+ <a id="__codelineno-0-286" name="__codelineno-0-286"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span> <span class="o">=</span> <span class="n">base_field</span>
11950
+ <a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
11951
+ <a id="__codelineno-0-288" name="__codelineno-0-288"></a>
11952
+ <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">def</span> <span class="nf">set_attributes_from_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
11953
+ <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">set_attributes_from_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
11954
+ <a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">set_attributes_from_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
11955
+ <a id="__codelineno-0-292" name="__codelineno-0-292"></a>
11956
+ <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="nd">@property</span>
11957
+ <a id="__codelineno-0-294" name="__codelineno-0-294"></a> <span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11958
+ <a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON Array of </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">description</span><span class="si">}</span><span class="s2">&quot;</span>
11959
+ <a id="__codelineno-0-296" name="__codelineno-0-296"></a>
11960
+ <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="k">def</span> <span class="nf">get_prep_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
11961
+ <a id="__codelineno-0-298" name="__codelineno-0-298"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Perform preliminary non-db specific value checks and conversions.&quot;&quot;&quot;</span>
11962
+ <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
11963
+ <a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
11964
+ <a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;value </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2"> is not list or tuple&quot;</span><span class="p">)</span>
11965
+ <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
11966
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
11967
+ <a id="__codelineno-0-304" name="__codelineno-0-304"></a>
11968
+ <a id="__codelineno-0-305" name="__codelineno-0-305"></a> <span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11969
+ <a id="__codelineno-0-306" name="__codelineno-0-306"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11970
+ <a id="__codelineno-0-307" name="__codelineno-0-307"></a><span class="sd"> Return enough information to recreate the field as a 4-tuple:</span>
11971
+ <a id="__codelineno-0-308" name="__codelineno-0-308"></a><span class="sd"> * The name of the field on the model, if contribute_to_class() has</span>
11972
+ <a id="__codelineno-0-309" name="__codelineno-0-309"></a><span class="sd"> been run.</span>
11973
+ <a id="__codelineno-0-310" name="__codelineno-0-310"></a><span class="sd"> * The import path of the field, including the class:e.g.</span>
11974
+ <a id="__codelineno-0-311" name="__codelineno-0-311"></a><span class="sd"> django.db.models.IntegerField This should be the most portable</span>
11975
+ <a id="__codelineno-0-312" name="__codelineno-0-312"></a><span class="sd"> version, so less specific may be better.</span>
11976
+ <a id="__codelineno-0-313" name="__codelineno-0-313"></a><span class="sd"> * A list of positional arguments.</span>
11977
+ <a id="__codelineno-0-314" name="__codelineno-0-314"></a><span class="sd"> * A dict of keyword arguments.</span>
11978
+ <a id="__codelineno-0-315" name="__codelineno-0-315"></a><span class="sd"> &quot;&quot;&quot;</span>
11979
+ <a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
11980
+ <a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
11981
+ <a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="p">{</span>
11982
+ <a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">clone</span><span class="p">(),</span>
11983
+ <a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="p">}</span>
11984
+ <a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="p">)</span>
11985
+ <a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
11986
+ <a id="__codelineno-0-323" name="__codelineno-0-323"></a>
11987
+ <a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="k">def</span> <span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
11988
+ <a id="__codelineno-0-325" name="__codelineno-0-325"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11989
+ <a id="__codelineno-0-326" name="__codelineno-0-326"></a><span class="sd"> Convert `value` into JSON, raising django.core.exceptions.ValidationError</span>
11990
+ <a id="__codelineno-0-327" name="__codelineno-0-327"></a><span class="sd"> if the data can&#39;t be converted. Return the converted value.</span>
11991
+ <a id="__codelineno-0-328" name="__codelineno-0-328"></a><span class="sd"> &quot;&quot;&quot;</span>
11992
+ <a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
11993
+ <a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">try</span><span class="p">:</span>
11994
+ <a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="c1"># Assume we&#39;re deserializing</span>
11995
+ <a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">vals</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
11996
+ <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">]</span>
11997
+ <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
11998
+ <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
11999
+ <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="k">return</span> <span class="n">value</span>
12000
+ <a id="__codelineno-0-337" name="__codelineno-0-337"></a>
12001
+ <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="k">def</span> <span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
12002
+ <a id="__codelineno-0-339" name="__codelineno-0-339"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12003
+ <a id="__codelineno-0-340" name="__codelineno-0-340"></a><span class="sd"> Return a string value of this field from the passed obj.</span>
12004
+ <a id="__codelineno-0-341" name="__codelineno-0-341"></a><span class="sd"> This is used by the serialization framework.</span>
12005
+ <a id="__codelineno-0-342" name="__codelineno-0-342"></a><span class="sd"> &quot;&quot;&quot;</span>
12006
+ <a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
12007
+ <a id="__codelineno-0-344" name="__codelineno-0-344"></a> <span class="n">vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
12008
+ <a id="__codelineno-0-345" name="__codelineno-0-345"></a> <span class="n">base_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span>
12009
+ <a id="__codelineno-0-346" name="__codelineno-0-346"></a>
12010
+ <a id="__codelineno-0-347" name="__codelineno-0-347"></a> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">:</span>
12011
+ <a id="__codelineno-0-348" name="__codelineno-0-348"></a> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
12012
+ <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
12013
+ <a id="__codelineno-0-350" name="__codelineno-0-350"></a> <span class="k">else</span><span class="p">:</span>
12014
+ <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">AttributeSetter</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
12015
+ <a id="__codelineno-0-352" name="__codelineno-0-352"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">value_to_string</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
12016
+ <a id="__codelineno-0-353" name="__codelineno-0-353"></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
12017
+ <a id="__codelineno-0-354" name="__codelineno-0-354"></a>
12018
+ <a id="__codelineno-0-355" name="__codelineno-0-355"></a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">):</span>
12019
+ <a id="__codelineno-0-356" name="__codelineno-0-356"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12020
+ <a id="__codelineno-0-357" name="__codelineno-0-357"></a><span class="sd"> Validate `value` and raise ValidationError if necessary.</span>
12021
+ <a id="__codelineno-0-358" name="__codelineno-0-358"></a><span class="sd"> &quot;&quot;&quot;</span>
12022
+ <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
12023
+ <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
12024
+ <a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
12025
+ <a id="__codelineno-0-362" name="__codelineno-0-362"></a>
12026
+ <a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="k">def</span> <span class="nf">run_validators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12027
+ <a id="__codelineno-0-364" name="__codelineno-0-364"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12028
+ <a id="__codelineno-0-365" name="__codelineno-0-365"></a><span class="sd"> Runs all validators against `value` and raise ValidationError if necessary.</span>
12029
+ <a id="__codelineno-0-366" name="__codelineno-0-366"></a><span class="sd"> Some validators can&#39;t be created at field initialization time.</span>
12030
+ <a id="__codelineno-0-367" name="__codelineno-0-367"></a><span class="sd"> &quot;&quot;&quot;</span>
12031
+ <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12032
+ <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
12033
+ <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
12034
+ <a id="__codelineno-0-371" name="__codelineno-0-371"></a>
12035
+ <a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
12036
+ <a id="__codelineno-0-373" name="__codelineno-0-373"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a django.forms.Field instance for this field.&quot;&quot;&quot;</span>
12037
+ <a id="__codelineno-0-374" name="__codelineno-0-374"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
12038
+ <a id="__codelineno-0-375" name="__codelineno-0-375"></a> <span class="o">**</span><span class="p">{</span>
12039
+ <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">JSONArrayFormField</span><span class="p">,</span>
12040
+ <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">formfield</span><span class="p">(),</span>
12041
+ <a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
12042
+ <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="p">}</span>
12043
+ <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="p">)</span>
11928
12044
  </code></pre></div></td></tr></table></div>
11929
12045
  </details>
11930
12046
 
@@ -11968,41 +12084,41 @@ Replicates ArrayField's base field validation.</p>
11968
12084
  </details>
11969
12085
  <details class="quote">
11970
12086
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
11971
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-295">295</a></span>
11972
- <span class="normal"><a href="#__codelineno-0-296">296</a></span>
11973
- <span class="normal"><a href="#__codelineno-0-297">297</a></span>
11974
- <span class="normal"><a href="#__codelineno-0-298">298</a></span>
11975
- <span class="normal"><a href="#__codelineno-0-299">299</a></span>
11976
- <span class="normal"><a href="#__codelineno-0-300">300</a></span>
11977
- <span class="normal"><a href="#__codelineno-0-301">301</a></span>
11978
- <span class="normal"><a href="#__codelineno-0-302">302</a></span>
11979
- <span class="normal"><a href="#__codelineno-0-303">303</a></span>
11980
- <span class="normal"><a href="#__codelineno-0-304">304</a></span>
11981
- <span class="normal"><a href="#__codelineno-0-305">305</a></span>
12087
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-305">305</a></span>
11982
12088
  <span class="normal"><a href="#__codelineno-0-306">306</a></span>
11983
12089
  <span class="normal"><a href="#__codelineno-0-307">307</a></span>
11984
12090
  <span class="normal"><a href="#__codelineno-0-308">308</a></span>
11985
12091
  <span class="normal"><a href="#__codelineno-0-309">309</a></span>
11986
12092
  <span class="normal"><a href="#__codelineno-0-310">310</a></span>
11987
12093
  <span class="normal"><a href="#__codelineno-0-311">311</a></span>
11988
- <span class="normal"><a href="#__codelineno-0-312">312</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-295" name="__codelineno-0-295"></a><span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
11989
- <a id="__codelineno-0-296" name="__codelineno-0-296"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11990
- <a id="__codelineno-0-297" name="__codelineno-0-297"></a><span class="sd"> Return enough information to recreate the field as a 4-tuple:</span>
11991
- <a id="__codelineno-0-298" name="__codelineno-0-298"></a><span class="sd"> * The name of the field on the model, if contribute_to_class() has</span>
11992
- <a id="__codelineno-0-299" name="__codelineno-0-299"></a><span class="sd"> been run.</span>
11993
- <a id="__codelineno-0-300" name="__codelineno-0-300"></a><span class="sd"> * The import path of the field, including the class:e.g.</span>
11994
- <a id="__codelineno-0-301" name="__codelineno-0-301"></a><span class="sd"> django.db.models.IntegerField This should be the most portable</span>
11995
- <a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="sd"> version, so less specific may be better.</span>
11996
- <a id="__codelineno-0-303" name="__codelineno-0-303"></a><span class="sd"> * A list of positional arguments.</span>
11997
- <a id="__codelineno-0-304" name="__codelineno-0-304"></a><span class="sd"> * A dict of keyword arguments.</span>
11998
- <a id="__codelineno-0-305" name="__codelineno-0-305"></a><span class="sd"> &quot;&quot;&quot;</span>
11999
- <a id="__codelineno-0-306" name="__codelineno-0-306"></a> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
12000
- <a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
12001
- <a id="__codelineno-0-308" name="__codelineno-0-308"></a> <span class="p">{</span>
12002
- <a id="__codelineno-0-309" name="__codelineno-0-309"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">clone</span><span class="p">(),</span>
12003
- <a id="__codelineno-0-310" name="__codelineno-0-310"></a> <span class="p">}</span>
12004
- <a id="__codelineno-0-311" name="__codelineno-0-311"></a> <span class="p">)</span>
12005
- <a id="__codelineno-0-312" name="__codelineno-0-312"></a> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
12094
+ <span class="normal"><a href="#__codelineno-0-312">312</a></span>
12095
+ <span class="normal"><a href="#__codelineno-0-313">313</a></span>
12096
+ <span class="normal"><a href="#__codelineno-0-314">314</a></span>
12097
+ <span class="normal"><a href="#__codelineno-0-315">315</a></span>
12098
+ <span class="normal"><a href="#__codelineno-0-316">316</a></span>
12099
+ <span class="normal"><a href="#__codelineno-0-317">317</a></span>
12100
+ <span class="normal"><a href="#__codelineno-0-318">318</a></span>
12101
+ <span class="normal"><a href="#__codelineno-0-319">319</a></span>
12102
+ <span class="normal"><a href="#__codelineno-0-320">320</a></span>
12103
+ <span class="normal"><a href="#__codelineno-0-321">321</a></span>
12104
+ <span class="normal"><a href="#__codelineno-0-322">322</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-305" name="__codelineno-0-305"></a><span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12105
+ <a id="__codelineno-0-306" name="__codelineno-0-306"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12106
+ <a id="__codelineno-0-307" name="__codelineno-0-307"></a><span class="sd"> Return enough information to recreate the field as a 4-tuple:</span>
12107
+ <a id="__codelineno-0-308" name="__codelineno-0-308"></a><span class="sd"> * The name of the field on the model, if contribute_to_class() has</span>
12108
+ <a id="__codelineno-0-309" name="__codelineno-0-309"></a><span class="sd"> been run.</span>
12109
+ <a id="__codelineno-0-310" name="__codelineno-0-310"></a><span class="sd"> * The import path of the field, including the class:e.g.</span>
12110
+ <a id="__codelineno-0-311" name="__codelineno-0-311"></a><span class="sd"> django.db.models.IntegerField This should be the most portable</span>
12111
+ <a id="__codelineno-0-312" name="__codelineno-0-312"></a><span class="sd"> version, so less specific may be better.</span>
12112
+ <a id="__codelineno-0-313" name="__codelineno-0-313"></a><span class="sd"> * A list of positional arguments.</span>
12113
+ <a id="__codelineno-0-314" name="__codelineno-0-314"></a><span class="sd"> * A dict of keyword arguments.</span>
12114
+ <a id="__codelineno-0-315" name="__codelineno-0-315"></a><span class="sd"> &quot;&quot;&quot;</span>
12115
+ <a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
12116
+ <a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
12117
+ <a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="p">{</span>
12118
+ <a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">clone</span><span class="p">(),</span>
12119
+ <a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="p">}</span>
12120
+ <a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="p">)</span>
12121
+ <a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
12006
12122
  </code></pre></div></td></tr></table></div>
12007
12123
  </details>
12008
12124
  </div>
@@ -12026,23 +12142,23 @@ Replicates ArrayField's base field validation.</p>
12026
12142
 
12027
12143
  <details class="quote">
12028
12144
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12029
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-362">362</a></span>
12030
- <span class="normal"><a href="#__codelineno-0-363">363</a></span>
12031
- <span class="normal"><a href="#__codelineno-0-364">364</a></span>
12032
- <span class="normal"><a href="#__codelineno-0-365">365</a></span>
12033
- <span class="normal"><a href="#__codelineno-0-366">366</a></span>
12034
- <span class="normal"><a href="#__codelineno-0-367">367</a></span>
12035
- <span class="normal"><a href="#__codelineno-0-368">368</a></span>
12036
- <span class="normal"><a href="#__codelineno-0-369">369</a></span>
12037
- <span class="normal"><a href="#__codelineno-0-370">370</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-362" name="__codelineno-0-362"></a><span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
12038
- <a id="__codelineno-0-363" name="__codelineno-0-363"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a django.forms.Field instance for this field.&quot;&quot;&quot;</span>
12039
- <a id="__codelineno-0-364" name="__codelineno-0-364"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
12040
- <a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="o">**</span><span class="p">{</span>
12041
- <a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">JSONArrayFormField</span><span class="p">,</span>
12042
- <a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">formfield</span><span class="p">(),</span>
12043
- <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
12044
- <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="p">}</span>
12045
- <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="p">)</span>
12145
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-372">372</a></span>
12146
+ <span class="normal"><a href="#__codelineno-0-373">373</a></span>
12147
+ <span class="normal"><a href="#__codelineno-0-374">374</a></span>
12148
+ <span class="normal"><a href="#__codelineno-0-375">375</a></span>
12149
+ <span class="normal"><a href="#__codelineno-0-376">376</a></span>
12150
+ <span class="normal"><a href="#__codelineno-0-377">377</a></span>
12151
+ <span class="normal"><a href="#__codelineno-0-378">378</a></span>
12152
+ <span class="normal"><a href="#__codelineno-0-379">379</a></span>
12153
+ <span class="normal"><a href="#__codelineno-0-380">380</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-372" name="__codelineno-0-372"></a><span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
12154
+ <a id="__codelineno-0-373" name="__codelineno-0-373"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a django.forms.Field instance for this field.&quot;&quot;&quot;</span>
12155
+ <a id="__codelineno-0-374" name="__codelineno-0-374"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
12156
+ <a id="__codelineno-0-375" name="__codelineno-0-375"></a> <span class="o">**</span><span class="p">{</span>
12157
+ <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">JSONArrayFormField</span><span class="p">,</span>
12158
+ <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="s2">&quot;base_field&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">formfield</span><span class="p">(),</span>
12159
+ <a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
12160
+ <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="p">}</span>
12161
+ <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="p">)</span>
12046
12162
  </code></pre></div></td></tr></table></div>
12047
12163
  </details>
12048
12164
  </div>
@@ -12066,19 +12182,19 @@ Replicates ArrayField's base field validation.</p>
12066
12182
 
12067
12183
  <details class="quote">
12068
12184
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12069
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-287">287</a></span>
12070
- <span class="normal"><a href="#__codelineno-0-288">288</a></span>
12071
- <span class="normal"><a href="#__codelineno-0-289">289</a></span>
12072
- <span class="normal"><a href="#__codelineno-0-290">290</a></span>
12073
- <span class="normal"><a href="#__codelineno-0-291">291</a></span>
12074
- <span class="normal"><a href="#__codelineno-0-292">292</a></span>
12075
- <span class="normal"><a href="#__codelineno-0-293">293</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-287" name="__codelineno-0-287"></a><span class="k">def</span> <span class="nf">get_prep_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12076
- <a id="__codelineno-0-288" name="__codelineno-0-288"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Perform preliminary non-db specific value checks and conversions.&quot;&quot;&quot;</span>
12077
- <a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
12078
- <a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
12079
- <a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;value </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2"> is not list or tuple&quot;</span><span class="p">)</span>
12080
- <a id="__codelineno-0-292" name="__codelineno-0-292"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
12081
- <a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12185
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-297">297</a></span>
12186
+ <span class="normal"><a href="#__codelineno-0-298">298</a></span>
12187
+ <span class="normal"><a href="#__codelineno-0-299">299</a></span>
12188
+ <span class="normal"><a href="#__codelineno-0-300">300</a></span>
12189
+ <span class="normal"><a href="#__codelineno-0-301">301</a></span>
12190
+ <span class="normal"><a href="#__codelineno-0-302">302</a></span>
12191
+ <span class="normal"><a href="#__codelineno-0-303">303</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-297" name="__codelineno-0-297"></a><span class="k">def</span> <span class="nf">get_prep_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12192
+ <a id="__codelineno-0-298" name="__codelineno-0-298"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Perform preliminary non-db specific value checks and conversions.&quot;&quot;&quot;</span>
12193
+ <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
12194
+ <a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
12195
+ <a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;value </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2"> is not list or tuple&quot;</span><span class="p">)</span>
12196
+ <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
12197
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12082
12198
  </code></pre></div></td></tr></table></div>
12083
12199
  </details>
12084
12200
  </div>
@@ -12103,21 +12219,21 @@ Some validators can't be created at field initialization time.</p>
12103
12219
 
12104
12220
  <details class="quote">
12105
12221
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12106
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-353">353</a></span>
12107
- <span class="normal"><a href="#__codelineno-0-354">354</a></span>
12108
- <span class="normal"><a href="#__codelineno-0-355">355</a></span>
12109
- <span class="normal"><a href="#__codelineno-0-356">356</a></span>
12110
- <span class="normal"><a href="#__codelineno-0-357">357</a></span>
12111
- <span class="normal"><a href="#__codelineno-0-358">358</a></span>
12112
- <span class="normal"><a href="#__codelineno-0-359">359</a></span>
12113
- <span class="normal"><a href="#__codelineno-0-360">360</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-353" name="__codelineno-0-353"></a><span class="k">def</span> <span class="nf">run_validators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12114
- <a id="__codelineno-0-354" name="__codelineno-0-354"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12115
- <a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="sd"> Runs all validators against `value` and raise ValidationError if necessary.</span>
12116
- <a id="__codelineno-0-356" name="__codelineno-0-356"></a><span class="sd"> Some validators can&#39;t be created at field initialization time.</span>
12117
- <a id="__codelineno-0-357" name="__codelineno-0-357"></a><span class="sd"> &quot;&quot;&quot;</span>
12118
- <a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12119
- <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
12120
- <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
12222
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-363">363</a></span>
12223
+ <span class="normal"><a href="#__codelineno-0-364">364</a></span>
12224
+ <span class="normal"><a href="#__codelineno-0-365">365</a></span>
12225
+ <span class="normal"><a href="#__codelineno-0-366">366</a></span>
12226
+ <span class="normal"><a href="#__codelineno-0-367">367</a></span>
12227
+ <span class="normal"><a href="#__codelineno-0-368">368</a></span>
12228
+ <span class="normal"><a href="#__codelineno-0-369">369</a></span>
12229
+ <span class="normal"><a href="#__codelineno-0-370">370</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-363" name="__codelineno-0-363"></a><span class="k">def</span> <span class="nf">run_validators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12230
+ <a id="__codelineno-0-364" name="__codelineno-0-364"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12231
+ <a id="__codelineno-0-365" name="__codelineno-0-365"></a><span class="sd"> Runs all validators against `value` and raise ValidationError if necessary.</span>
12232
+ <a id="__codelineno-0-366" name="__codelineno-0-366"></a><span class="sd"> Some validators can&#39;t be created at field initialization time.</span>
12233
+ <a id="__codelineno-0-367" name="__codelineno-0-367"></a><span class="sd"> &quot;&quot;&quot;</span>
12234
+ <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12235
+ <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
12236
+ <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
12121
12237
  </code></pre></div></td></tr></table></div>
12122
12238
  </details>
12123
12239
  </div>
@@ -12142,31 +12258,31 @@ if the data can't be converted. Return the converted value.</p>
12142
12258
 
12143
12259
  <details class="quote">
12144
12260
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12145
- <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>
12146
- <span class="normal"><a href="#__codelineno-0-315">315</a></span>
12147
- <span class="normal"><a href="#__codelineno-0-316">316</a></span>
12148
- <span class="normal"><a href="#__codelineno-0-317">317</a></span>
12149
- <span class="normal"><a href="#__codelineno-0-318">318</a></span>
12150
- <span class="normal"><a href="#__codelineno-0-319">319</a></span>
12151
- <span class="normal"><a href="#__codelineno-0-320">320</a></span>
12152
- <span class="normal"><a href="#__codelineno-0-321">321</a></span>
12153
- <span class="normal"><a href="#__codelineno-0-322">322</a></span>
12154
- <span class="normal"><a href="#__codelineno-0-323">323</a></span>
12155
- <span class="normal"><a href="#__codelineno-0-324">324</a></span>
12261
+ <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>
12156
12262
  <span class="normal"><a href="#__codelineno-0-325">325</a></span>
12157
- <span class="normal"><a href="#__codelineno-0-326">326</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">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12158
- <a id="__codelineno-0-315" name="__codelineno-0-315"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12159
- <a id="__codelineno-0-316" name="__codelineno-0-316"></a><span class="sd"> Convert `value` into JSON, raising django.core.exceptions.ValidationError</span>
12160
- <a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> if the data can&#39;t be converted. Return the converted value.</span>
12161
- <a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> &quot;&quot;&quot;</span>
12162
- <a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
12163
- <a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="k">try</span><span class="p">:</span>
12164
- <a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="c1"># Assume we&#39;re deserializing</span>
12165
- <a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="n">vals</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12166
- <a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">]</span>
12167
- <a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
12168
- <a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
12169
- <a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="k">return</span> <span class="n">value</span>
12263
+ <span class="normal"><a href="#__codelineno-0-326">326</a></span>
12264
+ <span class="normal"><a href="#__codelineno-0-327">327</a></span>
12265
+ <span class="normal"><a href="#__codelineno-0-328">328</a></span>
12266
+ <span class="normal"><a href="#__codelineno-0-329">329</a></span>
12267
+ <span class="normal"><a href="#__codelineno-0-330">330</a></span>
12268
+ <span class="normal"><a href="#__codelineno-0-331">331</a></span>
12269
+ <span class="normal"><a href="#__codelineno-0-332">332</a></span>
12270
+ <span class="normal"><a href="#__codelineno-0-333">333</a></span>
12271
+ <span class="normal"><a href="#__codelineno-0-334">334</a></span>
12272
+ <span class="normal"><a href="#__codelineno-0-335">335</a></span>
12273
+ <span class="normal"><a href="#__codelineno-0-336">336</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">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
12274
+ <a id="__codelineno-0-325" name="__codelineno-0-325"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12275
+ <a id="__codelineno-0-326" name="__codelineno-0-326"></a><span class="sd"> Convert `value` into JSON, raising django.core.exceptions.ValidationError</span>
12276
+ <a id="__codelineno-0-327" name="__codelineno-0-327"></a><span class="sd"> if the data can&#39;t be converted. Return the converted value.</span>
12277
+ <a id="__codelineno-0-328" name="__codelineno-0-328"></a><span class="sd"> &quot;&quot;&quot;</span>
12278
+ <a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
12279
+ <a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">try</span><span class="p">:</span>
12280
+ <a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="c1"># Assume we&#39;re deserializing</span>
12281
+ <a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">vals</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
12282
+ <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">]</span>
12283
+ <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
12284
+ <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
12285
+ <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="k">return</span> <span class="n">value</span>
12170
12286
  </code></pre></div></td></tr></table></div>
12171
12287
  </details>
12172
12288
  </div>
@@ -12190,19 +12306,19 @@ if the data can't be converted. Return the converted value.</p>
12190
12306
 
12191
12307
  <details class="quote">
12192
12308
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12193
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-345">345</a></span>
12194
- <span class="normal"><a href="#__codelineno-0-346">346</a></span>
12195
- <span class="normal"><a href="#__codelineno-0-347">347</a></span>
12196
- <span class="normal"><a href="#__codelineno-0-348">348</a></span>
12197
- <span class="normal"><a href="#__codelineno-0-349">349</a></span>
12198
- <span class="normal"><a href="#__codelineno-0-350">350</a></span>
12199
- <span class="normal"><a href="#__codelineno-0-351">351</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-345" name="__codelineno-0-345"></a><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">):</span>
12200
- <a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12201
- <a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> Validate `value` and raise ValidationError if necessary.</span>
12202
- <a id="__codelineno-0-348" name="__codelineno-0-348"></a><span class="sd"> &quot;&quot;&quot;</span>
12203
- <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
12204
- <a id="__codelineno-0-350" name="__codelineno-0-350"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
12205
- <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
12309
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-355">355</a></span>
12310
+ <span class="normal"><a href="#__codelineno-0-356">356</a></span>
12311
+ <span class="normal"><a href="#__codelineno-0-357">357</a></span>
12312
+ <span class="normal"><a href="#__codelineno-0-358">358</a></span>
12313
+ <span class="normal"><a href="#__codelineno-0-359">359</a></span>
12314
+ <span class="normal"><a href="#__codelineno-0-360">360</a></span>
12315
+ <span class="normal"><a href="#__codelineno-0-361">361</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">):</span>
12316
+ <a id="__codelineno-0-356" name="__codelineno-0-356"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12317
+ <a id="__codelineno-0-357" name="__codelineno-0-357"></a><span class="sd"> Validate `value` and raise ValidationError if necessary.</span>
12318
+ <a id="__codelineno-0-358" name="__codelineno-0-358"></a><span class="sd"> &quot;&quot;&quot;</span>
12319
+ <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
12320
+ <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
12321
+ <a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
12206
12322
  </code></pre></div></td></tr></table></div>
12207
12323
  </details>
12208
12324
  </div>
@@ -12227,37 +12343,37 @@ This is used by the serialization framework.</p>
12227
12343
 
12228
12344
  <details class="quote">
12229
12345
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12230
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-328">328</a></span>
12231
- <span class="normal"><a href="#__codelineno-0-329">329</a></span>
12232
- <span class="normal"><a href="#__codelineno-0-330">330</a></span>
12233
- <span class="normal"><a href="#__codelineno-0-331">331</a></span>
12234
- <span class="normal"><a href="#__codelineno-0-332">332</a></span>
12235
- <span class="normal"><a href="#__codelineno-0-333">333</a></span>
12236
- <span class="normal"><a href="#__codelineno-0-334">334</a></span>
12237
- <span class="normal"><a href="#__codelineno-0-335">335</a></span>
12238
- <span class="normal"><a href="#__codelineno-0-336">336</a></span>
12239
- <span class="normal"><a href="#__codelineno-0-337">337</a></span>
12240
- <span class="normal"><a href="#__codelineno-0-338">338</a></span>
12346
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-338">338</a></span>
12241
12347
  <span class="normal"><a href="#__codelineno-0-339">339</a></span>
12242
12348
  <span class="normal"><a href="#__codelineno-0-340">340</a></span>
12243
12349
  <span class="normal"><a href="#__codelineno-0-341">341</a></span>
12244
12350
  <span class="normal"><a href="#__codelineno-0-342">342</a></span>
12245
- <span class="normal"><a href="#__codelineno-0-343">343</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-328" name="__codelineno-0-328"></a><span class="k">def</span> <span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
12246
- <a id="__codelineno-0-329" name="__codelineno-0-329"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12247
- <a id="__codelineno-0-330" name="__codelineno-0-330"></a><span class="sd"> Return a string value of this field from the passed obj.</span>
12248
- <a id="__codelineno-0-331" name="__codelineno-0-331"></a><span class="sd"> This is used by the serialization framework.</span>
12249
- <a id="__codelineno-0-332" name="__codelineno-0-332"></a><span class="sd"> &quot;&quot;&quot;</span>
12250
- <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
12251
- <a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="n">vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
12252
- <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="n">base_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span>
12253
- <a id="__codelineno-0-336" name="__codelineno-0-336"></a>
12254
- <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">:</span>
12255
- <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
12256
- <a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
12257
- <a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="k">else</span><span class="p">:</span>
12258
- <a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">AttributeSetter</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
12259
- <a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">value_to_string</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
12260
- <a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
12351
+ <span class="normal"><a href="#__codelineno-0-343">343</a></span>
12352
+ <span class="normal"><a href="#__codelineno-0-344">344</a></span>
12353
+ <span class="normal"><a href="#__codelineno-0-345">345</a></span>
12354
+ <span class="normal"><a href="#__codelineno-0-346">346</a></span>
12355
+ <span class="normal"><a href="#__codelineno-0-347">347</a></span>
12356
+ <span class="normal"><a href="#__codelineno-0-348">348</a></span>
12357
+ <span class="normal"><a href="#__codelineno-0-349">349</a></span>
12358
+ <span class="normal"><a href="#__codelineno-0-350">350</a></span>
12359
+ <span class="normal"><a href="#__codelineno-0-351">351</a></span>
12360
+ <span class="normal"><a href="#__codelineno-0-352">352</a></span>
12361
+ <span class="normal"><a href="#__codelineno-0-353">353</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-338" name="__codelineno-0-338"></a><span class="k">def</span> <span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
12362
+ <a id="__codelineno-0-339" name="__codelineno-0-339"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12363
+ <a id="__codelineno-0-340" name="__codelineno-0-340"></a><span class="sd"> Return a string value of this field from the passed obj.</span>
12364
+ <a id="__codelineno-0-341" name="__codelineno-0-341"></a><span class="sd"> This is used by the serialization framework.</span>
12365
+ <a id="__codelineno-0-342" name="__codelineno-0-342"></a><span class="sd"> &quot;&quot;&quot;</span>
12366
+ <a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
12367
+ <a id="__codelineno-0-344" name="__codelineno-0-344"></a> <span class="n">vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
12368
+ <a id="__codelineno-0-345" name="__codelineno-0-345"></a> <span class="n">base_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_field</span>
12369
+ <a id="__codelineno-0-346" name="__codelineno-0-346"></a>
12370
+ <a id="__codelineno-0-347" name="__codelineno-0-347"></a> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">vals</span><span class="p">:</span>
12371
+ <a id="__codelineno-0-348" name="__codelineno-0-348"></a> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
12372
+ <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
12373
+ <a id="__codelineno-0-350" name="__codelineno-0-350"></a> <span class="k">else</span><span class="p">:</span>
12374
+ <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">AttributeSetter</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
12375
+ <a id="__codelineno-0-352" name="__codelineno-0-352"></a> <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">base_field</span><span class="o">.</span><span class="n">value_to_string</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
12376
+ <a id="__codelineno-0-353" name="__codelineno-0-353"></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
12261
12377
  </code></pre></div></td></tr></table></div>
12262
12378
  </details>
12263
12379
  </div>
@@ -12521,17 +12637,7 @@ shared amongst models that requires these fields: name, color, content_types and
12521
12637
 
12522
12638
  <details class="quote">
12523
12639
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12524
- <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>
12525
- <span class="normal"><a href="#__codelineno-0-230">230</a></span>
12526
- <span class="normal"><a href="#__codelineno-0-231">231</a></span>
12527
- <span class="normal"><a href="#__codelineno-0-232">232</a></span>
12528
- <span class="normal"><a href="#__codelineno-0-233">233</a></span>
12529
- <span class="normal"><a href="#__codelineno-0-234">234</a></span>
12530
- <span class="normal"><a href="#__codelineno-0-235">235</a></span>
12531
- <span class="normal"><a href="#__codelineno-0-236">236</a></span>
12532
- <span class="normal"><a href="#__codelineno-0-237">237</a></span>
12533
- <span class="normal"><a href="#__codelineno-0-238">238</a></span>
12534
- <span class="normal"><a href="#__codelineno-0-239">239</a></span>
12640
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-239">239</a></span>
12535
12641
  <span class="normal"><a href="#__codelineno-0-240">240</a></span>
12536
12642
  <span class="normal"><a href="#__codelineno-0-241">241</a></span>
12537
12643
  <span class="normal"><a href="#__codelineno-0-242">242</a></span>
@@ -12554,40 +12660,50 @@ shared amongst models that requires these fields: name, color, content_types and
12554
12660
  <span class="normal"><a href="#__codelineno-0-259">259</a></span>
12555
12661
  <span class="normal"><a href="#__codelineno-0-260">260</a></span>
12556
12662
  <span class="normal"><a href="#__codelineno-0-261">261</a></span>
12557
- <span class="normal"><a href="#__codelineno-0-262">262</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">class</span> <span class="nc">NaturalOrderingField</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">):</span>
12558
- <a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12559
- <a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd"> A field which stores a naturalized representation of its target field, to be used for ordering its parent model.</span>
12560
- <a id="__codelineno-0-232" name="__codelineno-0-232"></a>
12561
- <a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd"> :param target_field: Name of the field of the parent model to be naturalized</span>
12562
- <a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="sd"> :param naturalize_function: The function used to generate a naturalized value (optional)</span>
12563
- <a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> &quot;&quot;&quot;</span>
12564
- <a id="__codelineno-0-236" name="__codelineno-0-236"></a>
12565
- <a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">&quot;Stores a representation of its target field suitable for natural ordering&quot;</span>
12566
- <a id="__codelineno-0-238" name="__codelineno-0-238"></a>
12567
- <a id="__codelineno-0-239" name="__codelineno-0-239"></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">target_field</span><span class="p">,</span> <span class="n">naturalize_function</span><span class="o">=</span><span class="n">ordering</span><span class="o">.</span><span class="n">naturalize</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
12568
- <a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span> <span class="o">=</span> <span class="n">target_field</span>
12569
- <a id="__codelineno-0-241" name="__codelineno-0-241"></a> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span> <span class="o">=</span> <span class="n">naturalize_function</span>
12570
- <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
12571
- <a id="__codelineno-0-243" name="__codelineno-0-243"></a>
12572
- <a id="__codelineno-0-244" name="__codelineno-0-244"></a> <span class="k">def</span> <span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
12573
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12574
- <a id="__codelineno-0-246" name="__codelineno-0-246"></a><span class="sd"> Generate a naturalized value from the target field</span>
12575
- <a id="__codelineno-0-247" name="__codelineno-0-247"></a><span class="sd"> &quot;&quot;&quot;</span>
12576
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="n">original_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="p">)</span>
12577
- <a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="n">naturalized_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span><span class="p">(</span><span class="n">original_value</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">)</span>
12578
- <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">naturalized_value</span><span class="p">)</span>
12579
- <a id="__codelineno-0-251" name="__codelineno-0-251"></a>
12580
- <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">return</span> <span class="n">naturalized_value</span>
12663
+ <span class="normal"><a href="#__codelineno-0-262">262</a></span>
12664
+ <span class="normal"><a href="#__codelineno-0-263">263</a></span>
12665
+ <span class="normal"><a href="#__codelineno-0-264">264</a></span>
12666
+ <span class="normal"><a href="#__codelineno-0-265">265</a></span>
12667
+ <span class="normal"><a href="#__codelineno-0-266">266</a></span>
12668
+ <span class="normal"><a href="#__codelineno-0-267">267</a></span>
12669
+ <span class="normal"><a href="#__codelineno-0-268">268</a></span>
12670
+ <span class="normal"><a href="#__codelineno-0-269">269</a></span>
12671
+ <span class="normal"><a href="#__codelineno-0-270">270</a></span>
12672
+ <span class="normal"><a href="#__codelineno-0-271">271</a></span>
12673
+ <span class="normal"><a href="#__codelineno-0-272">272</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="k">class</span> <span class="nc">NaturalOrderingField</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">):</span>
12674
+ <a id="__codelineno-0-240" name="__codelineno-0-240"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12675
+ <a id="__codelineno-0-241" name="__codelineno-0-241"></a><span class="sd"> A field which stores a naturalized representation of its target field, to be used for ordering its parent model.</span>
12676
+ <a id="__codelineno-0-242" name="__codelineno-0-242"></a>
12677
+ <a id="__codelineno-0-243" name="__codelineno-0-243"></a><span class="sd"> :param target_field: Name of the field of the parent model to be naturalized</span>
12678
+ <a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> :param naturalize_function: The function used to generate a naturalized value (optional)</span>
12679
+ <a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="sd"> &quot;&quot;&quot;</span>
12680
+ <a id="__codelineno-0-246" name="__codelineno-0-246"></a>
12681
+ <a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">&quot;Stores a representation of its target field suitable for natural ordering&quot;</span>
12682
+ <a id="__codelineno-0-248" name="__codelineno-0-248"></a>
12683
+ <a id="__codelineno-0-249" name="__codelineno-0-249"></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">target_field</span><span class="p">,</span> <span class="n">naturalize_function</span><span class="o">=</span><span class="n">ordering</span><span class="o">.</span><span class="n">naturalize</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
12684
+ <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span> <span class="o">=</span> <span class="n">target_field</span>
12685
+ <a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span> <span class="o">=</span> <span class="n">naturalize_function</span>
12686
+ <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
12581
12687
  <a id="__codelineno-0-253" name="__codelineno-0-253"></a>
12582
- <a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12583
- <a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()[</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># Pass kwargs from CharField</span>
12584
- <a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;naturalize_function&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span>
12585
- <a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="k">return</span> <span class="p">(</span>
12586
- <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
12587
- <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="s2">&quot;nautobot.core.models.fields.NaturalOrderingField&quot;</span><span class="p">,</span>
12588
- <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="p">],</span>
12589
- <a id="__codelineno-0-261" name="__codelineno-0-261"></a> <span class="n">kwargs</span><span class="p">,</span>
12590
- <a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="p">)</span>
12688
+ <a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="k">def</span> <span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
12689
+ <a id="__codelineno-0-255" name="__codelineno-0-255"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12690
+ <a id="__codelineno-0-256" name="__codelineno-0-256"></a><span class="sd"> Generate a naturalized value from the target field</span>
12691
+ <a id="__codelineno-0-257" name="__codelineno-0-257"></a><span class="sd"> &quot;&quot;&quot;</span>
12692
+ <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="n">original_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="p">)</span>
12693
+ <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="n">naturalized_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span><span class="p">(</span><span class="n">original_value</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">)</span>
12694
+ <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">naturalized_value</span><span class="p">)</span>
12695
+ <a id="__codelineno-0-261" name="__codelineno-0-261"></a>
12696
+ <a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="k">return</span> <span class="n">naturalized_value</span>
12697
+ <a id="__codelineno-0-263" name="__codelineno-0-263"></a>
12698
+ <a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12699
+ <a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()[</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># Pass kwargs from CharField</span>
12700
+ <a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;naturalize_function&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span>
12701
+ <a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="k">return</span> <span class="p">(</span>
12702
+ <a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
12703
+ <a id="__codelineno-0-269" name="__codelineno-0-269"></a> <span class="s2">&quot;nautobot.core.models.fields.NaturalOrderingField&quot;</span><span class="p">,</span>
12704
+ <a id="__codelineno-0-270" name="__codelineno-0-270"></a> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="p">],</span>
12705
+ <a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="n">kwargs</span><span class="p">,</span>
12706
+ <a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="p">)</span>
12591
12707
  </code></pre></div></td></tr></table></div>
12592
12708
  </details>
12593
12709
 
@@ -12620,23 +12736,23 @@ shared amongst models that requires these fields: name, color, content_types and
12620
12736
 
12621
12737
  <details class="quote">
12622
12738
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
12623
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-244">244</a></span>
12624
- <span class="normal"><a href="#__codelineno-0-245">245</a></span>
12625
- <span class="normal"><a href="#__codelineno-0-246">246</a></span>
12626
- <span class="normal"><a href="#__codelineno-0-247">247</a></span>
12627
- <span class="normal"><a href="#__codelineno-0-248">248</a></span>
12628
- <span class="normal"><a href="#__codelineno-0-249">249</a></span>
12629
- <span class="normal"><a href="#__codelineno-0-250">250</a></span>
12630
- <span class="normal"><a href="#__codelineno-0-251">251</a></span>
12631
- <span class="normal"><a href="#__codelineno-0-252">252</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="k">def</span> <span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
12632
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12633
- <a id="__codelineno-0-246" name="__codelineno-0-246"></a><span class="sd"> Generate a naturalized value from the target field</span>
12634
- <a id="__codelineno-0-247" name="__codelineno-0-247"></a><span class="sd"> &quot;&quot;&quot;</span>
12635
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="n">original_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="p">)</span>
12636
- <a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="n">naturalized_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span><span class="p">(</span><span class="n">original_value</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">)</span>
12637
- <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">naturalized_value</span><span class="p">)</span>
12638
- <a id="__codelineno-0-251" name="__codelineno-0-251"></a>
12639
- <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">return</span> <span class="n">naturalized_value</span>
12739
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-254">254</a></span>
12740
+ <span class="normal"><a href="#__codelineno-0-255">255</a></span>
12741
+ <span class="normal"><a href="#__codelineno-0-256">256</a></span>
12742
+ <span class="normal"><a href="#__codelineno-0-257">257</a></span>
12743
+ <span class="normal"><a href="#__codelineno-0-258">258</a></span>
12744
+ <span class="normal"><a href="#__codelineno-0-259">259</a></span>
12745
+ <span class="normal"><a href="#__codelineno-0-260">260</a></span>
12746
+ <span class="normal"><a href="#__codelineno-0-261">261</a></span>
12747
+ <span class="normal"><a href="#__codelineno-0-262">262</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-254" name="__codelineno-0-254"></a><span class="k">def</span> <span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
12748
+ <a id="__codelineno-0-255" name="__codelineno-0-255"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12749
+ <a id="__codelineno-0-256" name="__codelineno-0-256"></a><span class="sd"> Generate a naturalized value from the target field</span>
12750
+ <a id="__codelineno-0-257" name="__codelineno-0-257"></a><span class="sd"> &quot;&quot;&quot;</span>
12751
+ <a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="n">original_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="p">)</span>
12752
+ <a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="n">naturalized_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">naturalize_function</span><span class="p">(</span><span class="n">original_value</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">)</span>
12753
+ <a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">naturalized_value</span><span class="p">)</span>
12754
+ <a id="__codelineno-0-261" name="__codelineno-0-261"></a>
12755
+ <a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="k">return</span> <span class="n">naturalized_value</span>
12640
12756
  </code></pre></div></td></tr></table></div>
12641
12757
  </details>
12642
12758
  </div>
@@ -15431,17 +15547,7 @@ having to define it on the model yourself.</p>
15431
15547
 
15432
15548
  <details class="quote">
15433
15549
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
15434
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-373">373</a></span>
15435
- <span class="normal"><a href="#__codelineno-0-374">374</a></span>
15436
- <span class="normal"><a href="#__codelineno-0-375">375</a></span>
15437
- <span class="normal"><a href="#__codelineno-0-376">376</a></span>
15438
- <span class="normal"><a href="#__codelineno-0-377">377</a></span>
15439
- <span class="normal"><a href="#__codelineno-0-378">378</a></span>
15440
- <span class="normal"><a href="#__codelineno-0-379">379</a></span>
15441
- <span class="normal"><a href="#__codelineno-0-380">380</a></span>
15442
- <span class="normal"><a href="#__codelineno-0-381">381</a></span>
15443
- <span class="normal"><a href="#__codelineno-0-382">382</a></span>
15444
- <span class="normal"><a href="#__codelineno-0-383">383</a></span>
15550
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-383">383</a></span>
15445
15551
  <span class="normal"><a href="#__codelineno-0-384">384</a></span>
15446
15552
  <span class="normal"><a href="#__codelineno-0-385">385</a></span>
15447
15553
  <span class="normal"><a href="#__codelineno-0-386">386</a></span>
@@ -15449,25 +15555,35 @@ having to define it on the model yourself.</p>
15449
15555
  <span class="normal"><a href="#__codelineno-0-388">388</a></span>
15450
15556
  <span class="normal"><a href="#__codelineno-0-389">389</a></span>
15451
15557
  <span class="normal"><a href="#__codelineno-0-390">390</a></span>
15452
- <span class="normal"><a href="#__codelineno-0-391">391</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-373" name="__codelineno-0-373"></a><span class="k">class</span> <span class="nc">TagsField</span><span class="p">(</span><span class="n">TaggableManager</span><span class="p">):</span>
15453
- <a id="__codelineno-0-374" name="__codelineno-0-374"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Override FormField method on taggit.managers.TaggableManager to match the Nautobot UI.&quot;&quot;&quot;</span>
15454
- <a id="__codelineno-0-375" name="__codelineno-0-375"></a>
15455
- <a id="__codelineno-0-376" name="__codelineno-0-376"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
15456
- <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.tags</span> <span class="kn">import</span> <span class="n">TaggedItem</span>
15457
- <a id="__codelineno-0-378" name="__codelineno-0-378"></a>
15458
- <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;through&quot;</span><span class="p">,</span> <span class="n">TaggedItem</span><span class="p">)</span>
15459
- <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;manager&quot;</span><span class="p">,</span> <span class="n">TagsManager</span><span class="p">)</span>
15460
- <a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ordering&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">])</span>
15461
- <a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
15462
- <a id="__codelineno-0-383" name="__codelineno-0-383"></a>
15463
- <a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form_class</span><span class="o">=</span><span class="n">fields</span><span class="o">.</span><span class="n">DynamicModelMultipleChoiceField</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
15464
- <a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.tags</span> <span class="kn">import</span> <span class="n">Tag</span>
15465
- <a id="__codelineno-0-386" name="__codelineno-0-386"></a>
15466
- <a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="n">queryset</span> <span class="o">=</span> <span class="n">Tag</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
15467
- <a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;queryset&quot;</span><span class="p">,</span> <span class="n">queryset</span><span class="p">)</span>
15468
- <a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;required&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
15469
- <a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;query_params&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="p">})</span>
15470
- <a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="n">form_class</span><span class="o">=</span><span class="n">form_class</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
15558
+ <span class="normal"><a href="#__codelineno-0-391">391</a></span>
15559
+ <span class="normal"><a href="#__codelineno-0-392">392</a></span>
15560
+ <span class="normal"><a href="#__codelineno-0-393">393</a></span>
15561
+ <span class="normal"><a href="#__codelineno-0-394">394</a></span>
15562
+ <span class="normal"><a href="#__codelineno-0-395">395</a></span>
15563
+ <span class="normal"><a href="#__codelineno-0-396">396</a></span>
15564
+ <span class="normal"><a href="#__codelineno-0-397">397</a></span>
15565
+ <span class="normal"><a href="#__codelineno-0-398">398</a></span>
15566
+ <span class="normal"><a href="#__codelineno-0-399">399</a></span>
15567
+ <span class="normal"><a href="#__codelineno-0-400">400</a></span>
15568
+ <span class="normal"><a href="#__codelineno-0-401">401</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-383" name="__codelineno-0-383"></a><span class="k">class</span> <span class="nc">TagsField</span><span class="p">(</span><span class="n">TaggableManager</span><span class="p">):</span>
15569
+ <a id="__codelineno-0-384" name="__codelineno-0-384"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Override FormField method on taggit.managers.TaggableManager to match the Nautobot UI.&quot;&quot;&quot;</span>
15570
+ <a id="__codelineno-0-385" name="__codelineno-0-385"></a>
15571
+ <a id="__codelineno-0-386" name="__codelineno-0-386"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
15572
+ <a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.tags</span> <span class="kn">import</span> <span class="n">TaggedItem</span>
15573
+ <a id="__codelineno-0-388" name="__codelineno-0-388"></a>
15574
+ <a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;through&quot;</span><span class="p">,</span> <span class="n">TaggedItem</span><span class="p">)</span>
15575
+ <a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;manager&quot;</span><span class="p">,</span> <span class="n">TagsManager</span><span class="p">)</span>
15576
+ <a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ordering&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">])</span>
15577
+ <a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
15578
+ <a id="__codelineno-0-393" name="__codelineno-0-393"></a>
15579
+ <a id="__codelineno-0-394" name="__codelineno-0-394"></a> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form_class</span><span class="o">=</span><span class="n">fields</span><span class="o">.</span><span class="n">DynamicModelMultipleChoiceField</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
15580
+ <a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="kn">from</span> <span class="nn">nautobot.extras.models.tags</span> <span class="kn">import</span> <span class="n">Tag</span>
15581
+ <a id="__codelineno-0-396" name="__codelineno-0-396"></a>
15582
+ <a id="__codelineno-0-397" name="__codelineno-0-397"></a> <span class="n">queryset</span> <span class="o">=</span> <span class="n">Tag</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
15583
+ <a id="__codelineno-0-398" name="__codelineno-0-398"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;queryset&quot;</span><span class="p">,</span> <span class="n">queryset</span><span class="p">)</span>
15584
+ <a id="__codelineno-0-399" name="__codelineno-0-399"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;required&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
15585
+ <a id="__codelineno-0-400" name="__codelineno-0-400"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;query_params&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;content_types&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="p">})</span>
15586
+ <a id="__codelineno-0-401" name="__codelineno-0-401"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="n">form_class</span><span class="o">=</span><span class="n">form_class</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
15471
15587
  </code></pre></div></td></tr></table></div>
15472
15588
  </details>
15473
15589
 
@@ -17432,7 +17548,8 @@ e.g:
17432
17548
 
17433
17549
  <details class="quote">
17434
17550
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
17435
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-67">67</a></span>
17551
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-66">66</a></span>
17552
+ <span class="normal"><a href="#__codelineno-0-67">67</a></span>
17436
17553
  <span class="normal"><a href="#__codelineno-0-68">68</a></span>
17437
17554
  <span class="normal"><a href="#__codelineno-0-69">69</a></span>
17438
17555
  <span class="normal"><a href="#__codelineno-0-70">70</a></span>
@@ -17445,22 +17562,21 @@ e.g:
17445
17562
  <span class="normal"><a href="#__codelineno-0-77">77</a></span>
17446
17563
  <span class="normal"><a href="#__codelineno-0-78">78</a></span>
17447
17564
  <span class="normal"><a href="#__codelineno-0-79">79</a></span>
17448
- <span class="normal"><a href="#__codelineno-0-80">80</a></span>
17449
- <span class="normal"><a href="#__codelineno-0-81">81</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="k">def</span> <span class="nf">slugify_dashes_to_underscores</span><span class="p">(</span><span class="n">content</span><span class="p">):</span>
17450
- <a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
17451
- <a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> Custom slugify_function - use underscores instead of dashes; resulting slug can be used as a variable name,</span>
17452
- <a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> as well as a graphql safe string.</span>
17453
- <a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> Note: If content starts with a non graphql-safe character, e.g. a digit</span>
17454
- <a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> This method will prepend an &quot;a&quot; to content to make it graphql-safe</span>
17455
- <a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> e.g:</span>
17456
- <a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd"> 123 main st -&gt; a123_main_st</span>
17457
- <a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> &quot;&quot;&quot;</span>
17458
- <a id="__codelineno-0-76" name="__codelineno-0-76"></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]&quot;</span><span class="p">)</span>
17459
- <a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="c1"># If the first letter of the slug is not GraphQL safe.</span>
17460
- <a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="c1"># We append &quot;a&quot; to it.</span>
17461
- <a id="__codelineno-0-79" name="__codelineno-0-79"></a> <span class="k">if</span> <span class="n">graphql_safe_pattern</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
17462
- <a id="__codelineno-0-80" name="__codelineno-0-80"></a> <span class="n">content</span> <span class="o">=</span> <span class="s2">&quot;a&quot;</span> <span class="o">+</span> <span class="n">content</span>
17463
- <a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="k">return</span> <span class="n">slugify</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">,</span> <span class="s2">&quot;_&quot;</span><span class="p">)</span>
17565
+ <span class="normal"><a href="#__codelineno-0-80">80</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="k">def</span> <span class="nf">slugify_dashes_to_underscores</span><span class="p">(</span><span class="n">content</span><span class="p">):</span>
17566
+ <a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
17567
+ <a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> Custom slugify_function - use underscores instead of dashes; resulting slug can be used as a variable name,</span>
17568
+ <a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> as well as a graphql safe string.</span>
17569
+ <a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> Note: If content starts with a non graphql-safe character, e.g. a digit</span>
17570
+ <a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> This method will prepend an &quot;a&quot; to content to make it graphql-safe</span>
17571
+ <a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> e.g:</span>
17572
+ <a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> 123 main st -&gt; a123_main_st</span>
17573
+ <a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd"> &quot;&quot;&quot;</span>
17574
+ <a id="__codelineno-0-75" name="__codelineno-0-75"></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]&quot;</span><span class="p">)</span>
17575
+ <a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="c1"># If the first letter of the slug is not GraphQL safe.</span>
17576
+ <a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="c1"># We append &quot;a&quot; to it.</span>
17577
+ <a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="k">if</span> <span class="n">graphql_safe_pattern</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
17578
+ <a id="__codelineno-0-79" name="__codelineno-0-79"></a> <span class="n">content</span> <span class="o">=</span> <span class="s2">&quot;a&quot;</span> <span class="o">+</span> <span class="n">content</span>
17579
+ <a id="__codelineno-0-80" name="__codelineno-0-80"></a> <span class="k">return</span> <span class="n">slugify</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">,</span> <span class="s2">&quot;_&quot;</span><span class="p">)</span>
17464
17580
  </code></pre></div></td></tr></table></div>
17465
17581
  </details>
17466
17582
  </div>
@@ -17484,11 +17600,11 @@ e.g:
17484
17600
 
17485
17601
  <details class="quote">
17486
17602
  <summary>Source code in <code>nautobot/core/models/fields.py</code></summary>
17487
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-62">62</a></span>
17488
- <span class="normal"><a href="#__codelineno-0-63">63</a></span>
17489
- <span class="normal"><a href="#__codelineno-0-64">64</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-62" name="__codelineno-0-62"></a><span class="k">def</span> <span class="nf">slugify_dots_to_dashes</span><span class="p">(</span><span class="n">content</span><span class="p">):</span>
17490
- <a id="__codelineno-0-63" name="__codelineno-0-63"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom slugify_function - convert &#39;.&#39; to &#39;-&#39; instead of removing dots outright.&quot;&quot;&quot;</span>
17491
- <a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">return</span> <span class="n">slugify</span><span class="p">(</span><span class="n">content</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="s2">&quot;-&quot;</span><span class="p">))</span>
17603
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-61">61</a></span>
17604
+ <span class="normal"><a href="#__codelineno-0-62">62</a></span>
17605
+ <span class="normal"><a href="#__codelineno-0-63">63</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-61" name="__codelineno-0-61"></a><span class="k">def</span> <span class="nf">slugify_dots_to_dashes</span><span class="p">(</span><span class="n">content</span><span class="p">):</span>
17606
+ <a id="__codelineno-0-62" name="__codelineno-0-62"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom slugify_function - convert &#39;.&#39; to &#39;-&#39; instead of removing dots outright.&quot;&quot;&quot;</span>
17607
+ <a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">return</span> <span class="n">slugify</span><span class="p">(</span><span class="n">content</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="s2">&quot;-&quot;</span><span class="p">))</span>
17492
17608
  </code></pre></div></td></tr></table></div>
17493
17609
  </details>
17494
17610
  </div>