Source code for pangea.core.models.sample_group

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 SampleGroup(AutoCreatedUpdatedMixin): """This class represents the sample group 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='') long_description = models.TextField(blank=True, default='') metadata = JSONField(blank=True, default=dict) is_public = models.BooleanField(blank=False, default=True) is_library = models.BooleanField(blank=False, default=False) theme = models.TextField(blank=True) bucket = models.ForeignKey('S3Bucket', on_delete=models.SET_NULL, null=True)
[docs] def save(self, *args, **kwargs): out = super(SampleGroup, self).save(*args, **kwargs) if self.is_library: # New SampleGroup lib, created = SampleLibrary.objects.get_or_create(group=self) if created: lib.save() logger.info( 'created_library', group_uuid=lib.group.uuid, ) logger.info( 'saved_sample_group', obj_uuid=self.uuid, saved_uuid=out.uuid, name=self.name, is_library=self.is_library, ) return out
[docs] def create_sample(self, *args, **kwargs): if not self.is_library: raise SampleOwnerError('Only libraries can create samples') sample = self.library.create_sample(*args, **kwargs) return sample
[docs] def add_sample(self, sample): sample.sample_groups.add(self) self.save() sample.save() return self
[docs] def add_s3_bucket(self, bucket): self.bucket = bucket self.save() return self
[docs] def create_analysis_result(self, *args, **kwargs): ar = SampleGroupAnalysisResult.objects.create(sample_group=self, *args, **kwargs) return ar
[docs] @classmethod def factory(cls, *args, **kwargs): grp = cls.objects.create(*args, **kwargs) if grp.is_library: SampleLibrary.objects.get_or_create(group=grp) return grp
def __str__(self): return f'{self.name}' def __repr__(self): return f'<SampleGroup name="{self.name}" organization="{self.organization.name}">'
[docs]class SampleLibrary(AutoCreatedUpdatedMixin): group = models.OneToOneField( SampleGroup, on_delete=models.CASCADE, primary_key=True, related_name='library' )
[docs] def create_sample(self, *args, **kwargs): sample = Sample.objects.create(library=self, *args, **kwargs) self.group.add_sample(sample) return sample
def __str__(self): return f'{self.group.name} (library)' def __repr__(self): return f'<SampleLibrary name="{self.group.name}">'