nautobot-dev-example 3.1.0__tar.gz → 3.1.1__tar.gz

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.
Files changed (119) hide show
  1. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/PKG-INFO +1 -1
  2. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/version_3.1.html +56 -3
  3. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/contributing.html +1 -1
  4. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/release_checklist.html +21 -0
  5. nautobot_dev_example-3.1.1/nautobot_dev_example/static/nautobot_dev_example/docs/search/search_index.json +1 -0
  6. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/sitemap.xml +26 -26
  7. nautobot_dev_example-3.1.1/nautobot_dev_example/static/nautobot_dev_example/docs/sitemap.xml.gz +0 -0
  8. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/pyproject.toml +1 -1
  9. nautobot_dev_example-3.1.0/nautobot_dev_example/static/nautobot_dev_example/docs/search/search_index.json +0 -1
  10. nautobot_dev_example-3.1.0/nautobot_dev_example/static/nautobot_dev_example/docs/sitemap.xml.gz +0 -0
  11. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/LICENSE +0 -0
  12. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/README.md +0 -0
  13. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/__init__.py +0 -0
  14. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/api/__init__.py +0 -0
  15. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/api/serializers.py +0 -0
  16. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/api/urls.py +0 -0
  17. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/api/views.py +0 -0
  18. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/app-config-schema.json +0 -0
  19. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/filters.py +0 -0
  20. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/forms.py +0 -0
  21. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/management/__init__.py +0 -0
  22. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/management/commands/__init__.py +0 -0
  23. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/management/commands/generate_nautobot_dev_example_test_data.py +0 -0
  24. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/migrations/0001_initial.py +0 -0
  25. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/migrations/0002_alter_devexample_description_alter_devexample_name.py +0 -0
  26. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/migrations/__init__.py +0 -0
  27. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/models.py +0 -0
  28. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/navigation.py +0 -0
  29. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/404.html +0 -0
  30. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/compatibility_matrix.html +0 -0
  31. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/install.html +0 -0
  32. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/index.html +0 -0
  33. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/version_1.0.html +0 -0
  34. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/version_2.0.html +0 -0
  35. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/version_2.1.html +0 -0
  36. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/version_2.2.html +0 -0
  37. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/release_notes/version_3.0.html +0 -0
  38. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/uninstall.html +0 -0
  39. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/admin/upgrade.html +0 -0
  40. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/_mkdocstrings.css +0 -0
  41. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/extra.css +0 -0
  42. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/favicon.ico +0 -0
  43. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/images/favicon.png +0 -0
  44. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/bundle.60a45f97.min.js +0 -0
  45. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/bundle.60a45f97.min.js.map +0 -0
  46. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/glightbox.min.js +0 -0
  47. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.ar.min.js +0 -0
  48. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.da.min.js +0 -0
  49. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.de.min.js +0 -0
  50. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.du.min.js +0 -0
  51. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.el.min.js +0 -0
  52. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.es.min.js +0 -0
  53. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.fi.min.js +0 -0
  54. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.fr.min.js +0 -0
  55. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.he.min.js +0 -0
  56. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.hi.min.js +0 -0
  57. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.hu.min.js +0 -0
  58. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.hy.min.js +0 -0
  59. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.it.min.js +0 -0
  60. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.ja.min.js +0 -0
  61. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.jp.min.js +0 -0
  62. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.kn.min.js +0 -0
  63. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.ko.min.js +0 -0
  64. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.multi.min.js +0 -0
  65. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.nl.min.js +0 -0
  66. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.no.min.js +0 -0
  67. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.pt.min.js +0 -0
  68. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.ro.min.js +0 -0
  69. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.ru.min.js +0 -0
  70. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.sa.min.js +0 -0
  71. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -0
  72. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.sv.min.js +0 -0
  73. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.ta.min.js +0 -0
  74. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.te.min.js +0 -0
  75. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.th.min.js +0 -0
  76. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.tr.min.js +0 -0
  77. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.vi.min.js +0 -0
  78. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/min/lunr.zh.min.js +0 -0
  79. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/tinyseg.js +0 -0
  80. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/lunr/wordcut.js +0 -0
  81. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/workers/search.f8cc74c7.min.js +0 -0
  82. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/javascripts/workers/search.f8cc74c7.min.js.map +0 -0
  83. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/nautobot_logo.png +0 -0
  84. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/nautobot_logo.svg +0 -0
  85. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/networktocode_bw.png +0 -0
  86. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/overrides/partials/copyright.html +0 -0
  87. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/stylesheets/glightbox.min.css +0 -0
  88. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/stylesheets/main.a40c8224.min.css +0 -0
  89. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/stylesheets/main.a40c8224.min.css.map +0 -0
  90. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/stylesheets/palette.06af60db.min.css +0 -0
  91. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/assets/stylesheets/palette.06af60db.min.css.map +0 -0
  92. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/arch_decision.html +0 -0
  93. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/code_reference/api.html +0 -0
  94. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/code_reference/index.html +0 -0
  95. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/code_reference/package.html +0 -0
  96. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/dev_environment.html +0 -0
  97. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/dev/extending.html +0 -0
  98. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/images/icon-nautobot-dev-example.png +0 -0
  99. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/index.html +0 -0
  100. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/insert-analytics.sh +0 -0
  101. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/media/ss_main_page_dark.png +0 -0
  102. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/media/ss_main_page_light.png +0 -0
  103. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/models/devexample.html +0 -0
  104. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/objects.inv +0 -0
  105. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/user/app_getting_started.html +0 -0
  106. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/user/app_overview.html +0 -0
  107. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/user/app_use_cases.html +0 -0
  108. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/user/external_interactions.html +0 -0
  109. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/static/nautobot_dev_example/docs/user/faq.html +0 -0
  110. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tables.py +0 -0
  111. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/__init__.py +0 -0
  112. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/fixtures.py +0 -0
  113. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/test_api.py +0 -0
  114. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/test_filters.py +0 -0
  115. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/test_forms.py +0 -0
  116. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/test_models.py +0 -0
  117. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/tests/test_views.py +0 -0
  118. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/urls.py +0 -0
  119. {nautobot_dev_example-3.1.0 → nautobot_dev_example-3.1.1}/nautobot_dev_example/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nautobot-dev-example
3
- Version: 3.1.0
3
+ Version: 3.1.1
4
4
  Summary: Nautobot App to demonstrate how to create a Nautobot App.
5
5
  License: Apache-2.0
6
6
  Keywords: nautobot,nautobot-app,nautobot-plugin
@@ -890,6 +890,30 @@
890
890
  </span>
891
891
  </a>
892
892
 
893
+ </li>
894
+
895
+ <li class="md-nav__item">
896
+ <a href="#v311-2026-06-26" class="md-nav__link">
897
+ <span class="md-ellipsis">
898
+ v3.1.1 (2026-06-26)
899
+ </span>
900
+ </a>
901
+
902
+ <nav class="md-nav" aria-label="v3.1.1 (2026-06-26)">
903
+ <ul class="md-nav__list">
904
+
905
+ <li class="md-nav__item">
906
+ <a href="#housekeeping" class="md-nav__link">
907
+ <span class="md-ellipsis">
908
+ Housekeeping
909
+ </span>
910
+ </a>
911
+
912
+ </li>
913
+
914
+ </ul>
915
+ </nav>
916
+
893
917
  </li>
894
918
 
895
919
  <li class="md-nav__item">
@@ -921,7 +945,7 @@
921
945
  </li>
922
946
 
923
947
  <li class="md-nav__item">
924
- <a href="#housekeeping" class="md-nav__link">
948
+ <a href="#housekeeping_1" class="md-nav__link">
925
949
  <span class="md-ellipsis">
926
950
  Housekeeping
927
951
  </span>
@@ -1388,6 +1412,30 @@
1388
1412
  </span>
1389
1413
  </a>
1390
1414
 
1415
+ </li>
1416
+
1417
+ <li class="md-nav__item">
1418
+ <a href="#v311-2026-06-26" class="md-nav__link">
1419
+ <span class="md-ellipsis">
1420
+ v3.1.1 (2026-06-26)
1421
+ </span>
1422
+ </a>
1423
+
1424
+ <nav class="md-nav" aria-label="v3.1.1 (2026-06-26)">
1425
+ <ul class="md-nav__list">
1426
+
1427
+ <li class="md-nav__item">
1428
+ <a href="#housekeeping" class="md-nav__link">
1429
+ <span class="md-ellipsis">
1430
+ Housekeeping
1431
+ </span>
1432
+ </a>
1433
+
1434
+ </li>
1435
+
1436
+ </ul>
1437
+ </nav>
1438
+
1391
1439
  </li>
1392
1440
 
1393
1441
  <li class="md-nav__item">
@@ -1419,7 +1467,7 @@
1419
1467
  </li>
1420
1468
 
1421
1469
  <li class="md-nav__item">
1422
- <a href="#housekeeping" class="md-nav__link">
1470
+ <a href="#housekeeping_1" class="md-nav__link">
1423
1471
  <span class="md-ellipsis">
1424
1472
  Housekeeping
1425
1473
  </span>
@@ -1472,6 +1520,11 @@
1472
1520
  </ul>
1473
1521
  <!-- towncrier release notes start -->
1474
1522
 
1523
+ <h2 id="v311-2026-06-26"><a href="https://github.com/nautobot/nautobot-app-dev-example/releases/tag/v3.1.1">v3.1.1 (2026-06-26)</a><a class="headerlink" href="#v311-2026-06-26" title="Permanent link">¶</a></h2>
1524
+ <h3 id="housekeeping">Housekeeping<a class="headerlink" href="#housekeeping" title="Permanent link">¶</a></h3>
1525
+ <ul>
1526
+ <li><a href="https://github.com/nautobot/nautobot-app-dev-example/issues/172">#172</a> - Added a release workflow job that opens a pull request from <code>main</code> into <code>next</code> after a release is published from <code>main</code>.</li>
1527
+ </ul>
1475
1528
  <h2 id="v310-2026-05-15"><a href="https://github.com/nautobot/nautobot-app-dev-example/releases/tag/v3.1.0">v3.1.0 (2026-05-15)</a><a class="headerlink" href="#v310-2026-05-15" title="Permanent link">¶</a></h2>
1476
1529
  <h3 id="added">Added<a class="headerlink" href="#added" title="Permanent link">¶</a></h3>
1477
1530
  <ul>
@@ -1481,7 +1534,7 @@
1481
1534
  <ul>
1482
1535
  <li><a href="https://github.com/nautobot/nautobot-app-dev-example/issues/162">#162</a> - Updates the CI pipeline so that we auto increment post-release versions when creating a release from main, develop, next, and ltm- branches.</li>
1483
1536
  </ul>
1484
- <h3 id="housekeeping">Housekeeping<a class="headerlink" href="#housekeeping" title="Permanent link">¶</a></h3>
1537
+ <h3 id="housekeeping_1">Housekeeping<a class="headerlink" href="#housekeeping_1" title="Permanent link">¶</a></h3>
1485
1538
  <ul>
1486
1539
  <li><a href="https://github.com/nautobot/nautobot-app-dev-example/issues/149">#149</a> - Fixed the sizing of the logo in the footer as well as adjusted it to be inline with the text.</li>
1487
1540
  <li><a href="https://github.com/nautobot/nautobot-app-dev-example/issues/159">#159</a> - Housekeeping update Prepare-Release workflow to use a token when creating a PR so that GitHub Actions run.</li>
@@ -1473,7 +1473,7 @@
1473
1473
  </ul>
1474
1474
  <p>Documentation is built using <a href="https://www.mkdocs.org/">mkdocs</a>. The <a href="dev_environment.html#docker-development-environment">Docker based development environment</a> automatically starts a container hosting a live version of the documentation website on <a href="http://localhost:8001">http://localhost:8001</a> that auto-refreshes when you make any changes to your local files.</p>
1475
1475
  <h2 id="creating-changelog-fragments">Creating Changelog Fragments<a class="headerlink" href="#creating-changelog-fragments" title="Permanent link">¶</a></h2>
