nautobot 2.1.8__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 (296) 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/core/api/routers.py +25 -3
  7. nautobot/core/api/utils.py +4 -0
  8. nautobot/core/api/views.py +21 -15
  9. nautobot/core/settings.py +1 -0
  10. nautobot/core/templates/admin/base.html +23 -94
  11. nautobot/core/templates/graphene/graphiql.html +18 -47
  12. nautobot/core/templates/inc/footer.html +5 -5
  13. nautobot/core/templates/inc/nav_menu.html +0 -7
  14. nautobot/core/templates/rest_framework/api.html +12 -5
  15. nautobot/core/tests/integration/test_view_authentication.py +67 -0
  16. nautobot/core/tests/test_graphql.py +2 -14
  17. nautobot/core/tests/test_views.py +22 -16
  18. nautobot/core/utils/lookup.py +124 -0
  19. nautobot/core/views/__init__.py +3 -7
  20. nautobot/core/views/generic.py +9 -0
  21. nautobot/dcim/api/urls.py +1 -2
  22. nautobot/dcim/api/views.py +1 -12
  23. nautobot/dcim/models/racks.py +1 -3
  24. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +67 -43
  25. nautobot/dcim/tests/test_api.py +3 -0
  26. nautobot/dcim/views.py +5 -2
  27. nautobot/extras/api/urls.py +1 -2
  28. nautobot/extras/api/views.py +0 -10
  29. nautobot/extras/plugins/views.py +6 -9
  30. nautobot/extras/tests/test_views.py +101 -0
  31. nautobot/extras/views.py +10 -10
  32. nautobot/ipam/api/urls.py +1 -2
  33. nautobot/ipam/api/views.py +0 -11
  34. nautobot/ipam/tables.py +0 -1
  35. nautobot/ipam/tests/test_graphql.py +2 -3
  36. nautobot/ipam/views.py +9 -9
  37. nautobot/project-static/css/base.css +1 -0
  38. nautobot/project-static/docs/404.html +14 -0
  39. nautobot/project-static/docs/apps/index.html +14 -0
  40. nautobot/project-static/docs/apps/nautobot-apps.html +14 -0
  41. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +14 -0
  42. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +14 -0
  43. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +394 -408
  44. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +14 -0
  45. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +14 -0
  46. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +14 -0
  47. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +14 -0
  48. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +14 -0
  49. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +14 -0
  50. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +14 -0
  51. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +14 -0
  52. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +14 -0
  53. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +14 -0
  54. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +14 -0
  55. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +14 -0
  56. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +14 -0
  57. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +14 -0
  58. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +14 -0
  59. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +14 -0
  60. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +14 -0
  61. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +649 -183
  62. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1811 -1744
  63. nautobot/project-static/docs/development/apps/api/configuration-view.html +14 -0
  64. nautobot/project-static/docs/development/apps/api/database-backend-config.html +14 -0
  65. nautobot/project-static/docs/development/apps/api/models/django-admin.html +14 -0
  66. nautobot/project-static/docs/development/apps/api/models/global-search.html +14 -0
  67. nautobot/project-static/docs/development/apps/api/models/graphql.html +14 -0
  68. nautobot/project-static/docs/development/apps/api/models/index.html +14 -0
  69. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +14 -0
  70. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +14 -0
  71. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +14 -0
  72. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +14 -0
  73. nautobot/project-static/docs/development/apps/api/platform-features/index.html +14 -0
  74. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +14 -0
  75. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +14 -0
  76. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +14 -0
  77. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +14 -0
  78. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +14 -0
  79. nautobot/project-static/docs/development/apps/api/prometheus.html +14 -0
  80. nautobot/project-static/docs/development/apps/api/setup.html +14 -0
  81. nautobot/project-static/docs/development/apps/api/testing.html +14 -0
  82. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +14 -0
  83. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +14 -0
  84. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +14 -0
  85. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +14 -0
  86. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +14 -0
  87. nautobot/project-static/docs/development/apps/api/views/base-template.html +14 -0
  88. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +28 -9
  89. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +31 -12
  90. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +14 -0
  91. nautobot/project-static/docs/development/apps/api/views/index.html +14 -0
  92. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +14 -0
  93. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +14 -0
  94. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +14 -0
  95. nautobot/project-static/docs/development/apps/api/views/notes.html +14 -0
  96. nautobot/project-static/docs/development/apps/api/views/rest-api.html +14 -0
  97. nautobot/project-static/docs/development/apps/api/views/urls.html +14 -0
  98. nautobot/project-static/docs/development/apps/index.html +14 -0
  99. nautobot/project-static/docs/development/apps/migration/code-updates.html +14 -0
  100. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +14 -0
  101. nautobot/project-static/docs/development/apps/migration/from-v1.html +14 -0
  102. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +14 -0
  103. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +14 -0
  104. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +14 -0
  105. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +14 -0
  106. nautobot/project-static/docs/development/apps/porting-from-netbox.html +14 -0
  107. nautobot/project-static/docs/development/core/application-registry.html +14 -0
  108. nautobot/project-static/docs/development/core/best-practices.html +14 -0
  109. nautobot/project-static/docs/development/core/bootstrap-ui.html +14 -0
  110. nautobot/project-static/docs/development/core/caching.html +14 -0
  111. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +14 -0
  112. nautobot/project-static/docs/development/core/extending-models.html +14 -0
  113. nautobot/project-static/docs/development/core/generic-views.html +14 -0
  114. nautobot/project-static/docs/development/core/getting-started.html +33 -10
  115. nautobot/project-static/docs/development/core/homepage.html +14 -0
  116. nautobot/project-static/docs/development/core/index.html +14 -0
  117. nautobot/project-static/docs/development/core/model-features.html +14 -0
  118. nautobot/project-static/docs/development/core/natural-keys.html +14 -0
  119. nautobot/project-static/docs/development/core/navigation-menu.html +14 -0
  120. nautobot/project-static/docs/development/core/release-checklist.html +14 -0
  121. nautobot/project-static/docs/development/core/role-internals.html +14 -0
  122. nautobot/project-static/docs/development/core/style-guide.html +14 -0
  123. nautobot/project-static/docs/development/core/templates.html +14 -0
  124. nautobot/project-static/docs/development/core/testing.html +14 -0
  125. nautobot/project-static/docs/development/core/user-preferences.html +14 -0
  126. nautobot/project-static/docs/development/index.html +14 -0
  127. nautobot/project-static/docs/development/jobs/index.html +14 -0
  128. nautobot/project-static/docs/development/jobs/migration/from-v1.html +14 -0
  129. nautobot/project-static/docs/index.html +14 -0
  130. nautobot/project-static/docs/objects.inv +0 -0
  131. nautobot/project-static/docs/release-notes/index.html +14 -0
  132. nautobot/project-static/docs/release-notes/version-1.0.html +14 -0
  133. nautobot/project-static/docs/release-notes/version-1.1.html +14 -0
  134. nautobot/project-static/docs/release-notes/version-1.2.html +14 -0
  135. nautobot/project-static/docs/release-notes/version-1.3.html +14 -0
  136. nautobot/project-static/docs/release-notes/version-1.4.html +14 -0
  137. nautobot/project-static/docs/release-notes/version-1.5.html +14 -0
  138. nautobot/project-static/docs/release-notes/version-1.6.html +14 -0
  139. nautobot/project-static/docs/release-notes/version-2.0.html +14 -0
  140. nautobot/project-static/docs/release-notes/version-2.1.html +365 -159
  141. nautobot/project-static/docs/search/search_index.json +1 -1
  142. nautobot/project-static/docs/sitemap.xml +245 -240
  143. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  144. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +14 -0
  145. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +14 -0
  146. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +14 -0
  147. nautobot/project-static/docs/user-guide/administration/configuration/index.html +14 -0
  148. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +14 -0
  149. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +14 -0
  150. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +14 -0
  151. nautobot/project-static/docs/user-guide/administration/guides/caching.html +14 -0
  152. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +14 -0
  153. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +14 -0
  154. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +14 -0
  155. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +14 -0
  156. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +14 -0
  157. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +14 -0
  158. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +14 -0
  159. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +14 -0
  160. nautobot/project-static/docs/user-guide/administration/installation/docker.html +21 -3
  161. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +14 -0
  162. nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +6019 -0
  163. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +14 -0
  164. nautobot/project-static/docs/user-guide/administration/installation/index.html +14 -0
  165. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +14 -0
  166. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +14 -0
  167. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +17 -3
  168. nautobot/project-static/docs/user-guide/administration/installation/services.html +14 -0
  169. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +14 -0
  170. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +14 -0
  171. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +14 -0
  172. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +14 -0
  173. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +14 -0
  174. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +14 -0
  175. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +14 -0
  176. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +14 -0
  177. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +14 -0
  178. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +14 -0
  179. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +14 -0
  180. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +14 -0
  181. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +14 -0
  182. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +14 -0
  183. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +14 -0
  184. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +14 -0
  185. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +14 -0
  186. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +14 -0
  187. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +14 -0
  188. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +14 -0
  189. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +14 -0
  190. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +14 -0
  191. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +14 -0
  192. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +14 -0
  193. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +14 -0
  194. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +14 -0
  195. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +14 -0
  196. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +14 -0
  197. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +14 -0
  198. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +14 -0
  199. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +14 -0
  200. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +14 -0
  201. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +14 -0
  202. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +14 -0
  203. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +14 -0
  204. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +14 -0
  205. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +14 -0
  206. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +14 -0
  207. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +14 -0
  208. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +14 -0
  209. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +14 -0
  210. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +14 -0
  211. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +14 -0
  212. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +14 -0
  213. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +14 -0
  214. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +14 -0
  215. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +14 -0
  216. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +14 -0
  217. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +14 -0
  218. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +14 -0
  219. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +14 -0
  220. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +14 -0
  221. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +14 -0
  222. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +14 -0
  223. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +14 -0
  224. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +14 -0
  225. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +14 -0
  226. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +14 -0
  227. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +14 -0
  228. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +14 -0
  229. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +14 -0
  230. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +14 -0
  231. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +14 -0
  232. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +14 -0
  233. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +14 -0
  234. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +14 -0
  235. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +14 -0
  236. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +14 -0
  237. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +14 -0
  238. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +14 -0
  239. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +14 -0
  240. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +14 -0
  241. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +14 -0
  242. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +14 -0
  243. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +14 -0
  244. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +14 -0
  245. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +14 -0
  246. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +14 -0
  247. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +14 -0
  248. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +14 -0
  249. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +14 -0
  250. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +14 -0
  251. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +14 -0
  252. nautobot/project-static/docs/user-guide/index.html +14 -0
  253. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +14 -0
  254. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +14 -0
  255. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +14 -0
  256. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +14 -0
  257. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +14 -0
  258. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +14 -0
  259. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +14 -0
  260. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +14 -0
  261. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +14 -0
  262. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +14 -0
  263. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +14 -0
  264. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +14 -0
  265. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +14 -0
  266. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +14 -0
  267. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +14 -0
  268. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +14 -0
  269. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +14 -0
  270. nautobot/project-static/docs/user-guide/platform-functionality/note.html +14 -0
  271. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +14 -0
  272. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +14 -0
  273. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +14 -0
  274. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +14 -0
  275. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +14 -0
  276. nautobot/project-static/docs/user-guide/platform-functionality/role.html +14 -0
  277. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +14 -0
  278. nautobot/project-static/docs/user-guide/platform-functionality/status.html +14 -0
  279. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +14 -0
  280. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +14 -0
  281. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +14 -0
  282. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +14 -0
  283. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +14 -0
  284. nautobot/tenancy/api/urls.py +1 -2
  285. nautobot/tenancy/api/views.py +0 -12
  286. nautobot/users/api/urls.py +1 -2
  287. nautobot/users/api/views.py +2 -65
  288. nautobot/users/views.py +8 -8
  289. nautobot/virtualization/api/urls.py +1 -2
  290. nautobot/virtualization/api/views.py +0 -12
  291. {nautobot-2.1.8.dist-info → nautobot-2.1.9.dist-info}/METADATA +2 -2
  292. {nautobot-2.1.8.dist-info → nautobot-2.1.9.dist-info}/RECORD +296 -294
  293. {nautobot-2.1.8.dist-info → nautobot-2.1.9.dist-info}/LICENSE.txt +0 -0
  294. {nautobot-2.1.8.dist-info → nautobot-2.1.9.dist-info}/NOTICE +0 -0
  295. {nautobot-2.1.8.dist-info → nautobot-2.1.9.dist-info}/WHEEL +0 -0
  296. {nautobot-2.1.8.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
@@ -6675,10 +6689,10 @@
6675
6689
 
6676
6690
  <div class="doc doc-contents ">
6677
6691
  <p class="doc doc-class-bases">
6678
- 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>
6679
6693
 
6680
6694
 
6681
- <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>
6682
6696
 
6683
6697
  <details class="quote">
6684
6698
  <summary>Source code in <code>nautobot/core/api/views.py</code></summary>
@@ -6690,109 +6704,15 @@
6690
6704
  <span class="normal"><a href="#__codelineno-0-349">349</a></span>
6691
6705
  <span class="normal"><a href="#__codelineno-0-350">350</a></span>
6692
6706
  <span class="normal"><a href="#__codelineno-0-351">351</a></span>
6693
- <span class="normal"><a href="#__codelineno-0-352">352</a></span>
6694
- <span class="normal"><a href="#__codelineno-0-353">353</a></span>
6695
- <span class="normal"><a href="#__codelineno-0-354">354</a></span>
6696
- <span class="normal"><a href="#__codelineno-0-355">355</a></span>
6697
- <span class="normal"><a href="#__codelineno-0-356">356</a></span>
6698
- <span class="normal"><a href="#__codelineno-0-357">357</a></span>
6699
- <span class="normal"><a href="#__codelineno-0-358">358</a></span>
6700
- <span class="normal"><a href="#__codelineno-0-359">359</a></span>
6701
- <span class="normal"><a href="#__codelineno-0-360">360</a></span>
6702
- <span class="normal"><a href="#__codelineno-0-361">361</a></span>
6703
- <span class="normal"><a href="#__codelineno-0-362">362</a></span>
6704
- <span class="normal"><a href="#__codelineno-0-363">363</a></span>
6705
- <span class="normal"><a href="#__codelineno-0-364">364</a></span>
6706
- <span class="normal"><a href="#__codelineno-0-365">365</a></span>
6707
- <span class="normal"><a href="#__codelineno-0-366">366</a></span>
6708
- <span class="normal"><a href="#__codelineno-0-367">367</a></span>
6709
- <span class="normal"><a href="#__codelineno-0-368">368</a></span>
6710
- <span class="normal"><a href="#__codelineno-0-369">369</a></span>
6711
- <span class="normal"><a href="#__codelineno-0-370">370</a></span>
6712
- <span class="normal"><a href="#__codelineno-0-371">371</a></span>
6713
- <span class="normal"><a href="#__codelineno-0-372">372</a></span>
6714
- <span class="normal"><a href="#__codelineno-0-373">373</a></span>
6715
- <span class="normal"><a href="#__codelineno-0-374">374</a></span>
6716
- <span class="normal"><a href="#__codelineno-0-375">375</a></span>
6717
- <span class="normal"><a href="#__codelineno-0-376">376</a></span>
6718
- <span class="normal"><a href="#__codelineno-0-377">377</a></span>
6719
- <span class="normal"><a href="#__codelineno-0-378">378</a></span>
6720
- <span class="normal"><a href="#__codelineno-0-379">379</a></span>
6721
- <span class="normal"><a href="#__codelineno-0-380">380</a></span>
6722
- <span class="normal"><a href="#__codelineno-0-381">381</a></span>
6723
- <span class="normal"><a href="#__codelineno-0-382">382</a></span>
6724
- <span class="normal"><a href="#__codelineno-0-383">383</a></span>
6725
- <span class="normal"><a href="#__codelineno-0-384">384</a></span>
6726
- <span class="normal"><a href="#__codelineno-0-385">385</a></span>
6727
- <span class="normal"><a href="#__codelineno-0-386">386</a></span>
6728
- <span class="normal"><a href="#__codelineno-0-387">387</a></span>
6729
- <span class="normal"><a href="#__codelineno-0-388">388</a></span>
6730
- <span class="normal"><a href="#__codelineno-0-389">389</a></span>
6731
- <span class="normal"><a href="#__codelineno-0-390">390</a></span>
6732
- <span class="normal"><a href="#__codelineno-0-391">391</a></span>
6733
- <span class="normal"><a href="#__codelineno-0-392">392</a></span>
6734
- <span class="normal"><a href="#__codelineno-0-393">393</a></span>
6735
- <span class="normal"><a href="#__codelineno-0-394">394</a></span>
6736
- <span class="normal"><a href="#__codelineno-0-395">395</a></span>
6737
- <span class="normal"><a href="#__codelineno-0-396">396</a></span>
6738
- <span class="normal"><a href="#__codelineno-0-397">397</a></span>
6739
- <span class="normal"><a href="#__codelineno-0-398">398</a></span>
6740
- <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>
6741
6708
  <a id="__codelineno-0-345" name="__codelineno-0-345"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6742
- <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>
6743
6710
  <a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> &quot;&quot;&quot;</span>
6744
6711
  <a id="__codelineno-0-348" name="__codelineno-0-348"></a>
6745
- <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>
6746
6713
  <a id="__codelineno-0-350" name="__codelineno-0-350"></a>
6747
- <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>
6748
- <a id="__codelineno-0-352" name="__codelineno-0-352"></a> <span class="k">return</span> <span class="s2">&quot;API Root&quot;</span>
6749
- <a id="__codelineno-0-353" name="__codelineno-0-353"></a>
6750
- <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>
6751
- <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>
6752
- <a id="__codelineno-0-356" name="__codelineno-0-356"></a> <span class="k">return</span> <span class="n">Response</span><span class="p">(</span>
6753
- <a id="__codelineno-0-357" name="__codelineno-0-357"></a> <span class="n">OrderedDict</span><span class="p">(</span>
6754
- <a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="p">(</span>
6755
- <a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="p">(</span>
6756
- <a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="s2">&quot;circuits&quot;</span><span class="p">,</span>
6757
- <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>
6758
- <a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="p">),</span>
6759
- <a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="p">(</span>
6760
- <a id="__codelineno-0-364" name="__codelineno-0-364"></a> <span class="s2">&quot;dcim&quot;</span><span class="p">,</span>
6761
- <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>
6762
- <a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="p">),</span>
6763
- <a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="p">(</span>
6764
- <a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="s2">&quot;extras&quot;</span><span class="p">,</span>
6765
- <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>
6766
- <a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="p">),</span>
6767
- <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>
6768
- <a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="p">(</span>
6769
- <a id="__codelineno-0-373" name="__codelineno-0-373"></a> <span class="s2">&quot;ipam&quot;</span><span class="p">,</span>
6770
- <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>
6771
- <a id="__codelineno-0-375" name="__codelineno-0-375"></a> <span class="p">),</span>
6772
- <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="p">(</span>
6773
- <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="s2">&quot;plugins&quot;</span><span class="p">,</span>
6774
- <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>
6775
- <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="p">),</span>
6776
- <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>
6777
- <a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="p">(</span>
6778
- <a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="s2">&quot;tenancy&quot;</span><span class="p">,</span>
6779
- <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>
6780
- <a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="p">),</span>
6781
- <a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="p">(</span>
6782
- <a id="__codelineno-0-386" name="__codelineno-0-386"></a> <span class="s2">&quot;users&quot;</span><span class="p">,</span>
6783
- <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>
6784
- <a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="p">),</span>
6785
- <a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="p">(</span>
6786
- <a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="s2">&quot;virtualization&quot;</span><span class="p">,</span>
6787
- <a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="n">reverse</span><span class="p">(</span>
6788
- <a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="s2">&quot;virtualization-api:api-root&quot;</span><span class="p">,</span>
6789
- <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>
6790
- <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>
6791
- <a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="p">),</span>
6792
- <a id="__codelineno-0-396" name="__codelineno-0-396"></a> <span class="p">),</span>
6793
- <a id="__codelineno-0-397" name="__codelineno-0-397"></a> <span class="p">)</span>
6794
- <a id="__codelineno-0-398" name="__codelineno-0-398"></a> <span class="p">)</span>
6795
- <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>
6796
6716
  </code></pre></div></td></tr></table></div>
6797
6717
  </details>
6798
6718
 
@@ -9503,39 +9423,39 @@ For example:</p>
9503
9423
 
9504
9424
  <details class="quote">
9505
9425
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
9506
- <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>
9507
9437
  <span class="normal"><a href="#__codelineno-0-237">237</a></span>
9508
9438
  <span class="normal"><a href="#__codelineno-0-238">238</a></span>
9509
9439
  <span class="normal"><a href="#__codelineno-0-239">239</a></span>
9510
9440
  <span class="normal"><a href="#__codelineno-0-240">240</a></span>
9511
9441
  <span class="normal"><a href="#__codelineno-0-241">241</a></span>
9512
- <span class="normal"><a href="#__codelineno-0-242">242</a></span>
9513
- <span class="normal"><a href="#__codelineno-0-243">243</a></span>
9514
- <span class="normal"><a href="#__codelineno-0-244">244</a></span>
9515
- <span class="normal"><a href="#__codelineno-0-245">245</a></span>
9516
- <span class="normal"><a href="#__codelineno-0-246">246</a></span>
9517
- <span class="normal"><a href="#__codelineno-0-247">247</a></span>
9518
- <span class="normal"><a href="#__codelineno-0-248">248</a></span>
9519
- <span class="normal"><a href="#__codelineno-0-249">249</a></span>
9520
- <span class="normal"><a href="#__codelineno-0-250">250</a></span>
9521
- <span class="normal"><a href="#__codelineno-0-251">251</a></span>
9522
- <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>
9523
- <a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9524
- <a id="__codelineno-0-238" name="__codelineno-0-238"></a><span class="sd"> Include the applicable set of CustomFields in the ModelViewSet context.</span>
9525
- <a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="sd"> &quot;&quot;&quot;</span>
9526
- <a id="__codelineno-0-240" name="__codelineno-0-240"></a>
9527
- <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>
9528
- <a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="c1"># Gather all custom fields for the model</span>
9529
- <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>
9530
- <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>
9531
- <a id="__codelineno-0-245" name="__codelineno-0-245"></a>
9532
- <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>
9533
- <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>
9534
- <a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="p">{</span>
9535
- <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>
9536
- <a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="p">}</span>
9537
- <a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="p">)</span>
9538
- <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>
9539
9459
  </code></pre></div></td></tr></table></div>
9540
9460
  </details>
9541
9461
 
@@ -9580,13 +9500,7 @@ containing verbose_name_plural, url and count.</p>
9580
9500
 
9581
9501
  <details class="quote">
9582
9502
  <summary>Source code in <code>nautobot/core/api/views.py</code></summary>
9583
- <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>
9584
- <span class="normal"><a href="#__codelineno-0-804">804</a></span>
9585
- <span class="normal"><a href="#__codelineno-0-805">805</a></span>
9586
- <span class="normal"><a href="#__codelineno-0-806">806</a></span>
9587
- <span class="normal"><a href="#__codelineno-0-807">807</a></span>
9588
- <span class="normal"><a href="#__codelineno-0-808">808</a></span>
9589
- <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>
9590
9504
  <span class="normal"><a href="#__codelineno-0-810">810</a></span>
9591
9505
  <span class="normal"><a href="#__codelineno-0-811">811</a></span>
9592
9506
  <span class="normal"><a href="#__codelineno-0-812">812</a></span>
@@ -9639,66 +9553,72 @@ containing verbose_name_plural, url and count.</p>
9639
9553
  <span class="normal"><a href="#__codelineno-0-859">859</a></span>
9640
9554
  <span class="normal"><a href="#__codelineno-0-860">860</a></span>
9641
9555
  <span class="normal"><a href="#__codelineno-0-861">861</a></span>
9642
- <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>
9643
- <a id="__codelineno-0-804" name="__codelineno-0-804"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9644
- <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>
9645
- <a id="__codelineno-0-806" name="__codelineno-0-806"></a><span class="sd"> containing verbose_name_plural, url and count.</span>
9646
- <a id="__codelineno-0-807" name="__codelineno-0-807"></a><span class="sd"> &quot;&quot;&quot;</span>
9647
- <a id="__codelineno-0-808" name="__codelineno-0-808"></a>
9648
- <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>
9649
- <a id="__codelineno-0-810" name="__codelineno-0-810"></a>
9650
- <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>
9651
- <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>
9652
- <a id="__codelineno-0-813" name="__codelineno-0-813"></a> <span class="n">object_counts</span> <span class="o">=</span> <span class="p">{</span>
9653
- <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>
9654
- <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>
9655
- <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>
9656
- <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>
9657
- <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>
9658
- <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>
9659
- <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>
9660
- <a id="__codelineno-0-821" name="__codelineno-0-821"></a> <span class="p">],</span>
9661
- <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>
9662
- <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>
9663
- <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>
9664
- <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>
9665
- <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>
9666
9580
  <a id="__codelineno-0-827" name="__codelineno-0-827"></a> <span class="p">],</span>
9667
- <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>
9668
- <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>
9669
- <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>
9670
- <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>
9671
- <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>
9672
- <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>
9673
- <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>
9674
- <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>
9675
- <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>
9676
- <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>
9677
- <a id="__codelineno-0-838" name="__codelineno-0-838"></a> <span class="p">],</span>
9678
- <a id="__codelineno-0-839" name="__codelineno-0-839"></a> <span class="p">}</span>
9679
- <a id="__codelineno-0-840" name="__codelineno-0-840"></a>
9680
- <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>
9681
- <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>
9682
- <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>
9683
- <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>
9684
- <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>
9685
- <a id="__codelineno-0-846" name="__codelineno-0-846"></a> <span class="k">continue</span>
9686
- <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>
9687
- <a id="__codelineno-0-848" name="__codelineno-0-848"></a> <span class="k">try</span><span class="p">:</span>
9688
- <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>
9689
- <a id="__codelineno-0-850" name="__codelineno-0-850"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
9690
- <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>
9691
- <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>
9692
- <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>
9693
- <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>
9694
- <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>
9695
- <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>
9696
- <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>
9697
- <a id="__codelineno-0-858" name="__codelineno-0-858"></a> <span class="k">else</span><span class="p">:</span>
9698
- <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>
9699
- <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>
9700
- <a id="__codelineno-0-861" name="__codelineno-0-861"></a>
9701
- <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>
9702
9622
  </code></pre></div></td></tr></table></div>
