Skip to content

Commit

Permalink
require all values when creating
Browse files Browse the repository at this point in the history
  • Loading branch information
erikvw committed Jul 11, 2023
1 parent f06968e commit ef24246
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 27 deletions.
47 changes: 21 additions & 26 deletions edc_reference/reference/reference_getter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

from datetime import datetime
from decimal import Decimal
from typing import TYPE_CHECKING

from django.apps import apps as django_apps
from django.core.exceptions import ObjectDoesNotExist

from ..site_reference import site_reference_configs

if TYPE_CHECKING:
from ..models import Reference


class ReferenceGetterError(Exception):
pass
Expand Down Expand Up @@ -97,6 +101,7 @@ def __init__(
self.reference_model_cls = django_apps.get_model(reference_model)

# note: updater needs to "update_value"
# if 'object' does not exist, will be created
self.value = getattr(self.object, "value")
self.has_value = True
setattr(self, self.field_name, self.value)
Expand All @@ -109,29 +114,33 @@ def __repr__(self):
)

@property
def object(self):
def object(self) -> Reference:
"""Returns a reference model instance."""
if not self._object:
self.created = False
opts = self.required_options
opts.update(**{k: v for k, v in self.visit_options.items() if v is not None})
if {k: v for k, v in opts.items() if v is None}:
raise ReferenceGetterError(
"Unable to get a reference instance. Null values for attrs "
f"not allowed. {self}. Got {opts}."
)
try:
self._object = self.reference_model_cls.objects.get(**opts)
self._object = self.reference_model_cls.objects.get(**self.options)
except ObjectDoesNotExist as e:
if self.create:
self._object = self.create_reference_obj()
self._object = self.reference_model_cls.objects.create(**self.options)
self.created = True
else:
raise ReferenceObjectDoesNotExist(f"{e}. Using {opts}")
raise ReferenceObjectDoesNotExist(f"{e}. Using {self.options}")
return self._object

@property
def required_options(self):
def options(self) -> dict:
opts = self.required_options
opts.update(**{k: v for k, v in self.visit_options.items()})
if {k: v for k, v in opts.items() if v is None}:
raise ReferenceGetterError(
"Unable to get a reference instance. Null values for attrs "
f"not allowed. {self}. Got {opts}."
)
return opts

@property
def required_options(self) -> dict:
"""Returns a dictionary of query options required for both
get and create.
"""
Expand All @@ -156,17 +165,3 @@ def visit_options(self):
site=self.site,
)
return opts

def create_reference_obj(self):
"""Returns a newly create reference instance.
Note: updater needs to "update_value".
"""
opts = self.required_options
opts.update(**{k: v for k, v in self.visit_options.items() if v is not None})
if {k: v for k, v in opts.items() if v is None}:
raise ReferenceGetterError(
"Unable to create a reference instance. Null values for attrs "
f"not allowed. {self}. Got {opts}."
)
return self.reference_model_cls.objects.create(**opts)
9 changes: 8 additions & 1 deletion edc_reference/tests/tests/test_reference.py
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,8 @@ def test_reference_getter_without_using_model_obj_and_missing_visit_attr(self):
timepoint=crf_one.related_visit.timepoint,
site=crf_one.site,
)
self.assertRaises(ReferenceGetterError, ReferenceGetter, **opts)
opts.update(visit_code_sequence=0)
reference = ReferenceGetter(**opts)
self.assertEqual(reference.field_int, integer)

Expand All @@ -479,7 +481,12 @@ def test_reference_getter_raises(self):
field_name="field_int",
subject_identifier=self.subject_identifier,
report_datetime=self.subject_visit.report_datetime,
site=self.site,
visit_schedule_name=self.subject_visit.visit_schedule_name,
schedule_name=self.subject_visit.schedule_name,
visit_code=self.subject_visit.visit_code,
visit_code_sequence=self.subject_visit.visit_code_sequence,
timepoint=self.subject_visit.timepoint,
site=self.subject_visit.site,
)
self.assertRaises(ReferenceObjectDoesNotExist, ReferenceGetter, **opts)

Expand Down

0 comments on commit ef24246

Please sign in to comment.