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

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

Potentially problematic release.


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

Files changed (338) hide show
  1. nautobot/apps/api.py +1 -2
  2. nautobot/apps/utils.py +4 -0
  3. nautobot/apps/views.py +2 -0
  4. nautobot/circuits/api/urls.py +1 -2
  5. nautobot/circuits/api/views.py +0 -12
  6. nautobot/circuits/tests/integration/test_relationships.py +0 -4
  7. nautobot/core/api/routers.py +25 -3
  8. nautobot/core/api/utils.py +4 -0
  9. nautobot/core/api/views.py +21 -15
  10. nautobot/core/celery/schedulers.py +13 -0
  11. nautobot/core/choices.py +0 -21
  12. nautobot/core/models/__init__.py +1 -1
  13. nautobot/core/models/tree_queries.py +29 -7
  14. nautobot/core/releases.py +1 -1
  15. nautobot/core/settings.py +9 -0
  16. nautobot/core/settings_funcs.py +0 -18
  17. nautobot/core/signals.py +5 -5
  18. nautobot/core/tasks.py +7 -3
  19. nautobot/core/templates/admin/base.html +23 -94
  20. nautobot/core/templates/generic/object_list.html +2 -0
  21. nautobot/core/templates/graphene/graphiql.html +18 -47
  22. nautobot/core/templates/inc/footer.html +5 -5
  23. nautobot/core/templates/inc/nav_menu.html +0 -7
  24. nautobot/core/templates/nautobot_config.py.j2 +6 -0
  25. nautobot/core/templates/rest_framework/api.html +12 -5
  26. nautobot/core/testing/mixins.py +13 -5
  27. nautobot/core/tests/integration/test_plugin_navbar.py +7 -21
  28. nautobot/core/tests/integration/test_view_authentication.py +67 -0
  29. nautobot/core/tests/runner.py +25 -2
  30. nautobot/core/tests/test_graphql.py +2 -14
  31. nautobot/core/tests/test_models.py +3 -3
  32. nautobot/core/tests/test_navigations.py +67 -10
  33. nautobot/core/tests/test_releases.py +9 -3
  34. nautobot/core/tests/test_views.py +23 -16
  35. nautobot/core/utils/lookup.py +124 -0
  36. nautobot/core/views/__init__.py +3 -7
  37. nautobot/core/views/generic.py +9 -0
  38. nautobot/dcim/api/urls.py +1 -2
  39. nautobot/dcim/api/views.py +1 -12
  40. nautobot/dcim/choices.py +56 -0
  41. nautobot/dcim/models/racks.py +1 -3
  42. nautobot/dcim/navigation.py +1 -1
  43. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +67 -43
  44. nautobot/dcim/tests/test_api.py +3 -0
  45. nautobot/dcim/tests/test_filters.py +0 -28
  46. nautobot/dcim/views.py +5 -2
  47. nautobot/extras/api/urls.py +1 -2
  48. nautobot/extras/api/views.py +0 -10
  49. nautobot/extras/choices.py +14 -0
  50. nautobot/extras/models/customfields.py +93 -34
  51. nautobot/extras/models/groups.py +1 -1
  52. nautobot/extras/models/relationships.py +32 -19
  53. nautobot/extras/navigation.py +3 -2
  54. nautobot/extras/plugins/__init__.py +8 -0
  55. nautobot/extras/plugins/views.py +6 -9
  56. nautobot/extras/querysets.py +1 -1
  57. nautobot/extras/signals.py +12 -6
  58. nautobot/extras/templates/extras/customfield.html +22 -14
  59. nautobot/extras/templatetags/job_buttons.py +7 -0
  60. nautobot/extras/templatetags/plugins.py +5 -1
  61. nautobot/extras/tests/test_customfields.py +323 -287
  62. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  63. nautobot/extras/tests/test_jobs.py +2 -2
  64. nautobot/extras/tests/test_plugins.py +41 -0
  65. nautobot/extras/tests/test_relationships.py +31 -14
  66. nautobot/extras/tests/test_views.py +124 -1
  67. nautobot/extras/utils.py +7 -3
  68. nautobot/extras/views.py +10 -10
  69. nautobot/ipam/api/urls.py +1 -2
  70. nautobot/ipam/api/views.py +6 -13
  71. nautobot/ipam/tables.py +0 -1
  72. nautobot/ipam/tests/test_graphql.py +2 -3
  73. nautobot/ipam/views.py +12 -10
  74. nautobot/project-static/css/base.css +1 -0
  75. nautobot/project-static/docs/404.html +30 -2
  76. nautobot/project-static/docs/apps/index.html +30 -2
  77. nautobot/project-static/docs/apps/nautobot-apps.html +30 -2
  78. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +30 -2
  79. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +30 -2
  80. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +410 -410
  81. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +30 -2
  82. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +386 -358
  83. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +30 -2
  84. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +30 -2
  85. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +30 -2
  86. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +30 -2
  87. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +45 -17
  88. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +30 -2
  89. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +30 -2
  90. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +30 -2
  91. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +759 -602
  92. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +30 -2
  93. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +30 -2
  94. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +30 -2
  95. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +528 -467
  96. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +205 -109
  97. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +30 -2
  98. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1265 -785
  99. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1827 -1746
  100. nautobot/project-static/docs/development/apps/api/configuration-view.html +30 -2
  101. nautobot/project-static/docs/development/apps/api/database-backend-config.html +30 -2
  102. nautobot/project-static/docs/development/apps/api/models/django-admin.html +30 -2
  103. nautobot/project-static/docs/development/apps/api/models/global-search.html +30 -2
  104. nautobot/project-static/docs/development/apps/api/models/graphql.html +30 -2
  105. nautobot/project-static/docs/development/apps/api/models/index.html +30 -2
  106. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +31 -3
  107. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +30 -2
  108. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +30 -2
  109. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +30 -2
  110. nautobot/project-static/docs/development/apps/api/platform-features/index.html +30 -2
  111. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +30 -2
  112. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +30 -2
  113. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +30 -2
  114. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +30 -2
  115. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +30 -2
  116. nautobot/project-static/docs/development/apps/api/prometheus.html +30 -2
  117. nautobot/project-static/docs/development/apps/api/setup.html +30 -2
  118. nautobot/project-static/docs/development/apps/api/testing.html +33 -5
  119. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +30 -2
  120. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +30 -2
  121. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +30 -2
  122. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +33 -5
  123. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +13 -5559
  124. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +5594 -0
  125. nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +3 -3
  126. nautobot/project-static/docs/development/apps/api/views/base-template.html +30 -2
  127. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +44 -11
  128. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +47 -14
  129. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +30 -2
  130. nautobot/project-static/docs/development/apps/api/views/index.html +30 -2
  131. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +30 -2
  132. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +30 -2
  133. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +30 -2
  134. nautobot/project-static/docs/development/apps/api/views/notes.html +30 -2
  135. nautobot/project-static/docs/development/apps/api/views/rest-api.html +30 -2
  136. nautobot/project-static/docs/development/apps/api/views/urls.html +30 -2
  137. nautobot/project-static/docs/development/apps/index.html +30 -2
  138. nautobot/project-static/docs/development/apps/migration/code-updates.html +30 -2
  139. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +30 -2
  140. nautobot/project-static/docs/development/apps/migration/from-v1.html +30 -2
  141. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +30 -2
  142. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +30 -2
  143. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +30 -2
  144. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +30 -2
  145. nautobot/project-static/docs/development/apps/porting-from-netbox.html +30 -2
  146. nautobot/project-static/docs/development/core/application-registry.html +30 -2
  147. nautobot/project-static/docs/development/core/best-practices.html +33 -5
  148. nautobot/project-static/docs/development/core/bootstrap-ui.html +30 -2
  149. nautobot/project-static/docs/development/core/caching.html +5481 -0
  150. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +30 -2
  151. nautobot/project-static/docs/development/core/extending-models.html +33 -5
  152. nautobot/project-static/docs/development/core/generic-views.html +30 -2
  153. nautobot/project-static/docs/development/core/getting-started.html +49 -12
  154. nautobot/project-static/docs/development/core/homepage.html +30 -2
  155. nautobot/project-static/docs/development/core/index.html +30 -2
  156. nautobot/project-static/docs/development/core/model-features.html +30 -2
  157. nautobot/project-static/docs/development/core/natural-keys.html +30 -2
  158. nautobot/project-static/docs/development/core/navigation-menu.html +30 -2
  159. nautobot/project-static/docs/development/core/release-checklist.html +30 -2
  160. nautobot/project-static/docs/development/core/role-internals.html +30 -2
  161. nautobot/project-static/docs/development/core/style-guide.html +30 -2
  162. nautobot/project-static/docs/development/core/templates.html +30 -2
  163. nautobot/project-static/docs/development/core/testing.html +30 -2
  164. nautobot/project-static/docs/development/core/user-preferences.html +30 -2
  165. nautobot/project-static/docs/development/index.html +30 -2
  166. nautobot/project-static/docs/development/jobs/index.html +30 -2
  167. nautobot/project-static/docs/development/jobs/migration/from-v1.html +30 -2
  168. nautobot/project-static/docs/index.html +30 -2
  169. nautobot/project-static/docs/objects.inv +0 -0
  170. nautobot/project-static/docs/release-notes/index.html +30 -2
  171. nautobot/project-static/docs/release-notes/version-1.0.html +30 -2
  172. nautobot/project-static/docs/release-notes/version-1.1.html +30 -2
  173. nautobot/project-static/docs/release-notes/version-1.2.html +30 -2
  174. nautobot/project-static/docs/release-notes/version-1.3.html +30 -2
  175. nautobot/project-static/docs/release-notes/version-1.4.html +31 -3
  176. nautobot/project-static/docs/release-notes/version-1.5.html +30 -2
  177. nautobot/project-static/docs/release-notes/version-1.6.html +573 -134
  178. nautobot/project-static/docs/release-notes/version-2.0.html +30 -2
  179. nautobot/project-static/docs/release-notes/version-2.1.html +539 -170
  180. nautobot/project-static/docs/search/search_index.json +1 -1
  181. nautobot/project-static/docs/sitemap.xml +250 -240
  182. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  183. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +30 -2
  184. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +30 -2
  185. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +30 -2
  186. nautobot/project-static/docs/user-guide/administration/configuration/index.html +30 -2
  187. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +49 -2
  188. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +30 -2
  189. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +30 -2
  190. nautobot/project-static/docs/user-guide/administration/guides/caching.html +30 -2
  191. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +30 -2
  192. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +30 -2
  193. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +30 -2
  194. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +30 -2
  195. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +30 -2
  196. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +30 -2
  197. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +30 -2
  198. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +30 -2
  199. nautobot/project-static/docs/user-guide/administration/installation/docker.html +37 -5
  200. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +30 -2
  201. nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +6019 -0
  202. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +30 -2
  203. nautobot/project-static/docs/user-guide/administration/installation/index.html +30 -2
  204. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +30 -2
  205. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +30 -2
  206. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +33 -5
  207. nautobot/project-static/docs/user-guide/administration/installation/services.html +30 -2
  208. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +30 -2
  209. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +30 -2
  210. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +30 -2
  211. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +30 -2
  212. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +30 -2
  213. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +30 -2
  214. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +30 -2
  215. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +30 -2
  216. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +30 -2
  217. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +30 -2
  218. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +30 -2
  219. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +30 -2
  220. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +30 -2
  221. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +30 -2
  222. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +30 -2
  223. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +30 -2
  224. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +30 -2
  225. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +30 -2
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +30 -2
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +30 -2
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +30 -2
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +30 -2
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +30 -2
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +30 -2
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +30 -2
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +30 -2
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +30 -2
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +30 -2
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +30 -2
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +30 -2
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +30 -2
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +30 -2
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +30 -2
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +30 -2
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +30 -2
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +30 -2
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +30 -2
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +30 -2
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +30 -2
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +30 -2
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +30 -2
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +30 -2
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +30 -2
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +30 -2
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +30 -2
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +30 -2
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +30 -2
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +30 -2
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +30 -2
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +30 -2
  258. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +30 -2
  259. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +30 -2
  260. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +30 -2
  261. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +30 -2
  262. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +30 -2
  263. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +30 -2
  264. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +30 -2
  265. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +30 -2
  266. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +30 -2
  267. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +30 -2
  268. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +30 -2
  269. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +30 -2
  270. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +30 -2
  271. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +30 -2
  272. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +30 -2
  273. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +30 -2
  274. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +30 -2
  275. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +30 -2
  276. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +30 -2
  277. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +33 -5
  278. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +30 -2
  279. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +30 -2
  280. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +30 -2
  281. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +30 -2
  282. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +30 -2
  283. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +30 -2
  284. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +30 -2
  285. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +30 -2
  286. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +30 -2
  287. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +30 -2
  288. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +30 -2
  289. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +30 -2
  290. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +30 -2
  291. nautobot/project-static/docs/user-guide/index.html +30 -2
  292. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +30 -2
  293. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +30 -2
  294. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +111 -15
  295. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +30 -2
  296. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +30 -2
  297. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +30 -2
  298. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +30 -2
  299. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +30 -2
  300. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +30 -2
  301. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +30 -2
  302. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +30 -2
  303. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +30 -2
  304. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +30 -2
  305. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +30 -2
  306. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +30 -2
  307. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +30 -2
  308. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +30 -2
  309. nautobot/project-static/docs/user-guide/platform-functionality/note.html +30 -2
  310. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +30 -2
  311. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +30 -2
  312. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +30 -2
  313. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +30 -2
  314. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +30 -2
  315. nautobot/project-static/docs/user-guide/platform-functionality/role.html +30 -2
  316. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +30 -2
  317. nautobot/project-static/docs/user-guide/platform-functionality/status.html +30 -2
  318. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +30 -2
  319. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +30 -2
  320. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +30 -2
  321. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +30 -2
  322. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +30 -2
  323. nautobot/tenancy/api/urls.py +1 -2
  324. nautobot/tenancy/api/views.py +0 -12
  325. nautobot/tenancy/navigation.py +1 -1
  326. nautobot/tenancy/tests/test_filters.py +0 -168
  327. nautobot/users/api/urls.py +1 -2
  328. nautobot/users/api/views.py +2 -65
  329. nautobot/users/views.py +8 -8
  330. nautobot/virtualization/api/urls.py +1 -2
  331. nautobot/virtualization/api/views.py +0 -12
  332. nautobot/virtualization/tests/test_filters.py +0 -28
  333. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/METADATA +2 -2
  334. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/RECORD +338 -334
  335. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/LICENSE.txt +0 -0
  336. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/NOTICE +0 -0
  337. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/WHEEL +0 -0
  338. {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/entry_points.txt +0 -0
@@ -550,6 +550,20 @@
550
550
 
551
551
 
552
552
 
553
+ <li class="md-nav__item">
554
+ <a href="../../../user-guide/administration/installation/health-checks.html" class="md-nav__link">
555
+ Health Checks
556
+ </a>
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
553
567
  <li class="md-nav__item">
554
568
  <a href="../../../user-guide/administration/installation/selinux-troubleshooting.html" class="md-nav__link">
555
569
  SELinux Troubleshooting
@@ -3888,8 +3902,8 @@
3888
3902
 
3889
3903
 
3890
3904
  <li class="md-nav__item">
3891
- <a href="../../../development/apps/api/ui-extensions/object-detail-views.html" class="md-nav__link">
3892
- Object Detail Views and Tabs
3905
+ <a href="../../../development/apps/api/ui-extensions/object-views.html" class="md-nav__link">
3906
+ Object Detail & List Views
3893
3907
  </a>
3894
3908
  </li>
3895
3909
 
@@ -5315,6 +5329,20 @@
5315
5329
 
5316
5330
 
5317
5331
 
5332
+ <li class="md-nav__item">
5333
+ <a href="../../../development/core/caching.html" class="md-nav__link">
5334
+ Caching
5335
+ </a>
5336
+ </li>
5337
+
5338
+
5339
+
5340
+
5341
+
5342
+
5343
+
5344
+
5345
+
5318
5346
  <li class="md-nav__item">
5319
5347
  <a href="../../../development/core/extending-models.html" class="md-nav__link">
5320
5348
  Extending Models
@@ -6661,10 +6689,10 @@
6661
6689
 
6662
6690
  <div class="doc doc-contents ">
6663
6691
  <p class="doc doc-class-bases">
6664
- Bases: <code><span title="nautobot.core.api.views.NautobotAPIVersionMixin">NautobotAPIVersionMixin</span></code>, <code><span title="rest_framework.views.APIView">APIView</span></code></p>
6692
+ Bases: <code><span title="nautobot.core.api.views.NautobotAPIVersionMixin">NautobotAPIVersionMixin</span></code>, <code><span title="rest_framework.routers">routers</span>.<span title="rest_framework.routers.APIRootView">APIRootView</span></code></p>
6665
6693
 
6666
6694
 
6667
- <p>This is the root of the REST API. API endpoints are arranged by app and model name; e.g. <code>/api/dcim/locations/</code>.</p>
6695
+ <p>Extends DRF's base APIRootView class to enforce user authentication.</p>
6668
6696
 
6669
6697
  <details class="quote">
6670
6698
  <summary>Source code in <code>nautobot/core/api/views.py</code></summary>
@@ -6676,109 +6704,15 @@
6676
6704
  <span class="normal"><a href="#__codelineno-0-349">349</a></span>
6677
6705
  <span class="normal"><a href="#__codelineno-0-350">350</a></span>
6678
6706
  <span class="normal"><a href="#__codelineno-0-351">351</a></span>
6679
- <span class="normal"><a href="#__codelineno-0-352">352</a></span>
6680
- <span class="normal"><a href="#__codelineno-0-353">353</a></span>
6681
- <span class="normal"><a href="#__codelineno-0-354">354</a></span>
6682
- <span class="normal"><a href="#__codelineno-0-355">355</a></span>
6683
- <span class="normal"><a href="#__codelineno-0-356">356</a></span>
6684
- <span class="normal"><a href="#__codelineno-0-357">357</a></span>
6685
- <span class="normal"><a href="#__codelineno-0-358">358</a></span>
6686
- <span class="normal"><a href="#__codelineno-0-359">359</a></span>
6687
- <span class="normal"><a href="#__codelineno-0-360">360</a></span>
6688
- <span class="normal"><a href="#__codelineno-0-361">361</a></span>
6689
- <span class="normal"><a href="#__codelineno-0-362">362</a></span>
6690
- <span class="normal"><a href="#__codelineno-0-363">363</a></span>
6691
- <span class="normal"><a href="#__codelineno-0-364">364</a></span>
6692
- <span class="normal"><a href="#__codelineno-0-365">365</a></span>
6693
- <span class="normal"><a href="#__codelineno-0-366">366</a></span>
6694
- <span class="normal"><a href="#__codelineno-0-367">367</a></span>
6695
- <span class="normal"><a href="#__codelineno-0-368">368</a></span>
6696
- <span class="normal"><a href="#__codelineno-0-369">369</a></span>
6697
- <span class="normal"><a href="#__codelineno-0-370">370</a></span>
6698
- <span class="normal"><a href="#__codelineno-0-371">371</a></span>
6699
- <span class="normal"><a href="#__codelineno-0-372">372</a></span>
6700
- <span class="normal"><a href="#__codelineno-0-373">373</a></span>
6701
- <span class="normal"><a href="#__codelineno-0-374">374</a></span>
6702
- <span class="normal"><a href="#__codelineno-0-375">375</a></span>
6703
- <span class="normal"><a href="#__codelineno-0-376">376</a></span>
6704
- <span class="normal"><a href="#__codelineno-0-377">377</a></span>
6705
- <span class="normal"><a href="#__codelineno-0-378">378</a></span>
6706
- <span class="normal"><a href="#__codelineno-0-379">379</a></span>
6707
- <span class="normal"><a href="#__codelineno-0-380">380</a></span>
6708
- <span class="normal"><a href="#__codelineno-0-381">381</a></span>
6709
- <span class="normal"><a href="#__codelineno-0-382">382</a></span>
6710
- <span class="normal"><a href="#__codelineno-0-383">383</a></span>
6711
- <span class="normal"><a href="#__codelineno-0-384">384</a></span>
6712
- <span class="normal"><a href="#__codelineno-0-385">385</a></span>
6713
- <span class="normal"><a href="#__codelineno-0-386">386</a></span>
6714
- <span class="normal"><a href="#__codelineno-0-387">387</a></span>
6715
- <span class="normal"><a href="#__codelineno-0-388">388</a></span>
6716
- <span class="normal"><a href="#__codelineno-0-389">389</a></span>
6717
- <span class="normal"><a href="#__codelineno-0-390">390</a></span>
6718
- <span class="normal"><a href="#__codelineno-0-391">391</a></span>
6719
- <span class="normal"><a href="#__codelineno-0-392">392</a></span>
6720
- <span class="normal"><a href="#__codelineno-0-393">393</a></span>
6721
- <span class="normal"><a href="#__codelineno-0-394">394</a></span>
6722
- <span class="normal"><a href="#__codelineno-0-395">395</a></span>
6723
- <span class="normal"><a href="#__codelineno-0-396">396</a></span>
6724
- <span class="normal"><a href="#__codelineno-0-397">397</a></span>
6725
- <span class="normal"><a href="#__codelineno-0-398">398</a></span>
6726
- <span class="normal"><a href="#__codelineno-0-399">399</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-344" name="__codelineno-0-344"></a><span class="k">class</span> <span class="nc">APIRootView</span><span class="p">(</span><span class="n">NautobotAPIVersionMixin</span><span class="p">,</span> <span class="n">APIView</span><span class="p">):</span>
6707
+ <span class="normal"><a href="#__codelineno-0-352">352</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-344" name="__codelineno-0-344"></a><span class="k">class</span> <span class="nc">AuthenticatedAPIRootView</span><span class="p">(</span><span class="n">NautobotAPIVersionMixin</span><span class="p">,</span> <span class="n">routers</span><span class="o">.</span><span class="n">APIRootView</span><span class="p">):</span>
6727
6708
  <a id="__codelineno-0-345" name="__codelineno-0-345"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6728
- <a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="sd"> This is the root of the REST API. API endpoints are arranged by app and model name; e.g. `/api/dcim/locations/`.</span>
6709
+ <a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="sd"> Extends DRF&#39;s base APIRootView class to enforce user authentication.</span>
6729
6710
  <a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> &quot;&quot;&quot;</span>
6730
6711
  <a id="__codelineno-0-348" name="__codelineno-0-348"></a>
6731
- <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="n">_ignore_model_permissions</span> <span class="o">=</span> <span class="kc">True</span>
6712
+ <a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="n">permission_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">IsAuthenticated</span><span class="p">]</span>
6732
6713
  <a id="__codelineno-0-350" name="__codelineno-0-350"></a>
6733
- <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="k">def</span> <span class="nf">get_view_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6734
- <a id="__codelineno-0-352" name="__codelineno-0-352"></a> <span class="k">return</span> <span class="s2">&quot;API Root&quot;</span>
6735
- <a id="__codelineno-0-353" name="__codelineno-0-353"></a>
6736
- <a id="__codelineno-0-354" name="__codelineno-0-354"></a> <span class="nd">@extend_schema</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
6737
- <a id="__codelineno-0-355" name="__codelineno-0-355"></a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1"># pylint: disable=redefined-builtin</span>
6738
- <a id="__codelineno-0-356" name="__codelineno-0-356"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span>
6739
- <a id="__codelineno-0-357" name="__codelineno-0-357"></a> <span class="n">OrderedDict</span><span class="p">(</span>
6740
- <a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="p">(</span>
6741
- <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="p">(</span>
6742
- <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="s2">&quot;circuits&quot;</span><span class="p">,</span>
6743
- <a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;circuits-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6744
- <a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="p">),</span>
6745
- <a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="p">(</span>
6746
- <a id="__codelineno-0-364" name="__codelineno-0-364"></a> <span class="s2">&quot;dcim&quot;</span><span class="p">,</span>
6747
- <a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;dcim-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6748
- <a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="p">),</span>
6749
- <a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="p">(</span>
6750
- <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="s2">&quot;extras&quot;</span><span class="p">,</span>
6751
- <a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;extras-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6752
- <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="p">),</span>
6753
- <a id="__codelineno-0-371" name="__codelineno-0-371"></a> <span class="p">(</span><span class="s2">&quot;graphql&quot;</span><span class="p">,</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;graphql-api&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">)),</span>
6754
- <a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="p">(</span>
6755
- <a id="__codelineno-0-373" name="__codelineno-0-373"></a> <span class="s2">&quot;ipam&quot;</span><span class="p">,</span>
6756
- <a id="__codelineno-0-374" name="__codelineno-0-374"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;ipam-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6757
- <a id="__codelineno-0-375" name="__codelineno-0-375"></a> <span class="p">),</span>
6758
- <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="p">(</span>
6759
- <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="s2">&quot;plugins&quot;</span><span class="p">,</span>
6760
- <a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;plugins-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6761
- <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="p">),</span>
6762
- <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="p">(</span><span class="s2">&quot;status&quot;</span><span class="p">,</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;api-status&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">)),</span>
6763
- <a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="p">(</span>
6764
- <a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="s2">&quot;tenancy&quot;</span><span class="p">,</span>
6765
- <a id="__codelineno-0-383" name="__codelineno-0-383"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;tenancy-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6766
- <a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="p">),</span>
6767
- <a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="p">(</span>
6768
- <a id="__codelineno-0-386" name="__codelineno-0-386"></a> <span class="s2">&quot;users&quot;</span><span class="p">,</span>
6769
- <a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;users-api:api-root&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">),</span>
6770
- <a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="p">),</span>
6771
- <a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="p">(</span>
6772
- <a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="s2">&quot;virtualization&quot;</span><span class="p">,</span>
6773
- <a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="n">reverse</span><span class="p">(</span>
6774
- <a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="s2">&quot;virtualization-api:api-root&quot;</span><span class="p">,</span>
6775
- <a id="__codelineno-0-393" name="__codelineno-0-393"></a> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span>
6776
- <a id="__codelineno-0-394" name="__codelineno-0-394"></a> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">,</span>
6777
- <a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="p">),</span>
6778
- <a id="__codelineno-0-396" name="__codelineno-0-396"></a> <span class="p">),</span>
6779
- <a id="__codelineno-0-397" name="__codelineno-0-397"></a> <span class="p">)</span>
6780
- <a id="__codelineno-0-398" name="__codelineno-0-398"></a> <span class="p">)</span>
6781
- <a id="__codelineno-0-399" name="__codelineno-0-399"></a> <span class="p">)</span>
6714
+ <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="n">name</span> <span class="o">=</span> <span class="kc">None</span>
6715
+ <a id="__codelineno-0-352" name="__codelineno-0-352"></a> <span class="n">description</span> <span class="o">=</span> <span class="kc">None</span>
6782
6716
  </code></pre></div></td></tr></table></div>
6783
6717
  </details>
6784
6718
 
@@ -9489,39 +9423,39 @@ For example:</p>
9489
9423
 
9490
9424
  <details class="quote">
9491
9425
  <summary>Source code in <code>nautobot/extras/api/views.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-236">236</a></span>
9426
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-226">226</a></span>
9427
+ <span class="normal"><a href="#__codelineno-0-227">227</a></span>
9428
+ <span class="normal"><a href="#__codelineno-0-228">228</a></span>
9429
+ <span class="normal"><a href="#__codelineno-0-229">229</a></span>
9430
+ <span class="normal"><a href="#__codelineno-0-230">230</a></span>
9431
+ <span class="normal"><a href="#__codelineno-0-231">231</a></span>
9432
+ <span class="normal"><a href="#__codelineno-0-232">232</a></span>
9433
+ <span class="normal"><a href="#__codelineno-0-233">233</a></span>
9434
+ <span class="normal"><a href="#__codelineno-0-234">234</a></span>
9435
+ <span class="normal"><a href="#__codelineno-0-235">235</a></span>
9436
+ <span class="normal"><a href="#__codelineno-0-236">236</a></span>
9493
9437
  <span class="normal"><a href="#__codelineno-0-237">237</a></span>
9494
9438
  <span class="normal"><a href="#__codelineno-0-238">238</a></span>
9495
9439
  <span class="normal"><a href="#__codelineno-0-239">239</a></span>
9496
9440
  <span class="normal"><a href="#__codelineno-0-240">240</a></span>
9497
9441
  <span class="normal"><a href="#__codelineno-0-241">241</a></span>
9498
- <span class="normal"><a href="#__codelineno-0-242">242</a></span>
9499
- <span class="normal"><a href="#__codelineno-0-243">243</a></span>
9500
- <span class="normal"><a href="#__codelineno-0-244">244</a></span>
9501
- <span class="normal"><a href="#__codelineno-0-245">245</a></span>
9502
- <span class="normal"><a href="#__codelineno-0-246">246</a></span>
9503
- <span class="normal"><a href="#__codelineno-0-247">247</a></span>
9504
- <span class="normal"><a href="#__codelineno-0-248">248</a></span>
9505
- <span class="normal"><a href="#__codelineno-0-249">249</a></span>
9506
- <span class="normal"><a href="#__codelineno-0-250">250</a></span>
9507
- <span class="normal"><a href="#__codelineno-0-251">251</a></span>
9508
- <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-236" name="__codelineno-0-236"></a><span class="k">class</span> <span class="nc">CustomFieldModelViewSet</span><span class="p">(</span><span class="n">ModelViewSet</span><span class="p">):</span>
9509
- <a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9510
- <a id="__codelineno-0-238" name="__codelineno-0-238"></a><span class="sd"> Include the applicable set of CustomFields in the ModelViewSet context.</span>
9511
- <a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="sd"> &quot;&quot;&quot;</span>
9512
- <a id="__codelineno-0-240" name="__codelineno-0-240"></a>
9513
- <a id="__codelineno-0-241" name="__codelineno-0-241"></a> <span class="k">def</span> <span class="nf">get_serializer_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9514
- <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="c1"># Gather all custom fields for the model</span>
9515
- <a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
9516
- <a id="__codelineno-0-244" name="__codelineno-0-244"></a> <span class="n">custom_fields</span> <span class="o">=</span> <span class="n">content_type</span><span class="o">.</span><span class="n">custom_fields</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
9517
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a>
9518
- <a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_serializer_context</span><span class="p">()</span>
9519
- <a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
9520
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="p">{</span>
9521
- <a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="s2">&quot;custom_fields&quot;</span><span class="p">:</span> <span class="n">custom_fields</span><span class="p">,</span>
9522
- <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="p">}</span>
9523
- <a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="p">)</span>
9524
- <a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">return</span> <span class="n">context</span>
9442
+ <span class="normal"><a href="#__codelineno-0-242">242</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-226" name="__codelineno-0-226"></a><span class="k">class</span> <span class="nc">CustomFieldModelViewSet</span><span class="p">(</span><span class="n">ModelViewSet</span><span class="p">):</span>
9443
+ <a id="__codelineno-0-227" name="__codelineno-0-227"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9444
+ <a id="__codelineno-0-228" name="__codelineno-0-228"></a><span class="sd"> Include the applicable set of CustomFields in the ModelViewSet context.</span>
9445
+ <a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="sd"> &quot;&quot;&quot;</span>
9446
+ <a id="__codelineno-0-230" name="__codelineno-0-230"></a>
9447
+ <a id="__codelineno-0-231" name="__codelineno-0-231"></a> <span class="k">def</span> <span class="nf">get_serializer_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
9448
+ <a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="c1"># Gather all custom fields for the model</span>
9449
+ <a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
9450
+ <a id="__codelineno-0-234" name="__codelineno-0-234"></a> <span class="n">custom_fields</span> <span class="o">=</span> <span class="n">content_type</span><span class="o">.</span><span class="n">custom_fields</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
9451
+ <a id="__codelineno-0-235" name="__codelineno-0-235"></a>
9452
+ <a id="__codelineno-0-236" name="__codelineno-0-236"></a> <span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_serializer_context</span><span class="p">()</span>
9453
+ <a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
9454
+ <a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="p">{</span>
9455
+ <a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="s2">&quot;custom_fields&quot;</span><span class="p">:</span> <span class="n">custom_fields</span><span class="p">,</span>
9456
+ <a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="p">}</span>
9457
+ <a id="__codelineno-0-241" name="__codelineno-0-241"></a> <span class="p">)</span>
9458
+ <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="k">return</span> <span class="n">context</span>
9525
9459
  </code></pre></div></td></tr></table></div>
