mirror of
https://github.com/makeplane/plane.git
synced 2026-05-08 00:49:36 -05:00
chore: remove project_id from WorkspaceBaseModel
This commit is contained in:
@@ -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',
|
||||
),
|
||||
]
|
||||
@@ -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"),
|
||||
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user