diff --git a/apiserver/plane/db/migrations/0081_remove_globalview_created_by_and_more.py b/apiserver/plane/db/migrations/0081_remove_globalview_created_by_and_more.py new file mode 100644 index 00000000000..984f25444ca --- /dev/null +++ b/apiserver/plane/db/migrations/0081_remove_globalview_created_by_and_more.py @@ -0,0 +1,187 @@ +# Generated by Django 4.2.16 on 2024-10-15 11:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("db", "0080_fileasset_draft_issue_alter_fileasset_entity_type"), + ] + + 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, + ), + 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.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, + ), + 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="GlobalView", + ), + migrations.DeleteModel( + name="IssueViewFavorite", + ), + migrations.DeleteModel( + name="ModuleFavorite", + ), + migrations.DeleteModel( + name="PageBlock", + ), + migrations.DeleteModel( + name="PageFavorite", + ), + migrations.DeleteModel( + name="ProjectFavorite", + ), + ] 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/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/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..45280e2da14 100644 --- a/apiserver/plane/db/models/page.py +++ b/apiserver/plane/db/models/page.py @@ -119,86 +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}>" - - -# 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..ee6ac64bfa1 100644 --- a/apiserver/plane/db/models/view.py +++ b/apiserver/plane/db/models/view.py @@ -52,41 +52,6 @@ def get_default_display_properties(): "updated_on": True, } -# 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") @@ -109,7 +74,6 @@ class IssueView(WorkspaceBaseModel): ) is_locked = models.BooleanField(default=False) - class Meta: verbose_name = "Issue View" verbose_name_plural = "Issue Views" @@ -139,26 +103,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}>" 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 )