9526
9460
  </details>
9527
9461
 
@@ -9566,13 +9500,7 @@ containing verbose_name_plural, url and count.</p>
9566
9500
 
9567
9501
  <details class="quote">
9568
9502
  <summary>Source code in <code>nautobot/core/api/views.py</code></summary>
9569
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-803">803</a></span>
9570
- <span class="normal"><a href="#__codelineno-0-804">804</a></span>
9571
- <span class="normal"><a href="#__codelineno-0-805">805</a></span>
9572
- <span class="normal"><a href="#__codelineno-0-806">806</a></span>
9573
- <span class="normal"><a href="#__codelineno-0-807">807</a></span>
9574
- <span class="normal"><a href="#__codelineno-0-808">808</a></span>
9575
- <span class="normal"><a href="#__codelineno-0-809">809</a></span>
9503
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-809">809</a></span>
9576
9504
  <span class="normal"><a href="#__codelineno-0-810">810</a></span>
9577
9505
  <span class="normal"><a href="#__codelineno-0-811">811</a></span>
9578
9506
  <span class="normal"><a href="#__codelineno-0-812">812</a></span>
@@ -9625,66 +9553,72 @@ containing verbose_name_plural, url and count.</p>
9625
9553
  <span class="normal"><a href="#__codelineno-0-859">859</a></span>