1476
- <p>All pull requests to <code>next</code> or <code>develop</code> must include a changelog fragment file in the <code>./changes</code> directory. To create a fragment, use your GitHub issue number and fragment type as the filename. For example, <code>2362.added</code>. Valid fragment types are <code>added</code>, <code>changed</code>, <code>deprecated</code>, <code>fixed</code>, <code>removed</code>, and <code>security</code>. The change summary is added to the file in plain text. Change summaries should be complete sentences, starting with a capital letter and ending with a period, and be in past tense. Each line of the change fragment will generate a single change entry in the release notes. Use multiple lines in the same file if your change needs to generate multiple release notes in the same category. If the change needs to create multiple entries in separate categories, create multiple files.</p>
1476
+ <p>All pull requests to <code>next</code> or <code>develop</code> must include a changelog fragment file in the <code>./changes</code> directory. To create a fragment, use your GitHub issue number and fragment type as the filename. For example, <code>2362.added</code>. Valid fragment types are <code>added</code>, <code>changed</code>, <code>deprecated</code>, <code>fixed</code>, <code>removed</code>, <code>security</code>, <code>breaking</code>, <code>dependencies</code>, <code>documentation</code> and <code>housekeeping</code>. The change summary is added to the file in plain text. Change summaries should be complete sentences, starting with a capital letter and ending with a period, and be in past tense. Each line of the change fragment will generate a single change entry in the release notes. Use multiple lines in the same file if your change needs to generate multiple release notes in the same category. If the change needs to create multiple entries in separate categories, create multiple files.</p>
1477
1477
  <div class="admonition example">
1478
1478
  <p class="admonition-title">Example</p>
1479
1479
  <p><strong>Wrong</strong>
@@ -1232,6 +1232,15 @@
1232
1232
  </span>
1233
1233
  </a>
1234
1234
 
1235
+ </li>
1236
+
1237
+ <li class="md-nav__item">
1238
+ <a href="#sync-the-release-to-next" class="md-nav__link">
1239
+ <span class="md-ellipsis">
1240
+ Sync the Release to next
1241
+ </span>
1242
+ </a>
1243
+
1235
1244
  </li>
1236
1245
 
1237
1246
  </ul>
@@ -1618,6 +1627,15 @@
1618
1627
  </span>
1619
1628
  </a>
1620
1629
 
1630
+ </li>
1631
+
1632
+ <li class="md-nav__item">
1633
+ <a href="#sync-the-release-to-next" class="md-nav__link">
1634
+ <span class="md-ellipsis">
1635
+ Sync the Release to next
1636
+ </span>
1637
+ </a>
1638
+
1621
1639
  </li>
1622
1640
 
1623
1641
  </ul>
@@ -1798,6 +1816,9 @@
1798
1816
  <p>A draft release will automatically be created in GitHub when the Prepare Release workflow is run. Verify the content of the release notes, the tag, and the target branch, then publish the release.</p>
1799
1817
  <h3 id="sync-the-release-back-to-develop">Sync the Release Back to <code>develop</code><a class="headerlink" href="#sync-the-release-back-to-develop" title="Permanent link">¶</a></h3>
1800
1818
  <p>After a release has been published from the <code>main</code> branch, a new PR will automatically be created to merge the changes from <code>main</code> back into <code>develop</code> with a version bump to the next development version (e.g. <code>1.4.3a1</code>). Review and merge this PR once CI has completed and the PR has been approved.</p>
1819
+ <h3 id="sync-the-release-to-next">Sync the Release to <code>next</code><a class="headerlink" href="#sync-the-release-to-next" title="Permanent link">¶</a></h3>
1820
+ <p>Publishing a release from the <code>main</code> branch will also automatically create a PR to forward-port the released changes from <code>main</code> into <code>next</code>, so the <code>next</code> branch stays up to date.</p>
1821
+ <p>If no <code>next</code> branch exists, this step is skipped automatically.</p>
1801
1822
  <h2 id="legacy-documentation-for-releases">Legacy Documentation for Releases<a class="headerlink" href="#legacy-documentation-for-releases" title="Permanent link">¶</a></h2>
1802
1823
  <p>Please use the above process for all releases going forward, but if you need to refer to the old manual release process for any reason, here are the steps that were previously followed for releases.</p>
1803
1824
  <h3 id="bump-the-version">Bump the Version<a class="headerlink" href="#bump-the-version" title="Permanent link">¶</a></h3>
