howler-api 4.0.0.dev847__tar.gz → 4.0.0.dev850__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 (219) hide show
  1. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/PKG-INFO +1 -1
  2. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v2/ingest.py +17 -2
  3. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/base.py +21 -10
  4. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/compat.py +6 -0
  5. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/pyproject.toml +1 -1
  6. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/README.md +0 -0
  7. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/__init__.py +0 -0
  8. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/__init__.py +0 -0
  9. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/add_label.py +0 -0
  10. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/add_to_bundle.py +0 -0
  11. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/add_to_case.py +0 -0
  12. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/change_field.py +0 -0
  13. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/demote.py +0 -0
  14. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/example_plugin.py +0 -0
  15. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/prioritization.py +0 -0
  16. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/promote.py +0 -0
  17. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/remove_from_bundle.py +0 -0
  18. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/remove_label.py +0 -0
  19. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/actions/transition.py +0 -0
  20. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/__init__.py +0 -0
  21. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/base.py +0 -0
  22. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/socket.py +0 -0
  23. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/__init__.py +0 -0
  24. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/action.py +0 -0
  25. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/analytic.py +0 -0
  26. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/auth.py +0 -0
  27. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/clue.py +0 -0
  28. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/configs.py +0 -0
  29. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/dossier.py +0 -0
  30. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/help.py +0 -0
  31. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/hit.py +0 -0
  32. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/notebook.py +0 -0
  33. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/overview.py +0 -0
  34. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/search.py +0 -0
  35. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/template.py +0 -0
  36. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/tool.py +0 -0
  37. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/user.py +0 -0
  38. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/utils/__init__.py +0 -0
  39. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/utils/etag.py +0 -0
  40. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v1/view.py +0 -0
  41. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v2/__init__.py +0 -0
  42. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v2/case.py +0 -0
  43. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/api/v2/search.py +0 -0
  44. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/app.py +0 -0
  45. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/README.md +0 -0
  46. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/__init__.py +0 -0
  47. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/classification.py +0 -0
  48. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/classification.yml +0 -0
  49. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/exceptions.py +0 -0
  50. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/loader.py +0 -0
  51. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/logging/__init__.py +0 -0
  52. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/logging/audit.py +0 -0
  53. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/logging/format.py +0 -0
  54. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/net.py +0 -0
  55. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/net_static.py +0 -0
  56. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/random_user.py +0 -0
  57. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/common/swagger.py +0 -0
  58. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/config.py +0 -0
  59. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/cronjobs/__init__.py +0 -0
  60. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/cronjobs/correlation.py +0 -0
  61. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/cronjobs/retention.py +0 -0
  62. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/cronjobs/view_cleanup.py +0 -0
  63. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/README.md +0 -0
  64. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/__init__.py +0 -0
  65. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/bulk.py +0 -0
  66. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/collection.py +0 -0
  67. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/constants.py +0 -0
  68. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/exceptions.py +0 -0
  69. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/howler_store.py +0 -0
  70. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/migrations/fix_process.py +0 -0
  71. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/operations.py +0 -0
  72. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/schemas.py +0 -0
  73. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/store.py +0 -0
  74. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/support/__init__.py +0 -0
  75. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/support/build.py +0 -0
  76. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/support/schemas.py +0 -0
  77. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/datastore/types.py +0 -0
  78. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/error.py +0 -0
  79. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/README.md +0 -0
  80. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/__init__.py +0 -0
  81. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/generate_mitre.py +0 -0
  82. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/generate_sigma_rules.py +0 -0
  83. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/generate_tlds.py +0 -0
  84. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/reindex_data.py +0 -0
  85. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/external/wipe_databases.py +0 -0
  86. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/gunicorn_config.py +0 -0
  87. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/healthz.py +0 -0
  88. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/__init__.py +0 -0
  89. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/azure.py +0 -0
  90. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/discover.py +0 -0
  91. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/hit.py +0 -0
  92. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/oauth.py +0 -0
  93. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/search.py +0 -0
  94. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/workflow.py +0 -0
  95. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/helper/ws.py +0 -0
  96. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/README.md +0 -0
  97. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/__init__.py +0 -0
  98. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/charter.txt +0 -0
  99. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/constants.py +0 -0
  100. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/helper.py +0 -0
  101. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/howler_enum.py +0 -0
  102. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/mixins.py +0 -0
  103. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/__init__.py +0 -0
  104. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/action.py +0 -0
  105. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/analytic.py +0 -0
  106. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/assemblyline.py +0 -0
  107. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/aws.py +0 -0
  108. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/azure.py +0 -0
  109. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/case.py +0 -0
  110. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/cbs.py +0 -0
  111. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/clue.py +0 -0
  112. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/config.py +0 -0
  113. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/dossier.py +0 -0
  114. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/__init__.py +0 -0
  115. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/agent.py +0 -0
  116. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/autonomous_system.py +0 -0
  117. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/client.py +0 -0
  118. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/cloud.py +0 -0
  119. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/code_signature.py +0 -0
  120. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/container.py +0 -0
  121. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/dns.py +0 -0
  122. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/egress.py +0 -0
  123. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/elf.py +0 -0
  124. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/email.py +0 -0
  125. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/error.py +0 -0
  126. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/event.py +0 -0
  127. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/faas.py +0 -0
  128. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/file.py +0 -0
  129. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/geo.py +0 -0
  130. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/group.py +0 -0
  131. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/hash.py +0 -0
  132. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/host.py +0 -0
  133. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/http.py +0 -0
  134. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/ingress.py +0 -0
  135. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/interface.py +0 -0
  136. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/network.py +0 -0
  137. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/observer.py +0 -0
  138. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/organization.py +0 -0
  139. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/os.py +0 -0
  140. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/pe.py +0 -0
  141. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/process.py +0 -0
  142. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/registry.py +0 -0
  143. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/related.py +0 -0
  144. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/rule.py +0 -0
  145. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/server.py +0 -0
  146. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/threat.py +0 -0
  147. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/tls.py +0 -0
  148. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/url.py +0 -0
  149. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/user.py +0 -0
  150. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/user_agent.py +0 -0
  151. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/ecs/vulnerability.py +0 -0
  152. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/gcp.py +0 -0
  153. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/hit.py +0 -0
  154. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/howler_data.py +0 -0
  155. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/lead.py +0 -0
  156. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/localized_label.py +0 -0
  157. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/observable.py +0 -0
  158. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/overview.py +0 -0
  159. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/pivot.py +0 -0
  160. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/record.py +0 -0
  161. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/template.py +0 -0
  162. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/user.py +0 -0
  163. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/models/view.py +0 -0
  164. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/random_data.py +0 -0
  165. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/odm/randomizer.py +0 -0
  166. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/patched.py +0 -0
  167. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/plugins/__init__.py +0 -0
  168. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/plugins/config.py +0 -0
  169. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/__init__.py +0 -0
  170. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/README.md +0 -0
  171. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/__init__.py +0 -0
  172. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/counters.py +0 -0
  173. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/events.py +0 -0
  174. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/hash.py +0 -0
  175. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/lock.py +0 -0
  176. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/queues/__init__.py +0 -0
  177. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/queues/comms.py +0 -0
  178. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/queues/multi.py +0 -0
  179. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/queues/named.py +0 -0
  180. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/queues/priority.py +0 -0
  181. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/set.py +0 -0
  182. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  183. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/security/__init__.py +0 -0
  184. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/security/socket.py +0 -0
  185. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/security/utils.py +0 -0
  186. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/__init__.py +0 -0
  187. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/action_service.py +0 -0
  188. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/analytic_service.py +0 -0
  189. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/auth_service.py +0 -0
  190. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/bundle_compat_service.py +0 -0
  191. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/case_service.py +0 -0
  192. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/config_service.py +0 -0
  193. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/correlation_service.py +0 -0
  194. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/docs_service.py +0 -0
  195. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/dossier_service.py +0 -0
  196. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/event_service.py +0 -0
  197. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/hit_service.py +0 -0
  198. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/jwt_service.py +0 -0
  199. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/lucene_service.py +0 -0
  200. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/notebook_service.py +0 -0
  201. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/observable_service.py +0 -0
  202. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/overview_service.py +0 -0
  203. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/search_service.py +0 -0
  204. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/template_service.py +0 -0
  205. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/user_service.py +0 -0
  206. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/services/viewer_service.py +0 -0
  207. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/telemetry.py +0 -0
  208. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/__init__.py +0 -0
  209. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/annotations.py +0 -0
  210. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/chunk.py +0 -0
  211. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/constants.py +0 -0
  212. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/dict_utils.py +0 -0
  213. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/isotime.py +0 -0
  214. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/list_utils.py +0 -0
  215. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/lucene.py +0 -0
  216. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/path.py +0 -0
  217. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/socket_utils.py +0 -0
  218. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/str_utils.py +0 -0
  219. {howler_api-4.0.0.dev847 → howler_api-4.0.0.dev850}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 4.0.0.dev847
