patchman 4.0.10__tar.gz → 4.0.12__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 (352) hide show
  1. {patchman-4.0.10 → patchman-4.0.12}/PKG-INFO +1 -1
  2. patchman-4.0.12/VERSION.txt +1 -0
  3. {patchman-4.0.10 → patchman-4.0.12}/errata/models.py +0 -1
  4. {patchman-4.0.10 → patchman-4.0.12}/errata/tests/test_models.py +19 -0
  5. {patchman-4.0.10 → patchman-4.0.12}/etc/patchman/apache.conf.example +1 -0
  6. {patchman-4.0.10 → patchman-4.0.12}/hosts/tests/test_models.py +63 -0
  7. {patchman-4.0.10 → patchman-4.0.12}/hosts/utils.py +6 -1
  8. {patchman-4.0.10 → patchman-4.0.12}/patchman.egg-info/PKG-INFO +1 -1
  9. {patchman-4.0.10 → patchman-4.0.12}/patchman.egg-info/SOURCES.txt +1 -1
  10. {patchman-4.0.10 → patchman-4.0.12}/reports/utils.py +2 -1
  11. patchman-4.0.10/VERSION.txt +0 -1
  12. {patchman-4.0.10 → patchman-4.0.12}/AUTHORS +0 -0
  13. {patchman-4.0.10 → patchman-4.0.12}/COPYING +0 -0
  14. {patchman-4.0.10 → patchman-4.0.12}/INSTALL.md +0 -0
  15. {patchman-4.0.10 → patchman-4.0.12}/MANIFEST.in +0 -0
  16. {patchman-4.0.10 → patchman-4.0.12}/README.md +0 -0
  17. {patchman-4.0.10 → patchman-4.0.12}/arch/__init__.py +0 -0
  18. {patchman-4.0.10 → patchman-4.0.12}/arch/admin.py +0 -0
  19. {patchman-4.0.10 → patchman-4.0.12}/arch/apps.py +0 -0
  20. {patchman-4.0.10 → patchman-4.0.12}/arch/migrations/0001_initial.py +0 -0
  21. {patchman-4.0.10 → patchman-4.0.12}/arch/migrations/0002_alter_machinearchitecture_options_and_more.py +0 -0
  22. {patchman-4.0.10 → patchman-4.0.12}/arch/migrations/__init__.py +0 -0
  23. {patchman-4.0.10 → patchman-4.0.12}/arch/models.py +0 -0
  24. {patchman-4.0.10 → patchman-4.0.12}/arch/serializers.py +0 -0
  25. {patchman-4.0.10 → patchman-4.0.12}/arch/tests/__init__.py +0 -0
  26. {patchman-4.0.10 → patchman-4.0.12}/arch/tests/test_api.py +0 -0
  27. {patchman-4.0.10 → patchman-4.0.12}/arch/tests/test_models.py +0 -0
  28. {patchman-4.0.10 → patchman-4.0.12}/arch/utils.py +0 -0
  29. {patchman-4.0.10 → patchman-4.0.12}/arch/views.py +0 -0
  30. {patchman-4.0.10 → patchman-4.0.12}/domains/__init__.py +0 -0
  31. {patchman-4.0.10 → patchman-4.0.12}/domains/admin.py +0 -0
  32. {patchman-4.0.10 → patchman-4.0.12}/domains/apps.py +0 -0
  33. {patchman-4.0.10 → patchman-4.0.12}/domains/migrations/0001_initial.py +0 -0
  34. {patchman-4.0.10 → patchman-4.0.12}/domains/migrations/0002_alter_domain_options.py +0 -0
  35. {patchman-4.0.10 → patchman-4.0.12}/domains/migrations/__init__.py +0 -0
  36. {patchman-4.0.10 → patchman-4.0.12}/domains/models.py +0 -0
  37. {patchman-4.0.10 → patchman-4.0.12}/domains/serializers.py +0 -0
  38. {patchman-4.0.10 → patchman-4.0.12}/domains/tests/__init__.py +0 -0
  39. {patchman-4.0.10 → patchman-4.0.12}/domains/tests/test_api.py +0 -0
  40. {patchman-4.0.10 → patchman-4.0.12}/domains/tests/test_models.py +0 -0
  41. {patchman-4.0.10 → patchman-4.0.12}/domains/views.py +0 -0
  42. {patchman-4.0.10 → patchman-4.0.12}/errata/__init__.py +0 -0
  43. {patchman-4.0.10 → patchman-4.0.12}/errata/admin.py +0 -0
  44. {patchman-4.0.10 → patchman-4.0.12}/errata/apps.py +0 -0
  45. {patchman-4.0.10 → patchman-4.0.12}/errata/managers.py +0 -0
  46. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0001_initial.py +0 -0
  47. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0002_alter_erratumreference_unique_together.py +0 -0
  48. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0003_delete_erratumreference_alter_erratum_references.py +0 -0
  49. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0004_rename_packages_erratum_fixed_packages.py +0 -0
  50. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0005_erratum_affected_packages_and_more.py +0 -0
  51. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0006_alter_erratum_options.py +0 -0
  52. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0007_alter_erratum_fixed_packages.py +0 -0
  53. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0008_add_cached_count_fields.py +0 -0
  54. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/0009_backfill_cached_counts.py +0 -0
  55. {patchman-4.0.10 → patchman-4.0.12}/errata/migrations/__init__.py +0 -0
  56. {patchman-4.0.10 → patchman-4.0.12}/errata/serializers.py +0 -0
  57. {patchman-4.0.10 → patchman-4.0.12}/errata/signals.py +0 -0
  58. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/__init__.py +0 -0
  59. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/__init__.py +0 -0
  60. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/alma.py +0 -0
  61. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/arch.py +0 -0
  62. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/centos.py +0 -0
  63. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/debian.py +0 -0
  64. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/rocky.py +0 -0
  65. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/distros/ubuntu.py +0 -0
  66. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/repos/__init__.py +0 -0
  67. {patchman-4.0.10 → patchman-4.0.12}/errata/sources/repos/yum.py +0 -0
  68. {patchman-4.0.10 → patchman-4.0.12}/errata/tables.py +0 -0
  69. {patchman-4.0.10 → patchman-4.0.12}/errata/tasks.py +0 -0
  70. {patchman-4.0.10 → patchman-4.0.12}/errata/templates/errata/erratum_detail.html +0 -0
  71. {patchman-4.0.10 → patchman-4.0.12}/errata/templates/errata/erratum_list.html +0 -0
  72. {patchman-4.0.10 → patchman-4.0.12}/errata/tests/__init__.py +0 -0
  73. {patchman-4.0.10 → patchman-4.0.12}/errata/tests/test_api.py +0 -0
  74. {patchman-4.0.10 → patchman-4.0.12}/errata/tests/test_integration.py +0 -0
  75. {patchman-4.0.10 → patchman-4.0.12}/errata/urls.py +0 -0
  76. {patchman-4.0.10 → patchman-4.0.12}/errata/utils.py +0 -0
  77. {patchman-4.0.10 → patchman-4.0.12}/errata/views.py +0 -0
  78. {patchman-4.0.10 → patchman-4.0.12}/etc/patchman/celery.conf +0 -0
  79. {patchman-4.0.10 → patchman-4.0.12}/etc/patchman/local_settings.py +0 -0
  80. {patchman-4.0.10 → patchman-4.0.12}/etc/systemd/system/patchman-celery-beat.service +0 -0
  81. /patchman-4.0.10/etc/systemd/system/patchman-celery-worker.service → /patchman-4.0.12/etc/systemd/system/patchman-celery-worker@.service +0 -0
  82. {patchman-4.0.10 → patchman-4.0.12}/hosts/__init__.py +0 -0
  83. {patchman-4.0.10 → patchman-4.0.12}/hosts/admin.py +0 -0
  84. {patchman-4.0.10 → patchman-4.0.12}/hosts/apps.py +0 -0
  85. {patchman-4.0.10 → patchman-4.0.12}/hosts/forms.py +0 -0
  86. {patchman-4.0.10 → patchman-4.0.12}/hosts/managers.py +0 -0
  87. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0001_initial.py +0 -0
  88. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0002_initial.py +0 -0
  89. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0003_host_modules.py +0 -0
  90. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0004_remove_host_tags_host_tags.py +0 -0
  91. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0005_rename_os_host_osvariant.py +0 -0
  92. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0006_migrate_to_tz_aware.py +0 -0
  93. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0007_alter_host_tags.py +0 -0
  94. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0008_alter_host_options.py +0 -0
  95. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0009_host_errata.py +0 -0
  96. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0010_alter_hostrepo_options.py +0 -0
  97. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0011_host_bug_updates_count_host_errata_count_and_more.py +0 -0
  98. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/0012_backfill_cached_counts.py +0 -0
  99. {patchman-4.0.10 → patchman-4.0.12}/hosts/migrations/__init__.py +0 -0
  100. {patchman-4.0.10 → patchman-4.0.12}/hosts/models.py +0 -0
  101. {patchman-4.0.10 → patchman-4.0.12}/hosts/serializers.py +0 -0
  102. {patchman-4.0.10 → patchman-4.0.12}/hosts/signals.py +0 -0
  103. {patchman-4.0.10 → patchman-4.0.12}/hosts/tables.py +0 -0
  104. {patchman-4.0.10 → patchman-4.0.12}/hosts/tasks.py +0 -0
  105. {patchman-4.0.10 → patchman-4.0.12}/hosts/templates/hosts/host_delete.html +0 -0
  106. {patchman-4.0.10 → patchman-4.0.12}/hosts/templates/hosts/host_detail.html +0 -0
  107. {patchman-4.0.10 → patchman-4.0.12}/hosts/templates/hosts/host_edit.html +0 -0
  108. {patchman-4.0.10 → patchman-4.0.12}/hosts/templates/hosts/host_list.html +0 -0
  109. {patchman-4.0.10 → patchman-4.0.12}/hosts/templatetags/__init__.py +0 -0
  110. {patchman-4.0.10 → patchman-4.0.12}/hosts/templatetags/report_alert.py +0 -0
  111. {patchman-4.0.10 → patchman-4.0.12}/hosts/tests/__init__.py +0 -0
  112. {patchman-4.0.10 → patchman-4.0.12}/hosts/tests/test_api.py +0 -0
  113. {patchman-4.0.10 → patchman-4.0.12}/hosts/tests/test_find_updates.py +0 -0
  114. {patchman-4.0.10 → patchman-4.0.12}/hosts/tests/test_managers.py +0 -0
  115. {patchman-4.0.10 → patchman-4.0.12}/hosts/urls.py +0 -0
  116. {patchman-4.0.10 → patchman-4.0.12}/hosts/views.py +0 -0
  117. {patchman-4.0.10 → patchman-4.0.12}/modules/__init__.py +0 -0
  118. {patchman-4.0.10 → patchman-4.0.12}/modules/admin.py +0 -0
  119. {patchman-4.0.10 → patchman-4.0.12}/modules/apps.py +0 -0
  120. {patchman-4.0.10 → patchman-4.0.12}/modules/managers.py +0 -0
  121. {patchman-4.0.10 → patchman-4.0.12}/modules/migrations/0001_initial.py +0 -0
  122. {patchman-4.0.10 → patchman-4.0.12}/modules/migrations/0002_auto_20240204_2214.py +0 -0
  123. {patchman-4.0.10 → patchman-4.0.12}/modules/migrations/0003_alter_module_options.py +0 -0
  124. {patchman-4.0.10 → patchman-4.0.12}/modules/migrations/0004_alter_module_options.py +0 -0
  125. {patchman-4.0.10 → patchman-4.0.12}/modules/migrations/0005_alter_module_unique_together.py +0 -0
  126. {patchman-4.0.10 → patchman-4.0.12}/modules/migrations/__init__.py +0 -0
  127. {patchman-4.0.10 → patchman-4.0.12}/modules/models.py +0 -0
  128. {patchman-4.0.10 → patchman-4.0.12}/modules/serializers.py +0 -0
  129. {patchman-4.0.10 → patchman-4.0.12}/modules/tables.py +0 -0
  130. {patchman-4.0.10 → patchman-4.0.12}/modules/templates/modules/module_detail.html +0 -0
  131. {patchman-4.0.10 → patchman-4.0.12}/modules/templates/modules/module_list.html +0 -0
  132. {patchman-4.0.10 → patchman-4.0.12}/modules/urls.py +0 -0
  133. {patchman-4.0.10 → patchman-4.0.12}/modules/utils.py +0 -0
  134. {patchman-4.0.10 → patchman-4.0.12}/modules/views.py +0 -0
  135. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/__init__.py +0 -0
  136. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/admin.py +0 -0
  137. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/apps.py +0 -0
  138. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/fixtures/os.json +0 -0
  139. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/fixtures/osgroup.json +0 -0
  140. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/forms.py +0 -0
  141. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/managers.py +0 -0
  142. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0001_initial.py +0 -0
  143. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0002_initial.py +0 -0
  144. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0003_os_arch.py +0 -0
  145. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0003_osgroup_codename.py +0 -0
  146. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0004_alter_osgroup_unique_together.py +0 -0
  147. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0005_rename_osgroup_osrelease_rename_os_osvariant_and_more.py +0 -0
  148. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0006_osrelease_cpe_name_osvariant_codename.py +0 -0
  149. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0007_alter_osrelease_unique_together.py +0 -0
  150. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0008_alter_osrelease_options_alter_osvariant_options.py +0 -0
  151. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0009_osvariant_hosts_count.py +0 -0
  152. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/0010_backfill_osvariant_counts.py +0 -0
  153. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/migrations/__init__.py +0 -0
  154. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/models.py +0 -0
  155. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/serializers.py +0 -0
  156. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/signals.py +0 -0
  157. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/tables.py +0 -0
  158. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/os_landing.html +0 -0
  159. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osrelease_delete.html +0 -0
  160. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osrelease_detail.html +0 -0
  161. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osrelease_list.html +0 -0
  162. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osvariant_delete.html +0 -0
  163. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osvariant_delete_multiple.html +0 -0
  164. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osvariant_detail.html +0 -0
  165. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/templates/operatingsystems/osvariant_list.html +0 -0
  166. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/tests/__init__.py +0 -0
  167. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/tests/test_api.py +0 -0
  168. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/tests/test_models.py +0 -0
  169. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/urls.py +0 -0
  170. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/utils.py +0 -0
  171. {patchman-4.0.10 → patchman-4.0.12}/operatingsystems/views.py +0 -0
  172. {patchman-4.0.10 → patchman-4.0.12}/packages/__init__.py +0 -0
  173. {patchman-4.0.10 → patchman-4.0.12}/packages/admin.py +0 -0
  174. {patchman-4.0.10 → patchman-4.0.12}/packages/apps.py +0 -0
  175. {patchman-4.0.10 → patchman-4.0.12}/packages/managers.py +0 -0
  176. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0001_initial.py +0 -0
  177. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0002_auto_20250207_1319.py +0 -0
  178. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0002_delete_erratum_delete_erratumreference.py +0 -0
  179. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0003_auto_20250207_1746.py +0 -0
  180. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0004_alter_package_options_alter_packagecategory_options_and_more.py +0 -0
  181. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0005_alter_package_packagetype.py +0 -0
  182. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/0006_alter_packageupdate_options.py +0 -0
  183. {patchman-4.0.10 → patchman-4.0.12}/packages/migrations/__init__.py +0 -0
  184. {patchman-4.0.10 → patchman-4.0.12}/packages/models.py +0 -0
  185. {patchman-4.0.10 → patchman-4.0.12}/packages/serializers.py +0 -0
  186. {patchman-4.0.10 → patchman-4.0.12}/packages/tables.py +0 -0
  187. {patchman-4.0.10 → patchman-4.0.12}/packages/templates/packages/package_detail.html +0 -0
  188. {patchman-4.0.10 → patchman-4.0.12}/packages/templates/packages/package_list.html +0 -0
  189. {patchman-4.0.10 → patchman-4.0.12}/packages/templates/packages/package_name_detail.html +0 -0
  190. {patchman-4.0.10 → patchman-4.0.12}/packages/templates/packages/package_name_list.html +0 -0
  191. {patchman-4.0.10 → patchman-4.0.12}/packages/tests/__init__.py +0 -0
  192. {patchman-4.0.10 → patchman-4.0.12}/packages/tests/test_api.py +0 -0
  193. {patchman-4.0.10 → patchman-4.0.12}/packages/tests/test_models.py +0 -0
  194. {patchman-4.0.10 → patchman-4.0.12}/packages/tests/test_version_compare.py +0 -0
  195. {patchman-4.0.10 → patchman-4.0.12}/packages/urls.py +0 -0
  196. {patchman-4.0.10 → patchman-4.0.12}/packages/utils.py +0 -0
  197. {patchman-4.0.10 → patchman-4.0.12}/packages/views.py +0 -0
  198. {patchman-4.0.10 → patchman-4.0.12}/patchman/__init__.py +0 -0
  199. {patchman-4.0.10 → patchman-4.0.12}/patchman/celery.py +0 -0
  200. {patchman-4.0.10 → patchman-4.0.12}/patchman/receivers.py +0 -0
  201. {patchman-4.0.10 → patchman-4.0.12}/patchman/settings.py +0 -0
  202. {patchman-4.0.10 → patchman-4.0.12}/patchman/signals.py +0 -0
  203. {patchman-4.0.10 → patchman-4.0.12}/patchman/sqlite3/base.py +0 -0
  204. {patchman-4.0.10 → patchman-4.0.12}/patchman/static/css/base.css +0 -0
  205. {patchman-4.0.10 → patchman-4.0.12}/patchman/static/js/expandable-text.js +0 -0
  206. {patchman-4.0.10 → patchman-4.0.12}/patchman/static/js/sidebar.js +0 -0
  207. {patchman-4.0.10 → patchman-4.0.12}/patchman/urls.py +0 -0
  208. {patchman-4.0.10 → patchman-4.0.12}/patchman/wsgi.py +0 -0
  209. {patchman-4.0.10 → patchman-4.0.12}/patchman.egg-info/dependency_links.txt +0 -0
  210. {patchman-4.0.10 → patchman-4.0.12}/patchman.egg-info/requires.txt +0 -0
  211. {patchman-4.0.10 → patchman-4.0.12}/patchman.egg-info/top_level.txt +0 -0
  212. {patchman-4.0.10 → patchman-4.0.12}/reports/__init__.py +0 -0
  213. {patchman-4.0.10 → patchman-4.0.12}/reports/admin.py +0 -0
  214. {patchman-4.0.10 → patchman-4.0.12}/reports/apps.py +0 -0
  215. {patchman-4.0.10 → patchman-4.0.12}/reports/migrations/0001_initial.py +0 -0
  216. {patchman-4.0.10 → patchman-4.0.12}/reports/migrations/0002_report_modules.py +0 -0
  217. {patchman-4.0.10 → patchman-4.0.12}/reports/migrations/0003_remove_report_accessed.py +0 -0
  218. {patchman-4.0.10 → patchman-4.0.12}/reports/migrations/0004_migrate_to_tz_aware.py +0 -0
  219. {patchman-4.0.10 → patchman-4.0.12}/reports/migrations/0005_alter_report_options.py +0 -0
  220. {patchman-4.0.10 → patchman-4.0.12}/reports/migrations/__init__.py +0 -0
  221. {patchman-4.0.10 → patchman-4.0.12}/reports/models.py +0 -0
  222. {patchman-4.0.10 → patchman-4.0.12}/reports/serializers.py +0 -0
  223. {patchman-4.0.10 → patchman-4.0.12}/reports/tables.py +0 -0
  224. {patchman-4.0.10 → patchman-4.0.12}/reports/tasks.py +0 -0
  225. {patchman-4.0.10 → patchman-4.0.12}/reports/templates/reports/report.txt +0 -0
  226. {patchman-4.0.10 → patchman-4.0.12}/reports/templates/reports/report_delete.html +0 -0
  227. {patchman-4.0.10 → patchman-4.0.12}/reports/templates/reports/report_detail.html +0 -0
  228. {patchman-4.0.10 → patchman-4.0.12}/reports/templates/reports/report_list.html +0 -0
  229. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/__init__.py +0 -0
  230. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_api.py +0 -0
  231. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_edge_cases.py +0 -0
  232. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_integration.py +0 -0
  233. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_models.py +0 -0
  234. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_parsing.py +0 -0
  235. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_serializers.py +0 -0
  236. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_tasks.py +0 -0
  237. {patchman-4.0.10 → patchman-4.0.12}/reports/tests/test_utils.py +0 -0
  238. {patchman-4.0.10 → patchman-4.0.12}/reports/urls.py +0 -0
  239. {patchman-4.0.10 → patchman-4.0.12}/reports/views.py +0 -0
  240. {patchman-4.0.10 → patchman-4.0.12}/repos/__init__.py +0 -0
  241. {patchman-4.0.10 → patchman-4.0.12}/repos/admin.py +0 -0
  242. {patchman-4.0.10 → patchman-4.0.12}/repos/apps.py +0 -0
  243. {patchman-4.0.10 → patchman-4.0.12}/repos/forms.py +0 -0
  244. {patchman-4.0.10 → patchman-4.0.12}/repos/managers.py +0 -0
  245. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0001_initial.py +0 -0
  246. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0002_alter_repository_repotype.py +0 -0
  247. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0003_migrate_to_tz_aware.py +0 -0
  248. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0004_rename_file_checksum_mirror_package_checksum.py +0 -0
  249. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0005_rename_package_checksum_mirror_packages_checksum.py +0 -0
  250. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0006_mirror_errata_checksum_mirror_modules_checksum.py +0 -0
  251. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0007_alter_mirror_options_alter_mirrorpackage_options_and_more.py +0 -0
  252. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0008_mirror_packages_count.py +0 -0
  253. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/0009_backfill_mirror_counts.py +0 -0
  254. {patchman-4.0.10 → patchman-4.0.12}/repos/migrations/__init__.py +0 -0
  255. {patchman-4.0.10 → patchman-4.0.12}/repos/models.py +0 -0
  256. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/__init__.py +0 -0
  257. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/arch.py +0 -0
  258. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/deb.py +0 -0
  259. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/gentoo.py +0 -0
  260. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/rpm.py +0 -0
  261. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/yast.py +0 -0
  262. {patchman-4.0.10 → patchman-4.0.12}/repos/repo_types/yum.py +0 -0
  263. {patchman-4.0.10 → patchman-4.0.12}/repos/serializers.py +0 -0
  264. {patchman-4.0.10 → patchman-4.0.12}/repos/signals.py +0 -0
  265. {patchman-4.0.10 → patchman-4.0.12}/repos/tables.py +0 -0
  266. {patchman-4.0.10 → patchman-4.0.12}/repos/tasks.py +0 -0
  267. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/mirror_delete.html +0 -0
  268. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/mirror_detail.html +0 -0
  269. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/mirror_edit.html +0 -0
  270. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/mirror_list.html +0 -0
  271. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/mirror_with_repo_list.html +0 -0
  272. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/repo_delete.html +0 -0
  273. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/repo_detail.html +0 -0
  274. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/repo_edit.html +0 -0
  275. {patchman-4.0.10 → patchman-4.0.12}/repos/templates/repos/repo_list.html +0 -0
  276. {patchman-4.0.10 → patchman-4.0.12}/repos/templatetags/__init__.py +0 -0
  277. {patchman-4.0.10 → patchman-4.0.12}/repos/tests/__init__.py +0 -0
  278. {patchman-4.0.10 → patchman-4.0.12}/repos/tests/test_api.py +0 -0
  279. {patchman-4.0.10 → patchman-4.0.12}/repos/tests/test_managers.py +0 -0
  280. {patchman-4.0.10 → patchman-4.0.12}/repos/tests/test_mirror_sync.py +0 -0
  281. {patchman-4.0.10 → patchman-4.0.12}/repos/tests/test_models.py +0 -0
  282. {patchman-4.0.10 → patchman-4.0.12}/repos/urls.py +0 -0
  283. {patchman-4.0.10 → patchman-4.0.12}/repos/utils.py +0 -0
  284. {patchman-4.0.10 → patchman-4.0.12}/repos/views.py +0 -0
  285. {patchman-4.0.10 → patchman-4.0.12}/requirements.txt +0 -0
  286. {patchman-4.0.10 → patchman-4.0.12}/sbin/patchman +0 -0
  287. {patchman-4.0.10 → patchman-4.0.12}/sbin/patchman-manage +0 -0
  288. {patchman-4.0.10 → patchman-4.0.12}/sbin/patchman-set-secret-key +0 -0
  289. {patchman-4.0.10 → patchman-4.0.12}/scripts/clear-django-logs.py +0 -0
  290. {patchman-4.0.10 → patchman-4.0.12}/scripts/create_graph.sh +0 -0
  291. {patchman-4.0.10 → patchman-4.0.12}/scripts/rpm-install.sh +0 -0
  292. {patchman-4.0.10 → patchman-4.0.12}/scripts/rpm-post-install.sh +0 -0
  293. {patchman-4.0.10 → patchman-4.0.12}/security/__init__.py +0 -0
  294. {patchman-4.0.10 → patchman-4.0.12}/security/admin.py +0 -0
  295. {patchman-4.0.10 → patchman-4.0.12}/security/apps.py +0 -0
  296. {patchman-4.0.10 → patchman-4.0.12}/security/managers.py +0 -0
  297. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0001_initial.py +0 -0
  298. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0002_alter_cve_options.py +0 -0
  299. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0003_alter_cve_description_alter_cwe_description.py +0 -0
  300. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0004_alter_cve_options.py +0 -0
  301. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0005_reference_cve_references.py +0 -0
  302. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0006_alter_cve_options_alter_cvss_unique_together.py +0 -0
  303. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0007_remove_cve_title.py +0 -0
  304. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/0008_alter_cwe_options_alter_reference_options.py +0 -0
  305. {patchman-4.0.10 → patchman-4.0.12}/security/migrations/__init__.py +0 -0
  306. {patchman-4.0.10 → patchman-4.0.12}/security/models.py +0 -0
  307. {patchman-4.0.10 → patchman-4.0.12}/security/serializers.py +0 -0
  308. {patchman-4.0.10 → patchman-4.0.12}/security/tables.py +0 -0
  309. {patchman-4.0.10 → patchman-4.0.12}/security/tasks.py +0 -0
  310. {patchman-4.0.10 → patchman-4.0.12}/security/templates/security/cve_detail.html +0 -0
  311. {patchman-4.0.10 → patchman-4.0.12}/security/templates/security/cve_list.html +0 -0
  312. {patchman-4.0.10 → patchman-4.0.12}/security/templates/security/cwe_detail.html +0 -0
  313. {patchman-4.0.10 → patchman-4.0.12}/security/templates/security/cwe_list.html +0 -0
  314. {patchman-4.0.10 → patchman-4.0.12}/security/templates/security/reference_list.html +0 -0
  315. {patchman-4.0.10 → patchman-4.0.12}/security/templates/security/security_landing.html +0 -0
  316. {patchman-4.0.10 → patchman-4.0.12}/security/tests/__init__.py +0 -0
  317. {patchman-4.0.10 → patchman-4.0.12}/security/tests/test_api.py +0 -0
  318. {patchman-4.0.10 → patchman-4.0.12}/security/tests/test_models.py +0 -0
  319. {patchman-4.0.10 → patchman-4.0.12}/security/urls.py +0 -0
  320. {patchman-4.0.10 → patchman-4.0.12}/security/utils.py +0 -0
  321. {patchman-4.0.10 → patchman-4.0.12}/security/views.py +0 -0
  322. {patchman-4.0.10 → patchman-4.0.12}/setup.cfg +0 -0
  323. {patchman-4.0.10 → patchman-4.0.12}/setup.py +0 -0
  324. {patchman-4.0.10 → patchman-4.0.12}/util/__init__.py +0 -0
  325. {patchman-4.0.10 → patchman-4.0.12}/util/apps.py +0 -0
  326. {patchman-4.0.10 → patchman-4.0.12}/util/context_processors.py +0 -0
  327. {patchman-4.0.10 → patchman-4.0.12}/util/filterspecs.py +0 -0
  328. {patchman-4.0.10 → patchman-4.0.12}/util/logging.py +0 -0
  329. {patchman-4.0.10 → patchman-4.0.12}/util/management/__init__.py +0 -0
  330. {patchman-4.0.10 → patchman-4.0.12}/util/management/commands/__init__.py +0 -0
  331. {patchman-4.0.10 → patchman-4.0.12}/util/management/commands/create_api_key.py +0 -0
  332. {patchman-4.0.10 → patchman-4.0.12}/util/management/commands/list_api_keys.py +0 -0
  333. {patchman-4.0.10 → patchman-4.0.12}/util/management/commands/revoke_api_key.py +0 -0
  334. {patchman-4.0.10 → patchman-4.0.12}/util/tables.py +0 -0
  335. {patchman-4.0.10 → patchman-4.0.12}/util/tasks.py +0 -0
  336. {patchman-4.0.10 → patchman-4.0.12}/util/templates/404.html +0 -0
  337. {patchman-4.0.10 → patchman-4.0.12}/util/templates/500.html +0 -0
  338. {patchman-4.0.10 → patchman-4.0.12}/util/templates/base.html +0 -0
  339. {patchman-4.0.10 → patchman-4.0.12}/util/templates/bulk_actions.html +0 -0
  340. {patchman-4.0.10 → patchman-4.0.12}/util/templates/dashboard.html +0 -0
  341. {patchman-4.0.10 → patchman-4.0.12}/util/templates/navbar.html +0 -0
  342. {patchman-4.0.10 → patchman-4.0.12}/util/templates/objectlist.html +0 -0
  343. {patchman-4.0.10 → patchman-4.0.12}/util/templates/registration/login.html +0 -0
  344. {patchman-4.0.10 → patchman-4.0.12}/util/templates/searchbar.html +0 -0
  345. {patchman-4.0.10 → patchman-4.0.12}/util/templates/table.html +0 -0
  346. {patchman-4.0.10 → patchman-4.0.12}/util/templatetags/__init__.py +0 -0
  347. {patchman-4.0.10 → patchman-4.0.12}/util/templatetags/common.py +0 -0
  348. {patchman-4.0.10 → patchman-4.0.12}/util/tests/__init__.py +0 -0
  349. {patchman-4.0.10 → patchman-4.0.12}/util/tests/test_commands.py +0 -0
  350. {patchman-4.0.10 → patchman-4.0.12}/util/tests/test_utils.py +0 -0
  351. {patchman-4.0.10 → patchman-4.0.12}/util/urls.py +0 -0
  352. {patchman-4.0.10 → patchman-4.0.12}/util/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: patchman
3
- Version: 4.0.10
3
+ Version: 4.0.12
4
4
  Summary: Django based patch status monitoring tool for linux systems
5
5
  Home-page: http://patchman.openbytes.ie/
6
6
  Author: Marcus Furlong
@@ -0,0 +1 @@
1
+ 4.0.12
@@ -149,7 +149,6 @@ class Erratum(models.Model):
149
149
  def add_fixed_packages(self, packages):
150
150
  for package in packages:
151
151
  self.fixed_packages.add(package)
152
- self.save()
153
152
 
154
153
  def add_affected_packages(self, packages):
155
154
  for package in packages:
@@ -239,3 +239,22 @@ class ErratumCachedCountTests(TestCase):
239
239
  self.erratum.refresh_from_db()
240
240
  self.assertEqual(self.erratum.cves_count, self.erratum.cves.count())
241
241
  self.assertEqual(self.erratum.osreleases_count, self.erratum.osreleases.count())
242
+
243
+ def test_add_fixed_packages_no_stale_save(self):
244
+ """Test that add_fixed_packages does not overwrite cached counts.
245
+
246
+ Regression test: add_fixed_packages previously called self.save()
247
+ after the M2M .add() loop, which overwrote the signal-updated
248
+ fixed_packages_count with the stale in-memory value.
249
+ """
250
+ from arch.models import PackageArchitecture
251
+ from packages.models import Package, PackageName
252
+ pkg_arch = PackageArchitecture.objects.create(name='amd64')
253
+ pkg_name = PackageName.objects.create(name='libssl3')
254
+ pkg = Package.objects.create(
255
+ name=pkg_name, arch=pkg_arch, epoch='',
256
+ version='3.0.1', release='1', packagetype='D'
257
+ )
258
+ self.erratum.add_fixed_packages({pkg})
259
+ self.erratum.refresh_from_db()
260
+ self.assertEqual(self.erratum.fixed_packages_count, 1)
@@ -1,6 +1,7 @@
1
1
  Define patchman_pythonpath /srv/patchman/