9703
9623
  </details>
9704
9624
 
@@ -12723,15 +12643,15 @@ could we then literally have the parser just return list(reader) and not need th
12723
12643
 
12724
12644
  <details class="quote">
12725
12645
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
12726
- <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>
12727
- <span class="normal"><a href="#__codelineno-0-256">256</a></span>
12728
- <span class="normal"><a href="#__codelineno-0-257">257</a></span>
12729
- <span class="normal"><a href="#__codelineno-0-258">258</a></span>
12730
- <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>
12731
- <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>
12732
- <a id="__codelineno-0-257" name="__codelineno-0-257"></a>
12733
- <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>
12734
- <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>
12735
12655
  </code></pre></div></td></tr></table></div>
12736
12656
  </details>
12737
12657
 
@@ -12895,7 +12815,17 @@ could we then literally have the parser just return list(reader) and not need th
12895
12815
 
12896
12816
  <details class="quote">
12897
12817
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
12898
- <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>
12899
12829
  <span class="normal"><a href="#__codelineno-0-87"> 87</a></span>
12900
12830
  <span class="normal"><a href="#__codelineno-0-88"> 88</a></span>
12901
12831
  <span class="normal"><a href="#__codelineno-0-89"> 89</a></span>
@@ -12933,65 +12863,55 @@ could we then literally have the parser just return list(reader) and not need th
12933
12863
  <span class="normal"><a href="#__codelineno-0-121">121</a></span>
