netbox-validity 3.4.3__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.3/netbox_validity.egg-info → netbox_validity-3.5.0}/PKG-INFO +4 -4
  2. {netbox_validity-3.4.3 → netbox_validity-3.5.0/netbox_validity.egg-info}/PKG-INFO +4 -4
  3. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/netbox_validity.egg-info/requires.txt +3 -3
  4. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/pyproject.toml +1 -1
  5. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/requirements/dev.txt +3 -3
  6. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/__init__.py +3 -3
  7. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/api/helpers.py +1 -2
  8. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/choices.py +3 -2
  9. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/netbox_changes/__init__.py +2 -2
  10. netbox_validity-3.5.0/validity/netbox_changes/current.py +8 -0
  11. netbox_validity-3.4.3/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.3 → netbox_validity-3.5.0}/validity/scripts/keeper.py +1 -2
  14. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/runtests/combine.py +7 -1
  15. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/utils/orm.py +9 -4
  16. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/script.py +2 -2
  17. netbox_validity-3.4.3/validity/netbox_changes/old.py +0 -23
  18. netbox_validity-3.4.3/validity/netbox_changes/oldest.py +0 -30
  19. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/LICENSE +0 -0
  20. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/MANIFEST.in +0 -0
  21. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/README.md +0 -0
  22. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/netbox_validity.egg-info/SOURCES.txt +0 -0
  23. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/netbox_validity.egg-info/dependency_links.txt +0 -0
  24. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/netbox_validity.egg-info/top_level.txt +0 -0
  25. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/requirements/base.txt +0 -0
  26. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/requirements/docs.txt +0 -0
  27. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/setup.cfg +0 -0
  28. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/admin.py +0 -0
  29. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/api/__init__.py +0 -0
  30. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/api/serializers.py +0 -0
  31. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/api/urls.py +0 -0
  32. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/api/views.py +0 -0
  33. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/dynamic_pairs.py +0 -0
  34. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/eval/__init__.py +0 -0
  35. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/eval/default_nameset.py +0 -0
  36. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/eval/eval.py +0 -0
  37. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/eval/eval_defaults.py +0 -0
  38. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/exceptions.py +0 -0
  39. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/__init__.py +0 -0
  40. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/backend.py +0 -0
  41. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/common.py +0 -0
  42. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/routeros.py +0 -0
  43. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/serializable.py +0 -0
  44. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/textfsm.py +0 -0
  45. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/ttp.py +0 -0
  46. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/xml.py +0 -0
  47. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/serialization/yaml.py +0 -0
  48. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/compliance/state.py +0 -0
  49. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/custom_validators.py +0 -0
  50. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/data_backends.py +0 -0
  51. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/data_backup/__init__.py +0 -0
  52. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/data_backup/backend.py +0 -0
  53. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/data_backup/backupers.py +0 -0
  54. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/data_backup/entities.py +0 -0
  55. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/data_backup/parameters.py +0 -0
  56. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/dependencies.py +0 -0
  57. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/fields/__init__.py +0 -0
  58. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/fields/encrypted.py +0 -0
  59. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/filtersets.py +0 -0
  60. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/__init__.py +0 -0
  61. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/bulk_import.py +0 -0
  62. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/fields.py +0 -0
  63. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/filterset.py +0 -0
  64. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/general.py +0 -0
  65. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/mixins.py +0 -0
  66. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/forms/widgets.py +0 -0
  67. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/graphql/__init__.py +0 -0
  68. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/graphql/filters.py +0 -0
  69. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/graphql/schema.py +0 -0
  70. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/graphql/types.py +0 -0
  71. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/integrations/data_models.py +0 -0
  72. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/integrations/errors.py +0 -0
  73. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/integrations/git.py +0 -0
  74. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/integrations/s3.py +0 -0
  75. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/j2_env.py +0 -0
  76. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/managers.py +0 -0
  77. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/migrations/0010_squashed_initial.py +0 -0
  78. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/migrations/0011_delete_scripts.py +0 -0
  79. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/migrations/0012_backuppoint_devicerole.py +0 -0
  80. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/migrations/0013_compliancetest_enabled.py +0 -0
  81. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/migrations/__init__.py +0 -0
  82. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/model_validators.py +0 -0
  83. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/__init__.py +0 -0
  84. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/backup.py +0 -0
  85. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/base.py +0 -0
  86. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/data.py +0 -0
  87. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/device.py +0 -0
  88. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/nameset.py +0 -0
  89. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/polling.py +0 -0
  90. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/report.py +0 -0
  91. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/selector.py +0 -0
  92. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/serializer.py +0 -0
  93. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/test.py +0 -0
  94. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/models/test_result.py +0 -0
  95. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/navigation.py +0 -0
  96. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/__init__.py +0 -0
  97. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/base.py +0 -0
  98. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/cli.py +0 -0
  99. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/default_credentials.py +0 -0
  100. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/exceptions.py +0 -0
  101. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/factory.py +0 -0
  102. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/http.py +0 -0
  103. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/netconf.py +0 -0
  104. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/pollers/result.py +0 -0
  105. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/__init__.py +0 -0
  106. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/backup.py +0 -0
  107. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/data_models.py +0 -0
  108. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/exceptions.py +0 -0
  109. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/launch.py +0 -0
  110. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/parent_jobs.py +0 -0
  111. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/runtests/__init__.py +0 -0
  112. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/runtests/apply.py +0 -0
  113. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/scripts/runtests/split.py +0 -0
  114. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/search.py +0 -0
  115. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/settings.py +0 -0
  116. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/signals.py +0 -0
  117. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/static/validity/connection-type-select.js +0 -0
  118. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/static/validity/prism-dark.css +0 -0
  119. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/static/validity/prism-light.css +0 -0
  120. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/static/validity/prism.js +0 -0
  121. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/subforms.py +0 -0
  122. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/tables.py +0 -0
  123. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/template_content.py +0 -0
  124. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/aux_tab_table.html +0 -0
  125. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/backuppoint.html +0 -0
  126. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/command.html +0 -0
  127. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/compliance_results.html +0 -0
  128. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/compliancereport.html +0 -0
  129. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/complianceselector.html +0 -0
  130. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/compliancetest.html +0 -0
  131. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/compliancetestresult.html +0 -0
  132. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/device_state.html +0 -0
  133. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/configcontext_format.html +0 -0
  134. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/datasource_link.html +0 -0
  135. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/parameters.html +0 -0
  136. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/path_with_link.html +0 -0
  137. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/prism.html +0 -0
  138. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/related_objects.html +0 -0
  139. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/report_stats_row.html +0 -0
  140. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/search_form.html +0 -0
  141. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/inc/yaml_card.html +0 -0
  142. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/nameset.html +0 -0
  143. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/poller.html +0 -0
  144. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/poller_edit.html +0 -0
  145. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/report_devices.html +0 -0
  146. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/scripts/result.html +0 -0
  147. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/scripts/result_htmx.html +0 -0
  148. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/scripts/run.html +0 -0
  149. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templates/validity/serializer.html +0 -0
  150. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templatetags/__init__.py +0 -0
  151. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templatetags/dto.py +0 -0
  152. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/templatetags/validity.py +0 -0
  153. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/urls.py +0 -0
  154. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/utils/bulk.py +0 -0
  155. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/utils/json.py +0 -0
  156. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/utils/logger.py +0 -0
  157. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/utils/misc.py +0 -0
  158. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/utils/version.py +0 -0
  159. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/__init__.py +0 -0
  160. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/backup.py +0 -0
  161. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/base.py +0 -0
  162. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/bulk_import.py +0 -0
  163. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/command.py +0 -0
  164. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/data_source.py +0 -0
  165. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/device.py +0 -0
  166. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/nameset.py +0 -0
  167. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/poller.py +0 -0
  168. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/report.py +0 -0
  169. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/selector.py +0 -0
  170. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/serializer.py +0 -0
  171. {netbox_validity-3.4.3 → netbox_validity-3.5.0}/validity/views/test.py +0 -0
  172. {netbox_validity-3.4.3 → 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.3
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.3
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.3"
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.3"
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'
@@ -16,9 +16,9 @@ def get_base_table_kwargs(self):
16
16
 
17
17
  StrFilterLookup = locate("strawberry_django.StrFilterLookup") if config.netbox_version >= "4.5.5" else FilterLookup[str]
18
18
 
19
- if config.netbox_version >= "4.5.0":
19
+ if config.netbox_version >= "4.6.0":
20
20
  from .current import *
21
- elif config.netbox_version >= "4.4.0":
21
+ elif config.netbox_version >= "4.5.0":
22
22
  from .old import *
23
23
  else:
24
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
@@ -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_base_table_kwargs, 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,7 +51,7 @@ 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)]
54
+ logs = [entry | {"index": i} for i, entry in enumerate(job.log_entries, start=1)]
55
55
  table = self.table_class(logs, **self.get_table_kwargs())
56
56
  table.configure(request)
57
57
  return table
@@ -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