Skip to content

ref(dashboards): Remove DashboardLastVisited model#114929

Merged
wedamija merged 1 commit intomasterfrom
flag-cleanup/remove-dashboard-last-visited-model
May 6, 2026
Merged

ref(dashboards): Remove DashboardLastVisited model#114929
wedamija merged 1 commit intomasterfrom
flag-cleanup/remove-dashboard-last-visited-model

Conversation

@wedamija
Copy link
Copy Markdown
Member

@wedamija wedamija commented May 5, 2026

The DashboardLastVisited model was added to back per-user "recently viewed" sorting and per-user last_visited reads gated on organizations:dashboards-starred-reordering. That flag was removed (#114817), the writes were removed in the same PR's follow-up, so the model has no remaining readers or writers in product code.

This PR removes the model class, all code references (testutils backups, backup comparators), and adds a MOVE_TO_PENDING migration that drops the FK constraints and removes the model from Django's migration state. The table is preserved for rolling deploy safety; a follow-up PR drops it.

@wedamija wedamija requested a review from narsaynorath May 5, 2026 23:12
@wedamija wedamija requested review from a team as code owners May 5, 2026 23:12
@github-actions github-actions Bot added the Scope: Backend Automatically applied to PRs that change backend components label May 5, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

This PR has a migration; here is the generated SQL for src/sentry/migrations/1081_remove_dashboardlastvisited.py

for 1081_remove_dashboardlastvisited in sentry

--
-- Alter field dashboard on dashboardlastvisited
--
SET CONSTRAINTS "sentry_dashboardlast_dashboard_id_31d3a51b_fk_sentry_da" IMMEDIATE; ALTER TABLE "sentry_dashboardlastvisited" DROP CONSTRAINT "sentry_dashboardlast_dashboard_id_31d3a51b_fk_sentry_da";
--
-- Alter field member on dashboardlastvisited
--
SET CONSTRAINTS "sentry_dashboardlast_member_id_28801a0a_fk_sentry_or" IMMEDIATE; ALTER TABLE "sentry_dashboardlastvisited" DROP CONSTRAINT "sentry_dashboardlast_member_id_28801a0a_fk_sentry_or";
--
-- Moved model DashboardLastVisited to pending deletion state
--
-- (no-op)

The DashboardLastVisited model was added to back per-user
"recently viewed" sorting and per-user last_visited reads gated on
organizations:dashboards-starred-reordering. That flag was removed
(#114817), the writes were removed in the same PR's follow-up, so the
model has no remaining readers or writers in product code.

This PR removes the model class, all code references (testutils backups,
backup comparators), and adds a MOVE_TO_PENDING migration that drops the
FK constraints and removes the model from Django's migration state. The
table is preserved for rolling deploy safety; a follow-up PR drops it.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@wedamija wedamija force-pushed the flag-cleanup/remove-dashboard-last-visited-model branch from d61c627 to 2f09628 Compare May 6, 2026 19:06
@wedamija wedamija enabled auto-merge (squash) May 6, 2026 19:08
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

This PR has a migration; here is the generated SQL for src/sentry/migrations/1083_remove_dashboardlastvisited.py

for 1083_remove_dashboardlastvisited in sentry

--
-- Alter field dashboard on dashboardlastvisited
--
SET CONSTRAINTS "sentry_dashboardlast_dashboard_id_31d3a51b_fk_sentry_da" IMMEDIATE; ALTER TABLE "sentry_dashboardlastvisited" DROP CONSTRAINT "sentry_dashboardlast_dashboard_id_31d3a51b_fk_sentry_da";
--
-- Alter field member on dashboardlastvisited
--
SET CONSTRAINTS "sentry_dashboardlast_member_id_28801a0a_fk_sentry_or" IMMEDIATE; ALTER TABLE "sentry_dashboardlastvisited" DROP CONSTRAINT "sentry_dashboardlast_member_id_28801a0a_fk_sentry_or";
--
-- Moved model DashboardLastVisited to pending deletion state
--
-- (no-op)

@wedamija wedamija merged commit ded143c into master May 6, 2026
82 of 83 checks passed
@wedamija wedamija deleted the flag-cleanup/remove-dashboard-last-visited-model branch May 6, 2026 19:23
wedamija added a commit that referenced this pull request May 7, 2026
…_PENDING (#115087)

The `historical_silo_assignments` check in `SafeDeleteModel` only fired
for `DeletionAction.DELETE`, with an early return for `MOVE_TO_PENDING`.
That missed the dangerous case where the model class is deleted in the
same PR as the `MOVE_TO_PENDING` migration: once the class is gone, the
silo router can no longer resolve the table via the live app registry,
and without a historical entry `allow_migrate` returns False so the
migration silently no-ops in prod.

This is what bit us in #114929 (`dashboardlastvisited`). This caused an
error in production where we couldn't delete related rows from
`OrganizationMember`, and this was only fixed when we dropped the table
fully in #114930.

This pr makes sure that the test fails if we move a model to pending and
don't add the historical routing.

Also update the skill to guide llms to always add this historical entry.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
constantinius pushed a commit that referenced this pull request May 8, 2026
…_PENDING (#115087)

The `historical_silo_assignments` check in `SafeDeleteModel` only fired
for `DeletionAction.DELETE`, with an early return for `MOVE_TO_PENDING`.
That missed the dangerous case where the model class is deleted in the
same PR as the `MOVE_TO_PENDING` migration: once the class is gone, the
silo router can no longer resolve the table via the live app registry,
and without a historical entry `allow_migrate` returns False so the
migration silently no-ops in prod.

This is what bit us in #114929 (`dashboardlastvisited`). This caused an
error in production where we couldn't delete related rows from
`OrganizationMember`, and this was only fixed when we dropped the table
fully in #114930.

This pr makes sure that the test fails if we move a model to pending and
don't add the historical routing.

Also update the skill to guide llms to always add this historical entry.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Scope: Backend Automatically applied to PRs that change backend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants