bugsink 2.2.1__tar.gz → 2.2.2__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 (587) hide show
  1. {bugsink-2.2.1 → bugsink-2.2.2}/CHANGELOG.md +15 -0
  2. {bugsink-2.2.1 → bugsink-2.2.2}/PKG-INFO +1 -1
  3. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/send_json.py +10 -1
  4. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/_version.py +3 -3
  5. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/app_settings.py +4 -0
  6. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_templates/docker.py.template +1 -0
  7. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_templates/local.py.template +1 -0
  8. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_templates/singleserver.py.template +1 -0
  9. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/PKG-INFO +1 -1
  10. {bugsink-2.2.1 → bugsink-2.2.2}/projects/forms.py +9 -8
  11. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_edit.html +1 -0
  12. {bugsink-2.2.1 → bugsink-2.2.2}/projects/tests.py +25 -1
  13. {bugsink-2.2.1 → bugsink-2.2.2}/tags/models.py +13 -0
  14. {bugsink-2.2.1 → bugsink-2.2.2}/tags/tests.py +25 -0
  15. {bugsink-2.2.1 → bugsink-2.2.2}/.bandit +0 -0
  16. {bugsink-2.2.1 → bugsink-2.2.2}/.coveragerc +0 -0
  17. {bugsink-2.2.1 → bugsink-2.2.2}/.github/dependabot.yml +0 -0
  18. {bugsink-2.2.1 → bugsink-2.2.2}/.github/workflows/ci.yml +0 -0
  19. {bugsink-2.2.1 → bugsink-2.2.2}/.github/workflows/copilot-setup-steps.yml +0 -0
  20. {bugsink-2.2.1 → bugsink-2.2.2}/.gitignore +0 -0
  21. {bugsink-2.2.1 → bugsink-2.2.2}/AGENTS.md +0 -0
  22. {bugsink-2.2.1 → bugsink-2.2.2}/CLA.md +0 -0
  23. {bugsink-2.2.1 → bugsink-2.2.2}/CONTRIBUTING.md +0 -0
  24. {bugsink-2.2.1 → bugsink-2.2.2}/Dockerfile +0 -0
  25. {bugsink-2.2.1 → bugsink-2.2.2}/Dockerfile.fromwheel +0 -0
  26. {bugsink-2.2.1 → bugsink-2.2.2}/LICENSE +0 -0
  27. {bugsink-2.2.1 → bugsink-2.2.2}/README.md +0 -0
  28. {bugsink-2.2.1 → bugsink-2.2.2}/SECURITY.md +0 -0
  29. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/__init__.py +0 -0
  30. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/admin.py +0 -0
  31. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/apps.py +0 -0
  32. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/forms.py +0 -0
  33. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0001_initial.py +0 -0
  34. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0002_alter_messagingserviceconfig_project.py +0 -0
  35. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0003_messagingserviceconfig_last_failure_error_message_and_more.py +0 -0
  36. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0004_alter_messagingserviceconfig_kind.py +0 -0
  37. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/__init__.py +0 -0
  38. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/models.py +0 -0
  39. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/__init__.py +0 -0
  40. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/base.py +0 -0
  41. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/discord.py +0 -0
  42. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/mattermost.py +0 -0
  43. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/slack.py +0 -0
  44. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/webhook_security.py +0 -0
  45. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/tasks.py +0 -0
  46. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/templates/mails/issue_alert.html +0 -0
  47. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/templates/mails/issue_alert.txt +0 -0
  48. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/tests.py +0 -0
  49. {bugsink-2.2.1 → bugsink-2.2.2}/alerts/views.py +0 -0
  50. {bugsink-2.2.1 → bugsink-2.2.2}/api/LICENSE +0 -0
  51. {bugsink-2.2.1 → bugsink-2.2.2}/api/README.md +0 -0
  52. {bugsink-2.2.1 → bugsink-2.2.2}/api/event.schema.altered.json +0 -0
  53. {bugsink-2.2.1 → bugsink-2.2.2}/api/event.schema.json +0 -0
  54. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/__init__.py +0 -0
  55. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/admin.py +0 -0
  56. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/apps.py +0 -0
  57. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/future_python.py +0 -0
  58. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/__init__.py +0 -0
  59. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/__init__.py +0 -0
  60. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/check_migrations.py +0 -0
  61. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/cleanup_objectstorage.py +0 -0
  62. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/convert_mariadb_uuids.py +0 -0
  63. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/create_auth_token.py +0 -0
  64. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/fetch_event_schema_json.py +0 -0
  65. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/makemigrations.py +0 -0
  66. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/migrate.py +0 -0
  67. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/migrate_to_current_objectstorage.py +0 -0
  68. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/modelcounts.py +0 -0
  69. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/munin.py +0 -0
  70. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/prestart.py +0 -0
  71. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/raise_exception.py +0 -0
  72. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/send_bomb.py +0 -0
  73. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/showstat.py +0 -0
  74. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/stress_test.py +0 -0
  75. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/vacuum.py +0 -0
  76. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/utils.py +0 -0
  77. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/0001_initial.py +0 -0
  78. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/0002_cachedmodelcount.py +0 -0
  79. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/0003_add_description_to_authtoken.py +0 -0
  80. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/__init__.py +0 -0
  81. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/models.py +0 -0
  82. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/tasks.py +0 -0
  83. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/templates/bsmain/auth_token_list.html +0 -0
  84. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/test_vacuum.py +0 -0
  85. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/tests.py +0 -0
  86. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/urls.py +0 -0
  87. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/utils.py +0 -0
  88. {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/views.py +0 -0
  89. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/__init__.py +0 -0
  90. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_fields.py +0 -0
  91. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_mixins.py +0 -0
  92. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_pagination.py +0 -0
  93. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_serializers.py +0 -0
  94. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/authentication.py +0 -0
  95. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_utils.py +0 -0
  96. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/context_processors.py +0 -0
  97. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/debug_views.py +0 -0
  98. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/decorators.py +0 -0
  99. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/email_backends.py +0 -0
  100. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/event_schema.py +0 -0
  101. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/exceptions.py +0 -0
  102. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/gunicorn.docker.conf.py +0 -0
  103. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/middleware.py +0 -0
  104. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/moreiterutils.py +0 -0
  105. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/period_utils.py +0 -0
  106. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/permissions.py +0 -0
  107. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/pygments_extensions.py +0 -0
  108. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/__init__.py +0 -0
  109. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/create_conf.py +0 -0
  110. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/manage.py +0 -0
  111. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/runsnappea.py +0 -0
  112. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/show_version.py +0 -0
  113. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/util.py +0 -0
  114. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/settings/__init__.py +0 -0
  115. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/settings/default.py +0 -0
  116. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/settings/development.py +0 -0
  117. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/streams.py +0 -0
  118. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/test_api.py +0 -0
  119. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/test_utils.py +0 -0
  120. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/tests.py +0 -0
  121. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/timed_sqlite_backend/__init__.py +0 -0
  122. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/timed_sqlite_backend/base.py +0 -0
  123. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/tooling.py +0 -0
  124. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/transaction.py +0 -0
  125. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/urls.py +0 -0
  126. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/utils.py +0 -0
  127. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/version.py +0 -0
  128. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/views.py +0 -0
  129. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/volume_based_condition.py +0 -0
  130. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/wsgi.py +0 -0
  131. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/SOURCES.txt +0 -0
  132. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/dependency_links.txt +0 -0
  133. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/entry_points.txt +0 -0
  134. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/requires.txt +0 -0
  135. {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/top_level.txt +0 -0
  136. {bugsink-2.2.1 → bugsink-2.2.2}/builddocker.bash +0 -0
  137. {bugsink-2.2.1 → bugsink-2.2.2}/buildxdocker.bash +0 -0
  138. {bugsink-2.2.1 → bugsink-2.2.2}/compat/__init__.py +0 -0
  139. {bugsink-2.2.1 → bugsink-2.2.2}/compat/auth.py +0 -0
  140. {bugsink-2.2.1 → bugsink-2.2.2}/compat/dsn.py +0 -0
  141. {bugsink-2.2.1 → bugsink-2.2.2}/compat/tests.py +0 -0
  142. {bugsink-2.2.1 → bugsink-2.2.2}/compat/timestamp.py +0 -0
  143. {bugsink-2.2.1 → bugsink-2.2.2}/compat/vars.py +0 -0
  144. {bugsink-2.2.1 → bugsink-2.2.2}/docker-compose-sample.yaml +0 -0
  145. {bugsink-2.2.1 → bugsink-2.2.2}/ee/LICENSE +0 -0
  146. {bugsink-2.2.1 → bugsink-2.2.2}/ee/__init__.py +0 -0
  147. {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/__init__.py +0 -0
  148. {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/base.py +0 -0
  149. {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/database_backend/__init__.py +0 -0
  150. {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/database_backend/base.py +0 -0
  151. {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/middleware.py +0 -0
  152. {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/utils.py +0 -0
  153. {bugsink-2.2.1 → bugsink-2.2.2}/events/__init__.py +0 -0
  154. {bugsink-2.2.1 → bugsink-2.2.2}/events/admin.py +0 -0
  155. {bugsink-2.2.1 → bugsink-2.2.2}/events/api_views.py +0 -0
  156. {bugsink-2.2.1 → bugsink-2.2.2}/events/apps.py +0 -0
  157. {bugsink-2.2.1 → bugsink-2.2.2}/events/factories.py +0 -0
  158. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/__init__.py +0 -0
  159. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/__init__.py +0 -0
  160. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/cleanup_eventstorage.py +0 -0
  161. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/delete_by_age_until_under_retention_max.py +0 -0
  162. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/delete_old_events.py +0 -0
  163. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/fix_project_digest_order.py +0 -0
  164. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/make_consistent.py +0 -0
  165. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/migrate_to_current_eventstorage.py +0 -0
  166. {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/nuke_events.py +0 -0
  167. {bugsink-2.2.1 → bugsink-2.2.2}/events/markdown_stacktrace.py +0 -0
  168. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0001_initial.py +0 -0
  169. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0002_initial.py +0 -0
  170. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0003_initial.py +0 -0
  171. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0004_b_squashed.py +0 -0
  172. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0004_event_irrelevance_for_retention.py +0 -0
  173. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0005_event_events_even_project_abe572_idx.py +0 -0
  174. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0006_event_never_evict.py +0 -0
  175. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0007_set_never_evict.py +0 -0
  176. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0008_remove_event_events_even_project_abe572_idx_and_more.py +0 -0
  177. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0009_event_events_even_issue_i_90497b_idx.py +0 -0
  178. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0010_rename_ingest_order_event_digest_order_and_more.py +0 -0
  179. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0011_remove_event_events_even_project_adcdee_idx_and_more.py +0 -0
  180. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0012_event_ingested_at.py +0 -0
  181. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0013_harmonize_foogested_at.py +0 -0
  182. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0014_event_grouping.py +0 -0
  183. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0015_set_event_grouping.py +0 -0
  184. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0016_truncate_exception_type_128.py +0 -0
  185. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0017_alter_event_calculated_type_and_more.py +0 -0
  186. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0018_remove_event_has_exception_remove_event_has_logentry.py +0 -0
  187. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0019_event_storage_backend.py +0 -0
  188. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0020_remove_events_with_null_issue_or_grouping.py +0 -0
  189. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0021_alter_do_nothing.py +0 -0
  190. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0022_alter_event_project.py +0 -0
  191. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0023_event_remote_addr.py +0 -0
  192. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0024_remove_event_debug_info.py +0 -0
  193. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0025_fix_never_evict.py +0 -0
  194. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0026_event_events_even_project_625413_idx.py +0 -0
  195. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0027_event_project_digest_order.py +0 -0
  196. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0028_event_events_even_digeste_bf21dd_idx.py +0 -0
  197. {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/__init__.py +0 -0
  198. {bugsink-2.2.1 → bugsink-2.2.2}/events/models.py +0 -0
  199. {bugsink-2.2.1 → bugsink-2.2.2}/events/renderers.py +0 -0
  200. {bugsink-2.2.1 → bugsink-2.2.2}/events/retention.py +0 -0
  201. {bugsink-2.2.1 → bugsink-2.2.2}/events/serializers.py +0 -0
  202. {bugsink-2.2.1 → bugsink-2.2.2}/events/storage.py +0 -0
  203. {bugsink-2.2.1 → bugsink-2.2.2}/events/storage_registry.py +0 -0
  204. {bugsink-2.2.1 → bugsink-2.2.2}/events/tasks.py +0 -0
  205. {bugsink-2.2.1 → bugsink-2.2.2}/events/templates/events/event_stacktrace.txt +0 -0
  206. {bugsink-2.2.1 → bugsink-2.2.2}/events/test_api.py +0 -0
  207. {bugsink-2.2.1 → bugsink-2.2.2}/events/tests.py +0 -0
  208. {bugsink-2.2.1 → bugsink-2.2.2}/events/ua_stuff.py +0 -0
  209. {bugsink-2.2.1 → bugsink-2.2.2}/events/urls.py +0 -0
  210. {bugsink-2.2.1 → bugsink-2.2.2}/events/utils.py +0 -0
  211. {bugsink-2.2.1 → bugsink-2.2.2}/events/views.py +0 -0
  212. {bugsink-2.2.1 → bugsink-2.2.2}/files/__init__.py +0 -0
  213. {bugsink-2.2.1 → bugsink-2.2.2}/files/admin.py +0 -0
  214. {bugsink-2.2.1 → bugsink-2.2.2}/files/apps.py +0 -0
  215. {bugsink-2.2.1 → bugsink-2.2.2}/files/management/__init__.py +0 -0
  216. {bugsink-2.2.1 → bugsink-2.2.2}/files/management/commands/__init__.py +0 -0
  217. {bugsink-2.2.1 → bugsink-2.2.2}/files/management/commands/delete_legacy_sourcemaps.py +0 -0
  218. {bugsink-2.2.1 → bugsink-2.2.2}/files/management/commands/vacuum_files.py +0 -0
  219. {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0001_initial.py +0 -0
  220. {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0002_chunk_created_at_file_accessed_at_file_created_at_and_more.py +0 -0
  221. {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0003_file_storage_backend.py +0 -0
  222. {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0004_alter_filemetadata_unique_together_and_more.py +0 -0
  223. {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/__init__.py +0 -0
  224. {bugsink-2.2.1 → bugsink-2.2.2}/files/minidump.py +0 -0
  225. {bugsink-2.2.1 → bugsink-2.2.2}/files/models.py +0 -0
  226. {bugsink-2.2.1 → bugsink-2.2.2}/files/object_kinds.py +0 -0
  227. {bugsink-2.2.1 → bugsink-2.2.2}/files/storage.py +0 -0
  228. {bugsink-2.2.1 → bugsink-2.2.2}/files/storage_registry.py +0 -0
  229. {bugsink-2.2.1 → bugsink-2.2.2}/files/tasks.py +0 -0
  230. {bugsink-2.2.1 → bugsink-2.2.2}/files/test_vacuum.py +0 -0
  231. {bugsink-2.2.1 → bugsink-2.2.2}/files/tests.py +0 -0
  232. {bugsink-2.2.1 → bugsink-2.2.2}/files/urls.py +0 -0
  233. {bugsink-2.2.1 → bugsink-2.2.2}/files/views.py +0 -0
  234. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/__init__.py +0 -0
  235. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/admin.py +0 -0
  236. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/apps.py +0 -0
  237. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/event_counter.py +0 -0
  238. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/exceptions.py +0 -0
  239. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/filestore.py +0 -0
  240. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/header_validators.py +0 -0
  241. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/management/__init__.py +0 -0
  242. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/management/commands/__init__.py +0 -0
  243. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/management/commands/vacuum_ingest_dir.py +0 -0
  244. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/migrations/0001_set_sqlite_wal.py +0 -0
  245. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/migrations/0002_initial.py +0 -0
  246. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/migrations/__init__.py +0 -0
  247. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/models.py +0 -0
  248. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/parsers.py +0 -0
  249. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/tasks.py +0 -0
  250. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/tests.py +0 -0
  251. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/urls.py +0 -0
  252. {bugsink-2.2.1 → bugsink-2.2.2}/ingest/views.py +0 -0
  253. {bugsink-2.2.1 → bugsink-2.2.2}/issues/__init__.py +0 -0
  254. {bugsink-2.2.1 → bugsink-2.2.2}/issues/admin.py +0 -0
  255. {bugsink-2.2.1 → bugsink-2.2.2}/issues/api_views.py +0 -0
  256. {bugsink-2.2.1 → bugsink-2.2.2}/issues/apps.py +0 -0
  257. {bugsink-2.2.1 → bugsink-2.2.2}/issues/factories.py +0 -0
  258. {bugsink-2.2.1 → bugsink-2.2.2}/issues/forms.py +0 -0
  259. {bugsink-2.2.1 → bugsink-2.2.2}/issues/markdown_issue.py +0 -0
  260. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0001_initial.py +0 -0
  261. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0002_initial.py +0 -0
  262. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0003_alter_turningpoint_triggering_event.py +0 -0
  263. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0004_b_squashed.py +0 -0
  264. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0004_rename_event_count_issue_digested_event_count.py +0 -0
  265. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0005_rename_ingest_order_issue_digest_order_and_more.py +0 -0
  266. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0006_issue_next_unmute_check.py +0 -0
  267. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0007_alter_turningpoint_options.py +0 -0
  268. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0008_issue_stored_event_count.py +0 -0
  269. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0009_fill_stored_event_count.py +0 -0
  270. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0010_issue_list_indexes.py +0 -0
  271. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0011_truncate_exception_type_128.py +0 -0
  272. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0012_alter_issue_calculated_type_and_more.py +0 -0
  273. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0013_fix_issue_stored_event_counts.py +0 -0
  274. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0014_grouping_grouping_key_hash.py +0 -0
  275. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0015_set_grouping_hash.py +0 -0
  276. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0016_alter_grouping_unique_together.py +0 -0
  277. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0017_issue_list_indexes_must_start_with_project.py +0 -0
  278. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0018_issue_is_deleted.py +0 -0
  279. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0019_alter_grouping_grouping_key_hash.py +0 -0
  280. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0020_remove_objects_with_null_issue.py +0 -0
  281. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0021_alter_do_nothing.py +0 -0
  282. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0022_turningpoint_project.py +0 -0
  283. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0023_turningpoint_set_project.py +0 -0
  284. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0024_turningpoint_project_alter_not_null.py +0 -0
  285. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0025_alter_grouping_project_alter_issue_project.py +0 -0
  286. {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/__init__.py +0 -0
  287. {bugsink-2.2.1 → bugsink-2.2.2}/issues/models.py +0 -0
  288. {bugsink-2.2.1 → bugsink-2.2.2}/issues/regressions.py +0 -0
  289. {bugsink-2.2.1 → bugsink-2.2.2}/issues/serializers.py +0 -0
  290. {bugsink-2.2.1 → bugsink-2.2.2}/issues/tasks.py +0 -0
  291. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/_event_nav.html +0 -0
  292. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/base.html +0 -0
  293. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/breadcrumbs.html +0 -0
  294. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/event_404.html +0 -0
  295. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/event_details.html +0 -0
  296. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/event_list.html +0 -0
  297. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/grouping.html +0 -0
  298. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/history.html +0 -0
  299. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/issue_list.html +0 -0
  300. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/stacktrace.html +0 -0
  301. {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/tags.html +0 -0
  302. {bugsink-2.2.1 → bugsink-2.2.2}/issues/test_api.py +0 -0
  303. {bugsink-2.2.1 → bugsink-2.2.2}/issues/tests.py +0 -0
  304. {bugsink-2.2.1 → bugsink-2.2.2}/issues/urls.py +0 -0
  305. {bugsink-2.2.1 → bugsink-2.2.2}/issues/utils.py +0 -0
  306. {bugsink-2.2.1 → bugsink-2.2.2}/issues/views.py +0 -0
  307. {bugsink-2.2.1 → bugsink-2.2.2}/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  308. {bugsink-2.2.1 → bugsink-2.2.2}/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  309. {bugsink-2.2.1 → bugsink-2.2.2}/manage.py +0 -0
  310. {bugsink-2.2.1 → bugsink-2.2.2}/performance/__init__.py +0 -0
  311. {bugsink-2.2.1 → bugsink-2.2.2}/performance/bursty_data.py +0 -0
  312. {bugsink-2.2.1 → bugsink-2.2.2}/performance/context_managers.py +0 -0
  313. {bugsink-2.2.1 → bugsink-2.2.2}/performance/management/__init__.py +0 -0
  314. {bugsink-2.2.1 → bugsink-2.2.2}/performance/management/commands/__init__.py +0 -0
  315. {bugsink-2.2.1 → bugsink-2.2.2}/performance/management/commands/pftest_search.py +0 -0
  316. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/README.md +0 -0
  317. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/df-day.png +0 -0
  318. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/event_ingest_count-day.png +0 -0
  319. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/response_time_api_avg-day.png +0 -0
  320. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/response_time_api_max-day.png +0 -0
  321. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/snappea_queue_size-day.png +0 -0
  322. {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/total_requests-day.png +0 -0
  323. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/__init__.py +0 -0
  324. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/admin.py +0 -0
  325. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/apps.py +0 -0
  326. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/management/__init__.py +0 -0
  327. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/management/commands/__init__.py +0 -0
  328. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/management/commands/print_phonehome.py +0 -0
  329. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0001_b_squashed_initial.py +0 -0
  330. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0001_initial.py +0 -0
  331. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0002_create_installation_id.py +0 -0
  332. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0002_installation_email_quota_usage.py +0 -0
  333. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0003_installation_ingest_quotas.py +0 -0
  334. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0003_outboundmessage.py +0 -0
  335. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0004_installation_created_at.py +0 -0
  336. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0004_installation_quota_exceeded_reason.py +0 -0
  337. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0005_installation_silence_email_system_warning.py +0 -0
  338. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0005_reset_quota_exceeded_until.py +0 -0
  339. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0006_recalculate_installation_next_quota_check.py +0 -0
  340. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/__init__.py +0 -0
  341. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/models.py +0 -0
  342. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/tasks.py +0 -0
  343. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/tests.py +0 -0
  344. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/utils.py +0 -0
  345. {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/views.py +0 -0
  346. {bugsink-2.2.1 → bugsink-2.2.2}/pre-commit +0 -0
  347. {bugsink-2.2.1 → bugsink-2.2.2}/projects/__init__.py +0 -0
  348. {bugsink-2.2.1 → bugsink-2.2.2}/projects/admin.py +0 -0
  349. {bugsink-2.2.1 → bugsink-2.2.2}/projects/api_views.py +0 -0
  350. {bugsink-2.2.1 → bugsink-2.2.2}/projects/apps.py +0 -0
  351. {bugsink-2.2.1 → bugsink-2.2.2}/projects/context_processors.py +0 -0
  352. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0001_initial.py +0 -0
  353. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0002_b_squashed_initial.py +0 -0
  354. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0002_initial.py +0 -0
  355. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0003_project_projects_pr_name_11d782_idx.py +0 -0
  356. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0003_project_retention_max_event_count.py +0 -0
  357. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0004_project_quota_exceeded_until.py +0 -0
  358. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0005_project_ingested_event_count.py +0 -0
  359. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0006_initial_ingested_count_value.py +0 -0
  360. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0007_rename_ingested_event_count_project_digested_event_count.py +0 -0
  361. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0008_project_next_quota_check.py +0 -0
  362. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0009_alter_project_visibility.py +0 -0
  363. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0010_project_stored_event_count.py +0 -0
  364. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0011_fill_stored_event_count.py +0 -0
  365. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0012_project_is_deleted.py +0 -0
  366. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0013_delete_objects_pointing_to_null_project.py +0 -0
  367. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0014_alter_projectmembership_project.py +0 -0
  368. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0015_project_quota_exceeded_reason.py +0 -0
  369. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0016_reset_quota_exceeded_until.py +0 -0
  370. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0017_project_issue_count.py +0 -0
  371. {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/__init__.py +0 -0
  372. {bugsink-2.2.1 → bugsink-2.2.2}/projects/models.py +0 -0
  373. {bugsink-2.2.1 → bugsink-2.2.2}/projects/serializers.py +0 -0
  374. {bugsink-2.2.1 → bugsink-2.2.2}/projects/tasks.py +0 -0
  375. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite.html +0 -0
  376. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite.txt +0 -0
  377. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite_new_user.html +0 -0
  378. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite_new_user.txt +0 -0
  379. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_alerts_setup.html +0 -0
  380. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_list.html +0 -0
  381. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_member_settings.html +0 -0
  382. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_members.html +0 -0
  383. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_members_accept.html +0 -0
  384. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_members_invite.html +0 -0
  385. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_messaging_service_edit.html +0 -0
  386. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_messaging_service_new.html +0 -0
  387. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_new.html +0 -0
  388. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup.html +0 -0
  389. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_javascript.html +0 -0
  390. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_php.html +0 -0
  391. {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_python.html +0 -0
  392. {bugsink-2.2.1 → bugsink-2.2.2}/projects/test_api.py +0 -0
  393. {bugsink-2.2.1 → bugsink-2.2.2}/projects/urls.py +0 -0
  394. {bugsink-2.2.1 → bugsink-2.2.2}/projects/views.py +0 -0
  395. {bugsink-2.2.1 → bugsink-2.2.2}/pyproject.toml +0 -0
  396. {bugsink-2.2.1 → bugsink-2.2.2}/releases/__init__.py +0 -0
  397. {bugsink-2.2.1 → bugsink-2.2.2}/releases/admin.py +0 -0
  398. {bugsink-2.2.1 → bugsink-2.2.2}/releases/api_views.py +0 -0
  399. {bugsink-2.2.1 → bugsink-2.2.2}/releases/apps.py +0 -0
  400. {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0001_initial.py +0 -0
  401. {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0002_release_releases_re_sort_ep_5c07c8_idx.py +0 -0
  402. {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0003_alter_release_project.py +0 -0
  403. {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0004_fix_indexes.py +0 -0
  404. {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/__init__.py +0 -0
  405. {bugsink-2.2.1 → bugsink-2.2.2}/releases/models.py +0 -0
  406. {bugsink-2.2.1 → bugsink-2.2.2}/releases/serializers.py +0 -0
  407. {bugsink-2.2.1 → bugsink-2.2.2}/releases/test_api.py +0 -0
  408. {bugsink-2.2.1 → bugsink-2.2.2}/releases/tests.py +0 -0
  409. {bugsink-2.2.1 → bugsink-2.2.2}/releases/views.py +0 -0
  410. {bugsink-2.2.1 → bugsink-2.2.2}/requirements.development.txt +0 -0
  411. {bugsink-2.2.1 → bugsink-2.2.2}/requirements.txt +0 -0
  412. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/LICENSE +0 -0
  413. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/__init__.py +0 -0
  414. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/assemble.py +0 -0
  415. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/minidump.py +0 -0
  416. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/stacktraces/functions.py +0 -0
  417. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/stacktraces/platform.py +0 -0
  418. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/stacktraces/processing.py +0 -0
  419. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/utils/safe.py +0 -0
  420. {bugsink-2.2.1 → bugsink-2.2.2}/sentry/utils/strings.py +0 -0
  421. {bugsink-2.2.1 → bugsink-2.2.2}/sentry_sdk_extensions/__init__.py +0 -0
  422. {bugsink-2.2.1 → bugsink-2.2.2}/sentry_sdk_extensions/tests.py +0 -0
  423. {bugsink-2.2.1 → bugsink-2.2.2}/sentry_sdk_extensions/transport.py +0 -0
  424. {bugsink-2.2.1 → bugsink-2.2.2}/setup.cfg +0 -0
  425. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/__init__.py +0 -0
  426. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/admin.py +0 -0
  427. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/apps.py +0 -0
  428. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/datastructures.py +0 -0
  429. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/dbrouters.py +0 -0
  430. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/decorators.py +0 -0
  431. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/example_tasks.py +0 -0
  432. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/foreman.py +0 -0
  433. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/__init__.py +0 -0
  434. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/commands/__init__.py +0 -0
  435. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/commands/checksnappea.py +0 -0
  436. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/commands/runsnappea.py +0 -0
  437. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0001_initial.py +0 -0
  438. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0002_create_models.py +0 -0
  439. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0003_task_created_at.py +0 -0
  440. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0004_task_snappea_tas_created_eb0824_idx.py +0 -0
  441. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0005_stat.py +0 -0
  442. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/__init__.py +0 -0
  443. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/models.py +0 -0
  444. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/settings.py +0 -0
  445. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/stats.py +0 -0
  446. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/tests.py +0 -0
  447. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/utils.py +0 -0
  448. {bugsink-2.2.1 → bugsink-2.2.2}/snappea/views.py +0 -0
  449. {bugsink-2.2.1 → bugsink-2.2.2}/static/favicon.png +0 -0
  450. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-700.woff2 +0 -0
  451. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-700italic.woff2 +0 -0
  452. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-italic.woff2 +0 -0
  453. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  454. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-700.woff2 +0 -0
  455. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-700italic.woff2 +0 -0
  456. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-italic.woff2 +0 -0
  457. {bugsink-2.2.1 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  458. {bugsink-2.2.1 → bugsink-2.2.2}/static/images/bugsink-logo-dark.png +0 -0
  459. {bugsink-2.2.1 → bugsink-2.2.2}/static/images/bugsink-logo.png +0 -0
  460. {bugsink-2.2.1 → bugsink-2.2.2}/static/images/lang-javascript.png +0 -0
  461. {bugsink-2.2.1 → bugsink-2.2.2}/static/images/lang-php.png +0 -0
  462. {bugsink-2.2.1 → bugsink-2.2.2}/static/images/lang-python.png +0 -0
  463. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/entity_edit.js +0 -0
  464. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/issue_history.js +0 -0
  465. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/issue_list.js +0 -0
  466. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/issue_stacktrace.js +0 -0
  467. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/project_list.js +0 -0
  468. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/team_list.js +0 -0
  469. {bugsink-2.2.1 → bugsink-2.2.2}/static/js/user_list.js +0 -0
  470. {bugsink-2.2.1 → bugsink-2.2.2}/tags/__init__.py +0 -0
  471. {bugsink-2.2.1 → bugsink-2.2.2}/tags/admin.py +0 -0
  472. {bugsink-2.2.1 → bugsink-2.2.2}/tags/apps.py +0 -0
  473. {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/__init__.py +0 -0
  474. {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/__init__.py +0 -0
  475. {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/init_tags.py +0 -0
  476. {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/vacuum_eventless_issuetags.py +0 -0
  477. {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/vacuum_tags.py +0 -0
  478. {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0001_initial.py +0 -0
  479. {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0002_no_cascade.py +0 -0
  480. {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0003_remove_objects_with_null_issue.py +0 -0
  481. {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0004_alter_do_nothing.py +0 -0
  482. {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0005_alter_eventtag_project_alter_issuetag_project_and_more.py +0 -0
  483. {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/__init__.py +0 -0
  484. {bugsink-2.2.1 → bugsink-2.2.2}/tags/search.py +0 -0
  485. {bugsink-2.2.1 → bugsink-2.2.2}/tags/tasks.py +0 -0
  486. {bugsink-2.2.1 → bugsink-2.2.2}/tags/utils.py +0 -0
  487. {bugsink-2.2.1 → bugsink-2.2.2}/teams/__init__.py +0 -0
  488. {bugsink-2.2.1 → bugsink-2.2.2}/teams/admin.py +0 -0
  489. {bugsink-2.2.1 → bugsink-2.2.2}/teams/api_views.py +0 -0
  490. {bugsink-2.2.1 → bugsink-2.2.2}/teams/apps.py +0 -0
  491. {bugsink-2.2.1 → bugsink-2.2.2}/teams/forms.py +0 -0
  492. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0001_b_squashed_initial.py +0 -0
  493. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0001_initial.py +0 -0
  494. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0002_initial.py +0 -0
  495. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0002_team_teams_team_name_43e047_idx.py +0 -0
  496. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0003_alter_team_visibility.py +0 -0
  497. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0004_remove_team_slug.py +0 -0
  498. {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/__init__.py +0 -0
  499. {bugsink-2.2.1 → bugsink-2.2.2}/teams/models.py +0 -0
  500. {bugsink-2.2.1 → bugsink-2.2.2}/teams/serializers.py +0 -0
  501. {bugsink-2.2.1 → bugsink-2.2.2}/teams/tasks.py +0 -0
  502. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite.html +0 -0
  503. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite.txt +0 -0
  504. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite_new_user.html +0 -0
  505. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite_new_user.txt +0 -0
  506. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_edit.html +0 -0
  507. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_list.html +0 -0
  508. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_member_settings.html +0 -0
  509. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_members.html +0 -0
  510. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_members_accept.html +0 -0
  511. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_members_invite.html +0 -0
  512. {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_new.html +0 -0
  513. {bugsink-2.2.1 → bugsink-2.2.2}/teams/test_api.py +0 -0
  514. {bugsink-2.2.1 → bugsink-2.2.2}/teams/tests.py +0 -0
  515. {bugsink-2.2.1 → bugsink-2.2.2}/teams/urls.py +0 -0
  516. {bugsink-2.2.1 → bugsink-2.2.2}/teams/views.py +0 -0
  517. {bugsink-2.2.1 → bugsink-2.2.2}/templates/400.html +0 -0
  518. {bugsink-2.2.1 → bugsink-2.2.2}/templates/403.html +0 -0
  519. {bugsink-2.2.1 → bugsink-2.2.2}/templates/403_csrf.html +0 -0
  520. {bugsink-2.2.1 → bugsink-2.2.2}/templates/404.html +0 -0
  521. {bugsink-2.2.1 → bugsink-2.2.2}/templates/4xx_5xx_api.txt +0 -0
  522. {bugsink-2.2.1 → bugsink-2.2.2}/templates/500.html +0 -0
  523. {bugsink-2.2.1 → bugsink-2.2.2}/templates/503.html +0 -0
  524. {bugsink-2.2.1 → bugsink-2.2.2}/templates/admin/change_form_object_tools.html +0 -0
  525. {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/counts.html +0 -0
  526. {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/csrf_debug.html +0 -0
  527. {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/login.html +0 -0
  528. {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/settings.html +0 -0
  529. {bugsink-2.2.1 → bugsink-2.2.2}/templates/robots.txt +0 -0
  530. {bugsink-2.2.1 → bugsink-2.2.2}/templates/signup.html +0 -0
  531. {bugsink-2.2.1 → bugsink-2.2.2}/theme/__init__.py +0 -0
  532. {bugsink-2.2.1 → bugsink-2.2.2}/theme/apps.py +0 -0
  533. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static/css/dist/styles.css +0 -0
  534. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/.gitignore +0 -0
  535. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/package-lock.json +0 -0
  536. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/package.json +0 -0
  537. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/postcss.config.js +0 -0
  538. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/src/styles.css +0 -0
  539. {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/tailwind.config.js +0 -0
  540. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/bare_base.html +0 -0
  541. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/barest_base.html +0 -0
  542. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/base.html +0 -0
  543. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/tailwind_forms/formfield.html +0 -0
  544. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/__init__.py +0 -0
  545. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/add_to_qs.py +0 -0
  546. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/code.py +0 -0
  547. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/issues.py +0 -0
  548. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/stricter_templates.py +0 -0
  549. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/tailwind_forms.py +0 -0
  550. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/user.py +0 -0
  551. {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/version.py +0 -0
  552. {bugsink-2.2.1 → bugsink-2.2.2}/theme/tests.py +0 -0
  553. {bugsink-2.2.1 → bugsink-2.2.2}/tools/is_tracked_by_tailwind.py +0 -0
  554. {bugsink-2.2.1 → bugsink-2.2.2}/tools/strip-trailing-whitespace.sh +0 -0
  555. {bugsink-2.2.1 → bugsink-2.2.2}/users/__init__.py +0 -0
  556. {bugsink-2.2.1 → bugsink-2.2.2}/users/admin.py +0 -0
  557. {bugsink-2.2.1 → bugsink-2.2.2}/users/apps.py +0 -0
  558. {bugsink-2.2.1 → bugsink-2.2.2}/users/forms.py +0 -0
  559. {bugsink-2.2.1 → bugsink-2.2.2}/users/management/__init__.py +0 -0
  560. {bugsink-2.2.1 → bugsink-2.2.2}/users/management/commands/__init__.py +0 -0
  561. {bugsink-2.2.1 → bugsink-2.2.2}/users/management/commands/send_welcome_email.py +0 -0
  562. {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0001_initial.py +0 -0
  563. {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0002_user_theme_preference.py +0 -0
  564. {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0003_user_language.py +0 -0
  565. {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0004_alter_user_language.py +0 -0
  566. {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/__init__.py +0 -0
  567. {bugsink-2.2.1 → bugsink-2.2.2}/users/models.py +0 -0
  568. {bugsink-2.2.1 → bugsink-2.2.2}/users/tasks.py +0 -0
  569. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/confirm_email.html +0 -0
  570. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/confirm_email.txt +0 -0
  571. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/reset_password_email.html +0 -0
  572. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/reset_password_email.txt +0 -0
  573. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/welcome_email.html +0 -0
  574. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/welcome_email.txt +0 -0
  575. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/confirm_email.html +0 -0
  576. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/confirm_email_sent.html +0 -0
  577. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/logged_out.html +0 -0
  578. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/preferences.html +0 -0
  579. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/request_reset_password.html +0 -0
  580. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/resend_confirmation.html +0 -0
  581. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/reset_password.html +0 -0
  582. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/reset_password_email_sent.html +0 -0
  583. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/user_edit.html +0 -0
  584. {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/user_list.html +0 -0
  585. {bugsink-2.2.1 → bugsink-2.2.2}/users/tests.py +0 -0
  586. {bugsink-2.2.1 → bugsink-2.2.2}/users/urls.py +0 -0
  587. {bugsink-2.2.1 → bugsink-2.2.2}/users/views.py +0 -0
@@ -1,5 +1,20 @@
1
1
  # Changes
2
2
 
3
+ ## 2.2.2 (4 June 2026)
4
+
5
+ ### Security
6
+
7
+ Fix: cap the number of tags stored per event.
8
+
9
+ Events with very many tags could keep the single write transaction busy for longer than intended during digestion.
10
+ Bugsink now stores at most `MAX_EVENT_TAGS` tags per event, defaulting to 100.
11
+
12
+ https://github.com/bugsink/bugsink/security/advisories/GHSA-5x67-j5xg-c5gj
13
+
14
+ ### Smaller fixes
15
+
16
+ * Show project slugs as read-only on project settings pages, see #402.
17
+
3
18
  ## 2.2.1 (22 May 2026)
4
19
 
5
20
  ### API
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bugsink
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Self-hosted Error Tracking
5
5
  Author-email: "Bugsink B.V." <info@bugsink.com>
6
6
  Project-URL: homepage, https://www.bugsink.com/
@@ -12,6 +12,7 @@ from django.core.management.base import BaseCommand, CommandError
12
12
  from django.conf import settings
13
13
 
14
14
  from compat.dsn import get_store_url, get_envelope_url, get_header_value
15
+ from bugsink.app_settings import get_settings
15
16
  from bugsink.streams import compress_with_zlib, WBITS_PARAM_FOR_GZIP, WBITS_PARAM_FOR_DEFLATE
16
17
  from bugsink.utils import nc_rnd
17
18
 
@@ -31,6 +32,7 @@ class Command(BaseCommand):
31
32
  parser.add_argument("--compress", action="store", choices=["gzip", "deflate", "br"], default=None)
32
33
  parser.add_argument("--use-store-api", action="store_true", help="Use (deprecated) /api/<id>/store/")
33
34
  parser.add_argument("--chunked-encoding", action="store_true")
35
+ parser.add_argument("--respect-limits", action="store_true", help="Use client-side size-limit checks")
34
36
  parser.add_argument(
35
37
  "--x-forwarded-for", action="store",
36
38
  help="Set the X-Forwarded-For header to test whether your setup is properly ignoring it")
@@ -132,6 +134,14 @@ class Command(BaseCommand):
132
134
  if options["valid_only"] and not self.is_valid(data, identifier):
133
135
  return False
134
136
 
137
+ data_bytes = json.dumps(data, separators=(",", ":")).encode("utf-8")
138
+
139
+ # For now this only checks the event item size; we'll add other limit checks as needed.
140
+ if options["respect_limits"] and len(data_bytes) >= get_settings().MAX_EVENT_SIZE:
141
+ raise CommandError(
142
+ "Event JSON is %d bytes, which would hit the %d byte event-size limit" % (
143
+ len(data_bytes), get_settings().MAX_EVENT_SIZE))
144
+
135
145
  try:
136
146
  headers = {
137
147
  "Content-Type": "application/json",
@@ -141,7 +151,6 @@ class Command(BaseCommand):
141
151
  if options["x_forwarded_for"]:
142
152
  headers["X-Forwarded-For"] = options["x_forwarded_for"]
143
153
 
144
- data_bytes = json.dumps(data).encode("utf-8")
145
154
  if use_envelope:
146
155
  event_id = data.get("event_id", uuid.uuid4().hex)
147
156
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.2.1'
22
- __version_tuple__ = version_tuple = (2, 2, 1)
21
+ __version__ = version = '2.2.2'
22
+ __version_tuple__ = version_tuple = (2, 2, 2)
23
23
 
24
- __commit_id__ = commit_id = 'gea814dc8e'
24
+ __commit_id__ = commit_id = 'gdd17221c0'
@@ -78,6 +78,10 @@ DEFAULTS = {
78
78
  # I don't think Sentry specifies this one, but we do: given the spec 8KiB should be enough by an order of magnitude.
79
79
  "MAX_HEADER_SIZE": 8 * _KIBIBYTE,
80
80
 
81
+ # Cap on the number of tags stored per event. Without it, a single event with very many tags becomes ~4x that
82
+ # many row-writes inside the (single-writer) digest transaction. 100 is well above any realistic event.
83
+ "MAX_EVENT_TAGS": 100,
84
+
81
85
  # Locations of files & directories:
82
86
  # no_bandit_expl: the usage of this path (via get_filename_for_event_id) is protected with `b108_makedirs`
83
87
  "INGEST_STORE_BASE_DIR": "/tmp/bugsink/ingestion", # nosec
@@ -175,6 +175,7 @@ BUGSINK = {
175
175
  "MAX_EVENT_COMPRESSED_SIZE": int(os.getenv("MAX_EVENT_COMPRESSED_SIZE", 200 * _KIBIBYTE)),
176
176
  "MAX_ENVELOPE_SIZE": int(os.getenv("MAX_ENVELOPE_SIZE", 100 * _MEBIBYTE)),
177
177
  "MAX_ENVELOPE_COMPRESSED_SIZE": int(os.getenv("MAX_ENVELOPE_COMPRESSED_SIZE", 20 * _MEBIBYTE)),
178
+ "MAX_EVENT_TAGS": int(os.getenv("MAX_EVENT_TAGS", 100)),
178
179
  # For large MAX_FILE_SIZE values, you may want FILE_OBJECT_STORAGE_PATH configured too.
179
180
  "MAX_FILE_SIZE": int(os.getenv("MAX_FILE_SIZE", 2 * _GIBIBYTE)),
180
181
 
@@ -80,6 +80,7 @@ BUGSINK = {
80
80
 
81
81
  # For large MAX_FILE_SIZE values, you may want OBJECT_STORAGES["file"] configured too.
82
82
  # "MAX_FILE_SIZE": 2 * _GIBIBYTE,
83
+ # "MAX_EVENT_TAGS": 100,
83
84
 
84
85
  # Webhook outbound security:
85
86
  # "ALERTS_WEBHOOK_OUTBOUND_MODE": "open", # or "allowlist_only"
@@ -112,6 +112,7 @@ BUGSINK = {
112
112
  # "MAX_EVENT_COMPRESSED_SIZE": 200 * _KIBIBYTE,
113
113
  # "MAX_ENVELOPE_SIZE": 100 * _MEBIBYTE,
114
114
  # "MAX_ENVELOPE_COMPRESSED_SIZE": 20 * _MEBIBYTE,
115
+ # "MAX_EVENT_TAGS": 100,
115
116
  # For large MAX_FILE_SIZE values, you may want OBJECT_STORAGES["file"] configured too.
116
117
  # "MAX_FILE_SIZE": 2 * _GIBIBYTE,
117
118
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bugsink
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Self-hosted Error Tracking
5
5
  Author-email: "Bugsink B.V." <info@bugsink.com>
6
6
  Project-URL: homepage, https://www.bugsink.com/
@@ -79,6 +79,7 @@ class ProjectMembershipForm(forms.ModelForm):
79
79
 
80
80
  class ProjectForm(forms.ModelForm):
81
81
 
82
+ slug = forms.CharField(label="Slug", disabled=True)
82
83
  dsn = forms.CharField(label="DSN", disabled=True)
83
84
 
84
85
  def __init__(self, *args, **kwargs):
@@ -101,6 +102,10 @@ class ProjectForm(forms.ModelForm):
101
102
  # for authorization are (from the user's perspective).
102
103
  del self.fields["team"]
103
104
 
105
+ # for editing, the slug is available, but read-only (editing affects the issue's short identifier)
106
+ self.fields["slug"].initial = self.instance.slug
107
+ self.fields["slug"].label = _("Slug (read-only)")
108
+
104
109
  # for editing, the DSN is availabe, but read-only
105
110
  self.fields["dsn"].initial = self.instance.dsn
106
111
  self.fields["dsn"].label = _("DSN (read-only)")
@@ -110,10 +115,6 @@ class ProjectForm(forms.ModelForm):
110
115
  _("Use the DSN to {link}."),
111
116
  link=format_html('<a href="{}" class="text-cyan-800 font-bold">{}</a>', href, _("set up the SDK")),
112
117
  )
113
-
114
- # if we ever push slug to the form, editing it should probably be disallowed as well (but mainly because it
115
- # has consequences on the issue's short identifier)
116
- # del self.fields["slug"]
117
118
  else:
118
119
  # for creation, we allow changing the team; (as an additional improvement we _could_ consider hiding this
119
120
  # field if there is only one team, and especially if SINGLE_TEAM is True, but being explicit is fine too as
@@ -128,16 +129,16 @@ class ProjectForm(forms.ModelForm):
128
129
  elif team_qs.count() == 1:
129
130
  self.fields["team"].initial = team_qs.first()
130
131
 
131
- # for creation, we don't show the DSN field
132
+ # for creation, we don't show the slug or DSN fields
133
+ del self.fields["slug"]
132
134
  del self.fields["dsn"]
133
135
 
134
136
  class Meta:
135
137
  model = Project
136
138
 
137
139
  fields = ["team", "name", "visibility", "retention_max_event_count"]
138
- # "slug", <= for now, we just do this in the model; if we want to do it in the form, I would want to have some
139
- # JS in place like we have in the admin. django/contrib/admin/static/admin/js/prepopulate.js is an example of
140
- # how Django does this (but it requires JQuery)
140
+ # slug is shown read-only via an explicit (declared) field for edit; creation auto-generates it on the model.
141
+ # If we ever make slug editable, we'd want JS like django/contrib/admin/static/admin/js/prepopulate.js.
141
142
 
142
143
  # "alert_on_new_issue", "alert_on_regression", "alert_on_unmute" later
143
144
 
@@ -43,6 +43,7 @@
43
43
  </div>
44
44
 
45
45
  {% tailwind_formfield form.name %}
46
+ {% tailwind_formfield form.slug %}
46
47
  {% tailwind_formfield form.visibility %}
47
48
  {% tailwind_formfield form.retention_max_event_count %}
48
49
  {% tailwind_formfield form.dsn %}
@@ -5,7 +5,8 @@ from unittest.mock import patch
5
5
 
6
6
  from bugsink.test_utils import TransactionTestCase25251 as TransactionTestCase
7
7
  from bugsink.utils import get_model_topography
8
- from projects.models import Project, ProjectMembership, ProjectRole
8
+ from projects.forms import ProjectForm
9
+ from projects.models import Project, ProjectMembership, ProjectRole, ProjectVisibility
9
10
  from events.factories import create_event
10
11
  from issues.factories import get_or_create_issue, denormalized_issue_fields
11
12
  from tags.models import store_tags
@@ -146,6 +147,29 @@ class ProjectDeletionTestCase(TransactionTestCase):
146
147
  ])
147
148
 
148
149
 
150
+ class ProjectFormTestCase(TransactionTestCase):
151
+
152
+ def test_slug_is_read_only_on_edit(self):
153
+ # Slug is exposed on the edit form for visibility but must not be editable: it's part of the issue's short
154
+ # identifier, so changing it would break external references.
155
+ project = Project.objects.create(name="Original Name", slug="original-slug")
156
+
157
+ form = ProjectForm(
158
+ data={
159
+ "name": "Renamed",
160
+ "slug": "tampered-slug",
161
+ "visibility": ProjectVisibility.JOINABLE,
162
+ "retention_max_event_count": 10000,
163
+ },
164
+ instance=project,
165
+ )
166
+
167
+ self.assertTrue(form.is_valid(), form.errors)
168
+ saved = form.save()
169
+ self.assertEqual(saved.slug, "original-slug")
170
+ self.assertEqual(saved.name, "Renamed")
171
+
172
+
149
173
  class ProjectListOpenIssueCountTestCase(TransactionTestCase):
150
174
 
151
175
  def setUp(self):
@@ -18,6 +18,8 @@ https://docs.sentry.io/platforms/python/enriching-events/tags/
18
18
  """
19
19
 
20
20
 
21
+ import logging
22
+
21
23
  from django.db import models
22
24
  from django.db.models import F, Q
23
25
  from django.db import connection
@@ -25,6 +27,9 @@ from django.db import connection
25
27
  from projects.models import Project
26
28
  from tags.utils import deduce_tags, is_mostly_unique
27
29
  from bugsink.moreiterutils import batched
30
+ from bugsink.app_settings import get_settings
31
+
32
+ logger = logging.getLogger("bugsink.ingest")
28
33
 
29
34
  # Notes on .project as it lives on TagValue, IssueTag and EventTag:
30
35
  # In all cases, project could be derived through other means: for TagValue it's implied by TagKey.project; for IssueTag
@@ -175,6 +180,14 @@ def digest_tags(event_data, event, issue):
175
180
  else:
176
181
  tags[key] = event.remote_addr
177
182
 
183
+ # An event may carry an unbounded number of tags; without a cap a single event becomes ~4x that many row
184
+ # writes inside the (single-writer) digest transaction. Keep the first tags from deduce_tags(), which means
185
+ # user-provided tags are kept before later synthetic tags.
186
+ max_tags = get_settings().MAX_EVENT_TAGS
187
+ if len(tags) > max_tags:
188
+ logger.warning("event has %d tags; storing %d and dropping the rest", len(tags), max_tags)
189
+ tags = dict(list(tags.items())[:max_tags])
190
+
178
191
  store_tags(event, issue, tags)
179
192
 
180
193
 
@@ -2,6 +2,7 @@ from unittest import TestCase as RegularTestCase
2
2
  from django.test import TestCase as DjangoTestCase
3
3
  from django.conf import settings
4
4
 
5
+ from bugsink.app_settings import override_settings as override_bugsink_settings
5
6
  from bugsink.test_utils import TransactionTestCase25251 as TransactionTestCase
6
7
  from projects.models import Project
7
8
  from issues.factories import get_or_create_issue, denormalized_issue_fields
@@ -179,6 +180,30 @@ class DigestTagsTestCase(DjangoTestCase):
179
180
 
180
181
  self.assertEqual([], [e.value.value for e in event.get_tags])
181
182
 
183
+ def test_max_event_tags_keeps_first_user_tags(self):
184
+ project = Project.objects.create(name="Test Project")
185
+ issue, _ = get_or_create_issue(project)
186
+ event = create_event(project, issue=issue)
187
+
188
+ event_data = {
189
+ "tags": {
190
+ "user_tag_1": "one",
191
+ "user_tag_2": "two",
192
+ "user_tag_3": "three",
193
+ },
194
+ "server_name": "synthetic",
195
+ }
196
+
197
+ with override_bugsink_settings(MAX_EVENT_TAGS=2):
198
+ with self.assertLogs("bugsink.ingest", level="WARNING"):
199
+ digest_tags(event_data, event, issue)
200
+
201
+ self.assertEqual(["user_tag_1", "user_tag_2"], [
202
+ tag.value.key.key for tag in event.tags.order_by("value__key__key")
203
+ ])
204
+ self.assertFalse(event.tags.filter(value__key__key="user_tag_3").exists())
205
+ self.assertFalse(event.tags.filter(value__key__key="server_name").exists())
206
+
182
207
 
183
208
  class SearchParserTestCase(RegularTestCase):
184
209
 
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
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