diff --git a/src/documents/migrations/0012_savedview_visibility_to_ui_settings.py b/src/documents/migrations/0012_savedview_visibility_to_ui_settings.py index d23e22bdb..792d1d50a 100644 --- a/src/documents/migrations/0012_savedview_visibility_to_ui_settings.py +++ b/src/documents/migrations/0012_savedview_visibility_to_ui_settings.py @@ -3,6 +3,7 @@ from django.db import migrations from django.db import models +# from src-ui/src/app/data/ui-settings.ts DASHBOARD_VIEWS_VISIBLE_IDS_KEY = ( "general-settings:saved-views:dashboard-views-visible-ids" ) @@ -27,12 +28,19 @@ def _set_default_visibility_ids(apps, schema_editor): UiSettings = apps.get_model("documents", "UiSettings") User = apps.get_model("auth", "User") - dashboard_visible_ids = list( - SavedView.objects.filter(show_on_dashboard=True).values_list("id", flat=True), - ) - sidebar_visible_ids = list( - SavedView.objects.filter(show_in_sidebar=True).values_list("id", flat=True), - ) + dashboard_visible_ids_by_owner: dict[int, list[int]] = {} + for owner_id, view_id in SavedView.objects.filter( + owner__isnull=False, + show_on_dashboard=True, + ).values_list("owner_id", "id"): + dashboard_visible_ids_by_owner.setdefault(owner_id, []).append(view_id) + + sidebar_visible_ids_by_owner: dict[int, list[int]] = {} + for owner_id, view_id in SavedView.objects.filter( + owner__isnull=False, + show_in_sidebar=True, + ).values_list("owner_id", "id"): + sidebar_visible_ids_by_owner.setdefault(owner_id, []).append(view_id) for user in User.objects.all(): ui_settings, _ = UiSettings.objects.get_or_create( @@ -46,10 +54,14 @@ def _set_default_visibility_ids(apps, schema_editor): changed = False if current_settings.get(DASHBOARD_VIEWS_VISIBLE_IDS_KEY) is None: - current_settings[DASHBOARD_VIEWS_VISIBLE_IDS_KEY] = dashboard_visible_ids + current_settings[DASHBOARD_VIEWS_VISIBLE_IDS_KEY] = ( + dashboard_visible_ids_by_owner.get(user.id, []) + ) changed = True if current_settings.get(SIDEBAR_VIEWS_VISIBLE_IDS_KEY) is None: - current_settings[SIDEBAR_VIEWS_VISIBLE_IDS_KEY] = sidebar_visible_ids + current_settings[SIDEBAR_VIEWS_VISIBLE_IDS_KEY] = ( + sidebar_visible_ids_by_owner.get(user.id, []) + ) changed = True if changed: @@ -61,27 +73,33 @@ def _restore_visibility_fields(apps, schema_editor): SavedView = apps.get_model("documents", "SavedView") UiSettings = apps.get_model("documents", "UiSettings") - dashboard_visible_ids = set() - sidebar_visible_ids = set() - + dashboard_visible_ids_by_owner: dict[int, set[int]] = {} + sidebar_visible_ids_by_owner: dict[int, set[int]] = {} for ui_settings in UiSettings.objects.all(): current_settings = ui_settings.settings if not isinstance(current_settings, dict): continue - dashboard_visible_ids.update( - _parse_visible_ids(current_settings.get(DASHBOARD_VIEWS_VISIBLE_IDS_KEY)), + dashboard_visible_ids_by_owner[ui_settings.user_id] = _parse_visible_ids( + current_settings.get(DASHBOARD_VIEWS_VISIBLE_IDS_KEY), ) - sidebar_visible_ids.update( - _parse_visible_ids(current_settings.get(SIDEBAR_VIEWS_VISIBLE_IDS_KEY)), + sidebar_visible_ids_by_owner[ui_settings.user_id] = _parse_visible_ids( + current_settings.get(SIDEBAR_VIEWS_VISIBLE_IDS_KEY), ) SavedView.objects.update(show_on_dashboard=False, show_in_sidebar=False) - if dashboard_visible_ids: - SavedView.objects.filter(id__in=dashboard_visible_ids).update( + for owner_id, dashboard_visible_ids in dashboard_visible_ids_by_owner.items(): + if not dashboard_visible_ids: + continue + SavedView.objects.filter( + owner_id=owner_id, + id__in=dashboard_visible_ids, + ).update( show_on_dashboard=True, ) - if sidebar_visible_ids: - SavedView.objects.filter(id__in=sidebar_visible_ids).update( + for owner_id, sidebar_visible_ids in sidebar_visible_ids_by_owner.items(): + if not sidebar_visible_ids: + continue + SavedView.objects.filter(owner_id=owner_id, id__in=sidebar_visible_ids).update( show_in_sidebar=True, ) diff --git a/src/documents/tests/test_migration_saved_view_visibility.py b/src/documents/tests/test_migration_saved_view_visibility.py index 57cd94265..ac4ba7052 100644 --- a/src/documents/tests/test_migration_saved_view_visibility.py +++ b/src/documents/tests/test_migration_saved_view_visibility.py @@ -17,10 +17,10 @@ class TestMigrateSavedViewVisibilityToUiSettings(TestMigrations): self.user_with_empty_settings = User.objects.create(username="user1") self.user_with_existing_settings = User.objects.create(username="user2") - self.user_without_settings = User.objects.create(username="user3") + self.user_with_owned_views = User.objects.create(username="user3") self.user_with_empty_settings_id = self.user_with_empty_settings.id self.user_with_existing_settings_id = self.user_with_existing_settings.id - self.user_without_settings_id = self.user_without_settings.id + self.user_with_owned_views_id = self.user_with_owned_views.id self.dashboard_view = SavedView.objects.create( owner=self.user_with_empty_settings, @@ -43,6 +43,13 @@ class TestMigrateSavedViewVisibilityToUiSettings(TestMigrations): show_in_sidebar=False, sort_field="created", ) + self.other_owner_visible_view = SavedView.objects.create( + owner=self.user_with_owned_views, + name="other-owner-visible", + show_on_dashboard=True, + show_in_sidebar=True, + sort_field="created", + ) UiSettings.objects.create(user=self.user_with_empty_settings, settings={}) UiSettings.objects.create( @@ -83,15 +90,15 @@ class TestMigrateSavedViewVisibilityToUiSettings(TestMigrations): self.assertEqual(existing_settings["preserve"], "value") created_settings = UiSettings.objects.get( - user_id=self.user_without_settings_id, + user_id=self.user_with_owned_views_id, ).settings self.assertCountEqual( created_settings[DASHBOARD_VIEWS_VISIBLE_IDS_KEY], - [self.dashboard_view.id], + [self.other_owner_visible_view.id], ) self.assertCountEqual( created_settings[SIDEBAR_VIEWS_VISIBLE_IDS_KEY], - [self.dashboard_view.id, self.sidebar_only_view.id], + [self.other_owner_visible_view.id], ) @@ -123,6 +130,11 @@ class TestReverseMigrateSavedViewVisibilityFromUiSettings(TestMigrations): name="view-3", sort_field="created", ) + self.view4 = SavedView.objects.create( + owner=user2, + name="view-4", + sort_field="created", + ) UiSettings.objects.create( user=user1, @@ -134,23 +146,30 @@ class TestReverseMigrateSavedViewVisibilityFromUiSettings(TestMigrations): UiSettings.objects.create( user=user2, settings={ - DASHBOARD_VIEWS_VISIBLE_IDS_KEY: [self.view2.id, self.view3.id], - SIDEBAR_VIEWS_VISIBLE_IDS_KEY: [], + DASHBOARD_VIEWS_VISIBLE_IDS_KEY: [ + self.view2.id, + self.view3.id, + self.view4.id, + ], + SIDEBAR_VIEWS_VISIBLE_IDS_KEY: [self.view4.id], }, ) UiSettings.objects.create(user=user3, settings={}) - def test_visibility_fields_restored_from_any_user_visibility(self) -> None: + def test_visibility_fields_restored_from_owner_visibility(self) -> None: SavedView = self.apps.get_model("documents", "SavedView") restored_view1 = SavedView.objects.get(pk=self.view1.id) restored_view2 = SavedView.objects.get(pk=self.view2.id) restored_view3 = SavedView.objects.get(pk=self.view3.id) + restored_view4 = SavedView.objects.get(pk=self.view4.id) self.assertTrue(restored_view1.show_on_dashboard) - self.assertTrue(restored_view2.show_on_dashboard) - self.assertTrue(restored_view3.show_on_dashboard) + self.assertFalse(restored_view2.show_on_dashboard) + self.assertFalse(restored_view3.show_on_dashboard) + self.assertTrue(restored_view4.show_on_dashboard) self.assertFalse(restored_view1.show_in_sidebar) self.assertTrue(restored_view2.show_in_sidebar) self.assertFalse(restored_view3.show_in_sidebar) + self.assertTrue(restored_view4.show_in_sidebar)