2
2
  WSGIScriptAlias /patchman ${patchman_pythonpath}/patchman/wsgi.py application-group=%{GLOBAL}
3
3
  WSGIPythonPath ${patchman_pythonpath}
4
+ WSGIPassAuthorization On
4
5
 
5
6
  <Directory ${patchman_pythonpath}>
6
7
  <Files wsgi.py>
@@ -128,3 +128,66 @@ class HostMethodTests(TestCase):
128
128
  self.assertEqual(self.host.get_num_security_updates(), 1)
129
129
  self.assertEqual(self.host.get_num_bugfix_updates(), 1)
130
130
  self.assertEqual(self.host.get_num_updates(), 2)
131
+
132
+ def test_cached_counts_survive_full_save(self):
133
+ """Test that cached update counts are not overwritten by a full save.
134
+
135
+ Regression test: M2M signals update cached count fields via
136
+ save(update_fields=[...]), but a subsequent full save() on the
137
+ same in-memory instance would overwrite them with stale values.
138
+ """
139
+ pkg_arch = PackageArchitecture.objects.create(name='amd64')
140
+ pkg_name = PackageName.objects.create(name='curl')
141
+ old_pkg = Package.objects.create(
142
+ name=pkg_name, arch=pkg_arch, epoch='',
143
+ version='7.0.0', release='1', packagetype='D'
144
+ )
145
+ new_pkg = Package.objects.create(
146
+ name=pkg_name, arch=pkg_arch, epoch='',
147
+ version='7.0.1', release='1', packagetype='D'
148
+ )
149
+ sec_update = PackageUpdate.objects.create(
150
+ oldpackage=old_pkg, newpackage=new_pkg, security=True
151
+ )
152
+
153
+ # simulate the find_host_updates_homogenous pattern:
154
+ # M2M add fires signal, then full save follows
155
+ self.host.updates.add(sec_update)
156
+ self.host.refresh_from_db(fields=['sec_updates_count', 'bug_updates_count'])
157
+ self.host.updated_at = timezone.now()
158
+ self.host.save()
159
+
160
+ # re-read from DB to verify counts persisted
161
+ self.host.refresh_from_db()
162
+ self.assertEqual(self.host.sec_updates_count, 1)
163
+ self.assertEqual(self.host.bug_updates_count, 0)
164
+
165
+ def test_in_memory_counts_stale_after_m2m_signal(self):
166
+ """Test that in-memory instance has updated counts after M2M signal.
167
+
168
+ The M2M signal updates the DB directly via save(update_fields=[...]).
169
+ Django also updates the in-memory instance, but on MySQL with
170
+ REPEATABLE READ isolation and full save(), the stale snapshot can
171
+ overwrite the DB values. The refresh_from_db pattern in
172
+ find_host_updates_homogenous prevents this.
173
+ """
174
+ pkg_arch = PackageArchitecture.objects.create(name='amd64')
175
+ pkg_name = PackageName.objects.create(name='wget')
176
+ old_pkg = Package.objects.create(
177
+ name=pkg_name, arch=pkg_arch, epoch='',
178
+ version='1.0.0', release='1', packagetype='D'
179
+ )
180
+ new_pkg = Package.objects.create(
181
+ name=pkg_name, arch=pkg_arch, epoch='',
182
+ version='1.0.1', release='1', packagetype='D'
183
+ )
184
+ bug_update = PackageUpdate.objects.create(
185
+ oldpackage=old_pkg, newpackage=new_pkg, security=False
186
+ )
187
+
188
+ # M2M add fires signal — DB has correct count
189
+ self.host.updates.add(bug_update)
190
+
191
+ # verify DB has the correct value
192
+ db_host = Host.objects.get(pk=self.host.pk)
193
+ self.assertEqual(db_host.bug_updates_count, 1)
@@ -69,7 +69,10 @@ def get_or_create_host(report, arch, osvariant, domain):
69
69
  host.reboot_required = True
