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.

Files changed (58) hide show
  1. {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/METADATA +1 -1
  2. {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/RECORD +58 -57
  3. edc_action_item/site_action_items.py +2 -2
  4. edc_appointment/view_utils/appointment_button.py +1 -1
  5. edc_consent/modeladmin_mixins/consent_model_admin_mixin.py +14 -12
  6. edc_consent/models/__init__.py +2 -2
  7. edc_consent/models/signals.py +26 -28
  8. edc_dashboard/view_mixins/message_view_mixin.py +3 -4
  9. edc_identifier/admin.py +3 -2
  10. edc_identifier/identifier.py +5 -5
  11. edc_identifier/model_mixins.py +1 -1
  12. edc_identifier/models.py +7 -6
  13. edc_identifier/research_identifier.py +1 -1
  14. edc_identifier/short_identifier.py +1 -1
  15. edc_identifier/simple_identifier.py +15 -5
  16. edc_identifier/subject_identifier.py +2 -2
  17. edc_identifier/utils.py +13 -14
  18. edc_listboard/view_mixins/search_listboard_view_mixin.py +6 -7
  19. edc_metadata/view_mixins/metadata_view_mixin.py +7 -4
  20. edc_navbar/navbar.py +2 -2
  21. edc_randomization/admin.py +3 -1
  22. edc_randomization/apps.py +8 -11
  23. edc_randomization/auth_objects.py +9 -0
  24. edc_randomization/blinding.py +6 -12
  25. edc_randomization/decorators.py +2 -3
  26. edc_randomization/exceptions.py +73 -0
  27. edc_randomization/model_mixins.py +2 -3
  28. edc_randomization/randomization_list_importer.py +35 -36
  29. edc_randomization/randomization_list_verifier.py +19 -21
  30. edc_randomization/randomizer.py +12 -28
  31. edc_randomization/site_randomizers.py +2 -16
  32. edc_randomization/system_checks.py +1 -1
  33. edc_randomization/utils.py +3 -10
  34. edc_review_dashboard/middleware.py +4 -4
  35. edc_review_dashboard/views/subject_review_listboard_view.py +3 -3
  36. edc_screening/age_evaluator.py +1 -1
  37. edc_screening/eligibility.py +5 -5
  38. edc_screening/exceptions.py +3 -3
  39. edc_screening/gender_evaluator.py +1 -1
  40. edc_screening/modelform_mixins.py +1 -1
  41. edc_screening/screening_eligibility.py +30 -35
  42. edc_screening/utils.py +10 -12
  43. edc_sites/admin/list_filters.py +2 -2
  44. edc_sites/admin/site_model_admin_mixin.py +8 -8
  45. edc_sites/exceptions.py +1 -1
  46. edc_sites/forms.py +3 -1
  47. edc_sites/management/commands/sync_sites.py +11 -17
  48. edc_sites/models/site_profile.py +6 -4
  49. edc_sites/post_migrate_signals.py +2 -2
  50. edc_sites/site.py +8 -8
  51. edc_sites/utils/add_or_update_django_sites.py +3 -3
  52. edc_sites/utils/valid_site_for_subject_or_raise.py +7 -4
  53. edc_sites/view_mixins.py +2 -2
  54. edc_subject_dashboard/view_utils/subject_screening_button.py +5 -3
  55. edc_view_utils/dashboard_model_button.py +3 -3
  56. edc_visit_schedule/site_visit_schedules.py +2 -1
  57. {clinicedc-2.0.24.dist-info → clinicedc-2.0.26.dist-info}/WHEEL +0 -0
  58. {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: django_apps | None = None,
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("Skipping validation of current site against registered subject site.")
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, TypeVar
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 = TypeVar("ScreeningModel", bound=ScreeningModelMixin)
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 = field(init=False)
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, cdef: ConsentDefinition
96
+ self,
97
+ cdef: ConsentDefinition,
97
98
  ) -> tuple[VisitSchedule, Schedule]:
98
99
  """Returns a visit schedule instance or raises."""
99
100
  ret = []