diff --git a/edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py b/edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py index 2ae9177..e047c9c 100644 --- a/edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py +++ b/edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py @@ -7,11 +7,9 @@ from django import forms from edc_constants.constants import NO, YES from edc_model_form.utils import get_field_or_raise -from edc_sites.site import sites as site_sites from edc_utils import AgeValueError, age, formatted_age -from ...exceptions import SiteConsentError -from ...site_consents import ConsentDefinitionDoesNotExist, site_consents +from ...exceptions import ConsentDefinitionValidityPeriodError from ...utils import InvalidInitials, verify_initials_against_full_name if TYPE_CHECKING: @@ -29,23 +27,17 @@ class ConsentModelFormValidationMixin: @property def consent_definition(self) -> ConsentDefinition: - """Returns a ConsentDefinition instance or raises on - missing data. + """Returns a ConsentDefinition instance or raises + if consent date not within consent definition validity + period. """ - current_site_id = getattr( - self.instance.site, "id", site_sites.get_current_site().site_id - ) - try: - consent_definition = site_consents.get_consent_definition( - model=self._meta.model._meta.label_lower, - report_datetime=self.consent_datetime, - site=site_sites.get(current_site_id), - ) - except (ConsentDefinitionDoesNotExist, SiteConsentError) as e: - raise forms.ValidationError(e) - if not consent_definition.version: - raise forms.ValidationError("Unable to determine consent version") - return consent_definition + cdef: ConsentDefinition = self.subject_screening.consent_definition + if self.consent_datetime: + try: + cdef.valid_for_datetime_or_raise(self.consent_datetime) + except ConsentDefinitionValidityPeriodError as e: + raise forms.ValidationError({"consent_datetime": str(e)}) + return cdef def get_field_or_raise(self, name: str, msg: str) -> Any: return get_field_or_raise( diff --git a/edc_consent/modelform_mixins/requires_consent_modelform_mixin.py b/edc_consent/modelform_mixins/requires_consent_modelform_mixin.py index 7e4f7c0..2964602 100644 --- a/edc_consent/modelform_mixins/requires_consent_modelform_mixin.py +++ b/edc_consent/modelform_mixins/requires_consent_modelform_mixin.py @@ -9,6 +9,7 @@ from edc_utils.date import to_local, to_utc from edc_visit_schedule.site_visit_schedules import site_visit_schedules +from .. import NotConsentedError from ..exceptions import ConsentDefinitionDoesNotExist if TYPE_CHECKING: @@ -38,6 +39,8 @@ def validate_against_consent(self) -> None: model_obj = self.get_consent_or_raise() except ConsentDefinitionDoesNotExist as e: raise forms.ValidationError(e) + except NotConsentedError as e: + raise forms.ValidationError(e) else: if floor_secs(to_utc(self.report_datetime)) < floor_secs( model_obj.consent_datetime diff --git a/edc_consent/tests/models.py b/edc_consent/tests/models.py index 35949bf..a681981 100644 --- a/edc_consent/tests/models.py +++ b/edc_consent/tests/models.py @@ -17,10 +17,16 @@ ReviewFieldsMixin, VulnerabilityFieldsMixin, ) -from edc_consent.model_mixins import ConsentModelMixin, RequiresConsentFieldsModelMixin +from edc_consent.model_mixins import ( + ConsentDefinitionModelMixin, + ConsentModelMixin, + RequiresConsentFieldsModelMixin, +) + +class SubjectScreening(SiteModelMixin, ConsentDefinitionModelMixin, BaseUuidModel): + consent_definition = None -class SubjectScreening(SiteModelMixin, BaseUuidModel): screening_identifier = models.CharField(max_length=25, unique=True) initials = models.CharField(max_length=5, default="TO") diff --git a/edc_consent/tests/tests/test_consent_form.py b/edc_consent/tests/tests/test_consent_form.py index 8c9af20..fc1c813 100644 --- a/edc_consent/tests/tests/test_consent_form.py +++ b/edc_consent/tests/tests/test_consent_form.py @@ -55,17 +55,19 @@ def setUp(self): self.study_open_datetime = ResearchProtocolConfig().study_open_datetime self.study_close_datetime = ResearchProtocolConfig().study_close_datetime - self.consent_factory( + self.convent_v1 = self.consent_factory( start=self.study_open_datetime, end=self.study_open_datetime + timedelta(days=50), version="1.0", ) - self.consent_factory( + SubjectScreening.consent_definition = self.convent_v1 + + self.convent_v2 = self.consent_factory( start=self.study_open_datetime + timedelta(days=51), end=self.study_open_datetime + timedelta(days=100), version="2.0", ) - self.consent_factory( + self.convent_v3 = self.consent_factory( start=self.study_open_datetime + timedelta(days=101), end=self.study_open_datetime + timedelta(days=150), version="3.0",