nautobot 2.3.8__py3-none-any.whl → 2.3.10__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 (329) hide show
  1. nautobot/apps/tables.py +2 -0
  2. nautobot/core/forms/__init__.py +4 -0
  3. nautobot/core/forms/fields.py +32 -0
  4. nautobot/core/jobs/__init__.py +24 -8
  5. nautobot/core/models/query_functions.py +147 -1
  6. nautobot/core/models/tree_queries.py +8 -0
  7. nautobot/core/settings.py +7 -0
  8. nautobot/core/settings.yaml +10 -0
  9. nautobot/core/signals.py +5 -4
  10. nautobot/core/templates/nautobot_config.py.j2 +4 -0
  11. nautobot/core/tests/test_models_query_functions.py +108 -0
  12. nautobot/dcim/forms.py +30 -27
  13. nautobot/dcim/models/device_components.py +5 -0
  14. nautobot/dcim/tables/devices.py +4 -2
  15. nautobot/dcim/templates/dcim/modulebay_create.html +39 -0
  16. nautobot/dcim/templates/dcim/modulebay_update.html +39 -0
  17. nautobot/dcim/tests/test_models.py +16 -0
  18. nautobot/dcim/views.py +1 -1
  19. nautobot/extras/api/customfields.py +3 -10
  20. nautobot/extras/context_managers.py +28 -9
  21. nautobot/extras/datasources/__init__.py +2 -0
  22. nautobot/extras/datasources/git.py +30 -49
  23. nautobot/extras/datasources/registry.py +2 -2
  24. nautobot/extras/jobs.py +30 -12
  25. nautobot/extras/models/customfields.py +12 -0
  26. nautobot/extras/models/datasources.py +6 -0
  27. nautobot/extras/models/groups.py +47 -33
  28. nautobot/extras/models/jobs.py +1 -1
  29. nautobot/extras/plugins/__init__.py +165 -0
  30. nautobot/extras/signals.py +2 -0
  31. nautobot/extras/tasks.py +88 -69
  32. nautobot/extras/templates/extras/plugin_detail.html +33 -0
  33. nautobot/extras/tests/test_context_managers.py +23 -9
  34. nautobot/extras/tests/test_datasources.py +88 -1
  35. nautobot/extras/tests/test_dynamicgroups.py +12 -0
  36. nautobot/extras/tests/test_plugins.py +94 -0
  37. nautobot/extras/tests/test_webhooks.py +1 -1
  38. nautobot/extras/views.py +3 -1
  39. nautobot/extras/webhooks.py +16 -7
  40. nautobot/project-static/docs/404.html +24 -3
  41. nautobot/project-static/docs/apps/index.html +24 -3
  42. nautobot/project-static/docs/apps/nautobot-apps.html +24 -3
  43. nautobot/project-static/docs/assets/javascripts/{bundle.525ec568.min.js → bundle.83f73b43.min.js} +2 -2
  44. nautobot/project-static/docs/assets/javascripts/{bundle.525ec568.min.js.map → bundle.83f73b43.min.js.map} +3 -3
  45. nautobot/project-static/docs/assets/stylesheets/main.0253249f.min.css +1 -0
  46. nautobot/project-static/docs/assets/stylesheets/main.0253249f.min.css.map +1 -0
  47. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +24 -3
  48. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +24 -3
  49. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +24 -3
  50. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +24 -3
  51. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +24 -3
  52. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +24 -3
  53. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +24 -3
  54. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +24 -3
  55. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +24 -3
  56. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +24 -3
  57. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +24 -3
  58. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +24 -3
  59. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +24 -3
  60. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +106 -6
  61. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +24 -3
  62. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +24 -3
  63. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +24 -3
  64. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +138 -3
  65. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +24 -3
  66. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +24 -3
  67. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +24 -3
  68. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +24 -3
  69. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +24 -3
  70. nautobot/project-static/docs/development/apps/api/configuration-view.html +24 -3
  71. nautobot/project-static/docs/development/apps/api/database-backend-config.html +24 -3
  72. nautobot/project-static/docs/development/apps/api/models/django-admin.html +24 -3
  73. nautobot/project-static/docs/development/apps/api/models/global-search.html +24 -3
  74. nautobot/project-static/docs/development/apps/api/models/graphql.html +24 -3
  75. nautobot/project-static/docs/development/apps/api/models/index.html +24 -3
  76. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +24 -3
  77. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +24 -3
  78. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +24 -3
  79. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +24 -3
  80. nautobot/project-static/docs/development/apps/api/platform-features/index.html +24 -3
  81. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +24 -3
  82. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +24 -3
  83. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +24 -3
  84. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +27 -6
  85. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +8823 -0
  86. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +27 -6
  87. nautobot/project-static/docs/development/apps/api/prometheus.html +24 -3
  88. nautobot/project-static/docs/development/apps/api/setup.html +33 -11
  89. nautobot/project-static/docs/development/apps/api/testing.html +24 -3
  90. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +24 -3
  91. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +24 -3
  92. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +24 -3
  93. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +24 -3
  94. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +24 -3
  95. nautobot/project-static/docs/development/apps/api/views/base-template.html +24 -3
  96. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +24 -3
  97. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +24 -3
  98. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +24 -3
  99. nautobot/project-static/docs/development/apps/api/views/index.html +24 -3
  100. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +24 -3
  101. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +24 -3
  102. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +24 -3
  103. nautobot/project-static/docs/development/apps/api/views/notes.html +24 -3
  104. nautobot/project-static/docs/development/apps/api/views/rest-api.html +24 -3
  105. nautobot/project-static/docs/development/apps/api/views/urls.html +24 -3
  106. nautobot/project-static/docs/development/apps/index.html +24 -3
  107. nautobot/project-static/docs/development/apps/migration/code-updates.html +24 -3
  108. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +24 -3
  109. nautobot/project-static/docs/development/apps/migration/from-v1.html +24 -3
  110. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +24 -3
  111. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +24 -3
  112. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +24 -3
  113. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +24 -3
  114. nautobot/project-static/docs/development/apps/porting-from-netbox.html +24 -3
  115. nautobot/project-static/docs/development/core/application-registry.html +24 -3
  116. nautobot/project-static/docs/development/core/best-practices.html +24 -3
  117. nautobot/project-static/docs/development/core/bootstrap-ui.html +24 -3
  118. nautobot/project-static/docs/development/core/caching.html +24 -3
  119. nautobot/project-static/docs/development/core/controllers.html +24 -3
  120. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +24 -3
  121. nautobot/project-static/docs/development/core/generic-views.html +24 -3
  122. nautobot/project-static/docs/development/core/getting-started.html +24 -3
  123. nautobot/project-static/docs/development/core/homepage.html +24 -3
  124. nautobot/project-static/docs/development/core/index.html +24 -3
  125. nautobot/project-static/docs/development/core/model-checklist.html +24 -3
  126. nautobot/project-static/docs/development/core/model-features.html +24 -3
  127. nautobot/project-static/docs/development/core/natural-keys.html +24 -3
  128. nautobot/project-static/docs/development/core/navigation-menu.html +24 -3
  129. nautobot/project-static/docs/development/core/release-checklist.html +24 -3
  130. nautobot/project-static/docs/development/core/role-internals.html +24 -3
  131. nautobot/project-static/docs/development/core/settings.html +24 -3
  132. nautobot/project-static/docs/development/core/style-guide.html +24 -3
  133. nautobot/project-static/docs/development/core/templates.html +24 -3
  134. nautobot/project-static/docs/development/core/testing.html +24 -3
  135. nautobot/project-static/docs/development/core/user-preferences.html +24 -3
  136. nautobot/project-static/docs/development/index.html +24 -3
  137. nautobot/project-static/docs/development/jobs/index.html +24 -3
  138. nautobot/project-static/docs/development/jobs/migration/from-v1.html +24 -3
  139. nautobot/project-static/docs/index.html +24 -3
  140. nautobot/project-static/docs/objects.inv +0 -0
  141. nautobot/project-static/docs/overview/application_stack.html +24 -3
  142. nautobot/project-static/docs/overview/design_philosophy.html +24 -3
  143. nautobot/project-static/docs/release-notes/index.html +24 -3
  144. nautobot/project-static/docs/release-notes/version-1.0.html +24 -3
  145. nautobot/project-static/docs/release-notes/version-1.1.html +24 -3
  146. nautobot/project-static/docs/release-notes/version-1.2.html +24 -3
  147. nautobot/project-static/docs/release-notes/version-1.3.html +24 -3
  148. nautobot/project-static/docs/release-notes/version-1.4.html +24 -3
  149. nautobot/project-static/docs/release-notes/version-1.5.html +24 -3
  150. nautobot/project-static/docs/release-notes/version-1.6.html +24 -3
  151. nautobot/project-static/docs/release-notes/version-2.0.html +24 -3
  152. nautobot/project-static/docs/release-notes/version-2.1.html +24 -3
  153. nautobot/project-static/docs/release-notes/version-2.2.html +24 -3
  154. nautobot/project-static/docs/release-notes/version-2.3.html +430 -114
  155. nautobot/project-static/docs/requirements.txt +1 -1
  156. nautobot/project-static/docs/search/search_index.json +1 -1
  157. nautobot/project-static/docs/sitemap.xml +273 -269
  158. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  159. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +24 -3
  160. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +24 -3
  161. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +24 -3
  162. nautobot/project-static/docs/user-guide/administration/configuration/index.html +24 -3
  163. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +24 -3
  164. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +29 -4
  165. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +24 -3
  166. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +24 -3
  167. nautobot/project-static/docs/user-guide/administration/guides/docker.html +24 -3
  168. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +24 -3
  169. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +24 -3
  170. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +24 -3
  171. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +24 -3
  172. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +24 -3
  173. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +24 -3
  174. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +24 -3
  175. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +24 -3
  176. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +24 -3
  177. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +24 -3
  178. nautobot/project-static/docs/user-guide/administration/installation/index.html +24 -3
  179. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +24 -3
  180. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +24 -3
  181. nautobot/project-static/docs/user-guide/administration/installation/services.html +24 -3
  182. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +24 -3
  183. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +24 -3
  184. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +24 -3
  185. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +24 -3
  186. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +24 -3
  187. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +24 -3
  188. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +24 -3
  189. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +24 -3
  190. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +24 -3
  191. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +24 -3
  192. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +24 -3
  193. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +24 -3
  194. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +24 -3
  195. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +24 -3
  196. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +24 -3
  197. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +24 -3
  198. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +24 -3
  199. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +24 -3
  200. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +24 -3
  201. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +24 -3
  202. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +24 -3
  203. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +24 -3
  204. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +24 -3
  205. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +24 -3
  206. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +24 -3
  207. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +24 -3
  208. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +24 -3
  209. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +24 -3
  210. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +24 -3
  211. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +24 -3
  212. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +24 -3
  213. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +24 -3
  214. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +24 -3
  215. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +24 -3
  216. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +24 -3
  217. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +24 -3
  218. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +24 -3
  219. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +24 -3
  220. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +24 -3
  221. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +24 -3
  222. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +24 -3
  223. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +24 -3
  224. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +24 -3
  225. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +24 -3
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +24 -3
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +24 -3
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +24 -3
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +24 -3
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +24 -3
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +24 -3
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +24 -3
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +24 -3
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +24 -3
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +24 -3
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +24 -3
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +24 -3
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +24 -3
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +24 -3
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +24 -3
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +24 -3
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +24 -3
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +24 -3
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +24 -3
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +24 -3
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +24 -3
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +24 -3
  248. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +24 -3
  249. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +24 -3
  250. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +24 -3
  251. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +24 -3
  252. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +24 -3
  253. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +24 -3
  254. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +24 -3
  255. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +24 -3
  256. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +24 -3
  257. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +24 -3
  258. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +24 -3
  259. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +24 -3
  260. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +24 -3
  261. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +24 -3
  262. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +24 -3
  263. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +24 -3
  264. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +24 -3
  265. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +24 -3
  266. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +24 -3
  267. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +24 -3
  268. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +24 -3
  269. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +24 -3
  270. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +24 -3
  271. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +24 -3
  272. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +24 -3
  273. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +24 -3
  274. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +24 -3
  275. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +24 -3
  276. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +24 -3
  277. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +24 -3
  278. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +24 -3
  279. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +24 -3
  280. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +24 -3
  281. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +24 -3
  282. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +24 -3
  283. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +24 -3
  284. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +24 -3
  285. nautobot/project-static/docs/user-guide/index.html +24 -3
  286. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +24 -3
  287. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +24 -3
  288. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +24 -3
  289. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +24 -3
  290. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +24 -3
  291. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +24 -3
  292. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +24 -3
  293. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +24 -3
  294. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +24 -3
  295. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +24 -3
  296. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +24 -3
  297. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +24 -3
  298. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +24 -3
  299. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +24 -3
  300. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +24 -3
  301. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +24 -3
  302. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +24 -3
  303. nautobot/project-static/docs/user-guide/platform-functionality/note.html +24 -3
  304. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +24 -3
  305. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +24 -3
  306. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +24 -3
  307. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +24 -3
  308. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +24 -3
  309. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +24 -3
  310. nautobot/project-static/docs/user-guide/platform-functionality/role.html +24 -3
  311. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +24 -3
  312. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +24 -3
  313. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +24 -3
  314. nautobot/project-static/docs/user-guide/platform-functionality/status.html +24 -3
  315. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +24 -3
  316. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +24 -3
  317. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +24 -3
  318. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +24 -3
  319. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +24 -3
  320. nautobot/project-static/js/forms.js +3 -5
  321. nautobot/virtualization/tables.py +1 -1
  322. {nautobot-2.3.8.dist-info → nautobot-2.3.10.dist-info}/METADATA +3 -3
  323. {nautobot-2.3.8.dist-info → nautobot-2.3.10.dist-info}/RECORD +327 -323
  324. nautobot/project-static/docs/assets/stylesheets/main.8c3ca2c6.min.css +0 -1
  325. nautobot/project-static/docs/assets/stylesheets/main.8c3ca2c6.min.css.map +0 -1
  326. {nautobot-2.3.8.dist-info → nautobot-2.3.10.dist-info}/LICENSE.txt +0 -0
  327. {nautobot-2.3.8.dist-info → nautobot-2.3.10.dist-info}/NOTICE +0 -0
  328. {nautobot-2.3.8.dist-info → nautobot-2.3.10.dist-info}/WHEEL +0 -0
  329. {nautobot-2.3.8.dist-info → nautobot-2.3.10.dist-info}/entry_points.txt +0 -0