70
70
  else:
71
71
  host.reboot_required = False
72
- host.save()
72
+ host.save(update_fields=[
73
+ 'ipaddress', 'kernel', 'arch', 'osvariant',
74
+ 'domain', 'lastreport', 'reboot_required',
75
+ ])
73
76
  except IntegrityError as e:
74
77
  error_message(text=e)
75
78
  if host:
@@ -94,6 +97,7 @@ def find_host_updates_homogenous(hosts, verbose=False):
94
97
  host.find_updates()
95
98
  if verbose:
96
99
  info_message(text='')
100
+ host.refresh_from_db(fields=['sec_updates_count', 'bug_updates_count', 'errata_count'])
97
101
  host.updated_at = ts
98
102
  host.save()
99
103
 
@@ -114,6 +118,7 @@ def find_host_updates_homogenous(hosts, verbose=False):
114
118
  continue
115
119
 
116
120
  fhost.updates.set(updates)
121
+ fhost.refresh_from_db(fields=['sec_updates_count', 'bug_updates_count'])
117
122
  fhost.updated_at = ts
118
123
  fhost.save()
119
124
  updated_host_ids.add(fhost.id)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: patchman
3
- Version: 4.0.10
3
+ Version: 4.0.12
4
4
  Summary: Django based patch status monitoring tool for linux systems
