from django.db import models
class CaseTemplateManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
[docs]
class CaseTemplate(models.Model):
"""
Represents a case template.
Attributes:
name (str): The unique name of the case template.
template_type (ForeignKey): The type of the case template.
description (str): A description of the case template.
rules: The primary rules associated with the case template.
secondary_rules: Secondary rules associated with the case template.
"""
name = models.CharField(max_length=255, unique=True)
template_type = models.ForeignKey("CaseTemplateType", on_delete=models.CASCADE, related_name="case_templates")
description = models.TextField(blank=True, null=True)
rules = models.ManyToManyField(
"CaseTemplateRule",
)
secondary_rules = models.ManyToManyField(
"CaseTemplateRule",
related_name="secondary_rules"
)
objects = CaseTemplateManager()
[docs]
def natural_key(self):
"""
Returns the natural key for the case template.
Returns:
tuple: The natural key consisting of the name.
"""
return (self.name,)
def __str__(self):
"""
String representation of the case template.
Returns:
str: The name of the case template.
"""
return str(self.name)
[docs]
def get_rules(self):
"""
Retrieves all primary rules associated with the case template.
Returns:
A queryset of primary rules.
"""
return self.rules.all()
[docs]
def get_secondary_rules(self):
"""
Retrieves all secondary rules associated with the case template.
Returns:
QuerySet: A queryset of secondary rules.
"""
rules = self.secondary_rules.all()
return rules
def _assert_max_one_create_patient_rule(self):
"""
Ensures that there is at most one rule with rule_type "create-object" and target_model "Patient".
Raises:
ValueError: If more than one rule of the specified type exists.
"""
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model__name="Patient")
if len(create_patient_rules) > 1:
raise ValueError(
"There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'."
)
# custom save method which runs the _assert_max_one_create_patient_rule method and others
[docs]
def save(self, *args, **kwargs):
# self._assert_max_one_create_patient_rule() #TODO Fails on first save since many to many can only be used if object has an id
super().save(*args, **kwargs)
[docs]
def get_create_patient_rule(self):
"""
Retrieves the "create-patient" rule.
Returns:
CaseTemplateRule: The rule that creates a patient.
Raises:
ValueError: If multiple such rules exist.
"""
from .case_template_rule import CaseTemplateRule
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
if len(create_patient_rules) > 1:
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
elif len(create_patient_rules) == 0:
create_patient_rules = CaseTemplateRule.objects.get_default_create_patient_rule()
return create_patient_rules[0]
[docs]
def get_create_patient_medication_schedule_rule(self):
"""
Retrieves the "create-patient_medication_schedule" rule.
Returns:
CaseTemplateRule: The rule for creating a patient medication schedule.
Raises:
ValueError: If multiple such rules exist.
"""
from .case_template_rule import CaseTemplateRule
create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
if len(create_patient_medication_schedule_rules) > 1:
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'PatientMedicationSchedule'.")
elif len(create_patient_medication_schedule_rules) == 0:
from warnings import warn
warn("No create patient medication schedule rule found. Using default create patient medication schedule rule.")
create_patient_medication_schedule_rules = CaseTemplateRule.objects.get_default_create_patient_medication_schedule_rule()
return create_patient_medication_schedule_rules[0]