Source code for pangea.core.models.organization
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_group import SampleGroup
from .project import Project
from .s3 import S3Bucket
logger = structlog.get_logger(__name__)
[docs]class PangeaUser(AbstractUser):
"""Custom Pangea user type."""
username = None
email = models.EmailField(_('email address'), unique=True)
personal_org_uuid = models.UUIDField(blank=True, null=True)
saved_sample_groups = models.ManyToManyField('SampleGroup')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = PangeaUserManager()
def __str__(self):
return self.email
@property
def _personal_org_name(self):
return f'Personal Organization for User {self.email}'
@property
def personal_org(self):
try:
return Organization.objects.get(pk=self.personal_org_uuid)
except ObjectDoesNotExist:
org = Organization.objects.create(name=self._personal_org_name)
org.users.add(self)
org.save()
self.personal_org_uuid = org.uuid
self.save()
return org
[docs]class Organization(AutoCreatedUpdatedMixin):
"""This class represents the organization model."""
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(blank=False, unique=True)
users = models.ManyToManyField(get_user_model())
core_sample_group_uuid = models.UUIDField(blank=True, null=True)
[docs] def save(self, *args, **kwargs):
out = super(Organization, self).save(*args, **kwargs)
logger.info(
'saved_organization',
obj_uuid=self.uuid,
saved_uuid=out.uuid,
name=self.name,
)
return out
[docs] def create_sample_group(self, *args, **kwargs):
sample_group = SampleGroup.factory(organization=self, *args, **kwargs)
return sample_group
[docs] def create_project(self, *args, **kwargs):
proj = Project.factory(organization=self, *args, **kwargs)
return proj
[docs] def create_s3bucket(self, *args, **kwargs):
s3bucket = S3Bucket(organization=self, *args, **kwargs)
s3bucket.save()
return s3bucket
@property
def _core_sample_group_name(self):
return f'Default Sample Group for Organization {self.name}'
@property
def core_sample_group(self):
try:
return SampleGroup.objects.get(pk=self.core_sample_group_uuid)
except ObjectDoesNotExist:
grp = SampleGroup.factory(
name=self._core_sample_group_name,
organization=self,
is_public=False,
is_library=True,
)
self.core_sample_group_uuid = grp.uuid
self.save()
return grp
def __str__(self):
return f'{self.name}'
def __repr__(self):
return f'<Organization name="{self.name}">'