@@ -304,6 +304,10 @@ class DynamicGroupModelTest(DynamicGroupTestBase): # TODO: BaseModelTestCase mi
304
304
  sg.add_members(Prefix.objects.filter(ip_version=4))
305
305
  self.assertIsInstance(sg.members, PrefixQuerySet)
306
306
  self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.filter(ip_version=4))
307
+ # test cumulative construction and alternate code path
308
+ sg.add_members(list(Prefix.objects.filter(ip_version=6)))
309
+ self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.all())
310
+ self.assertEqual(sg.static_group_associations.count(), Prefix.objects.all().count())
307
311
  # test duplicate objects aren't re-added
308
312
  sg.add_members(Prefix.objects.all())
309
313
  self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.all())
@@ -321,10 +325,18 @@ class DynamicGroupModelTest(DynamicGroupTestBase): # TODO: BaseModelTestCase mi
321
325
  sg.remove_members(list(Prefix.objects.filter(ip_version=4)))
322
326
  self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.filter(ip_version=6))
323
327
  self.assertEqual(sg.static_group_associations.count(), Prefix.objects.filter(ip_version=6).count())
328
+ # test cumulative removal and alternate code path
329
+ sg.remove_members(list(Prefix.objects.filter(ip_version=6)))
330
+ self.assertQuerysetEqual(sg.members, Prefix.objects.none())
331
+ self.assertEqual(sg.static_group_associations.count(), 0)
324
332
 