3
+ Version: 4.0.0.dev850
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -162,8 +162,23 @@ def delete(indexes: str, user: User, **kwargs):
162
162
  if non_existing_hit_ids := [id for id in ids if all(not ds[index].exists(id) for index in index_list)]:
163
163
  return not_found(err=f"Record ids [{','.join(non_existing_hit_ids)}] do not exist.")
164
164
 
165
- # TODO: Reimplement in a generic function
166
- # hit_service.delete_hits(hit_ids, indexes=index_list)
165
+ try:
166
+ remaining = set(ids)
167
+ for index in index_list:
168
+ if not remaining:
169
+ break
170
+
171
+ existing = [record_id for record_id in remaining if ds[index].exists(record_id)]
172
+ if not existing:
173
+ continue
174
+
175
+ for record_id in existing:
176
+ ds[index].delete(record_id)
177
+
178
+ remaining -= set(existing)
179
+ ds[index].commit()
180
+ except DataStoreException as e:
181
+ return internal_error(err=str(e))
167
182
 
168
183
  return no_content()
169
184
 
@@ -1081,10 +1081,10 @@ class Model:
1081
1081
  Args:
1082
1082
  skip_mappings (bool): Skip over mappings where the real subfield names are unknown.
1083
1083
  """
1084
- if skip_mappings and hasattr(cls, "_odm_field_cache_skip"):
1084
+ if not no_cache and skip_mappings and "_odm_field_cache_skip" in cls.__dict__:
1085
1085
  return cls._odm_field_cache_skip
1086
1086
 
1087
- if not skip_mappings and hasattr(cls, "_odm_field_cache"):
1087
+ if not no_cache and not skip_mappings and "_odm_field_cache" in cls.__dict__:
1088
1088
  return cls._odm_field_cache
1089
1089
 
1090
1090
  out = dict()
@@ -1113,10 +1113,10 @@ class Model:
1113
1113
  def add_namespace(cls, namespace: str, field: _Field, index=None, store=None, description=None):
1114
1114
  recursive_set_name(field, namespace)
1115
1115
 
1116
- if hasattr(cls, "_odm_field_cache_skip"):
1116
+ if "_odm_field_cache_skip" in cls.__dict__:
1117
1117
  cls._odm_field_cache_skip[namespace.rstrip("_")] = field
1118
1118
 
1119
- if hasattr(cls, "_odm_field_cache"):
1119
+ if "_odm_field_cache" in cls.__dict__:
1120
1120
  cls._odm_field_cache[namespace.rstrip("_")] = field
1121
1121
 
1122
1122
  setattr(cls, namespace, field)
@@ -1131,10 +1131,10 @@ class Model:
1131
1131
 
1132
1132
  @classmethod
1133
1133
  def remove_namespace(cls, namespace: str):
1134
- if hasattr(cls, "_odm_field_cache_skip"):
1134
+ if "_odm_field_cache_skip" in cls.__dict__:
1135
1135
  del cls._odm_field_cache_skip[namespace.rstrip("_")]
1136
1136
 
1137
- if hasattr(cls, "_odm_field_cache"):
1137
+ if "_odm_field_cache" in cls.__dict__:
1138
1138
  del cls._odm_field_cache[namespace.rstrip("_")]
1139
1139
 
1140
1140
  delattr(cls, namespace)
@@ -1212,7 +1212,7 @@ class Model:
1212
1212
  include_autogen_note=True,
1213
1213
  defaults=None,
1214
1214
  url_prefix="/howler/odm/class/",
1215
- ) -> dict | str:
1215
+ ) -> str:
1216
1216
  markdown_content = (
1217
1217
  (
1218
1218
  '??? success "Auto-Generated Documentation"\n '
@@ -1524,12 +1524,23 @@ def model(index=None, store=None, description=None, id_field=None):
1524
1524
 
1525
1525
  def _finish_model(cls):
1526
1526
  cls._Model__description = description
1527
- cls._Model__id_field = id_field
1527
+ fields = cls.fields()
1528
1528
 
1529
- if cls._Model__id_field is None:
1529
+ if id_field is None:
1530
1530
  cls._Model__id_field = f"{cls.__name__.lower()}_id"
1531
+ else:
1532
+ if not isinstance(id_field, str):
1533
+ raise HowlerTypeError(f"id_field must be a str, got {type(id_field).__name__}")
1534
+
1535
+ if not FLATTENED_OBJECT_SANITIZER.match(id_field) or id_field in BANNED_FIELDS:
1536
+ raise HowlerValueError(f"Illegal id_field name: {id_field}")
1537
+
1538
+ if id_field not in fields and id_field not in cls.flat_fields():
1539
+ raise HowlerValueError(f"id_field must reference a declared field: {id_field}")
1540
+
1541
+ cls._Model__id_field = id_field
1531
1542
 
1532
- for name, field_data in cls.fields().items():
1543
+ for name, field_data in fields.items():
1533
1544
  if not FIELD_SANITIZER.match(name) or name in BANNED_FIELDS:
1534
1545
  raise HowlerValueError(f"Illegal variable name: {name}")
1535
1546
 
@@ -14,6 +14,12 @@ else:
14
14
  class StrEnum(str, _Enum): # type: ignore[no-redef]
15
15
  """str + Enum backport for Python < 3.11."""
16
16
 
17
+ def __str__(self) -> str:
18
+ return str.__str__(self)
19
+
20
+ def __format__(self, format_spec: str) -> str:
21
+ return str.__format__(self, format_spec)
22
+
17
23
  # typing_extensions.TypedDict supports Generic[T] mixing on Python < 3.11;
18
24
  # the stdlib version does not gain that until 3.11.
19
25
  from typing_extensions import NotRequired, TypedDict # noqa: F401
@@ -152,7 +152,7 @@ suppress-none-returning = true
152
152
  [tool.poetry]
153
153
  package-mode = true
154
154
  name = "howler-api"
155
- version = "4.0.0.dev847"
155
+ version = "4.0.0.dev850"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",