9626
9554
  <span class="normal"><a href="#__codelineno-0-860">860</a></span>
9627
9555
  <span class="normal"><a href="#__codelineno-0-861">861</a></span>
9628
- <span class="normal"><a href="#__codelineno-0-862">862</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-803" name="__codelineno-0-803"></a><span class="k">class</span> <span class="nc">GetObjectCountsView</span><span class="p">(</span><span class="n">NautobotAPIVersionMixin</span><span class="p">,</span> <span class="n">APIView</span><span class="p">):</span>
9629
- <a id="__codelineno-0-804" name="__codelineno-0-804"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9630
- <a id="__codelineno-0-805" name="__codelineno-0-805"></a><span class="sd"> Enumerate the models listed on the Nautobot home page and return data structure</span>
9631
- <a id="__codelineno-0-806" name="__codelineno-0-806"></a><span class="sd"> containing verbose_name_plural, url and count.</span>
9632
- <a id="__codelineno-0-807" name="__codelineno-0-807"></a><span class="sd"> &quot;&quot;&quot;</span>
9633
- <a id="__codelineno-0-808" name="__codelineno-0-808"></a>
9634
- <a id="__codelineno-0-809" name="__codelineno-0-809"></a> <span class="n">permission_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">IsAuthenticated</span><span class="p">]</span>
9635
- <a id="__codelineno-0-810" name="__codelineno-0-810"></a>
9636
- <a id="__codelineno-0-811" name="__codelineno-0-811"></a> <span class="nd">@extend_schema</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9637
- <a id="__codelineno-0-812" name="__codelineno-0-812"></a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
9638
- <a id="__codelineno-0-813" name="__codelineno-0-813"></a> <span class="n">object_counts</span> <span class="o">=</span> <span class="p">{</span>
9639
- <a id="__codelineno-0-814" name="__codelineno-0-814"></a> <span class="s2">&quot;Inventory&quot;</span><span class="p">:</span> <span class="p">[</span>
9640
- <a id="__codelineno-0-815" name="__codelineno-0-815"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.rack&quot;</span><span class="p">},</span>
9641
- <a id="__codelineno-0-816" name="__codelineno-0-816"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.devicetype&quot;</span><span class="p">},</span>
9642
- <a id="__codelineno-0-817" name="__codelineno-0-817"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.device&quot;</span><span class="p">},</span>
9643
- <a id="__codelineno-0-818" name="__codelineno-0-818"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.virtualchassis&quot;</span><span class="p">},</span>
9644
- <a id="__codelineno-0-819" name="__codelineno-0-819"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.deviceredundancygroup&quot;</span><span class="p">},</span>
9645
- <a id="__codelineno-0-820" name="__codelineno-0-820"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.cable&quot;</span><span class="p">},</span>
9646
- <a id="__codelineno-0-821" name="__codelineno-0-821"></a> <span class="p">],</span>
9647
- <a id="__codelineno-0-822" name="__codelineno-0-822"></a> <span class="s2">&quot;Networks&quot;</span><span class="p">:</span> <span class="p">[</span>
9648
- <a id="__codelineno-0-823" name="__codelineno-0-823"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.vrf&quot;</span><span class="p">},</span>
9649
- <a id="__codelineno-0-824" name="__codelineno-0-824"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.prefix&quot;</span><span class="p">},</span>
9650
- <a id="__codelineno-0-825" name="__codelineno-0-825"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.ipaddress&quot;</span><span class="p">},</span>
9651
- <a id="__codelineno-0-826" name="__codelineno-0-826"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.vlan&quot;</span><span class="p">},</span>
9556
+ <span class="normal"><a href="#__codelineno-0-862">862</a></span>
9557
+ <span class="normal"><a href="#__codelineno-0-863">863</a></span>
9558
+ <span class="normal"><a href="#__codelineno-0-864">864</a></span>
9559
+ <span class="normal"><a href="#__codelineno-0-865">865</a></span>
9560
+ <span class="normal"><a href="#__codelineno-0-866">866</a></span>
9561
+ <span class="normal"><a href="#__codelineno-0-867">867</a></span>
9562
+ <span class="normal"><a href="#__codelineno-0-868">868</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-809" name="__codelineno-0-809"></a><span class="k">class</span> <span class="nc">GetObjectCountsView</span><span class="p">(</span><span class="n">NautobotAPIVersionMixin</span><span class="p">,</span> <span class="n">APIView</span><span class="p">):</span>
9563
+ <a id="__codelineno-0-810" name="__codelineno-0-810"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9564
+ <a id="__codelineno-0-811" name="__codelineno-0-811"></a><span class="sd"> Enumerate the models listed on the Nautobot home page and return data structure</span>
9565
+ <a id="__codelineno-0-812" name="__codelineno-0-812"></a><span class="sd"> containing verbose_name_plural, url and count.</span>
9566
+ <a id="__codelineno-0-813" name="__codelineno-0-813"></a><span class="sd"> &quot;&quot;&quot;</span>
9567
+ <a id="__codelineno-0-814" name="__codelineno-0-814"></a>
9568
+ <a id="__codelineno-0-815" name="__codelineno-0-815"></a> <span class="n">permission_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">IsAuthenticated</span><span class="p">]</span>
9569
+ <a id="__codelineno-0-816" name="__codelineno-0-816"></a>
9570
+ <a id="__codelineno-0-817" name="__codelineno-0-817"></a> <span class="nd">@extend_schema</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
9571
+ <a id="__codelineno-0-818" name="__codelineno-0-818"></a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
9572
+ <a id="__codelineno-0-819" name="__codelineno-0-819"></a> <span class="n">object_counts</span> <span class="o">=</span> <span class="p">{</span>
9573
+ <a id="__codelineno-0-820" name="__codelineno-0-820"></a> <span class="s2">&quot;Inventory&quot;</span><span class="p">:</span> <span class="p">[</span>
9574
+ <a id="__codelineno-0-821" name="__codelineno-0-821"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.rack&quot;</span><span class="p">},</span>
9575
+ <a id="__codelineno-0-822" name="__codelineno-0-822"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.devicetype&quot;</span><span class="p">},</span>
9576
+ <a id="__codelineno-0-823" name="__codelineno-0-823"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.device&quot;</span><span class="p">},</span>
9577
+ <a id="__codelineno-0-824" name="__codelineno-0-824"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.virtualchassis&quot;</span><span class="p">},</span>
9578
+ <a id="__codelineno-0-825" name="__codelineno-0-825"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.deviceredundancygroup&quot;</span><span class="p">},</span>
9579
+ <a id="__codelineno-0-826" name="__codelineno-0-826"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;dcim.cable&quot;</span><span class="p">},</span>
9652
9580
  <a id="__codelineno-0-827" name="__codelineno-0-827"></a> <span class="p">],</span>
9653
- <a id="__codelineno-0-828" name="__codelineno-0-828"></a> <span class="s2">&quot;Security&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.secret&quot;</span><span class="p">}],</span>
9654
- <a id="__codelineno-0-829" name="__codelineno-0-829"></a> <span class="s2">&quot;Platform&quot;</span><span class="p">:</span> <span class="p">[</span>
9655
- <a id="__codelineno-0-830" name="__codelineno-0-830"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.gitrepository&quot;</span><span class="p">},</span>
9656
- <a id="__codelineno-0-831" name="__codelineno-0-831"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.relationship&quot;</span><span class="p">},</span>
9657
- <a id="__codelineno-0-832" name="__codelineno-0-832"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.computedfield&quot;</span><span class="p">},</span>
9658
- <a id="__codelineno-0-833" name="__codelineno-0-833"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.customfield&quot;</span><span class="p">},</span>
9659
- <a id="__codelineno-0-834" name="__codelineno-0-834"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.customlink&quot;</span><span class="p">},</span>
9660
- <a id="__codelineno-0-835" name="__codelineno-0-835"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.tag&quot;</span><span class="p">},</span>
9661
- <a id="__codelineno-0-836" name="__codelineno-0-836"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.status&quot;</span><span class="p">},</span>
9662
- <a id="__codelineno-0-837" name="__codelineno-0-837"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.role&quot;</span><span class="p">},</span>
9663
- <a id="__codelineno-0-838" name="__codelineno-0-838"></a> <span class="p">],</span>
9664
- <a id="__codelineno-0-839" name="__codelineno-0-839"></a> <span class="p">}</span>
9665
- <a id="__codelineno-0-840" name="__codelineno-0-840"></a>
9666
- <a id="__codelineno-0-841" name="__codelineno-0-841"></a> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="o">*</span><span class="n">object_counts</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
9667
- <a id="__codelineno-0-842" name="__codelineno-0-842"></a> <span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">entry</span><span class="p">[</span><span class="s2">&quot;model&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
9668
- <a id="__codelineno-0-843" name="__codelineno-0-843"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span><span class="p">)</span>
9669
- <a id="__codelineno-0-844" name="__codelineno-0-844"></a> <span class="n">permission</span> <span class="o">=</span> <span class="n">get_permission_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)</span>
9670
- <a id="__codelineno-0-845" name="__codelineno-0-845"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="n">permission</span><span class="p">):</span>
9671
- <a id="__codelineno-0-846" name="__codelineno-0-846"></a> <span class="k">continue</span>
9672
- <a id="__codelineno-0-847" name="__codelineno-0-847"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">}</span>
9673
- <a id="__codelineno-0-848" name="__codelineno-0-848"></a> <span class="k">try</span><span class="p">:</span>
9674
- <a id="__codelineno-0-849" name="__codelineno-0-849"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">django_reverse</span><span class="p">(</span><span class="n">get_route_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;list&quot;</span><span class="p">))</span>
9675
- <a id="__codelineno-0-850" name="__codelineno-0-850"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
9676
- <a id="__codelineno-0-851" name="__codelineno-0-851"></a> <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
9677
- <a id="__codelineno-0-852" name="__codelineno-0-852"></a> <span class="n">route</span> <span class="o">=</span> <span class="n">get_route_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;list&quot;</span><span class="p">)</span>
9678
- <a id="__codelineno-0-853" name="__codelineno-0-853"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Handled expected exception when generating filter field: </span><span class="si">{</span><span class="n">route</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
9679
- <a id="__codelineno-0-854" name="__codelineno-0-854"></a> <span class="n">manager</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span>
9680
- <a id="__codelineno-0-855" name="__codelineno-0-855"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="n">permission</span><span class="p">):</span>
9681
- <a id="__codelineno-0-856" name="__codelineno-0-856"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">manager</span><span class="p">,</span> <span class="s2">&quot;restrict&quot;</span><span class="p">):</span>
9682
- <a id="__codelineno-0-857" name="__codelineno-0-857"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;count&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
9683
- <a id="__codelineno-0-858" name="__codelineno-0-858"></a> <span class="k">else</span><span class="p">:</span>
9684
- <a id="__codelineno-0-859" name="__codelineno-0-859"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;count&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
9685
- <a id="__codelineno-0-860" name="__codelineno-0-860"></a> <span class="n">entry</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
9686
- <a id="__codelineno-0-861" name="__codelineno-0-861"></a>
9687
- <a id="__codelineno-0-862" name="__codelineno-0-862"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">object_counts</span><span class="p">)</span>
9581
+ <a id="__codelineno-0-828" name="__codelineno-0-828"></a> <span class="s2">&quot;Networks&quot;</span><span class="p">:</span> <span class="p">[</span>
9582
+ <a id="__codelineno-0-829" name="__codelineno-0-829"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.vrf&quot;</span><span class="p">},</span>
9583
+ <a id="__codelineno-0-830" name="__codelineno-0-830"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.prefix&quot;</span><span class="p">},</span>
9584
+ <a id="__codelineno-0-831" name="__codelineno-0-831"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.ipaddress&quot;</span><span class="p">},</span>
9585
+ <a id="__codelineno-0-832" name="__codelineno-0-832"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;ipam.vlan&quot;</span><span class="p">},</span>
9586
+ <a id="__codelineno-0-833" name="__codelineno-0-833"></a> <span class="p">],</span>
9587
+ <a id="__codelineno-0-834" name="__codelineno-0-834"></a> <span class="s2">&quot;Security&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.secret&quot;</span><span class="p">}],</span>
9588
+ <a id="__codelineno-0-835" name="__codelineno-0-835"></a> <span class="s2">&quot;Platform&quot;</span><span class="p">:</span> <span class="p">[</span>
9589
+ <a id="__codelineno-0-836" name="__codelineno-0-836"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.gitrepository&quot;</span><span class="p">},</span>
9590
+ <a id="__codelineno-0-837" name="__codelineno-0-837"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.relationship&quot;</span><span class="p">},</span>
9591
+ <a id="__codelineno-0-838" name="__codelineno-0-838"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.computedfield&quot;</span><span class="p">},</span>
9592
+ <a id="__codelineno-0-839" name="__codelineno-0-839"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.customfield&quot;</span><span class="p">},</span>
9593
+ <a id="__codelineno-0-840" name="__codelineno-0-840"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.customlink&quot;</span><span class="p">},</span>
9594
+ <a id="__codelineno-0-841" name="__codelineno-0-841"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.tag&quot;</span><span class="p">},</span>
9595
+ <a id="__codelineno-0-842" name="__codelineno-0-842"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.status&quot;</span><span class="p">},</span>
9596
+ <a id="__codelineno-0-843" name="__codelineno-0-843"></a> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="s2">&quot;extras.role&quot;</span><span class="p">},</span>
9597
+ <a id="__codelineno-0-844" name="__codelineno-0-844"></a> <span class="p">],</span>
9598
+ <a id="__codelineno-0-845" name="__codelineno-0-845"></a> <span class="p">}</span>
9599
+ <a id="__codelineno-0-846" name="__codelineno-0-846"></a>
9600
+ <a id="__codelineno-0-847" name="__codelineno-0-847"></a> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="o">*</span><span class="n">object_counts</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
9601
+ <a id="__codelineno-0-848" name="__codelineno-0-848"></a> <span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">entry</span><span class="p">[</span><span class="s2">&quot;model&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
9602
+ <a id="__codelineno-0-849" name="__codelineno-0-849"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span><span class="p">)</span>
9603
+ <a id="__codelineno-0-850" name="__codelineno-0-850"></a> <span class="n">permission</span> <span class="o">=</span> <span class="n">get_permission_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)</span>
9604
+ <a id="__codelineno-0-851" name="__codelineno-0-851"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="n">permission</span><span class="p">):</span>
9605
+ <a id="__codelineno-0-852" name="__codelineno-0-852"></a> <span class="k">continue</span>
9606
+ <a id="__codelineno-0-853" name="__codelineno-0-853"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">}</span>
9607
+ <a id="__codelineno-0-854" name="__codelineno-0-854"></a> <span class="k">try</span><span class="p">:</span>
9608
+ <a id="__codelineno-0-855" name="__codelineno-0-855"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">django_reverse</span><span class="p">(</span><span class="n">get_route_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;list&quot;</span><span class="p">))</span>
9609
+ <a id="__codelineno-0-856" name="__codelineno-0-856"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
9610
+ <a id="__codelineno-0-857" name="__codelineno-0-857"></a> <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
9611
+ <a id="__codelineno-0-858" name="__codelineno-0-858"></a> <span class="n">route</span> <span class="o">=</span> <span class="n">get_route_for_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;list&quot;</span><span class="p">)</span>
9612
+ <a id="__codelineno-0-859" name="__codelineno-0-859"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Handled expected exception when generating filter field: </span><span class="si">{</span><span class="n">route</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
9613
+ <a id="__codelineno-0-860" name="__codelineno-0-860"></a> <span class="n">manager</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span>
9614
+ <a id="__codelineno-0-861" name="__codelineno-0-861"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="n">permission</span><span class="p">):</span>
9615
+ <a id="__codelineno-0-862" name="__codelineno-0-862"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">manager</span><span class="p">,</span> <span class="s2">&quot;restrict&quot;</span><span class="p">):</span>
9616
+ <a id="__codelineno-0-863" name="__codelineno-0-863"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;count&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
9617
+ <a id="__codelineno-0-864" name="__codelineno-0-864"></a> <span class="k">else</span><span class="p">:</span>
9618
+ <a id="__codelineno-0-865" name="__codelineno-0-865"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;count&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
9619
+ <a id="__codelineno-0-866" name="__codelineno-0-866"></a> <span class="n">entry</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
9620
+ <a id="__codelineno-0-867" name="__codelineno-0-867"></a>
9621
+ <a id="__codelineno-0-868" name="__codelineno-0-868"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">object_counts</span><span class="p">)</span>
9688
9622
  </code></pre></div></td></tr></table></div>
9689
9623
  </details>
9690
9624
 
@@ -12709,15 +12643,15 @@ could we then literally have the parser just return list(reader) and not need th
12709
12643
 
12710
12644
  <details class="quote">
12711
12645
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
12712
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-255">255</a></span>
12713
- <span class="normal"><a href="#__codelineno-0-256">256</a></span>
12714
- <span class="normal"><a href="#__codelineno-0-257">257</a></span>
12715
- <span class="normal"><a href="#__codelineno-0-258">258</a></span>
12716
- <span class="normal"><a href="#__codelineno-0-259">259</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-255" name="__codelineno-0-255"></a><span class="k">class</span> <span class="nc">NautobotModelViewSet</span><span class="p">(</span><span class="n">NotesViewSetMixin</span><span class="p">,</span> <span class="n">CustomFieldModelViewSet</span><span class="p">):</span>
12717
- <a id="__codelineno-0-256" name="__codelineno-0-256"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Base class to use for API ViewSets based on OrganizationalModel or PrimaryModel.</span>
12718
- <a id="__codelineno-0-257" name="__codelineno-0-257"></a>
12719
- <a id="__codelineno-0-258" name="__codelineno-0-258"></a><span class="sd"> Can also be used for models derived from BaseModel, so long as they support Notes.</span>
12720
- <a id="__codelineno-0-259" name="__codelineno-0-259"></a><span class="sd"> &quot;&quot;&quot;</span>
12646
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-245">245</a></span>
12647
+ <span class="normal"><a href="#__codelineno-0-246">246</a></span>
12648
+ <span class="normal"><a href="#__codelineno-0-247">247</a></span>
12649
+ <span class="normal"><a href="#__codelineno-0-248">248</a></span>
12650
+ <span class="normal"><a href="#__codelineno-0-249">249</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="k">class</span> <span class="nc">NautobotModelViewSet</span><span class="p">(</span><span class="n">NotesViewSetMixin</span><span class="p">,</span> <span class="n">CustomFieldModelViewSet</span><span class="p">):</span>
12651
+ <a id="__codelineno-0-246" name="__codelineno-0-246"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Base class to use for API ViewSets based on OrganizationalModel or PrimaryModel.</span>
12652
+ <a id="__codelineno-0-247" name="__codelineno-0-247"></a>
12653
+ <a id="__codelineno-0-248" name="__codelineno-0-248"></a><span class="sd"> Can also be used for models derived from BaseModel, so long as they support Notes.</span>
12654
+ <a id="__codelineno-0-249" name="__codelineno-0-249"></a><span class="sd"> &quot;&quot;&quot;</span>
12721
12655
  </code></pre></div></td></tr></table></div>
12722
12656
  </details>
12723
12657
 
@@ -12881,7 +12815,17 @@ could we then literally have the parser just return list(reader) and not need th
12881
12815
 
12882
12816
  <details class="quote">
12883
12817
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
12884
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-86"> 86</a></span>
12818
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-76"> 76</a></span>
12819
+ <span class="normal"><a href="#__codelineno-0-77"> 77</a></span>
12820
+ <span class="normal"><a href="#__codelineno-0-78"> 78</a></span>
12821
+ <span class="normal"><a href="#__codelineno-0-79"> 79</a></span>
12822
+ <span class="normal"><a href="#__codelineno-0-80"> 80</a></span>
12823
+ <span class="normal"><a href="#__codelineno-0-81"> 81</a></span>
12824
+ <span class="normal"><a href="#__codelineno-0-82"> 82</a></span>
12825
+ <span class="normal"><a href="#__codelineno-0-83"> 83</a></span>
12826
+ <span class="normal"><a href="#__codelineno-0-84"> 84</a></span>
12827
+ <span class="normal"><a href="#__codelineno-0-85"> 85</a></span>
12828
+ <span class="normal"><a href="#__codelineno-0-86"> 86</a></span>
12885
12829
  <span class="normal"><a href="#__codelineno-0-87"> 87</a></span>
12886
12830
  <span class="normal"><a href="#__codelineno-0-88"> 88</a></span>
12887
12831
  <span class="normal"><a href="#__codelineno-0-89"> 89</a></span>
@@ -12919,65 +12863,55 @@ could we then literally have the parser just return list(reader) and not need th
12919
12863
  <span class="normal"><a href="#__codelineno-0-121">121</a></span>
12920
12864
  <span class="normal"><a href="#__codelineno-0-122">122</a></span>
12921
12865
  <span class="normal"><a href="#__codelineno-0-123">123</a></span>
12922
- <span class="normal"><a href="#__codelineno-0-124">124</a></span>
12923
- <span class="normal"><a href="#__codelineno-0-125">125</a></span>
12924
- <span class="normal"><a href="#__codelineno-0-126">126</a></span>
12925
- <span class="normal"><a href="#__codelineno-0-127">127</a></span>
12926
- <span class="normal"><a href="#__codelineno-0-128">128</a></span>
12927
- <span class="normal"><a href="#__codelineno-0-129">129</a></span>
12928
- <span class="normal"><a href="#__codelineno-0-130">130</a></span>
12929
- <span class="normal"><a href="#__codelineno-0-131">131</a></span>
12930
- <span class="normal"><a href="#__codelineno-0-132">132</a></span>
12931
- <span class="normal"><a href="#__codelineno-0-133">133</a></span>
12932
- <span class="normal"><a href="#__codelineno-0-134">134</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-86" name="__codelineno-0-86"></a><span class="k">class</span> <span class="nc">NotesViewSetMixin</span><span class="p">:</span>
12933
- <a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="k">def</span> <span class="nf">restrict_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
12934
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12935
- <a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="sd"> Apply &quot;view&quot; permissions on the POST /notes/ endpoint, otherwise as ModelViewSetMixin.</span>
12936
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> &quot;&quot;&quot;</span>
12937
- <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">is_authenticated</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;notes&quot;</span><span class="p">:</span>
12938
- <a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)</span>
12939
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="k">else</span><span class="p">:</span>
12940
- <a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">restrict_queryset</span><span class="p">(</span><span class="n">request</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>
12941
- <a id="__codelineno-0-95" name="__codelineno-0-95"></a>
12942
- <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="k">class</span> <span class="nc">CreateNotePermissions</span><span class="p">(</span><span class="n">TokenPermissions</span><span class="p">):</span>
12943
- <a id="__codelineno-0-97" name="__codelineno-0-97"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;As nautobot.core.api.authentication.TokenPermissions, but enforcing add_note permission.&quot;&quot;&quot;</span>
12944
- <a id="__codelineno-0-98" name="__codelineno-0-98"></a>
12945
- <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="n">perms_map</span> <span class="o">=</span> <span class="p">{</span>
12946
- <a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="s2">&quot;GET&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.view_note&quot;</span><span class="p">],</span>
12947
- <a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="s2">&quot;POST&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.add_note&quot;</span><span class="p">],</span>
12948
- <a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="p">}</span>
12949
- <a id="__codelineno-0-103" name="__codelineno-0-103"></a>
12950
- <a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="nd">@extend_schema</span><span class="p">(</span><span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">],</span> <span class="n">filters</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">200</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">)})</span>
12951
- <a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="nd">@extend_schema</span><span class="p">(</span>
12952
- <a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;post&quot;</span><span class="p">],</span>
12953
- <a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="n">request</span><span class="o">=</span><span class="n">serializers</span><span class="o">.</span><span class="n">NoteInputSerializer</span><span class="p">,</span>
12954
- <a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">201</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">False</span><span class="p">)},</span>
12955
- <a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="p">)</span>
12956
- <a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="nd">@action</span><span class="p">(</span><span class="n">detail</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">url_path</span><span class="o">=</span><span class="s2">&quot;notes&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">,</span> <span class="s2">&quot;post&quot;</span><span class="p">],</span> <span class="n">permission_classes</span><span class="o">=</span><span class="p">[</span><span class="n">CreateNotePermissions</span><span class="p">])</span>
12957
- <a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="k">def</span> <span class="nf">notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
12958
- <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12959
- <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> API methods for returning or creating notes on an object.</span>
12960
- <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> &quot;&quot;&quot;</span>
12961
- <a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span>
12962
- <a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_url_kwarg</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">]}</span>
12963
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="p">)</span>
12964
- <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
12965
- <a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
12966
- <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">data</span>
12967
- <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span>
12968
- <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span>
12969
- <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
12970
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a>
12971
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="c1"># Create the new Note.</span>
12972
- <a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">is_valid</span><span class="p">(</span><span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
12973
- <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">user</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
12974
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="o">.</span><span class="n">HTTP_201_CREATED</span><span class="p">)</span>
12975
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a>
12976
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="k">else</span><span class="p">:</span>
12977
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="n">notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginate_queryset</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">notes</span><span class="p">)</span>
12978
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">notes</span><span class="p">,</span> <span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
12979
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a>
12980
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_paginated_response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
12866
+ <span class="normal"><a href="#__codelineno-0-124">124</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="k">class</span> <span class="nc">NotesViewSetMixin</span><span class="p">:</span>
12867
+ <a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="k">def</span> <span class="nf">restrict_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
12868
+ <a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12869
+ <a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> Apply &quot;view&quot; permissions on the POST /notes/ endpoint, otherwise as ModelViewSetMixin.</span>
12870
+ <a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> &quot;&quot;&quot;</span>
12871
+ <a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">is_authenticated</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;notes&quot;</span><span class="p">:</span>
12872
+ <a id="__codelineno-0-82" name="__codelineno-0-82"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)</span>
12873
+ <a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="k">else</span><span class="p">:</span>
12874
+ <a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">restrict_queryset</span><span class="p">(</span><span class="n">request</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>
12875
+ <a id="__codelineno-0-85" name="__codelineno-0-85"></a>
12876
+ <a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="k">class</span> <span class="nc">CreateNotePermissions</span><span class="p">(</span><span class="n">TokenPermissions</span><span class="p">):</span>
12877
+ <a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;As nautobot.core.api.authentication.TokenPermissions, but enforcing add_note permission.&quot;&quot;&quot;</span>
12878
+ <a id="__codelineno-0-88" name="__codelineno-0-88"></a>
12879
+ <a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="n">perms_map</span> <span class="o">=</span> <span class="p">{</span>
12880
+ <a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="s2">&quot;GET&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.view_note&quot;</span><span class="p">],</span>
12881
+ <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="s2">&quot;POST&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.add_note&quot;</span><span class="p">],</span>
12882
+ <a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="p">}</span>
12883
+ <a id="__codelineno-0-93" name="__codelineno-0-93"></a>
12884
+ <a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="nd">@extend_schema</span><span class="p">(</span><span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">],</span> <span class="n">filters</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">200</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">)})</span>
12885
+ <a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="nd">@extend_schema</span><span class="p">(</span>
12886
+ <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;post&quot;</span><span class="p">],</span>
12887
+ <a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">request</span><span class="o">=</span><span class="n">serializers</span><span class="o">.</span><span class="n">NoteInputSerializer</span><span class="p">,</span>
12888
+ <a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">201</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">False</span><span class="p">)},</span>
12889
+ <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="p">)</span>
12890
+ <a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="nd">@action</span><span class="p">(</span><span class="n">detail</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">url_path</span><span class="o">=</span><span class="s2">&quot;notes&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">,</span> <span class="s2">&quot;post&quot;</span><span class="p">],</span> <span class="n">permission_classes</span><span class="o">=</span><span class="p">[</span><span class="n">CreateNotePermissions</span><span class="p">])</span>
12891
+ <a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="k">def</span> <span class="nf">notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
12892
+ <a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12893
+ <a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> API methods for returning or creating notes on an object.</span>
12894
+ <a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="sd"> &quot;&quot;&quot;</span>
12895
+ <a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span>
12896
+ <a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_url_kwarg</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">]}</span>
12897
+ <a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="p">)</span>
12898
+ <a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
12899
+ <a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
12900
+ <a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">data</span>
12901
+ <a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span>
12902
+ <a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span>
12903
+ <a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
12904
+ <a id="__codelineno-0-114" name="__codelineno-0-114"></a>
12905
+ <a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="c1"># Create the new Note.</span>
12906
+ <a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">is_valid</span><span class="p">(</span><span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
12907
+ <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">user</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
12908
+ <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="o">.</span><span class="n">HTTP_201_CREATED</span><span class="p">)</span>
12909
+ <a id="__codelineno-0-119" name="__codelineno-0-119"></a>
12910
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="k">else</span><span class="p">:</span>
12911
+ <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginate_queryset</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">notes</span><span class="p">)</span>
12912
+ <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">notes</span><span class="p">,</span> <span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
12913
+ <a id="__codelineno-0-123" name="__codelineno-0-123"></a>
12914
+ <a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_paginated_response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
12981
12915
  </code></pre></div></td></tr></table></div>