325
333
  # test property setter
326
334
  sg.members = Prefix.objects.filter(ip_version=4)
327
335
  self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.filter(ip_version=4))
336
+ sg.members = Prefix.objects.filter(ip_version=6)
337
+ self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.filter(ip_version=6))
338
+ sg.members = list(Prefix.objects.filter(ip_version=4))
339
+ self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.filter(ip_version=4))
328
340
  sg.members = list(Prefix.objects.filter(ip_version=6))
329
341
  self.assertQuerysetEqualAndNotEmpty(sg.members, Prefix.objects.filter(ip_version=6))
330
342
 
@@ -6,12 +6,15 @@ from django.core.exceptions import ValidationError
6
6
  from django.template import engines
7
7
  from django.test import override_settings
8
8
  from django.urls import NoReverseMatch, reverse
9
+ import django_tables2 as tables
9
10
  import netaddr
10
11
 
11
12
  from nautobot.circuits.models import Circuit, CircuitType, Provider
12
13
  from nautobot.core.testing import APIViewTestCases, disable_warnings, extract_page_body, TestCase, ViewTestCases
14
+ from nautobot.core.utils.lookup import get_table_for_model
13
15
  from nautobot.dcim.models import Device, DeviceType, Location, LocationType, Manufacturer
14
16
  from nautobot.dcim.tests.test_views import create_test_device
