clinicedc 2.0.24__py3-none-any.whl → 2.0.26__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of clinicedc might be problematic. Click here for more details.
- {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/METADATA +1 -1
- {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/RECORD +58 -57
- edc_action_item/site_action_items.py +2 -2
- edc_appointment/view_utils/appointment_button.py +1 -1
- edc_consent/modeladmin_mixins/consent_model_admin_mixin.py +14 -12
- edc_consent/models/__init__.py +2 -2
- edc_consent/models/signals.py +26 -28
- edc_dashboard/view_mixins/message_view_mixin.py +3 -4
- edc_identifier/admin.py +3 -2
- edc_identifier/identifier.py +5 -5
- edc_identifier/model_mixins.py +1 -1
- edc_identifier/models.py +7 -6
- edc_identifier/research_identifier.py +1 -1
- edc_identifier/short_identifier.py +1 -1
- edc_identifier/simple_identifier.py +15 -5
- edc_identifier/subject_identifier.py +2 -2
- edc_identifier/utils.py +13 -14
- edc_listboard/view_mixins/search_listboard_view_mixin.py +6 -7
- edc_metadata/view_mixins/metadata_view_mixin.py +7 -4
- edc_navbar/navbar.py +2 -2
- edc_randomization/admin.py +3 -1
- edc_randomization/apps.py +8 -11
- edc_randomization/auth_objects.py +9 -0
- edc_randomization/blinding.py +6 -12
- edc_randomization/decorators.py +2 -3
- edc_randomization/exceptions.py +73 -0
- edc_randomization/model_mixins.py +2 -3
- edc_randomization/randomization_list_importer.py +35 -36
- edc_randomization/randomization_list_verifier.py +19 -21
- edc_randomization/randomizer.py +12 -28
- edc_randomization/site_randomizers.py +2 -16
- edc_randomization/system_checks.py +1 -1
- edc_randomization/utils.py +3 -10
- edc_review_dashboard/middleware.py +4 -4
- edc_review_dashboard/views/subject_review_listboard_view.py +3 -3
- edc_screening/age_evaluator.py +1 -1
- edc_screening/eligibility.py +5 -5
- edc_screening/exceptions.py +3 -3
- edc_screening/gender_evaluator.py +1 -1
- edc_screening/modelform_mixins.py +1 -1
- edc_screening/screening_eligibility.py +30 -35
- edc_screening/utils.py +10 -12
- edc_sites/admin/list_filters.py +2 -2
- edc_sites/admin/site_model_admin_mixin.py +8 -8
- edc_sites/exceptions.py +1 -1
- edc_sites/forms.py +3 -1
- edc_sites/management/commands/sync_sites.py +11 -17
- edc_sites/models/site_profile.py +6 -4
- edc_sites/post_migrate_signals.py +2 -2
- edc_sites/site.py +8 -8
- edc_sites/utils/add_or_update_django_sites.py +3 -3
- edc_sites/utils/valid_site_for_subject_or_raise.py +7 -4
- edc_sites/view_mixins.py +2 -2
- edc_subject_dashboard/view_utils/subject_screening_button.py +5 -3
- edc_view_utils/dashboard_model_button.py +3 -3
- edc_visit_schedule/site_visit_schedules.py +2 -1
- {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/WHEEL +0 -0
- {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,8 +6,8 @@ style = color_style()
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def post_migrate_update_sites(sender=None, **kwargs):
|
|
9
|
-
from .site import sites as site_sites
|
|
10
|
-
from .utils import add_or_update_django_sites
|
|
9
|
+
from .site import sites as site_sites # noqa: PLC0415
|
|
10
|
+
from .utils import add_or_update_django_sites # noqa: PLC0415
|
|
11
11
|
|
|
12
12
|
sys.stdout.write(style.MIGRATE_HEADING("Updating sites:\n"))
|
|
13
13
|
|
edc_sites/site.py
CHANGED
|
@@ -52,23 +52,23 @@ __all__ = [
|
|
|
52
52
|
]
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
class SiteDoesNotExist(Exception):
|
|
55
|
+
class SiteDoesNotExist(Exception): # noqa: N818
|
|
56
56
|
pass
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
class AlreadyRegistered(Exception):
|
|
59
|
+
class AlreadyRegistered(Exception): # noqa: N818
|
|
60
60
|
pass
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
class AlreadyRegisteredName(Exception):
|
|
63
|
+
class AlreadyRegisteredName(Exception): # noqa: N818
|
|
64
64
|
pass
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
class AlreadyRegisteredDomain(Exception):
|
|
67
|
+
class AlreadyRegisteredDomain(Exception): # noqa: N818
|
|
68
68
|
pass
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
class SiteNotRegistered(Exception):
|
|
71
|
+
class SiteNotRegistered(Exception): # noqa: N818
|
|
72
72
|
pass
|
|
73
73
|
|
|
74
74
|
|
|
@@ -157,7 +157,7 @@ class Sites:
|
|
|
157
157
|
for single_site in single_sites:
|
|
158
158
|
if get_insert_uat_subdomain():
|
|
159
159
|
domain = insert_into_domain(single_site.domain, self.uat_subdomain)
|
|
160
|
-
single_site = dataclasses.replace(single_site, domain=domain)
|
|
160
|
+
single_site = dataclasses.replace(single_site, domain=domain) # noqa: PLW2901
|
|
161
161
|
|
|
162
162
|
if single_site.site_id in self._registry:
|
|
163
163
|
raise AlreadyRegistered(f"Site already registered. Got `{single_site}`.")
|
|
@@ -282,8 +282,8 @@ class Sites:
|
|
|
282
282
|
def user_may_view_other_sites(
|
|
283
283
|
self,
|
|
284
284
|
request: WSGIRequest = None,
|
|
285
|
-
user: User = None,
|
|
286
|
-
site_id: int = None,
|
|
285
|
+
user: User | None = None,
|
|
286
|
+
site_id: int | None = None,
|
|
287
287
|
) -> list[int]:
|
|
288
288
|
return self.get_view_only_site_ids_for_user(
|
|
289
289
|
request=request,
|
|
@@ -15,14 +15,14 @@ class UpdateDjangoSitesError(Exception):
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def get_sites():
|
|
18
|
-
from ..site import sites # prevent circular import
|
|
18
|
+
from ..site import sites # prevent circular import # noqa: PLC0415
|
|
19
19
|
|
|
20
20
|
return sites
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def add_or_update_django_sites(
|
|
24
|
-
apps
|
|
25
|
-
single_sites: list[SingleSite] | tuple[SingleSite] = None,
|
|
24
|
+
apps=None,
|
|
25
|
+
single_sites: list[SingleSite] | tuple[SingleSite] | None = None,
|
|
26
26
|
verbose: bool | None = None,
|
|
27
27
|
):
|
|
28
28
|
"""Removes default site and adds/updates given `sites`, etc.
|
|
@@ -30,7 +30,10 @@ def valid_site_for_subject_or_raise(
|
|
|
30
30
|
subject_identifier, raise_exception=True
|
|
31
31
|
)
|
|
32
32
|
if skip_get_current_site:
|
|
33
|
-
warn(
|
|
33
|
+
warn(
|
|
34
|
+
"Skipping validation of current site against registered subject site.",
|
|
35
|
+
stacklevel=2,
|
|
36
|
+
)
|
|
34
37
|
site_obj = registered_subject.site
|
|
35
38
|
else:
|
|
36
39
|
site_obj: Site = get_site_model_cls().objects.get_current()
|
|
@@ -40,15 +43,15 @@ def valid_site_for_subject_or_raise(
|
|
|
40
43
|
site=site_obj,
|
|
41
44
|
raise_exception=True,
|
|
42
45
|
)
|
|
43
|
-
except RegisteredSubjectDoesNotExist:
|
|
46
|
+
except RegisteredSubjectDoesNotExist as e:
|
|
44
47
|
if not registered_subject.site_id:
|
|
45
48
|
raise InvalidSiteForSubjectError(
|
|
46
49
|
"Site not defined for registered subject! "
|
|
47
50
|
f"Subject identifier=`{subject_identifier}`. "
|
|
48
|
-
)
|
|
51
|
+
) from e
|
|
49
52
|
raise InvalidSiteForSubjectError(
|
|
50
53
|
f"Invalid site for subject. Subject identifier=`{subject_identifier}`. "
|
|
51
54
|
f"Expected `{registered_subject.site.name}`. "
|
|
52
55
|
f"Got site_id=`{site_obj.id}`"
|
|
53
|
-
)
|
|
56
|
+
) from e
|
|
54
57
|
return site_obj
|
edc_sites/view_mixins.py
CHANGED
|
@@ -19,10 +19,10 @@ class SiteViewMixin:
|
|
|
19
19
|
kwargs.update(site_profile=site_profile)
|
|
20
20
|
try:
|
|
21
21
|
kwargs.update(site_title=site_profile.title)
|
|
22
|
-
except AttributeError:
|
|
22
|
+
except AttributeError as e:
|
|
23
23
|
if not sites.all():
|
|
24
24
|
raise SiteNotRegistered(
|
|
25
25
|
"Unable to determine site profile 'title'. No sites have been registered! "
|
|
26
|
-
)
|
|
26
|
+
) from e
|
|
27
27
|
raise
|
|
28
28
|
return kwargs
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import TYPE_CHECKING
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
5
|
from uuid import UUID
|
|
6
6
|
|
|
7
7
|
from django.contrib.sites.models import Site
|
|
@@ -11,16 +11,18 @@ from django.utils.translation import gettext as _
|
|
|
11
11
|
from edc_view_utils import DashboardModelButton
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
+
from edc_model.models import BaseUuidModel
|
|
14
15
|
from edc_screening.model_mixins import ScreeningModelMixin
|
|
15
16
|
|
|
16
|
-
ScreeningModel
|
|
17
|
+
class ScreeningModel(ScreeningModelMixin, BaseUuidModel): ...
|
|
18
|
+
|
|
17
19
|
|
|
18
20
|
__all__ = ["SubjectScreeningButton"]
|
|
19
21
|
|
|
20
22
|
|
|
21
23
|
@dataclass
|
|
22
24
|
class SubjectScreeningButton(DashboardModelButton):
|
|
23
|
-
model_obj: ScreeningModel = None
|
|
25
|
+
model_obj: ScreeningModel | None = None
|
|
24
26
|
metadata_model_obj: models.Model = field(init=False)
|
|
25
27
|
|
|
26
28
|
def __post_init__(self):
|
|
@@ -34,9 +34,9 @@ class DashboardModelButton(ModelButton):
|
|
|
34
34
|
|
|
35
35
|
"""
|
|
36
36
|
|
|
37
|
-
model_obj: CrfModel | RequisitionModel =
|
|
38
|
-
metadata_model_obj: CrfMetadata | RequisitionMetadata = None
|
|
39
|
-
appointment: Appointment = None
|
|
37
|
+
model_obj: CrfModel | RequisitionModel | None = None
|
|
38
|
+
metadata_model_obj: CrfMetadata | RequisitionMetadata | None = None
|
|
39
|
+
appointment: Appointment | None = None
|
|
40
40
|
next_url_name: str = field(default="subject_dashboard_url")
|
|
41
41
|
model_cls: type[CrfModel | RequisitionModel] = field(default=None, init=False)
|
|
42
42
|
|
|
@@ -93,7 +93,8 @@ class SiteVisitSchedules:
|
|
|
93
93
|
return visit_schedules or self.registry
|
|
94
94
|
|
|
95
95
|
def get_by_consent_definition(
|
|
96
|
-
self,
|
|
96
|
+
self,
|
|
97
|
+
cdef: ConsentDefinition,
|
|
97
98
|
) -> tuple[VisitSchedule, Schedule]:
|
|
98
99
|
"""Returns a visit schedule instance or raises."""
|
|
99
100
|
ret = []
|
|
File without changes
|
|
File without changes
|