12982
12916
  </details>
12983
12917
 
@@ -13012,19 +12946,19 @@ could we then literally have the parser just return list(reader) and not need th
13012
12946
 
13013
12947
  <details class="quote">
13014
12948
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
13015
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-96"> 96</a></span>
13016
- <span class="normal"><a href="#__codelineno-0-97"> 97</a></span>
13017
- <span class="normal"><a href="#__codelineno-0-98"> 98</a></span>
13018
- <span class="normal"><a href="#__codelineno-0-99"> 99</a></span>
13019
- <span class="normal"><a href="#__codelineno-0-100">100</a></span>
13020
- <span class="normal"><a href="#__codelineno-0-101">101</a></span>
13021
- <span class="normal"><a href="#__codelineno-0-102">102</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-96" name="__codelineno-0-96"></a><span class="k">class</span> <span class="nc">CreateNotePermissions</span><span class="p">(</span><span class="n">TokenPermissions</span><span class="p">):</span>
13022
- <a id="__codelineno-0-97" name="__codelineno-0-97"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;As nautobot.core.api.authentication.TokenPermissions, but enforcing add_note permission.&quot;&quot;&quot;</span>
13023
- <a id="__codelineno-0-98" name="__codelineno-0-98"></a>
13024
- <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="n">perms_map</span> <span class="o">=</span> <span class="p">{</span>
13025
- <a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="s2">&quot;GET&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.view_note&quot;</span><span class="p">],</span>
13026
- <a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="s2">&quot;POST&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.add_note&quot;</span><span class="p">],</span>
13027
- <a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="p">}</span>
12949
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-86">86</a></span>
12950
+ <span class="normal"><a href="#__codelineno-0-87">87</a></span>
12951
+ <span class="normal"><a href="#__codelineno-0-88">88</a></span>
12952
+ <span class="normal"><a href="#__codelineno-0-89">89</a></span>
12953
+ <span class="normal"><a href="#__codelineno-0-90">90</a></span>
12954
+ <span class="normal"><a href="#__codelineno-0-91">91</a></span>
12955
+ <span class="normal"><a href="#__codelineno-0-92">92</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-86" name="__codelineno-0-86"></a><span class="k">class</span> <span class="nc">CreateNotePermissions</span><span class="p">(</span><span class="n">TokenPermissions</span><span class="p">):</span>
12956
+ <a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;As nautobot.core.api.authentication.TokenPermissions, but enforcing add_note permission.&quot;&quot;&quot;</span>
12957
+ <a id="__codelineno-0-88" name="__codelineno-0-88"></a>
12958
+ <a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="n">perms_map</span> <span class="o">=</span> <span class="p">{</span>
12959
+ <a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="s2">&quot;GET&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.view_note&quot;</span><span class="p">],</span>
12960
+ <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="s2">&quot;POST&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%(app_label)s</span><span class="s2">.view_</span><span class="si">%(model_name)s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;extras.add_note&quot;</span><span class="p">],</span>
12961
+ <a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="p">}</span>
13028
12962
  </code></pre></div></td></tr></table></div>
13029
12963
  </details>
13030
12964
 
@@ -13066,7 +13000,17 @@ could we then literally have the parser just return list(reader) and not need th
13066
13000
 
13067
13001
  <details class="quote">
13068
13002
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
13069
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-104">104</a></span>
13003
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-94"> 94</a></span>
13004
+ <span class="normal"><a href="#__codelineno-0-95"> 95</a></span>
13005
+ <span class="normal"><a href="#__codelineno-0-96"> 96</a></span>
13006
+ <span class="normal"><a href="#__codelineno-0-97"> 97</a></span>
13007
+ <span class="normal"><a href="#__codelineno-0-98"> 98</a></span>
13008
+ <span class="normal"><a href="#__codelineno-0-99"> 99</a></span>
13009
+ <span class="normal"><a href="#__codelineno-0-100">100</a></span>
13010
+ <span class="normal"><a href="#__codelineno-0-101">101</a></span>
13011
+ <span class="normal"><a href="#__codelineno-0-102">102</a></span>
13012
+ <span class="normal"><a href="#__codelineno-0-103">103</a></span>
13013
+ <span class="normal"><a href="#__codelineno-0-104">104</a></span>
13070
13014
  <span class="normal"><a href="#__codelineno-0-105">105</a></span>
13071
13015
  <span class="normal"><a href="#__codelineno-0-106">106</a></span>
13072
13016
  <span class="normal"><a href="#__codelineno-0-107">107</a></span>
@@ -13086,47 +13030,37 @@ could we then literally have the parser just return list(reader) and not need th
13086
13030
  <span class="normal"><a href="#__codelineno-0-121">121</a></span>
13087
13031
  <span class="normal"><a href="#__codelineno-0-122">122</a></span>
13088
13032
  <span class="normal"><a href="#__codelineno-0-123">123</a></span>
13089
- <span class="normal"><a href="#__codelineno-0-124">124</a></span>
13090
- <span class="normal"><a href="#__codelineno-0-125">125</a></span>
13091
- <span class="normal"><a href="#__codelineno-0-126">126</a></span>
13092
- <span class="normal"><a href="#__codelineno-0-127">127</a></span>
13093
- <span class="normal"><a href="#__codelineno-0-128">128</a></span>
13094
- <span class="normal"><a href="#__codelineno-0-129">129</a></span>
13095
- <span class="normal"><a href="#__codelineno-0-130">130</a></span>
13096
- <span class="normal"><a href="#__codelineno-0-131">131</a></span>
13097
- <span class="normal"><a href="#__codelineno-0-132">132</a></span>
13098
- <span class="normal"><a href="#__codelineno-0-133">133</a></span>
13099
- <span class="normal"><a href="#__codelineno-0-134">134</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="nd">@extend_schema</span><span class="p">(</span><span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">],</span> <span class="n">filters</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">200</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">)})</span>
13100
- <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="nd">@extend_schema</span><span class="p">(</span>
13101
- <a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;post&quot;</span><span class="p">],</span>
13102
- <a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="n">request</span><span class="o">=</span><span class="n">serializers</span><span class="o">.</span><span class="n">NoteInputSerializer</span><span class="p">,</span>
13103
- <a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">201</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">False</span><span class="p">)},</span>
13104
- <a id="__codelineno-0-109" name="__codelineno-0-109"></a><span class="p">)</span>
13105
- <a id="__codelineno-0-110" name="__codelineno-0-110"></a><span class="nd">@action</span><span class="p">(</span><span class="n">detail</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">url_path</span><span class="o">=</span><span class="s2">&quot;notes&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">,</span> <span class="s2">&quot;post&quot;</span><span class="p">],</span> <span class="n">permission_classes</span><span class="o">=</span><span class="p">[</span><span class="n">CreateNotePermissions</span><span class="p">])</span>
13106
- <a id="__codelineno-0-111" name="__codelineno-0-111"></a><span class="k">def</span> <span class="nf">notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
13107
- <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13108
- <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> API methods for returning or creating notes on an object.</span>
13109
- <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> &quot;&quot;&quot;</span>
13110
- <a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span>
13111
- <a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_url_kwarg</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">]}</span>
13112
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="p">)</span>
13113
- <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
13114
- <a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
13115
- <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">data</span>
13116
- <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span>
13117
- <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span>
13118
- <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
13119
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a>
13120
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="c1"># Create the new Note.</span>
13121
- <a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">is_valid</span><span class="p">(</span><span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
13122
- <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">user</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
13123
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="o">.</span><span class="n">HTTP_201_CREATED</span><span class="p">)</span>
13124
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a>
13125
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="k">else</span><span class="p">:</span>
13126
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="n">notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginate_queryset</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">notes</span><span class="p">)</span>
13127
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">notes</span><span class="p">,</span> <span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
13128
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a>
13129
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_paginated_response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
13033
+ <span class="normal"><a href="#__codelineno-0-124">124</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-94" name="__codelineno-0-94"></a><span class="nd">@extend_schema</span><span class="p">(</span><span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">],</span> <span class="n">filters</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">200</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">)})</span>
13034
+ <a id="__codelineno-0-95" name="__codelineno-0-95"></a><span class="nd">@extend_schema</span><span class="p">(</span>
13035
+ <a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;post&quot;</span><span class="p">],</span>
13036
+ <a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">request</span><span class="o">=</span><span class="n">serializers</span><span class="o">.</span><span class="n">NoteInputSerializer</span><span class="p">,</span>
13037
+ <a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="n">responses</span><span class="o">=</span><span class="p">{</span><span class="mi">201</span><span class="p">:</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">False</span><span class="p">)},</span>
13038
+ <a id="__codelineno-0-99" name="__codelineno-0-99"></a><span class="p">)</span>
13039
+ <a id="__codelineno-0-100" name="__codelineno-0-100"></a><span class="nd">@action</span><span class="p">(</span><span class="n">detail</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">url_path</span><span class="o">=</span><span class="s2">&quot;notes&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">,</span> <span class="s2">&quot;post&quot;</span><span class="p">],</span> <span class="n">permission_classes</span><span class="o">=</span><span class="p">[</span><span class="n">CreateNotePermissions</span><span class="p">])</span>
13040
+ <a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="k">def</span> <span class="nf">notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
13041
+ <a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13042
+ <a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> API methods for returning or creating notes on an object.</span>
13043
+ <a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="sd"> &quot;&quot;&quot;</span>
13044
+ <a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span>
13045
+ <a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">lookup_url_kwarg</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">lookup_field</span><span class="p">]}</span>
13046
+ <a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="p">)</span>
13047
+ <a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
13048
+ <a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
13049
+ <a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">data</span>
13050
+ <a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span>
13051
+ <a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;assigned_object_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">content_type</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">&quot;</span>
13052
+ <a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
13053
+ <a id="__codelineno-0-114" name="__codelineno-0-114"></a>
13054
+ <a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="c1"># Create the new Note.</span>
13055
+ <a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">is_valid</span><span class="p">(</span><span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
13056
+ <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="n">serializer</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">user</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
13057
+ <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="o">.</span><span class="n">HTTP_201_CREATED</span><span class="p">)</span>
13058
+ <a id="__codelineno-0-119" name="__codelineno-0-119"></a>
13059
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="k">else</span><span class="p">:</span>
13060
+ <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginate_queryset</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">notes</span><span class="p">)</span>
13061
+ <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">serializer</span> <span class="o">=</span> <span class="n">serializers</span><span class="o">.</span><span class="n">NoteSerializer</span><span class="p">(</span><span class="n">notes</span><span class="p">,</span> <span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">})</span>
13062
+ <a id="__codelineno-0-123" name="__codelineno-0-123"></a>
13063
+ <a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_paginated_response</span><span class="p">(</span><span class="n">serializer</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
13130
13064
  </code></pre></div></td></tr></table></div>
13131
13065
  </details>
13132
13066
  </div>
@@ -13150,21 +13084,21 @@ could we then literally have the parser just return list(reader) and not need th
13150
13084
 
13151
13085
  <details class="quote">
13152
13086
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
13153
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-87">87</a></span>
13154
- <span class="normal"><a href="#__codelineno-0-88">88</a></span>
13155
- <span class="normal"><a href="#__codelineno-0-89">89</a></span>
13156
- <span class="normal"><a href="#__codelineno-0-90">90</a></span>
13157
- <span class="normal"><a href="#__codelineno-0-91">91</a></span>
13158
- <span class="normal"><a href="#__codelineno-0-92">92</a></span>
13159
- <span class="normal"><a href="#__codelineno-0-93">93</a></span>
13160
- <span class="normal"><a href="#__codelineno-0-94">94</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="k">def</span> <span class="nf">restrict_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
13161
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13162
- <a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="sd"> Apply &quot;view&quot; permissions on the POST /notes/ endpoint, otherwise as ModelViewSetMixin.</span>
13163
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> &quot;&quot;&quot;</span>
13164
- <a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">is_authenticated</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;notes&quot;</span><span class="p">:</span>
13165
- <a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)</span>
13166
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="k">else</span><span class="p">:</span>
13167
- <a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">restrict_queryset</span><span class="p">(</span><span class="n">request</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>
13087
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-77">77</a></span>
13088
+ <span class="normal"><a href="#__codelineno-0-78">78</a></span>
13089
+ <span class="normal"><a href="#__codelineno-0-79">79</a></span>
13090
+ <span class="normal"><a href="#__codelineno-0-80">80</a></span>
13091
+ <span class="normal"><a href="#__codelineno-0-81">81</a></span>
13092
+ <span class="normal"><a href="#__codelineno-0-82">82</a></span>
13093
+ <span class="normal"><a href="#__codelineno-0-83">83</a></span>
13094
+ <span class="normal"><a href="#__codelineno-0-84">84</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="k">def</span> <span class="nf">restrict_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</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>
13095
+ <a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13096
+ <a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> Apply &quot;view&quot; permissions on the POST /notes/ endpoint, otherwise as ModelViewSetMixin.</span>
13097
+ <a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> &quot;&quot;&quot;</span>
13098
+ <a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">is_authenticated</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;notes&quot;</span><span class="p">:</span>
13099
+ <a id="__codelineno-0-82" name="__codelineno-0-82"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)</span>
13100
+ <a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="k">else</span><span class="p">:</span>
13101
+ <a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">restrict_queryset</span><span class="p">(</span><span class="n">request</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>
13168
13102
  </code></pre></div></td></tr></table></div>
