Skip to content

Commit

Permalink
feat(dnd-worldmap-removal) Added null checks for columns and fields. (#…
Browse files Browse the repository at this point in the history
…53475)

- Migration already approved here:
[PR](#53109) but it had a
runtime error.
- Added null checks for columns and fields in DashboardWidgetQuery.
- Should fix run time error from previous migration attempt: 
<img width="488" alt="Screenshot 2023-07-24 at 6 17 48 PM"
src="https://github.com/getsentry/sentry/assets/60121741/49fe3214-77c3-4bdb-b02f-355eb567f1d3">

- Link to failure:
https://deploy.getsentry.net/go/tab/build/detail/deploy-getsentry-backend-us/63/migrations/1/migrations
- Tested it out locally with NULL columns.

Co-authored-by: Abdullah Khan <abdullahkhan@PG9Y57YDXQ.local>
  • Loading branch information
Abdkhan14 and Abdullah Khan authored Jul 25, 2023
1 parent 64fba06 commit 29b55e0
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 1 deletion.
2 changes: 1 addition & 1 deletion migrations_lockfile.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
66 changes: 66 additions & 0 deletions src/sentry/migrations/0521_migrate_world_map_widgets.py
Original file line number Diff line number Diff line change
@@ -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"]},
),
]

0 comments on commit 29b55e0

Please sign in to comment.