netbox-validity 3.4.2__tar.gz → 3.5.0__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 (172) hide show
  1. {netbox_validity-3.4.2/netbox_validity.egg-info → netbox_validity-3.5.0}/PKG-INFO +4 -4
  2. {netbox_validity-3.4.2 → netbox_validity-3.5.0/netbox_validity.egg-info}/PKG-INFO +4 -4
  3. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/netbox_validity.egg-info/requires.txt +3 -3
  4. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/pyproject.toml +1 -1
  5. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/requirements/dev.txt +3 -3
  6. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/__init__.py +3 -3
  7. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/api/helpers.py +1 -2
  8. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/choices.py +3 -2
  9. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/netbox_changes/__init__.py +6 -2
  10. netbox_validity-3.5.0/validity/netbox_changes/current.py +8 -0
  11. netbox_validity-3.4.2/validity/netbox_changes/current.py → netbox_validity-3.5.0/validity/netbox_changes/old.py +1 -1
  12. netbox_validity-3.5.0/validity/netbox_changes/oldest.py +7 -0
  13. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/keeper.py +1 -2
  14. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/runtests/combine.py +7 -1
  15. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/utils/orm.py +9 -4
  16. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/base.py +2 -3
  17. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/report.py +2 -3
  18. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/script.py +5 -3
  19. netbox_validity-3.4.2/validity/netbox_changes/old.py +0 -23
  20. netbox_validity-3.4.2/validity/netbox_changes/oldest.py +0 -30
  21. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/LICENSE +0 -0
  22. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/MANIFEST.in +0 -0
  23. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/README.md +0 -0
  24. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/netbox_validity.egg-info/SOURCES.txt +0 -0
  25. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/netbox_validity.egg-info/dependency_links.txt +0 -0
  26. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/netbox_validity.egg-info/top_level.txt +0 -0
  27. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/requirements/base.txt +0 -0
  28. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/requirements/docs.txt +0 -0
  29. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/setup.cfg +0 -0
  30. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/admin.py +0 -0
  31. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/api/__init__.py +0 -0
  32. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/api/serializers.py +0 -0
  33. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/api/urls.py +0 -0
  34. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/api/views.py +0 -0
  35. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/dynamic_pairs.py +0 -0
  36. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/eval/__init__.py +0 -0
  37. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/eval/default_nameset.py +0 -0
  38. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/eval/eval.py +0 -0
  39. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/eval/eval_defaults.py +0 -0
  40. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/exceptions.py +0 -0
  41. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/__init__.py +0 -0
  42. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/backend.py +0 -0
  43. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/common.py +0 -0
  44. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/routeros.py +0 -0
  45. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/serializable.py +0 -0
  46. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/textfsm.py +0 -0
  47. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/ttp.py +0 -0
  48. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/xml.py +0 -0
  49. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/serialization/yaml.py +0 -0
  50. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/compliance/state.py +0 -0
  51. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/custom_validators.py +0 -0
  52. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/data_backends.py +0 -0
  53. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/data_backup/__init__.py +0 -0
  54. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/data_backup/backend.py +0 -0
  55. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/data_backup/backupers.py +0 -0
  56. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/data_backup/entities.py +0 -0
  57. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/data_backup/parameters.py +0 -0
  58. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/dependencies.py +0 -0
  59. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/fields/__init__.py +0 -0
  60. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/fields/encrypted.py +0 -0
  61. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/filtersets.py +0 -0
  62. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/__init__.py +0 -0
  63. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/bulk_import.py +0 -0
  64. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/fields.py +0 -0
  65. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/filterset.py +0 -0
  66. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/general.py +0 -0
  67. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/mixins.py +0 -0
  68. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/forms/widgets.py +0 -0
  69. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/graphql/__init__.py +0 -0
  70. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/graphql/filters.py +0 -0
  71. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/graphql/schema.py +0 -0
  72. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/graphql/types.py +0 -0
  73. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/integrations/data_models.py +0 -0
  74. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/integrations/errors.py +0 -0
  75. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/integrations/git.py +0 -0
  76. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/integrations/s3.py +0 -0
  77. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/j2_env.py +0 -0
  78. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/managers.py +0 -0
  79. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/migrations/0010_squashed_initial.py +0 -0
  80. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/migrations/0011_delete_scripts.py +0 -0
  81. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/migrations/0012_backuppoint_devicerole.py +0 -0
  82. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/migrations/0013_compliancetest_enabled.py +0 -0
  83. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/migrations/__init__.py +0 -0
  84. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/model_validators.py +0 -0
  85. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/__init__.py +0 -0
  86. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/backup.py +0 -0
  87. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/base.py +0 -0
  88. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/data.py +0 -0
  89. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/device.py +0 -0
  90. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/nameset.py +0 -0
  91. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/polling.py +0 -0
  92. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/report.py +0 -0
  93. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/selector.py +0 -0
  94. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/serializer.py +0 -0
  95. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/test.py +0 -0
  96. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/models/test_result.py +0 -0
  97. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/navigation.py +0 -0
  98. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/__init__.py +0 -0
  99. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/base.py +0 -0
  100. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/cli.py +0 -0
  101. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/default_credentials.py +0 -0
  102. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/exceptions.py +0 -0
  103. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/factory.py +0 -0
  104. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/http.py +0 -0
  105. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/netconf.py +0 -0
  106. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/pollers/result.py +0 -0
  107. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/__init__.py +0 -0
  108. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/backup.py +0 -0
  109. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/data_models.py +0 -0
  110. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/exceptions.py +0 -0
  111. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/launch.py +0 -0
  112. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/parent_jobs.py +0 -0
  113. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/runtests/__init__.py +0 -0
  114. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/runtests/apply.py +0 -0
  115. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/scripts/runtests/split.py +0 -0
  116. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/search.py +0 -0
  117. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/settings.py +0 -0
  118. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/signals.py +0 -0
  119. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/static/validity/connection-type-select.js +0 -0
  120. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/static/validity/prism-dark.css +0 -0
  121. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/static/validity/prism-light.css +0 -0
  122. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/static/validity/prism.js +0 -0
  123. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/subforms.py +0 -0
  124. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/tables.py +0 -0
  125. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/template_content.py +0 -0
  126. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/aux_tab_table.html +0 -0
  127. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/backuppoint.html +0 -0
  128. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/command.html +0 -0
  129. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/compliance_results.html +0 -0
  130. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/compliancereport.html +0 -0
  131. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/complianceselector.html +0 -0
  132. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/compliancetest.html +0 -0
  133. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/compliancetestresult.html +0 -0
  134. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/device_state.html +0 -0
  135. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/configcontext_format.html +0 -0
  136. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/datasource_link.html +0 -0
  137. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/parameters.html +0 -0
  138. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/path_with_link.html +0 -0
  139. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/prism.html +0 -0
  140. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/related_objects.html +0 -0
  141. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/report_stats_row.html +0 -0
  142. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/search_form.html +0 -0
  143. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/inc/yaml_card.html +0 -0
  144. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/nameset.html +0 -0
  145. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/poller.html +0 -0
  146. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/poller_edit.html +0 -0
  147. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/report_devices.html +0 -0
  148. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/scripts/result.html +0 -0
  149. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/scripts/result_htmx.html +0 -0
  150. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/scripts/run.html +0 -0
  151. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templates/validity/serializer.html +0 -0
  152. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templatetags/__init__.py +0 -0
  153. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templatetags/dto.py +0 -0
  154. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/templatetags/validity.py +0 -0
  155. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/urls.py +0 -0
  156. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/utils/bulk.py +0 -0
  157. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/utils/json.py +0 -0
  158. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/utils/logger.py +0 -0
  159. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/utils/misc.py +0 -0
  160. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/utils/version.py +0 -0
  161. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/__init__.py +0 -0
  162. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/backup.py +0 -0
  163. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/bulk_import.py +0 -0
  164. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/command.py +0 -0
  165. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/data_source.py +0 -0
  166. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/device.py +0 -0
  167. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/nameset.py +0 -0
  168. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/poller.py +0 -0
  169. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/selector.py +0 -0
  170. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/serializer.py +0 -0
  171. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/test.py +0 -0
  172. {netbox_validity-3.4.2 → netbox_validity-3.5.0}/validity/views/test_result.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: netbox-validity