17
+ from nautobot.extras import plugins
15
18
  from nautobot.extras.choices import CustomFieldTypeChoices, RelationshipTypeChoices
16
19
  from nautobot.extras.jobs import get_job
17
20
  from nautobot.extras.models import CustomField, Relationship, RelationshipAssociation, Role, Secret, Status
@@ -647,6 +650,97 @@ class FilterExtensionTest(TestCase):
647
650
  self.assertIn("example_app_description", form.fields.keys())
648
651
 
649
652
 
653
+ class TableExtensionTest(TestCase):
654
+ """Tests for adding table extensions."""
655
+
656
+ def test_alter_queryset(self):
657
+ """Test the 'alter_queryset' method of the TableExtension class."""
658
+ extension = plugins.TableExtension()
659
+ queryset = object()
660
+ result = extension.alter_queryset(queryset)
661
+ self.assertEqual(result, queryset)
662
+
663
+ def test__add_columns_into_model_table(self):
664
+ """Test the '_add_columns_into_model_table' function."""
665
+ extension = plugins.TableExtension()
666
+ extension.model = "tenancy.tenant"
667
+ extension.table_columns = {
668
+ "tenant_group": tables.Column(verbose_name="Name conflicts with existing column"),
669
+ "tenant_success": tables.Column(verbose_name="This name should be registered"),
670
+ }
671
+ extension.add_to_default_columns = ["tenant_group", "tenant_success"]
672
+
673
+ with self.assertLogs("nautobot.extras.plugins", level="WARNING") as logger:
674
+ plugins._add_columns_into_model_table(extension, "tenant")
675
+ table = get_table_for_model(extension.model)
676
+ expected = [
677
+ "ERROR:nautobot.extras.plugins:tenant: There was a name conflict with existing "
678
+ "table column `tenant_group`, the custom column was ignored."
679
+ ]
680
+ with self.subTest("error is logged"):
681
+ self.assertEqual(logger.output, expected)
682
+
683
+ with self.subTest("column is added to default_columns"):
684
+ self.assertIn("tenant_success", table.base_columns)
685
+
686
+ def test__add_column_to_table_base_columns(self):
687
+ """Test the '_add_column_to_table_base_columns' function."""
688
+ table = get_table_for_model("tenancy.tenant")
689
+
690
+ with self.subTest("raises TypeError"):
691
+ column = object()
692
+ with self.assertRaises(TypeError) as context:
693
+ plugins._add_column_to_table_base_columns(table, "test_column", column, "my_app")
694
+ self.assertEqual(
695
+ context.exception, "Custom column `test_column` is not an instance of django_tables2.Column."
696
+ )
697
+
698
+ with self.subTest("raises AttributeError"):
699
+ column = tables.Column()
700
+ with self.assertRaises(AttributeError) as context:
701
+ plugins._add_column_to_table_base_columns(table, "pk", column, "my_app")
702
+ self.assertEqual(
703
+ context.exception, "There was a conflict with table column `pk`, the custom column was ignored."
704
+ )
705
+
706
+ with self.subTest("Adds column to base_columns"):
707
+ column = tables.Column()
708
+ plugins._add_column_to_table_base_columns(table, "unique_name", column, "my_app")
709
+ self.assertIn("unique_name", table.base_columns)
710
+
711
+ def test__modify_default_table_columns(self):
712
+ """Test the '_modify_default_table_columns' function."""
713
+ extension = plugins.TableExtension()
714
+ extension.model = "tenancy.tenant"
715
+ extension.add_to_default_columns = ["new_column"]
716
+ extension.remove_from_default_columns = ["description"]
717
+
718
+ table = get_table_for_model(extension.model)
719
+ table.base_columns["new_column"] = tables.Column()
720
+
721
+ plugins._modify_default_table_columns(extension, "my_app")
722
+
723
+ with self.subTest("column is added to default_columns"):
724
+ self.assertIn("new_column", table.Meta.default_columns)
725
+
726
+ with self.subTest("column is removed from default_columns"):
727
+ self.assertNotIn("description", table.Meta.default_columns)
728
+
729
+ def test__validate_is_subclass_of_table_extension(self):
730
+ """Test the '_validate_is_subclass_of_table_extension' function."""
731
+ with self.assertRaises(TypeError):
732
+ plugins._validate_is_subclass_of_table_extension(object)
733
+
734
+ def test__validate_table_column_name_is_prefixed_with_app_name(self):
735
+ """Test the '_validate_table_column_name_is_prefixed_with_app_name' function."""
736
+ with self.assertRaises(ValueError) as context:
737
+ plugins._validate_table_column_name_is_prefixed_with_app_name("not_prefixed", "prefix")
738
+ self.assertEqual(
739
+ context.exception,
740
+ "Attempted to create a custom table column `not_prefixed` that did not start with `prefix`",
741
+ )
742
+
743
+
650
744
  class LoadPluginTest(TestCase):
