From c166005efeeb0b8e054215f941d9bfb1f19f443d Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Mon, 4 Nov 2024 20:44:09 +0530 Subject: [PATCH 1/4] chore: intake migration --- ...0083_device_workspace_timezone_and_more.py | 62 +++++++++++++++++++ apiserver/plane/db/models/deploy_board.py | 5 +- apiserver/plane/db/models/inbox.py | 15 ++++- apiserver/plane/db/models/label.py | 16 +++-- apiserver/plane/db/models/user.py | 12 ++++ 5 files changed, 103 insertions(+), 7 deletions(-) diff --git a/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py b/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py index 587ee880006..4e2de063eda 100644 --- a/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py +++ b/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py @@ -871,4 +871,66 @@ class Migration(migrations.Migration): "db_table": "device_sessions", }, ), + migrations.AddField( + model_name="deployboard", + name="is_disabled", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="inboxissue", + name="extra", + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name="inboxissue", + name="source_email", + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name="user", + name="bot_type", + field=models.CharField( + blank=True, max_length=30, null=True, verbose_name="Bot Type" + ), + ), + migrations.AlterField( + model_name="deployboard", + name="entity_name", + field=models.CharField(blank=True, max_length=30, null=True), + ), + migrations.AlterField( + model_name="inboxissue", + name="source", + field=models.CharField( + blank=True, default="IN_APP", max_length=255, null=True + ), + ), + migrations.RemoveConstraint( + model_name="label", + name="label_unique_name_project_when_deleted_at_null", + ), + migrations.AlterUniqueTogether( + name="label", + unique_together=set(), + ), + migrations.AddConstraint( + model_name="label", + constraint=models.UniqueConstraint( + condition=models.Q( + ("deleted_at__isnull", True), ("project__isnull", True) + ), + fields=("name",), + name="unique_name_when_project_null_and_not_deleted", + ), + ), + migrations.AddConstraint( + model_name="label", + constraint=models.UniqueConstraint( + condition=models.Q( + ("deleted_at__isnull", True), ("project__isnull", False) + ), + fields=("project", "name"), + name="unique_project_name_when_not_deleted", + ), + ), ] diff --git a/apiserver/plane/db/models/deploy_board.py b/apiserver/plane/db/models/deploy_board.py index da9476f16c0..2bffe57962e 100644 --- a/apiserver/plane/db/models/deploy_board.py +++ b/apiserver/plane/db/models/deploy_board.py @@ -20,12 +20,14 @@ class DeployBoard(WorkspaceBaseModel): ("cycle", "Task"), ("page", "Page"), ("view", "View"), + ("intake", "Intake"), ) entity_identifier = models.UUIDField(null=True) entity_name = models.CharField( max_length=30, - choices=TYPE_CHOICES, + null=True, + blank=True, ) anchor = models.CharField( max_length=255, default=get_anchor, unique=True, db_index=True @@ -41,6 +43,7 @@ class DeployBoard(WorkspaceBaseModel): is_votes_enabled = models.BooleanField(default=False) view_props = models.JSONField(default=dict) is_activity_enabled = models.BooleanField(default=True) + is_disabled = models.BooleanField(default=False) def __str__(self): """Return name of the deploy board""" diff --git a/apiserver/plane/db/models/inbox.py b/apiserver/plane/db/models/inbox.py index be2b1f3dd22..c3c4c0aa03e 100644 --- a/apiserver/plane/db/models/inbox.py +++ b/apiserver/plane/db/models/inbox.py @@ -33,6 +33,12 @@ class Meta: ordering = ("name",) +class SourceType(models.TextChoices): + EMAIL = "EMAIL" + IN_APP = "IN_APP" + FORMS = "FORMS" + + class InboxIssue(ProjectBaseModel): inbox = models.ForeignKey( "db.Inbox", related_name="issue_inbox", on_delete=models.CASCADE @@ -57,9 +63,16 @@ class InboxIssue(ProjectBaseModel): on_delete=models.SET_NULL, null=True, ) - source = models.TextField(blank=True, null=True) + source = models.CharField( + max_length=255, + default="IN_APP", + null=True, + blank=True, + ) + source_email = models.TextField(blank=True, null=True) external_source = models.CharField(max_length=255, null=True, blank=True) external_id = models.CharField(max_length=255, blank=True, null=True) + extra = models.JSONField(default=dict) class Meta: verbose_name = "InboxIssue" diff --git a/apiserver/plane/db/models/label.py b/apiserver/plane/db/models/label.py index 7070ef9e034..11e2da8c32c 100644 --- a/apiserver/plane/db/models/label.py +++ b/apiserver/plane/db/models/label.py @@ -20,13 +20,19 @@ class Label(WorkspaceBaseModel): external_id = models.CharField(max_length=255, blank=True, null=True) class Meta: - unique_together = ["name", "project", "deleted_at"] constraints = [ + # Enforce uniqueness of name when project is NULL and deleted_at is NULL models.UniqueConstraint( - fields=["name", "project"], - condition=Q(deleted_at__isnull=True), - name="label_unique_name_project_when_deleted_at_null", - ) + fields=["name"], + condition=Q(project__isnull=True, deleted_at__isnull=True), + name="unique_name_when_project_null_and_not_deleted", + ), + # Enforce uniqueness of project and name when project is not NULL and deleted_at is NULL + models.UniqueConstraint( + fields=["project", "name"], + condition=Q(project__isnull=False, deleted_at__isnull=True), + name="unique_project_name_when_not_deleted", + ), ] verbose_name = "Label" verbose_name_plural = "Labels" diff --git a/apiserver/plane/db/models/user.py b/apiserver/plane/db/models/user.py index 3b84ec60e27..bba8061c0e9 100644 --- a/apiserver/plane/db/models/user.py +++ b/apiserver/plane/db/models/user.py @@ -30,6 +30,12 @@ def get_default_onboarding(): } +class BotTypeEnum(models.TextChoices): + SLACK_BOT = "SLACK_BOT", "Slack Bot" + GITHUB_BOT = "GITHUB_BOT", "Github Bot" + INTAKE_BOT = "INTAKE_BOT", "Intake Bot" + + class User(AbstractBaseUser, PermissionsMixin): id = models.UUIDField( default=uuid.uuid4, @@ -107,6 +113,12 @@ class User(AbstractBaseUser, PermissionsMixin): # my_issues_prop = models.JSONField(null=True) is_bot = models.BooleanField(default=False) + bot_type = models.CharField( + max_length=30, + verbose_name="Bot Type", + blank=True, + null=True, + ) # timezone USER_TIMEZONE_CHOICES = tuple(zip(pytz.all_timezones, pytz.all_timezones)) From 3b8b904073554956a130dcf35b45f22b16c4f33c Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Mon, 4 Nov 2024 20:49:47 +0530 Subject: [PATCH 2/4] chore: removed the enum --- apiserver/plane/db/models/user.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apiserver/plane/db/models/user.py b/apiserver/plane/db/models/user.py index bba8061c0e9..e97d04e7a4c 100644 --- a/apiserver/plane/db/models/user.py +++ b/apiserver/plane/db/models/user.py @@ -30,12 +30,6 @@ def get_default_onboarding(): } -class BotTypeEnum(models.TextChoices): - SLACK_BOT = "SLACK_BOT", "Slack Bot" - GITHUB_BOT = "GITHUB_BOT", "Github Bot" - INTAKE_BOT = "INTAKE_BOT", "Intake Bot" - - class User(AbstractBaseUser, PermissionsMixin): id = models.UUIDField( default=uuid.uuid4, From a66d13f0b9c37481686022831a44ef953a0941c0 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Mon, 4 Nov 2024 20:57:18 +0530 Subject: [PATCH 3/4] chore: removed the source type enum --- apiserver/plane/db/models/inbox.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apiserver/plane/db/models/inbox.py b/apiserver/plane/db/models/inbox.py index c3c4c0aa03e..95c84be46f4 100644 --- a/apiserver/plane/db/models/inbox.py +++ b/apiserver/plane/db/models/inbox.py @@ -33,12 +33,6 @@ class Meta: ordering = ("name",) -class SourceType(models.TextChoices): - EMAIL = "EMAIL" - IN_APP = "IN_APP" - FORMS = "FORMS" - - class InboxIssue(ProjectBaseModel): inbox = models.ForeignKey( "db.Inbox", related_name="issue_inbox", on_delete=models.CASCADE From 8e3bc830347b7b33083f1cd13adbcbcf187ee2dc Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Tue, 5 Nov 2024 13:55:51 +0530 Subject: [PATCH 4/4] chore: changed the migration file --- ...0083_device_workspace_timezone_and_more.py | 62 --------------- ...e_project_when_deleted_at_null_and_more.py | 75 +++++++++++++++++++ 2 files changed, 75 insertions(+), 62 deletions(-) create mode 100644 apiserver/plane/db/migrations/0084_remove_label_label_unique_name_project_when_deleted_at_null_and_more.py diff --git a/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py b/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py index 4e2de063eda..587ee880006 100644 --- a/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py +++ b/apiserver/plane/db/migrations/0083_device_workspace_timezone_and_more.py @@ -871,66 +871,4 @@ class Migration(migrations.Migration): "db_table": "device_sessions", }, ), - migrations.AddField( - model_name="deployboard", - name="is_disabled", - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name="inboxissue", - name="extra", - field=models.JSONField(default=dict), - ), - migrations.AddField( - model_name="inboxissue", - name="source_email", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="user", - name="bot_type", - field=models.CharField( - blank=True, max_length=30, null=True, verbose_name="Bot Type" - ), - ), - migrations.AlterField( - model_name="deployboard", - name="entity_name", - field=models.CharField(blank=True, max_length=30, null=True), - ), - migrations.AlterField( - model_name="inboxissue", - name="source", - field=models.CharField( - blank=True, default="IN_APP", max_length=255, null=True - ), - ), - migrations.RemoveConstraint( - model_name="label", - name="label_unique_name_project_when_deleted_at_null", - ), - migrations.AlterUniqueTogether( - name="label", - unique_together=set(), - ), - migrations.AddConstraint( - model_name="label", - constraint=models.UniqueConstraint( - condition=models.Q( - ("deleted_at__isnull", True), ("project__isnull", True) - ), - fields=("name",), - name="unique_name_when_project_null_and_not_deleted", - ), - ), - migrations.AddConstraint( - model_name="label", - constraint=models.UniqueConstraint( - condition=models.Q( - ("deleted_at__isnull", True), ("project__isnull", False) - ), - fields=("project", "name"), - name="unique_project_name_when_not_deleted", - ), - ), ] diff --git a/apiserver/plane/db/migrations/0084_remove_label_label_unique_name_project_when_deleted_at_null_and_more.py b/apiserver/plane/db/migrations/0084_remove_label_label_unique_name_project_when_deleted_at_null_and_more.py new file mode 100644 index 00000000000..25bfcb8fb3d --- /dev/null +++ b/apiserver/plane/db/migrations/0084_remove_label_label_unique_name_project_when_deleted_at_null_and_more.py @@ -0,0 +1,75 @@ +# Generated by Django 4.2.15 on 2024-11-05 07:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("db", "0083_device_workspace_timezone_and_more"), + ] + + operations = [ + migrations.RemoveConstraint( + model_name="label", + name="label_unique_name_project_when_deleted_at_null", + ), + migrations.AlterUniqueTogether( + name="label", + unique_together=set(), + ), + migrations.AddField( + model_name="deployboard", + name="is_disabled", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="inboxissue", + name="extra", + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name="inboxissue", + name="source_email", + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name="user", + name="bot_type", + field=models.CharField( + blank=True, max_length=30, null=True, verbose_name="Bot Type" + ), + ), + migrations.AlterField( + model_name="deployboard", + name="entity_name", + field=models.CharField(blank=True, max_length=30, null=True), + ), + migrations.AlterField( + model_name="inboxissue", + name="source", + field=models.CharField( + blank=True, default="IN_APP", max_length=255, null=True + ), + ), + migrations.AddConstraint( + model_name="label", + constraint=models.UniqueConstraint( + condition=models.Q( + ("deleted_at__isnull", True), ("project__isnull", True) + ), + fields=("name",), + name="unique_name_when_project_null_and_not_deleted", + ), + ), + migrations.AddConstraint( + model_name="label", + constraint=models.UniqueConstraint( + condition=models.Q( + ("deleted_at__isnull", True), ("project__isnull", False) + ), + fields=("project", "name"), + name="unique_project_name_when_not_deleted", + ), + ), + ]