chore: remove project_id from WorkspaceBaseModel

This commit is contained in:
sangeethailango
2026-03-30 19:51:29 +05:30
parent 9fa707b260
commit 98e915c1af
10 changed files with 80 additions and 25 deletions
@@ -0,0 +1,17 @@
# Generated by Django 4.2.29 on 2026-03-30 14:20
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('db', '0121_alter_estimate_type'),
]
operations = [
migrations.RemoveField(
model_name='workspaceuserlink',
name='project',
),
]
+2 -2
View File
@@ -9,14 +9,14 @@ from uuid import uuid4
from django.db import models
# Module imports
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
def get_anchor():
return uuid4().hex
class DeployBoard(WorkspaceBaseModel):
class DeployBoard(ProjectOptionalBaseModel):
TYPE_CHOICES = (
("project", "Project"),
("issue", "Issue"),
+3 -3
View File
@@ -4,10 +4,10 @@
from django.db import models
from django.utils.html import strip_tags
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
class Description(WorkspaceBaseModel):
class Description(ProjectOptionalBaseModel):
description_json = models.JSONField(default=dict, blank=True)
description_html = models.TextField(blank=True, default="<p></p>")
description_binary = models.BinaryField(null=True)
@@ -29,7 +29,7 @@ class Description(WorkspaceBaseModel):
super(Description, self).save(*args, **kwargs)
class DescriptionVersion(WorkspaceBaseModel):
class DescriptionVersion(ProjectOptionalBaseModel):
"""
DescriptionVersion is a model used to store historical versions of a Description.
"""
+6 -6
View File
@@ -10,10 +10,10 @@ from django.utils import timezone
# Module imports
from plane.utils.html_processor import strip_tags
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
class DraftIssue(WorkspaceBaseModel):
class DraftIssue(ProjectOptionalBaseModel):
PRIORITY_CHOICES = (
("urgent", "Urgent"),
("high", "High"),
@@ -136,7 +136,7 @@ class DraftIssue(WorkspaceBaseModel):
return f"{self.name} <{self.project.name}>"
class DraftIssueAssignee(WorkspaceBaseModel):
class DraftIssueAssignee(ProjectOptionalBaseModel):
draft_issue = models.ForeignKey(DraftIssue, on_delete=models.CASCADE, related_name="draft_issue_assignee")
assignee = models.ForeignKey(
settings.AUTH_USER_MODEL,
@@ -162,7 +162,7 @@ class DraftIssueAssignee(WorkspaceBaseModel):
return f"{self.draft_issue.name} {self.assignee.email}"
class DraftIssueLabel(WorkspaceBaseModel):
class DraftIssueLabel(ProjectOptionalBaseModel):
draft_issue = models.ForeignKey("db.DraftIssue", on_delete=models.CASCADE, related_name="draft_label_issue")
label = models.ForeignKey("db.Label", on_delete=models.CASCADE, related_name="draft_label_issue")
@@ -176,7 +176,7 @@ class DraftIssueLabel(WorkspaceBaseModel):
return f"{self.draft_issue.name} {self.label.name}"
class DraftIssueModule(WorkspaceBaseModel):
class DraftIssueModule(ProjectOptionalBaseModel):
module = models.ForeignKey("db.Module", on_delete=models.CASCADE, related_name="draft_issue_module")
draft_issue = models.ForeignKey("db.DraftIssue", on_delete=models.CASCADE, related_name="draft_issue_module")
@@ -198,7 +198,7 @@ class DraftIssueModule(WorkspaceBaseModel):
return f"{self.module.name} {self.draft_issue.name}"
class DraftIssueCycle(WorkspaceBaseModel):
class DraftIssueCycle(ProjectOptionalBaseModel):
"""
Draft Issue Cycles
"""
+2 -2
View File
@@ -8,10 +8,10 @@ from django.conf import settings
from django.db import models
# Module imports
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
class UserFavorite(WorkspaceBaseModel):
class UserFavorite(ProjectOptionalBaseModel):
"""_summary_
UserFavorite (model): To store all the favorites of the user
"""
+2 -2
View File
@@ -5,10 +5,10 @@
from django.db import models
from django.db.models import Q
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
class Label(WorkspaceBaseModel):
class Label(ProjectOptionalBaseModel):
parent = models.ForeignKey(
"self",
on_delete=models.CASCADE,
+16
View File
@@ -12,6 +12,7 @@ from django.conf import settings
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.db.models import Q
from .workspace import WorkspaceManager
# Module imports
from plane.db.mixins import AuditModel
@@ -177,6 +178,21 @@ class Project(BaseModel):
return super().save(*args, **kwargs)
class ProjectOptionalBaseModel(BaseModel):
workspace = models.ForeignKey("db.Workspace", models.CASCADE, related_name="workspace_%(class)s")
project = models.ForeignKey("db.Project", models.CASCADE, related_name="project_%(class)s", null=True)
objects = WorkspaceManager()
class Meta:
abstract = True
def save(self, *args, **kwargs):
if self.project:
self.workspace = self.project.workspace
super(ProjectOptionalBaseModel, self).save(*args, **kwargs)
class ProjectBaseModel(BaseModel):
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="project_%(class)s")
workspace = models.ForeignKey("db.Workspace", on_delete=models.CASCADE, related_name="workspace_%(class)s")
+2 -2
View File
@@ -7,7 +7,7 @@ from django.db import models
from django.conf import settings
# Module imports
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
class EntityNameEnum(models.TextChoices):
@@ -19,7 +19,7 @@ class EntityNameEnum(models.TextChoices):
PROJECT = "PROJECT", "Project"
class UserRecentVisit(WorkspaceBaseModel):
class UserRecentVisit(ProjectOptionalBaseModel):
entity_identifier = models.UUIDField(null=True)
entity_name = models.CharField(max_length=30)
user = models.ForeignKey(
+2 -2
View File
@@ -7,7 +7,7 @@ from django.conf import settings
from django.db import models
# Module import
from .workspace import WorkspaceBaseModel
from .project import ProjectOptionalBaseModel
from plane.utils.issue_filters import issue_filters
@@ -55,7 +55,7 @@ def get_default_display_properties():
}
class IssueView(WorkspaceBaseModel):
class IssueView(ProjectOptionalBaseModel):
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")
+28 -6
View File
@@ -5,16 +5,19 @@
# Python imports
import pytz
from typing import Optional, Any
from uuid import UUID
# Django imports
from django.conf import settings
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models import Q
# Module imports
from .base import BaseModel
from plane.utils.constants import RESTRICTED_WORKSPACE_SLUGS
from plane.utils.color import get_random_color
from plane.db.mixins import SoftDeletionManager, SoftDeletionQuerySet
ROLE_CHOICES = ((20, "Admin"), (15, "Member"), (5, "Guest"))
@@ -182,18 +185,37 @@ class Workspace(BaseModel):
ordering = ("-created_at",)
class WorkspaceQuerySet(SoftDeletionQuerySet):
"""QuerySet for project related models that handles accessibility"""
def accessible_to(self, user_id: UUID, slug: str):
from plane.db.models.project import ProjectMember
member_project_ids = ProjectMember.objects.filter(
member_id=user_id, workspace__slug=slug, is_active=True
).values_list("project_id", flat=True)
base_query = Q(project_id__in=member_project_ids)
return self.filter(base_query)
class WorkspaceManager(SoftDeletionManager):
"""Manager for project related models that handles accessibility"""
def get_queryset(self):
return WorkspaceQuerySet(self.model, using=self._db).filter(deleted_at__isnull=True)
def accessible_to(self, user_id: UUID, slug: str):
return self.get_queryset().accessible_to(user_id, slug)
class WorkspaceBaseModel(BaseModel):
workspace = models.ForeignKey("db.Workspace", models.CASCADE, related_name="workspace_%(class)s")
project = models.ForeignKey("db.Project", models.CASCADE, related_name="project_%(class)s", null=True)
class Meta:
abstract = True
def save(self, *args, **kwargs):
if self.project:
self.workspace = self.project.workspace
super(WorkspaceBaseModel, self).save(*args, **kwargs)
class WorkspaceMember(BaseModel):
workspace = models.ForeignKey("db.Workspace", on_delete=models.CASCADE, related_name="workspace_member")