12934
12864
  <span class="normal"><a href="#__codelineno-0-122">122</a></span>
12935
12865
  <span class="normal"><a href="#__codelineno-0-123">123</a></span>
12936
- <span class="normal"><a href="#__codelineno-0-124">124</a></span>
12937
- <span class="normal"><a href="#__codelineno-0-125">125</a></span>
12938
- <span class="normal"><a href="#__codelineno-0-126">126</a></span>
12939
- <span class="normal"><a href="#__codelineno-0-127">127</a></span>
12940
- <span class="normal"><a href="#__codelineno-0-128">128</a></span>
12941
- <span class="normal"><a href="#__codelineno-0-129">129</a></span>
12942
- <span class="normal"><a href="#__codelineno-0-130">130</a></span>
12943
- <span class="normal"><a href="#__codelineno-0-131">131</a></span>
12944
- <span class="normal"><a href="#__codelineno-0-132">132</a></span>
12945
- <span class="normal"><a href="#__codelineno-0-133">133</a></span>
12946
- <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>
12947
- <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>
12948
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12949
- <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>
12950
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> &quot;&quot;&quot;</span>
12951
- <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>
12952
- <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>
12953
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="k">else</span><span class="p">:</span>
12954
- <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>
12955
- <a id="__codelineno-0-95" name="__codelineno-0-95"></a>
12956
- <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>
12957
- <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>
12958
- <a id="__codelineno-0-98" name="__codelineno-0-98"></a>
12959
- <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="n">perms_map</span> <span class="o">=</span> <span class="p">{</span>
12960
- <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>
12961
- <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>
12962
- <a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="p">}</span>
12963
- <a id="__codelineno-0-103" name="__codelineno-0-103"></a>
12964
- <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>
12965
- <a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="nd">@extend_schema</span><span class="p">(</span>
12966
- <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>
12967
- <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>
12968
- <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>
12969
- <a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="p">)</span>
12970
- <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>
12971
- <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>
12972
- <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
12973
- <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> API methods for returning or creating notes on an object.</span>
12974
- <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> &quot;&quot;&quot;</span>
12975
- <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>
12976
- <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>
12977
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="p">)</span>
12978
- <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>
12979
- <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>
12980
- <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>
12981
- <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>
12982
- <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>
12983
- <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>
12984
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a>
12985
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="c1"># Create the new Note.</span>
12986
- <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>
12987
- <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>
12988
- <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>
12989
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a>
12990
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="k">else</span><span class="p">:</span>
12991
- <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>
12992
- <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>
12993
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a>
12994
- <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>
12995
12915
  </code></pre></div></td></tr></table></div>
