From 26b7e379f43ef2cda37cebad8f3dc1f79464b96d Mon Sep 17 00:00:00 2001 From: gurusainath Date: Tue, 15 Oct 2024 14:04:25 +0530 Subject: [PATCH 1/3] migration: external source and id for issues --- ...issue_external_id_issue_external_source.py | 23 +++++++++++++++++++ apiserver/plane/db/models/issue_type.py | 2 ++ apiserver/plane/utils/paginator.py | 3 --- 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py diff --git a/apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py b/apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py new file mode 100644 index 00000000000..0bf86bb159c --- /dev/null +++ b/apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.16 on 2024-10-15 08:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0080_fileasset_draft_issue_alter_fileasset_entity_type'), + ] + + operations = [ + migrations.AddField( + model_name='issuetype', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='issuetype', + name='external_source', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/apiserver/plane/db/models/issue_type.py b/apiserver/plane/db/models/issue_type.py index f62cf54b56e..cfe19434bf6 100644 --- a/apiserver/plane/db/models/issue_type.py +++ b/apiserver/plane/db/models/issue_type.py @@ -19,6 +19,8 @@ class IssueType(BaseModel): is_default = models.BooleanField(default=False) is_active = models.BooleanField(default=True) level = models.PositiveIntegerField(default=0) + external_source = models.CharField(max_length=255, null=True, blank=True) + external_id = models.CharField(max_length=255, blank=True, null=True) class Meta: verbose_name = "Issue Type" diff --git a/apiserver/plane/utils/paginator.py b/apiserver/plane/utils/paginator.py index 219b646b25b..c6712cacb0f 100644 --- a/apiserver/plane/utils/paginator.py +++ b/apiserver/plane/utils/paginator.py @@ -150,7 +150,6 @@ def get_result(self, limit=1000, cursor=None): raise BadPaginationError("Pagination offset cannot be negative") results = queryset[offset:stop] - print(limit, "limit") if cursor.value != limit: results = results[-(limit + 1) :] @@ -761,7 +760,6 @@ def paginate( ): """Paginate the request""" per_page = self.get_per_page(request, default_per_page, max_per_page) - print(per_page, "per_page") # Convert the cursor value to integer and float from string input_cursor = None try: @@ -788,7 +786,6 @@ def paginate( paginator = paginator_cls(**paginator_kwargs) try: - print(per_page, "per_page 2") cursor_result = paginator.get_result( limit=per_page, cursor=input_cursor ) From a6f1c65147cb288abdcef96a88ebf3d3bc3940c7 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Tue, 15 Oct 2024 16:32:34 +0530 Subject: [PATCH 2/3] fix: cleaning up deprecated favorite tables --- ...ueviewfavorite_unique_together_and_more.py | 145 ++++++++++++++++++ ...issue_external_id_issue_external_source.py | 23 --- apiserver/plane/db/models/__init__.py | 9 +- apiserver/plane/db/models/cycle.py | 27 ---- apiserver/plane/db/models/module.py | 31 +--- apiserver/plane/db/models/page.py | 23 --- apiserver/plane/db/models/project.py | 24 +-- apiserver/plane/db/models/view.py | 25 +-- 8 files changed, 154 insertions(+), 153 deletions(-) create mode 100644 apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py delete mode 100644 apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py diff --git a/apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py b/apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py new file mode 100644 index 00000000000..92925d17002 --- /dev/null +++ b/apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py @@ -0,0 +1,145 @@ +# Generated by Django 4.2.16 on 2024-10-15 11:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("db", "0080_fileasset_draft_issue_alter_fileasset_entity_type"), + ] + + operations = [ + migrations.AlterUniqueTogether( + name="issueviewfavorite", + unique_together=None, + ), + migrations.RemoveField( + model_name="issueviewfavorite", + name="created_by", + ), + migrations.RemoveField( + model_name="issueviewfavorite", + name="project", + ), + migrations.RemoveField( + model_name="issueviewfavorite", + name="updated_by", + ), + migrations.RemoveField( + model_name="issueviewfavorite", + name="user", + ), + migrations.RemoveField( + model_name="issueviewfavorite", + name="view", + ), + migrations.RemoveField( + model_name="issueviewfavorite", + name="workspace", + ), + migrations.AlterUniqueTogether( + name="modulefavorite", + unique_together=None, + ), + migrations.RemoveField( + model_name="modulefavorite", + name="created_by", + ), + migrations.RemoveField( + model_name="modulefavorite", + name="module", + ), + migrations.RemoveField( + model_name="modulefavorite", + name="project", + ), + migrations.RemoveField( + model_name="modulefavorite", + name="updated_by", + ), + migrations.RemoveField( + model_name="modulefavorite", + name="user", + ), + migrations.RemoveField( + model_name="modulefavorite", + name="workspace", + ), + migrations.AlterUniqueTogether( + name="pagefavorite", + unique_together=None, + ), + migrations.RemoveField( + model_name="pagefavorite", + name="created_by", + ), + migrations.RemoveField( + model_name="pagefavorite", + name="page", + ), + migrations.RemoveField( + model_name="pagefavorite", + name="project", + ), + migrations.RemoveField( + model_name="pagefavorite", + name="updated_by", + ), + migrations.RemoveField( + model_name="pagefavorite", + name="user", + ), + migrations.RemoveField( + model_name="pagefavorite", + name="workspace", + ), + migrations.AlterUniqueTogether( + name="projectfavorite", + unique_together=None, + ), + migrations.RemoveField( + model_name="projectfavorite", + name="created_by", + ), + migrations.RemoveField( + model_name="projectfavorite", + name="project", + ), + migrations.RemoveField( + model_name="projectfavorite", + name="updated_by", + ), + migrations.RemoveField( + model_name="projectfavorite", + name="user", + ), + migrations.RemoveField( + model_name="projectfavorite", + name="workspace", + ), + migrations.AddField( + model_name="issuetype", + name="external_id", + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name="issuetype", + name="external_source", + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.DeleteModel( + name="CycleFavorite", + ), + migrations.DeleteModel( + name="IssueViewFavorite", + ), + migrations.DeleteModel( + name="ModuleFavorite", + ), + migrations.DeleteModel( + name="PageFavorite", + ), + migrations.DeleteModel( + name="ProjectFavorite", + ), + ] diff --git a/apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py b/apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py deleted file mode 100644 index 0bf86bb159c..00000000000 --- a/apiserver/plane/db/migrations/0081_issue_external_id_issue_external_source.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.16 on 2024-10-15 08:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0080_fileasset_draft_issue_alter_fileasset_entity_type'), - ] - - operations = [ - migrations.AddField( - model_name='issuetype', - name='external_id', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AddField( - model_name='issuetype', - name='external_source', - field=models.CharField(blank=True, max_length=255, null=True), - ), - ] diff --git a/apiserver/plane/db/models/__init__.py b/apiserver/plane/db/models/__init__.py index c9df0f6085e..deade988275 100644 --- a/apiserver/plane/db/models/__init__.py +++ b/apiserver/plane/db/models/__init__.py @@ -2,7 +2,7 @@ from .api import APIActivityLog, APIToken from .asset import FileAsset from .base import BaseModel -from .cycle import Cycle, CycleFavorite, CycleIssue, CycleUserProperties +from .cycle import Cycle, CycleIssue, CycleUserProperties from .dashboard import Dashboard, DashboardWidget, Widget from .deploy_board import DeployBoard from .draft import DraftIssue, DraftIssueAssignee, DraftIssueLabel, DraftIssueModule, DraftIssueCycle @@ -39,7 +39,6 @@ ) from .module import ( Module, - ModuleFavorite, ModuleIssue, ModuleLink, ModuleMember, @@ -52,7 +51,6 @@ ) from .page import ( Page, - PageFavorite, PageLabel, PageLog, ProjectPage, @@ -61,7 +59,6 @@ from .project import ( Project, ProjectBaseModel, - ProjectFavorite, ProjectIdentifier, ProjectMember, ProjectMemberInvite, @@ -72,7 +69,7 @@ from .social_connection import SocialLoginConnection from .state import State from .user import Account, Profile, User -from .view import IssueView, IssueViewFavorite +from .view import IssueView from .webhook import Webhook, WebhookLog from .workspace import ( Team, @@ -87,7 +84,7 @@ from .importer import Importer -from .page import Page, PageLog, PageFavorite, PageLabel +from .page import Page, PageLog, PageLabel from .estimate import Estimate, EstimatePoint diff --git a/apiserver/plane/db/models/cycle.py b/apiserver/plane/db/models/cycle.py index 7c6ac8e3935..f9f9eece966 100644 --- a/apiserver/plane/db/models/cycle.py +++ b/apiserver/plane/db/models/cycle.py @@ -127,33 +127,6 @@ def __str__(self): return f"{self.cycle}" -# DEPRECATED TODO: - Remove in next release -class CycleFavorite(ProjectBaseModel): - """_summary_ - CycleFavorite (model): To store all the cycle favorite of the user - """ - - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name="cycle_favorites", - ) - cycle = models.ForeignKey( - "db.Cycle", on_delete=models.CASCADE, related_name="cycle_favorites" - ) - - class Meta: - unique_together = ["cycle", "user"] - verbose_name = "Cycle Favorite" - verbose_name_plural = "Cycle Favorites" - db_table = "cycle_favorites" - ordering = ("-created_at",) - - def __str__(self): - """Return user and the cycle""" - return f"{self.user.email} <{self.cycle.name}>" - - class CycleUserProperties(ProjectBaseModel): cycle = models.ForeignKey( "db.Cycle", diff --git a/apiserver/plane/db/models/module.py b/apiserver/plane/db/models/module.py index 7c1fff53e28..6238fbd218d 100644 --- a/apiserver/plane/db/models/module.py +++ b/apiserver/plane/db/models/module.py @@ -100,9 +100,9 @@ class Meta: unique_together = ["name", "project", "deleted_at"] constraints = [ models.UniqueConstraint( - fields=['name', 'project'], + fields=["name", "project"], condition=Q(deleted_at__isnull=True), - name='module_unique_name_project_when_deleted_at_null' + name="module_unique_name_project_when_deleted_at_null", ) ] verbose_name = "Module" @@ -191,33 +191,6 @@ def __str__(self): return f"{self.module.name} {self.url}" -# DEPRECATED TODO: - Remove in next release -class ModuleFavorite(ProjectBaseModel): - """_summary_ - ModuleFavorite (model): To store all the module favorite of the user - """ - - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name="module_favorites", - ) - module = models.ForeignKey( - "db.Module", on_delete=models.CASCADE, related_name="module_favorites" - ) - - class Meta: - unique_together = ["module", "user"] - verbose_name = "Module Favorite" - verbose_name_plural = "Module Favorites" - db_table = "module_favorites" - ordering = ("-created_at",) - - def __str__(self): - """Return user and the module""" - return f"{self.user.email} <{self.module.name}>" - - class ModuleUserProperties(ProjectBaseModel): module = models.ForeignKey( "db.Module", diff --git a/apiserver/plane/db/models/page.py b/apiserver/plane/db/models/page.py index 5a7f3b001a5..c8c593e0e3c 100644 --- a/apiserver/plane/db/models/page.py +++ b/apiserver/plane/db/models/page.py @@ -176,29 +176,6 @@ def __str__(self): return f"{self.page.name} <{self.name}>" -# DEPRECATED TODO: - Remove in next release -class PageFavorite(ProjectBaseModel): - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name="page_favorites", - ) - page = models.ForeignKey( - "db.Page", on_delete=models.CASCADE, related_name="page_favorites" - ) - - class Meta: - unique_together = ["page", "user"] - verbose_name = "Page Favorite" - verbose_name_plural = "Page Favorites" - db_table = "page_favorites" - ordering = ("-created_at",) - - def __str__(self): - """Return user and the page""" - return f"{self.user.email} <{self.page.name}>" - - class PageLabel(BaseModel): label = models.ForeignKey( "db.Label", on_delete=models.CASCADE, related_name="page_labels" diff --git a/apiserver/plane/db/models/project.py b/apiserver/plane/db/models/project.py index a44c84bc488..55c45fc2a45 100644 --- a/apiserver/plane/db/models/project.py +++ b/apiserver/plane/db/models/project.py @@ -181,7 +181,9 @@ class ProjectBaseModel(BaseModel): Project, on_delete=models.CASCADE, related_name="project_%(class)s" ) workspace = models.ForeignKey( - "db.Workspace", on_delete=models.CASCADE, related_name="workspace_%(class)s" + "db.Workspace", + on_delete=models.CASCADE, + related_name="workspace_%(class)s", ) class Meta: @@ -285,26 +287,6 @@ class Meta: ordering = ("-created_at",) -# DEPRECATED TODO: - Remove in next release -class ProjectFavorite(ProjectBaseModel): - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name="project_favorites", - ) - - class Meta: - unique_together = ["project", "user"] - verbose_name = "Project Favorite" - verbose_name_plural = "Project Favorites" - db_table = "project_favorites" - ordering = ("-created_at",) - - def __str__(self): - """Return user of the project""" - return f"{self.user.email} <{self.project.name}>" - - def get_anchor(): return uuid4().hex diff --git a/apiserver/plane/db/models/view.py b/apiserver/plane/db/models/view.py index 2a5bae56919..69f114bbea7 100644 --- a/apiserver/plane/db/models/view.py +++ b/apiserver/plane/db/models/view.py @@ -52,6 +52,7 @@ def get_default_display_properties(): "updated_on": True, } + # DEPRECATED TODO: - Remove in next release class GlobalView(BaseModel): workspace = models.ForeignKey( @@ -109,7 +110,6 @@ class IssueView(WorkspaceBaseModel): ) is_locked = models.BooleanField(default=False) - class Meta: verbose_name = "Issue View" verbose_name_plural = "Issue Views" @@ -139,26 +139,3 @@ def save(self, *args, **kwargs): def __str__(self): """Return name of the View""" return f"{self.name} <{self.project.name}>" - - -# DEPRECATED TODO: - Remove in next release -class IssueViewFavorite(ProjectBaseModel): - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name="user_view_favorites", - ) - view = models.ForeignKey( - "db.IssueView", on_delete=models.CASCADE, related_name="view_favorites" - ) - - class Meta: - unique_together = ["view", "user"] - verbose_name = "View Favorite" - verbose_name_plural = "View Favorites" - db_table = "view_favorites" - ordering = ("-created_at",) - - def __str__(self): - """Return user and the view""" - return f"{self.user.email} <{self.view.name}>" From c097a55a085bdfea544a2095fa67c2694655a035 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Tue, 15 Oct 2024 17:02:21 +0530 Subject: [PATCH 3/3] fix: removing deprecated models --- ..._remove_globalview_created_by_and_more.py} | 44 +++++++++++++- apiserver/plane/db/models/page.py | 57 ------------------- apiserver/plane/db/models/view.py | 36 ------------ 3 files changed, 43 insertions(+), 94 deletions(-) rename apiserver/plane/db/migrations/{0081_alter_issueviewfavorite_unique_together_and_more.py => 0081_remove_globalview_created_by_and_more.py} (77%) diff --git a/apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py b/apiserver/plane/db/migrations/0081_remove_globalview_created_by_and_more.py similarity index 77% rename from apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py rename to apiserver/plane/db/migrations/0081_remove_globalview_created_by_and_more.py index 92925d17002..984f25444ca 100644 --- a/apiserver/plane/db/migrations/0081_alter_issueviewfavorite_unique_together_and_more.py +++ b/apiserver/plane/db/migrations/0081_remove_globalview_created_by_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.16 on 2024-10-15 11:01 +# Generated by Django 4.2.16 on 2024-10-15 11:31 from django.db import migrations, models @@ -9,6 +9,18 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RemoveField( + model_name="globalview", + name="created_by", + ), + migrations.RemoveField( + model_name="globalview", + name="updated_by", + ), + migrations.RemoveField( + model_name="globalview", + name="workspace", + ), migrations.AlterUniqueTogether( name="issueviewfavorite", unique_together=None, @@ -65,6 +77,30 @@ class Migration(migrations.Migration): model_name="modulefavorite", name="workspace", ), + migrations.RemoveField( + model_name="pageblock", + name="created_by", + ), + migrations.RemoveField( + model_name="pageblock", + name="issue", + ), + migrations.RemoveField( + model_name="pageblock", + name="page", + ), + migrations.RemoveField( + model_name="pageblock", + name="project", + ), + migrations.RemoveField( + model_name="pageblock", + name="updated_by", + ), + migrations.RemoveField( + model_name="pageblock", + name="workspace", + ), migrations.AlterUniqueTogether( name="pagefavorite", unique_together=None, @@ -130,12 +166,18 @@ class Migration(migrations.Migration): migrations.DeleteModel( name="CycleFavorite", ), + migrations.DeleteModel( + name="GlobalView", + ), migrations.DeleteModel( name="IssueViewFavorite", ), migrations.DeleteModel( name="ModuleFavorite", ), + migrations.DeleteModel( + name="PageBlock", + ), migrations.DeleteModel( name="PageFavorite", ), diff --git a/apiserver/plane/db/models/page.py b/apiserver/plane/db/models/page.py index c8c593e0e3c..45280e2da14 100644 --- a/apiserver/plane/db/models/page.py +++ b/apiserver/plane/db/models/page.py @@ -119,63 +119,6 @@ def __str__(self): return f"{self.page.name} {self.entity_name}" -# DEPRECATED TODO: - Remove in next release -class PageBlock(ProjectBaseModel): - page = models.ForeignKey( - "db.Page", on_delete=models.CASCADE, related_name="blocks" - ) - name = models.CharField(max_length=255) - description = models.JSONField(default=dict, blank=True) - description_html = models.TextField(blank=True, default="

") - description_stripped = models.TextField(blank=True, null=True) - issue = models.ForeignKey( - "db.Issue", on_delete=models.SET_NULL, related_name="blocks", null=True - ) - completed_at = models.DateTimeField(null=True) - sort_order = models.FloatField(default=65535) - sync = models.BooleanField(default=True) - - def save(self, *args, **kwargs): - if self._state.adding: - largest_sort_order = PageBlock.objects.filter( - project=self.project, page=self.page - ).aggregate(largest=models.Max("sort_order"))["largest"] - if largest_sort_order is not None: - self.sort_order = largest_sort_order + 10000 - - # Strip the html tags using html parser - self.description_stripped = ( - None - if (self.description_html == "" or self.description_html is None) - else strip_tags(self.description_html) - ) - - if self.completed_at and self.issue: - try: - from plane.db.models import Issue, State - - completed_state = State.objects.filter( - group="completed", project=self.project - ).first() - if completed_state is not None: - Issue.objects.update( - pk=self.issue_id, state=completed_state - ) - except ImportError: - pass - super(PageBlock, self).save(*args, **kwargs) - - class Meta: - verbose_name = "Page Block" - verbose_name_plural = "Page Blocks" - db_table = "page_blocks" - ordering = ("-created_at",) - - def __str__(self): - """Return page and page block""" - return f"{self.page.name} <{self.name}>" - - class PageLabel(BaseModel): label = models.ForeignKey( "db.Label", on_delete=models.CASCADE, related_name="page_labels" diff --git a/apiserver/plane/db/models/view.py b/apiserver/plane/db/models/view.py index 69f114bbea7..ee6ac64bfa1 100644 --- a/apiserver/plane/db/models/view.py +++ b/apiserver/plane/db/models/view.py @@ -53,42 +53,6 @@ def get_default_display_properties(): } -# DEPRECATED TODO: - Remove in next release -class GlobalView(BaseModel): - workspace = models.ForeignKey( - "db.Workspace", on_delete=models.CASCADE, related_name="global_views" - ) - name = models.CharField(max_length=255, verbose_name="View Name") - description = models.TextField(verbose_name="View Description", blank=True) - query = models.JSONField(verbose_name="View Query") - access = models.PositiveSmallIntegerField( - default=1, choices=((0, "Private"), (1, "Public")) - ) - query_data = models.JSONField(default=dict) - sort_order = models.FloatField(default=65535) - logo_props = models.JSONField(default=dict) - - class Meta: - verbose_name = "Global View" - verbose_name_plural = "Global Views" - db_table = "global_views" - ordering = ("-created_at",) - - def save(self, *args, **kwargs): - if self._state.adding: - largest_sort_order = GlobalView.objects.filter( - workspace=self.workspace - ).aggregate(largest=models.Max("sort_order"))["largest"] - if largest_sort_order is not None: - self.sort_order = largest_sort_order + 10000 - - super(GlobalView, self).save(*args, **kwargs) - - def __str__(self): - """Return name of the View""" - return f"{self.name} <{self.workspace.name}>" - - class IssueView(WorkspaceBaseModel): name = models.CharField(max_length=255, verbose_name="View Name") description = models.TextField(verbose_name="View Description", blank=True)