13169
13103
  </details>
13170
13104
  </div>
@@ -13542,11 +13476,7 @@ from the list of fields.</p>
13542
13476
 
13543
13477
  <details class="quote">
13544
13478
  <summary>Source code in <code>nautobot/core/api/routers.py</code></summary>
13545
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-6"> 6</a></span>
13546
- <span class="normal"><a href="#__codelineno-0-7"> 7</a></span>
13547
- <span class="normal"><a href="#__codelineno-0-8"> 8</a></span>
13548
- <span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
13549
- <span class="normal"><a href="#__codelineno-0-10">10</a></span>
13479
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-10">10</a></span>
13550
13480
  <span class="normal"><a href="#__codelineno-0-11">11</a></span>
13551
13481
  <span class="normal"><a href="#__codelineno-0-12">12</a></span>
13552
13482
  <span class="normal"><a href="#__codelineno-0-13">13</a></span>
@@ -13564,29 +13494,69 @@ from the list of fields.</p>
13564
13494
  <span class="normal"><a href="#__codelineno-0-25">25</a></span>
13565
13495
  <span class="normal"><a href="#__codelineno-0-26">26</a></span>
13566
13496
  <span class="normal"><a href="#__codelineno-0-27">27</a></span>
13567
- <span class="normal"><a href="#__codelineno-0-28">28</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-6" name="__codelineno-0-6"></a><span class="k">class</span> <span class="nc">OrderedDefaultRouter</span><span class="p">(</span><span class="n">DefaultRouter</span><span class="p">):</span>
13568
- <a id="__codelineno-0-7" name="__codelineno-0-7"></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>
13569
- <a id="__codelineno-0-8" name="__codelineno-0-8"></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>
13570
- <a id="__codelineno-0-9" name="__codelineno-0-9"></a>
13571
- <a id="__codelineno-0-10" name="__codelineno-0-10"></a> <span class="c1"># Extend the list view mappings to support the DELETE operation</span>
13572
- <a id="__codelineno-0-11" name="__codelineno-0-11"></a> <span class="bp">self</span><span class="o">.</span><span class="n">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
13573
- <a id="__codelineno-0-12" name="__codelineno-0-12"></a> <span class="p">{</span>
13574
- <a id="__codelineno-0-13" name="__codelineno-0-13"></a> <span class="s2">&quot;put&quot;</span><span class="p">:</span> <span class="s2">&quot;bulk_update&quot;</span><span class="p">,</span>
13575
- <a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="s2">&quot;patch&quot;</span><span class="p">:</span> <span class="s2">&quot;bulk_partial_update&quot;</span><span class="p">,</span>
13576
- <a id="__codelineno-0-15" name="__codelineno-0-15"></a> <span class="s2">&quot;delete&quot;</span><span class="p">:</span> <span class="s2">&quot;bulk_destroy&quot;</span><span class="p">,</span>
13577
- <a id="__codelineno-0-16" name="__codelineno-0-16"></a> <span class="p">}</span>
13578
- <a id="__codelineno-0-17" name="__codelineno-0-17"></a> <span class="p">)</span>
13579
- <a id="__codelineno-0-18" name="__codelineno-0-18"></a>
13580
- <a id="__codelineno-0-19" name="__codelineno-0-19"></a> <span class="k">def</span> <span class="nf">get_api_root_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_urls</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
13581
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13582
- <a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> Wrap DRF&#39;s DefaultRouter to return an alphabetized list of endpoints.</span>
13583
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> &quot;&quot;&quot;</span>
13584
- <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="n">api_root_dict</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
13585
- <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="n">list_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
13586
- <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="k">for</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">_viewset</span><span class="p">,</span> <span class="n">basename</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
13587
- <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="n">api_root_dict</span><span class="p">[</span><span class="n">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="n">list_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">basename</span><span class="o">=</span><span class="n">basename</span><span class="p">)</span>
13588
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a>
13589
- <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span><span class="n">api_root_dict</span><span class="o">=</span><span class="n">api_root_dict</span><span class="p">)</span>
13497
+ <span class="normal"><a href="#__codelineno-0-28">28</a></span>
13498
+ <span class="normal"><a href="#__codelineno-0-29">29</a></span>
13499
+ <span class="normal"><a href="#__codelineno-0-30">30</a></span>
13500
+ <span class="normal"><a href="#__codelineno-0-31">31</a></span>
13501
+ <span class="normal"><a href="#__codelineno-0-32">32</a></span>
13502
+ <span class="normal"><a href="#__codelineno-0-33">33</a></span>
13503
+ <span class="normal"><a href="#__codelineno-0-34">34</a></span>
13504
+ <span class="normal"><a href="#__codelineno-0-35">35</a></span>
13505
+ <span class="normal"><a href="#__codelineno-0-36">36</a></span>
13506
+ <span class="normal"><a href="#__codelineno-0-37">37</a></span>
13507
+ <span class="normal"><a href="#__codelineno-0-38">38</a></span>
13508
+ <span class="normal"><a href="#__codelineno-0-39">39</a></span>
13509
+ <span class="normal"><a href="#__codelineno-0-40">40</a></span>
13510
+ <span class="normal"><a href="#__codelineno-0-41">41</a></span>
13511
+ <span class="normal"><a href="#__codelineno-0-42">42</a></span>
13512
+ <span class="normal"><a href="#__codelineno-0-43">43</a></span>
13513
+ <span class="normal"><a href="#__codelineno-0-44">44</a></span>
13514
+ <span class="normal"><a href="#__codelineno-0-45">45</a></span>
13515
+ <span class="normal"><a href="#__codelineno-0-46">46</a></span>
13516
+ <span class="normal"><a href="#__codelineno-0-47">47</a></span>
13517
+ <span class="normal"><a href="#__codelineno-0-48">48</a></span>
13518
+ <span class="normal"><a href="#__codelineno-0-49">49</a></span>
13519
+ <span class="normal"><a href="#__codelineno-0-50">50</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-10" name="__codelineno-0-10"></a><span class="k">class</span> <span class="nc">OrderedDefaultRouter</span><span class="p">(</span><span class="n">DefaultRouter</span><span class="p">):</span>
13520
+ <a id="__codelineno-0-11" name="__codelineno-0-11"></a> <span class="n">APIRootView</span> <span class="o">=</span> <span class="n">AuthenticatedAPIRootView</span>
13521
+ <a id="__codelineno-0-12" name="__codelineno-0-12"></a>
13522
+ <a id="__codelineno-0-13" name="__codelineno-0-13"></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">view_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">view_description</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>
13523
+ <a id="__codelineno-0-14" name="__codelineno-0-14"></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>
13524
+ <a id="__codelineno-0-15" name="__codelineno-0-15"></a>
13525
+ <a id="__codelineno-0-16" name="__codelineno-0-16"></a> <span class="bp">self</span><span class="o">.</span><span class="n">view_name</span> <span class="o">=</span> <span class="n">view_name</span>
13526
+ <a id="__codelineno-0-17" name="__codelineno-0-17"></a> <span class="k">if</span> <span class="n">view_name</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">view_description</span><span class="p">:</span>
13527
+ <a id="__codelineno-0-18" name="__codelineno-0-18"></a> <span class="n">view_description</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">view_name</span><span class="si">}</span><span class="s2"> API root view&quot;</span>
13528
+ <a id="__codelineno-0-19" name="__codelineno-0-19"></a> <span class="bp">self</span><span class="o">.</span><span class="n">view_description</span> <span class="o">=</span> <span class="n">view_description</span>
13529
+ <a id="__codelineno-0-20" name="__codelineno-0-20"></a>
13530
+ <a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="c1"># Extend the list view mappings to support the DELETE operation</span>
13531
+ <a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="bp">self</span><span class="o">.</span><span class="n">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
13532
+ <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="p">{</span>
13533
+ <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="s2">&quot;put&quot;</span><span class="p">:</span> <span class="s2">&quot;bulk_update&quot;</span><span class="p">,</span>
13534
+ <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="s2">&quot;patch&quot;</span><span class="p">:</span> <span class="s2">&quot;bulk_partial_update&quot;</span><span class="p">,</span>
13535
+ <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="s2">&quot;delete&quot;</span><span class="p">:</span> <span class="s2">&quot;bulk_destroy&quot;</span><span class="p">,</span>
13536
+ <a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="p">}</span>
13537
+ <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="p">)</span>
13538
+ <a id="__codelineno-0-29" name="__codelineno-0-29"></a>
13539
+ <a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="k">def</span> <span class="nf">get_api_root_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_urls</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
13540
+ <a id="__codelineno-0-31" name="__codelineno-0-31"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13541
+ <a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="sd"> Wrap DRF&#39;s DefaultRouter to return an alphabetized list of endpoints.</span>
13542
+ <a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="sd"> &quot;&quot;&quot;</span>
13543
+ <a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="n">api_root_dict</span> <span class="o">=</span> <span class="p">{}</span>
13544
+ <a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="n">list_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
13545
+ <a id="__codelineno-0-36" name="__codelineno-0-36"></a>
13546
+ <a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="k">for</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">_viewset</span><span class="p">,</span> <span class="n">basename</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
13547
+ <a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="n">api_root_dict</span><span class="p">[</span><span class="n">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="n">list_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">basename</span><span class="o">=</span><span class="n">basename</span><span class="p">)</span>
13548
+ <a id="__codelineno-0-39" name="__codelineno-0-39"></a>
13549
+ <a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="p">,</span> <span class="n">AuthenticatedAPIRootView</span><span class="p">):</span>
13550
+ <a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span>
13551
+ <a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="n">api_root_dict</span><span class="o">=</span><span class="n">api_root_dict</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">view_name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">view_description</span>
13552
+ <a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="p">)</span>
13553
+ <a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="c1"># Fallback for the established practice of overriding self.APIRootView with a custom class</span>
13554
+ <a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
13555
+ <a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="s2">&quot;Something has changed an OrderedDefaultRouter&#39;s APIRootView attribute to a custom class. &quot;</span>
13556
+ <a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="s2">&quot;Please verify that class </span><span class="si">%s</span><span class="s2"> implements appropriate authentication controls.&quot;</span><span class="p">,</span>
13557
+ <a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
13558
+ <a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="p">)</span>
13559
+ <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span><span class="n">api_root_dict</span><span class="o">=</span><span class="n">api_root_dict</span><span class="p">)</span>
13590
13560
  </code></pre></div></td></tr></table></div>
13591
13561
  </details>
13592
13562
 
@@ -13619,25 +13589,47 @@ from the list of fields.</p>
13619
13589
 
13620
13590
  <details class="quote">
13621
13591
  <summary>Source code in <code>nautobot/core/api/routers.py</code></summary>
