From f94b9a65825d89592eafbd1d81cfff49bf1b5e59 Mon Sep 17 00:00:00 2001 From: sangeethailango Date: Tue, 6 Jan 2026 13:02:12 +0530 Subject: [PATCH 1/3] migration: added getting_started_checklist and tips field --- ...mber_getting_started_checklist_and_more.py | 42 +++++++++++++++++++ apps/api/plane/db/models/workspace.py | 20 +++++++++ 2 files changed, 62 insertions(+) create mode 100644 apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py diff --git a/apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py b/apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py new file mode 100644 index 00000000000..f17e3054874 --- /dev/null +++ b/apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py @@ -0,0 +1,42 @@ +# Generated by Django 4.2.27 on 2026-01-06 07:29 + +from django.db import migrations, models +import plane.db.models.workspace + + +def get_default_checklist(): + return { + "project_created": True, + "project_joined": True, + "work_item_created": True, + "team_members_invited": True, + "page_created": True, + "ai_chat_tried": True, + "integration_linked": True, + "view_created": True, + "sticky_created": True, + } + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0113_webhook_version'), + ] + + operations = [ + migrations.AddField( + model_name='workspacemember', + name='getting_started_checklist', + field=models.JSONField(default=get_default_checklist), + ), + migrations.AlterField( + model_name='workspacemember', + name='getting_started_checklist', + field=models.JSONField(default=plane.db.models.workspace.get_default_checklist), + ), + migrations.AddField( + model_name='workspacemember', + name='tips', + field=models.JSONField(default=plane.db.models.workspace.get_default_tips), + ), + ] diff --git a/apps/api/plane/db/models/workspace.py b/apps/api/plane/db/models/workspace.py index 9690168a11a..b89847c2352 100644 --- a/apps/api/plane/db/models/workspace.py +++ b/apps/api/plane/db/models/workspace.py @@ -122,6 +122,24 @@ def get_default_product_tour(): } +def get_default_checklist(): + return { + "project_created": False, + "project_joined": False, + "work_item_created": False, + "team_members_invited": False, + "page_created": False, + "ai_chat_tried": False, + "integration_linked": False, + "view_created": False, + "sticky_created": False, + } + + +def get_default_tips(): + return {"mobile_app_download": False} + + class Workspace(BaseModel): TIMEZONE_CHOICES = tuple(zip(pytz.common_timezones, pytz.common_timezones)) @@ -214,6 +232,8 @@ class WorkspaceMember(BaseModel): default_props = models.JSONField(default=get_default_props) issue_props = models.JSONField(default=get_issue_props) is_active = models.BooleanField(default=True) + getting_started_checklist = models.JSONField(default=get_default_checklist) + tips = models.JSONField(default=get_default_tips) class Meta: unique_together = ["workspace", "member", "deleted_at"] From 427a894c94b1525a65eea97caea08bc90d7d812e Mon Sep 17 00:00:00 2001 From: sangeethailango Date: Wed, 7 Jan 2026 15:54:24 +0530 Subject: [PATCH 2/3] fix: remove defaults and added explored_features field --- ...kspacemember_explored_features_and_more.py | 28 +++++++++++++ ...mber_getting_started_checklist_and_more.py | 42 ------------------- apps/api/plane/db/models/workspace.py | 23 ++-------- 3 files changed, 31 insertions(+), 62 deletions(-) create mode 100644 apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py delete mode 100644 apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py diff --git a/apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py b/apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py new file mode 100644 index 00000000000..2367e478e1f --- /dev/null +++ b/apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.27 on 2026-01-07 10:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0113_webhook_version'), + ] + + operations = [ + migrations.AddField( + model_name='workspacemember', + name='explored_features', + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name='workspacemember', + name='getting_started_checklist', + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name='workspacemember', + name='tips', + field=models.JSONField(default=dict), + ), + ] diff --git a/apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py b/apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py deleted file mode 100644 index f17e3054874..00000000000 --- a/apps/api/plane/db/migrations/0114_workspacemember_getting_started_checklist_and_more.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-06 07:29 - -from django.db import migrations, models -import plane.db.models.workspace - - -def get_default_checklist(): - return { - "project_created": True, - "project_joined": True, - "work_item_created": True, - "team_members_invited": True, - "page_created": True, - "ai_chat_tried": True, - "integration_linked": True, - "view_created": True, - "sticky_created": True, - } - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0113_webhook_version'), - ] - - operations = [ - migrations.AddField( - model_name='workspacemember', - name='getting_started_checklist', - field=models.JSONField(default=get_default_checklist), - ), - migrations.AlterField( - model_name='workspacemember', - name='getting_started_checklist', - field=models.JSONField(default=plane.db.models.workspace.get_default_checklist), - ), - migrations.AddField( - model_name='workspacemember', - name='tips', - field=models.JSONField(default=plane.db.models.workspace.get_default_tips), - ), - ] diff --git a/apps/api/plane/db/models/workspace.py b/apps/api/plane/db/models/workspace.py index b89847c2352..fcd34c7b5b5 100644 --- a/apps/api/plane/db/models/workspace.py +++ b/apps/api/plane/db/models/workspace.py @@ -122,24 +122,6 @@ def get_default_product_tour(): } -def get_default_checklist(): - return { - "project_created": False, - "project_joined": False, - "work_item_created": False, - "team_members_invited": False, - "page_created": False, - "ai_chat_tried": False, - "integration_linked": False, - "view_created": False, - "sticky_created": False, - } - - -def get_default_tips(): - return {"mobile_app_download": False} - - class Workspace(BaseModel): TIMEZONE_CHOICES = tuple(zip(pytz.common_timezones, pytz.common_timezones)) @@ -232,8 +214,9 @@ class WorkspaceMember(BaseModel): default_props = models.JSONField(default=get_default_props) issue_props = models.JSONField(default=get_issue_props) is_active = models.BooleanField(default=True) - getting_started_checklist = models.JSONField(default=get_default_checklist) - tips = models.JSONField(default=get_default_tips) + getting_started_checklist = models.JSONField(default=dict) + tips = models.JSONField(default=dict) + explored_features = models.JSONField(default=dict) class Meta: unique_together = ["workspace", "member", "deleted_at"] From ef64d1a038d2b730fe93fe06e1d963b5685f9eb4 Mon Sep 17 00:00:00 2001 From: sangeethailango Date: Tue, 13 Jan 2026 16:15:23 +0530 Subject: [PATCH 3/3] fix: added user table migration --- ..._workspacemember_explored_features_and_more.py} | 14 ++++++++++++-- apps/api/plane/db/models/user.py | 10 ++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) rename apps/api/plane/db/migrations/{0114_workspacemember_explored_features_and_more.py => 0116_workspacemember_explored_features_and_more.py} (56%) diff --git a/apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py b/apps/api/plane/db/migrations/0116_workspacemember_explored_features_and_more.py similarity index 56% rename from apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py rename to apps/api/plane/db/migrations/0116_workspacemember_explored_features_and_more.py index 2367e478e1f..38e231e0eb2 100644 --- a/apps/api/plane/db/migrations/0114_workspacemember_explored_features_and_more.py +++ b/apps/api/plane/db/migrations/0116_workspacemember_explored_features_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.27 on 2026-01-07 10:17 +# Generated by Django 4.2.27 on 2026-01-13 10:38 from django.db import migrations, models @@ -6,10 +6,20 @@ class Migration(migrations.Migration): dependencies = [ - ('db', '0113_webhook_version'), + ('db', '0115_auto_20260105_1406'), ] operations = [ + migrations.AddField( + model_name='profile', + name='notification_view_mode', + field=models.CharField(choices=[('full', 'Full'), ('compact', 'Compact')], default='full', max_length=255), + ), + migrations.AddField( + model_name='user', + name='is_password_reset_required', + field=models.BooleanField(default=False), + ), migrations.AddField( model_name='workspacemember', name='explored_features', diff --git a/apps/api/plane/db/models/user.py b/apps/api/plane/db/models/user.py index b0f571be9c8..cae98d98d26 100644 --- a/apps/api/plane/db/models/user.py +++ b/apps/api/plane/db/models/user.py @@ -84,7 +84,7 @@ class User(AbstractBaseUser, PermissionsMixin): is_staff = models.BooleanField(default=False) is_email_verified = models.BooleanField(default=False) is_password_autoset = models.BooleanField(default=False) - + is_password_reset_required = models.BooleanField(default=False) # random token generated token = models.CharField(max_length=64, blank=True) @@ -192,6 +192,10 @@ class Profile(TimeAuditModel): FRIDAY = 5 SATURDAY = 6 + class NotificationViewMode(models.TextChoices): + FULL = "full", "Full" + COMPACT = "compact", "Compact" + START_OF_THE_WEEK_CHOICES = ( (SUNDAY, "Sunday"), (MONDAY, "Monday"), @@ -221,7 +225,9 @@ class Profile(TimeAuditModel): billing_address = models.JSONField(null=True) has_billing_address = models.BooleanField(default=False) company_name = models.CharField(max_length=255, blank=True) - + notification_view_mode = models.CharField( + max_length=255, choices=NotificationViewMode.choices, default=NotificationViewMode.FULL + ) is_smooth_cursor_enabled = models.BooleanField(default=False) # mobile is_mobile_onboarded = models.BooleanField(default=False)