12996
12916
  </details>
12997
12917
 
@@ -13026,19 +12946,19 @@ could we then literally have the parser just return list(reader) and not need th
13026
12946
 
13027
12947
  <details class="quote">
13028
12948
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
13029
- <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>
13030
- <span class="normal"><a href="#__codelineno-0-97"> 97</a></span>
13031
- <span class="normal"><a href="#__codelineno-0-98"> 98</a></span>
13032
- <span class="normal"><a href="#__codelineno-0-99"> 99</a></span>
13033
- <span class="normal"><a href="#__codelineno-0-100">100</a></span>
13034
- <span class="normal"><a href="#__codelineno-0-101">101</a></span>
13035
- <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>
13036
- <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>
13037
- <a id="__codelineno-0-98" name="__codelineno-0-98"></a>
13038
- <a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="n">perms_map</span> <span class="o">=</span> <span class="p">{</span>
13039
- <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>
13040
- <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>
13041
- <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>
13042
12962
  </code></pre></div></td></tr></table></div>
13043
12963
  </details>
13044
12964
 
@@ -13080,7 +13000,17 @@ could we then literally have the parser just return list(reader) and not need th
13080
13000
 
13081
13001
  <details class="quote">
13082
13002
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
13083
- <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>
13084
13014
  <span class="normal"><a href="#__codelineno-0-105">105</a></span>
13085
13015
  <span class="normal"><a href="#__codelineno-0-106">106</a></span>
13086
13016
  <span class="normal"><a href="#__codelineno-0-107">107</a></span>
@@ -13100,47 +13030,37 @@ could we then literally have the parser just return list(reader) and not need th
13100
13030
  <span class="normal"><a href="#__codelineno-0-121">121</a></span>
13101
13031
  <span class="normal"><a href="#__codelineno-0-122">122</a></span>
13102
13032
  <span class="normal"><a href="#__codelineno-0-123">123</a></span>
13103
- <span class="normal"><a href="#__codelineno-0-124">124</a></span>
13104
- <span class="normal"><a href="#__codelineno-0-125">125</a></span>
13105
- <span class="normal"><a href="#__codelineno-0-126">126</a></span>
13106
- <span class="normal"><a href="#__codelineno-0-127">127</a></span>
13107
- <span class="normal"><a href="#__codelineno-0-128">128</a></span>
13108
- <span class="normal"><a href="#__codelineno-0-129">129</a></span>
13109
- <span class="normal"><a href="#__codelineno-0-130">130</a></span>
13110
- <span class="normal"><a href="#__codelineno-0-131">131</a></span>
13111
- <span class="normal"><a href="#__codelineno-0-132">132</a></span>
13112
- <span class="normal"><a href="#__codelineno-0-133">133</a></span>
13113
- <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>
13114
- <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="nd">@extend_schema</span><span class="p">(</span>
13115
- <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>
13116
- <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>
13117
- <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>
13118
- <a id="__codelineno-0-109" name="__codelineno-0-109"></a><span class="p">)</span>
13119
- <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>
13120
- <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>
13121
- <a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13122
- <a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> API methods for returning or creating notes on an object.</span>
13123
- <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> &quot;&quot;&quot;</span>
13124
- <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>
13125
- <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>
13126
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="p">)</span>
13127
- <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>
13128
- <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>
13129
- <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>
13130
- <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>
13131
- <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>
13132
- <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>
13133
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a>
13134
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="c1"># Create the new Note.</span>
13135
- <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>
13136
- <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>
13137
- <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>
13138
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a>
13139
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="k">else</span><span class="p">:</span>
13140
- <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>
13141
- <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>
13142
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a>
13143
- <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>
13144
13064
  </code></pre></div></td></tr></table></div>