@@ -0,0 +1 @@
1
+ {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"Nautobot Dev Example App","text":"<p>This application serves as a testbed for evaluating improvements to the Nautobot App Cookiecutter Templates. DO NOT USE this repository directly in production environments or to bootstrap a new app!</p> <p>For those wanting to develop a new Nautobot app, please use the cookiecutter template as a starting point.</p> <p> An App for Nautobot. </p>"},{"location":"index.html#overview","title":"Overview","text":"<p>An example Nautobot app with multiple functions:</p> <ul> <li>Acts as a Canary App to test enhancements to the Nautobot app cookiecutter templates.</li> <li>Illustrates how to use the Nautobot app framework.</li> </ul>"},{"location":"index.html#screenshots","title":"Screenshots","text":"<p>More screenshots can be found in the Using the App page in the documentation. Here's a quick overview of some of the app's added functionality:</p> <p></p>"},{"location":"index.html#documentation","title":"Documentation","text":"<p>Full documentation for this App can be found over on the Nautobot Docs website:</p> <ul> <li>User Guide - Overview, Using the App, Getting Started.</li> <li>Administrator Guide - How to Install, Configure, Upgrade, or Uninstall the App.</li> <li>Developer Guide - Extending the App, Code Reference, Contribution Guide.</li> <li>Release Notes / Changelog.</li> <li>Frequently Asked Questions.</li> </ul>"},{"location":"index.html#contributing-to-the-documentation","title":"Contributing to the Documentation","text":"<p>You can find all the Markdown source for the App documentation under the <code>docs</code> folder in this repository. For simple edits, a Markdown capable editor is sufficient: clone the repository and edit away.</p> <p>If you need to view the fully-generated documentation site, you can build it with MkDocs. A container hosting the documentation can be started using the <code>invoke</code> commands (details in the Development Environment Guide) on http://localhost:8001. Using this container, as your changes to the documentation are saved, they will be automatically rebuilt and any pages currently being viewed will be reloaded in your browser.</p> <p>Any PRs with fixes or improvements are very welcome!</p>"},{"location":"index.html#questions","title":"Questions","text":"<p>For any questions or comments, please check the FAQ first. Feel free to also swing by the Network to Code Slack (channel <code>#nautobot</code>), sign up here if you don't have an account.</p>"},{"location":"admin/compatibility_matrix.html","title":"Compatibility Matrix","text":""},{"location":"admin/compatibility_matrix.html#compatibility-matrix","title":"Compatibility Matrix","text":"Nautobot Dev Example App Version Nautobot First Support Version Nautobot Last Support Version 1.0.X 2.0.0 2.99.99 2.0.X 2.0.0 2.99.99 2.1.X 2.0.0 2.99.99 2.2.X 2.4.11 2.99.99 2.3.X 2.4.20 2.99.99"},{"location":"admin/install.html","title":"Install and Configure","text":""},{"location":"admin/install.html#installing-the-app-in-nautobot","title":"Installing the App in Nautobot","text":"<p>Here you will find detailed instructions on how to install and configure the App within your Nautobot environment.</p>"},{"location":"admin/install.html#prerequisites","title":"Prerequisites","text":"<ul> <li>The app is compatible with Nautobot 3.0.0 and higher.</li> <li>Databases supported: PostgreSQL, MySQL</li> </ul> <p>Note</p> <p>Please check the dedicated page for a full compatibility matrix and the deprecation policy.</p>"},{"location":"admin/install.html#access-requirements","title":"Access Requirements","text":""},{"location":"admin/install.html#install-guide","title":"Install Guide","text":"<p>Note</p> <p>Apps can be installed from the Python Package Index or locally. See the Nautobot documentation for more details. The pip package name for this app is <code>nautobot-dev-example</code>.</p> <p>The app is available as a Python package via PyPI and can be installed with <code>pip</code>:</p> <pre><code>pip install nautobot-dev-example\n</code></pre> <p>To ensure Nautobot Dev Example App is automatically re-installed during future upgrades, create a file named <code>local_requirements.txt</code> (if not already existing) in the Nautobot root directory (alongside <code>requirements.txt</code>) and list the <code>nautobot-dev-example</code> package:</p> <pre><code>echo nautobot-dev-example &gt;&gt; local_requirements.txt\n</code></pre> <p>Once installed, the app needs to be enabled in your Nautobot configuration. The following block of code below shows the additional configuration required to be added to your <code>nautobot_config.py</code> file:</p> <ul> <li>Append <code>\"nautobot_dev_example\"</code> to the <code>PLUGINS</code> list.</li> <li>Append the <code>\"nautobot_dev_example\"</code> dictionary to the <code>PLUGINS_CONFIG</code> dictionary and override any defaults.</li> </ul> <pre><code># In your nautobot_config.py\nPLUGINS = [\"nautobot_dev_example\"]\n\n# PLUGINS_CONFIG = {\n# \"nautobot_dev_example\": {\n# ADD YOUR SETTINGS HERE\n# }\n# }\n</code></pre> <p>Once the Nautobot configuration is updated, run the Post Upgrade command (<code>nautobot-server post_upgrade</code>) to run migrations and clear any cache:</p> <pre><code>nautobot-server post_upgrade\n</code></pre> <p>Then restart (if necessary) the Nautobot services which may include:</p> <ul> <li>Nautobot</li> <li>Nautobot Workers</li> <li>Nautobot Scheduler</li> </ul> <pre><code>sudo systemctl restart nautobot nautobot-worker nautobot-scheduler\n</code></pre>"},{"location":"admin/install.html#app-configuration","title":"App Configuration","text":"<p>The app behavior can be controlled with the following list of settings:</p> Key Example Default Description <code>enable_backup</code> <code>True</code> <code>True</code> A boolean to represent whether or not to run backup configurations within the app. <code>platform_slug_map</code> <code>{\"cisco_wlc\": \"cisco_aireos\"}</code> <code>None</code> A dictionary in which the key is the platform slug and the value is what netutils uses in any \"network_os\" parameter. <code>per_feature_bar_width</code> <code>0.15</code> <code>0.15</code> The width of the table bar within the overview report"},{"location":"admin/uninstall.html","title":"Uninstall","text":""},{"location":"admin/uninstall.html#uninstall-the-app-from-nautobot","title":"Uninstall the App from Nautobot","text":"<p>Here you will find any steps necessary to cleanly remove the App from your Nautobot environment.</p>"},{"location":"admin/uninstall.html#database-cleanup","title":"Database Cleanup","text":"<p>Prior to removing the app from the <code>nautobot_config.py</code>, run the following command to roll back any migration specific to this app.</p> <pre><code>nautobot-server migrate nautobot_dev_example zero\n</code></pre>"},{"location":"admin/uninstall.html#remove-app-configuration","title":"Remove App configuration","text":"<p>Remove the configuration you added in <code>nautobot_config.py</code> from <code>PLUGINS</code> &amp; <code>PLUGINS_CONFIG</code>.</p>"},{"location":"admin/uninstall.html#uninstall-the-package","title":"Uninstall the package","text":"<pre><code>$ pip3 uninstall nautobot-dev-example\n</code></pre>"},{"location":"admin/upgrade.html","title":"Upgrade","text":""},{"location":"admin/upgrade.html#upgrading-the-app","title":"Upgrading the App","text":"<p>Here you will find any steps necessary to upgrade the App in your Nautobot environment.</p>"},{"location":"admin/upgrade.html#upgrade-guide","title":"Upgrade Guide","text":"<p>When a new release comes out it may be necessary to run a migration of the database to account for any changes in the data models used by this app. Execute the command <code>nautobot-server post-upgrade</code> within the runtime environment of your Nautobot installation after updating the <code>nautobot-dev-example</code> package via <code>pip</code>.</p>"},{"location":"admin/release_notes/index.html","title":"Release Notes","text":""},{"location":"admin/release_notes/index.html#release-notes","title":"Release Notes","text":"<p>All the published release notes can be found via the navigation menu. All patch releases are included in the same minor release (e.g. <code>v1.2</code>) document.</p>"},{"location":"admin/release_notes/version_1.0.html","title":"v1.0","text":""},{"location":"admin/release_notes/version_1.0.html#v10-release-notes","title":"v1.0 Release Notes","text":"<p>This document describes all new features and changes in the release <code>1.0</code>. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.</p>"},{"location":"admin/release_notes/version_1.0.html#release-overview","title":"Release Overview","text":"<ul> <li>Major features or milestones</li> <li>Achieved in this <code>x.y</code> release</li> <li>Changes to compatibility with Nautobot and/or other apps, libraries etc.</li> </ul>"},{"location":"admin/release_notes/version_1.0.html#v101-2024-07-10","title":"v1.0.1 (2024-07-10)","text":""},{"location":"admin/release_notes/version_1.0.html#fixed","title":"Fixed","text":"<ul> <li>#28 - Fixed CI token for GH releases.</li> <li>#28 - Updated towncrier template to include the appropriate preamble.</li> <li>#28 - Updated release checklist post-testing.</li> <li>#28 - Ensured towncrier runs locally only when started via invoke.</li> </ul>"},{"location":"admin/release_notes/version_1.0.html#v100-2024-07-04","title":"v1.0.0 (2024-07-04)","text":""},{"location":"admin/release_notes/version_1.0.html#changed","title":"Changed","text":"<ul> <li>#1 - Cleaned up the baked cookie.</li> <li>#21 - Updated steps to create releases.</li> <li>#21 - Changed CI changelog step to ignore branch names starting with \"release\".</li> </ul>"},{"location":"admin/release_notes/version_1.0.html#fixed_1","title":"Fixed","text":"<ul> <li>#20 - Removed deprecated default-authentication-plugin setting for mysql containers.</li> </ul>"},{"location":"admin/release_notes/version_1.0.html#housekeeping","title":"Housekeeping","text":"<ul> <li>#6 - Fixed the documentation to explain the app usage.</li> <li>#7 - Bumped <code>networktocode/gh-action-setup-poetry-environment</code> from <code>v5</code> to <code>v6</code>.</li> <li>#7 - Bumped <code>actions/setup-python</code> from <code>v4</code> to <code>v5</code>.</li> <li>#8, #9 - Re-baked from the latest template.</li> <li>#10 - Fixed NTC link in <code>README.md</code>.</li> <li>#14 - Fully integrated ruff as a (partial) replacement for the other linters.</li> <li>#16 - More additions on ruff integration.</li> </ul>"},{"location":"admin/release_notes/version_2.0.html","title":"v2.0","text":""},{"location":"admin/release_notes/version_2.0.html#v20-release-notes","title":"v2.0 Release Notes","text":"<p>This document describes all new features and changes in the release. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.</p>"},{"location":"admin/release_notes/version_2.0.html#release-overview","title":"Release Overview","text":"<ul> <li>Moving the develop branch to be on 2.x for the Nautobot 2.x compatible code train.</li> </ul>"},{"location":"admin/release_notes/version_2.0.html#v200-2024-08-13","title":"v2.0.0 (2024-08-13)","text":""},{"location":"admin/release_notes/version_2.0.html#changed","title":"Changed","text":"<ul> <li>#31 - More edits to the release checklist.</li> <li>#31 - Added LTM release instructions.</li> </ul>"},{"location":"admin/release_notes/version_2.1.html","title":"v2.1","text":""},{"location":"admin/release_notes/version_2.1.html#v21-release-notes","title":"v2.1 Release Notes","text":"<p>This document describes all new features and changes in the release. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.</p>"},{"location":"admin/release_notes/version_2.1.html#release-overview","title":"Release Overview","text":"<ul> <li>Lots of housekeeping and preparation for app cookiecutter v2.5.0.</li> </ul>"},{"location":"admin/release_notes/version_2.1.html#v211-2025-04-25","title":"v2.1.1 (2025-04-25)","text":""},{"location":"admin/release_notes/version_2.1.html#fixed","title":"Fixed","text":"<ul> <li>#77 - Fixed release workflow.</li> </ul>"},{"location":"admin/release_notes/version_2.1.html#v210-2025-04-24","title":"v2.1.0 (2025-04-24)","text":""},{"location":"admin/release_notes/version_2.1.html#added","title":"Added","text":"<ul> <li>#46 - Added ability to trigger upstream testing manually.</li> <li>#49 - Added docs view to fix the link on the \"Installed Apps\" page.</li> <li>#50 - Added pylint django migrations checker to the <code>invoke pylint</code> command.</li> <li>#53 - Added the ability to pass service name to <code>invoke cli</code></li> <li>#61 - Added Environment variable to control the Celery Beat Log Level.</li> </ul>"},{"location":"admin/release_notes/version_2.1.html#changed","title":"Changed","text":"<ul> <li>#60 - Disabled coverage reporting on invoke unittest unless --coverage is used.</li> </ul>"},{"location":"admin/release_notes/version_2.1.html#fixed_1","title":"Fixed","text":"<ul> <li>#44 - Fixed build failing when <code>NAUTOBOT_VER</code> doesn't exist in PyPi, for example when using a branch name.</li> <li>#47 - Fixed output on <code>invoke lock</code> command.</li> <li>#54 - Fixed <code>invoke tests</code> exiting early even when tests pass.</li> </ul>"},{"location":"admin/release_notes/version_2.1.html#dependencies","title":"Dependencies","text":"<ul> <li>#58 - Pinned mkdocs-autorefs.</li> <li>#69 - Updated towncrier dependency to &gt;=23.6.0,&lt;=24.8.0</li> </ul>"},{"location":"admin/release_notes/version_2.1.html#housekeeping","title":"Housekeeping","text":"<ul> <li>#37 - Updated docs dependencies to latest versions and pinned griffe due to repeated breaking of docs builds.</li> <li>#40 - Rebaked from the cookie <code>nautobot-app-v2.3.2</code>.</li> <li>#48 - Enabled <code>LOG_DEPRECATION_WARNINGS</code> setting.</li> <li>#56 - Pin Poetry to 1.8.5.</li> <li>#56 - Move Pull Request Template to the proper location.</li> <li>#58 - Added app_name to assist with Django URL resolver.</li> <li>#65 - Added Code Coverage Report to the CI.</li> <li>#67 - Added <code>--format</code> argument to <code>invoke backup-db</code> to support exporting in tar format to support Nautobot Cloud snapshots.</li> <li>#68 - Add docs back into the wheel files.</li> <li>#69 - Pinned github actions to their commit refs instead of tags/branches.</li> <li>#69 - Removed jQuery from mkdocs configuration.</li> <li>#70 - Updates from the cookiecutter nautobot app standards.</li> <li>#71 - Updated postgres docker image to version 17 and mysql docker image to lts.</li> <li>#72 - Added markdownlint task and CI check.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.3.0</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.4.0</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.4.1</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.4.2</code>.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html","title":"v2.2","text":""},{"location":"admin/release_notes/version_2.2.html#v22-release-notes","title":"v2.2 Release Notes","text":"<p>This document describes all new features and changes in the release. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.</p>"},{"location":"admin/release_notes/version_2.2.html#release-overview","title":"Release Overview","text":""},{"location":"admin/release_notes/version_2.2.html#v222-2025-10-15","title":"v2.2.2 (2025-10-15)","text":""},{"location":"admin/release_notes/version_2.2.html#housekeeping","title":"Housekeeping","text":"<ul> <li>#555 - Added support for <code>--constrain-python-ver</code> (accepting X.Y or X.Y.Z) in <code>invoke lock</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.5.1</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.6.0</code>.</li> <li>Updated release process into separate workflow and added support for publishing to Artifactory.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#v221-2025-09-09","title":"v2.2.1 (2025-09-09)","text":""},{"location":"admin/release_notes/version_2.2.html#changed","title":"Changed","text":"<ul> <li>#104 - Changed max length of CharFields to <code>nautobot.apps.constants.CHARFIELD_MAX_LENGTH</code>.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#documentation","title":"Documentation","text":"<ul> <li>#104 - Removed <code>docs/requirements.txt</code> and updated readthedocs config to install dependencies from Poetry.</li> <li>#104 - Added <code>pymdownx.details</code> markdown extension to mkdocs config.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#housekeeping_1","title":"Housekeeping","text":"<ul> <li>#101 - Implement DJLint for Django Template Linting.</li> <li>#104 - Updated CI to use ubuntu-latest image.</li> <li>#104 - Changed CI SLACK_WEBHOOK_URL secret to OSS_PYPI_SLACK_WEBHOOK_URL.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#v220-2025-08-26","title":"v2.2.0 (2025-08-26)","text":""},{"location":"admin/release_notes/version_2.2.html#changed_1","title":"Changed","text":"<ul> <li>#95 - Updated Poetry version in CI and pyproject.toml build-system.requires to 2.1.3.</li> <li>#98 - Updated pymarkdownlnt to version 0.9.30 and changed the pymarkdown configuration in pyproject.toml.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#dependencies","title":"Dependencies","text":"<ul> <li>#93 - Dropped support for Python 3.8 and Nautobot &lt;2.4.11.</li> <li>#95 - Pinned Django debug toolbar to ~5.2.0.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#documentation_1","title":"Documentation","text":"<ul> <li>#87 - Added Analytics GTM template override only to RTD docs build.</li> </ul>"},{"location":"admin/release_notes/version_2.2.html#housekeeping_2","title":"Housekeeping","text":"<ul> <li>#93 - Implemented Nautobot UI Component Framework.</li> <li>#215 - Add default labels to issue templates.</li> <li>#517 - Added searchable models to AppConfig.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.5.0</code>.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html","title":"v3.0","text":""},{"location":"admin/release_notes/version_3.0.html#v30-release-notes","title":"v3.0 Release Notes","text":"<p>This document describes all new features and changes in the release. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.</p>"},{"location":"admin/release_notes/version_3.0.html#release-overview","title":"Release Overview","text":"<ul> <li>Added support for Nautobot 3.0.</li> <li>Added support for Python 3.13.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#v303-2026-04-10","title":"v3.0.3 (2026-04-10)","text":""},{"location":"admin/release_notes/version_3.0.html#housekeeping","title":"Housekeeping","text":"<ul> <li>#149 - Fixed the sizing of the logo in the footer as well as adjusted it to be inline with the text.</li> <li>Rebaked from the cookie <code>nautobot-app-v3.1.3</code>.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#v302-2026-03-19","title":"v3.0.2 (2026-03-19)","text":""},{"location":"admin/release_notes/version_3.0.html#housekeeping_1","title":"Housekeeping","text":"<ul> <li>Rebaked from the cookie <code>nautobot-app-v3.1.2</code>.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#v301-2026-02-25","title":"v3.0.1 (2026-02-25)","text":""},{"location":"admin/release_notes/version_3.0.html#changed","title":"Changed","text":"<ul> <li>#114 - Added breaking category to towncrier.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#dependencies","title":"Dependencies","text":"<ul> <li>#117 - Set minimum version of pylint-django to <code>&gt;=2.5.4</code>.</li> <li>#117 - Set minimum version of pylint-nautobot to <code>&gt;=0.3.1</code>.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#documentation","title":"Documentation","text":"<ul> <li>#134 - Added mkdocs plugin glightbox and included media files to provide examples when loaded on readthedocs.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#housekeeping_2","title":"Housekeeping","text":"<ul> <li>#109 - Automate release notes when using invoke generate-release-notes.</li> <li>#127 - Move branch logic into upstream_testing.yml.</li> <li>#128 - Updated CI workflow to always regenerate poetry lockfile.</li> <li>#135 - Added Prepare Release workflow to automate releases.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.7.0</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v2.7.1</code>.</li> <li>Rebaked from the cookie <code>nautobot-app-v3.0.0</code>.</li> </ul>"},{"location":"admin/release_notes/version_3.0.html#v300-2025-11-06","title":"v3.0.0 (2025-11-06)","text":""},{"location":"admin/release_notes/version_3.0.html#added","title":"Added","text":"<ul> <li>Added support for Nautobot 3.0.</li> <li>Added support for Python 3.13.</li> </ul>"},{"location":"admin/release_notes/version_3.1.html","title":"v3.1","text":""},{"location":"admin/release_notes/version_3.1.html#v31-release-notes","title":"v3.1 Release Notes","text":"<p>This document describes all new features and changes in the release. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.</p>"},{"location":"admin/release_notes/version_3.1.html#release-overview","title":"Release Overview","text":"<ul> <li>Major features or milestones</li> <li>Changes to compatibility with Nautobot and/or other apps, libraries etc.</li> </ul>"},{"location":"admin/release_notes/version_3.1.html#v311-2026-06-26","title":"v3.1.1 (2026-06-26)","text":""},{"location":"admin/release_notes/version_3.1.html#housekeeping","title":"Housekeeping","text":"<ul> <li>#172 - Added a release workflow job that opens a pull request from <code>main</code> into <code>next</code> after a release is published from <code>main</code>.</li> </ul>"},{"location":"admin/release_notes/version_3.1.html#v310-2026-05-15","title":"v3.1.0 (2026-05-15)","text":""},{"location":"admin/release_notes/version_3.1.html#added","title":"Added","text":"<ul> <li>#158 - Added a starting point for generating test data.</li> </ul>"},{"location":"admin/release_notes/version_3.1.html#fixed","title":"Fixed","text":"<ul> <li>#162 - Updates the CI pipeline so that we auto increment post-release versions when creating a release from main, develop, next, and ltm- branches.</li> </ul>"},{"location":"admin/release_notes/version_3.1.html#housekeeping_1","title":"Housekeeping","text":"<ul> <li>#149 - Fixed the sizing of the logo in the footer as well as adjusted it to be inline with the text.</li> <li>#159 - Housekeeping update Prepare-Release workflow to use a token when creating a PR so that GitHub Actions run.</li> <li>#160 - Fixed the prepare release workflow bumping the version on prereleases resulting in a version number that is 2 ahead of the last release.</li> <li>#161 - Added previous_version prompt to prepare-release workflow.</li> <li>#164 - Added a release workflow job to sync release notes from <code>ltm</code> branches back to <code>develop</code> via an automated pull request.</li> <li>#166 - Changed the github token for the post-release PR creation in the release workflow.</li> <li>Rebaked from the cookie <code>nautobot-app-v3.1.3</code>.</li> </ul>"},{"location":"dev/arch_decision.html","title":"Architecture Decision Records","text":""},{"location":"dev/arch_decision.html#architecture-decision-records","title":"Architecture Decision Records","text":"<p>The intention is to document deviations from a standard Model View Controller (MVC) design.</p> <p>Developer Note - Remove Me!</p> <p>Optional page, remove if not applicable. For examples see Golden Config.</p>"},{"location":"dev/contributing.html","title":"Contributing to the App","text":""},{"location":"dev/contributing.html#contributing-to-the-app","title":"Contributing to the App","text":"<p>The project is packaged with a light development environment based on <code>docker-compose</code> to help with the local development of the project and to run tests.</p> <p>The project is following Network to Code software development guidelines and is leveraging the following:</p> <ul> <li>Python linting and formatting: <code>pylint</code> and <code>ruff</code>.</li> <li>YAML linting is done with <code>yamllint</code>.</li> <li>Django unit test to ensure the app is working properly.</li> <li>Django Template linting: <code>djlint</code></li> <li>Django Template formatting: <code>djhtml</code></li> </ul> <p>Documentation is built using mkdocs. The Docker based development environment automatically starts a container hosting a live version of the documentation website on http://localhost:8001 that auto-refreshes when you make any changes to your local files.</p>"},{"location":"dev/contributing.html#creating-changelog-fragments","title":"Creating Changelog Fragments","text":"<p>All pull requests to <code>next</code> or <code>develop</code> must include a changelog fragment file in the <code>./changes</code> directory. To create a fragment, use your GitHub issue number and fragment type as the filename. For example, <code>2362.added</code>. Valid fragment types are <code>added</code>, <code>changed</code>, <code>deprecated</code>, <code>fixed</code>, <code>removed</code>, <code>security</code>, <code>breaking</code>, <code>dependencies</code>, <code>documentation</code> and <code>housekeeping</code>. The change summary is added to the file in plain text. Change summaries should be complete sentences, starting with a capital letter and ending with a period, and be in past tense. Each line of the change fragment will generate a single change entry in the release notes. Use multiple lines in the same file if your change needs to generate multiple release notes in the same category. If the change needs to create multiple entries in separate categories, create multiple files.</p> <p>Example</p> <p>Wrong </p>changes/1234.fixed<pre><code>fix critical bug in documentation\n</code></pre><p></p> <p>Right </p>changes/1234.fixed<pre><code>Fixed critical bug in documentation.\n</code></pre><p></p> <p>Multiple Entry Example</p> <p>This will generate 2 entries in the <code>fixed</code> category and one entry in the <code>changed</code> category.</p> changes/1234.fixed<pre><code>Fixed critical bug in documentation.\nFixed release notes generation.\n</code></pre> changes/1234.changed<pre><code>Changed release notes generation.\n</code></pre>"},{"location":"dev/contributing.html#branching-policy","title":"Branching Policy","text":"<p>The branching policy includes the following tenets:</p> <ul> <li>The <code>develop</code> branch is the branch of the next major and minor paired version planned.</li> <li>PRs intended to add new features should be sourced from the <code>develop</code> branch.</li> <li>PRs intended to fix issues in the Nautobot LTM compatible release should be sourced from the latest <code>ltm-&lt;major.minor&gt;</code> branch instead of <code>develop</code>.</li> </ul> <p>Nautobot Dev Example App will observe semantic versioning, as of 1.0. This may result in a quick turnaround in minor versions to keep pace with an ever-growing feature set.</p>"},{"location":"dev/contributing.html#testing-standards","title":"Testing Standards","text":"<p>All contributions must include appropriate test coverage to ensure stability, prevent regressions, and maintain confidence in releases.</p> <p>Testing standards include the following expectations:</p> <ul> <li>All new features must include relevant unit tests.</li> <li>Bug fixes should include tests that validate the reported issue and prevent regressions.</li> <li>Tests should be written using Nautobot's base test cases and follow existing project patterns.</li> <li>Existing tests must not be broken by a pull request.</li> <li>Pull requests that reduce overall test coverage may be requested to add additional tests before approval.</li> <li>Tests are expected to pass locally and in CI before a pull request is merged.</li> </ul>"},{"location":"dev/contributing.html#backporting-to-older-releases","title":"Backporting to Older Releases","text":"<p>If you are backporting any fixes to a prior major or minor version of this app, please open an issue, comment on an existing issue, or post in the Network to Code Slack (channel <code>#nautobot</code>).</p> <p>We will create a <code>release-X.Y</code> branch for you to open your PR against and cut a new release once the PR is successfully merged.</p>"},{"location":"dev/contributing.html#release-policy","title":"Release Policy","text":"<p>Nautobot Dev Example App has currently no intended scheduled release schedule, and will release new features in minor versions.</p> <p>The steps taken by maintainers when creating a new release are documented in the release checklist.</p>"},{"location":"dev/dev_environment.html","title":"Development Environment","text":""},{"location":"dev/dev_environment.html#building-your-development-environment","title":"Building Your Development Environment","text":""},{"location":"dev/dev_environment.html#quickstart-guide","title":"Quickstart Guide","text":"<p>The development environment can be used in two ways:</p> <ol> <li>(Recommended) All services, including Nautobot, are spun up using Docker containers and a volume mount so you can develop locally.</li> <li>With a local Poetry environment if you wish to develop outside of Docker, with the caveat of using external services provided by Docker for the database (PostgreSQL by default, MySQL optionally) and Redis services.</li> </ol> <p>This is a quick reference guide if you're already familiar with the development environment provided, which you can read more about later in this document.</p>"},{"location":"dev/dev_environment.html#invoke","title":"Invoke","text":"<p>The Invoke library is used to provide some helper commands based on the environment. There are a few configuration parameters which can be passed to Invoke to override the default configuration:</p> <ul> <li><code>nautobot_ver</code>: the version of Nautobot to use as a base for any built docker containers (default: 3.0.0)</li> <li><code>project_name</code>: the default docker compose project name (default: <code>nautobot-dev-example</code>)</li> <li><code>python_ver</code>: the version of Python to use as a base for any built docker containers (default: 3.12)</li> <li><code>local</code>: a boolean flag indicating if invoke tasks should be run on the host or inside the docker containers (default: False, commands will be run in docker containers)</li> <li><code>compose_dir</code>: the full path to a directory containing the project compose files</li> <li><code>compose_files</code>: a list of compose files applied in order (see Multiple Compose files for more information)</li> </ul> <p>Using Invoke these configuration options can be overridden using several methods. Perhaps the simplest is setting an environment variable <code>INVOKE_NAUTOBOT_DEV_EXAMPLE_VARIABLE_NAME</code> where <code>VARIABLE_NAME</code> is the variable you are trying to override. The only exception is <code>compose_files</code>, because it is a list it must be overridden in a YAML file. There is an example <code>invoke.yml</code> (<code>invoke.example.yml</code>) in this directory which can be used as a starting point.</p>"},{"location":"dev/dev_environment.html#docker-development-environment","title":"Docker Development Environment","text":"<p>Tip</p> <p>This is the recommended option for development.</p> <p>This project is managed by Python Poetry and has a few requirements to setup your development environment:</p> <ol> <li>Install Poetry, see the Poetry documentation for your operating system.</li> <li>Install Docker, see the Docker documentation for your operating system.</li> <li>Install Docker-compose, see the Docker-compose documentation for your operation system.</li> </ol> <p>Once you have Poetry and Docker installed you can run the following commands (in the root of the repository) to install all other development dependencies in an isolated Python virtual environment:</p> <pre><code>poetry self add poetry-plugin-shell\npoetry shell\npoetry install\ninvoke build\ninvoke start\n</code></pre> <p>The Nautobot server can now be accessed at http://localhost:8080 and the live documentation at http://localhost:8001.</p> <p>To either stop or destroy the development environment use the following options.</p> <ul> <li>invoke stop - Stop the containers, but keep all underlying systems intact</li> <li>invoke destroy - Stop and remove all containers, volumes, etc. (This results in data loss due to the volume being deleted)</li> </ul>"},{"location":"dev/dev_environment.html#local-poetry-development-environment","title":"Local Poetry Development Environment","text":"<ul> <li>Create an <code>invoke.yml</code> file with the following contents at the root of the repo and edit as necessary</li> </ul> <pre><code>---\nnautobot_dev_example:\n local: true\n</code></pre> <p>Run the following commands:</p> <pre><code>poetry self add poetry-plugin-shell\npoetry shell\npoetry install --extras nautobot\nexport $(cat development/development.env | xargs)\nexport $(cat development/creds.env | xargs)\ninvoke start &amp;&amp; sleep 5\nnautobot-server migrate\n</code></pre> <p>Note</p> <p>If you want to develop on the latest develop branch of Nautobot, run the following command: <code>poetry add --optional git+https://github.com/nautobot/nautobot@develop</code>. After the <code>@</code> symbol must match either a branch or a tag.</p> <p>You can now run <code>nautobot-server</code> commands as you would from the Nautobot documentation for example to start the development server:</p> <pre><code>nautobot-server runserver 0.0.0.0:8080 --insecure\n</code></pre> <p>Nautobot server can now be accessed at http://localhost:8080.</p> <p>It is typically recommended to launch the Nautobot runserver command in a separate shell so you can keep developing and manage the webserver separately.</p>"},{"location":"dev/dev_environment.html#updating-the-documentation","title":"Updating the Documentation","text":"<p>Documentation dependencies are pinned to exact versions to ensure consistent results. For the development environment, they are defined in the <code>pyproject.toml</code> file.</p>"},{"location":"dev/dev_environment.html#cli-helper-commands","title":"CLI Helper Commands","text":"<p>The project features a CLI helper based on Invoke to help setup the development environment. The commands are listed below in 3 categories:</p> <ul> <li><code>dev environment</code></li> <li><code>utility</code></li> <li><code>testing</code></li> </ul> <p>Each command can be executed with <code>invoke &lt;command&gt;</code>. All commands support the arguments <code>--nautobot-ver</code> and <code>--python-ver</code> if you want to manually define the version of Python and Nautobot to use. Each command also has its own help <code>invoke &lt;command&gt; --help</code></p>"},{"location":"dev/dev_environment.html#local-development-environment","title":"Local Development Environment","text":"<pre><code> build Build all docker images.\n debug Start Nautobot and its dependencies in debug mode.\n destroy Destroy all containers and volumes.\n restart Restart Nautobot and its dependencies in detached mode.\n start Start Nautobot and its dependencies in detached mode.\n stop Stop Nautobot and its dependencies.\n</code></pre>"},{"location":"dev/dev_environment.html#utility","title":"Utility","text":"<pre><code> cli Launch a bash shell inside the running Nautobot container.\n create-user Create a new user in django (default: admin), will prompt for password.\n makemigrations Run Make Migration in Django.\n nbshell Launch a nbshell session.\n</code></pre>"},{"location":"dev/dev_environment.html#testing","title":"Testing","text":"<pre><code> ruff Run ruff to perform code formatting and/or linting.\n pylint Run pylint code analysis.\n markdownlint Run pymarkdown linting.\n tests Run all tests for this app.\n unittest Run Django unit tests for the app.\n djlint Run djlint to perform django template linting.\n djhtml Run djhtml to perform django template formatting.\n</code></pre>"},{"location":"dev/dev_environment.html#project-overview","title":"Project Overview","text":"<p>This project provides the ability to develop and manage the Nautobot server locally (with supporting services being Dockerized) or by using only Docker containers to manage Nautobot. The main difference between the two environments is the ability to debug and use pdb when developing locally. Debugging with pdb within the Docker container is more complicated, but can still be accomplished by either entering into the container (via <code>docker exec</code>) or attaching your IDE to the container and running the Nautobot service manually within the container.</p> <p>The upside to having the Nautobot service handled by Docker rather than locally is that you do not have to manage the Nautobot server. The Docker logs provide the majority of the information you will need to help troubleshoot, while getting started quickly and not requiring you to perform several manual steps and remembering to have the Nautobot server running in a separate terminal while you develop.</p> <p>Note</p> <p>The local environment still uses Docker containers for the supporting services (Postgres, Redis, and RQ Worker), but the Nautobot server is handled locally by you, the developer.</p> <p>Follow the directions below for the specific development environment that you choose.</p>"},{"location":"dev/dev_environment.html#poetry","title":"Poetry","text":"<p>Poetry is used in lieu of the \"virtualenv\" commands and is leveraged in both environments. The virtual environment will provide all of the Python packages required to manage the development environment such as Invoke. See the Local Development Environment section to see how to install Nautobot if you're going to be developing locally (i.e. not using the Docker container).</p> <p>The <code>pyproject.toml</code> file outlines all of the relevant dependencies for the project:</p> <ul> <li><code>tool.poetry.dependencies</code> - the main list of dependencies.</li> <li><code>tool.poetry.group.dev.dependencies</code> - development dependencies, to facilitate linting, testing, and documentation building.</li> </ul> <p>The <code>poetry shell</code> command is used to create and enable a virtual environment managed by Poetry, so all commands ran going forward are executed within the virtual environment. This is similar to running the <code>source venv/bin/activate</code> command with virtualenvs. To install project dependencies in the virtual environment, you should run <code>poetry install</code> - this will install both project and development dependencies.</p> <p>For more details about Poetry and its commands please check out its online documentation.</p> <p>In Poetry version 2, the shell command was moved out of the main Poetry project and into a plugin. For more details about the Poetry shell plugin, refer to its GitHub repository.</p>"},{"location":"dev/dev_environment.html#full-docker-development-environment","title":"Full Docker Development Environment","text":"<p>This project is set up with a number of Invoke tasks consumed as simple CLI commands to get developing fast. You'll use a few <code>invoke</code> commands to get your environment up and running.</p>"},{"location":"dev/dev_environment.html#copy-the-credentials-file-for-nautobot","title":"Copy the credentials file for Nautobot","text":"<p>First, you may create/overwrite the <code>development/creds.env</code> file - it stores a bunch of private information such as passwords and tokens for your local Nautobot install. You can make a copy of the <code>development/creds.example.env</code> and modify it to suit you.</p> <pre><code>cp development/creds.example.env development/creds.env\n</code></pre>"},{"location":"dev/dev_environment.html#invoke-building-the-docker-image","title":"Invoke - Building the Docker Image","text":"<p>The first thing you need to do is build the necessary Docker image for Nautobot that installs the specific <code>nautobot_ver</code>. The image is used for Nautobot and the Celery worker service used by Docker Compose.</p> <pre><code>\u279c invoke build\n... &lt;omitted for brevity&gt;\n#14 exporting to image\n#14 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00\n#14 exporting layers\n#14 exporting layers 1.2s done\n#14 writing image sha256:2d524bc1665327faa0d34001b0a9d2ccf450612bf8feeb969312e96a2d3e3503 done\n#14 naming to docker.io/nautobot-dev-example/nautobot:3.0.0-py3.12 done\n</code></pre>"},{"location":"dev/dev_environment.html#invoke-starting-the-development-environment","title":"Invoke - Starting the Development Environment","text":"<p>Next, you need to start up your Docker containers.</p> <pre><code>\u279c invoke start\nStarting Nautobot in detached mode...\nRunning docker-compose command \"up --detach\"\nCreating network \"nautobot_dev_example_default\" with the default driver\nCreating volume \"nautobot_dev_example_postgres_data\" with default driver\nCreating nautobot_dev_example_redis_1 ...\nCreating nautobot_dev_example_docs_1 ...\nCreating nautobot_dev_example_postgres_1 ...\nCreating nautobot_dev_example_postgres_1 ... done\nCreating nautobot_dev_example_redis_1 ... done\nCreating nautobot_dev_example_nautobot_1 ...\nCreating nautobot_dev_example_docs_1 ... done\nCreating nautobot_dev_example_nautobot_1 ... done\nCreating nautobot_dev_example_worker_1 ...\nCreating nautobot_dev_example_worker_1 ... done\nDocker Compose is now in the Docker CLI, try `docker compose up`\n</code></pre> <p>This will start all of the Docker containers used for hosting Nautobot. You should see the following containers running after <code>invoke start</code> is finished.</p> <pre><code>\u279c docker ps\n****CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\nee90fbfabd77 nautobot-dev-example/nautobot:3.0.0-py3.12 \"nautobot-server rqw\u2026\" 16 seconds ago Up 13 seconds nautobot_dev_example_worker_1\nb8adb781d013 nautobot-dev-example/nautobot:3.0.0-py3.12 \"/docker-entrypoint.\u2026\" 20 seconds ago Up 15 seconds 0.0.0.0:8080-&gt;8080/tcp, :::8080-&gt;8080/tcp nautobot_dev_example_nautobot_1\nd64ebd60675d nautobot-dev-example/nautobot:3.0.0-py3.12 \"mkdocs serve -v -a \u2026\" 25 seconds ago Up 18 seconds 0.0.0.0:8001-&gt;8080/tcp, :::8001-&gt;8080/tcp nautobot_dev_example_docs_1\ne72d63129b36 postgres:13-alpine \"docker-entrypoint.s\u2026\" 25 seconds ago Up 19 seconds 0.0.0.0:5432-&gt;5432/tcp, :::5432-&gt;5432/tcp nautobot_dev_example_postgres_1\n96c6ff66997c redis:6-alpine \"docker-entrypoint.s\u2026\" 25 seconds ago Up 21 seconds 0.0.0.0:6379-&gt;6379/tcp, :::6379-&gt;6379/tcp nautobot_dev_example_redis_1\n</code></pre> <p>Once the containers are fully up, you should be able to open up a web browser, and view:</p> <ul> <li>The Nautobot homepage at http://localhost:8080</li> <li>A live version of the documentation at http://localhost:8001</li> </ul> <p>Note</p> <p>Sometimes the containers take a minute to fully spin up. If the page doesn't load right away, wait a minute and try again.</p>"},{"location":"dev/dev_environment.html#invoke-creating-a-superuser","title":"Invoke - Creating a Superuser","text":"<p>The Nautobot development image will automatically provision a super user when specifying the following variables within <code>creds.env</code> which is the default when copying <code>creds.example.env</code> to <code>creds.env</code>.</p> <ul> <li><code>NAUTOBOT_CREATE_SUPERUSER=true</code></li> <li><code>NAUTOBOT_SUPERUSER_API_TOKEN=0123456789abcdef0123456789abcdef01234567</code></li> <li><code>NAUTOBOT_SUPERUSER_PASSWORD=admin</code></li> </ul> <p>Note</p> <p>The default username is admin, but can be overridden by specifying NAUTOBOT_SUPERUSER_USERNAME.</p> <p>If you need to create additional superusers, run the follow commands.</p> <pre><code>\u279c invoke createsuperuser\nRunning docker-compose command \"ps --services --filter status=running\"\nRunning docker-compose command \"exec nautobot nautobot-server createsuperuser --username admin\"\nError: That username is already taken.\nUsername: ntc\nEmail address: ntc@networktocode.com\nPassword:\nPassword (again):\nSuperuser created successfully.\n</code></pre>"},{"location":"dev/dev_environment.html#invoke-stopping-the-development-environment","title":"Invoke - Stopping the Development Environment","text":"<p>The last command to know for now is <code>invoke stop</code>.</p> <pre><code>\u279c invoke stop\nStopping Nautobot...\nRunning docker-compose command \"down\"\nStopping nautobot_dev_example_worker_1 ...\nStopping nautobot_dev_example_nautobot_1 ...\nStopping nautobot_dev_example_docs_1 ...\nStopping nautobot_dev_example_redis_1 ...\nStopping nautobot_dev_example_postgres_1 ...\nStopping nautobot_dev_example_worker_1 ... done\nStopping nautobot_dev_example_nautobot_1 ... done\nStopping nautobot_dev_example_postgres_1 ... done\nStopping nautobot_dev_example_redis_1 ... done\nStopping nautobot_dev_example_docs_1 ... done\nRemoving nautobot_dev_example_worker_1 ...\nRemoving nautobot_dev_example_nautobot_1 ...\nRemoving nautobot_dev_example_docs_1 ...\nRemoving nautobot_dev_example_redis_1 ...\nRemoving nautobot_dev_example_postgres_1 ...\nRemoving nautobot_dev_example_postgres_1 ... done\nRemoving nautobot_dev_example_docs_1 ... done\nRemoving nautobot_dev_example_worker_1 ... done\nRemoving nautobot_dev_example_redis_1 ... done\nRemoving nautobot_dev_example_nautobot_1 ... done\nRemoving network nautobot_dev_example_default\n</code></pre> <p>This will safely shut down all of your running Docker containers for this project. When you are ready to spin containers back up, it is as simple as running <code>invoke start</code> again as seen previously.</p> <p>Warning</p> <p>If you're wanting to reset the database and configuration settings, you can use the <code>invoke destroy</code> command, but you will lose any data stored in those containers, so make sure that is what you want to do.</p>"},{"location":"dev/dev_environment.html#real-time-updates-how-cool","title":"Real-Time Updates? How Cool!","text":"<p>Your environment should now be fully setup, all necessary Docker containers are created and running, and you're logged into Nautobot in your web browser. Now what?</p> <p>Now you can start developing your app in the project folder!</p> <p>The magic here is the root directory is mounted inside your Docker containers when built and ran, so any changes made to the files in here are directly updated to the Nautobot app code running in Docker. This means that as you modify the code in your app folder, the changes will be instantly updated in Nautobot.</p> <p>Warning</p> <p>There are a few exceptions to this, as outlined in the section To Rebuild or Not To Rebuild.</p> <p>The back-end Django process is setup to automatically reload itself (it only takes a couple of seconds) every time a file is updated (saved). So for example, if you were to update one of the files like <code>tables.py</code>, then save it, the changes will be visible right away in the web browser!</p> <p>Note</p> <p>You may get connection refused while Django reloads, but it should be refreshed fairly quickly.</p>"},{"location":"dev/dev_environment.html#docker-logs","title":"Docker Logs","text":"<p>When trying to debug an issue, one helpful thing you can look at are the logs within the Docker containers.</p> <pre><code>\u279c docker logs &lt;name of container&gt; -f\n</code></pre> <p>Note</p> <p>The <code>-f</code> tag will keep the logs open, and output them in realtime as they are generated.</p> <p>Info</p> <p>Want to limit the log output even further? Use the <code>--tail &lt;#&gt;</code> command line argument in conjunction with <code>-f</code>.</p> <p>So for example, our app is named <code>nautobot-dev-example</code>, the command would most likely be <code>docker logs nautobot_dev_example_nautobot_1 -f</code>. You can find the name of all running containers via <code>docker ps</code>.</p> <p>If you want to view the logs specific to the worker container, simply use the name of that container instead.</p>"},{"location":"dev/dev_environment.html#to-rebuild-or-not-to-rebuild","title":"To Rebuild or Not to Rebuild","text":"<p>Most of the time, you will not need to rebuild your images. Simply running <code>invoke start</code> and <code>invoke stop</code> is enough to keep your environment going.</p> <p>However there are a couple of instances when you will want to.</p>"},{"location":"dev/dev_environment.html#updating-environment-variables","title":"Updating Environment Variables","text":"<p>To add environment variables to your containers, thus allowing Nautobot to use them, you will update/add them in the <code>development/development.env</code> file. However, doing so is considered updating the underlying container shell, instead of Django (which auto restarts itself on changes).</p> <p>To get new environment variables to take effect, you will need stop any running images, rebuild the images, then restart them. This can easily be done with 3 commands:</p> <pre><code>\u279c invoke stop\n\u279c invoke build\n\u279c invoke start\n</code></pre> <p>Once completed, the new/updated environment variables should now be live.</p>"},{"location":"dev/dev_environment.html#installing-additional-python-packages","title":"Installing Additional Python Packages","text":"<p>If you want your app to leverage another available Nautobot app or another Python package, you can easily add them into your Docker environment.</p> <pre><code>\u279c poetry add &lt;package_name&gt;\n</code></pre> <p>Once the dependencies are resolved, stop the existing containers, rebuild the Docker image, and then start all containers again.</p> <pre><code>\u279c invoke stop\n\u279c invoke build\n\u279c invoke start\n</code></pre>"},{"location":"dev/dev_environment.html#installing-additional-nautobot-apps","title":"Installing Additional Nautobot Apps","text":"<p>Let's say for example you want the new app you're creating to integrate into Slack. To do this, you will want to integrate into the existing Nautobot ChatOps App.</p> <pre><code>\u279c poetry add nautobot-chatops\n</code></pre> <p>Once you activate the virtual environment via Poetry, you then tell Poetry to install the new app.</p> <p>Before you continue, you'll need to update the file <code>development/nautobot_config.py</code> accordingly with the name of the new app under <code>PLUGINS</code> and any relevant settings as necessary for the app under <code>PLUGINS_CONFIG</code>. Since you're modifying the underlying OS (not just Django files), you need to rebuild the image. This is a similar process to updating environment variables, which was explained earlier.</p> <pre><code>\u279c invoke stop\n\u279c invoke build\n\u279c invoke start\n</code></pre> <p>Once the containers are up and running, you should now see the new app installed in your Nautobot instance.</p> <p>Note</p> <p>You can even launch an <code>ngrok</code> service locally on your laptop, pointing to port 8080 (such as for chatops development), and it will point traffic directly to your Docker images.</p>"},{"location":"dev/dev_environment.html#updating-python-version","title":"Updating Python Version","text":"<p>To update the Python version, you can update it within <code>tasks.py</code>.</p> <pre><code>namespace = Collection(\"nautobot_dev_example\")\nnamespace.configure(\n {\n \"nautobot_dev_example\": {\n ...\n \"python_ver\": \"3.12\",\n ...\n }\n }\n)\n</code></pre> <p>Or set the <code>INVOKE_NAUTOBOT_DEV_EXAMPLE_PYTHON_VER</code> variable.</p>"},{"location":"dev/dev_environment.html#updating-nautobot-version","title":"Updating Nautobot Version","text":"<p>To update the Nautobot version, you can update it within <code>tasks.py</code>.</p> <pre><code>namespace = Collection(\"nautobot_dev_example\")\nnamespace.configure(\n {\n \"nautobot_dev_example\": {\n ...\n \"nautobot_ver\": \"3.0.0\",\n ...\n }\n }\n)\n</code></pre> <p>Or set the <code>INVOKE_NAUTOBOT_DEV_EXAMPLE_NAUTOBOT_VER</code> variable.</p>"},{"location":"dev/dev_environment.html#other-miscellaneous-commands-to-know","title":"Other Miscellaneous Commands To Know","text":""},{"location":"dev/dev_environment.html#python-shell","title":"Python Shell","text":"<p>To drop into a Django shell for Nautobot (in the Docker container) run:</p> <pre><code>\u279c invoke nbshell\n</code></pre> <p>This is the same as running:</p> <pre><code>\u279c invoke cli\n\u279c nautobot-server nbshell\n</code></pre>"},{"location":"dev/dev_environment.html#ipython-shell-plus","title":"iPython Shell Plus","text":"<p>Django also has a more advanced shell that uses iPython and that will automatically import all the models:</p> <pre><code>\u279c invoke shell-plus\n</code></pre> <p>This is the same as running:</p> <pre><code>\u279c invoke cli\n\u279c nautobot-server shell_plus\n</code></pre>"},{"location":"dev/dev_environment.html#tests","title":"Tests","text":"<p>To run tests against your code, you can run all of the tests that the CI runs against any new PR with:</p> <pre><code>\u279c invoke tests\n</code></pre> <p>To run an individual test, you can run any or all of the following:</p> <pre><code>\u279c invoke unittest\n\u279c invoke ruff\n\u279c invoke pylint\n</code></pre>"},{"location":"dev/dev_environment.html#app-configuration-schema","title":"App Configuration Schema","text":"<p>In the package source, there is the <code>nautobot_dev_example/app-config-schema.json</code> file, conforming to the JSON Schema format. This file is used to validate the configuration of the app in CI pipelines.</p> <p>If you make changes to <code>PLUGINS_CONFIG</code> or the configuration schema, you can run the following command to validate the schema:</p> <pre><code>invoke validate-app-config\n</code></pre> <p>To generate the <code>app-config-schema.json</code> file based on the current <code>PLUGINS_CONFIG</code> configuration, run the following command:</p> <pre><code>invoke generate-app-config-schema\n</code></pre> <p>This command can only guess the schema, so it's up to the developer to manually update the schema as needed.</p>"},{"location":"dev/extending.html","title":"Extending the App","text":""},{"location":"dev/extending.html#extending-the-app","title":"Extending the App","text":"<p>This app is designed to be an internal tool for testing and development purposes.</p>"},{"location":"dev/release_checklist.html","title":"Release Checklist","text":""},{"location":"dev/release_checklist.html#release-checklist","title":"Release Checklist","text":"<p>This document is intended for app maintainers and outlines the steps to perform when releasing a new version of the app.</p> <p>Important</p> <p>Before starting, make sure your local <code>develop</code>, <code>main</code>, and (if applicable) the current LTM branch are all up to date with upstream!</p> <pre><code>git fetch\ngit switch develop &amp;&amp; git pull # and repeat for main/ltm\n</code></pre> <p>Choose your own adventure:</p> <ul> <li>LTM release? Jump here.</li> <li>Patch release from <code>develop</code>? Jump here.</li> <li>Minor release? Continue with Minor Version Bumps and then All Releases from <code>develop</code>.</li> </ul>"},{"location":"dev/release_checklist.html#minor-version-bumps","title":"Minor Version Bumps","text":""},{"location":"dev/release_checklist.html#update-requirements","title":"Update Requirements","text":"<p>Every minor version release should refresh <code>poetry.lock</code>, so that it lists the most recent stable release of each package. To do this:</p> <ol> <li>Run <code>poetry update --dry-run</code> to have Poetry automatically tell you what package updates are available and the versions it would upgrade to. This requires an existing environment created from the lock file (i.e. via <code>poetry install</code>).</li> <li>Review each requirement's release notes for any breaking or otherwise noteworthy changes.</li> <li>Run <code>poetry update &lt;package&gt;</code> to update the package versions in <code>poetry.lock</code> as appropriate.</li> <li>If a required package requires updating to a new release not covered in the version constraints for a package as defined in <code>pyproject.toml</code>, (e.g. <code>Django ~3.1.7</code> would never install <code>Django &gt;=4.0.0</code>), update it manually in <code>pyproject.toml</code>.</li> <li>Run <code>poetry install</code> to install the refreshed versions of all required packages.</li> <li>Run all tests (<code>poetry run invoke tests</code>) and check that the UI and API function as expected.</li> </ol>"},{"location":"dev/release_checklist.html#update-documentation","title":"Update Documentation","text":"<p>If there are any changes to the compatibility matrix (such as a bump in the minimum supported Nautobot version), update it accordingly.</p> <p>Commit any resulting changes from the following sections to the documentation before proceeding with the release.</p> <p>Tip</p> <p>Fire up the documentation server in your development environment with <code>poetry run mkdocs serve</code>! This allows you to view the documentation site locally (the link is in the output of the command) and automatically rebuilds it as you make changes.</p>"},{"location":"dev/release_checklist.html#verify-the-installation-and-upgrade-steps","title":"Verify the Installation and Upgrade Steps","text":"<p>Follow the installation instructions to perform a new production installation of the app. If possible, also test the upgrade process from the previous released version.</p> <p>The goal of this step is to walk through the entire install process as documented to make sure nothing there needs to be changed or updated, to catch any errors or omissions in the documentation, and to ensure that it is current with each release.</p>"},{"location":"dev/release_checklist.html#all-releases-from-develop","title":"All Releases from <code>develop</code>","text":""},{"location":"dev/release_checklist.html#verify-ci-build-status","title":"Verify CI Build Status","text":"<p>Ensure that continuous integration testing on the <code>develop</code> branch is completing successfully.</p>"},{"location":"dev/release_checklist.html#run-the-prepare-release-github-workflow","title":"Run the Prepare Release Github Workflow","text":"<p>Run the Prepare Release GitHub workflow. Leave the \"Use workflow from\" option set to the default <code>develop</code> branch. Select the version bump type (prerelease, patch, minor, major) that matches the version bump you intend to make for this release. Then enter the branch name to create the release from (default is <code>main</code>). You can optionally provide the Date of the release (YYYY-MM-DD), if preparing the release ahead of time, otherwise it will default to the current date. Finally, click \"Run workflow\" button to execute the workflow.</p> <p>This workflow will automatically create a release branch from the appropriate branch (If releasing from <code>main</code>, it will use <code>develop</code> as the starting point), bump the version, and generate the release notes. It will also open a pull request for you to merge the release branch into the target branch with the generated release notes as the PR description.</p>"},{"location":"dev/release_checklist.html#review-and-merge-the-release-pr","title":"Review and Merge the Release PR","text":"<p>Review the release PR created by the workflow, make any necessary adjustments to the release notes, and merge it once CI has completed and the PR has been approved. If you're releasing a new major or minor version, this will create a new <code>docs/admin/release_notes/version_{major}.{minor}.md</code> file. Please fill in the <code>Release Overview</code> section in that file manually with a user-friendly summary of the most notable changes!</p>"},{"location":"dev/release_checklist.html#publish-the-release","title":"Publish the Release","text":"<p>A draft release will automatically be created in GitHub when the Prepare Release workflow is run. Verify the content of the release notes, the tag, and the target branch, then publish the release.</p>"},{"location":"dev/release_checklist.html#sync-the-release-back-to-develop","title":"Sync the Release Back to <code>develop</code>","text":"<p>After a release has been published from the <code>main</code> branch, a new PR will automatically be created to merge the changes from <code>main</code> back into <code>develop</code> with a version bump to the next development version (e.g. <code>1.4.3a1</code>). Review and merge this PR once CI has completed and the PR has been approved.</p>"},{"location":"dev/release_checklist.html#sync-the-release-to-next","title":"Sync the Release to <code>next</code>","text":"<p>Publishing a release from the <code>main</code> branch will also automatically create a PR to forward-port the released changes from <code>main</code> into <code>next</code>, so the <code>next</code> branch stays up to date.</p> <p>If no <code>next</code> branch exists, this step is skipped automatically.</p>"},{"location":"dev/release_checklist.html#legacy-documentation-for-releases","title":"Legacy Documentation for Releases","text":"<p>Please use the above process for all releases going forward, but if you need to refer to the old manual release process for any reason, here are the steps that were previously followed for releases.</p>"},{"location":"dev/release_checklist.html#bump-the-version","title":"Bump the Version","text":"<p>Update the package version using <code>poetry version</code> if necessary (poetry docs). This command shows the current version of the project or bumps the version of the project and writes the new version back to <code>pyproject.toml</code> if a valid bump rule is provided.</p> <p>The new version must be a valid semver string or a valid bump rule: <code>patch</code>, <code>minor</code>, <code>major</code>, <code>prepatch</code>, <code>preminor</code>, <code>premajor</code>, <code>prerelease</code>. Always try to use a bump rule when you can.</p> <p>Warning</p> <p>This guide uses <code>1.4.2</code> as the new version in its examples, so change it to match the version you bumped to in the previous step! Every. single. time. you. copy/paste commands!</p> <p>Display the current version with no arguments:</p> <pre><code>&gt; poetry version\nnautobot-dev-example 1.0.0-beta.2\n</code></pre> <p>Bump pre-release versions using <code>prerelease</code>:</p> <pre><code>&gt; poetry version prerelease\nBumping version from 1.0.0-beta.2 to 1.0.0-beta.3\n</code></pre> <p>For major versions, use <code>major</code>:</p> <pre><code>&gt; poetry version major\nBumping version from 1.0.0-beta.2 to 1.0.0\n</code></pre> <p>For minor versions, use <code>minor</code>:</p> <pre><code>&gt; poetry version minor\nBumping version from 1.0.0 to 1.1.0\n</code></pre> <p>And lastly, for patch versions, you guessed it, use <code>patch</code>:</p> <pre><code>&gt; poetry version patch\nBumping version from 1.1.0 to 1.1.1\n</code></pre>"},{"location":"dev/release_checklist.html#update-the-changelog","title":"Update the Changelog","text":"<p>Note</p> <ul> <li>This project uses <code>towncrier</code> to track human readable changes, so all merged PRs will have one or more entries in the release notes.</li> <li>The changelog must adhere to the Keep a Changelog style guide for any manual changes you may need to make.</li> <li>You will need to have the project's poetry environment built at this stage, as the towncrier command runs locally only. If you don't have it, run <code>poetry install</code> first.</li> <li>You can also set the version explicitly with <code>invoke generate-release-notes --version 1.4.2</code> if it needs to be different from what's in <code>pyproject.toml</code>.</li> </ul> <p>First, create a release branch off of <code>develop</code> (<code>git switch -c release-1.4.2 develop</code>) and automatically generate release notes with <code>invoke generate-release-notes</code>.</p> <p>If you're releasing a new major or minor version, this will create a new <code>docs/admin/release_notes/version_{major}.{minor}.md</code> file. Please fill in the <code>Release Overview</code> section in that file manually with a user-friendly summary of the most notable changes!</p> <p>Stage any remaining files (e.g. <code>git add mkdocs.yml pyproject.toml</code>) and check the diffs to verify all of the changes are correct (<code>git diff --cached</code>). For a new release of <code>1.4.2</code>, this will update the release notes in <code>docs/admin/release_notes/version_1.4.md</code>, stage that file in git, and <code>git rm</code> all the fragments that have now been incorporated into the release notes.</p> <p>Commit <code>git commit -m \"Release v1.4.2\"</code> and <code>git push</code> the staged changes.</p>"},{"location":"dev/release_checklist.html#submit-release-pull-request","title":"Submit Release Pull Request","text":"<p>Submit a pull request titled <code>Release v1.4.2</code> to merge your release branch into <code>main</code>. Copy the documented release notes into the pull request's body.</p> <p>Important</p> <p>Do not squash merge this branch into <code>main</code>. Make sure to select <code>Create a merge commit</code> when merging in GitHub.</p> <p>Once CI has completed on the PR, merge it.</p>"},{"location":"dev/release_checklist.html#create-a-new-release-in-github","title":"Create a New Release in GitHub","text":"<p>Draft a new release with the following parameters.</p> <ul> <li>Tag: Input current version (e.g. <code>v1.4.2</code>) and select <code>Create new tag: v1.4.2 on publish</code></li> <li>Target: <code>main</code></li> <li>Title: Version and date (e.g. <code>v1.4.2 - 2024-04-02</code>)</li> </ul> <p>Click \"Generate Release Notes\" and edit the auto-generated content as follows:</p> <ul> <li>Change the entries generated by GitHub to only the usernames of the contributors. e.g. <code>* Updated dockerfile by @nautobot_user in https://github.com/nautobot/nautobot-app-dev-example/pull/123</code> -&gt; <code>* @nautobot_user</code>.<ul> <li>This should give you the list for the new <code>Contributors</code> section.</li> <li>Make sure there are no duplicated entries.</li> </ul> </li> <li>Replace the content of the <code>What's Changed</code> section with the description of changes from the release PR (what towncrier generated).</li> <li>If it exists, leave the <code>New Contributors</code> list as it is.</li> </ul> <p>The release notes should look as follows:</p> <pre><code>## What's Changed\n\n**Towncrier generated Changed/Fixed/Housekeeping etc. sections here**\n\n## Contributors\n\n* @alice\n* @bob\n\n## New Contributors\n\n* @bob\n\n**Full Changelog**: https://github.com/nautobot/nautobot-app-dev-example/compare/v1.4.1...v1.4.2\n</code></pre> <p>Publish the release!</p>"},{"location":"dev/release_checklist.html#create-a-pr-from-main-back-to-develop","title":"Create a PR from <code>main</code> back to <code>develop</code>","text":"<p>First, sync your <code>main</code> branch with upstream changes: <code>git switch main &amp;&amp; git pull</code>.</p> <p>Create a new branch from <code>main</code> called <code>release-1.4.2-to-develop</code> and use <code>poetry version prerelease</code> to bump the development version to the next release.</p> <p>For example, if you just released <code>v1.4.2</code>:</p> <pre><code>&gt; git switch -c release-1.4.2-to-develop main\nSwitched to a new branch 'release-1.4.2-to-develop'\n\n&gt; poetry version prerelease\nBumping version from 1.4.2 to 1.4.3a1\n\n&gt; git add pyproject.toml &amp;&amp; git commit -m \"Bump version\"\n\n&gt; git push\n</code></pre> <p>Important</p> <p>Do not squash merge this branch into <code>develop</code>. Make sure to select <code>Create a merge commit</code> when merging in GitHub.</p> <p>Open a new PR from <code>release-1.4.2-to-develop</code> against <code>develop</code>, wait for CI to pass, and merge it.</p>"},{"location":"dev/release_checklist.html#final-checks","title":"Final checks","text":"<p>At this stage, the CI should be running or finished for the <code>v1.4.2</code> tag and a package successfully published to PyPI and added into the GitHub Release. Double check that's the case.</p> <p>Documentation should also have been built for the tag on ReadTheDocs and if you're reading this page online, refresh it and look for the new version in the little version fly-out menu down at the bottom right of the page.</p> <p>All done!</p>"},{"location":"dev/release_checklist.html#ltm-releases","title":"LTM Releases","text":"<p>For projects maintaining a Nautobot LTM compatible release, all development and release management is done through the <code>ltm-x.y</code> branch. The <code>x.y</code> relates to the LTM version of Nautobot it's compatible with, for example <code>2.4</code>.</p> <p>The process is similar to releasing from <code>develop</code>, but there is no need for post-release branch syncing because you'll release directly from the LTM branch.</p> <p>Once the release has been published, open a separate PR against <code>develop</code> to synchronize all LTM release notes into the latest version of the docs for visibility.</p>"},{"location":"dev/release_checklist.html#legacy-documentation-for-ltm-releases","title":"Legacy Documentation for LTM Releases","text":"<p>Please use the automated process for all LTM releases going forward, but if you need to refer to the old manual release process for any reason, here are the steps that were previously followed for LTM releases.</p> <ol> <li>Make sure your <code>ltm-2.4</code> branch is passing CI.</li> <li>Create a release branch from the <code>ltm-2.4</code> branch: <code>git switch -c release-2.4.99 ltm-2.4</code>.</li> <li>Bump up the patch version <code>poetry version patch</code>. If you're backporting a feature instead of bugfixes, bump the minor version instead with <code>poetry version minor</code>.</li> <li>Generate the release notes: <code>invoke generate-release-notes --version 2.4.99</code>.</li> <li>Move the release notes from the generated <code>docs/admin/release_notes/version_X.Y.md</code> to <code>docs/admin/release_notes/version_2.4.md</code>.</li> <li>Add all the changes and <code>git commit -m \"Release v2.4.99\"</code>, then <code>git push</code>.</li> <li>Open a new PR against <code>ltm-2.4</code>. Once CI is passing in the PR, <code>Create a merge commit</code> (don't squash!).</li> <li>Create a New Release in GitHub - use the same steps documented here except UNCHECK THE \"Set as the latest release\" CHECKBOX for LTM releases.</li> <li>Open a separate PR against <code>develop</code> to synchronize all LTM release notes into the latest version of the docs for visibility.</li> </ol> <p>You can use the following commands to help you pull in the release notes from the <code>ltm-2.4</code> branch to the <code>develop</code> branch:</p> <pre><code>&gt; git switch develop\n\n&gt; git pull\n\n&gt; git switch -c release-2.4.99-notes-to-develop develop\n\n&gt; git checkout ltm-2.4 docs/admin/release_notes/version_2.4.md\n\n&gt; git add docs/admin/release_notes/version_2.4.md &amp;&amp; git commit -m \"Update release notes from LTM 2.4 to develop\"\n\n&gt; git push\n</code></pre> <p>Open a new PR from <code>release-2.4.99-notes-to-develop</code> against <code>develop</code>, wait for CI to pass, and merge it.</p>"},{"location":"dev/code_reference/index.html","title":"Code Reference","text":""},{"location":"dev/code_reference/index.html#code-reference","title":"Code Reference","text":"<p>Auto-generated code reference documentation from docstrings.</p>"},{"location":"dev/code_reference/api.html","title":"API","text":""},{"location":"dev/code_reference/api.html#nautobot-dev-example-app-api-package","title":"Nautobot Dev Example App API Package","text":""},{"location":"dev/code_reference/api.html#nautobot_dev_example.api","title":"<code>nautobot_dev_example.api</code>","text":"<p>REST API module for nautobot_dev_example app.</p>"},{"location":"dev/code_reference/api.html#nautobot_dev_example.api.serializers","title":"<code>serializers</code>","text":"<p>API serializers for nautobot_dev_example.</p>"},{"location":"dev/code_reference/api.html#nautobot_dev_example.api.serializers.DevExampleSerializer","title":"<code>DevExampleSerializer</code>","text":"<p> Bases: <code>NautobotModelSerializer</code>, <code>TaggedModelSerializerMixin</code></p> <p>DevExample Serializer.</p> Source code in <code>nautobot_dev_example/api/serializers.py</code> <pre><code>class DevExampleSerializer(NautobotModelSerializer, TaggedModelSerializerMixin): # pylint: disable=too-many-ancestors\n \"\"\"DevExample Serializer.\"\"\"\n\n class Meta:\n \"\"\"Meta attributes.\"\"\"\n\n model = models.DevExample\n fields = \"__all__\"\n</code></pre>"},{"location":"dev/code_reference/api.html#nautobot_dev_example.api.serializers.DevExampleSerializer.Meta","title":"<code>Meta</code>","text":"<p>Meta attributes.</p> Source code in <code>nautobot_dev_example/api/serializers.py</code> <pre><code>class Meta:\n \"\"\"Meta attributes.\"\"\"\n\n model = models.DevExample\n fields = \"__all__\"\n</code></pre>"},{"location":"dev/code_reference/api.html#nautobot_dev_example.api.urls","title":"<code>urls</code>","text":"<p>Django API urlpatterns declaration for nautobot_dev_example app.</p>"},{"location":"dev/code_reference/api.html#nautobot_dev_example.api.views","title":"<code>views</code>","text":"<p>API views for nautobot_dev_example.</p>"},{"location":"dev/code_reference/api.html#nautobot_dev_example.api.views.DevExampleViewSet","title":"<code>DevExampleViewSet</code>","text":"<p> Bases: <code>NautobotModelViewSet</code></p> <p>DevExample viewset.</p> Source code in <code>nautobot_dev_example/api/views.py</code> <pre><code>class DevExampleViewSet(NautobotModelViewSet): # pylint: disable=too-many-ancestors\n \"\"\"DevExample viewset.\"\"\"\n\n queryset = models.DevExample.objects.all()\n serializer_class = serializers.DevExampleSerializer\n filterset_class = filters.DevExampleFilterSet\n</code></pre>"},{"location":"dev/code_reference/package.html","title":"Package","text":""},{"location":"dev/code_reference/package.html#nautobot_dev_example","title":"<code>nautobot_dev_example</code>","text":"<p>App declaration for nautobot_dev_example.</p>"},{"location":"dev/code_reference/package.html#nautobot_dev_example.NautobotDevExampleConfig","title":"<code>NautobotDevExampleConfig</code>","text":"<p> Bases: <code>NautobotAppConfig</code></p> <p>App configuration for the nautobot_dev_example app.</p> Source code in <code>nautobot_dev_example/__init__.py</code> <pre><code>class NautobotDevExampleConfig(NautobotAppConfig):\n \"\"\"App configuration for the nautobot_dev_example app.\"\"\"\n\n name = \"nautobot_dev_example\"\n verbose_name = \"Nautobot Dev Example App\"\n version = __version__\n author = \"Network to Code, LLC\"\n description = \"Nautobot App to demonstrate how to create a Nautobot App..\"\n base_url = \"dev-example\"\n required_settings = []\n default_settings = {}\n docs_view_name = \"plugins:nautobot_dev_example:docs\"\n searchable_models = [\"devexample\"]\n</code></pre>"},{"location":"models/devexample.html","title":"Dev Example","text":""},{"location":"models/devexample.html#dev-example","title":"Dev Example","text":"<ul> <li><code>name</code> (string): Unique identifier for the dev example.</li> <li><code>description</code>: (string): Description for the dev example.</li> </ul>"},{"location":"user/app_getting_started.html","title":"Getting Started","text":""},{"location":"user/app_getting_started.html#getting-started-with-the-app","title":"Getting Started with the App","text":"<p>This document provides a step-by-step tutorial on how to get the App going and how to use it.</p>"},{"location":"user/app_getting_started.html#install-the-app","title":"Install the App","text":"<p>To install the App, please follow the instructions detailed in the Installation Guide.</p>"},{"location":"user/app_getting_started.html#first-steps-with-the-app","title":"First steps with the App","text":""},{"location":"user/app_getting_started.html#what-are-the-next-steps","title":"What are the next steps?","text":"<p>You can check out the Use Cases section for more examples.</p>"},{"location":"user/app_overview.html","title":"App Overview","text":""},{"location":"user/app_overview.html#app-overview","title":"App Overview","text":"<p>This document provides an overview of the App including critical information and important considerations when applying it to your Nautobot environment.</p> <p>Note</p> <p>Throughout this documentation, the terms \"app\" and \"plugin\" will be used interchangeably.</p>"},{"location":"user/app_overview.html#description","title":"Description","text":""},{"location":"user/app_overview.html#audience-user-personas-who-should-use-this-app","title":"Audience (User Personas) - Who should use this App?","text":""},{"location":"user/app_overview.html#authors-and-maintainers","title":"Authors and Maintainers","text":""},{"location":"user/app_overview.html#nautobot-features-used","title":"Nautobot Features Used","text":""},{"location":"user/app_overview.html#extras","title":"Extras","text":""},{"location":"user/app_use_cases.html","title":"Using the App","text":""},{"location":"user/app_use_cases.html#using-the-app","title":"Using the App","text":"<p>This document describes common use-cases and scenarios for this App.</p>"},{"location":"user/app_use_cases.html#general-usage","title":"General Usage","text":""},{"location":"user/app_use_cases.html#use-cases-and-common-workflows","title":"Use-cases and common workflows","text":""},{"location":"user/app_use_cases.html#screenshots","title":"Screenshots","text":""},{"location":"user/external_interactions.html","title":"External Interactions","text":""},{"location":"user/external_interactions.html#external-interactions","title":"External Interactions","text":"<p>This document describes external dependencies and prerequisites for this App to operate, including system requirements, API endpoints, interconnection or integrations to other applications or services, and similar topics.</p>"},{"location":"user/external_interactions.html#external-system-integrations","title":"External System Integrations","text":""},{"location":"user/external_interactions.html#from-the-app-to-other-systems","title":"From the App to Other Systems","text":""},{"location":"user/external_interactions.html#from-other-systems-to-the-app","title":"From Other Systems to the App","text":""},{"location":"user/external_interactions.html#nautobot-rest-api-endpoints","title":"Nautobot REST API endpoints","text":""},{"location":"user/faq.html","title":"Frequently Asked Questions","text":""},{"location":"user/faq.html#frequently-asked-questions","title":"Frequently Asked Questions","text":""}]}
@@ -2,106 +2,106 @@
2
2
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
3
  <url>
