diff --git a/migrations_lockfile.txt b/migrations_lockfile.txt index 8fa2dc43e23c65..70d84e2d2b1928 100644 --- a/migrations_lockfile.txt +++ b/migrations_lockfile.txt @@ -6,5 +6,5 @@ To resolve this, rebase against latest master and regenerate your migration. Thi will then be regenerated, and you should be able to merge without conflicts. nodestore: 0002_nodestore_no_dictfield -sentry: 0520_add_flat_file_index_table +sentry: 0521_migrate_world_map_widgets social_auth: 0002_default_auto_field diff --git a/src/sentry/migrations/0521_migrate_world_map_widgets.py b/src/sentry/migrations/0521_migrate_world_map_widgets.py new file mode 100644 index 00000000000000..667769e51f1c44 --- /dev/null +++ b/src/sentry/migrations/0521_migrate_world_map_widgets.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.20 on 2023-07-25 13:35 + +from django.db import migrations + +from sentry.models import DashboardWidgetQuery +from sentry.new_migrations.migrations import CheckedMigration + + +def migrate_worldmap_widgets_to_table_widgets(apps, schema_editor): + # World map visulization has display_type 5 + widgetQueries = DashboardWidgetQuery.objects.select_related("widget").filter( + widget__display_type=5 + ) + + for widgetQuery in widgetQueries: + # Change widget display type from world_map:5 to table:4 + widgetQuery.widget.display_type = 4 + + # Ensure condition has country_code check + if "has:geo.country_code" not in widgetQuery.conditions: + widgetQuery.conditions = widgetQuery.conditions + " has:geo.country_code" + + # Add region and country_code columns + if not widgetQuery.columns: + widgetQuery.columns = [] + if "geo.region" not in widgetQuery.columns: + widgetQuery.columns.insert(0, "geo.region") + if "geo.country_code" not in widgetQuery.columns: + widgetQuery.columns.insert(0, "geo.country_code") + + # Add region and country_code as fields + if not widgetQuery.fields: + widgetQuery.fields = [] + if "geo.region" not in widgetQuery.fields: + widgetQuery.fields.insert(0, "geo.region") + if "geo.country_code" not in widgetQuery.fields: + widgetQuery.fields.insert(0, "geo.country_code") + + widgetQuery.widget.save() + widgetQuery.save() + + +class Migration(CheckedMigration): + # This flag is used to mark that a migration shouldn't be automatically run in production. For + # the most part, this should only be used for operations where it's safe to run the migration + # after your code has deployed. So this should not be used for most operations that alter the + # schema of a table. + # Here are some things that make sense to mark as dangerous: + # - Large data migrations. Typically we want these to be run manually by ops so that they can + # be monitored and not block the deploy for a long period of time while they run. + # - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to + # have ops run this and not block the deploy. Note that while adding an index is a schema + # change, it's completely safe to run the operation after the code has deployed. + is_dangerous = True + + dependencies = [ + ("sentry", "0520_add_flat_file_index_table"), + ] + + operations = [ + migrations.RunPython( + migrate_worldmap_widgets_to_table_widgets, + migrations.RunPython.noop, + hints={"tables": ["sentry_dashboardwidgetquery", "sentry_dashboardwidget"]}, + ), + ]