3
- Version: 3.4.2
3
+ Version: 3.5.0
4
4
  Summary: NetBox plugin for network devices validation
5
5
  Author-email: Anton Miasnikov <anton2008m@gmail.com>
6
6
  License: MIT License
@@ -59,9 +59,9 @@ Requires-Dist: debugpy==1.8.19; extra == "dev"
59
59
  Requires-Dist: factory_boy==3.3.3; extra == "dev"
60
60
  Requires-Dist: ipython; extra == "dev"
61
61
  Requires-Dist: pre-commit==4.5.1; extra == "dev"
62
- Requires-Dist: pytest==9.0.2; extra == "dev"
63
- Requires-Dist: pytest-cov==7.0.0; extra == "dev"
64
- Requires-Dist: pytest-django==4.11.1; extra == "dev"
62
+ Requires-Dist: pytest==9.0.3; extra == "dev"
63
+ Requires-Dist: pytest-cov==7.1.0; extra == "dev"
64
+ Requires-Dist: pytest-django==4.12.0; extra == "dev"
65
65
  Requires-Dist: pytest-subtests==0.15.0; extra == "dev"
66
66
  Requires-Dist: ruff==0.14.11; extra == "dev"
67
67
  Requires-Dist: tomli==2.4.0; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: netbox-validity