4
4
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/index.html</loc>
5
- <lastmod>2026-05-15</lastmod>
5
+ <lastmod>2026-06-26</lastmod>
6
6
  </url>
7
7
  <url>
8
8
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/compatibility_matrix.html</loc>
9
- <lastmod>2026-05-15</lastmod>
9
+ <lastmod>2026-06-26</lastmod>
10
10
  </url>
11
11
  <url>
12
12
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/install.html</loc>
13
- <lastmod>2026-05-15</lastmod>
13
+ <lastmod>2026-06-26</lastmod>
14
14
  </url>
15
15
  <url>
16
16
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/uninstall.html</loc>
17
- <lastmod>2026-05-15</lastmod>
17
+ <lastmod>2026-06-26</lastmod>
18
18
  </url>
19
19
  <url>
20
20
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/upgrade.html</loc>
21
- <lastmod>2026-05-15</lastmod>
21
+ <lastmod>2026-06-26</lastmod>
22
22
  </url>
23
23
  <url>
24
24
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/index.html</loc>
25
- <lastmod>2026-05-15</lastmod>
25
+ <lastmod>2026-06-26</lastmod>
26
26
  </url>
27
27
  <url>
28
28
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/version_1.0.html</loc>
29
- <lastmod>2026-05-15</lastmod>
29
+ <lastmod>2026-06-26</lastmod>
30
30
  </url>
