Source code for pangea.core.models.project
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractUser
from django.contrib.postgres.fields import JSONField
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ObjectDoesNotExist
import uuid
import boto3
from botocore.exceptions import ClientError
import structlog
from pangea.core.exceptions import SampleOwnerError
from pangea.core.managers import PangeaUserManager
from pangea.core.mixins import AutoCreatedUpdatedMixin
from pangea.core.utils import random_replicate_name
from pangea.core.encrypted_fields import EncryptedTextField
from .sample import Sample
from .analysis_result import SampleGroupAnalysisResult
logger = structlog.get_logger(__name__)
[docs]class Project(AutoCreatedUpdatedMixin):
"""This class represents the project model."""
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(blank=False, unique=True)
organization = models.ForeignKey('Organization', on_delete=models.CASCADE)
description = models.TextField(blank=False, default='')
sample_groups = models.ManyToManyField('SampleGroup', null=True, blank=True)
sub_projects = models.ManyToManyField('Project', related_name='super_projects', null=True, blank=True)
@property
def is_public(self):
public = True
for grp in self.sample_groups.all():
public &= grp.is_public
for proj in self.sub_projects.all():
public &= proj.is_public
return public
[docs] def add_sample_group(self, sample_group):
self.sample_groups.add(sample_group)
self.save()
return self
[docs] def add_sub_project(self, sub_project):
self.sub_projects.add(sub_project)
self.save()
return self
[docs] def add_super_project(self, super_project):
super_project.add_sub_project(self)
return self
[docs] @classmethod
def factory(cls, *args, **kwargs):
proj = cls.objects.create(*args, **kwargs)
return proj
def __str__(self):
return f'{self.name}'
def __repr__(self):
return f'<Project name="{self.name}" organization="{self.organization.name}">'