3
- Version: 3.4.2
3
+ Version: 3.5.0
4
4
  Summary: NetBox plugin for network devices validation
5
5
  Author-email: Anton Miasnikov <anton2008m@gmail.com>
6
6
  License: MIT License
@@ -59,9 +59,9 @@ Requires-Dist: debugpy==1.8.19; extra == "dev"
59
59
  Requires-Dist: factory_boy==3.3.3; extra == "dev"
60
60
  Requires-Dist: ipython; extra == "dev"
61
61
  Requires-Dist: pre-commit==4.5.1; extra == "dev"
62
- Requires-Dist: pytest==9.0.2; extra == "dev"
63
- Requires-Dist: pytest-cov==7.0.0; extra == "dev"
64
- Requires-Dist: pytest-django==4.11.1; extra == "dev"
62
+ Requires-Dist: pytest==9.0.3; extra == "dev"
63
+ Requires-Dist: pytest-cov==7.1.0; extra == "dev"
64
+ Requires-Dist: pytest-django==4.12.0; extra == "dev"
65
65
  Requires-Dist: pytest-subtests==0.15.0; extra == "dev"
66
66
  Requires-Dist: ruff==0.14.11; extra == "dev"
67
67
  Requires-Dist: tomli==2.4.0; extra == "dev"
@@ -17,9 +17,9 @@ debugpy==1.8.19
17
17
  factory_boy==3.3.3
18
18
  ipython
19
19
  pre-commit==4.5.1
20
- pytest==9.0.2
21
- pytest-cov==7.0.0
22
- pytest-django==4.11.1
20
+ pytest==9.0.3
21
+ pytest-cov==7.1.0
22
+ pytest-django==4.12.0
23
23
  pytest-subtests==0.15.0
24
24
  ruff==0.14.11
25
25
  tomli==2.4.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "netbox-validity"
7
- version = "3.4.2"
7
+ version = "3.5.0"
8
8
  description = "NetBox plugin for network devices validation"