31
31
  <url>
32
32
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/version_2.0.html</loc>
33
- <lastmod>2026-05-15</lastmod>
33
+ <lastmod>2026-06-26</lastmod>
34
34
  </url>
35
35
  <url>
36
36
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/version_2.1.html</loc>
37
- <lastmod>2026-05-15</lastmod>
37
+ <lastmod>2026-06-26</lastmod>
38
38
  </url>
39
39
  <url>
40
40
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/version_2.2.html</loc>
41
- <lastmod>2026-05-15</lastmod>
41
+ <lastmod>2026-06-26</lastmod>
42
42
  </url>
43
43
  <url>
44
44
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/version_3.0.html</loc>
45
- <lastmod>2026-05-15</lastmod>
45
+ <lastmod>2026-06-26</lastmod>
46
46
  </url>
47
47
  <url>
48
48
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/admin/release_notes/version_3.1.html</loc>
49
- <lastmod>2026-05-15</lastmod>
49
+ <lastmod>2026-06-26</lastmod>
50
50
  </url>
51
51
  <url>
52
52
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/arch_decision.html</loc>
53
- <lastmod>2026-05-15</lastmod>
53
+ <lastmod>2026-06-26</lastmod>
54
54
  </url>
55
55
  <url>
56
56
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/contributing.html</loc>
57
- <lastmod>2026-05-15</lastmod>
57
+ <lastmod>2026-06-26</lastmod>
58
58
  </url>
