django-eav2/test_project/models.py

144 lines
3.4 KiB
Python
Raw Normal View History

import sys
import uuid
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
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
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)
@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)
objects = DoctorManager()
substrings = DoctorSubstringManager()
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