9
9
  authors = [
10
10
  {name = "Anton Miasnikov", email = "anton2008m@gmail.com"},
@@ -2,9 +2,9 @@ debugpy==1.8.19
2
2
  factory_boy==3.3.3
3
3
  ipython
4
4
  pre-commit==4.5.1
5
- pytest==9.0.2
6
- pytest-cov==7.0.0
7
- pytest-django==4.11.1
5
+ pytest==9.0.3
6
+ pytest-cov==7.1.0
7
+ pytest-django==4.12.0
8
8
  pytest-subtests==0.15.0
9
9
  ruff==0.14.11
10
10
  tomli==2.4.0
@@ -16,11 +16,11 @@ class NetBoxValidityConfig(PluginConfig):
16
16
  description = "Write and run auto tests for network devices"
17
17
  author = "Anton Miasnikov"
18
18
  author_email = "anton2008m@gmail.com"
19
- version = "3.4.2"
19
+ version = "3.5.0"
20
20
  base_url = "validity"
21
21
  django_apps = ["django_bootstrap5"]
22
- min_version = "4.3.0"
23
- max_version = "4.5.99"
22
+ min_version = "4.4.0"
23
+ max_version = "4.6.99"
24
24
  graphql_schema = "graphql.schema"
25
25
 
26
26
  # custom field
@@ -1,5 +1,4 @@
1
1
  from django.core.exceptions import ValidationError
2
- from django.db.models import ManyToManyField
3
2
  from rest_framework.permissions import BasePermission
4
3
  from rest_framework.relations import PrimaryKeyRelatedField
5
4
  from rest_framework.serializers import HyperlinkedIdentityField, JSONField, ModelSerializer
@@ -82,7 +81,7 @@ class SubformValidationMixin:
82
81
  def _validate(self, attrs):
83
82
  instance = self.instance or self.Meta.model()
84
83
  for field, field_value in attrs.items():
85
- if not isinstance(instance._meta.get_field(field), ManyToManyField):
84
+ if not instance._meta.get_field(field).many_to_many:
86
85
  setattr(instance, field, field_value)
87
86
  if not instance.subform_type:
88
87
  return
@@ -1,11 +1,12 @@
1
1
  from typing import Optional, TypeVar
2
2
 
3
3
  from django.db.models import IntegerChoices, TextChoices
4
- from django.db.models.enums import ChoicesMeta
5
4
  from django.utils.translation import gettext_lazy as _
6
5
 
6
+ from validity.netbox_changes import ChoicesType
7
7
 
8
- class ColoredChoiceMeta(ChoicesMeta):
8
+
9
+ class ColoredChoiceMeta(ChoicesType):
9
10
  """
10
11
  Allows to write choice fields with a color like that:
11
12
  option1 = 'red'
@@ -10,11 +10,15 @@ from strawberry_django import FilterLookup
10
10
  from validity import config
11
11
 
12
12
 
13
+ def get_base_table_kwargs(self):
14
+ return {"user": self.request.user} if config.netbox_version < "4.5.4" else {}
15
+
16
+
13
17
  StrFilterLookup = locate("strawberry_django.StrFilterLookup") if config.netbox_version >= "4.5.5" else FilterLookup[str]
14
18
 
15
- if config.netbox_version >= "4.5.0":
19
+ if config.netbox_version >= "4.6.0":
16
20
  from .current import *
17
- elif config.netbox_version >= "4.4.0":
21
+ elif config.netbox_version >= "4.5.0":
18
22
  from .old import *
19
23
  else:
20
24
  from .oldest import *
@@ -0,0 +1,8 @@
1
+ # NetBox 4.6
2
+
3
+ from pydoc import locate
4
+
5
+ from .old import *
6
+
7
+
8
+ ChoicesType = locate("django.db.models.enums.ChoicesType")
@@ -1,7 +1,7 @@
1
1
  # NetBox 4.5
2
2
  from pydoc import locate
3
3
 
4
- from .old import *
4
+ from .oldest import *
5
5
 
6
6
 
7
7
  BaseModelFilter = locate("netbox.graphql.filters.BaseModelFilter")
@@ -0,0 +1,7 @@
1
+ # NetBox 4.4
2
+ from pydoc import locate
3
+
4
+
5
+ BaseModelFilter = locate("netbox.graphql.filter_mixins.BaseFilterMixin")
6
+ NetBoxModelFilter = locate("netbox.graphql.filter_mixins.NetBoxModelFilterMixin")
7
+ ChoicesType = locate("django.db.models.enums.ChoicesMeta")
@@ -5,7 +5,6 @@ from core.choices import JobStatusChoices
5
5
  from core.models import Job
6
6
 
7
7
  from validity import di
8
- from validity.netbox_changes import set_logs
9
8
  from validity.utils.logger import Logger
10
9
  from .exceptions import AbortScript
11
10
 
@@ -48,7 +47,7 @@ class JobKeeper:
48
47
  self, status: str = JobStatusChoices.STATUS_COMPLETED, error: str | None = None, output=None
49
48
  ) -> None:
50
49
  self.job.data = self.job.data or {}
51
- set_logs(self.job, [log.serialized for log in self.logger.messages])
50
+ self.job.log_entries = [log.serialized for log in self.logger.messages]
52
51
  output = output or self.job.data.get("output")
53
52
  self.job.data["output"] = output
54
53
  self.job.terminate(status, error)
@@ -10,10 +10,10 @@ from core.models import Job
10
10
  from dimi import Singleton
11
11
  from django.db.models import QuerySet
12
12
  from django.urls import reverse
13
+ from extras.events import enqueue_event, flush_events
13
14
 
14
15
  from validity import di
15
16
  from validity.models import ComplianceReport, ComplianceTestResult
16
- from validity.netbox_changes import enqueue
17
17
  from validity.utils.logger import Logger, Message
18
18
  from ..data_models import FullRunTestsParams, RequestInfo, TestResultRatio
19
19
  from ..exceptions import AbortScript
@@ -22,6 +22,12 @@ from ..launch import Launcher
22
22
  from ..parent_jobs import JobExtractor
23
23
 
24
24
 
25
+ def enqueue(report: "ComplianceReport", request: "RequestInfo"):
26
+ queue = {}
27
+ enqueue_event(queue, report, request, "object_created")
28
+ flush_events(queue.values())
29
+
30
+
25
31
  @di.dependency(scope=Singleton)
26
32
  @dataclass(repr=False, kw_only=True)
27
33
  class CombineWorker:
@@ -206,10 +206,15 @@ class CustomFieldBuilder:
206
206
  content_type_model: type
207
207
  db_alias: str = ""
208
208
 
209
- def create(self, *, bind_to, object_type=None, **cf_params):
209
+ def create(self, *, bind_to, name, object_type=None, **cf_params):
210
210
  db = self.db_alias or self.cf_model.objects.db
211
- if object_type is not None:
212
- cf_params["related_object_type"] = object_type
213
- custom_field = self.cf_model.objects.using(db).create(**cf_params)
211
+ cf_params["related_object_type"] = object_type
212
+
213
+ # get_or_create handles #182 - compatibility with netbox-branching weird behaviour
214
+ custom_field, created = self.cf_model.objects.using(db).get_or_create(name=name, defaults=cf_params)
215
+ if not created:
216
+ for field, value in cf_params.items():
217
+ setattr(custom_field, field, value)
218
+ custom_field.save(force_update=True, update_fields=cf_params.keys())
214
219
  custom_field.object_types.set(self.content_type_model.objects.get_for_model(model).pk for model in bind_to)
215
220
  return custom_field
@@ -13,7 +13,7 @@ from django_tables2 import SingleTableMixin, Table
13
13
  from utilities.views import ObjectPermissionRequiredMixin as _ObjectPermissionRequiredMixin
14
14
  from utilities.views import ViewTab
15
15
 
16
- from validity import filtersets, forms, models, scripts, tables
16
+ from validity import filtersets, forms, models, netbox_changes, scripts, tables
17
17
  from validity.utils.misc import partialcls
18
18
 
19
19
 
@@ -100,8 +100,7 @@ class TestResultBaseView(ObjectPermissionRequiredMixin, SingleTableMixin, Filter
100
100
  table.exclude = (self.result_relation,)
101
101
  return table
102
102
 
103
- def get_table_kwargs(self):
104
- return {"user": self.request.user}
103
+ get_table_kwargs = netbox_changes.get_base_table_kwargs
105
104
 
106
105
  def get_queryset(self):
107
106
  return self.queryset.filter(**{self.result_relation: self.kwargs["pk"]})
@@ -8,7 +8,7 @@ from django_tables2 import SingleTableMixin
8
8
  from netbox.views import generic
9
9
  from utilities.views import ViewTab, register_model_view
10
10
 
11
- from validity import config, filtersets, forms, models, tables
11
+ from validity import filtersets, forms, models, netbox_changes, tables
12
12
  from validity.choices import DeviceGroupByChoices, SeverityChoices
13
13
  from .base import FilterViewWithForm, ObjectPermissionRequiredMixin, TestResultBaseView
14
14
 
@@ -102,8 +102,7 @@ class ReportDeviceView(ObjectPermissionRequiredMixin, SingleTableMixin, FilterVi
102
102
  table.configure(self.request)
103
103
  return table
104
104
 
105
- def get_table_kwargs(self):
106
- return {"user": self.request.user} if config.netbox_version < "4.5.4" else {}
105
+ get_table_kwargs = netbox_changes.get_base_table_kwargs
107
106
 
108
107
  def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
109
108
  return super().get_context_data(**kwargs) | {
@@ -12,7 +12,7 @@ from utilities.htmx import htmx_partial
12
12
 
13
13
  from validity import di
14
14
  from validity.forms import RunTestsForm
15
- from validity.netbox_changes import get_logs
15
+ from validity.netbox_changes import get_base_table_kwargs
16
16
  from validity.scripts import Launcher, RunTestsParams, ScriptParams
17
17
  from validity.tables import ScriptResultTable
18
18
  from .base import LauncherMixin
@@ -51,11 +51,13 @@ class ScriptResultView(PermissionRequiredMixin, TableMixin, ObjectView):
51
51
  permission_required = "core.view_job"
52
52
 
53
53
  def get_table(self, job, request, bulk_actions=False):
54
- logs = [entry | {"index": i} for i, entry in enumerate(get_logs(job), start=1)]
55
- table = self.table_class(logs, user=request.user)
54
+ logs = [entry | {"index": i} for i, entry in enumerate(job.log_entries, start=1)]
55
+ table = self.table_class(logs, **self.get_table_kwargs())
56
56
  table.configure(request)
57
57
  return table
58
58
 
59
+ get_table_kwargs = get_base_table_kwargs
60
+
59
61
  def get(self, request, **kwargs):
60
62
  job = self.get_object(**kwargs)
61
63
  table = self.get_table(job, request) if job.completed else None
@@ -1,23 +0,0 @@
1
- # NetBox 4.4
2
- from typing import TYPE_CHECKING
3
-
4
- from .oldest import *
5
-
6
-
7
- if TYPE_CHECKING:
8
- from validity.models import ComplianceReport
9
- from validity.scripts.data_models import RequestInfo
10
-
11
-
12
- def get_logs(job):
13
- return job.log_entries
14
-
15
-
16
- def set_logs(job, logs):
17
- job.log_entries = logs
18
-
19
-
20
- def enqueue(report: "ComplianceReport", request: "RequestInfo"):
21
- queue = {}
22
- enqueue_event(queue, report, request, "object_created")
23
- flush_events(queue.values())
@@ -1,30 +0,0 @@
1
- # NetBox 4.3
2
- from pydoc import locate
3
- from typing import TYPE_CHECKING
4
-
5
- from extras.events import enqueue_event, flush_events
6
-
7
-
8
- if TYPE_CHECKING:
9
- from validity.models import ComplianceReport
10
- from validity.scripts.data_models import RequestInfo
11
-
12
-
13
- BaseModelFilter = locate("netbox.graphql.filter_mixins.BaseFilterMixin")
14
- NetBoxModelFilter = locate("netbox.graphql.filter_mixins.NetBoxModelFilterMixin")
15
-
16
-
17
- def get_logs(job):
18
- return job.data["log"]
19
-
20
-
21
- def set_logs(job, logs):
22
- if not isinstance(job.data, dict):
23
- job.data = {}
24
- job.data["log"] = logs
25
-
26
-
27
- def enqueue(report: "ComplianceReport", request: "RequestInfo"):
28
- queue = {}
29
- enqueue_event(queue, report, request.get_user(), request.id, "object_created")
30
- flush_events(queue.values())
File without changes