Source code for pangea.contrib.tagging.models

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 pangea.core.models import (
    Sample,
    SampleGroup,
)

logger = structlog.get_logger(__name__)


[docs]class Tag(AutoCreatedUpdatedMixin): """This class represents the sample model.""" uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name = models.TextField(blank=False, unique=True) payload = models.TextField(blank=True, unique=False)
[docs] def tag_sample_group(self, sample_group, payload=''): relate = SampleGroupTagRelationship(tag=self, sample_group=sample_group, payload=payload) relate.save() return self
[docs] def tag_sample(self, sample, payload=''): relate = SampleTagRelationship(tag=self, sample=sample, payload=payload) relate.save() return self
def __str__(self): return f"{self.name}" def __repr__(self): return f'<Tag name="{self.name}" payload="{self.payload}">'
[docs]class GenericTagRelationship(AutoCreatedUpdatedMixin): payload = models.TextField(blank=True, unique=False)
[docs] class Meta: abstract = True
[docs]class TagTagRelationship(GenericTagRelationship): tag = models.ForeignKey('Tag', on_delete=models.CASCADE, related_name='related_tags') other_tag = models.ForeignKey('Tag', on_delete=models.CASCADE, related_name='back_related_tags')
[docs]class SampleGroupTagRelationship(GenericTagRelationship): tag = models.ForeignKey('Tag', on_delete=models.CASCADE, related_name='tagged_sample_groups') sample_group = models.ForeignKey(SampleGroup, on_delete=models.CASCADE, related_name='tags')
[docs]class SampleTagRelationship(GenericTagRelationship): tag = models.ForeignKey('Tag', on_delete=models.CASCADE, related_name='tagged_samples') sample = models.ForeignKey(Sample, on_delete=models.CASCADE, related_name='tags')