From 638af190ef659520ca21e22e016a32e7b8ebc125 Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Mon, 24 Jul 2023 18:14:00 -0400 Subject: [PATCH] feat(dnd-worldmap-removal) Added null checks for columns and fields. --- migrations_lockfile.txt | 2 +- .../0520_migrate_worldmap_widgets.py | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/sentry/migrations/0520_migrate_worldmap_widgets.py diff --git a/migrations_lockfile.txt b/migrations_lockfile.txt index c24c5212670a4b..324bf4a35b3144 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: 0519_remove_repo_name_constraint +sentry: 0520_migrate_worldmap_widgets social_auth: 0002_default_auto_field diff --git a/src/sentry/migrations/0520_migrate_worldmap_widgets.py b/src/sentry/migrations/0520_migrate_worldmap_widgets.py new file mode 100644 index 00000000000000..76cf1b42d9087a --- /dev/null +++ b/src/sentry/migrations/0520_migrate_worldmap_widgets.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.20 on 2023-07-24 21:37 + +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 countr_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 = False + + dependencies = [ + ("sentry", "0519_remove_repo_name_constraint"), + ] + + operations = [ + migrations.RunPython( + migrate_worldmap_widgets_to_table_widgets, + migrations.RunPython.noop, + hints={"tables": ["sentry_dashboardwidgetquery", "sentry_dashboardwidget"]}, + ), + ]