13145
13065
  </details>
13146
13066
  </div>
@@ -13164,21 +13084,21 @@ could we then literally have the parser just return list(reader) and not need th
13164
13084
 
13165
13085
  <details class="quote">
13166
13086
  <summary>Source code in <code>nautobot/extras/api/views.py</code></summary>
13167
- <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>
13168
- <span class="normal"><a href="#__codelineno-0-88">88</a></span>
13169
- <span class="normal"><a href="#__codelineno-0-89">89</a></span>
13170
- <span class="normal"><a href="#__codelineno-0-90">90</a></span>
13171
- <span class="normal"><a href="#__codelineno-0-91">91</a></span>
13172
- <span class="normal"><a href="#__codelineno-0-92">92</a></span>
13173
- <span class="normal"><a href="#__codelineno-0-93">93</a></span>
13174
- <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>
13175
- <a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13176
- <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>
13177
- <a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> &quot;&quot;&quot;</span>
13178
- <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>
13179
- <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>
13180
- <a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="k">else</span><span class="p">:</span>
13181
- <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>
13182
13102
  </code></pre></div></td></tr></table></div>
13183
13103
  </details>
13184
13104
  </div>
@@ -13556,11 +13476,7 @@ from the list of fields.</p>
13556
13476
 
13557
13477
  <details class="quote">
