bugsink 2.2.0__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.
- {bugsink-2.2.0 → bugsink-2.2.2}/.github/workflows/ci.yml +15 -11
- {bugsink-2.2.0 → bugsink-2.2.2}/.github/workflows/copilot-setup-steps.yml +2 -2
- {bugsink-2.2.0 → bugsink-2.2.2}/CHANGELOG.md +35 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/PKG-INFO +1 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/prestart.py +11 -2
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/send_json.py +10 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/_version.py +3 -3
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/app_settings.py +4 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/conf_templates/docker.py.template +1 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/conf_templates/local.py.template +1 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/conf_templates/singleserver.py.template +1 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/gunicorn.docker.conf.py +1 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/settings/default.py +4 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/settings/development.py +6 -5
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/urls.py +2 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink.egg-info/PKG-INFO +1 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/events/api_views.py +33 -11
- {bugsink-2.2.0 → bugsink-2.2.2}/files/views.py +1 -0
- bugsink-2.2.2/issues/api_views.py +296 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/models.py +163 -1
- bugsink-2.2.2/issues/serializers.py +90 -0
- bugsink-2.2.2/issues/templates/issues/event_details.html +233 -0
- bugsink-2.2.2/issues/test_api.py +366 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/views.py +7 -152
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/api_views.py +38 -8
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/forms.py +9 -8
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_edit.html +1 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/tests.py +25 -1
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/api_views.py +33 -6
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/models.py +13 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/tests.py +25 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/api_views.py +35 -8
- bugsink-2.2.2/theme/static/css/dist/styles.css +2 -0
- bugsink-2.2.0/issues/api_views.py +0 -134
- bugsink-2.2.0/issues/serializers.py +0 -41
- bugsink-2.2.0/issues/templates/issues/event_details.html +0 -233
- bugsink-2.2.0/issues/test_api.py +0 -168
- bugsink-2.2.0/theme/static/css/dist/styles.css +0 -2
- {bugsink-2.2.0 → bugsink-2.2.2}/.bandit +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/.coveragerc +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/.github/dependabot.yml +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/.gitignore +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/AGENTS.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/CLA.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/CONTRIBUTING.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/Dockerfile +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/Dockerfile.fromwheel +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/LICENSE +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/README.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/SECURITY.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/forms.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/migrations/0002_alter_messagingserviceconfig_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/migrations/0003_messagingserviceconfig_last_failure_error_message_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/migrations/0004_alter_messagingserviceconfig_kind.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/service_backends/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/service_backends/base.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/service_backends/discord.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/service_backends/mattermost.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/service_backends/slack.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/service_backends/webhook_security.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/templates/mails/issue_alert.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/templates/mails/issue_alert.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/alerts/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/api/LICENSE +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/api/README.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/api/event.schema.altered.json +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/api/event.schema.json +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/future_python.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/check_migrations.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/cleanup_objectstorage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/convert_mariadb_uuids.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/create_auth_token.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/fetch_event_schema_json.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/makemigrations.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/migrate.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/migrate_to_current_objectstorage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/modelcounts.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/munin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/raise_exception.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/send_bomb.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/showstat.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/stress_test.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/commands/vacuum.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/management/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/migrations/0002_cachedmodelcount.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/migrations/0003_add_description_to_authtoken.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/templates/bsmain/auth_token_list.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/test_vacuum.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bsmain/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/api_fields.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/api_mixins.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/api_pagination.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/api_serializers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/authentication.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/conf_utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/context_processors.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/debug_views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/decorators.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/email_backends.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/event_schema.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/exceptions.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/middleware.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/moreiterutils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/period_utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/permissions.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/pygments_extensions.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/scripts/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/scripts/create_conf.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/scripts/manage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/scripts/runsnappea.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/scripts/show_version.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/scripts/util.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/settings/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/streams.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/test_api.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/test_utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/timed_sqlite_backend/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/timed_sqlite_backend/base.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/tooling.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/transaction.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/version.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/volume_based_condition.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink/wsgi.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink.egg-info/SOURCES.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink.egg-info/dependency_links.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink.egg-info/entry_points.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink.egg-info/requires.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/bugsink.egg-info/top_level.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/builddocker.bash +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/buildxdocker.bash +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/compat/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/compat/auth.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/compat/dsn.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/compat/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/compat/timestamp.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/compat/vars.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/docker-compose-sample.yaml +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/LICENSE +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/tenants/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/tenants/base.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/tenants/database_backend/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/tenants/database_backend/base.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/tenants/middleware.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ee/tenants/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/factories.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/cleanup_eventstorage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/delete_by_age_until_under_retention_max.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/delete_old_events.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/fix_project_digest_order.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/make_consistent.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/migrate_to_current_eventstorage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/management/commands/nuke_events.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/markdown_stacktrace.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0002_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0003_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0004_b_squashed.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0004_event_irrelevance_for_retention.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0005_event_events_even_project_abe572_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0006_event_never_evict.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0007_set_never_evict.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0008_remove_event_events_even_project_abe572_idx_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0009_event_events_even_issue_i_90497b_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0010_rename_ingest_order_event_digest_order_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0011_remove_event_events_even_project_adcdee_idx_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0012_event_ingested_at.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0013_harmonize_foogested_at.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0014_event_grouping.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0015_set_event_grouping.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0016_truncate_exception_type_128.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0017_alter_event_calculated_type_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0018_remove_event_has_exception_remove_event_has_logentry.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0019_event_storage_backend.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0020_remove_events_with_null_issue_or_grouping.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0021_alter_do_nothing.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0022_alter_event_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0023_event_remote_addr.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0024_remove_event_debug_info.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0025_fix_never_evict.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0026_event_events_even_project_625413_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0027_event_project_digest_order.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/0028_event_events_even_digeste_bf21dd_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/renderers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/retention.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/serializers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/storage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/storage_registry.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/templates/events/event_stacktrace.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/test_api.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/ua_stuff.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/events/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/management/commands/delete_legacy_sourcemaps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/management/commands/vacuum_files.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/migrations/0002_chunk_created_at_file_accessed_at_file_created_at_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/migrations/0003_file_storage_backend.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/migrations/0004_alter_filemetadata_unique_together_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/minidump.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/object_kinds.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/storage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/storage_registry.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/test_vacuum.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/files/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/event_counter.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/exceptions.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/filestore.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/header_validators.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/management/commands/vacuum_ingest_dir.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/migrations/0001_set_sqlite_wal.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/migrations/0002_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/parsers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/ingest/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/factories.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/forms.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/markdown_issue.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0002_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0003_alter_turningpoint_triggering_event.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0004_b_squashed.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0004_rename_event_count_issue_digested_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0005_rename_ingest_order_issue_digest_order_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0006_issue_next_unmute_check.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0007_alter_turningpoint_options.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0008_issue_stored_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0009_fill_stored_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0010_issue_list_indexes.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0011_truncate_exception_type_128.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0012_alter_issue_calculated_type_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0013_fix_issue_stored_event_counts.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0014_grouping_grouping_key_hash.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0015_set_grouping_hash.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0016_alter_grouping_unique_together.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0017_issue_list_indexes_must_start_with_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0018_issue_is_deleted.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0019_alter_grouping_grouping_key_hash.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0020_remove_objects_with_null_issue.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0021_alter_do_nothing.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0022_turningpoint_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0023_turningpoint_set_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0024_turningpoint_project_alter_not_null.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/0025_alter_grouping_project_alter_issue_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/regressions.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/_event_nav.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/base.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/breadcrumbs.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/event_404.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/event_list.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/grouping.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/history.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/issue_list.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/stacktrace.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/templates/issues/tags.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/issues/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/manage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/bursty_data.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/context_managers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/management/commands/pftest_search.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/README.md +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/df-day.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/event_ingest_count-day.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/response_time_api_avg-day.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/response_time_api_max-day.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/snappea_queue_size-day.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/performance/stress-with-eviction/total_requests-day.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/management/commands/print_phonehome.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0001_b_squashed_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0002_create_installation_id.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0002_installation_email_quota_usage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0003_installation_ingest_quotas.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0003_outboundmessage.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0004_installation_created_at.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0004_installation_quota_exceeded_reason.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0005_installation_silence_email_system_warning.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0005_reset_quota_exceeded_until.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/0006_recalculate_installation_next_quota_check.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/phonehome/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/pre-commit +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/context_processors.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0002_b_squashed_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0002_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0003_project_projects_pr_name_11d782_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0003_project_retention_max_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0004_project_quota_exceeded_until.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0005_project_ingested_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0006_initial_ingested_count_value.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0007_rename_ingested_event_count_project_digested_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0008_project_next_quota_check.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0009_alter_project_visibility.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0010_project_stored_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0011_fill_stored_event_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0012_project_is_deleted.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0013_delete_objects_pointing_to_null_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0014_alter_projectmembership_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0015_project_quota_exceeded_reason.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0016_reset_quota_exceeded_until.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/0017_project_issue_count.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/serializers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite_new_user.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite_new_user.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_alerts_setup.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_list.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_member_settings.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_members.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_members_accept.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_members_invite.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_messaging_service_edit.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_messaging_service_new.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_new.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_javascript.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_php.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_python.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/test_api.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/projects/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/pyproject.toml +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/migrations/0002_release_releases_re_sort_ep_5c07c8_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/migrations/0003_alter_release_project.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/migrations/0004_fix_indexes.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/serializers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/test_api.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/releases/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/requirements.development.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/requirements.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/LICENSE +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/assemble.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/minidump.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/stacktraces/functions.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/stacktraces/platform.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/stacktraces/processing.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/utils/safe.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry/utils/strings.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry_sdk_extensions/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry_sdk_extensions/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/sentry_sdk_extensions/transport.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/setup.cfg +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/datastructures.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/dbrouters.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/decorators.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/example_tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/foreman.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/management/commands/checksnappea.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/management/commands/runsnappea.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/migrations/0002_create_models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/migrations/0003_task_created_at.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/migrations/0004_task_snappea_tas_created_eb0824_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/migrations/0005_stat.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/settings.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/stats.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/snappea/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/favicon.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-700.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-700italic.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-italic.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-mono-v19-cyrillic_cyrillic-ext_latin_latin-ext_vietnamese-regular.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-700.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-700italic.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-italic.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/fonts/ibm-plex-sans-v19-cyrillic_cyrillic-ext_greek_latin_latin-ext_vietnamese-regular.woff2 +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/images/bugsink-logo-dark.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/images/bugsink-logo.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/images/lang-javascript.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/images/lang-php.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/images/lang-python.png +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/entity_edit.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/issue_history.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/issue_list.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/issue_stacktrace.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/project_list.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/team_list.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/static/js/user_list.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/management/commands/init_tags.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/management/commands/vacuum_eventless_issuetags.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/management/commands/vacuum_tags.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/migrations/0002_no_cascade.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/migrations/0003_remove_objects_with_null_issue.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/migrations/0004_alter_do_nothing.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/migrations/0005_alter_eventtag_project_alter_issuetag_project_and_more.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/search.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tags/utils.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/forms.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/0001_b_squashed_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/0002_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/0002_team_teams_team_name_43e047_idx.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/0003_alter_team_visibility.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/0004_remove_team_slug.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/serializers.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite_new_user.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite_new_user.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_edit.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_list.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_member_settings.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_members.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_members_accept.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_members_invite.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/templates/teams/team_new.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/test_api.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/teams/views.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/400.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/403.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/403_csrf.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/404.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/4xx_5xx_api.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/500.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/503.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/admin/change_form_object_tools.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/bugsink/counts.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/bugsink/csrf_debug.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/bugsink/login.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/bugsink/settings.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/robots.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/templates/signup.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/static_src/.gitignore +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/static_src/package-lock.json +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/static_src/package.json +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/static_src/postcss.config.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/static_src/src/styles.css +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/static_src/tailwind.config.js +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templates/bare_base.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templates/barest_base.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templates/base.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templates/tailwind_forms/formfield.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/add_to_qs.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/code.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/issues.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/stricter_templates.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/tailwind_forms.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/user.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/templatetags/version.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/theme/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tools/is_tracked_by_tailwind.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/tools/strip-trailing-whitespace.sh +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/admin.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/apps.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/forms.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/management/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/management/commands/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/management/commands/send_welcome_email.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/migrations/0001_initial.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/migrations/0002_user_theme_preference.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/migrations/0003_user_language.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/migrations/0004_alter_user_language.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/migrations/__init__.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/models.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/tasks.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/mails/confirm_email.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/mails/confirm_email.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/mails/reset_password_email.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/mails/reset_password_email.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/mails/welcome_email.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/mails/welcome_email.txt +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/confirm_email.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/confirm_email_sent.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/logged_out.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/preferences.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/request_reset_password.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/resend_confirmation.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/reset_password.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/reset_password_email_sent.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/user_edit.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/templates/users/user_list.html +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/tests.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/urls.py +0 -0
- {bugsink-2.2.0 → bugsink-2.2.2}/users/views.py +0 -0
|
@@ -25,9 +25,9 @@ jobs:
|
|
|
25
25
|
ruff:
|
|
26
26
|
runs-on: ubuntu-latest
|
|
27
27
|
steps:
|
|
28
|
-
- uses: actions/checkout@
|
|
28
|
+
- uses: actions/checkout@v6
|
|
29
29
|
- name: "Set up Python 3.12"
|
|
30
|
-
uses: actions/setup-python@
|
|
30
|
+
uses: actions/setup-python@v6
|
|
31
31
|
with:
|
|
32
32
|
python-version: "3.12"
|
|
33
33
|
- name: Install Ruff
|
|
@@ -40,10 +40,10 @@ jobs:
|
|
|
40
40
|
bandit:
|
|
41
41
|
runs-on: ubuntu-latest
|
|
42
42
|
steps:
|
|
43
|
-
- uses: actions/checkout@
|
|
43
|
+
- uses: actions/checkout@v6
|
|
44
44
|
|
|
45
45
|
- name: Set up Python
|
|
46
|
-
uses: actions/setup-python@
|
|
46
|
+
uses: actions/setup-python@v6
|
|
47
47
|
with:
|
|
48
48
|
python-version: 3.12
|
|
49
49
|
|
|
@@ -106,9 +106,9 @@ jobs:
|
|
|
106
106
|
DB_USER: ${{ matrix.db_user }}
|
|
107
107
|
DB_PASSWORD: ${{ matrix.db_password }}
|
|
108
108
|
steps:
|
|
109
|
-
- uses: actions/checkout@
|
|
109
|
+
- uses: actions/checkout@v6
|
|
110
110
|
- name: Set up Python ${{ matrix.python-version }}
|
|
111
|
-
uses: actions/setup-python@
|
|
111
|
+
uses: actions/setup-python@v6
|
|
112
112
|
with:
|
|
113
113
|
python-version: ${{ matrix.python-version }}
|
|
114
114
|
- name: Start MySQL If Needed
|
|
@@ -134,7 +134,7 @@ jobs:
|
|
|
134
134
|
pip install -r requirements.development.txt
|
|
135
135
|
pip install mysqlclient psycopg2
|
|
136
136
|
- name: Check out event-samples
|
|
137
|
-
uses: actions/checkout@
|
|
137
|
+
uses: actions/checkout@v6
|
|
138
138
|
with:
|
|
139
139
|
repository: bugsink/event-samples
|
|
140
140
|
path: "event-samples"
|
|
@@ -169,17 +169,17 @@ jobs:
|
|
|
169
169
|
# Build the Docker image, start it, wait for readiness, log in at /accounts/login/,
|
|
170
170
|
# and verify that / redirects to /teams/.
|
|
171
171
|
steps:
|
|
172
|
-
- uses: actions/checkout@
|
|
172
|
+
- uses: actions/checkout@v6
|
|
173
173
|
|
|
174
174
|
- name: Build Docker image
|
|
175
175
|
run: docker build -t bugsink-ci .
|
|
176
176
|
|
|
177
|
-
- name: Run container (
|
|
177
|
+
- name: Run container (no-reply@bugsink.com:admin)
|
|
178
178
|
run: |
|
|
179
179
|
docker rm -f bugsink-ci || true
|
|
180
180
|
docker run -d --name bugsink-ci \
|
|
181
181
|
-e SECRET_KEY=UtdHATKzQKLkz3izFFpxCKamhEdspeHmCQFvLx1DAwskqEuyKL \
|
|
182
|
-
-e CREATE_SUPERUSER=
|
|
182
|
+
-e CREATE_SUPERUSER=no-reply@bugsink.com:admin \
|
|
183
183
|
-e PORT=8000 \
|
|
184
184
|
-p 8000:8000 \
|
|
185
185
|
bugsink-ci
|
|
@@ -214,7 +214,7 @@ jobs:
|
|
|
214
214
|
CODE=$(curl -sS -b cookies.txt -c cookies.txt \
|
|
215
215
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
216
216
|
-H "Referer: http://localhost:8000/accounts/login/" \
|
|
217
|
-
-d "username=
|
|
217
|
+
-d "username=no-reply@bugsink.com&password=admin&csrfmiddlewaretoken=${CSRF}&next=/" \
|
|
218
218
|
-o /dev/null -w "%{http_code}" \
|
|
219
219
|
http://localhost:8000/accounts/login/)
|
|
220
220
|
|
|
@@ -236,3 +236,7 @@ jobs:
|
|
|
236
236
|
fi
|
|
237
237
|
|
|
238
238
|
echo "Login OK and / redirects to /teams/"
|
|
239
|
+
|
|
240
|
+
- name: Show Docker logs
|
|
241
|
+
if: always()
|
|
242
|
+
run: docker logs bugsink-ci || true
|
|
@@ -19,14 +19,14 @@ jobs:
|
|
|
19
19
|
SAMPLES_DIR: ${{ github.workspace }}/event-samples
|
|
20
20
|
steps:
|
|
21
21
|
- name: Check out code
|
|
22
|
-
uses: actions/checkout@
|
|
22
|
+
uses: actions/checkout@v6
|
|
23
23
|
|
|
24
24
|
- name: Install project `pre-commit` hook
|
|
25
25
|
run: |
|
|
26
26
|
cp pre-commit .git/hooks/pre-commit
|
|
27
27
|
|
|
28
28
|
- name: Set up Python 3.12
|
|
29
|
-
uses: actions/setup-python@
|
|
29
|
+
uses: actions/setup-python@v6
|
|
30
30
|
with:
|
|
31
31
|
python-version: "3.12"
|
|
32
32
|
|
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
# Changes
|
|
2
2
|
|
|
3
|
-
## 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
|
+
|
|
18
|
+
## 2.2.1 (22 May 2026)
|
|
19
|
+
|
|
20
|
+
### API
|
|
21
|
+
|
|
22
|
+
* Add issue actions to the canonical API, see #214 and #401.
|
|
23
|
+
* Add canonical API issue comment creation, see #352 and #401.
|
|
24
|
+
* Accept issue friendly IDs in the canonical API, see #389 and #401.
|
|
25
|
+
* Improve OpenAPI endpoint docs, see #390 and #401.
|
|
26
|
+
* Use Bugsink's version as the OpenAPI spec version, see #307.
|
|
27
|
+
|
|
28
|
+
### Smaller fixes
|
|
29
|
+
|
|
30
|
+
* Fix long module names overlapping version values on event detail pages, see #377 and #382.
|
|
31
|
+
* Validate `CREATE_SUPERUSER` email addresses and use the email as username in Docker server-start setup, see #394.
|
|
32
|
+
* Development server: do not send email by default, see d6d5190441b3.
|
|
33
|
+
* Docker: disable Gunicorn's unused control socket, see #405.
|
|
34
|
+
* Sourcemap uploads without a project slug now log server-side context before returning `400`, see #404 and #408.
|
|
35
|
+
|
|
36
|
+
## 2.2.0 (21 May 2026)
|
|
4
37
|
|
|
5
38
|
### Security
|
|
6
39
|
|
|
@@ -26,6 +59,7 @@ https://github.com/bugsink/bugsink/security/advisories/GHSA-5389-f7vh-wxj8
|
|
|
26
59
|
|
|
27
60
|
### Smaller fixes
|
|
28
61
|
|
|
62
|
+
* Fix health-check `ALLOWED_HOSTS`-ignore, see #140, #397
|
|
29
63
|
* Generate an `event_id` on `/store/` when the SDK does not send one, see #383.
|
|
30
64
|
* Refresh issue title fields on every event digest, see #378.
|
|
31
65
|
* Include ingest-dir cleanup in the `vacuum` command and warn about stale ingest-dir files, see 772fb1a9bff6 and
|
|
@@ -2,6 +2,8 @@ import os
|
|
|
2
2
|
|
|
3
3
|
from django.core.management.base import BaseCommand
|
|
4
4
|
from django.contrib.auth import get_user_model
|
|
5
|
+
from django.core.exceptions import ValidationError
|
|
6
|
+
from django.core.validators import validate_email
|
|
5
7
|
|
|
6
8
|
from phonehome.tasks import send_if_due
|
|
7
9
|
|
|
@@ -17,7 +19,7 @@ class Command(BaseCommand):
|
|
|
17
19
|
return
|
|
18
20
|
|
|
19
21
|
if ":" not in os.getenv("CREATE_SUPERUSER"):
|
|
20
|
-
raise ValueError("CREATE_SUPERUSER should be in the format '
|
|
22
|
+
raise ValueError("CREATE_SUPERUSER should be in the format 'email:password'")
|
|
21
23
|
|
|
22
24
|
username, password = os.getenv("CREATE_SUPERUSER").split(":", 1)
|
|
23
25
|
|
|
@@ -28,7 +30,14 @@ class Command(BaseCommand):
|
|
|
28
30
|
|
|
29
31
|
return
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
# Validate only when we're actually creating the user, so existing installations with a stale
|
|
34
|
+
# CREATE_SUPERUSER value keep starting normally.
|
|
35
|
+
try:
|
|
36
|
+
validate_email(username)
|
|
37
|
+
except ValidationError as e:
|
|
38
|
+
raise ValueError("CREATE_SUPERUSER email should be a valid email address") from e
|
|
39
|
+
|
|
40
|
+
User.objects.create_superuser(username=username, email=username, password=password)
|
|
32
41
|
print(f"Superuser created: {username}")
|
|
33
42
|
|
|
34
43
|
def handle(self, *args, **options):
|
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 2,
|
|
21
|
+
__version__ = version = '2.2.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 2, 2)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
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
|
|
|
@@ -6,6 +6,9 @@ from pathlib import Path
|
|
|
6
6
|
|
|
7
7
|
from django.utils.log import DEFAULT_LOGGING
|
|
8
8
|
|
|
9
|
+
from ..version import version as __version__
|
|
10
|
+
|
|
11
|
+
|
|
9
12
|
# We have a single file for our default settings, and expect (if they use the singleserver setup) the end-users to
|
|
10
13
|
# configure their setup using a single bugsink_conf.py also. To be able to have (slightly) different settings for e.g.
|
|
11
14
|
# logging for various commands, we expose a variable I_AM_RUNNING that can be used to determine what command is being
|
|
@@ -90,7 +93,7 @@ REST_FRAMEWORK = {
|
|
|
90
93
|
SPECTACULAR_SETTINGS = {
|
|
91
94
|
'TITLE': 'Bugsink',
|
|
92
95
|
'DESCRIPTION': 'Bugsink API Documentation',
|
|
93
|
-
'VERSION':
|
|
96
|
+
'VERSION': __version__,
|
|
94
97
|
'SERVE_INCLUDE_SCHEMA': False, # keep the docs clean and not document the docs endpoint itself.
|
|
95
98
|
|
|
96
99
|
"SECURITY": [
|
|
@@ -73,11 +73,12 @@ SNAPPEA = {
|
|
|
73
73
|
"PID_FILE": "/tmp/bugsink/snappea.pid", # nosec B108
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
|
77
|
+
# EMAIL_HOST = os.getenv("EMAIL_HOST")
|
|
78
|
+
# EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER")
|
|
79
|
+
# EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD")
|
|
80
|
+
# EMAIL_PORT = 587
|
|
81
|
+
# EMAIL_USE_TLS = True
|
|
81
82
|
|
|
82
83
|
SERVER_EMAIL = DEFAULT_FROM_EMAIL = 'Bugsink Development Server <bugsink@example.org>'
|
|
83
84
|
|
|
@@ -18,7 +18,7 @@ from files.views import chunk_upload, artifact_bundle_assemble, difs_assemble, a
|
|
|
18
18
|
from bugsink.decorators import login_exempt
|
|
19
19
|
|
|
20
20
|
from events.api_views import EventViewSet
|
|
21
|
-
from issues.api_views import IssueViewSet
|
|
21
|
+
from issues.api_views import IssueCommentViewSet, IssueViewSet
|
|
22
22
|
from projects.api_views import ProjectViewSet
|
|
23
23
|
from releases.api_views import ReleaseViewSet
|
|
24
24
|
from teams.api_views import TeamViewSet
|
|
@@ -34,6 +34,7 @@ admin.site.index_title = "Admin" # everyone calls this the "admin" anyway. Let'
|
|
|
34
34
|
|
|
35
35
|
api_router = routers.DefaultRouter()
|
|
36
36
|
api_router.register(r'events', EventViewSet)
|
|
37
|
+
api_router.register(r'issue-comments', IssueCommentViewSet, basename='issue-comment')
|
|
37
38
|
api_router.register(r'issues', IssueViewSet)
|
|
38
39
|
api_router.register(r'projects', ProjectViewSet)
|
|
39
40
|
api_router.register(r'releases', ReleaseViewSet)
|
|
@@ -3,12 +3,13 @@ from rest_framework import viewsets
|
|
|
3
3
|
from rest_framework.exceptions import ValidationError
|
|
4
4
|
from rest_framework.decorators import action
|
|
5
5
|
from rest_framework.response import Response
|
|
6
|
-
from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes, OpenApiResponse
|
|
6
|
+
from drf_spectacular.utils import extend_schema, OpenApiExample, OpenApiParameter, OpenApiTypes, OpenApiResponse
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
from bugsink.utils import assert_
|
|
10
10
|
from bugsink.api_pagination import AscDescCursorPagination
|
|
11
11
|
from bugsink.api_mixins import AtomicRequestMixin
|
|
12
|
+
from issues.models import issue_lookup_kwargs
|
|
12
13
|
|
|
13
14
|
from .models import Event
|
|
14
15
|
from .serializers import EventListSerializer, EventDetailSerializer
|
|
@@ -26,12 +27,6 @@ class EventPagination(AscDescCursorPagination):
|
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
class EventViewSet(AtomicRequestMixin, viewsets.ReadOnlyModelViewSet):
|
|
29
|
-
"""
|
|
30
|
-
LIST requires: ?issue=<uuid>
|
|
31
|
-
Optional: ?order=asc|desc (default: desc)
|
|
32
|
-
LIST omits `data`, ordered by digest_order
|
|
33
|
-
RETRIEVE includes `data` (pure PK lookup; no filters/order applied)
|
|
34
|
-
"""
|
|
35
30
|
queryset = Event.objects.all() # router requirement for basename inference
|
|
36
31
|
serializer_class = EventListSerializer
|
|
37
32
|
pagination_class = EventPagination
|
|
@@ -42,16 +37,19 @@ class EventViewSet(AtomicRequestMixin, viewsets.ReadOnlyModelViewSet):
|
|
|
42
37
|
if "issue" not in query_params:
|
|
43
38
|
raise ValidationError({"issue": ["This field is required."]})
|
|
44
39
|
|
|
45
|
-
|
|
40
|
+
lookup_kwargs = {"issue__" + k: v for k, v in issue_lookup_kwargs(query_params["issue"]).items()}
|
|
41
|
+
return queryset.filter(issue__is_deleted=False, **lookup_kwargs)
|
|
46
42
|
|
|
47
43
|
@extend_schema(
|
|
44
|
+
summary="List events",
|
|
45
|
+
description="List events for an issue. The list response omits the full event `data` payload.",
|
|
48
46
|
parameters=[
|
|
49
47
|
OpenApiParameter(
|
|
50
48
|
name="issue",
|
|
51
|
-
type=OpenApiTypes.
|
|
49
|
+
type=OpenApiTypes.STR,
|
|
52
50
|
location=OpenApiParameter.QUERY,
|
|
53
51
|
required=True,
|
|
54
|
-
description="Filter events by issue UUID (required).",
|
|
52
|
+
description="Filter events by issue UUID or friendly ID (required).",
|
|
55
53
|
),
|
|
56
54
|
OpenApiParameter(
|
|
57
55
|
name="order",
|
|
@@ -66,6 +64,17 @@ class EventViewSet(AtomicRequestMixin, viewsets.ReadOnlyModelViewSet):
|
|
|
66
64
|
def list(self, request, *args, **kwargs):
|
|
67
65
|
return super().list(request, *args, **kwargs)
|
|
68
66
|
|
|
67
|
+
@extend_schema(
|
|
68
|
+
summary="Retrieve an event",
|
|
69
|
+
description=(
|
|
70
|
+
"Retrieve an event by internal Bugsink event UUID. "
|
|
71
|
+
"The detail response includes the full `data` payload."
|
|
72
|
+
),
|
|
73
|
+
responses=EventDetailSerializer,
|
|
74
|
+
)
|
|
75
|
+
def retrieve(self, request, *args, **kwargs):
|
|
76
|
+
return super().retrieve(request, *args, **kwargs)
|
|
77
|
+
|
|
69
78
|
def get_object(self):
|
|
70
79
|
"""
|
|
71
80
|
DRF's get_object(), but we intentionally bypass filter_queryset for detail routes to keep PK lookups
|
|
@@ -94,8 +103,21 @@ class EventViewSet(AtomicRequestMixin, viewsets.ReadOnlyModelViewSet):
|
|
|
94
103
|
return EventDetailSerializer if self.action == "retrieve" else EventListSerializer
|
|
95
104
|
|
|
96
105
|
@extend_schema(
|
|
106
|
+
summary="Render an event stacktrace",
|
|
97
107
|
description="Render the event's stacktrace (frames, source, locals) as Markdown-like text.",
|
|
98
|
-
responses={
|
|
108
|
+
responses={
|
|
109
|
+
200: OpenApiResponse(
|
|
110
|
+
response=str,
|
|
111
|
+
description="Stacktrace as Markdown",
|
|
112
|
+
examples=[
|
|
113
|
+
OpenApiExample(
|
|
114
|
+
"Stacktrace",
|
|
115
|
+
value="Traceback (most rece...",
|
|
116
|
+
response_only=True,
|
|
117
|
+
),
|
|
118
|
+
],
|
|
119
|
+
)
|
|
120
|
+
},
|
|
99
121
|
)
|
|
100
122
|
@action(
|
|
101
123
|
detail=True,
|
|
@@ -238,6 +238,7 @@ def artifact_bundle_assemble(request, organization_slug):
|
|
|
238
238
|
chunk_checksums = data["chunks"]
|
|
239
239
|
projects, error = get_artifact_bundle_projects(data)
|
|
240
240
|
if error is not None:
|
|
241
|
+
logger.warning("Rejected artifact bundle: project slug is missing or does not match an existing project.")
|
|
241
242
|
return JsonResponse({"error": error}, status=400)
|
|
242
243
|
|
|
243
244
|
# sentry-cli >= 3.x calls this endpoint before uploading chunks (to learn which ones are missing), then uploads
|