59
59
  <url>
60
60
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/dev_environment.html</loc>
61
- <lastmod>2026-05-15</lastmod>
61
+ <lastmod>2026-06-26</lastmod>
62
62
  </url>
63
63
  <url>
64
64
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/extending.html</loc>
65
- <lastmod>2026-05-15</lastmod>
65
+ <lastmod>2026-06-26</lastmod>
66
66
  </url>
67
67
  <url>
68
68
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/release_checklist.html</loc>
69
- <lastmod>2026-05-15</lastmod>
69
+ <lastmod>2026-06-26</lastmod>
70
70
  </url>
71
71
  <url>
72
72
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/code_reference/index.html</loc>
73
- <lastmod>2026-05-15</lastmod>
73
+ <lastmod>2026-06-26</lastmod>
74
74
  </url>
75
75
  <url>
76
76
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/code_reference/api.html</loc>
77
- <lastmod>2026-05-15</lastmod>
77
+ <lastmod>2026-06-26</lastmod>
78
78
  </url>
79
79
  <url>
80
80
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/dev/code_reference/package.html</loc>
81
- <lastmod>2026-05-15</lastmod>
81
+ <lastmod>2026-06-26</lastmod>
82
82
  </url>
83
83
  <url>
84
84
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/models/devexample.html</loc>
85
- <lastmod>2026-05-15</lastmod>
85
+ <lastmod>2026-06-26</lastmod>
86
86
  </url>