651
745
  """
652
746
  Validate that plugin helpers work as intended.
@@ -345,7 +345,7 @@ class WebhookTest(APITestCase):
345
345
 
346
346
  all_changes = get_changes_for_model(location)
347
347
  self.assertEqual(all_changes.count(), 1)
348
- mock_enqueue_webhooks.assert_called_once_with(all_changes.first())
348
+ mock_enqueue_webhooks.assert_called_once_with(all_changes.first(), webhook_queryset=None)
349
349
 
350
350
  def test_all_webhook_supported_models(self):
351
351
  """
nautobot/extras/views.py CHANGED
@@ -737,7 +737,9 @@ class DynamicGroupView(generic.ObjectView):
737
737
 
738
738
  if table_class is not None:
739
739
  # Members table (for display on Members nav tab)
740
- members_table = table_class(members.restrict(request.user, "view"), orderable=False)
740
+ members_table = table_class(
741
+ members.restrict(request.user, "view"), orderable=False, exclude=["dynamic_group_count"]
742
+ )
741
743
  paginate = {
742
744
  "paginator_class": EnhancedPaginator,
743
745
  "per_page": get_paginate_count(request),
@@ -6,16 +6,22 @@ from nautobot.extras.registry import registry
6
6
  from nautobot.extras.tasks import process_webhook
7
7
 
8
8
 
9
- def enqueue_webhooks(object_change):
9
+ def enqueue_webhooks(object_change, webhook_queryset=None):
10
10
  """
11
- Find Webhook(s) assigned to this instance + action and enqueue them
12
- to be processed
11
+ Find Webhook(s) assigned to this instance + action and enqueue them to be processed.
12
+
13
+ Args:
14
+ object_change (ObjectChange): The change that may trigger Webhooks to be sent.
15
+ webhook_queryset (QuerySet): Previously retrieved set of Webhooks to potentially send.
16
+
17
+ Returns:
18
+ webhook_queryset (QuerySet): for reuse when processing multiple ObjectChange with the same content-type+action.
13
19
  """
14
20
  # Determine whether this type of object supports webhooks
15
21
  app_label = object_change.changed_object_type.app_label
16
22
  model_name = object_change.changed_object_type.model
17
23
  if model_name not in registry["model_features"]["webhooks"].get(app_label, []):
18
- return
24
+ return webhook_queryset
19
25
 
20
26
  # Retrieve any applicable Webhooks
21
27
  content_type = object_change.changed_object_type
@@ -24,16 +30,17 @@ def enqueue_webhooks(object_change):
24
30
  ObjectChangeActionChoices.ACTION_UPDATE: "type_update",
25
31
  ObjectChangeActionChoices.ACTION_DELETE: "type_delete",
26
32
  }[object_change.action]
