2021-10-20 14:31:08 +00:00
|
|
|
import sys
|
2021-10-22 22:36:17 +00:00
|
|
|
import uuid
|
2021-10-20 14:31:08 +00:00
|
|
|
|
|
|
|
|
if sys.version_info >= (3, 8):
|
|
|
|
|
from typing import Final, final
|
|
|
|
|
else:
|
|
|
|
|
from typing_extensions import Final, final
|
2021-10-20 14:05:23 +00:00
|
|
|
|
2021-07-04 15:58:33 +00:00
|
|
|
from django.db import models
|
|
|
|
|
|
|
|
|
|
from eav.decorators import register_eav
|
|
|
|
|
from eav.models import EAVModelMeta
|
2024-06-23 15:52:45 +00:00
|
|
|
from eav.managers import EntityManager
|
2021-07-04 15:58:33 +00:00
|
|
|
|
2021-10-20 14:05:23 +00:00
|
|
|
#: Constants
|
|
|
|
|
MAX_CHARFIELD_LEN: Final = 254
|
|
|
|
|
|
2021-07-04 15:58:33 +00:00
|
|
|
|
|
|
|
|
class TestBase(models.Model):
|
|
|
|
|
"""Base class for test models."""
|
|
|
|
|
|
|
|
|
|
class Meta(object):
|
|
|
|
|
"""Define common options."""
|
|
|
|
|
|
|
|
|
|
app_label = 'test_project'
|
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
|
|
|
2024-06-23 15:52:45 +00:00
|
|
|
class DoctorManager(EntityManager):
|
|
|
|
|
"""
|
|
|
|
|
Custom manager for the Doctor model.
|
|
|
|
|
|
|
|
|
|
This manager extends the EntityManager and provides additional
|
|
|
|
|
methods specific to the Doctor model, and is expected to be the
|
|
|
|
|
default manager on the model.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def get_by_name(self, name: str) -> models.QuerySet:
|
|
|
|
|
"""Returns a QuerySet of doctors with the given name.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
name (str): The name of the doctor to search for.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
models.QuerySet: A QuerySet of doctors with the specified name.
|
|
|
|
|
"""
|
|
|
|
|
return self.filter(name=name)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DoctorSubstringManager(models.Manager):
|
|
|
|
|
"""
|
|
|
|
|
Custom manager for the Doctor model.
|
|
|
|
|
|
|
|
|
|
This is a second manager used to ensure during testing that it's not replaced
|
|
|
|
|
as the default manager after eav.register().
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def get_by_name_contains(self, substring: str) -> models.QuerySet:
|
|
|
|
|
"""Returns a QuerySet of doctors whose names contain the given substring.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
substring (str): The substring to search for in the doctor's name.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
models.QuerySet: A QuerySet of doctors whose names contain the specified substring.
|
|
|
|
|
"""
|
|
|
|
|
return self.filter(name__icontains=substring)
|
|
|
|
|
|
|
|
|
|
|
2021-10-22 22:36:17 +00:00
|
|
|
@final
|
|
|
|
|
@register_eav()
|
|
|
|
|
class Doctor(TestBase):
|
|
|
|
|
"""Test model using UUID as primary key."""
|
|
|
|
|
|
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
|
|
|
name = models.CharField(max_length=MAX_CHARFIELD_LEN)
|
|
|
|
|
|
2024-06-23 15:52:45 +00:00
|
|
|
objects = DoctorManager()
|
|
|
|
|
substrings = DoctorSubstringManager()
|
|
|
|
|
|
2021-10-22 22:36:17 +00:00
|
|
|
|
2021-10-20 14:05:23 +00:00
|
|
|
@final
|
2021-07-04 15:58:33 +00:00
|
|
|
class Patient(TestBase):
|
2021-10-20 14:05:23 +00:00
|
|
|
name = models.CharField(max_length=MAX_CHARFIELD_LEN)
|
|
|
|
|
email = models.EmailField(max_length=MAX_CHARFIELD_LEN, blank=True)
|
2021-07-04 15:58:33 +00:00
|
|
|
example = models.ForeignKey(
|
2021-10-20 14:05:23 +00:00
|
|
|
'ExampleModel',
|
|
|
|
|
null=True,
|
|
|
|
|
blank=True,
|
|
|
|
|
on_delete=models.PROTECT,
|
2021-07-04 15:58:33 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Encounter(TestBase):
|
|
|
|
|
num = models.PositiveSmallIntegerField()
|
|
|
|
|
patient = models.ForeignKey(Patient, on_delete=models.PROTECT)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return '%s: encounter num %d' % (self.patient, self.num)
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_eav()
|
2021-10-20 14:05:23 +00:00
|
|
|
@final
|
2021-07-04 15:58:33 +00:00
|
|
|
class ExampleModel(TestBase):
|
2021-10-20 14:05:23 +00:00
|
|
|
name = models.CharField(max_length=MAX_CHARFIELD_LEN)
|
2021-07-04 15:58:33 +00:00
|
|
|
|
|
|
|
|
def __unicode__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_eav()
|
2021-10-20 14:05:23 +00:00
|
|
|
@final
|
2021-07-04 15:58:33 +00:00
|
|
|
class M2MModel(TestBase):
|
2021-10-20 14:05:23 +00:00
|
|
|
name = models.CharField(max_length=MAX_CHARFIELD_LEN)
|
2021-07-04 15:58:33 +00:00
|
|
|
models = models.ManyToManyField(ExampleModel)
|
|
|
|
|
|
|
|
|
|
def __unicode__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
2021-10-20 14:05:23 +00:00
|
|
|
@final
|
2021-07-04 15:58:33 +00:00
|
|
|
class ExampleMetaclassModel(TestBase, metaclass=EAVModelMeta):
|
2021-10-20 14:05:23 +00:00
|
|
|
name = models.CharField(max_length=MAX_CHARFIELD_LEN)
|
2021-07-04 15:58:33 +00:00
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
2021-10-20 14:05:23 +00:00
|
|
|
@final
|
2021-07-04 15:58:33 +00:00
|
|
|
class RegisterTestModel(TestBase, metaclass=EAVModelMeta):
|
2021-10-20 14:05:23 +00:00
|
|
|
name = models.CharField(max_length=MAX_CHARFIELD_LEN)
|
2021-07-04 15:58:33 +00:00
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.name
|