87
87
  <url>
88
88
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/user/app_getting_started.html</loc>
89
- <lastmod>2026-05-15</lastmod>
89
+ <lastmod>2026-06-26</lastmod>
90
90
  </url>
91
91
  <url>
92
92
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/user/app_overview.html</loc>
93
- <lastmod>2026-05-15</lastmod>
93
+ <lastmod>2026-06-26</lastmod>
94
94
  </url>
95
95
  <url>
96
96
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/user/app_use_cases.html</loc>
97
- <lastmod>2026-05-15</lastmod>
97
+ <lastmod>2026-06-26</lastmod>
98
98
  </url>
99
99
  <url>
100
100
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/user/external_interactions.html</loc>
101
- <lastmod>2026-05-15</lastmod>
101
+ <lastmod>2026-06-26</lastmod>
102
102
  </url>
103
103
  <url>
104
104
  <loc>https://docs.nautobot.com/projects/dev-example/en/latest/user/faq.html</loc>
105
- <lastmod>2026-05-15</lastmod>
105
+ <lastmod>2026-06-26</lastmod>
106
106
  </url>
107
107
  </urlset>
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "nautobot-dev-example"
3
- version = "3.1.0"
3
+ version = "3.1.1"
4
4
  description = "Nautobot App to demonstrate how to create a Nautobot App."
5
5
  authors = ["Network to Code, LLC <opensource@networktocode.com>"]
6
6
  license = "Apache-2.0"