27
- webhooks = Webhook.objects.filter(content_types=content_type, enabled=True, **{action_flag: True})
33
+ if webhook_queryset is None:
34
+ webhook_queryset = Webhook.objects.filter(content_types=content_type, enabled=True, **{action_flag: True})
28
35
 
29
- if webhooks.exists():
36
+ if webhook_queryset: # not .exists() as we *want* to populate the queryset cache
30
37
  # fall back to object_data if object_data_v2 is not available
31
38
  serialized_data = object_change.object_data_v2
32
39
  if serialized_data is None:
33
40
  serialized_data = object_change.object_data
34
41
 
35
42
  # Enqueue the webhooks
36
- for webhook in webhooks:
43
+ for webhook in webhook_queryset:
37
44
  args = [
38
45
  webhook.pk,
39
46
  serialized_data,
@@ -45,3 +52,5 @@ def enqueue_webhooks(object_change):
45
52
  object_change.get_snapshots(),
46
53
  ]
47
54
  process_webhook.apply_async(args=args)
55
+
56
+ return webhook_queryset
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
  <link rel="icon" href="/projects/core/en/stable/assets/favicon.ico">
15
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.39">
15
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
16
16
 
17
17
 
18
18
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.8c3ca2c6.min.css">
23
+ <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.0253249f.min.css">
24
24
 