5
5
  Home-page: http://patchman.openbytes.ie/
6
6
  Author: Marcus Furlong
@@ -74,7 +74,7 @@ etc/patchman/apache.conf.example
74
74
  etc/patchman/celery.conf
75
75
  etc/patchman/local_settings.py
76
76
  etc/systemd/system/patchman-celery-beat.service
77
- etc/systemd/system/patchman-celery-worker.service
77
+ etc/systemd/system/patchman-celery-worker@.service
78
78
  hosts/__init__.py
79
79
  hosts/admin.py
80
80
  hosts/apps.py
@@ -611,7 +611,8 @@ def get_os(os, arch):
611
611
  lts = ''
612
612
  if 'LTS' in os:
613
613
  lts = ' LTS'
614
- major, minor, patch = os.split(' ')[1].split('.')
614
+ os_ver = os.split(' ')[1].split('.')
615
+ major, minor = os_ver[0], os_ver[1]
615
616
  ubuntu_version = f'{major}_{minor}'
616
617
  osrelease_name = f'Ubuntu {major}.{minor}{lts}'
617
618
  cpe_name = f"cpe:2.3:o:canonical:ubuntu_linux:{ubuntu_version}:*:*:*:{'lts' if lts else '*'}:*:*:*"
@@ -1 +0,0 @@
1
- 4.0.10
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes