From c144cc615ccac4486a58b83779fbb632a5fc2aac Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Thu, 2 Jan 2025 13:24:03 +0530 Subject: [PATCH 1/4] feat: workspace home preference model --- .../0089_workspacehomepreference_and_more.py | 46 +++++++++++++++++++ apiserver/plane/db/models/workspace.py | 42 ++++++++++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py diff --git a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py new file mode 100644 index 00000000000..a5787ad29c1 --- /dev/null +++ b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py @@ -0,0 +1,46 @@ +# Generated by Django 4.2.17 on 2025-01-02 07:47 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0088_sticky_sort_order_workspaceuserlink'), + ] + + operations = [ + migrations.CreateModel( + name='WorkspaceHomePreference', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Last Modified At')), + ('deleted_at', models.DateTimeField(blank=True, null=True, verbose_name='Deleted At')), + ('id', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('key', models.CharField(max_length=255)), + ('is_enabled', models.BooleanField(default=True)), + ('config', models.JSONField(default=dict)), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Last Modified By')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workspace_user_home_preferences', to=settings.AUTH_USER_MODEL)), + ('workspace', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workspace_user_home_preferences', to='db.workspace')), + ], + options={ + 'verbose_name': 'Workspace Home Preference', + 'verbose_name_plural': 'Workspace Home Preferences', + 'db_table': 'workspace_home_preferences', + 'ordering': ('-created_at',), + }, + ), + migrations.AddConstraint( + model_name='workspacehomepreference', + constraint=models.UniqueConstraint(condition=models.Q(('deleted_at__isnull', True)), fields=('workspace', 'user', 'key'), name='workspace_user_home_preferences_unique_workspace_user_key_when_deleted_at_null'), + ), + migrations.AlterUniqueTogether( + name='workspacehomepreference', + unique_together={('workspace', 'user', 'key', 'deleted_at')}, + ), + ] diff --git a/apiserver/plane/db/models/workspace.py b/apiserver/plane/db/models/workspace.py index 4a879aacc12..f7ac1a689f4 100644 --- a/apiserver/plane/db/models/workspace.py +++ b/apiserver/plane/db/models/workspace.py @@ -341,4 +341,44 @@ class Meta: ordering = ("-created_at",) def __str__(self): - return f"{self.workspace.id} {self.url}" \ No newline at end of file + return f"{self.workspace.id} {self.url}" + + +class WorkspaceHomePreference(BaseModel): + class HomeWidgetKeys(models.TextChoices): + QUICK_LINKS = "quick_links", "Quick Links" + RECENTS = "recents", "Recents" + MY_STICKIES = "my_stickies", "My Stickies" + NEW_AT_PLANE = "new_at_plane", "New at Plane" + QUICK_TUTORIAL = "quick_tutorial", "Quick Tutorial" + + workspace = models.ForeignKey( + "db.Workspace", + on_delete=models.CASCADE, + related_name="workspace_user_home_preferences", + ) + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="workspace_user_home_preferences", + ) + key = models.CharField(max_length=255) + is_enabled = models.BooleanField(default=True) + config = models.JSONField(default=dict) + + class Meta: + unique_together = ["workspace", "user", "key", "deleted_at"] + constraints = [ + models.UniqueConstraint( + fields=["workspace", "user", "key"], + condition=models.Q(deleted_at__isnull=True), + name="workspace_user_home_preferences_unique_workspace_user_key_when_deleted_at_null", + ) + ] + verbose_name = "Workspace Home Preference" + verbose_name_plural = "Workspace Home Preferences" + db_table = "workspace_home_preferences" + ordering = ("-created_at",) + + def __str__(self): + return f"{self.workspace.name} {self.user.email} {self.key}" From 5f6439675603d1f35e7e4df9f94ac8215f6416b2 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 2 Jan 2025 13:40:40 +0530 Subject: [PATCH 2/4] chore: changed page title to textfield --- .../0089_workspacehomepreference_and_more.py | 106 ++++++++++++++---- apiserver/plane/db/models/page.py | 2 +- 2 files changed, 86 insertions(+), 22 deletions(-) diff --git a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py index a5787ad29c1..9bae2a3bf99 100644 --- a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py +++ b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py @@ -9,38 +9,102 @@ class Migration(migrations.Migration): dependencies = [ - ('db', '0088_sticky_sort_order_workspaceuserlink'), + ("db", "0088_sticky_sort_order_workspaceuserlink"), ] operations = [ migrations.CreateModel( - name='WorkspaceHomePreference', + name="WorkspaceHomePreference", fields=[ - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Last Modified At')), - ('deleted_at', models.DateTimeField(blank=True, null=True, verbose_name='Deleted At')), - ('id', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), - ('key', models.CharField(max_length=255)), - ('is_enabled', models.BooleanField(default=True)), - ('config', models.JSONField(default=dict)), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), - ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Last Modified By')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workspace_user_home_preferences', to=settings.AUTH_USER_MODEL)), - ('workspace', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workspace_user_home_preferences', to='db.workspace')), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField( + auto_now=True, verbose_name="Last Modified At" + ), + ), + ( + "deleted_at", + models.DateTimeField( + blank=True, null=True, verbose_name="Deleted At" + ), + ), + ( + "id", + models.UUIDField( + db_index=True, + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + unique=True, + ), + ), + ("key", models.CharField(max_length=255)), + ("is_enabled", models.BooleanField(default=True)), + ("config", models.JSONField(default=dict)), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "updated_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Last Modified By", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="workspace_user_home_preferences", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "workspace", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="workspace_user_home_preferences", + to="db.workspace", + ), + ), ], options={ - 'verbose_name': 'Workspace Home Preference', - 'verbose_name_plural': 'Workspace Home Preferences', - 'db_table': 'workspace_home_preferences', - 'ordering': ('-created_at',), + "verbose_name": "Workspace Home Preference", + "verbose_name_plural": "Workspace Home Preferences", + "db_table": "workspace_home_preferences", + "ordering": ("-created_at",), }, ), migrations.AddConstraint( - model_name='workspacehomepreference', - constraint=models.UniqueConstraint(condition=models.Q(('deleted_at__isnull', True)), fields=('workspace', 'user', 'key'), name='workspace_user_home_preferences_unique_workspace_user_key_when_deleted_at_null'), + model_name="workspacehomepreference", + constraint=models.UniqueConstraint( + condition=models.Q(("deleted_at__isnull", True)), + fields=("workspace", "user", "key"), + name="workspace_user_home_preferences_unique_workspace_user_key_when_deleted_at_null", + ), ), migrations.AlterUniqueTogether( - name='workspacehomepreference', - unique_together={('workspace', 'user', 'key', 'deleted_at')}, + name="workspacehomepreference", + unique_together={("workspace", "user", "key", "deleted_at")}, + ), + migrations.AlterField( + model_name="page", + name="name", + field=models.TextField(blank=True), ), ] diff --git a/apiserver/plane/db/models/page.py b/apiserver/plane/db/models/page.py index 7ebf5ff6003..91ffcf02371 100644 --- a/apiserver/plane/db/models/page.py +++ b/apiserver/plane/db/models/page.py @@ -20,7 +20,7 @@ class Page(BaseModel): workspace = models.ForeignKey( "db.Workspace", on_delete=models.CASCADE, related_name="pages" ) - name = models.CharField(max_length=255, blank=True) + name = models.TextField(blank=True) description = models.JSONField(default=dict, blank=True) description_binary = models.BinaryField(null=True) description_html = models.TextField(blank=True, default="

") From d74fa1bd4d19e733ab83d5d16b6eba5d22dede95 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Thu, 2 Jan 2025 13:57:05 +0530 Subject: [PATCH 3/4] chore: add sort order --- .../0089_workspacehomepreference_and_more.py | 5 +++++ .../0090_workspacehomepreference_sort_order.py | 14 ++++++++++++++ apiserver/plane/db/models/workspace.py | 1 + 3 files changed, 20 insertions(+) create mode 100644 apiserver/plane/db/migrations/0090_workspacehomepreference_sort_order.py diff --git a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py index 9bae2a3bf99..7b64827124f 100644 --- a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py +++ b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py @@ -107,4 +107,9 @@ class Migration(migrations.Migration): name="name", field=models.TextField(blank=True), ), + migrations.AddField( + model_name='workspacehomepreference', + name='sort_order', + field=models.PositiveIntegerField(default=65535), + ), ] diff --git a/apiserver/plane/db/migrations/0090_workspacehomepreference_sort_order.py b/apiserver/plane/db/migrations/0090_workspacehomepreference_sort_order.py new file mode 100644 index 00000000000..74abac36afa --- /dev/null +++ b/apiserver/plane/db/migrations/0090_workspacehomepreference_sort_order.py @@ -0,0 +1,14 @@ +# Generated by Django 4.2.17 on 2025-01-02 08:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0089_workspacehomepreference_and_more'), + ] + + operations = [ + + ] diff --git a/apiserver/plane/db/models/workspace.py b/apiserver/plane/db/models/workspace.py index f7ac1a689f4..723a2628cd6 100644 --- a/apiserver/plane/db/models/workspace.py +++ b/apiserver/plane/db/models/workspace.py @@ -365,6 +365,7 @@ class HomeWidgetKeys(models.TextChoices): key = models.CharField(max_length=255) is_enabled = models.BooleanField(default=True) config = models.JSONField(default=dict) + sort_order = models.PositiveIntegerField(default=65535) class Meta: unique_together = ["workspace", "user", "key", "deleted_at"] From 0402c7710f8c20a3f417ccb23fbc1ca77c909886 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 2 Jan 2025 19:42:01 +0530 Subject: [PATCH 4/4] chore: added null value in sticky title --- .../db/migrations/0089_workspacehomepreference_and_more.py | 5 +++++ apiserver/plane/db/models/sticky.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py index 9bae2a3bf99..c685af1b346 100644 --- a/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py +++ b/apiserver/plane/db/migrations/0089_workspacehomepreference_and_more.py @@ -107,4 +107,9 @@ class Migration(migrations.Migration): name="name", field=models.TextField(blank=True), ), + migrations.AlterField( + model_name="sticky", + name="name", + field=models.TextField(blank=True, null=True), + ), ] diff --git a/apiserver/plane/db/models/sticky.py b/apiserver/plane/db/models/sticky.py index 96060d9e2e0..a0590306f69 100644 --- a/apiserver/plane/db/models/sticky.py +++ b/apiserver/plane/db/models/sticky.py @@ -7,7 +7,7 @@ class Sticky(BaseModel): - name = models.TextField() + name = models.TextField(null=True, blank=True) description = models.JSONField(blank=True, default=dict) description_html = models.TextField(blank=True, default="

")