clinicedc 2.0.0__py3-none-any.whl → 2.0.2__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 (896) hide show
  1. {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/METADATA +15 -22
  2. {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/RECORD +895 -792
  3. {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/WHEEL +1 -1
  4. edc_action_item/action.py +13 -32
  5. edc_action_item/action_with_notification.py +1 -2
  6. edc_action_item/admin/action_item_admin.py +2 -6
  7. edc_action_item/admin_site.py +1 -3
  8. edc_action_item/auths.py +1 -3
  9. edc_action_item/create_or_update_action_type.py +1 -3
  10. edc_action_item/data_fixers.py +7 -20
  11. edc_action_item/forms/action_item_form.py +1 -3
  12. edc_action_item/management/commands/inspect_action_items.py +3 -9
  13. edc_action_item/migrations/0001_initial.py +4 -5
  14. edc_action_item/migrations/0003_auto_20180116_1528.py +2 -1
  15. edc_action_item/migrations/0006_auto_20180707_1659.py +3 -4
  16. edc_action_item/migrations/0007_auto_20180707_1715.py +1 -3
  17. edc_action_item/migrations/0008_auto_20180809_0303.py +2 -1
  18. edc_action_item/migrations/0014_auto_20181121_1738.py +2 -6
  19. edc_action_item/migrations/0015_auto_20190114_0250.py +4 -3
  20. edc_action_item/migrations/0021_auto_20190628_2113.py +1 -3
  21. edc_action_item/migrations/0022_auto_20190628_2136.py +2 -6
  22. edc_action_item/migrations/0030_edcpermissions.py +1 -1
  23. edc_action_item/migrations/0033_alter_actionitem_managers.py +1 -0
  24. edc_action_item/migrations/0034_alter_actionitem_device_created_and_more.py +13 -37
  25. edc_action_item/migrations/0038_alter_actionitem_revision_alter_actiontype_revision_and_more.py +86 -0
  26. edc_action_item/models/action_item.py +2 -6
  27. edc_action_item/models/action_model_mixin.py +5 -16
  28. edc_action_item/models/action_type.py +1 -3
  29. edc_action_item/models/reference.py +1 -2
  30. edc_action_item/models/signals.py +3 -9
  31. edc_action_item/site_action_items.py +4 -12
  32. edc_action_item/templatetags/action_item_extras.py +1 -3
  33. edc_action_item/view_utils/action_item_button.py +1 -3
  34. edc_action_item/view_utils/action_item_popover_list_item.py +1 -2
  35. edc_adherence/migrations/0002_nonadherencereasons_plural_name.py +1 -3
  36. edc_adherence/model_admin_mixin.py +1 -3
  37. edc_adverse_event/action_items/ae_followup_action.py +2 -6
  38. edc_adverse_event/action_items/ae_initial_action.py +3 -7
  39. edc_adverse_event/auth_objects.py +2 -6
  40. edc_adverse_event/constants.py +1 -3
  41. edc_adverse_event/form_validator_mixins/death_report_form_validator.py +1 -3
  42. edc_adverse_event/form_validator_mixins/requires_death_report_form_validator_mixin.py +2 -7
  43. edc_adverse_event/form_validators/hospitalization.py +1 -3
  44. edc_adverse_event/migrations/0003_auto_20191026_2231.py +3 -9
  45. edc_adverse_event/migrations/0008_auto_20220825_0451.py +1 -1
  46. edc_adverse_event/migrations/0009_auto_20220907_0157.py +1 -1
  47. edc_adverse_event/migrations/0010_auto_20220913_2139.py +4 -12
  48. edc_adverse_event/migrations/0013_alter_aeactionclassification_device_created_and_more.py +11 -31
  49. edc_adverse_event/migrations/0015_alter_aeactionclassification_revision_and_more.py +74 -0
  50. edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +1 -3
  51. edc_adverse_event/model_mixins/ae_followup/ae_followup_model_mixin.py +1 -5
  52. edc_adverse_event/model_mixins/ae_initial/ae_initial_ae_model_mixin.py +1 -3
  53. edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +1 -3
  54. edc_adverse_event/model_mixins/ae_initial/ae_initial_susar_model_mixin.py +1 -2
  55. edc_adverse_event/model_mixins/ae_special_interest/aesi_model_mixin.py +1 -5
  56. edc_adverse_event/model_mixins/ae_susar/ae_susar_model_mixin.py +1 -5
  57. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +2 -6
  58. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_model_mixin.py +1 -5
  59. edc_adverse_event/model_mixins/death_report/death_report_extra_fields_model_mixin.py +1 -2
  60. edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +2 -5
  61. edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +2 -7
  62. edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +1 -3
  63. edc_adverse_event/modeladmin_mixins/ae_tmg_admin_mixin.py +1 -3
  64. edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +6 -10
  65. edc_adverse_event/modelform_mixins/ae_tmg_modelform_mixin.py +1 -3
  66. edc_adverse_event/models/signals.py +3 -9
  67. edc_adverse_event/pdf_reports/ae_pdf_report.py +6 -18
  68. edc_adverse_event/pdf_reports/death_pdf_report.py +3 -9
  69. edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -15
  70. edc_adverse_event/utils.py +2 -6
  71. edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +1 -3
  72. edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +1 -3
  73. edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -6
  74. edc_adverse_event/view_utils/tmg_button.py +2 -6
  75. edc_adverse_event/views/home_view.py +1 -3
  76. edc_adverse_event/views/tmg/death_listboard_view.py +1 -3
  77. edc_adverse_event/views/tmg/home_view.py +2 -6
  78. edc_adverse_event/views/tmg/summary_listboard_view.py +1 -3
  79. edc_appconfig/apps.py +3 -2
  80. edc_appointment/admin/appointment_admin.py +1 -3
  81. edc_appointment/admin/list_filters.py +1 -3
  82. edc_appointment/admin_site.py +1 -3
  83. edc_appointment/analytics/dataframes/get_appointment_df.py +2 -6
  84. edc_appointment/appointment_reason_updater.py +2 -5
  85. edc_appointment/appointment_status_updater.py +1 -4
  86. edc_appointment/constants.py +1 -3
  87. edc_appointment/creators/appointment_creator.py +4 -10
  88. edc_appointment/creators/appointments_creator.py +3 -2
  89. edc_appointment/creators/unscheduled_appointment_creator.py +3 -7
  90. edc_appointment/creators/utils.py +4 -0
  91. edc_appointment/form_validator_mixins/next_appointment_crf_form_validator_mixin.py +3 -10
  92. edc_appointment/form_validator_mixins/window_period_form_validator_mixin.py +3 -9
  93. edc_appointment/form_validators/appointment_form_validator.py +11 -37
  94. edc_appointment/form_validators/next_appointment_crf_form_validator.py +1 -3
  95. edc_appointment/form_validators/utils.py +1 -3
  96. edc_appointment/managers.py +2 -6
  97. edc_appointment/migrations/0002_auto_20161126_1156.py +5 -8
  98. edc_appointment/migrations/0003_auto_20161127_2226.py +7 -16
  99. edc_appointment/migrations/0006_auto_20170106_2118.py +2 -1
  100. edc_appointment/migrations/0008_auto_20171115_1601.py +3 -4
  101. edc_appointment/migrations/0014_auto_20180116_1411.py +2 -1
  102. edc_appointment/migrations/0024_auto_20200911_0425.py +1 -1
  103. edc_appointment/migrations/0034_appointmenttype_alter_appointment_appt_type_and_more.py +2 -4
  104. edc_appointment/migrations/0036_auto_20230124_1822.py +2 -6
  105. edc_appointment/migrations/0040_appointment_appt_type_other_and_more.py +1 -0
  106. edc_appointment/migrations/0042_alter_appointment_device_created_and_more.py +5 -13
  107. edc_appointment/migrations/0046_infosources.py +1 -3
  108. edc_appointment/migrations/0047_alter_appointment_options_and_more.py +1 -3
  109. edc_appointment/migrations/0049_alter_appointment_revision_and_more.py +38 -0
  110. edc_appointment/model_mixins/appointment_methods_model_mixin.py +1 -5
  111. edc_appointment/model_mixins/appointment_model_mixin.py +7 -12
  112. edc_appointment/model_mixins/next_appointment_crf_model_mixin.py +1 -3
  113. edc_appointment/modeladmin_mixins/next_appointment_crf_modeladmin_mixin.py +1 -3
  114. edc_appointment/modelform_mixins/next_appointment_crf_modelform_mixins.py +1 -5
  115. edc_appointment/models/signals.py +5 -17
  116. edc_appointment/utils.py +11 -33
  117. edc_appointment/view_mixins/appointment_view_mixin.py +2 -6
  118. edc_auth/admin/list_filters.py +2 -6
  119. edc_auth/admin/role_admin.py +1 -3
  120. edc_auth/admin/user_admin.py +4 -12
  121. edc_auth/admin/user_profile_admin.py +2 -5
  122. edc_auth/auth_updater/auth_updater.py +1 -3
  123. edc_auth/forms.py +1 -3
  124. edc_auth/get_app_codenames.py +1 -3
  125. edc_auth/import_users.py +3 -9
  126. edc_auth/management/commands/export_users.py +1 -3
  127. edc_auth/management/commands/reset_password.py +1 -3
  128. edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +4 -12
  129. edc_auth/migrations/0015_auto_20191026_2149.py +1 -3
  130. edc_auth/migrations/0016_auto_20191026_2153.py +1 -3
  131. edc_auth/migrations/0025_permissions.py +1 -1
  132. edc_auth/migrations/0029_alter_edcpermissions_device_created_and_more.py +5 -13
  133. edc_auth/migrations/0034_alter_edcpermissions_revision_alter_role_revision.py +38 -0
  134. edc_auth/models/__init__.py +1 -3
  135. edc_auth/models/signals.py +2 -6
  136. edc_auth/models/user_profile.py +1 -3
  137. edc_auth/password_setter.py +1 -3
  138. edc_auth/system_checks.py +1 -5
  139. edc_auth/urls_for_accounts.py +1 -3
  140. edc_auth/utils.py +3 -9
  141. edc_consent/actions.py +3 -9
  142. edc_consent/consent_definition.py +5 -8
  143. edc_consent/consent_definition_extension.py +4 -12
  144. edc_consent/field_mixins/citizen_fields_mixin.py +2 -4
  145. edc_consent/field_mixins/identity_fields_mixin.py +1 -2
  146. edc_consent/field_mixins/personal_fields_mixin.py +8 -3
  147. edc_consent/field_mixins/site_fields_mixin.py +1 -2
  148. edc_consent/form_validators/subject_consent_form_validator.py +4 -8
  149. edc_consent/migrations/0001_initial.py +1 -1
  150. edc_consent/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  151. edc_consent/migrations/0005_alter_edcpermissions_revision.py +26 -0
  152. edc_consent/model_mixins/consent_extension_model_mixin.py +2 -3
  153. edc_consent/model_mixins/consent_model_mixin.py +3 -9
  154. edc_consent/modeladmin_mixins/consent_model_admin_mixin.py +7 -17
  155. edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py +6 -10
  156. edc_consent/modelform_mixins/requires_consent_modelform_mixin.py +1 -3
  157. edc_consent/models/signals.py +3 -6
  158. edc_consent/site_consents.py +6 -17
  159. edc_consent/system_checks.py +3 -9
  160. edc_consent/validators.py +1 -2
  161. edc_consent/view_mixins/consent_view_mixins.py +3 -5
  162. edc_crf/crf_form_validator.py +4 -7
  163. edc_crf/crf_form_validator_mixins.py +2 -6
  164. edc_crf/migrations/0004_alter_crfstatus_device_created_and_more.py +3 -7
  165. edc_crf/migrations/0008_alter_crfstatus_revision.py +26 -0
  166. edc_crf/utils.py +1 -3
  167. edc_dashboard/management/commands/update_search_slugs.py +1 -3
  168. edc_dashboard/migrations/0001_initial.py +1 -1
  169. edc_dashboard/migrations/0003_alter_edcpermissions_device_created_and_more.py +3 -7
  170. edc_dashboard/migrations/0005_alter_edcpermissions_revision.py +26 -0
  171. edc_dashboard/templatetags/edc_dashboard_extras.py +2 -6
  172. edc_dashboard/view_mixins/administration_view_mixin.py +1 -3
  173. edc_dashboard/view_mixins/edc_view_mixin.py +1 -3
  174. edc_dashboard/views/administration_view.py +1 -3
  175. edc_data_manager/action_items.py +1 -3
  176. edc_data_manager/admin/actions.py +3 -9
  177. edc_data_manager/admin/data_query_admin.py +4 -12
  178. edc_data_manager/admin/query_rule_admin.py +4 -13
  179. edc_data_manager/auths.py +1 -3
  180. edc_data_manager/forms/data_query.py +2 -6
  181. edc_data_manager/forms/query_rule.py +1 -3
  182. edc_data_manager/get_longitudinal_value.py +2 -5
  183. edc_data_manager/handlers/handlers.py +2 -6
  184. edc_data_manager/migrations/0001_initial.py +4 -3
  185. edc_data_manager/migrations/0003_auto_20190806_1749.py +2 -6
  186. edc_data_manager/migrations/0004_auto_20190806_1750.py +1 -3
  187. edc_data_manager/migrations/0025_edcpermissions.py +1 -1
  188. edc_data_manager/migrations/0027_alter_dataquery_dm_user.py +1 -1
  189. edc_data_manager/migrations/0028_alter_dataquery_options_alter_queryrule_options_and_more.py +2 -1
  190. edc_data_manager/migrations/0029_alter_dataquery_managers.py +2 -1
  191. edc_data_manager/migrations/0030_alter_datadictionary_device_created_and_more.py +15 -43
  192. edc_data_manager/migrations/0039_alter_datadictionary_revision_and_more.py +101 -0
  193. edc_data_manager/models/model_mixins.py +1 -3
  194. edc_data_manager/populate_data_dictionary.py +1 -2
  195. edc_data_manager/post_migrate_signals.py +1 -3
  196. edc_data_manager/site_data_manager.py +1 -3
  197. edc_document_status/model_mixins.py +1 -3
  198. edc_egfr/__init__.py +1 -0
  199. edc_egfr/admin/__init__.py +1 -0
  200. edc_egfr/admin/egfr_drop_notification_admin_mixin.py +73 -0
  201. edc_egfr/apps.py +5 -0
  202. edc_egfr/calculators/__init__.py +4 -0
  203. edc_egfr/calculators/base_egrfr.py +56 -0
  204. edc_egfr/calculators/egfr_ckd_epi.py +68 -0
  205. edc_egfr/calculators/egfr_cockcroft_gault.py +63 -0
  206. edc_egfr/calculators/percent_change.py +7 -0
  207. edc_egfr/constants.py +1 -0
  208. edc_egfr/egfr.py +237 -0
  209. edc_egfr/form_validator_mixins/__init__.py +4 -0
  210. edc_egfr/form_validator_mixins/egfr_form_validator_mixins.py +55 -0
  211. edc_egfr/get_drop_notification_model.py +10 -0
  212. edc_egfr/get_egfr_for_subject.py +31 -0
  213. edc_egfr/model_mixins/__init__.py +2 -0
  214. edc_egfr/model_mixins/egfr_drop_notification_model_mixin.py +63 -0
  215. edc_egfr/model_mixins/egfr_model_mixin.py +120 -0
  216. edc_export/archive_exporter.py +2 -6
  217. edc_export/exportables.py +2 -6
  218. edc_export/files_emailer.py +1 -3
  219. edc_export/management/commands/import_receipts.py +1 -3
  220. edc_export/managers.py +3 -9
  221. edc_export/migrations/0001_initial.py +15 -36
  222. edc_export/migrations/0005_exportdata_importdata.py +1 -3
  223. edc_export/migrations/0006_auto_20200512_0208.py +2 -6
  224. edc_export/migrations/0010_auto_20210910_1636.py +2 -6
  225. edc_export/migrations/0013_edcpermissions.py +1 -1
  226. edc_export/migrations/0015_alter_datarequest_managers_and_more.py +2 -1
  227. edc_export/migrations/0016_alter_datarequest_device_created_and_more.py +27 -79
  228. edc_export/migrations/0017_alter_datarequest_options_and_more.py +2 -6
  229. edc_export/migrations/0020_remove_datarequesthistory_edc_export__exporte_ba8050_idx_and_more.py +2 -6
  230. edc_export/migrations/0021_alter_datarequest_revision_and_more.py +173 -0
  231. edc_export/model_exporter/model_exporter.py +4 -15
  232. edc_export/model_exporter/object_history_helpers.py +1 -3
  233. edc_export/model_exporter/value_getter.py +5 -14
  234. edc_export/models/signals.py +1 -3
  235. edc_export/models/upload_export_receipt_file.py +1 -3
  236. edc_export/utils.py +1 -4
  237. edc_export/views/export_selected_models_view.py +6 -17
  238. edc_facility/default_definitions.py +1 -3
  239. edc_facility/facility.py +4 -14
  240. edc_facility/import_holidays.py +1 -3
  241. edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +4 -6
  242. edc_facility/migrations/0006_alter_healthfacility_health_facility_type.py +1 -1
  243. edc_facility/migrations/0008_alter_healthfacility_device_created_and_more.py +5 -13
  244. edc_facility/migrations/0015_alter_healthfacility_revision_and_more.py +38 -0
  245. edc_facility/models/holiday.py +1 -3
  246. edc_facility/utils.py +1 -3
  247. edc_fieldsets/fieldsets_modeladmin_mixin.py +1 -3
  248. edc_form_describer/form_describer.py +3 -9
  249. edc_form_describer/make_forms_reference.py +1 -3
  250. edc_form_describer/management/commands/make_forms_reference.py +1 -3
  251. edc_form_runners/admin/issue_admin.py +2 -6
  252. edc_form_runners/form_runner.py +4 -13
  253. edc_form_runners/form_runner_by_scr_id.py +1 -3
  254. edc_form_runners/get_form_runner.py +1 -3
  255. edc_form_runners/get_form_runner_by_src_id.py +3 -3
  256. edc_form_runners/management/commands/run_form_runners.py +1 -3
  257. edc_form_runners/migrations/0001_initial.py +2 -4
  258. edc_form_runners/migrations/0004_alter_issue_revision.py +26 -0
  259. edc_form_runners/run_form_runners.py +1 -3
  260. edc_form_runners/utils.py +1 -3
  261. edc_form_validators/applicable_field_validator.py +6 -17
  262. edc_form_validators/base_form_validator.py +1 -3
  263. edc_form_validators/date_range_validator.py +4 -12
  264. edc_form_validators/date_validator.py +3 -9
  265. edc_form_validators/many_to_many_field_validator.py +1 -3
  266. edc_form_validators/other_specify_field_validator.py +3 -7
  267. edc_form_validators/range_field_validator.py +1 -3
  268. edc_form_validators/required_field_validator.py +5 -18
  269. edc_glucose/__init__.py +0 -0
  270. edc_glucose/apps.py +6 -0
  271. edc_glucose/constants.py +3 -0
  272. edc_glucose/fieldsets.py +14 -0
  273. edc_glucose/form_validators/__init__.py +6 -0
  274. edc_glucose/form_validators/fasting_form_validator.py +12 -0
  275. edc_glucose/form_validators/fbg_form_validator_mixin.py +32 -0
  276. edc_glucose/form_validators/fbg_ogtt_form_validator_mixin.py +47 -0
  277. edc_glucose/form_validators/glucose_form_validator.py +44 -0
  278. edc_glucose/form_validators/glucose_form_validator_mixin.py +53 -0
  279. edc_glucose/form_validators/ogtt_form_validator_mixin.py +91 -0
  280. edc_glucose/list_filters.py +42 -0
  281. edc_glucose/migrations/__init__.py +0 -0
  282. edc_glucose/model_mixin_factories/__init__.py +4 -0
  283. edc_glucose/model_mixin_factories/fasting_model_mixin_factory.py +63 -0
  284. edc_glucose/model_mixin_factories/fbg_model_mixin_factory.py +48 -0
  285. edc_glucose/model_mixin_factories/glucose_model_mixin_factory.py +49 -0
  286. edc_glucose/model_mixin_factories/ogtt_model_mixin_factory.py +71 -0
  287. edc_glucose/model_mixins/__init__.py +5 -0
  288. edc_glucose/model_mixins/fasting_model_mixin.py +15 -0
  289. edc_glucose/model_mixins/fbg_model_mixin.py +10 -0
  290. edc_glucose/model_mixins/glucose_model_mixin.py +17 -0
  291. edc_glucose/model_mixins/hba1c_model_mixin.py +42 -0
  292. edc_glucose/model_mixins/ogtt_model_mixin.py +10 -0
  293. edc_glucose/models.py +0 -0
  294. edc_glucose/utils.py +42 -0
  295. edc_identifier/admin_site.py +1 -3
  296. edc_identifier/identifier.py +1 -3
  297. edc_identifier/migrations/0001_initial.py +3 -4
  298. edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -2
  299. edc_identifier/migrations/0005_alter_identifiermodel_managers.py +2 -1
  300. edc_identifier/migrations/0005_historicalidentifierhistory_historicalidentifiertracker_historicalsubjectidentifier.py +4 -5
  301. edc_identifier/migrations/0006_auto_20161127_2226.py +16 -43
  302. edc_identifier/migrations/0007_alter_identifiermodel_device_created_and_more.py +3 -7
  303. edc_identifier/migrations/0007_auto_20161204_2227.py +4 -7
  304. edc_identifier/migrations/0009_auto_20161221_2323.py +1 -0
  305. edc_identifier/migrations/0010_alter_identifiermodel_revision.py +26 -0
  306. edc_identifier/migrations/0010_auto_20170112_0602.py +2 -1
  307. edc_identifier/migrations/0012_auto_20171116_1606.py +2 -1
  308. edc_identifier/migrations/0013_auto_20171230_1316.py +3 -9
  309. edc_identifier/research_identifier.py +3 -11
  310. edc_identifier/short_identifier.py +5 -9
  311. edc_identifier/utils.py +1 -3
  312. edc_lab/admin/modeladmin_mixins.py +2 -8
  313. edc_lab/aliquot_types.py +1 -3
  314. edc_lab/form_validators/requisition_form_validator_mixin.py +1 -3
  315. edc_lab/forms/box_type_form.py +4 -6
  316. edc_lab/lab/aliquot_type.py +2 -6
  317. edc_lab/lab/manifest.py +2 -6
  318. edc_lab/lab/primary_aliquot.py +1 -3
  319. edc_lab/lab/requisition_panel.py +1 -3
  320. edc_lab/lab/requisition_panel_group.py +2 -6
  321. edc_lab/lab/specimen.py +1 -3
  322. edc_lab/labels/aliquot_label.py +4 -6
  323. edc_lab/labels/manifest_label.py +1 -3
  324. edc_lab/migrations/0001_initial.py +12 -29
  325. edc_lab/migrations/0002_auto_20170305_1939.py +4 -12
  326. edc_lab/migrations/0007_auto_20170321_1119.py +2 -6
  327. edc_lab/migrations/0008_auto_20170921_0719.py +2 -1
  328. edc_lab/migrations/0010_auto_20171127_1541.py +3 -2
  329. edc_lab/migrations/0012_auto_20180114_1438.py +2 -1
  330. edc_lab/migrations/0013_auto_20180117_1438.py +2 -1
  331. edc_lab/migrations/0022_auto_20211210_1839.py +1 -0
  332. edc_lab/migrations/0024_alter_manifestitem_managers.py +2 -1
  333. edc_lab/migrations/0027_alter_aliquot_managers_alter_box_managers_and_more.py +1 -1
  334. edc_lab/migrations/0028_alter_aliquot_device_created_and_more.py +43 -127
  335. edc_lab/migrations/0035_alter_aliquot_revision_alter_box_revision_and_more.py +266 -0
  336. edc_lab/model_mixins/aliquot/aliquot_label_mixin.py +1 -3
  337. edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +4 -12
  338. edc_lab/model_mixins/requisition/requisition_identifier_mixin.py +1 -3
  339. edc_lab/model_mixins/shipping/manifest_model_mixin.py +1 -3
  340. edc_lab/models/box_item.py +1 -3
  341. edc_lab/models/box_type.py +1 -3
  342. edc_lab/models/manifest/manifest.py +3 -9
  343. edc_lab/models/manifest/manifest_item.py +1 -3
  344. edc_lab/models/order.py +1 -3
  345. edc_lab/models/signals.py +1 -3
  346. edc_lab/patterns.py +1 -3
  347. edc_lab/pdf_reports/manifest_pdf_report.py +9 -27
  348. edc_lab/post_migrate_signals.py +1 -3
  349. edc_lab/site_labs.py +4 -10
  350. edc_lab_dashboard/migrations/0001_initial.py +1 -1
  351. edc_lab_dashboard/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  352. edc_lab_dashboard/migrations/0004_alter_edcpermissions_revision.py +26 -0
  353. edc_lab_dashboard/view_mixins/box_view_mixin.py +1 -3
  354. edc_lab_dashboard/view_mixins/manifest_view_mixin.py +4 -12
  355. edc_lab_dashboard/views/action_views/receive_view.py +1 -3
  356. edc_lab_dashboard/views/action_views/verify_box_item_view.py +1 -3
  357. edc_lab_dashboard/views/listboard_filters/aliquot_listboard_view_filters.py +2 -6
  358. edc_lab_dashboard/views/listboard_filters/manifest_listboard_filters.py +1 -3
  359. edc_lab_dashboard/views/listboard_views/base_box_item_listboard_view.py +1 -3
  360. edc_lab_dashboard/views/listboard_views/manifest_listboard_view.py +1 -3
  361. edc_lab_dashboard/views/listboard_views/process_listboard_view.py +2 -6
  362. edc_lab_dashboard/views/listboard_views/receive_listboard_view.py +2 -6
  363. edc_lab_dashboard/views/listboard_views/requisition_listboard_view.py +2 -6
  364. edc_lab_results/action_items.py +1 -3
  365. edc_lab_results/form_validator_mixins/blood_results_fbg_form_validator_mixin.py +2 -4
  366. edc_lab_results/form_validator_mixins/blood_results_form_validator_mixin.py +1 -3
  367. edc_lab_results/get_summary.py +3 -5
  368. edc_lab_results/model_mixin_factories/__init__.py +10 -0
  369. edc_lab_results/{model_mixin_factory → model_mixin_factories}/field_attrs.py +8 -8
  370. edc_lab_results/{model_mixin_factory → model_mixin_factories}/reportable_result_model_mixin_factory.py +2 -0
  371. edc_lab_results/{model_mixin_factory → model_mixin_factories}/result_model_mixin_factory.py +2 -0
  372. edc_lab_results/model_mixins/blood_result_model_mixin.py +2 -5
  373. edc_lab_results/model_mixins/electrolytes_model_mixins.py +1 -1
  374. edc_lab_results/model_mixins/fbc_model_mixins.py +1 -1
  375. edc_lab_results/model_mixins/fbg_model_mixin.py +6 -3
  376. edc_lab_results/model_mixins/glucose_model_mixin.py +2 -2
  377. edc_lab_results/model_mixins/hba1c_model_mixin.py +2 -28
  378. edc_lab_results/model_mixins/insulin_model_mixin.py +5 -11
  379. edc_lab_results/model_mixins/lft_model_mixins.py +1 -1
  380. edc_lab_results/model_mixins/lipid_model_mixins.py +1 -1
  381. edc_lab_results/model_mixins/proteinuria_model_mixin.py +1 -1
  382. edc_lab_results/model_mixins/rft_model_mixins.py +1 -1
  383. edc_label/apps.py +1 -2
  384. edc_label/migrations/0001_initial.py +1 -1
  385. edc_label/migrations/0003_alter_zpllabeltemplates_device_created_and_more.py +3 -7
  386. edc_label/migrations/0006_alter_zpllabeltemplates_revision.py +29 -0
  387. edc_label/printer.py +2 -6
  388. edc_label/printers_mixin.py +1 -3
  389. edc_label/urls.py +1 -3
  390. edc_label/view_mixins.py +1 -3
  391. edc_label/views/print_label_view.py +1 -3
  392. edc_list_data/model_mixins.py +1 -3
  393. edc_list_data/preload_data.py +2 -6
  394. edc_list_data/site_list_data.py +1 -3
  395. edc_listboard/migrations/0001_initial.py +1 -1
  396. edc_listboard/migrations/0003_alter_listboard_device_created_and_more.py +3 -7
  397. edc_listboard/migrations/0006_alter_listboard_revision.py +29 -0
  398. edc_listboard/view_mixins/listboard_filter_view_mixin.py +5 -15
  399. edc_listboard/view_mixins/search_listboard_view_mixin.py +2 -6
  400. edc_listboard/views/listboard_view.py +2 -6
  401. edc_listboard/views/screen/screening_listboard_view.py +1 -3
  402. edc_listboard/views/subject/subject_listboard_view.py +1 -3
  403. edc_locator/forms/subject_locator_form_validator.py +4 -12
  404. edc_locator/migrations/0001_initial.py +3 -2
  405. edc_locator/migrations/0003_auto_20180103_1351.py +2 -1
  406. edc_locator/migrations/0004_auto_20180106_2148.py +2 -1
  407. edc_locator/migrations/0007_auto_20180117_1819.py +2 -1
  408. edc_locator/migrations/0011_auto_20181007_0053.py +1 -1
  409. edc_locator/migrations/0013_auto_20181007_0054.py +2 -3
  410. edc_locator/migrations/0014_auto_20181009_0545.py +1 -0
  411. edc_locator/migrations/0032_alter_subjectlocator_managers.py +1 -1
  412. edc_locator/migrations/0034_alter_historicalsubjectlocator_device_created_and_more.py +5 -13
  413. edc_locator/migrations/0039_alter_historicalsubjectlocator_revision_and_more.py +38 -0
  414. edc_locator/modeladmin_mixins.py +1 -3
  415. edc_locator/view_mixins/subject_locator_view_mixins.py +1 -3
  416. edc_ltfu/admin.py +1 -3
  417. edc_ltfu/forms/ltfu_form.py +1 -3
  418. edc_ltfu/forms/ltfu_form_validator_mixin.py +1 -2
  419. edc_ltfu/modelform_mixins.py +3 -8
  420. edc_metadata/admin/modeladmin_mixins.py +2 -8
  421. edc_metadata/management/commands/validate_entry_status.py +1 -3
  422. edc_metadata/metadata/metadata.py +12 -41
  423. edc_metadata/metadata/metadata_getter.py +2 -9
  424. edc_metadata/metadata/requisition_metadata_getter.py +1 -3
  425. edc_metadata/metadata_handler.py +3 -9
  426. edc_metadata/metadata_helper/metadata_helper_mixin.py +1 -3
  427. edc_metadata/metadata_mixins/source_model_metadata_mixin.py +3 -9
  428. edc_metadata/metadata_refresher.py +3 -9
  429. edc_metadata/metadata_rules/crf/crf_rule_group.py +2 -5
  430. edc_metadata/metadata_rules/persistant_singleton_mixin.py +3 -3
  431. edc_metadata/metadata_rules/requisition/requisition_rule_group.py +1 -2
  432. edc_metadata/metadata_rules/rule_evaluator.py +1 -3
  433. edc_metadata/metadata_rules/rule_group.py +2 -6
  434. edc_metadata/metadata_rules/rule_group_meta_options.py +1 -3
  435. edc_metadata/metadata_updater.py +1 -3
  436. edc_metadata/metadata_wrappers/metadata_wrapper.py +1 -3
  437. edc_metadata/migrations/0001_initial.py +2 -1
  438. edc_metadata/migrations/0002_auto_20161127_2226.py +6 -13
  439. edc_metadata/migrations/0005_auto_20170112_0602.py +2 -1
  440. edc_metadata/migrations/0007_auto_20170810_1032.py +2 -1
  441. edc_metadata/migrations/0009_auto_20180116_1528.py +2 -1
  442. edc_metadata/migrations/0014_auto_20190707_0002.py +1 -1
  443. edc_metadata/migrations/0015_auto_20190709_0009.py +3 -5
  444. edc_metadata/migrations/0021_alter_crfmetadata_managers_and_more.py +1 -1
  445. edc_metadata/migrations/0023_alter_crfmetadata_device_created_and_more.py +5 -13
  446. edc_metadata/migrations/0030_alter_crfmetadata_revision_and_more.py +38 -0
  447. edc_metadata/model_mixins/creates/creates_metadata_model_mixin.py +1 -3
  448. edc_metadata/model_mixins/updates/updates_metadata_model_mixin.py +1 -3
  449. edc_metadata/models/crf_metadata_model_mixin.py +2 -6
  450. edc_metadata/next_form_getter.py +1 -3
  451. edc_metadata/requisition/requisition_metadata_handler.py +3 -2
  452. edc_metadata/requisition/requisition_metadata_updater.py +1 -3
  453. edc_metadata/update_metadata_on_schedule_change.py +7 -14
  454. edc_model/models/fields/initials_field.py +1 -3
  455. edc_model/models/signals.py +1 -3
  456. edc_model/system_checks.py +1 -3
  457. edc_model/validators/duration.py +1 -3
  458. edc_model_admin/admin_site.py +1 -3
  459. edc_model_admin/changelist_buttons/model_admin_changelist_button_mixin.py +4 -12
  460. edc_model_admin/changelist_buttons/model_admin_changelist_model_button_mixin.py +1 -3
  461. edc_model_admin/dashboard/model_admin_crf_dashboard_mixin.py +1 -3
  462. edc_model_admin/dashboard/model_admin_dashboard_mixin.py +1 -3
  463. edc_model_admin/mixins/base_model_admin_redirect_mixin.py +2 -6
  464. edc_model_admin/mixins/inlines/limited_admin_inline_mixin.py +1 -3
  465. edc_model_admin/mixins/model_admin_bypass_default_form_cls_mixin.py +4 -12
  466. edc_model_admin/mixins/model_admin_form_auto_number_mixin.py +2 -6
  467. edc_model_admin/mixins/model_admin_form_instructions_mixin.py +2 -6
  468. edc_model_admin/mixins/model_admin_next_url_redirect_mixin.py +3 -9
  469. edc_model_admin/mixins/model_admin_protect_pii_mixin.py +1 -3
  470. edc_model_admin/mixins/model_admin_redirect_all_to_changelist_mixin.py +2 -6
  471. edc_model_admin/mixins/model_admin_redirect_on_delete_mixin.py +1 -3
  472. edc_model_admin/templatetags/edc_admin_modify.py +3 -9
  473. edc_model_fields/fields/initials_field.py +1 -3
  474. edc_model_form/mixins/inline_model_form_mixin.py +5 -9
  475. edc_model_to_dataframe/model_to_dataframe.py +15 -46
  476. edc_navbar/get_default_navbar.py +1 -3
  477. edc_navbar/migrations/0004_auto_20220825_0451.py +1 -1
  478. edc_navbar/migrations/0006_alter_edcpermissions_device_created_and_more.py +3 -7
  479. edc_navbar/migrations/0008_alter_edcpermissions_revision.py +26 -0
  480. edc_navbar/navbar.py +1 -3
  481. edc_navbar/navbar_item.py +1 -3
  482. edc_navbar/site_navbars.py +2 -6
  483. edc_navbar/templatetags/edc_navbar_extras.py +1 -3
  484. edc_notification/admin_site.py +1 -3
  485. edc_notification/mailing_list_manager.py +5 -15
  486. edc_notification/migrations/0001_initial.py +2 -1
  487. edc_notification/migrations/0008_alter_notification_device_created_and_more.py +3 -7
  488. edc_notification/migrations/0010_alter_notification_revision.py +26 -0
  489. edc_notification/modeladmin_mixins.py +1 -3
  490. edc_notification/models/notification.py +1 -3
  491. edc_notification/models/signals.py +3 -10
  492. edc_notification/notification/model_notification.py +3 -9
  493. edc_notification/notification/notification.py +4 -12
  494. edc_notification/site_notifications.py +5 -14
  495. edc_offstudy/migrations/0001_initial.py +2 -1
  496. edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -3
  497. edc_offstudy/migrations/0008_auto_20191102_0033.py +2 -1
  498. edc_offstudy/migrations/0015_auto_20220925_0032.py +1 -1
  499. edc_offstudy/migrations/0016_auto_20220929_1742.py +1 -0
  500. edc_offstudy/migrations/0018_alter_subjectoffstudy_managers.py +2 -1
  501. edc_offstudy/migrations/0019_alter_historicalsubjectoffstudy_device_created_and_more.py +5 -13
  502. edc_offstudy/migrations/0022_alter_historicalsubjectoffstudy_revision_and_more.py +41 -0
  503. edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -3
  504. edc_offstudy/modelform_mixins/crf/offstudy_crf_modelform_mixin.py +2 -6
  505. edc_offstudy/templatetags/edc_offstudy_extras.py +2 -6
  506. edc_offstudy/utils.py +1 -3
  507. edc_pdf_reports/admin/modeladmin_mixins.py +1 -3
  508. edc_pdf_reports/crf_pdf_report.py +3 -9
  509. edc_pdf_reports/flowables/textbox.py +1 -3
  510. edc_pdf_reports/report.py +6 -18
  511. edc_pdf_reports/utils.py +1 -3
  512. edc_pdf_reports/views/pdf_intermediate_view.py +1 -3
  513. edc_pdf_reports/views/print_pdf_report_view.py +2 -6
  514. edc_pdutils/actions.py +4 -12
  515. edc_pdutils/choices.py +1 -4
  516. edc_pdutils/database.py +1 -3
  517. edc_pdutils/df_exporters/csv_crf_inline_tables_exporter.py +4 -12
  518. edc_pdutils/df_exporters/csv_exporter.py +7 -22
  519. edc_pdutils/df_handlers/crf_df_handler.py +3 -9
  520. edc_pdutils/df_handlers/df_handler.py +1 -3
  521. edc_pdutils/df_handlers/registered_subject_df_handler.py +1 -3
  522. edc_pdutils/management/commands/export_models.py +2 -6
  523. edc_pdutils/migrations/0001_initial.py +6 -9
  524. edc_pdutils/site.py +2 -6
  525. edc_pdutils/site_values_mappings.py +3 -9
  526. edc_pdutils/tables/aliquot.py +2 -9
  527. edc_pdutils/tables/consent.py +2 -6
  528. edc_pdutils/tables/crf.py +4 -12
  529. edc_pdutils/tables/requisition.py +4 -12
  530. edc_pdutils/tables/visit.py +1 -3
  531. edc_pdutils/utils/convert_dates_from_model.py +3 -9
  532. edc_pdutils/utils/convert_numerics_from_model.py +1 -3
  533. edc_pdutils/utils/convert_timedelta_from_model.py +1 -3
  534. edc_pdutils/utils/missing_subject_identifiers.py +1 -3
  535. edc_pharmacy/admin/actions/confirm_stock.py +2 -6
  536. edc_pharmacy/admin/actions/delete_order_items.py +1 -3
  537. edc_pharmacy/admin/actions/delete_receive_items.py +1 -3
  538. edc_pharmacy/admin/actions/print_stock_report.py +1 -3
  539. edc_pharmacy/admin/list_filters.py +5 -17
  540. edc_pharmacy/admin/model_admin_mixin.py +1 -3
  541. edc_pharmacy/admin/prescription/rx_admin.py +2 -6
  542. edc_pharmacy/admin/prescription/rx_refill_admin.py +1 -3
  543. edc_pharmacy/admin/reports/stock_availability_admin.py +1 -5
  544. edc_pharmacy/admin/stock/allocation_admin.py +5 -15
  545. edc_pharmacy/admin/stock/allocation_proxy_admin.py +1 -3
  546. edc_pharmacy/admin/stock/confirmation_admin.py +1 -3
  547. edc_pharmacy/admin/stock/confirmation_at_site_admin.py +4 -12
  548. edc_pharmacy/admin/stock/confirmation_at_site_item_admin.py +5 -17
  549. edc_pharmacy/admin/stock/dispense_admin.py +3 -11
  550. edc_pharmacy/admin/stock/dispense_item_admin.py +4 -14
  551. edc_pharmacy/admin/stock/order_admin.py +1 -3
  552. edc_pharmacy/admin/stock/order_item_admin.py +5 -15
  553. edc_pharmacy/admin/stock/receive_admin.py +4 -12
  554. edc_pharmacy/admin/stock/receive_item_admin.py +4 -12
  555. edc_pharmacy/admin/stock/repack_request_admin.py +2 -6
  556. edc_pharmacy/admin/stock/stock_adjustment_admin.py +1 -3
  557. edc_pharmacy/admin/stock/stock_admin.py +8 -24
  558. edc_pharmacy/admin/stock/stock_proxy_admin.py +1 -5
  559. edc_pharmacy/admin/stock/stock_request_admin.py +5 -4
  560. edc_pharmacy/admin/stock/stock_request_item_admin.py +10 -19
  561. edc_pharmacy/admin/stock/stock_transfer_admin.py +4 -12
  562. edc_pharmacy/admin/stock/stock_transfer_item_admin.py +6 -18
  563. edc_pharmacy/admin/stock/storage_bin_admin.py +3 -11
  564. edc_pharmacy/admin/stock/storage_bin_item_admin.py +4 -14
  565. edc_pharmacy/analytics/dataframes/get_next_scheduled_visit_for_subjects_df.py +1 -1
  566. edc_pharmacy/analytics/dataframes/in_stock_for_subjects_df.py +2 -6
  567. edc_pharmacy/analytics/dataframes/stock_for_subjects.py +1 -3
  568. edc_pharmacy/form_validators/crf/study_medication_form_validator.py +9 -27
  569. edc_pharmacy/forms/stock/container_form.py +2 -6
  570. edc_pharmacy/forms/stock/receive_item_form.py +2 -6
  571. edc_pharmacy/forms/stock/repack_request_form.py +4 -11
  572. edc_pharmacy/forms/stock/stock_request_form.py +1 -0
  573. edc_pharmacy/forms/stock/stock_request_item_form.py +1 -3
  574. edc_pharmacy/labels/draw_bulk_stock_label_code128.py +1 -3
  575. edc_pharmacy/labels/draw_bulk_stock_label_code39.py +3 -9
  576. edc_pharmacy/labels/draw_patient_stock_label_code128.py +1 -3
  577. edc_pharmacy/migrations/0001_initial.py +7 -15
  578. edc_pharmacy/migrations/0005_alter_rx_managers.py +2 -1
  579. edc_pharmacy/migrations/0015_auto_20220913_2139.py +9 -22
  580. edc_pharmacy/migrations/0016_auto_20220929_1742.py +2 -1
  581. edc_pharmacy/migrations/0018_alter_rxrefill_managers.py +1 -1
  582. edc_pharmacy/migrations/0020_alter_box_device_created_alter_box_device_modified_and_more.py +71 -211
  583. edc_pharmacy/migrations/0021_alter_box_options_alter_container_options_and_more.py +1 -1
  584. edc_pharmacy/migrations/0023_remove_rx_edc_pharmac_modifie_986021_idx_and_more.py +1 -3
  585. edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +40 -104
  586. edc_pharmacy/migrations/0031_historicalrepackrequest_task_id_and_more.py +2 -1
  587. edc_pharmacy/migrations/0033_container_display_name_and_more.py +1 -3
  588. edc_pharmacy/migrations/0035_container_max_per_subject_and_more.py +2 -6
  589. edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +2 -6
  590. edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -9
  591. edc_pharmacy/migrations/0043_stockproxy_alter_historicallot_lot_no_and_more.py +2 -1
  592. edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +5 -13
  593. edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +2 -6
  594. edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +2 -1
  595. edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +7 -11
  596. edc_pharmacy/migrations/0057_scanduplicates.py +3 -4
  597. edc_pharmacy/migrations/0058_stockrequestproxy_alter_stockproxy_options.py +2 -1
  598. edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +8 -14
  599. edc_pharmacy/migrations/0061_alter_historicalstocktransferconfirmation_options_and_more.py +1 -1
  600. edc_pharmacy/migrations/0062_auto_20250312_1433.py +2 -6
  601. edc_pharmacy/migrations/0063_alter_allocation_managers_remove_allocation_site_and_more.py +2 -1
  602. edc_pharmacy/migrations/0065_allocationproxy.py +2 -1
  603. edc_pharmacy/migrations/0068_stockout.py +2 -1
  604. edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -8
  605. edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +2 -1
  606. edc_pharmacy/migrations/0078_alter_historicalstock_qty_and_more.py +2 -1
  607. edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -10
  608. edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +2 -2
  609. edc_pharmacy/migrations/0088_alter_allocation_revision_alter_assignment_revision_and_more.py +794 -0
  610. edc_pharmacy/model_mixins/study_medication_crf_model_mixin.py +3 -9
  611. edc_pharmacy/models/medication/dosage_guideline.py +1 -3
  612. edc_pharmacy/models/medication/formulation.py +1 -3
  613. edc_pharmacy/models/prescription/rx.py +1 -3
  614. edc_pharmacy/models/prescription/rx_refill.py +2 -6
  615. edc_pharmacy/models/signals.py +11 -21
  616. edc_pharmacy/models/stock/allocation.py +3 -9
  617. edc_pharmacy/models/stock/confirmation.py +1 -3
  618. edc_pharmacy/models/stock/confirmation_at_site_item.py +1 -3
  619. edc_pharmacy/models/stock/container.py +1 -3
  620. edc_pharmacy/models/stock/dispense.py +1 -3
  621. edc_pharmacy/models/stock/dispense_item.py +1 -3
  622. edc_pharmacy/models/stock/lot.py +1 -3
  623. edc_pharmacy/models/stock/order_item.py +2 -6
  624. edc_pharmacy/models/stock/product.py +2 -6
  625. edc_pharmacy/models/stock/receive_item.py +4 -12
  626. edc_pharmacy/models/stock/repack_request.py +1 -3
  627. edc_pharmacy/models/stock/stock.py +3 -8
  628. edc_pharmacy/models/stock/stock_request_item.py +4 -4
  629. edc_pharmacy/models/stock/stock_transfer_item.py +1 -3
  630. edc_pharmacy/models/stock/supplier.py +1 -3
  631. edc_pharmacy/models/storage/utils.py +1 -4
  632. edc_pharmacy/pdf_reports/manifest_pdf_report.py +3 -9
  633. edc_pharmacy/pdf_reports/stock_pdf_report.py +6 -11
  634. edc_pharmacy/refill/adjust_previous_end_datetime.py +2 -6
  635. edc_pharmacy/refill/create_next_refill.py +1 -3
  636. edc_pharmacy/refill/create_refill.py +1 -3
  637. edc_pharmacy/refill/refill_creator.py +2 -6
  638. edc_pharmacy/sample_usb_printing/network_printers.py +1 -3
  639. edc_pharmacy/settings.py +3 -9
  640. edc_pharmacy/urls.py +1 -3
  641. edc_pharmacy/utils/allocate_stock.py +1 -3
  642. edc_pharmacy/utils/confirm_stock_at_site.py +3 -5
  643. edc_pharmacy/utils/dispense.py +1 -4
  644. edc_pharmacy/utils/get_unit_qty_out.py +1 -3
  645. edc_pharmacy/utils/process_repack_request.py +1 -3
  646. edc_pharmacy/utils/process_repack_request_queryset.py +1 -3
  647. edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -6
  648. edc_pharmacy/utils/stock_request/get_instock_and_nostock_data.py +3 -8
  649. edc_pharmacy/utils/transfer_stock.py +1 -3
  650. edc_pharmacy/utils/update_previous_refill_end_datetime.py +1 -3
  651. edc_pharmacy/views/add_to_storage_bin_view.py +2 -6
  652. edc_pharmacy/views/allocate_to_subject_view.py +7 -21
  653. edc_pharmacy/views/confirm_stock_from_instance_view.py +2 -6
  654. edc_pharmacy/views/confirm_stock_from_queryset_view.py +2 -7
  655. edc_pharmacy/views/confirmation_at_site_view.py +10 -31
  656. edc_pharmacy/views/dispense_view.py +2 -6
  657. edc_pharmacy/views/move_to_storage_bin_view.py +2 -6
  658. edc_pharmacy/views/prepare_and_review_stock_request_view.py +3 -9
  659. edc_pharmacy/views/print_labels_view.py +1 -3
  660. edc_pharmacy/views/print_stock_transfer_manifest_view.py +1 -3
  661. edc_pharmacy/views/transfer_stock_view.py +1 -3
  662. edc_prn/modelform_mixins.py +1 -3
  663. edc_prn/prn.py +2 -6
  664. edc_prn/templatetags/edc_prn_extras.py +4 -8
  665. edc_protocol/research_protocol_config.py +2 -5
  666. edc_protocol_incident/admin/protocol_deviation_violation_admin.py +1 -3
  667. edc_protocol_incident/auth_objects.py +1 -3
  668. edc_protocol_incident/auths.py +1 -3
  669. edc_protocol_incident/form_validators/mixins.py +3 -9
  670. edc_protocol_incident/form_validators/protocol_deviation_violation_form_validator.py +6 -18
  671. edc_protocol_incident/form_validators/protocol_incident_form_validator.py +3 -8
  672. edc_protocol_incident/migrations/0001_initial.py +4 -3
  673. edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +7 -12
  674. edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +4 -3
  675. edc_protocol_incident/migrations/0012_auto_20220913_2139.py +3 -9
  676. edc_protocol_incident/migrations/0020_alter_historicalprotocoldeviationviolation_device_created_and_more.py +9 -25
  677. edc_protocol_incident/migrations/0023_alter_historicalprotocoldeviationviolation_revision_and_more.py +65 -0
  678. edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +3 -7
  679. edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +1 -3
  680. edc_protocol_incident/urls.py +1 -3
  681. edc_pylabels/actions.py +2 -6
  682. edc_pylabels/admin/label_configuration_admin.py +4 -4
  683. edc_pylabels/drawing_callable_example.py +1 -3
  684. edc_pylabels/migrations/0001_initial.py +1 -3
  685. edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +2 -6
  686. edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +1 -3
  687. edc_pylabels/migrations/0012_alter_labelconfiguration_revision.py +26 -0
  688. edc_pylabels/models/label_configuration.py +1 -3
  689. edc_qareports/migrations/0001_initial.py +3 -4
  690. edc_qareports/migrations/0005_edcpermissions.py +2 -4
  691. edc_qareports/migrations/0006_qareportlog.py +2 -1
  692. edc_qareports/migrations/0007_qareportlog_edc_qarepor_accesse_738ffe_idx.py +1 -3
  693. edc_qareports/migrations/0017_auto_20240816_0256.py +1 -0
  694. edc_qareports/migrations/0018_alter_edcpermissions_revision_alter_note_revision.py +38 -0
  695. edc_qareports/model_mixins/note_model_mixin.py +1 -3
  696. edc_qareports/modeladmin_mixins/list_filters.py +8 -12
  697. edc_qareports/modeladmin_mixins/note_modeladmin_mixin.py +1 -3
  698. edc_qareports/modeladmin_mixins/on_study_missing_values_modeladmin_mixin.py +2 -6
  699. edc_qareports/modeladmin_mixins/qa_report_modeladmin_mixin.py +1 -3
  700. edc_qareports/sql_generator/crf_case.py +1 -5
  701. edc_qareports/sql_generator/sql_view_generator.py +1 -3
  702. edc_qareports/utils.py +4 -7
  703. edc_randomization/admin.py +1 -3
  704. edc_randomization/auths.py +2 -6
  705. edc_randomization/blinding.py +1 -3
  706. edc_randomization/migrations/0001_initial.py +3 -4
  707. edc_randomization/migrations/0009_edcpermissions.py +1 -1
  708. edc_randomization/migrations/0011_alter_edcpermissions_device_created_and_more.py +7 -19
  709. edc_randomization/migrations/0013_alter_edcpermissions_revision_and_more.py +50 -0
  710. edc_randomization/model_mixins.py +2 -5
  711. edc_randomization/randomization_list_importer.py +3 -7
  712. edc_randomization/randomization_list_verifier.py +2 -7
  713. edc_randomization/randomizer.py +4 -7
  714. edc_randomization/site_randomizers.py +1 -3
  715. edc_randomization/system_checks.py +1 -3
  716. edc_randomization/utils.py +2 -6
  717. edc_refusal/admin.py +1 -3
  718. edc_refusal/forms.py +1 -2
  719. edc_refusal/migrations/0001_initial.py +2 -1
  720. edc_refusal/migrations/0002_historicalsubjectrefusal.py +6 -4
  721. edc_refusal/migrations/0004_refusalreasons_plural_name.py +1 -3
  722. edc_refusal/migrations/0005_alter_subjectrefusal_options_and_more.py +2 -1
  723. edc_refusal/migrations/0006_alter_subjectrefusal_managers.py +2 -1
  724. edc_refusal/migrations/0008_alter_historicalsubjectrefusal_device_created_and_more.py +5 -13
  725. edc_refusal/migrations/0011_alter_historicalsubjectrefusal_revision_and_more.py +38 -0
  726. edc_registration/admin_site.py +1 -3
  727. edc_registration/migrations/0001_initial.py +3 -4
  728. edc_registration/migrations/0002_auto_20161127_2226.py +4 -7
  729. edc_registration/migrations/0004_auto_20161221_0018.py +2 -1
  730. edc_registration/migrations/0005_auto_20170111_1809.py +2 -1
  731. edc_registration/migrations/0008_auto_20170810_1032.py +2 -1
  732. edc_registration/migrations/0012_auto_20180116_1528.py +2 -1
  733. edc_registration/migrations/0015_auto_20181006_2257.py +1 -1
  734. edc_registration/migrations/0016_historicalregisteredsubject.py +5 -6
  735. edc_registration/migrations/0026_historicalregisteredsubject_familiar_name_and_more.py +1 -1
  736. edc_registration/migrations/0028_alter_registeredsubject_managers.py +1 -1
  737. edc_registration/migrations/0029_alter_historicalregisteredsubject_device_created_and_more.py +5 -13
  738. edc_registration/migrations/0032_alter_historicalregisteredsubject_revision_and_more.py +38 -0
  739. edc_registration/modeladmin_mixins.py +1 -3
  740. edc_registration/models/registered_subject.py +4 -11
  741. edc_registration/utils.py +1 -3
  742. edc_reportable/admin_site.py +1 -3
  743. edc_reportable/data/normal_data/africa.py +4 -14
  744. edc_reportable/evaluator.py +2 -6
  745. edc_reportable/forms/reportables_form_validator_mixin.py +5 -4
  746. edc_reportable/formula.py +2 -6
  747. edc_reportable/management/commands/export_reportables.py +1 -3
  748. edc_reportable/migrations/0001_initial.py +3 -9
  749. edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -9
  750. edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +4 -7
  751. edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +370 -0
  752. edc_reportable/models/mw.py +1 -3
  753. edc_reportable/models/reference_model_mixins.py +1 -3
  754. edc_reportable/models/reference_range_collection.py +3 -9
  755. edc_reportable/post_migrate_signals.py +1 -3
  756. edc_reportable/reference_range_evaluator.py +4 -11
  757. edc_reportable/utils/convert_units.py +3 -4
  758. edc_reportable/utils/get_grade_for_value.py +3 -1
  759. edc_reportable/utils/get_reference_range_collection.py +2 -2
  760. edc_reportable/utils/load_data.py +1 -3
  761. edc_reportable/utils/molecular_weight_model_cls.py +1 -1
  762. edc_reportable/utils/update_grading_data.py +2 -6
  763. edc_review_dashboard/migrations/0001_initial.py +1 -1
  764. edc_review_dashboard/migrations/0003_alter_edcpermissions_device_created_and_more.py +3 -7
  765. edc_review_dashboard/migrations/0005_alter_edcpermissions_revision.py +26 -0
  766. edc_review_dashboard/views/subject_review_listboard_view.py +1 -3
  767. edc_screening/eligibility.py +1 -3
  768. edc_screening/fc.py +1 -3
  769. edc_screening/migrations/0001_initial.py +1 -1
  770. edc_screening/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  771. edc_screening/migrations/0004_alter_edcpermissions_revision.py +26 -0
  772. edc_screening/model_mixins/eligibility_model_mixin.py +1 -3
  773. edc_screening/model_mixins/screening_fields_model_mixin.py +2 -0
  774. edc_screening/modelform_mixins.py +1 -3
  775. edc_screening/screening_eligibility.py +1 -0
  776. edc_search/search_slug.py +2 -6
  777. edc_search/updater.py +2 -5
  778. edc_sites/admin/site_model_admin_mixin.py +4 -12
  779. edc_sites/management/commands/sync_sites.py +1 -3
  780. edc_sites/migrations/0007_edcpermissions.py +2 -4
  781. edc_sites/migrations/0009_alter_edcpermissions_revision.py +26 -0
  782. edc_sites/single_site/get_languages.py +1 -3
  783. edc_sites/single_site/single_site.py +1 -1
  784. edc_sites/site.py +6 -12
  785. edc_sites/system_checks.py +1 -4
  786. edc_sites/utils/add_or_update_django_sites.py +2 -4
  787. edc_subject_dashboard/migrations/0001_initial.py +1 -1
  788. edc_subject_dashboard/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  789. edc_subject_dashboard/migrations/0004_alter_edcpermissions_revision.py +26 -0
  790. edc_subject_dashboard/requisition_labels.py +1 -3
  791. edc_subject_dashboard/requisition_report.py +5 -15
  792. edc_subject_dashboard/requisition_verifier.py +2 -7
  793. edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -6
  794. edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +1 -2
  795. edc_subject_dashboard/view_utils/crf_button.py +1 -3
  796. edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +1 -3
  797. edc_subject_dashboard/view_utils/timepoint_status_button.py +1 -3
  798. edc_subject_dashboard/views/requisition_print_actions_view.py +4 -12
  799. edc_subject_dashboard/views/requisition_verify_actions_view.py +1 -3
  800. edc_subject_dashboard/views/subject_dashboard_view.py +1 -3
  801. edc_timepoint/apps.py +1 -3
  802. edc_timepoint/timepoint.py +1 -3
  803. edc_timepoint/timepoint_lookup.py +1 -3
  804. edc_transfer/form_validators.py +4 -6
  805. edc_transfer/model_mixins.py +1 -3
  806. edc_transfer/modelform_mixins.py +1 -3
  807. edc_unblinding/action_items.py +1 -3
  808. edc_unblinding/admin_site.py +1 -3
  809. edc_unblinding/migrations/0001_initial.py +6 -4
  810. edc_unblinding/migrations/0002_auto_20210908_2318.py +1 -1
  811. edc_unblinding/migrations/0009_alter_unblindingrequest_managers_and_more.py +2 -1
  812. edc_unblinding/migrations/0010_alter_historicalunblindingrequest_device_created_and_more.py +9 -25
  813. edc_unblinding/migrations/0013_alter_historicalunblindingrequest_revision_and_more.py +62 -0
  814. edc_unblinding/models/unblinding_request.py +1 -3
  815. edc_unblinding/models/unblinding_review.py +1 -3
  816. edc_utils/age.py +1 -3
  817. edc_utils/date.py +1 -3
  818. edc_utils/paths_for_urlpatterns.py +1 -3
  819. edc_utils/show_urls.py +1 -3
  820. edc_utils/text.py +1 -2
  821. edc_view_utils/model_button.py +5 -13
  822. edc_view_utils/query_button.py +1 -3
  823. edc_visit_schedule/admin/subject_schedule_history_admin.py +1 -3
  824. edc_visit_schedule/baseline.py +1 -3
  825. edc_visit_schedule/migrations/0001_initial.py +3 -4
  826. edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +1 -3
  827. edc_visit_schedule/migrations/0004_auto_20190629_1800.py +1 -3
  828. edc_visit_schedule/migrations/0011_alter_historicalvisitschedule_device_created_and_more.py +7 -19
  829. edc_visit_schedule/migrations/0012_alter_subjectschedulehistory_managers_and_more.py +2 -1
  830. edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +9 -13
  831. edc_visit_schedule/migrations/0017_alter_onschedule_managers.py +2 -1
  832. edc_visit_schedule/migrations/0018_alter_historicalonschedule_revision_and_more.py +86 -0
  833. edc_visit_schedule/model_mixins/crf/crf_schedule_model_mixin.py +1 -1
  834. edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +2 -6
  835. edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +1 -3
  836. edc_visit_schedule/modelform_mixins/off_schedule_modelform_mixin.py +1 -3
  837. edc_visit_schedule/models/subject_schedule_history.py +3 -8
  838. edc_visit_schedule/ordered_collection.py +1 -3
  839. edc_visit_schedule/schedule/schedule.py +10 -20
  840. edc_visit_schedule/simple_model_validator.py +3 -8
  841. edc_visit_schedule/site_visit_schedules.py +6 -16
  842. edc_visit_schedule/subject_schedule.py +6 -17
  843. edc_visit_schedule/system_checks.py +1 -3
  844. edc_visit_schedule/utils.py +8 -17
  845. edc_visit_schedule/view_mixins.py +4 -10
  846. edc_visit_schedule/visit/crf.py +1 -2
  847. edc_visit_schedule/visit/requisition.py +1 -3
  848. edc_visit_schedule/visit/visit.py +6 -16
  849. edc_visit_schedule/visit/window_period.py +3 -3
  850. edc_visit_schedule/visit_schedule/visit_schedule.py +2 -5
  851. edc_visit_tracking/crf_date_validator.py +1 -2
  852. edc_visit_tracking/form_validators/visit_form_validator.py +2 -8
  853. edc_visit_tracking/form_validators/visit_missed_form_validator.py +3 -9
  854. edc_visit_tracking/migrations/0003_auto_20220913_2139.py +2 -6
  855. edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +8 -16
  856. edc_visit_tracking/migrations/0008_alter_historicalsubjectvisit_revision_and_more.py +65 -0
  857. edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +2 -6
  858. edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +1 -3
  859. edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +1 -3
  860. edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +1 -3
  861. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +1 -2
  862. edc_visit_tracking/modeladmin_mixins/crf_model_admin_mixin.py +4 -8
  863. edc_visit_tracking/modeladmin_mixins/visit_model_admin_mixin.py +4 -6
  864. edc_visit_tracking/modelform_mixins/crf/visit_tracking_crf_modelform_mixin.py +2 -6
  865. edc_visit_tracking/modelform_mixins/utils.py +1 -3
  866. edc_visit_tracking/modelform_mixins/visit_tracking_modelform_mixin.py +1 -2
  867. edc_visit_tracking/models/signals.py +1 -3
  868. edc_visit_tracking/stubs.py +1 -3
  869. edc_visit_tracking/utils.py +1 -2
  870. edc_visit_tracking/view_utils/related_visit_button.py +1 -3
  871. edc_visit_tracking/visit_sequence.py +1 -3
  872. edc_vitals/__init__.py +2 -0
  873. edc_vitals/apps.py +6 -0
  874. edc_vitals/calculators/__init__.py +1 -0
  875. edc_vitals/calculators/bmi.py +70 -0
  876. edc_vitals/form_validators/__init__.py +5 -0
  877. edc_vitals/form_validators/blood_pressure_form_validator_mixin.py +40 -0
  878. edc_vitals/form_validators/bmi_form_validator_mixin.py +19 -0
  879. edc_vitals/form_validators/weight_height_with_bmi_form_validator_mixin.py +13 -0
  880. edc_vitals/migrations/__init__.py +0 -0
  881. edc_vitals/model_mixins/__init__.py +5 -0
  882. edc_vitals/model_mixins/blood_pressure_model_mixin.py +80 -0
  883. edc_vitals/model_mixins/weight_height_bmi_model_mixin.py +42 -0
  884. edc_vitals/models/__init__.py +10 -0
  885. edc_vitals/models/fields/__init__.py +7 -0
  886. edc_vitals/models/fields/blood_pressure.py +36 -0
  887. edc_vitals/models/fields/heart_rate.py +22 -0
  888. edc_vitals/models/fields/height.py +26 -0
  889. edc_vitals/models/fields/respiratory_rate.py +22 -0
  890. edc_vitals/models/fields/temperature.py +26 -0
  891. edc_vitals/models/fields/waist_circumference.py +23 -0
  892. edc_vitals/models/fields/weight.py +26 -0
  893. edc_vitals/utils.py +51 -0
  894. edc_vitals/validators.py +5 -0
  895. edc_lab_results/model_mixin_factory/__init__.py +0 -2
  896. {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,14 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from datetime import datetime
4
- from typing import Any, TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Any
5
5
 
6
6
  from dateutil.relativedelta import relativedelta
7
7
  from django import forms
8
8
 
9
9
  from edc_constants.constants import NO, YES
10
10
  from edc_model_form.utils import get_field_or_raise
11
- from edc_utils import age, AgeValueError, formatted_age
11
+ from edc_utils import AgeValueError, age, formatted_age
12
+
12
13
  from ...exceptions import ConsentDefinitionValidityPeriodError
13
14
  from ...site_consents import site_consents
14
15
  from ...utils import InvalidInitials, verify_initials_against_full_name
@@ -53,9 +54,7 @@ class ConsentModelFormValidationMixin:
53
54
 
54
55
  @property
55
56
  def consent_datetime(self) -> datetime:
56
- return self.get_field_or_raise(
57
- "consent_datetime", "Consent date and time is required"
58
- )
57
+ return self.get_field_or_raise("consent_datetime", "Consent date and time is required")
59
58
 
60
59
  @property
61
60
  def identity(self) -> str:
@@ -63,9 +62,7 @@ class ConsentModelFormValidationMixin:
63
62
 
64
63
  @property
65
64
  def confirm_identity(self) -> str:
66
- return self.get_field_or_raise(
67
- "confirm_identity", "Confirmed identity is required"
68
- )
65
+ return self.get_field_or_raise("confirm_identity", "Confirmed identity is required")
69
66
 
70
67
  @property
71
68
  def age_delta(self) -> relativedelta | None:
@@ -192,8 +189,7 @@ class ConsentModelFormValidationMixin:
192
189
  gender = self.cleaned_data.get("gender")
193
190
  if gender not in self.consent_definition.gender:
194
191
  raise forms.ValidationError(
195
- "Gender of consent can only be "
196
- "'%(gender_of_consent)s'. Got '%(gender)s'.",
192
+ "Gender of consent can only be " "'%(gender_of_consent)s'. Got '%(gender)s'.",
197
193
  params={
198
194
  "gender_of_consent": "' or '".join(self.consent_definition.gender),
199
195
  "gender": gender,
@@ -38,9 +38,7 @@ class RequiresConsentModelFormMixin:
38
38
  def validate_against_dob(self, consent_obj):
39
39
  if consent_obj and to_utc(self.report_datetime).date() < consent_obj.dob:
40
40
  dte_str = formatted_date(consent_obj.dob)
41
- raise forms.ValidationError(
42
- f"Report datetime cannot be before DOB. Got {dte_str}"
43
- )
41
+ raise forms.ValidationError(f"Report datetime cannot be before DOB. Got {dte_str}")
44
42
 
45
43
  def validate_against_consent(self) -> ConsentLikeModel | None:
46
44
  """Raise an exception if the report datetime doesn't make
@@ -4,6 +4,7 @@ from django.dispatch import receiver
4
4
  from edc_sites import site_sites
5
5
  from edc_visit_schedule.site_visit_schedules import site_visit_schedules
6
6
  from edc_visit_schedule.subject_schedule import SubjectSchedule
7
+
7
8
  from ..model_mixins import ConsentExtensionModelMixin, RequiresConsentFieldsModelMixin
8
9
  from ..site_consents import site_consents
9
10
 
@@ -16,9 +17,7 @@ def requires_consent_on_pre_save(instance, raw, using, update_fields, **kwargs):
16
17
  and isinstance(instance, (RequiresConsentFieldsModelMixin,))
17
18
  and not instance._meta.model_name.startswith("historical")
18
19
  ):
19
- subject_identifier = getattr(
20
- instance, "related_visit", instance
21
- ).subject_identifier
20
+ subject_identifier = getattr(instance, "related_visit", instance).subject_identifier
22
21
  site = getattr(instance, "related_visit", instance).site
23
22
  try:
24
23
  schedule = getattr(instance, "related_visit", instance).schedule
@@ -67,9 +66,7 @@ def update_appointment_from_consentext_post_save(
67
66
  model=instance.subject_consent._meta.label_lower,
68
67
  version=instance.subject_consent.version,
69
68
  )
70
- visit_schedule, schedule = site_visit_schedules.get_by_consent_definition(
71
- cdef
72
- )
69
+ visit_schedule, schedule = site_visit_schedules.get_by_consent_definition(cdef)
73
70
  subject_schedule = SubjectSchedule(
74
71
  instance.subject_consent.subject_identifier,
75
72
  visit_schedule=visit_schedule,
@@ -11,6 +11,7 @@ from django.utils.module_loading import import_module, module_has_submodule
11
11
 
12
12
  from edc_sites.site import sites as site_sites
13
13
  from edc_utils import ceil_secs, floor_secs, formatted_date, to_utc
14
+
14
15
  from .exceptions import (
15
16
  AlreadyRegistered,
16
17
  ConsentDefinitionDoesNotExist,
@@ -44,9 +45,7 @@ class SiteConsents:
44
45
  cdef.updated_by = updated_by
45
46
  cdef.extended_by = extended_by
46
47
  if cdef.name in self.registry:
47
- raise AlreadyRegistered(
48
- f"Consent definition already registered. Got {cdef.name}."
49
- )
48
+ raise AlreadyRegistered(f"Consent definition already registered. Got {cdef.name}.")
50
49
  self.validate_period_overlap_or_raise(cdef)
51
50
  self.validate_updates_or_raise(cdef)
52
51
  self.registry.update({cdef.name: cdef})
@@ -165,11 +164,7 @@ class SiteConsents:
165
164
  f"'{consent_definition.version}' "
166
165
  f"of consent on or after report_datetime='{dte}'?"
167
166
  )
168
- elif (
169
- consent_definition.start
170
- <= to_utc(report_datetime)
171
- <= consent_definition.end
172
- ):
167
+ elif consent_definition.start <= to_utc(report_datetime) <= consent_definition.end:
173
168
  # ensures the higher version is returned if there is overlap
174
169
  pass
175
170
  elif (
@@ -250,9 +245,7 @@ class SiteConsents:
250
245
 
251
246
  # filter cdefs to try to get just one.
252
247
  # by model, report_datetime, version, site
253
- cdefs, error_msg = self._filter_cdefs_by_model_or_raise(
254
- model, cdefs, error_messages
255
- )
248
+ cdefs, error_msg = self._filter_cdefs_by_model_or_raise(model, cdefs, error_messages)
256
249
  cdefs, error_msg = self._filter_cdefs_by_report_datetime_or_raise(
257
250
  report_datetime, cdefs, error_messages
258
251
  )
@@ -333,9 +326,7 @@ class SiteConsents:
333
326
  cdefs = [
334
327
  cdef
335
328
  for cdef in cdefs
336
- if floor_secs(cdef.start)
337
- <= to_utc(report_datetime)
338
- <= ceil_secs(cdef.end)
329
+ if floor_secs(cdef.start) <= to_utc(report_datetime) <= ceil_secs(cdef.end)
339
330
  ]
340
331
  if not cdefs:
341
332
  date_string = formatted_date(report_datetime)
@@ -410,9 +401,7 @@ class SiteConsents:
410
401
  try:
411
402
  before_import_registry = deepcopy(site_consents.registry)
412
403
  import_module(f"{app}.{module_name}")
413
- writer(
414
- f" * registered consent definitions '{module_name}' from '{app}'\n"
415
- )
404
+ writer(f" * registered consent definitions '{module_name}' from '{app}'\n")
416
405
  except SiteConsentError as e:
417
406
  writer(f" - loading {app}.consents ... ")
418
407
  writer(style.ERROR(f"ERROR! {e}\n"))
@@ -79,9 +79,7 @@ def check_consents_durations() -> list[CheckMessage]:
79
79
  for cdef2 in cdefs:
80
80
  if cdef1 == cdef2:
81
81
  continue
82
- err, found = _inspect_possible_overlap_in_validity_period(
83
- cdef1, cdef2, found
84
- )
82
+ err, found = _inspect_possible_overlap_in_validity_period(cdef1, cdef2, found)
85
83
  if err:
86
84
  errors.append(err)
87
85
  return errors
@@ -99,13 +97,9 @@ def _inspect_possible_overlap_in_validity_period(
99
97
  err = None
100
98
  if (
101
99
  cdef1.model_cls._meta.proxy
102
- and cdef1.model_cls._meta.proxy_for_model
103
- == cdef1.model_cls._meta.proxy_for_model
100
+ and cdef1.model_cls._meta.proxy_for_model == cdef1.model_cls._meta.proxy_for_model
104
101
  ):
105
- if (
106
- cdef1.start <= cdef2.start <= cdef1.end
107
- or cdef1.start <= cdef2.end <= cdef1.end
108
- ):
102
+ if cdef1.start <= cdef2.start <= cdef1.end or cdef1.start <= cdef2.end <= cdef1.end:
109
103
  if sorted([cdef1, cdef2], key=lambda x: x.version) in found:
110
104
  pass
111
105
  else:
edc_consent/validators.py CHANGED
@@ -14,8 +14,7 @@ class SubjectTypeValidator:
14
14
  def __call__(self, value):
15
15
  if value not in self.subject_types:
16
16
  raise ValidationError(
17
- "Undefined subject type. Expected one of '{subject_types}'. "
18
- "Got '{value}'.",
17
+ "Undefined subject type. Expected one of '{subject_types}'. " "Got '{value}'.",
19
18
  params={
20
19
  "subject_types": "' or '".join(self.subject_types),
21
20
  "value": value,
@@ -76,10 +76,8 @@ class ConsentViewMixin:
76
76
  site=site_sites.get(self.request.site.id),
77
77
  )
78
78
  elif self.appointment:
79
- self._consent_definition = (
80
- self.appointment.schedule.get_consent_definition(
81
- report_datetime=self.appointment.appt_datetime,
82
- site=site_sites.get(self.appointment.site.id),
83
- )
79
+ self._consent_definition = self.appointment.schedule.get_consent_definition(
80
+ report_datetime=self.appointment.appt_datetime,
81
+ site=site_sites.get(self.appointment.site.id),
84
82
  )
85
83
  return self._consent_definition
@@ -7,12 +7,13 @@ from django.utils.text import format_lazy
7
7
  from django.utils.translation import gettext_lazy as _
8
8
 
9
9
  from edc_appointment.form_validator_mixins import WindowPeriodFormValidatorMixin
10
- from edc_form_validators import FormValidator, INVALID_ERROR
10
+ from edc_form_validators import INVALID_ERROR, FormValidator
11
11
  from edc_registration import get_registered_subject_model_cls
12
12
  from edc_sites.form_validator_mixin import SiteFormValidatorMixin
13
13
  from edc_utils import floor_secs, formatted_datetime, to_utc
14
14
  from edc_utils.date import to_local
15
15
  from edc_visit_tracking.modelform_mixins import get_related_visit
16
+
16
17
  from .crf_form_validator_mixins import CrfFormValidatorMixin
17
18
 
18
19
  if TYPE_CHECKING:
@@ -71,9 +72,7 @@ class CrfFormValidator(
71
72
  fldname="report_datetime",
72
73
  )
73
74
  if floor_secs(report_datetime) < floor_secs(consent_datetime):
74
- msg = _(
75
- "Invalid. Cannot be before date of consent. Participant consented on"
76
- )
75
+ msg = _("Invalid. Cannot be before date of consent. Participant consented on")
77
76
  formatted_date = formatted_datetime(to_local(consent_datetime))
78
77
  err_message = format_lazy(
79
78
  "{msg} {formatted_date}", msg=msg, formatted_date=formatted_date
@@ -99,9 +98,7 @@ class CrfFormValidator(
99
98
  msg = _("is required")
100
99
  verbose_name = self.related_visit._meta.verbose_name
101
100
  self.raise_validation_error(
102
- format_lazy(
103
- "{verbose_name} {msg}.", msg=msg, verbose_name=verbose_name
104
- ),
101
+ format_lazy("{verbose_name} {msg}.", msg=msg, verbose_name=verbose_name),
105
102
  INVALID_ERROR,
106
103
  )
107
104
 
@@ -18,9 +18,7 @@ if TYPE_CHECKING:
18
18
  from edc_sites.model_mixins import SiteModelMixin
19
19
  from edc_visit_tracking.model_mixins import VisitModelMixin as Base
20
20
 
21
- class RelatedVisitModel(
22
- SiteModelMixin, CreatesMetadataModelMixin, Base, BaseUuidModel
23
- ):
21
+ class RelatedVisitModel(SiteModelMixin, CreatesMetadataModelMixin, Base, BaseUuidModel):
24
22
  pass
25
23
 
26
24
 
@@ -82,9 +80,7 @@ class CrfFormValidatorMixin(BaseFormValidatorMixin):
82
80
  @property
83
81
  def related_visit(self) -> RelatedVisitModel:
84
82
  """Returns a subject visit model instance or None"""
85
- return get_related_visit(
86
- self, related_visit_model_attr=self.related_visit_model_attr
87
- )
83
+ return get_related_visit(self, related_visit_model_attr=self.related_visit_model_attr)
88
84
 
89
85
  @property
90
86
  def related_visit_model_cls(self) -> Type[RelatedVisitModel]:
@@ -1,8 +1,8 @@
1
1
  # Generated by Django 4.2.4 on 2023-08-23 01:13
2
2
 
3
3
  import _socket
4
- from django.db import migrations, models
5
4
  import django_audit_fields.fields.hostname_modification_field
5
+ from django.db import migrations, models
6
6
 
7
7
 
8
8
  class Migration(migrations.Migration):
@@ -14,16 +14,12 @@ class Migration(migrations.Migration):
14
14
  migrations.AlterField(
15
15
  model_name="crfstatus",
16
16
  name="device_created",
17
- field=models.CharField(
18
- blank=True, max_length=10, verbose_name="Device created"
19
- ),
17
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device created"),
20
18
  ),
21
19
  migrations.AlterField(
22
20
  model_name="crfstatus",
23
21
  name="device_modified",
24
- field=models.CharField(
25
- blank=True, max_length=10, verbose_name="Device modified"
26
- ),
22
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device modified"),
27
23
  ),
28
24
  migrations.AlterField(
29
25
  model_name="crfstatus",
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.2.4 on 2025-09-10 03:24
2
+
3
+ import django_revision.revision_field
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("edc_crf", "0007_crfstatus_edc_crf_crf_subject_e09e96_idx_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="crfstatus",
16
+ name="revision",
17
+ field=django_revision.revision_field.RevisionField(
18
+ blank=True,
19
+ editable=False,
20
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
21
+ max_length=75,
22
+ null=True,
23
+ verbose_name="Revision",
24
+ ),
25
+ ),
26
+ ]
edc_crf/utils.py CHANGED
@@ -55,9 +55,7 @@ class HasCrfChecker:
55
55
  except ObjectDoesNotExist:
56
56
  pass
57
57
  except MultipleObjectsReturned:
58
- raise MultipleObjectsReturned(
59
- "Specify the visit_code and visit_code_sequence"
60
- )
58
+ raise MultipleObjectsReturned("Specify the visit_code and visit_code_sequence")
61
59
  else:
62
60
  for model in self.models:
63
61
  if model.objects.filter(subject_visit=subject_visit).exists():
@@ -42,9 +42,7 @@ class Command(BaseCommand):
42
42
  if "update_search_slugs" in str(e):
43
43
  raise CommandError(
44
44
  "Missing manager method 'update_search_slugs'. "
45
- "See model {}. Got {}".format(
46
- model._meta.label_lower, str(e)
47
- )
45
+ "See model {}. Got {}".format(model._meta.label_lower, str(e))
48
46
  )
49
47
  else:
50
48
  raise CommandError(e)
@@ -1,12 +1,12 @@
1
1
  # Generated by Django 3.2.13 on 2022-08-25 01:51
2
2
 
3
3
  import _socket
4
- from django.db import migrations, models
5
4
  import django_audit_fields.fields.hostname_modification_field
6
5
  import django_audit_fields.fields.userfield
7
6
  import django_audit_fields.fields.uuid_auto_field
8
7
  import django_audit_fields.models.audit_model_mixin
9
8
  import django_revision.revision_field
9
+ from django.db import migrations, models
10
10
 
11
11
 
12
12
  class Migration(migrations.Migration):
@@ -1,8 +1,8 @@
1
1
  # Generated by Django 4.2.4 on 2023-08-23 01:13
2
2
 
3
3
  import _socket
4
- from django.db import migrations, models
5
4
  import django_audit_fields.fields.hostname_modification_field
5
+ from django.db import migrations, models
6
6
 
7
7
 
8
8
  class Migration(migrations.Migration):
@@ -14,16 +14,12 @@ class Migration(migrations.Migration):
14
14
  migrations.AlterField(
15
15
  model_name="edcpermissions",
16
16
  name="device_created",
17
- field=models.CharField(
18
- blank=True, max_length=10, verbose_name="Device created"
19
- ),
17
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device created"),
20
18
  ),
21
19
  migrations.AlterField(
22
20
  model_name="edcpermissions",
23
21
  name="device_modified",
24
- field=models.CharField(
25
- blank=True, max_length=10, verbose_name="Device modified"
26
- ),
22
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device modified"),
27
23
  ),
28
24
  migrations.AlterField(
29
25
  model_name="edcpermissions",
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.2.4 on 2025-09-10 03:24
2
+
3
+ import django_revision.revision_field
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("edc_dashboard", "0004_edcpermissions_locale_created_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="edcpermissions",
16
+ name="revision",
17
+ field=django_revision.revision_field.RevisionField(
18
+ blank=True,
19
+ editable=False,
20
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
21
+ max_length=75,
22
+ null=True,
23
+ verbose_name="Revision",
24
+ ),
25
+ ),
26
+ ]
@@ -82,9 +82,7 @@ def index_link(context):
82
82
  @register.filter
83
83
  @stringfilter
84
84
  def human(value):
85
- return "-".join(
86
- [value[i * 4 : (i + 1) * 4] for i in range(0, ceil(len(value) / 4))]
87
- )
85
+ return "-".join([value[i * 4 : (i + 1) * 4] for i in range(0, ceil(len(value) / 4))])
88
86
 
89
87
 
90
88
  @register.inclusion_tag(
@@ -110,9 +108,7 @@ def paginator_row(context):
110
108
 
111
109
  paginator_url_kwargs = context.get("paginator_url_kwargs") or {}
112
110
  if context.get("subject_identifier"):
113
- paginator_url_kwargs.update(
114
- subject_identifier=context.get("subject_identifier")
115
- )
111
+ paginator_url_kwargs.update(subject_identifier=context.get("subject_identifier"))
116
112
  paginator_url = reverse(paginator_url, kwargs=paginator_url_kwargs)
117
113
 
118
114
  if querystring:
@@ -105,9 +105,7 @@ class AdministrationViewMixin(ContextMixin):
105
105
  edc_keys.sort()
106
106
 
107
107
  other_sections = {
108
- k: v
109
- for k, v in sections.items()
110
- if not k.startswith(self.edc_module_prefix)
108
+ k: v for k, v in sections.items() if not k.startswith(self.edc_module_prefix)
111
109
  }
112
110
  other_keys = list(other_sections.keys())
113
111
  other_keys.sort()
@@ -35,9 +35,7 @@ class EdcViewMixin(
35
35
  kwargs.update(
36
36
  {
37
37
  "device_id": getattr(edc_device_app_config, "device_id", "device_id?"),
38
- "device_role": getattr(
39
- edc_device_app_config, "device_role", "device_role?"
40
- ),
38
+ "device_role": getattr(edc_device_app_config, "device_role", "device_role?"),
41
39
  "live_system": live_system,
42
40
  }
43
41
  )
@@ -5,8 +5,6 @@ from edc_navbar import NavbarViewMixin
5
5
  from ..view_mixins import AdministrationViewMixin, EdcViewMixin
6
6
 
7
7
 
8
- class AdministrationView(
9
- EdcViewMixin, NavbarViewMixin, AdministrationViewMixin, TemplateView
10
- ):
8
+ class AdministrationView(EdcViewMixin, NavbarViewMixin, AdministrationViewMixin, TemplateView):
11
9
  navbar_selected_item = "administration"
12
10
  navbar_name = "default" # settings.APP_NAME
@@ -72,9 +72,7 @@ class DataQueryAction(Action):
72
72
 
73
73
  def get_category(self):
74
74
  return (
75
- "DM Query"
76
- if self.site_response_status in [FEEDBACK, RESOLVED]
77
- else "Site Query"
75
+ "DM Query" if self.site_response_status in [FEEDBACK, RESOLVED] else "Site Query"
78
76
  )
79
77
 
80
78
  def get_status(self):
@@ -16,9 +16,7 @@ from ..rule import update_query_rules
16
16
  DATA_MANAGER_ENABLED = getattr(settings, "DATA_MANAGER_ENABLED", True)
17
17
 
18
18
 
19
- @admin.action(
20
- description=f"Toggle Active/Inactive {QueryRule._meta.verbose_name_plural}"
21
- )
19
+ @admin.action(description=f"Toggle Active/Inactive {QueryRule._meta.verbose_name_plural}")
22
20
  def toggle_active_flag(modeladmin, request, queryset):
23
21
  for obj in queryset:
24
22
  obj.active = False if obj.active else True
@@ -37,9 +35,7 @@ def copy_query_rule_action(modeladmin, request, queryset):
37
35
  if queryset.count() == 1:
38
36
  obj = queryset[0]
39
37
  options = {
40
- k: v
41
- for k, v in obj.__dict__.items()
42
- if not k.startswith("_") and k not in ["id"]
38
+ k: v for k, v in obj.__dict__.items() if not k.startswith("_") and k not in ["id"]
43
39
  }
44
40
  options["title"] = f"{options['title']} (Copy)"
45
41
  options["active"] = False
@@ -77,9 +73,7 @@ def update_query_rules_action(modeladmin, request, queryset):
77
73
  if settings.CELERY_ENABLED:
78
74
  update_query_rules.delay(pks=[o.pk for o in queryset])
79
75
  dte = get_utcnow()
80
- taskresult_url = reverse(
81
- "admin:django_celery_results_taskresult_changelist"
82
- )
76
+ taskresult_url = reverse("admin:django_celery_results_taskresult_changelist")
83
77
  msg = format_html(
84
78
  "Updating data queries in the background. "
85
79
  "Started at {}. "
@@ -35,15 +35,11 @@ from .actions import toggle_dm_status
35
35
 
36
36
 
37
37
  @register(DataQuery, site=edc_data_manager_admin)
38
- class DataQueryAdmin(
39
- SiteModelAdminMixin, ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin
40
- ):
38
+ class DataQueryAdmin(SiteModelAdminMixin, ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin):
41
39
  status_column_template_name = "edc_data_manager/columns/status.html"
42
40
  query_date_column_template_name = "edc_data_manager/columns/query_date.html"
43
41
  query_text_column_template_name = "edc_data_manager/columns/query_text.html"
44
- query_recipients_column_template_name = (
45
- "edc_data_manager/columns/query_recipients.html"
46
- )
42
+ query_recipients_column_template_name = "edc_data_manager/columns/query_recipients.html"
47
43
 
48
44
  rule_generated_column_template_name = "edc_data_manager/columns/rule_generated.html"
49
45
 
@@ -305,9 +301,7 @@ class DataQueryAdmin(
305
301
  return render_to_string(self.locked_column_template_name, context=context)
306
302
 
307
303
  def render_rule_generated_to_string(self, context):
308
- return render_to_string(
309
- self.rule_generated_column_template_name, context=context
310
- )
304
+ return render_to_string(self.rule_generated_column_template_name, context=context)
311
305
 
312
306
  def render_query_date_to_string(self, context):
313
307
  return render_to_string(self.query_date_column_template_name, context=context)
@@ -316,9 +310,7 @@ class DataQueryAdmin(
316
310
  return render_to_string(self.query_text_column_template_name, context=context)
317
311
 
318
312
  def render_query_recipients_to_string(self, context):
319
- return render_to_string(
320
- self.query_recipients_column_template_name, context=context
321
- )
313
+ return render_to_string(self.query_recipients_column_template_name, context=context)
322
314
 
323
315
  def created_details(self, obj):
324
316
  rule_generated = YES if obj.rule_generated else NO
@@ -33,23 +33,17 @@ class QueryRuleModelAdminMixin:
33
33
 
34
34
  @staticmethod
35
35
  def form_name(obj=None):
36
- data_dictionaries = [
37
- dd for dd in obj.data_dictionaries.all().order_by("number")
38
- ]
36
+ data_dictionaries = [dd for dd in obj.data_dictionaries.all().order_by("number")]
39
37
  return ", ".join(list(set([dd.model_verbose_name for dd in data_dictionaries])))
40
38
 
41
39
  @staticmethod
42
40
  def questions(obj=None):
43
- numbers = [
44
- str(dd.number) for dd in obj.data_dictionaries.all().order_by("number")
45
- ]
41
+ numbers = [str(dd.number) for dd in obj.data_dictionaries.all().order_by("number")]
46
42
  return ", ".join(numbers)
47
43
 
48
44
  @staticmethod
49
45
  def field_names(obj=None):
50
- fields = [
51
- dd.field_name for dd in obj.data_dictionaries.all().order_by("field_name")
52
- ]
46
+ fields = [dd.field_name for dd in obj.data_dictionaries.all().order_by("field_name")]
53
47
  return ", ".join(fields)
54
48
 
55
49
  @staticmethod
@@ -59,10 +53,7 @@ class QueryRuleModelAdminMixin:
59
53
 
60
54
  @staticmethod
61
55
  def query_timing(obj=None):
62
- return (
63
- f"{obj.timing} {obj.get_timing_units_display()} "
64
- f"from {obj.reference_date}"
65
- )
56
+ return f"{obj.timing} {obj.get_timing_units_display()} " f"from {obj.reference_date}"
66
57
 
67
58
  @staticmethod
68
59
  def requisition(obj=None):
edc_data_manager/auths.py CHANGED
@@ -24,9 +24,7 @@ site_auths.add_custom_permissions_tuples(
24
24
 
25
25
  site_auths.add_custom_permissions_tuples(
26
26
  model="edc_data_manager.edcpermissions",
27
- codename_tuples=[
28
- ("edc_data_manager.special_bypassmodelform", "Can bypass modelform")
29
- ],
27
+ codename_tuples=[("edc_data_manager.special_bypassmodelform", "Can bypass modelform")],
30
28
  )
31
29
 
32
30
 
@@ -51,9 +51,7 @@ class DataQueryFormValidator(FormValidator):
51
51
  OPEN,
52
52
  FEEDBACK,
53
53
  ] and self.cleaned_data.get("status") in [CLOSED, CLOSED_WITH_ACTION]:
54
- raise forms.ValidationError(
55
- {"status": "Invalid: Site response is not resolved."}
56
- )
54
+ raise forms.ValidationError({"status": "Invalid: Site response is not resolved."})
57
55
 
58
56
  # DM
59
57
  self.required_if(
@@ -62,9 +60,7 @@ class DataQueryFormValidator(FormValidator):
62
60
  field="status",
63
61
  field_required="resolved_datetime",
64
62
  )
65
- self.required_if(
66
- CLOSED, CLOSED_WITH_ACTION, field="status", field_required="dm_user"
67
- )
63
+ self.required_if(CLOSED, CLOSED_WITH_ACTION, field="status", field_required="dm_user")
68
64
  self.required_if(
69
65
  CLOSED_WITH_ACTION,
70
66
  field="status",
@@ -7,9 +7,7 @@ from ..models import QueryRule
7
7
 
8
8
  class QueryRuleFormValidator(FormValidator):
9
9
  def clean(self):
10
- models = list(
11
- set([obj.model for obj in self.cleaned_data.get("data_dictionaries")])
12
- )
10
+ models = list(set([obj.model for obj in self.cleaned_data.get("data_dictionaries")]))
13
11
  if len(models) > 1:
14
12
  raise forms.ValidationError(
15
13
  {"data_dictionaries": "Invalid. Select questions from one CRF only"}