blob: 9c5102b74682b7334e82a63885b35d5e769c0303 [file]
from django.db import models
from trackingserver_auth.models import Team, User
from trackingserver_base.models import GenericAttribute, TimeStampedModel
class ProjectMembership(TimeStampedModel):
class Role(models.TextChoices):
WRITE = "write"
READ = "read"
project = models.ForeignKey("Project", on_delete=models.SET_NULL, null=True)
role = models.CharField(choices=Role.choices)
class Meta:
abstract = True
class ProjectUserMembership(ProjectMembership):
"""Represents a membership between a user and a project. This is a many-to-many relationship,"""
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
class Meta:
unique_together = ("user", "project")
def __str__(self):
return f"{self.project_id} ({self.role}) by {self.user_id}"
class ProjectTeamMembership(ProjectMembership):
"""Represents a membership between a user and a project. This is a many-to-many relationship,"""
team = models.ForeignKey(Team, on_delete=models.SET_NULL, null=True)
class Meta:
unique_together = ("team", "project")
def __str__(self):
return f"{self.project_id} ({self.role}) by {self.team_id}"
# Static project management/tracking
class Project(TimeStampedModel):
"""Represents a project -- just the metadata associated with it"""
name = models.CharField()
description = models.TextField()
creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
tags = models.JSONField()
class ProjectAttribute(GenericAttribute):
"""Represents a project attribute -- this is a key-value pair associated with a project"""
project = models.ForeignKey(Project, on_delete=models.SET_NULL, null=True)
class Meta:
unique_together = ("name", "project")