13558
13478
  <summary>Source code in <code>nautobot/core/api/routers.py</code></summary>
13559
- <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>
13560
- <span class="normal"><a href="#__codelineno-0-7"> 7</a></span>
13561
- <span class="normal"><a href="#__codelineno-0-8"> 8</a></span>
13562
- <span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
13563
- <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>
13564
13480
  <span class="normal"><a href="#__codelineno-0-11">11</a></span>
13565
13481
  <span class="normal"><a href="#__codelineno-0-12">12</a></span>
13566
13482
  <span class="normal"><a href="#__codelineno-0-13">13</a></span>
@@ -13578,29 +13494,69 @@ from the list of fields.</p>
13578
13494
  <span class="normal"><a href="#__codelineno-0-25">25</a></span>
13579
13495
  <span class="normal"><a href="#__codelineno-0-26">26</a></span>
13580
13496
  <span class="normal"><a href="#__codelineno-0-27">27</a></span>
13581
- <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>
13582
- <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>
13583
- <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>
13584
- <a id="__codelineno-0-9" name="__codelineno-0-9"></a>
13585
- <a id="__codelineno-0-10" name="__codelineno-0-10"></a> <span class="c1"># Extend the list view mappings to support the DELETE operation</span>
13586
- <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>
13587
- <a id="__codelineno-0-12" name="__codelineno-0-12"></a> <span class="p">{</span>
13588
- <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>
13589
- <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>
13590
- <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>
13591
- <a id="__codelineno-0-16" name="__codelineno-0-16"></a> <span class="p">}</span>
13592
- <a id="__codelineno-0-17" name="__codelineno-0-17"></a> <span class="p">)</span>
13593
- <a id="__codelineno-0-18" name="__codelineno-0-18"></a>
13594
- <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>
13595
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13596
- <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>
13597
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> &quot;&quot;&quot;</span>
13598
- <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>
13599
- <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>
13600
- <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>
13601
- <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>
13602
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a>
13603
- <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>
13604
13560
  </code></pre></div></td></tr></table></div>
13605
13561
  </details>
13606
13562
 
@@ -13633,25 +13589,47 @@ from the list of fields.</p>
13633
13589
 
13634
13590
  <details class="quote">
13635
13591
  <summary>Source code in <code>nautobot/core/api/routers.py</code></summary>
13636
- <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>
13637
- <span class="normal"><a href="#__codelineno-0-20">20</a></span>
13638
- <span class="normal"><a href="#__codelineno-0-21">21</a></span>
13639
- <span class="normal"><a href="#__codelineno-0-22">22</a></span>
13640
- <span class="normal"><a href="#__codelineno-0-23">23</a></span>
13641
- <span class="normal"><a href="#__codelineno-0-24">24</a></span>
13642
- <span class="normal"><a href="#__codelineno-0-25">25</a></span>
13643
- <span class="normal"><a href="#__codelineno-0-26">26</a></span>
13644
- <span class="normal"><a href="#__codelineno-0-27">27</a></span>
13645
- <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>
13646
- <a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
13647
- <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>
13648
- <a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> &quot;&quot;&quot;</span>
13649
- <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>
13650
- <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>
13651
- <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>
13652
- <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>
13653
- <a id="__codelineno-0-27" name="__codelineno-0-27"></a>
13654
- <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>
13655
13633
  </code></pre></div></td></tr></table></div>
13656
13634
  </details>
13657
13635
  </div>
@@ -15515,7 +15493,11 @@ data any serializer fields that do not correspond to a specific model field</p>
15515
15493
  <span class="normal"><a href="#__codelineno-0-186">186</a></span>
15516
15494
  <span class="normal"><a href="#__codelineno-0-187">187</a></span>
15517
15495
  <span class="normal"><a href="#__codelineno-0-188">188</a></span>
15518
- <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>
15519
15501
  <a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15520
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>
15521
15503
  <a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="sd"> &quot;&quot;&quot;</span>
@@ -15526,15 +15508,19 @@ data any serializer fields that do not correspond to a specific model field</p>
15526
15508
  <a id="__codelineno-0-178" name="__codelineno-0-178"></a>
15527
15509
  <a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="k">else</span><span class="p">:</span>
15528
15510
  <a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="c1"># Replicate DRF&#39;s built-in behavior.</span>
15529
- <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>
15530
- <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>
15531
- <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>
15532
- <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>
15533
- <a id="__codelineno-0-185" name="__codelineno-0-185"></a>
15534
- <a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="k">if</span> <span class="n">suffix</span><span class="p">:</span>
15535
- <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>
15536
- <a id="__codelineno-0-188" name="__codelineno-0-188"></a>
15537
- <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>
15538
15524
  </code></pre></div></td></tr></table></div>
15539
15525
  </details>
15540
15526
  </div>
@@ -15592,29 +15578,29 @@ data any serializer fields that do not correspond to a specific model field</p>
15592
15578
 
15593
15579
  <details class="quote">
15594
15580
  <summary>Source code in <code>nautobot/core/api/utils.py</code></summary>
15595
- <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>
15596
- <span class="normal"><a href="#__codelineno-0-193">193</a></span>
15597
- <span class="normal"><a href="#__codelineno-0-194">194</a></span>
15598
- <span class="normal"><a href="#__codelineno-0-195">195</a></span>
15599
- <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>
15600
15582
  <span class="normal"><a href="#__codelineno-0-197">197</a></span>
15601
15583
  <span class="normal"><a href="#__codelineno-0-198">198</a></span>
15602
15584
  <span class="normal"><a href="#__codelineno-0-199">199</a></span>
15603
15585
  <span class="normal"><a href="#__codelineno-0-200">200</a></span>
15604
15586
  <span class="normal"><a href="#__codelineno-0-201">201</a></span>
15605
15587
  <span class="normal"><a href="#__codelineno-0-202">202</a></span>
15606
- <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>
15607
- <a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
15608
- <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>
15609
- <a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> &quot;&quot;&quot;</span>
15610
- <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>
15611
- <a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
15612
- <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>
15613
- <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>
15614
- <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>
15615
- <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>
15616
- <a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="p">}</span>
15617
- <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>
15618
15604
  </code></pre></div></td></tr></table></div>
15619
15605
  </details>
15620
15606
  </div>