13622
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-19">19</a></span>
13623
- <span class="normal"><a href="#__codelineno-0-20">20</a></span>
13624
- <span class="normal"><a href="#__codelineno-0-21">21</a></span>
13625
- <span class="normal"><a href="#__codelineno-0-22">22</a></span>
13626
- <span class="normal"><a href="#__codelineno-0-23">23</a></span>
13627
- <span class="normal"><a href="#__codelineno-0-24">24</a></span>
13628
- <span class="normal"><a href="#__codelineno-0-25">25</a></span>
13629
- <span class="normal"><a href="#__codelineno-0-26">26</a></span>
13630
- <span class="normal"><a href="#__codelineno-0-27">27</a></span>
13631
- <span class="normal"><a href="#__codelineno-0-28">28</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="k">def</span> <span class="nf">get_api_root_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_urls</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
13632
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13633
- <a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> Wrap DRF&#39;s DefaultRouter to return an alphabetized list of endpoints.</span>
13634
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> &quot;&quot;&quot;</span>
13635
- <a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="n">api_root_dict</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
13636
- <a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="n">list_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
13637
- <a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="k">for</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">_viewset</span><span class="p">,</span> <span class="n">basename</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
13638
- <a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="n">api_root_dict</span><span class="p">[</span><span class="n">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="n">list_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">basename</span><span class="o">=</span><span class="n">basename</span><span class="p">)</span>
13639
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a>
13640
- <a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span><span class="n">api_root_dict</span><span class="o">=</span><span class="n">api_root_dict</span><span class="p">)</span>
13592
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-30">30</a></span>
13593
+ <span class="normal"><a href="#__codelineno-0-31">31</a></span>
13594
+ <span class="normal"><a href="#__codelineno-0-32">32</a></span>
13595
+ <span class="normal"><a href="#__codelineno-0-33">33</a></span>
13596
+ <span class="normal"><a href="#__codelineno-0-34">34</a></span>
13597
+ <span class="normal"><a href="#__codelineno-0-35">35</a></span>
13598
+ <span class="normal"><a href="#__codelineno-0-36">36</a></span>
13599
+ <span class="normal"><a href="#__codelineno-0-37">37</a></span>
13600
+ <span class="normal"><a href="#__codelineno-0-38">38</a></span>
13601
+ <span class="normal"><a href="#__codelineno-0-39">39</a></span>
13602
+ <span class="normal"><a href="#__codelineno-0-40">40</a></span>
13603
+ <span class="normal"><a href="#__codelineno-0-41">41</a></span>
13604
+ <span class="normal"><a href="#__codelineno-0-42">42</a></span>
13605
+ <span class="normal"><a href="#__codelineno-0-43">43</a></span>
13606
+ <span class="normal"><a href="#__codelineno-0-44">44</a></span>
13607
+ <span class="normal"><a href="#__codelineno-0-45">45</a></span>
13608
+ <span class="normal"><a href="#__codelineno-0-46">46</a></span>
13609
+ <span class="normal"><a href="#__codelineno-0-47">47</a></span>
13610
+ <span class="normal"><a href="#__codelineno-0-48">48</a></span>
13611
+ <span class="normal"><a href="#__codelineno-0-49">49</a></span>
13612
+ <span class="normal"><a href="#__codelineno-0-50">50</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-30" name="__codelineno-0-30"></a><span class="k">def</span> <span class="nf">get_api_root_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_urls</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
13613
+ <a id="__codelineno-0-31" name="__codelineno-0-31"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13614
+ <a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="sd"> Wrap DRF&#39;s DefaultRouter to return an alphabetized list of endpoints.</span>
13615
+ <a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="sd"> &quot;&quot;&quot;</span>
13616
+ <a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="n">api_root_dict</span> <span class="o">=</span> <span class="p">{}</span>
13617
+ <a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="n">list_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
13618
+ <a id="__codelineno-0-36" name="__codelineno-0-36"></a>
13619
+ <a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="k">for</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">_viewset</span><span class="p">,</span> <span class="n">basename</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
13620
+ <a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="n">api_root_dict</span><span class="p">[</span><span class="n">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="n">list_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">basename</span><span class="o">=</span><span class="n">basename</span><span class="p">)</span>
13621
+ <a id="__codelineno-0-39" name="__codelineno-0-39"></a>
13622
+ <a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="p">,</span> <span class="n">AuthenticatedAPIRootView</span><span class="p">):</span>
13623
+ <a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span>
13624
+ <a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="n">api_root_dict</span><span class="o">=</span><span class="n">api_root_dict</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">view_name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">view_description</span>
13625
+ <a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="p">)</span>
13626
+ <a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="c1"># Fallback for the established practice of overriding self.APIRootView with a custom class</span>
13627
+ <a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
13628
+ <a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="s2">&quot;Something has changed an OrderedDefaultRouter&#39;s APIRootView attribute to a custom class. &quot;</span>
13629
+ <a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="s2">&quot;Please verify that class </span><span class="si">%s</span><span class="s2"> implements appropriate authentication controls.&quot;</span><span class="p">,</span>
13630
+ <a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
13631
+ <a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="p">)</span>
13632
+ <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">APIRootView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span><span class="n">api_root_dict</span><span class="o">=</span><span class="n">api_root_dict</span><span class="p">)</span>
13641
13633
  </code></pre></div></td></tr></table></div>
13642
13634
  </details>
13643
13635
  </div>
@@ -15501,7 +15493,11 @@ data any serializer fields that do not correspond to a specific model field</p>
15501
15493
  <span class="normal"><a href="#__codelineno-0-186">186</a></span>
15502
15494
  <span class="normal"><a href="#__codelineno-0-187">187</a></span>
15503
15495
  <span class="normal"><a href="#__codelineno-0-188">188</a></span>
15504
- <span class="normal"><a href="#__codelineno-0-189">189</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="k">def</span> <span class="nf">get_view_name</span><span class="p">(</span><span class="n">view</span><span class="p">,</span> <span class="n">suffix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
15496
+ <span class="normal"><a href="#__codelineno-0-189">189</a></span>
15497
+ <span class="normal"><a href="#__codelineno-0-190">190</a></span>
15498
+ <span class="normal"><a href="#__codelineno-0-191">191</a></span>
15499
+ <span class="normal"><a href="#__codelineno-0-192">192</a></span>
15500
+ <span class="normal"><a href="#__codelineno-0-193">193</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-170" name="__codelineno-0-170"></a><span class="k">def</span> <span class="nf">get_view_name</span><span class="p">(</span><span class="n">view</span><span class="p">,</span> <span class="n">suffix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
15505
15501
  <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15506
15502
  <a id="__codelineno-0-172" name="__codelineno-0-172"></a><span class="sd"> Derive the view name from its associated model, if it has one. Fall back to DRF&#39;s built-in `get_view_name`.</span>
15507
15503
  <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="sd"> &quot;&quot;&quot;</span>
@@ -15512,15 +15508,19 @@ data any serializer fields that do not correspond to a specific model field</p>
15512
15508
  <a id="__codelineno-0-178" name="__codelineno-0-178"></a>
15513
15509
  <a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="k">else</span><span class="p">:</span>
15514
15510
  <a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="c1"># Replicate DRF&#39;s built-in behavior.</span>
15515
- <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">view</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
15516
- <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">formatting</span><span class="o">.</span><span class="n">remove_trailing_string</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;View&quot;</span><span class="p">)</span>
15517
- <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">formatting</span><span class="o">.</span><span class="n">remove_trailing_string</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;ViewSet&quot;</span><span class="p">)</span>
15518
- <a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">formatting</span><span class="o">.</span><span class="n">camelcase_to_spaces</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
15519
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a>
15520
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="k">if</span> <span class="n">suffix</span><span class="p">:</span>
15521
- <a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">name</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">suffix</span>
15522
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a>
15523
- <a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="k">return</span> <span class="n">name</span>
15511
+ <a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="n">name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">view</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
15512
+ <a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
15513
+ <a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="k">return</span> <span class="n">view</span><span class="o">.</span><span class="n">name</span>
15514
+ <a id="__codelineno-0-184" name="__codelineno-0-184"></a>
15515
+ <a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">view</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
15516
+ <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">formatting</span><span class="o">.</span><span class="n">remove_trailing_string</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;View&quot;</span><span class="p">)</span>
15517
+ <a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">formatting</span><span class="o">.</span><span class="n">remove_trailing_string</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;ViewSet&quot;</span><span class="p">)</span>
15518
+ <a id="__codelineno-0-188" name="__codelineno-0-188"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">formatting</span><span class="o">.</span><span class="n">camelcase_to_spaces</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
15519
+ <a id="__codelineno-0-189" name="__codelineno-0-189"></a>
15520
+ <a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="k">if</span> <span class="n">suffix</span><span class="p">:</span>
15521
+ <a id="__codelineno-0-191" name="__codelineno-0-191"></a> <span class="n">name</span> <span class="o">+=</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">suffix</span>
15522
+ <a id="__codelineno-0-192" name="__codelineno-0-192"></a>
15523
+ <a id="__codelineno-0-193" name="__codelineno-0-193"></a> <span class="k">return</span> <span class="n">name</span>
15524
15524
  </code></pre></div></td></tr></table></div>
15525
15525
  </details>
15526
15526
  </div>
@@ -15578,29 +15578,29 @@ data any serializer fields that do not correspond to a specific model field</p>
15578
15578
 
15579
15579
  <details class="quote">
15580
15580
  <summary>Source code in <code>nautobot/core/api/utils.py</code></summary>
15581
- <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>
15582
- <span class="normal"><a href="#__codelineno-0-193">193</a></span>
15583
- <span class="normal"><a href="#__codelineno-0-194">194</a></span>
15584
- <span class="normal"><a href="#__codelineno-0-195">195</a></span>
15585
- <span class="normal"><a href="#__codelineno-0-196">196</a></span>
15581
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-196">196</a></span>
15586
15582
  <span class="normal"><a href="#__codelineno-0-197">197</a></span>
15587
15583
  <span class="normal"><a href="#__codelineno-0-198">198</a></span>
15588
15584
  <span class="normal"><a href="#__codelineno-0-199">199</a></span>
15589
15585
  <span class="normal"><a href="#__codelineno-0-200">200</a></span>
15590
15586
  <span class="normal"><a href="#__codelineno-0-201">201</a></span>
15591
15587
  <span class="normal"><a href="#__codelineno-0-202">202</a></span>
15592
- <span class="normal"><a href="#__codelineno-0-203">203</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">rest_api_server_error</span><span class="p">(</span><span class="n">request</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>
15593
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15594
- <a id="__codelineno-0-194" name="__codelineno-0-194"></a><span class="sd"> Handle exceptions and return a useful error message for REST API requests.</span>
15595
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> &quot;&quot;&quot;</span>
15596
- <a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="n">type_</span><span class="p">,</span> <span class="n">error</span><span class="p">,</span> <span class="n">_traceback</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
15597
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
15598
- <a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">error</span><span class="p">),</span>
15599
- <a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="s2">&quot;exception&quot;</span><span class="p">:</span> <span class="n">type_</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
15600
- <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="s2">&quot;nautobot_version&quot;</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">VERSION</span><span class="p">,</span>
15601
- <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="s2">&quot;python_version&quot;</span><span class="p">:</span> <span class="n">platform</span><span class="o">.</span><span class="n">python_version</span><span class="p">(),</span>
15602
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="p">}</span>
15603
- <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="k">return</span> <span class="n">JsonResponse</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="o">.</span><span class="n">HTTP_500_INTERNAL_SERVER_ERROR</span><span class="p">)</span>
15588
+ <span class="normal"><a href="#__codelineno-0-203">203</a></span>
15589
+ <span class="normal"><a href="#__codelineno-0-204">204</a></span>
15590
+ <span class="normal"><a href="#__codelineno-0-205">205</a></span>
15591
+ <span class="normal"><a href="#__codelineno-0-206">206</a></span>
15592
+ <span class="normal"><a href="#__codelineno-0-207">207</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="k">def</span> <span class="nf">rest_api_server_error</span><span class="p">(</span><span class="n">request</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>
15593
+ <a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15594
+ <a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="sd"> Handle exceptions and return a useful error message for REST API requests.</span>
15595
+ <a id="__codelineno-0-199" name="__codelineno-0-199"></a><span class="sd"> &quot;&quot;&quot;</span>
15596
+ <a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="n">type_</span><span class="p">,</span> <span class="n">error</span><span class="p">,</span> <span class="n">_traceback</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
15597
+ <a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
15598
+ <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">error</span><span class="p">),</span>
15599
+ <a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="s2">&quot;exception&quot;</span><span class="p">:</span> <span class="n">type_</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
15600
+ <a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="s2">&quot;nautobot_version&quot;</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">VERSION</span><span class="p">,</span>
15601
+ <a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="s2">&quot;python_version&quot;</span><span class="p">:</span> <span class="n">platform</span><span class="o">.</span><span class="n">python_version</span><span class="p">(),</span>
15602
+ <a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="p">}</span>
15603
+ <a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">return</span> <span class="n">JsonResponse</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="o">.</span><span class="n">HTTP_500_INTERNAL_SERVER_ERROR</span><span class="p">)</span>
15604
15604
  </code></pre></div></td></tr></table></div>
15605
15605
  </details>
15606
15606
  </div>