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.
- {bugsink-2.2.1 → bugsink-2.2.2}/CHANGELOG.md +15 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/PKG-INFO +1 -1
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/send_json.py +10 -1
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/_version.py +3 -3
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/app_settings.py +4 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_templates/docker.py.template +1 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_templates/local.py.template +1 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_templates/singleserver.py.template +1 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/PKG-INFO +1 -1
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/forms.py +9 -8
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_edit.html +1 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/tests.py +25 -1
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/models.py +13 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/tests.py +25 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/.bandit +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/.coveragerc +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/.github/dependabot.yml +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/.github/workflows/ci.yml +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/.github/workflows/copilot-setup-steps.yml +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/.gitignore +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/AGENTS.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/CLA.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/CONTRIBUTING.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/Dockerfile +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/Dockerfile.fromwheel +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/LICENSE +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/README.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/SECURITY.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/forms.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0002_alter_messagingserviceconfig_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0003_messagingserviceconfig_last_failure_error_message_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0004_alter_messagingserviceconfig_kind.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/base.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/discord.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/mattermost.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/slack.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/service_backends/webhook_security.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/templates/mails/issue_alert.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/templates/mails/issue_alert.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/alerts/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/api/LICENSE +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/api/README.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/api/event.schema.altered.json +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/api/event.schema.json +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/future_python.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/check_migrations.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/cleanup_objectstorage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/convert_mariadb_uuids.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/create_auth_token.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/fetch_event_schema_json.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/makemigrations.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/migrate.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/migrate_to_current_objectstorage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/modelcounts.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/munin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/prestart.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/raise_exception.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/send_bomb.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/showstat.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/stress_test.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/vacuum.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/0002_cachedmodelcount.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/0003_add_description_to_authtoken.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/templates/bsmain/auth_token_list.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/test_vacuum.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bsmain/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_fields.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_mixins.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_pagination.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/api_serializers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/authentication.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/conf_utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/context_processors.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/debug_views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/decorators.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/email_backends.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/event_schema.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/exceptions.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/gunicorn.docker.conf.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/middleware.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/moreiterutils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/period_utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/permissions.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/pygments_extensions.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/create_conf.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/manage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/runsnappea.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/show_version.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/scripts/util.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/settings/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/settings/default.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/settings/development.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/streams.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/test_api.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/test_utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/timed_sqlite_backend/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/timed_sqlite_backend/base.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/tooling.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/transaction.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/version.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/volume_based_condition.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink/wsgi.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/SOURCES.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/dependency_links.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/entry_points.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/requires.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/bugsink.egg-info/top_level.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/builddocker.bash +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/buildxdocker.bash +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/compat/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/compat/auth.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/compat/dsn.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/compat/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/compat/timestamp.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/compat/vars.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/docker-compose-sample.yaml +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/LICENSE +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/base.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/database_backend/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/database_backend/base.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/middleware.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ee/tenants/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/api_views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/factories.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/cleanup_eventstorage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/delete_by_age_until_under_retention_max.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/delete_old_events.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/fix_project_digest_order.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/make_consistent.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/migrate_to_current_eventstorage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/management/commands/nuke_events.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/markdown_stacktrace.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0002_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0003_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0004_b_squashed.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0004_event_irrelevance_for_retention.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0005_event_events_even_project_abe572_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0006_event_never_evict.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0007_set_never_evict.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0008_remove_event_events_even_project_abe572_idx_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0009_event_events_even_issue_i_90497b_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0010_rename_ingest_order_event_digest_order_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0011_remove_event_events_even_project_adcdee_idx_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0012_event_ingested_at.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0013_harmonize_foogested_at.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0014_event_grouping.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0015_set_event_grouping.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0016_truncate_exception_type_128.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0017_alter_event_calculated_type_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0018_remove_event_has_exception_remove_event_has_logentry.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0019_event_storage_backend.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0020_remove_events_with_null_issue_or_grouping.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0021_alter_do_nothing.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0022_alter_event_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0023_event_remote_addr.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0024_remove_event_debug_info.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0025_fix_never_evict.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0026_event_events_even_project_625413_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0027_event_project_digest_order.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/0028_event_events_even_digeste_bf21dd_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/renderers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/retention.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/serializers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/storage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/storage_registry.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/templates/events/event_stacktrace.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/test_api.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/ua_stuff.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/events/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/management/commands/delete_legacy_sourcemaps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/management/commands/vacuum_files.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0001_initial.py +0 -0
- {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
- {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0003_file_storage_backend.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/0004_alter_filemetadata_unique_together_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/minidump.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/object_kinds.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/storage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/storage_registry.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/test_vacuum.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/files/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/event_counter.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/exceptions.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/filestore.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/header_validators.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/management/commands/vacuum_ingest_dir.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/migrations/0001_set_sqlite_wal.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/migrations/0002_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/parsers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/ingest/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/api_views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/factories.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/forms.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/markdown_issue.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0002_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0003_alter_turningpoint_triggering_event.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0004_b_squashed.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0004_rename_event_count_issue_digested_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0005_rename_ingest_order_issue_digest_order_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0006_issue_next_unmute_check.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0007_alter_turningpoint_options.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0008_issue_stored_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0009_fill_stored_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0010_issue_list_indexes.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0011_truncate_exception_type_128.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0012_alter_issue_calculated_type_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0013_fix_issue_stored_event_counts.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0014_grouping_grouping_key_hash.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0015_set_grouping_hash.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0016_alter_grouping_unique_together.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0017_issue_list_indexes_must_start_with_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0018_issue_is_deleted.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0019_alter_grouping_grouping_key_hash.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0020_remove_objects_with_null_issue.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0021_alter_do_nothing.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0022_turningpoint_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0023_turningpoint_set_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0024_turningpoint_project_alter_not_null.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/0025_alter_grouping_project_alter_issue_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/regressions.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/serializers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/_event_nav.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/base.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/breadcrumbs.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/event_404.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/event_details.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/event_list.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/grouping.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/history.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/issue_list.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/stacktrace.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/templates/issues/tags.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/test_api.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/issues/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/manage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/bursty_data.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/context_managers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/management/commands/pftest_search.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/README.md +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/df-day.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/event_ingest_count-day.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/response_time_api_avg-day.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/response_time_api_max-day.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/snappea_queue_size-day.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/performance/stress-with-eviction/total_requests-day.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/management/commands/print_phonehome.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0001_b_squashed_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0002_create_installation_id.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0002_installation_email_quota_usage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0003_installation_ingest_quotas.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0003_outboundmessage.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0004_installation_created_at.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0004_installation_quota_exceeded_reason.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0005_installation_silence_email_system_warning.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0005_reset_quota_exceeded_until.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/0006_recalculate_installation_next_quota_check.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/phonehome/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/pre-commit +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/api_views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/context_processors.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0002_b_squashed_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0002_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0003_project_projects_pr_name_11d782_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0003_project_retention_max_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0004_project_quota_exceeded_until.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0005_project_ingested_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0006_initial_ingested_count_value.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0007_rename_ingested_event_count_project_digested_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0008_project_next_quota_check.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0009_alter_project_visibility.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0010_project_stored_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0011_fill_stored_event_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0012_project_is_deleted.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0013_delete_objects_pointing_to_null_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0014_alter_projectmembership_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0015_project_quota_exceeded_reason.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0016_reset_quota_exceeded_until.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/0017_project_issue_count.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/serializers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite_new_user.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/mails/project_membership_invite_new_user.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_alerts_setup.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_list.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_member_settings.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_members.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_members_accept.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_members_invite.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_messaging_service_edit.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_messaging_service_new.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_new.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_javascript.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_php.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/templates/projects/project_sdk_setup_python.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/test_api.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/projects/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/pyproject.toml +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/api_views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0002_release_releases_re_sort_ep_5c07c8_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0003_alter_release_project.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/0004_fix_indexes.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/serializers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/test_api.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/releases/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/requirements.development.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/requirements.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/LICENSE +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/assemble.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/minidump.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/stacktraces/functions.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/stacktraces/platform.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/stacktraces/processing.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/utils/safe.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry/utils/strings.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry_sdk_extensions/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry_sdk_extensions/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/sentry_sdk_extensions/transport.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/setup.cfg +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/datastructures.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/dbrouters.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/decorators.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/example_tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/foreman.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/commands/checksnappea.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/management/commands/runsnappea.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0002_create_models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0003_task_created_at.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0004_task_snappea_tas_created_eb0824_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/0005_stat.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/settings.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/stats.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/snappea/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/favicon.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {bugsink-2.2.1 → bugsink-2.2.2}/static/images/bugsink-logo-dark.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/images/bugsink-logo.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/images/lang-javascript.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/images/lang-php.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/images/lang-python.png +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/entity_edit.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/issue_history.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/issue_list.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/issue_stacktrace.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/project_list.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/team_list.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/static/js/user_list.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/init_tags.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/vacuum_eventless_issuetags.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/management/commands/vacuum_tags.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0002_no_cascade.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0003_remove_objects_with_null_issue.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0004_alter_do_nothing.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/0005_alter_eventtag_project_alter_issuetag_project_and_more.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/search.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tags/utils.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/api_views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/forms.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0001_b_squashed_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0002_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0002_team_teams_team_name_43e047_idx.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0003_alter_team_visibility.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/0004_remove_team_slug.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/serializers.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite_new_user.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/mails/team_membership_invite_new_user.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_edit.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_list.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_member_settings.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_members.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_members_accept.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_members_invite.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/templates/teams/team_new.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/test_api.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/urls.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/teams/views.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/400.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/403.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/403_csrf.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/404.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/4xx_5xx_api.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/500.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/503.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/admin/change_form_object_tools.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/counts.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/csrf_debug.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/login.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/bugsink/settings.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/robots.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/templates/signup.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static/css/dist/styles.css +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/.gitignore +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/package-lock.json +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/package.json +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/postcss.config.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/src/styles.css +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/static_src/tailwind.config.js +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/bare_base.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/barest_base.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/base.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templates/tailwind_forms/formfield.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/add_to_qs.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/code.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/issues.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/stricter_templates.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/tailwind_forms.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/user.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/templatetags/version.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/theme/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tools/is_tracked_by_tailwind.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/tools/strip-trailing-whitespace.sh +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/admin.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/apps.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/forms.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/management/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/management/commands/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/management/commands/send_welcome_email.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0001_initial.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0002_user_theme_preference.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0003_user_language.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/0004_alter_user_language.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/migrations/__init__.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/models.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/tasks.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/confirm_email.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/confirm_email.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/reset_password_email.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/reset_password_email.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/welcome_email.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/mails/welcome_email.txt +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/confirm_email.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/confirm_email_sent.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/logged_out.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/preferences.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/request_reset_password.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/resend_confirmation.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/reset_password.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/reset_password_email_sent.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/user_edit.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/templates/users/user_list.html +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/tests.py +0 -0
- {bugsink-2.2.1 → bugsink-2.2.2}/users/urls.py +0 -0
- {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
|
|
@@ -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
|
|
|
@@ -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
|
|
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
|
-
#
|
|
139
|
-
#
|
|
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
|
|
|
@@ -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.
|
|
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
|
{bugsink-2.2.1 → bugsink-2.2.2}/alerts/migrations/0002_alter_messagingserviceconfig_project.py
RENAMED
|
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
|
{bugsink-2.2.1 → bugsink-2.2.2}/bsmain/management/commands/migrate_to_current_objectstorage.py
RENAMED
|
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
|
|
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
|