25
25
 
26
26
  <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/palette.06af60db.min.css">
@@ -6364,6 +6364,27 @@
6364
6364
 
6365
6365
 
6366
6366
 
6367
+ <li class="md-nav__item">
6368
+ <a href="/projects/core/en/stable/development/apps/api/platform-features/table-extensions.html" class="md-nav__link">
6369
+
6370
+
6371
+ <span class="md-ellipsis">
6372
+ Table Extensions
6373
+ </span>
6374
+
6375
+
6376
+ </a>
6377
+ </li>
6378
+
6379
+
6380
+
6381
+
6382
+
6383
+
6384
+
6385
+
6386
+
6387
+
6367
6388
  <li class="md-nav__item">
6368
6389
  <a href="/projects/core/en/stable/development/apps/api/platform-features/uniquely-identify-objects.html" class="md-nav__link">
6369
6390
 
@@ -8629,7 +8650,7 @@
8629
8650
  <script id="__config" type="application/json">{"base": "/projects/core/en/stable/", "features": ["content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "/projects/core/en/stable/assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
8630
8651
 
8631
8652
 
8632
- <script src="/projects/core/en/stable/assets/javascripts/bundle.525ec568.min.js"></script>
8653
+ <script src="/projects/core/en/stable/assets/javascripts/bundle.83f73b43.min.js"></script>
8633
8654
 
8634
8655
  <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
8635
8656
 
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
  <link rel="icon" href="../assets/favicon.ico">
21
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.39">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- <link rel="stylesheet" href="../assets/stylesheets/main.8c3ca2c6.min.css">
29
+ <link rel="stylesheet" href="../assets/stylesheets/main.0253249f.min.css">
30
30
 
31
31
 
32
32
  <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
@@ -6386,6 +6386,27 @@
6386
6386
 
6387
6387
 
6388
6388
 
6389
+ <li class="md-nav__item">
6390
+ <a href="../development/apps/api/platform-features/table-extensions.html" class="md-nav__link">
6391
+
6392
+
6393
+ <span class="md-ellipsis">
6394
+ Table Extensions
6395
+ </span>
6396
+
6397
+
6398
+ </a>
6399
+ </li>
6400
+
6401
+
6402
+
6403
+
6404
+
6405
+
6406
+
6407
+
6408
+
6409
+
6389
6410
  <li class="md-nav__item">
6390
6411
  <a href="../development/apps/api/platform-features/uniquely-identify-objects.html" class="md-nav__link">
6391
6412
 
@@ -8796,7 +8817,7 @@
8796
8817
  <script id="__config" type="application/json">{"base": "..", "features": ["content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
8797
8818
 
8798
8819
 
8799
- <script src="../assets/javascripts/bundle.525ec568.min.js"></script>
8820
+ <script src="../assets/javascripts/bundle.83f73b43.min.js"></script>
8800
8821
 
8801
8822
  <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
8802
8823
 
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  <link rel="icon" href="../assets/favicon.ico">
19
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.39">
19
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
20
20
 
21
21
 
22
22
 
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- <link rel="stylesheet" href="../assets/stylesheets/main.8c3ca2c6.min.css">
27
+ <link rel="stylesheet" href="../assets/stylesheets/main.0253249f.min.css">
28
28
 
29
29
 
30
30
  <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
@@ -6384,6 +6384,27 @@
6384
6384
 
6385
6385
 
6386
6386
 
6387
+ <li class="md-nav__item">
6388
+ <a href="../development/apps/api/platform-features/table-extensions.html" class="md-nav__link">
6389
+
6390
+
6391
+ <span class="md-ellipsis">
6392
+ Table Extensions
6393
+ </span>
6394
+
6395
+
6396
+ </a>
6397
+ </li>
6398
+
6399
+
6400
+
6401
+
6402
+
6403
+
6404
+
6405
+
6406
+
6407
+
6387
6408
  <li class="md-nav__item">
6388
6409
  <a href="../development/apps/api/platform-features/uniquely-identify-objects.html" class="md-nav__link">
6389
6410
 
@@ -8730,7 +8751,7 @@
8730
8751
  <script id="__config" type="application/json">{"base": "..", "features": ["content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
8731
8752
 
8732
8753
 
8733
- <script src="../assets/javascripts/bundle.525ec568.min.js"></script>
8754
+ <script src="../assets/javascripts/bundle.83f73b43.min.js"></script>
8734
8755
 
8735
8756
  <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
8736
8757