clinicedc 2.0.1__py3-none-any.whl → 2.0.3__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 (855) hide show
  1. {clinicedc-2.0.1.dist-info → clinicedc-2.0.3.dist-info}/METADATA +15 -22
  2. {clinicedc-2.0.1.dist-info → clinicedc-2.0.3.dist-info}/RECORD +854 -787
  3. {clinicedc-2.0.1.dist-info → clinicedc-2.0.3.dist-info}/WHEEL +1 -1
  4. edc_action_item/action.py +10 -30
  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 +6 -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/models/action_item.py +2 -6
  26. edc_action_item/models/action_model_mixin.py +5 -16
  27. edc_action_item/models/action_type.py +1 -3
  28. edc_action_item/models/reference.py +1 -2
  29. edc_action_item/models/signals.py +3 -9
  30. edc_action_item/site_action_items.py +5 -15
  31. edc_action_item/templatetags/action_item_extras.py +1 -3
  32. edc_action_item/view_utils/action_item_button.py +1 -3
  33. edc_action_item/view_utils/action_item_popover_list_item.py +1 -2
  34. edc_adherence/migrations/0002_nonadherencereasons_plural_name.py +1 -3
  35. edc_adherence/model_admin_mixin.py +1 -3
  36. edc_adverse_event/action_items/ae_followup_action.py +2 -6
  37. edc_adverse_event/action_items/ae_initial_action.py +3 -7
  38. edc_adverse_event/auth_objects.py +2 -6
  39. edc_adverse_event/constants.py +1 -3
  40. edc_adverse_event/form_validator_mixins/death_report_form_validator.py +1 -3
  41. edc_adverse_event/form_validator_mixins/requires_death_report_form_validator_mixin.py +2 -7
  42. edc_adverse_event/form_validators/hospitalization.py +1 -3
  43. edc_adverse_event/migrations/0003_auto_20191026_2231.py +3 -9
  44. edc_adverse_event/migrations/0008_auto_20220825_0451.py +1 -1
  45. edc_adverse_event/migrations/0009_auto_20220907_0157.py +1 -1
  46. edc_adverse_event/migrations/0010_auto_20220913_2139.py +4 -12
  47. edc_adverse_event/migrations/0013_alter_aeactionclassification_device_created_and_more.py +11 -31
  48. edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +1 -3
  49. edc_adverse_event/model_mixins/ae_followup/ae_followup_model_mixin.py +1 -5
  50. edc_adverse_event/model_mixins/ae_initial/ae_initial_ae_model_mixin.py +1 -3
  51. edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +1 -3
  52. edc_adverse_event/model_mixins/ae_initial/ae_initial_susar_model_mixin.py +1 -2
  53. edc_adverse_event/model_mixins/ae_special_interest/aesi_model_mixin.py +1 -5
  54. edc_adverse_event/model_mixins/ae_susar/ae_susar_model_mixin.py +1 -5
  55. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +2 -6
  56. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_model_mixin.py +1 -5
  57. edc_adverse_event/model_mixins/death_report/death_report_extra_fields_model_mixin.py +1 -2
  58. edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +2 -5
  59. edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +2 -7
  60. edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +1 -3
  61. edc_adverse_event/modeladmin_mixins/ae_tmg_admin_mixin.py +1 -3
  62. edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +6 -10
  63. edc_adverse_event/modelform_mixins/ae_tmg_modelform_mixin.py +1 -3
  64. edc_adverse_event/models/signals.py +3 -9
  65. edc_adverse_event/pdf_reports/ae_pdf_report.py +6 -18
  66. edc_adverse_event/pdf_reports/death_pdf_report.py +3 -9
  67. edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -15
  68. edc_adverse_event/utils.py +2 -6
  69. edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +1 -3
  70. edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +1 -3
  71. edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -6
  72. edc_adverse_event/view_utils/tmg_button.py +2 -6
  73. edc_adverse_event/views/home_view.py +1 -3
  74. edc_adverse_event/views/tmg/death_listboard_view.py +1 -3
  75. edc_adverse_event/views/tmg/home_view.py +2 -6
  76. edc_adverse_event/views/tmg/summary_listboard_view.py +1 -3
  77. edc_appointment/admin/appointment_admin.py +1 -3
  78. edc_appointment/admin/list_filters.py +1 -3
  79. edc_appointment/admin_site.py +1 -3
  80. edc_appointment/analytics/dataframes/get_appointment_df.py +2 -6
  81. edc_appointment/appointment_reason_updater.py +2 -5
  82. edc_appointment/appointment_status_updater.py +1 -4
  83. edc_appointment/constants.py +1 -3
  84. edc_appointment/creators/appointment_creator.py +4 -10
  85. edc_appointment/creators/unscheduled_appointment_creator.py +3 -7
  86. edc_appointment/creators/utils.py +4 -0
  87. edc_appointment/form_validator_mixins/next_appointment_crf_form_validator_mixin.py +3 -10
  88. edc_appointment/form_validator_mixins/window_period_form_validator_mixin.py +3 -9
  89. edc_appointment/form_validators/appointment_form_validator.py +11 -37
  90. edc_appointment/form_validators/next_appointment_crf_form_validator.py +1 -3
  91. edc_appointment/form_validators/utils.py +1 -3
  92. edc_appointment/managers.py +2 -6
  93. edc_appointment/migrations/0002_auto_20161126_1156.py +5 -8
  94. edc_appointment/migrations/0003_auto_20161127_2226.py +7 -16
  95. edc_appointment/migrations/0006_auto_20170106_2118.py +2 -1
  96. edc_appointment/migrations/0008_auto_20171115_1601.py +3 -4
  97. edc_appointment/migrations/0014_auto_20180116_1411.py +2 -1
  98. edc_appointment/migrations/0024_auto_20200911_0425.py +1 -1
  99. edc_appointment/migrations/0034_appointmenttype_alter_appointment_appt_type_and_more.py +2 -4
  100. edc_appointment/migrations/0036_auto_20230124_1822.py +2 -6
  101. edc_appointment/migrations/0040_appointment_appt_type_other_and_more.py +1 -0
  102. edc_appointment/migrations/0042_alter_appointment_device_created_and_more.py +5 -13
  103. edc_appointment/migrations/0046_infosources.py +1 -3
  104. edc_appointment/migrations/0047_alter_appointment_options_and_more.py +1 -3
  105. edc_appointment/model_mixins/appointment_methods_model_mixin.py +1 -5
  106. edc_appointment/model_mixins/appointment_model_mixin.py +2 -8
  107. edc_appointment/model_mixins/next_appointment_crf_model_mixin.py +1 -3
  108. edc_appointment/modeladmin_mixins/next_appointment_crf_modeladmin_mixin.py +1 -3
  109. edc_appointment/modelform_mixins/next_appointment_crf_modelform_mixins.py +1 -5
  110. edc_appointment/models/signals.py +5 -17
  111. edc_appointment/utils.py +11 -33
  112. edc_appointment/view_mixins/appointment_view_mixin.py +2 -6
  113. edc_auth/admin/list_filters.py +2 -6
  114. edc_auth/admin/role_admin.py +1 -3
  115. edc_auth/admin/user_admin.py +4 -12
  116. edc_auth/admin/user_profile_admin.py +2 -5
  117. edc_auth/auth_updater/auth_updater.py +1 -3
  118. edc_auth/auth_updater/group_updater.py +3 -9
  119. edc_auth/forms.py +1 -3
  120. edc_auth/get_app_codenames.py +1 -3
  121. edc_auth/import_users.py +3 -9
  122. edc_auth/management/commands/export_users.py +1 -3
  123. edc_auth/management/commands/reset_password.py +1 -3
  124. edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +4 -12
  125. edc_auth/migrations/0015_auto_20191026_2149.py +1 -3
  126. edc_auth/migrations/0016_auto_20191026_2153.py +1 -3
  127. edc_auth/migrations/0025_permissions.py +1 -1
  128. edc_auth/migrations/0029_alter_edcpermissions_device_created_and_more.py +5 -13
  129. edc_auth/models/__init__.py +1 -3
  130. edc_auth/models/signals.py +2 -6
  131. edc_auth/models/user_profile.py +1 -3
  132. edc_auth/password_setter.py +1 -3
  133. edc_auth/system_checks.py +1 -5
  134. edc_auth/urls_for_accounts.py +1 -3
  135. edc_auth/utils.py +3 -9
  136. edc_consent/actions.py +3 -9
  137. edc_consent/consent_definition.py +2 -6
  138. edc_consent/consent_definition_extension.py +4 -12
  139. edc_consent/field_mixins/citizen_fields_mixin.py +2 -4
  140. edc_consent/field_mixins/identity_fields_mixin.py +1 -2
  141. edc_consent/field_mixins/personal_fields_mixin.py +8 -3
  142. edc_consent/field_mixins/site_fields_mixin.py +1 -2
  143. edc_consent/form_validators/subject_consent_form_validator.py +2 -7
  144. edc_consent/migrations/0001_initial.py +1 -1
  145. edc_consent/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  146. edc_consent/model_mixins/consent_extension_model_mixin.py +1 -3
  147. edc_consent/model_mixins/consent_model_mixin.py +3 -9
  148. edc_consent/modeladmin_mixins/consent_model_admin_mixin.py +7 -17
  149. edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py +3 -8
  150. edc_consent/modelform_mixins/requires_consent_modelform_mixin.py +1 -3
  151. edc_consent/models/signals.py +2 -6
  152. edc_consent/site_consents.py +5 -17
  153. edc_consent/system_checks.py +3 -9
  154. edc_consent/validators.py +1 -2
  155. edc_consent/view_mixins/consent_view_mixins.py +3 -5
  156. edc_crf/crf_form_validator.py +2 -6
  157. edc_crf/crf_form_validator_mixins.py +2 -6
  158. edc_crf/migrations/0004_alter_crfstatus_device_created_and_more.py +3 -7
  159. edc_crf/utils.py +1 -3
  160. edc_dashboard/management/commands/update_search_slugs.py +1 -3
  161. edc_dashboard/migrations/0001_initial.py +1 -1
  162. edc_dashboard/migrations/0003_alter_edcpermissions_device_created_and_more.py +3 -7
  163. edc_dashboard/templatetags/edc_dashboard_extras.py +2 -6
  164. edc_dashboard/view_mixins/administration_view_mixin.py +1 -3
  165. edc_dashboard/view_mixins/edc_view_mixin.py +1 -3
  166. edc_dashboard/views/administration_view.py +1 -3
  167. edc_data_manager/action_items.py +1 -3
  168. edc_data_manager/admin/actions.py +3 -9
  169. edc_data_manager/admin/data_query_admin.py +4 -12
  170. edc_data_manager/admin/query_rule_admin.py +4 -13
  171. edc_data_manager/auths.py +1 -3
  172. edc_data_manager/forms/data_query.py +2 -6
  173. edc_data_manager/forms/query_rule.py +1 -3
  174. edc_data_manager/get_longitudinal_value.py +2 -5
  175. edc_data_manager/handlers/handlers.py +2 -6
  176. edc_data_manager/migrations/0001_initial.py +4 -3
  177. edc_data_manager/migrations/0003_auto_20190806_1749.py +2 -6
  178. edc_data_manager/migrations/0004_auto_20190806_1750.py +1 -3
  179. edc_data_manager/migrations/0025_edcpermissions.py +1 -1
  180. edc_data_manager/migrations/0027_alter_dataquery_dm_user.py +1 -1
  181. edc_data_manager/migrations/0028_alter_dataquery_options_alter_queryrule_options_and_more.py +2 -1
  182. edc_data_manager/migrations/0029_alter_dataquery_managers.py +2 -1
  183. edc_data_manager/migrations/0030_alter_datadictionary_device_created_and_more.py +15 -43
  184. edc_data_manager/models/model_mixins.py +1 -3
  185. edc_data_manager/populate_data_dictionary.py +1 -2
  186. edc_data_manager/post_migrate_signals.py +1 -3
  187. edc_data_manager/site_data_manager.py +1 -3
  188. edc_document_status/model_mixins.py +1 -3
  189. edc_egfr/__init__.py +1 -0
  190. edc_egfr/admin/__init__.py +1 -0
  191. edc_egfr/admin/egfr_drop_notification_admin_mixin.py +73 -0
  192. edc_egfr/apps.py +5 -0
  193. edc_egfr/calculators/__init__.py +4 -0
  194. edc_egfr/calculators/base_egrfr.py +56 -0
  195. edc_egfr/calculators/egfr_ckd_epi.py +68 -0
  196. edc_egfr/calculators/egfr_cockcroft_gault.py +63 -0
  197. edc_egfr/calculators/percent_change.py +7 -0
  198. edc_egfr/constants.py +1 -0
  199. edc_egfr/egfr.py +237 -0
  200. edc_egfr/form_validator_mixins/__init__.py +4 -0
  201. edc_egfr/form_validator_mixins/egfr_form_validator_mixins.py +55 -0
  202. edc_egfr/get_drop_notification_model.py +10 -0
  203. edc_egfr/get_egfr_for_subject.py +31 -0
  204. edc_egfr/model_mixins/__init__.py +2 -0
  205. edc_egfr/model_mixins/egfr_drop_notification_model_mixin.py +63 -0
  206. edc_egfr/model_mixins/egfr_model_mixin.py +120 -0
  207. edc_export/archive_exporter.py +2 -6
  208. edc_export/exportables.py +2 -6
  209. edc_export/files_emailer.py +1 -3
  210. edc_export/management/commands/import_receipts.py +1 -3
  211. edc_export/managers.py +3 -9
  212. edc_export/migrations/0001_initial.py +15 -36
  213. edc_export/migrations/0005_exportdata_importdata.py +1 -3
  214. edc_export/migrations/0006_auto_20200512_0208.py +2 -6
  215. edc_export/migrations/0010_auto_20210910_1636.py +2 -6
  216. edc_export/migrations/0013_edcpermissions.py +1 -1
  217. edc_export/migrations/0015_alter_datarequest_managers_and_more.py +2 -1
  218. edc_export/migrations/0016_alter_datarequest_device_created_and_more.py +27 -79
  219. edc_export/migrations/0017_alter_datarequest_options_and_more.py +2 -6
  220. edc_export/migrations/0020_remove_datarequesthistory_edc_export__exporte_ba8050_idx_and_more.py +2 -6
  221. edc_export/model_exporter/model_exporter.py +4 -15
  222. edc_export/model_exporter/object_history_helpers.py +1 -3
  223. edc_export/model_exporter/value_getter.py +5 -14
  224. edc_export/models/signals.py +1 -3
  225. edc_export/models/upload_export_receipt_file.py +1 -3
  226. edc_export/utils.py +1 -4
  227. edc_export/views/export_selected_models_view.py +6 -17
  228. edc_facility/default_definitions.py +1 -3
  229. edc_facility/facility.py +4 -14
  230. edc_facility/import_holidays.py +1 -3
  231. edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +4 -6
  232. edc_facility/migrations/0006_alter_healthfacility_health_facility_type.py +1 -1
  233. edc_facility/migrations/0008_alter_healthfacility_device_created_and_more.py +5 -13
  234. edc_facility/models/holiday.py +1 -3
  235. edc_facility/utils.py +1 -3
  236. edc_fieldsets/fieldsets_modeladmin_mixin.py +1 -3
  237. edc_form_describer/form_describer.py +3 -9
  238. edc_form_describer/make_forms_reference.py +1 -3
  239. edc_form_describer/management/commands/make_forms_reference.py +1 -3
  240. edc_form_runners/admin/issue_admin.py +2 -6
  241. edc_form_runners/form_runner.py +4 -13
  242. edc_form_runners/form_runner_by_scr_id.py +1 -3
  243. edc_form_runners/get_form_runner.py +1 -3
  244. edc_form_runners/get_form_runner_by_src_id.py +3 -3
  245. edc_form_runners/management/commands/run_form_runners.py +1 -3
  246. edc_form_runners/migrations/0001_initial.py +2 -4
  247. edc_form_runners/run_form_runners.py +1 -3
  248. edc_form_runners/utils.py +1 -3
  249. edc_form_validators/applicable_field_validator.py +6 -17
  250. edc_form_validators/base_form_validator.py +1 -3
  251. edc_form_validators/date_range_validator.py +4 -12
  252. edc_form_validators/date_validator.py +3 -9
  253. edc_form_validators/many_to_many_field_validator.py +1 -3
  254. edc_form_validators/other_specify_field_validator.py +3 -7
  255. edc_form_validators/range_field_validator.py +1 -3
  256. edc_form_validators/required_field_validator.py +5 -18
  257. edc_glucose/__init__.py +0 -0
  258. edc_glucose/apps.py +6 -0
  259. edc_glucose/constants.py +3 -0
  260. edc_glucose/fieldsets.py +14 -0
  261. edc_glucose/form_validators/__init__.py +6 -0
  262. edc_glucose/form_validators/fasting_form_validator.py +12 -0
  263. edc_glucose/form_validators/fbg_form_validator_mixin.py +32 -0
  264. edc_glucose/form_validators/fbg_ogtt_form_validator_mixin.py +47 -0
  265. edc_glucose/form_validators/glucose_form_validator.py +44 -0
  266. edc_glucose/form_validators/glucose_form_validator_mixin.py +53 -0
  267. edc_glucose/form_validators/ogtt_form_validator_mixin.py +91 -0
  268. edc_glucose/list_filters.py +42 -0
  269. edc_glucose/migrations/__init__.py +0 -0
  270. edc_glucose/model_mixin_factories/__init__.py +4 -0
  271. edc_glucose/model_mixin_factories/fasting_model_mixin_factory.py +63 -0
  272. edc_glucose/model_mixin_factories/fbg_model_mixin_factory.py +48 -0
  273. edc_glucose/model_mixin_factories/glucose_model_mixin_factory.py +49 -0
  274. edc_glucose/model_mixin_factories/ogtt_model_mixin_factory.py +71 -0
  275. edc_glucose/model_mixins/__init__.py +5 -0
  276. edc_glucose/model_mixins/fasting_model_mixin.py +15 -0
  277. edc_glucose/model_mixins/fbg_model_mixin.py +10 -0
  278. edc_glucose/model_mixins/glucose_model_mixin.py +17 -0
  279. edc_glucose/model_mixins/hba1c_model_mixin.py +42 -0
  280. edc_glucose/model_mixins/ogtt_model_mixin.py +10 -0
  281. edc_glucose/models.py +0 -0
  282. edc_glucose/utils.py +42 -0
  283. edc_identifier/admin_site.py +1 -3
  284. edc_identifier/identifier.py +1 -3
  285. edc_identifier/migrations/0001_initial.py +3 -4
  286. edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -2
  287. edc_identifier/migrations/0005_alter_identifiermodel_managers.py +2 -1
  288. edc_identifier/migrations/0005_historicalidentifierhistory_historicalidentifiertracker_historicalsubjectidentifier.py +4 -5
  289. edc_identifier/migrations/0006_auto_20161127_2226.py +16 -43
  290. edc_identifier/migrations/0007_alter_identifiermodel_device_created_and_more.py +3 -7
  291. edc_identifier/migrations/0007_auto_20161204_2227.py +4 -7
  292. edc_identifier/migrations/0009_auto_20161221_2323.py +1 -0
  293. edc_identifier/migrations/0010_auto_20170112_0602.py +2 -1
  294. edc_identifier/migrations/0012_auto_20171116_1606.py +2 -1
  295. edc_identifier/migrations/0013_auto_20171230_1316.py +3 -9
  296. edc_identifier/research_identifier.py +3 -11
  297. edc_identifier/short_identifier.py +5 -9
  298. edc_identifier/utils.py +1 -3
  299. edc_lab/admin/modeladmin_mixins.py +2 -8
  300. edc_lab/aliquot_types.py +1 -3
  301. edc_lab/form_validators/requisition_form_validator_mixin.py +1 -3
  302. edc_lab/forms/box_type_form.py +4 -6
  303. edc_lab/lab/aliquot_type.py +2 -6
  304. edc_lab/lab/manifest.py +2 -6
  305. edc_lab/lab/primary_aliquot.py +1 -3
  306. edc_lab/lab/requisition_panel.py +1 -3
  307. edc_lab/lab/requisition_panel_group.py +2 -6
  308. edc_lab/lab/specimen.py +1 -3
  309. edc_lab/labels/aliquot_label.py +4 -6
  310. edc_lab/labels/manifest_label.py +1 -3
  311. edc_lab/migrations/0001_initial.py +12 -29
  312. edc_lab/migrations/0002_auto_20170305_1939.py +4 -12
  313. edc_lab/migrations/0007_auto_20170321_1119.py +2 -6
  314. edc_lab/migrations/0008_auto_20170921_0719.py +2 -1
  315. edc_lab/migrations/0010_auto_20171127_1541.py +3 -2
  316. edc_lab/migrations/0012_auto_20180114_1438.py +2 -1
  317. edc_lab/migrations/0013_auto_20180117_1438.py +2 -1
  318. edc_lab/migrations/0022_auto_20211210_1839.py +1 -0
  319. edc_lab/migrations/0024_alter_manifestitem_managers.py +2 -1
  320. edc_lab/migrations/0027_alter_aliquot_managers_alter_box_managers_and_more.py +1 -1
  321. edc_lab/migrations/0028_alter_aliquot_device_created_and_more.py +43 -127
  322. edc_lab/model_mixins/aliquot/aliquot_label_mixin.py +1 -3
  323. edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +4 -12
  324. edc_lab/model_mixins/requisition/requisition_identifier_mixin.py +1 -3
  325. edc_lab/model_mixins/shipping/manifest_model_mixin.py +1 -3
  326. edc_lab/models/box_item.py +1 -3
  327. edc_lab/models/box_type.py +1 -3
  328. edc_lab/models/manifest/manifest.py +3 -9
  329. edc_lab/models/manifest/manifest_item.py +1 -3
  330. edc_lab/models/order.py +1 -3
  331. edc_lab/models/signals.py +1 -3
  332. edc_lab/patterns.py +1 -3
  333. edc_lab/pdf_reports/manifest_pdf_report.py +9 -27
  334. edc_lab/post_migrate_signals.py +1 -3
  335. edc_lab/site_labs.py +4 -10
  336. edc_lab_dashboard/migrations/0001_initial.py +1 -1
  337. edc_lab_dashboard/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  338. edc_lab_dashboard/view_mixins/box_view_mixin.py +1 -3
  339. edc_lab_dashboard/view_mixins/manifest_view_mixin.py +4 -12
  340. edc_lab_dashboard/views/action_views/receive_view.py +1 -3
  341. edc_lab_dashboard/views/action_views/verify_box_item_view.py +1 -3
  342. edc_lab_dashboard/views/listboard_filters/aliquot_listboard_view_filters.py +2 -6
  343. edc_lab_dashboard/views/listboard_filters/manifest_listboard_filters.py +1 -3
  344. edc_lab_dashboard/views/listboard_views/base_box_item_listboard_view.py +1 -3
  345. edc_lab_dashboard/views/listboard_views/manifest_listboard_view.py +1 -3
  346. edc_lab_dashboard/views/listboard_views/process_listboard_view.py +2 -6
  347. edc_lab_dashboard/views/listboard_views/receive_listboard_view.py +2 -6
  348. edc_lab_dashboard/views/listboard_views/requisition_listboard_view.py +2 -6
  349. edc_lab_results/action_items.py +1 -3
  350. edc_lab_results/form_validator_mixins/blood_results_fbg_form_validator_mixin.py +2 -4
  351. edc_lab_results/form_validator_mixins/blood_results_form_validator_mixin.py +1 -3
  352. edc_lab_results/get_summary.py +3 -5
  353. edc_lab_results/model_mixin_factories/__init__.py +10 -0
  354. edc_lab_results/{model_mixin_factory → model_mixin_factories}/field_attrs.py +8 -8
  355. edc_lab_results/{model_mixin_factory → model_mixin_factories}/reportable_result_model_mixin_factory.py +2 -0
  356. edc_lab_results/{model_mixin_factory → model_mixin_factories}/result_model_mixin_factory.py +2 -0
  357. edc_lab_results/model_mixins/blood_result_model_mixin.py +2 -5
  358. edc_lab_results/model_mixins/electrolytes_model_mixins.py +1 -1
  359. edc_lab_results/model_mixins/fbc_model_mixins.py +1 -1
  360. edc_lab_results/model_mixins/fbg_model_mixin.py +6 -3
  361. edc_lab_results/model_mixins/glucose_model_mixin.py +2 -2
  362. edc_lab_results/model_mixins/hba1c_model_mixin.py +2 -28
  363. edc_lab_results/model_mixins/insulin_model_mixin.py +4 -11
  364. edc_lab_results/model_mixins/lft_model_mixins.py +1 -1
  365. edc_lab_results/model_mixins/lipid_model_mixins.py +1 -1
  366. edc_lab_results/model_mixins/proteinuria_model_mixin.py +1 -1
  367. edc_lab_results/model_mixins/rft_model_mixins.py +1 -1
  368. edc_label/apps.py +1 -2
  369. edc_label/migrations/0001_initial.py +1 -1
  370. edc_label/migrations/0003_alter_zpllabeltemplates_device_created_and_more.py +3 -7
  371. edc_label/printer.py +2 -6
  372. edc_label/printers_mixin.py +1 -3
  373. edc_label/urls.py +1 -3
  374. edc_label/view_mixins.py +1 -3
  375. edc_label/views/print_label_view.py +1 -3
  376. edc_list_data/model_mixins.py +1 -3
  377. edc_list_data/preload_data.py +2 -6
  378. edc_list_data/site_list_data.py +1 -3
  379. edc_listboard/migrations/0001_initial.py +1 -1
  380. edc_listboard/migrations/0003_alter_listboard_device_created_and_more.py +3 -7
  381. edc_listboard/view_mixins/listboard_filter_view_mixin.py +5 -15
  382. edc_listboard/view_mixins/search_listboard_view_mixin.py +2 -6
  383. edc_listboard/views/listboard_view.py +2 -6
  384. edc_listboard/views/screen/screening_listboard_view.py +1 -3
  385. edc_listboard/views/subject/subject_listboard_view.py +1 -3
  386. edc_locator/forms/subject_locator_form_validator.py +4 -12
  387. edc_locator/migrations/0001_initial.py +3 -2
  388. edc_locator/migrations/0003_auto_20180103_1351.py +2 -1
  389. edc_locator/migrations/0004_auto_20180106_2148.py +2 -1
  390. edc_locator/migrations/0007_auto_20180117_1819.py +2 -1
  391. edc_locator/migrations/0011_auto_20181007_0053.py +1 -1
  392. edc_locator/migrations/0013_auto_20181007_0054.py +2 -3
  393. edc_locator/migrations/0014_auto_20181009_0545.py +1 -0
  394. edc_locator/migrations/0032_alter_subjectlocator_managers.py +1 -1
  395. edc_locator/migrations/0034_alter_historicalsubjectlocator_device_created_and_more.py +5 -13
  396. edc_locator/modeladmin_mixins.py +1 -3
  397. edc_locator/view_mixins/subject_locator_view_mixins.py +1 -3
  398. edc_ltfu/admin.py +1 -3
  399. edc_ltfu/forms/ltfu_form.py +1 -3
  400. edc_ltfu/forms/ltfu_form_validator_mixin.py +1 -2
  401. edc_ltfu/modelform_mixins.py +3 -8
  402. edc_metadata/admin/modeladmin_mixins.py +2 -8
  403. edc_metadata/management/commands/validate_entry_status.py +1 -3
  404. edc_metadata/metadata/metadata.py +12 -41
  405. edc_metadata/metadata/metadata_getter.py +2 -9
  406. edc_metadata/metadata/requisition_metadata_getter.py +1 -3
  407. edc_metadata/metadata_handler.py +3 -9
  408. edc_metadata/metadata_helper/metadata_helper_mixin.py +1 -3
  409. edc_metadata/metadata_mixins/source_model_metadata_mixin.py +3 -9
  410. edc_metadata/metadata_refresher.py +3 -9
  411. edc_metadata/metadata_rules/crf/crf_rule_group.py +2 -5
  412. edc_metadata/metadata_rules/persistant_singleton_mixin.py +3 -3
  413. edc_metadata/metadata_rules/requisition/requisition_rule_group.py +1 -2
  414. edc_metadata/metadata_rules/rule_evaluator.py +1 -3
  415. edc_metadata/metadata_rules/rule_group.py +2 -6
  416. edc_metadata/metadata_rules/rule_group_meta_options.py +1 -3
  417. edc_metadata/metadata_updater.py +1 -3
  418. edc_metadata/metadata_wrappers/metadata_wrapper.py +1 -3
  419. edc_metadata/migrations/0001_initial.py +2 -1
  420. edc_metadata/migrations/0002_auto_20161127_2226.py +6 -13
  421. edc_metadata/migrations/0005_auto_20170112_0602.py +2 -1
  422. edc_metadata/migrations/0007_auto_20170810_1032.py +2 -1
  423. edc_metadata/migrations/0009_auto_20180116_1528.py +2 -1
  424. edc_metadata/migrations/0014_auto_20190707_0002.py +1 -1
  425. edc_metadata/migrations/0015_auto_20190709_0009.py +3 -5
  426. edc_metadata/migrations/0021_alter_crfmetadata_managers_and_more.py +1 -1
  427. edc_metadata/migrations/0023_alter_crfmetadata_device_created_and_more.py +5 -13
  428. edc_metadata/model_mixins/creates/creates_metadata_model_mixin.py +1 -3
  429. edc_metadata/model_mixins/updates/updates_metadata_model_mixin.py +1 -3
  430. edc_metadata/models/crf_metadata_model_mixin.py +2 -6
  431. edc_metadata/next_form_getter.py +1 -3
  432. edc_metadata/requisition/requisition_metadata_handler.py +3 -2
  433. edc_metadata/requisition/requisition_metadata_updater.py +1 -3
  434. edc_metadata/update_metadata_on_schedule_change.py +7 -14
  435. edc_model/models/fields/initials_field.py +1 -3
  436. edc_model/models/signals.py +1 -3
  437. edc_model/system_checks.py +1 -3
  438. edc_model/validators/duration.py +1 -3
  439. edc_model_admin/admin_site.py +1 -3
  440. edc_model_admin/changelist_buttons/model_admin_changelist_button_mixin.py +4 -12
  441. edc_model_admin/changelist_buttons/model_admin_changelist_model_button_mixin.py +1 -3
  442. edc_model_admin/dashboard/model_admin_crf_dashboard_mixin.py +1 -3
  443. edc_model_admin/dashboard/model_admin_dashboard_mixin.py +1 -3
  444. edc_model_admin/mixins/base_model_admin_redirect_mixin.py +2 -6
  445. edc_model_admin/mixins/inlines/limited_admin_inline_mixin.py +1 -3
  446. edc_model_admin/mixins/model_admin_bypass_default_form_cls_mixin.py +4 -12
  447. edc_model_admin/mixins/model_admin_form_auto_number_mixin.py +2 -6
  448. edc_model_admin/mixins/model_admin_form_instructions_mixin.py +2 -6
  449. edc_model_admin/mixins/model_admin_next_url_redirect_mixin.py +3 -9
  450. edc_model_admin/mixins/model_admin_protect_pii_mixin.py +1 -3
  451. edc_model_admin/mixins/model_admin_redirect_all_to_changelist_mixin.py +2 -6
  452. edc_model_admin/mixins/model_admin_redirect_on_delete_mixin.py +1 -3
  453. edc_model_admin/templatetags/edc_admin_modify.py +3 -9
  454. edc_model_fields/fields/initials_field.py +1 -3
  455. edc_model_form/mixins/inline_model_form_mixin.py +5 -9
  456. edc_model_to_dataframe/model_to_dataframe.py +15 -46
  457. edc_navbar/get_default_navbar.py +1 -3
  458. edc_navbar/migrations/0004_auto_20220825_0451.py +1 -1
  459. edc_navbar/migrations/0006_alter_edcpermissions_device_created_and_more.py +3 -7
  460. edc_navbar/navbar.py +1 -3
  461. edc_navbar/navbar_item.py +1 -3
  462. edc_navbar/site_navbars.py +2 -6
  463. edc_navbar/templatetags/edc_navbar_extras.py +1 -3
  464. edc_notification/admin_site.py +1 -3
  465. edc_notification/mailing_list_manager.py +5 -15
  466. edc_notification/migrations/0001_initial.py +2 -1
  467. edc_notification/migrations/0008_alter_notification_device_created_and_more.py +3 -7
  468. edc_notification/modeladmin_mixins.py +1 -3
  469. edc_notification/models/notification.py +1 -3
  470. edc_notification/models/signals.py +3 -10
  471. edc_notification/notification/model_notification.py +3 -9
  472. edc_notification/notification/notification.py +4 -12
  473. edc_notification/site_notifications.py +5 -14
  474. edc_offstudy/migrations/0001_initial.py +2 -1
  475. edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -3
  476. edc_offstudy/migrations/0008_auto_20191102_0033.py +2 -1
  477. edc_offstudy/migrations/0015_auto_20220925_0032.py +1 -1
  478. edc_offstudy/migrations/0016_auto_20220929_1742.py +1 -0
  479. edc_offstudy/migrations/0018_alter_subjectoffstudy_managers.py +2 -1
  480. edc_offstudy/migrations/0019_alter_historicalsubjectoffstudy_device_created_and_more.py +5 -13
  481. edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -3
  482. edc_offstudy/modelform_mixins/crf/offstudy_crf_modelform_mixin.py +2 -6
  483. edc_offstudy/templatetags/edc_offstudy_extras.py +2 -6
  484. edc_offstudy/utils.py +1 -3
  485. edc_pdf_reports/admin/modeladmin_mixins.py +1 -3
  486. edc_pdf_reports/crf_pdf_report.py +3 -9
  487. edc_pdf_reports/flowables/textbox.py +1 -3
  488. edc_pdf_reports/report.py +6 -18
  489. edc_pdf_reports/utils.py +1 -3
  490. edc_pdf_reports/views/pdf_intermediate_view.py +1 -3
  491. edc_pdf_reports/views/print_pdf_report_view.py +2 -6
  492. edc_pdutils/actions.py +4 -12
  493. edc_pdutils/choices.py +1 -4
  494. edc_pdutils/database.py +1 -3
  495. edc_pdutils/df_exporters/csv_crf_inline_tables_exporter.py +4 -12
  496. edc_pdutils/df_exporters/csv_exporter.py +7 -22
  497. edc_pdutils/df_handlers/crf_df_handler.py +3 -9
  498. edc_pdutils/df_handlers/df_handler.py +1 -3
  499. edc_pdutils/df_handlers/registered_subject_df_handler.py +1 -3
  500. edc_pdutils/management/commands/export_models.py +2 -6
  501. edc_pdutils/migrations/0001_initial.py +6 -9
  502. edc_pdutils/site.py +2 -6
  503. edc_pdutils/site_values_mappings.py +3 -9
  504. edc_pdutils/tables/aliquot.py +2 -9
  505. edc_pdutils/tables/consent.py +2 -6
  506. edc_pdutils/tables/crf.py +4 -12
  507. edc_pdutils/tables/requisition.py +4 -12
  508. edc_pdutils/tables/visit.py +1 -3
  509. edc_pdutils/utils/convert_dates_from_model.py +3 -9
  510. edc_pdutils/utils/convert_numerics_from_model.py +1 -3
  511. edc_pdutils/utils/convert_timedelta_from_model.py +1 -3
  512. edc_pdutils/utils/missing_subject_identifiers.py +1 -3
  513. edc_pharmacy/admin/actions/confirm_stock.py +2 -6
  514. edc_pharmacy/admin/actions/delete_order_items.py +1 -3
  515. edc_pharmacy/admin/actions/delete_receive_items.py +1 -3
  516. edc_pharmacy/admin/actions/print_stock_report.py +1 -3
  517. edc_pharmacy/admin/list_filters.py +5 -17
  518. edc_pharmacy/admin/model_admin_mixin.py +1 -3
  519. edc_pharmacy/admin/prescription/rx_admin.py +2 -6
  520. edc_pharmacy/admin/prescription/rx_refill_admin.py +1 -3
  521. edc_pharmacy/admin/reports/stock_availability_admin.py +1 -5
  522. edc_pharmacy/admin/stock/allocation_admin.py +5 -15
  523. edc_pharmacy/admin/stock/allocation_proxy_admin.py +1 -3
  524. edc_pharmacy/admin/stock/confirmation_admin.py +1 -3
  525. edc_pharmacy/admin/stock/confirmation_at_site_admin.py +4 -12
  526. edc_pharmacy/admin/stock/confirmation_at_site_item_admin.py +5 -17
  527. edc_pharmacy/admin/stock/dispense_admin.py +3 -11
  528. edc_pharmacy/admin/stock/dispense_item_admin.py +4 -14
  529. edc_pharmacy/admin/stock/order_admin.py +1 -3
  530. edc_pharmacy/admin/stock/order_item_admin.py +5 -15
  531. edc_pharmacy/admin/stock/receive_admin.py +4 -12
  532. edc_pharmacy/admin/stock/receive_item_admin.py +4 -12
  533. edc_pharmacy/admin/stock/repack_request_admin.py +2 -6
  534. edc_pharmacy/admin/stock/stock_adjustment_admin.py +1 -3
  535. edc_pharmacy/admin/stock/stock_admin.py +8 -24
  536. edc_pharmacy/admin/stock/stock_proxy_admin.py +1 -5
  537. edc_pharmacy/admin/stock/stock_request_item_admin.py +5 -15
  538. edc_pharmacy/admin/stock/stock_transfer_admin.py +4 -12
  539. edc_pharmacy/admin/stock/stock_transfer_item_admin.py +6 -18
  540. edc_pharmacy/admin/stock/storage_bin_admin.py +3 -11
  541. edc_pharmacy/admin/stock/storage_bin_item_admin.py +4 -14
  542. edc_pharmacy/analytics/dataframes/get_next_scheduled_visit_for_subjects_df.py +3 -9
  543. edc_pharmacy/analytics/dataframes/in_stock_for_subjects_df.py +2 -6
  544. edc_pharmacy/analytics/dataframes/stock_for_subjects.py +1 -3
  545. edc_pharmacy/form_validators/crf/study_medication_form_validator.py +9 -27
  546. edc_pharmacy/forms/stock/container_form.py +2 -6
  547. edc_pharmacy/forms/stock/receive_item_form.py +2 -6
  548. edc_pharmacy/forms/stock/repack_request_form.py +4 -11
  549. edc_pharmacy/forms/stock/stock_request_form.py +5 -14
  550. edc_pharmacy/forms/stock/stock_request_item_form.py +1 -3
  551. edc_pharmacy/labels/draw_bulk_stock_label_code128.py +1 -3
  552. edc_pharmacy/labels/draw_bulk_stock_label_code39.py +3 -9
  553. edc_pharmacy/labels/draw_patient_stock_label_code128.py +1 -3
  554. edc_pharmacy/migrations/0001_initial.py +7 -15
  555. edc_pharmacy/migrations/0005_alter_rx_managers.py +2 -1
  556. edc_pharmacy/migrations/0015_auto_20220913_2139.py +9 -22
  557. edc_pharmacy/migrations/0016_auto_20220929_1742.py +2 -1
  558. edc_pharmacy/migrations/0018_alter_rxrefill_managers.py +1 -1
  559. edc_pharmacy/migrations/0020_alter_box_device_created_alter_box_device_modified_and_more.py +71 -211
  560. edc_pharmacy/migrations/0021_alter_box_options_alter_container_options_and_more.py +1 -1
  561. edc_pharmacy/migrations/0023_remove_rx_edc_pharmac_modifie_986021_idx_and_more.py +1 -3
  562. edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +40 -104
  563. edc_pharmacy/migrations/0031_historicalrepackrequest_task_id_and_more.py +2 -1
  564. edc_pharmacy/migrations/0033_container_display_name_and_more.py +1 -3
  565. edc_pharmacy/migrations/0035_container_max_per_subject_and_more.py +2 -6
  566. edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +2 -6
  567. edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -9
  568. edc_pharmacy/migrations/0043_stockproxy_alter_historicallot_lot_no_and_more.py +2 -1
  569. edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +5 -13
  570. edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +2 -6
  571. edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +2 -1
  572. edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +7 -11
  573. edc_pharmacy/migrations/0057_scanduplicates.py +3 -4
  574. edc_pharmacy/migrations/0058_stockrequestproxy_alter_stockproxy_options.py +2 -1
  575. edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +8 -14
  576. edc_pharmacy/migrations/0061_alter_historicalstocktransferconfirmation_options_and_more.py +1 -1
  577. edc_pharmacy/migrations/0062_auto_20250312_1433.py +2 -6
  578. edc_pharmacy/migrations/0063_alter_allocation_managers_remove_allocation_site_and_more.py +2 -1
  579. edc_pharmacy/migrations/0065_allocationproxy.py +2 -1
  580. edc_pharmacy/migrations/0068_stockout.py +2 -1
  581. edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -8
  582. edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +2 -1
  583. edc_pharmacy/migrations/0078_alter_historicalstock_qty_and_more.py +2 -1
  584. edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -10
  585. edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +2 -2
  586. edc_pharmacy/model_mixins/study_medication_crf_model_mixin.py +3 -9
  587. edc_pharmacy/models/medication/dosage_guideline.py +1 -3
  588. edc_pharmacy/models/medication/formulation.py +1 -3
  589. edc_pharmacy/models/prescription/rx.py +1 -3
  590. edc_pharmacy/models/prescription/rx_refill.py +2 -6
  591. edc_pharmacy/models/signals.py +11 -21
  592. edc_pharmacy/models/stock/allocation.py +3 -9
  593. edc_pharmacy/models/stock/confirmation.py +1 -3
  594. edc_pharmacy/models/stock/confirmation_at_site_item.py +1 -3
  595. edc_pharmacy/models/stock/container.py +1 -3
  596. edc_pharmacy/models/stock/dispense.py +1 -3
  597. edc_pharmacy/models/stock/dispense_item.py +1 -3
  598. edc_pharmacy/models/stock/lot.py +1 -3
  599. edc_pharmacy/models/stock/order_item.py +2 -6
  600. edc_pharmacy/models/stock/product.py +2 -6
  601. edc_pharmacy/models/stock/receive_item.py +4 -12
  602. edc_pharmacy/models/stock/repack_request.py +1 -3
  603. edc_pharmacy/models/stock/stock.py +3 -8
  604. edc_pharmacy/models/stock/stock_request_item.py +4 -4
  605. edc_pharmacy/models/stock/stock_transfer_item.py +1 -3
  606. edc_pharmacy/models/stock/supplier.py +1 -3
  607. edc_pharmacy/models/storage/utils.py +1 -4
  608. edc_pharmacy/pdf_reports/manifest_pdf_report.py +3 -9
  609. edc_pharmacy/pdf_reports/stock_pdf_report.py +3 -9
  610. edc_pharmacy/refill/adjust_previous_end_datetime.py +2 -6
  611. edc_pharmacy/refill/create_next_refill.py +1 -3
  612. edc_pharmacy/refill/create_refill.py +1 -3
  613. edc_pharmacy/refill/refill_creator.py +2 -6
  614. edc_pharmacy/sample_usb_printing/network_printers.py +1 -3
  615. edc_pharmacy/settings.py +3 -9
  616. edc_pharmacy/urls.py +1 -3
  617. edc_pharmacy/utils/allocate_stock.py +1 -3
  618. edc_pharmacy/utils/confirm_stock_at_site.py +3 -5
  619. edc_pharmacy/utils/dispense.py +1 -4
  620. edc_pharmacy/utils/get_unit_qty_out.py +1 -3
  621. edc_pharmacy/utils/process_repack_request.py +1 -3
  622. edc_pharmacy/utils/process_repack_request_queryset.py +1 -3
  623. edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -6
  624. edc_pharmacy/utils/stock_request/get_instock_and_nostock_data.py +3 -8
  625. edc_pharmacy/utils/transfer_stock.py +1 -3
  626. edc_pharmacy/utils/update_previous_refill_end_datetime.py +1 -3
  627. edc_pharmacy/views/add_to_storage_bin_view.py +2 -6
  628. edc_pharmacy/views/allocate_to_subject_view.py +7 -21
  629. edc_pharmacy/views/confirm_stock_from_instance_view.py +2 -6
  630. edc_pharmacy/views/confirm_stock_from_queryset_view.py +2 -7
  631. edc_pharmacy/views/confirmation_at_site_view.py +10 -31
  632. edc_pharmacy/views/dispense_view.py +2 -6
  633. edc_pharmacy/views/move_to_storage_bin_view.py +2 -6
  634. edc_pharmacy/views/prepare_and_review_stock_request_view.py +3 -9
  635. edc_pharmacy/views/print_labels_view.py +1 -3
  636. edc_pharmacy/views/print_stock_transfer_manifest_view.py +1 -3
  637. edc_pharmacy/views/transfer_stock_view.py +1 -3
  638. edc_prn/modelform_mixins.py +1 -3
  639. edc_prn/prn.py +2 -6
  640. edc_prn/templatetags/edc_prn_extras.py +4 -8
  641. edc_protocol/research_protocol_config.py +2 -5
  642. edc_protocol_incident/admin/protocol_deviation_violation_admin.py +1 -3
  643. edc_protocol_incident/auth_objects.py +1 -3
  644. edc_protocol_incident/auths.py +1 -3
  645. edc_protocol_incident/form_validators/mixins.py +3 -9
  646. edc_protocol_incident/form_validators/protocol_deviation_violation_form_validator.py +6 -18
  647. edc_protocol_incident/form_validators/protocol_incident_form_validator.py +3 -8
  648. edc_protocol_incident/migrations/0001_initial.py +4 -3
  649. edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +7 -12
  650. edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +4 -3
  651. edc_protocol_incident/migrations/0012_auto_20220913_2139.py +3 -9
  652. edc_protocol_incident/migrations/0020_alter_historicalprotocoldeviationviolation_device_created_and_more.py +9 -25
  653. edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +3 -7
  654. edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +1 -3
  655. edc_protocol_incident/urls.py +1 -3
  656. edc_pylabels/actions.py +2 -6
  657. edc_pylabels/admin/label_configuration_admin.py +4 -4
  658. edc_pylabels/drawing_callable_example.py +1 -3
  659. edc_pylabels/migrations/0001_initial.py +1 -3
  660. edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +2 -6
  661. edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +1 -3
  662. edc_pylabels/models/label_configuration.py +1 -3
  663. edc_qareports/migrations/0001_initial.py +3 -4
  664. edc_qareports/migrations/0005_edcpermissions.py +2 -4
  665. edc_qareports/migrations/0006_qareportlog.py +2 -1
  666. edc_qareports/migrations/0007_qareportlog_edc_qarepor_accesse_738ffe_idx.py +1 -3
  667. edc_qareports/migrations/0017_auto_20240816_0256.py +1 -0
  668. edc_qareports/model_mixins/note_model_mixin.py +1 -3
  669. edc_qareports/modeladmin_mixins/list_filters.py +8 -12
  670. edc_qareports/modeladmin_mixins/note_modeladmin_mixin.py +1 -3
  671. edc_qareports/modeladmin_mixins/on_study_missing_values_modeladmin_mixin.py +2 -6
  672. edc_qareports/modeladmin_mixins/qa_report_modeladmin_mixin.py +1 -3
  673. edc_qareports/sql_generator/crf_case.py +1 -5
  674. edc_qareports/sql_generator/sql_view_generator.py +1 -3
  675. edc_qareports/utils.py +2 -6
  676. edc_randomization/admin.py +1 -3
  677. edc_randomization/auths.py +2 -6
  678. edc_randomization/blinding.py +1 -3
  679. edc_randomization/migrations/0001_initial.py +3 -4
  680. edc_randomization/migrations/0009_edcpermissions.py +1 -1
  681. edc_randomization/migrations/0011_alter_edcpermissions_device_created_and_more.py +7 -19
  682. edc_randomization/model_mixins.py +2 -5
  683. edc_randomization/randomization_list_importer.py +3 -7
  684. edc_randomization/randomization_list_verifier.py +2 -7
  685. edc_randomization/randomizer.py +2 -6
  686. edc_randomization/site_randomizers.py +1 -3
  687. edc_randomization/system_checks.py +1 -3
  688. edc_randomization/utils.py +2 -6
  689. edc_refusal/admin.py +1 -3
  690. edc_refusal/forms.py +1 -2
  691. edc_refusal/migrations/0001_initial.py +2 -1
  692. edc_refusal/migrations/0002_historicalsubjectrefusal.py +6 -4
  693. edc_refusal/migrations/0004_refusalreasons_plural_name.py +1 -3
  694. edc_refusal/migrations/0005_alter_subjectrefusal_options_and_more.py +2 -1
  695. edc_refusal/migrations/0006_alter_subjectrefusal_managers.py +2 -1
  696. edc_refusal/migrations/0008_alter_historicalsubjectrefusal_device_created_and_more.py +5 -13
  697. edc_registration/admin_site.py +1 -3
  698. edc_registration/migrations/0001_initial.py +3 -4
  699. edc_registration/migrations/0002_auto_20161127_2226.py +4 -7
  700. edc_registration/migrations/0004_auto_20161221_0018.py +2 -1
  701. edc_registration/migrations/0005_auto_20170111_1809.py +2 -1
  702. edc_registration/migrations/0008_auto_20170810_1032.py +2 -1
  703. edc_registration/migrations/0012_auto_20180116_1528.py +2 -1
  704. edc_registration/migrations/0015_auto_20181006_2257.py +1 -1
  705. edc_registration/migrations/0016_historicalregisteredsubject.py +5 -6
  706. edc_registration/migrations/0026_historicalregisteredsubject_familiar_name_and_more.py +1 -1
  707. edc_registration/migrations/0028_alter_registeredsubject_managers.py +1 -1
  708. edc_registration/migrations/0029_alter_historicalregisteredsubject_device_created_and_more.py +5 -13
  709. edc_registration/modeladmin_mixins.py +1 -3
  710. edc_registration/models/registered_subject.py +4 -11
  711. edc_registration/utils.py +1 -3
  712. edc_reportable/admin_site.py +1 -3
  713. edc_reportable/data/normal_data/africa.py +4 -14
  714. edc_reportable/evaluator.py +2 -6
  715. edc_reportable/formula.py +2 -6
  716. edc_reportable/management/commands/export_reportables.py +1 -3
  717. edc_reportable/migrations/0001_initial.py +3 -9
  718. edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -9
  719. edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +4 -7
  720. edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +8 -19
  721. edc_reportable/models/mw.py +1 -3
  722. edc_reportable/models/reference_model_mixins.py +1 -3
  723. edc_reportable/models/reference_range_collection.py +3 -9
  724. edc_reportable/post_migrate_signals.py +1 -3
  725. edc_reportable/reference_range_evaluator.py +4 -11
  726. edc_reportable/utils/convert_units.py +1 -3
  727. edc_reportable/utils/get_grade_for_value.py +3 -1
  728. edc_reportable/utils/get_reference_range_collection.py +2 -2
  729. edc_reportable/utils/load_data.py +1 -3
  730. edc_reportable/utils/update_grading_data.py +2 -6
  731. edc_review_dashboard/migrations/0001_initial.py +1 -1
  732. edc_review_dashboard/migrations/0003_alter_edcpermissions_device_created_and_more.py +3 -7
  733. edc_review_dashboard/views/subject_review_listboard_view.py +1 -3
  734. edc_screening/eligibility.py +1 -3
  735. edc_screening/fc.py +1 -3
  736. edc_screening/migrations/0001_initial.py +1 -1
  737. edc_screening/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  738. edc_screening/model_mixins/eligibility_model_mixin.py +1 -3
  739. edc_screening/model_mixins/screening_fields_model_mixin.py +2 -0
  740. edc_screening/modelform_mixins.py +1 -3
  741. edc_search/search_slug.py +2 -6
  742. edc_search/updater.py +2 -5
  743. edc_sites/admin/site_model_admin_mixin.py +4 -12
  744. edc_sites/management/commands/sync_sites.py +1 -3
  745. edc_sites/migrations/0007_edcpermissions.py +2 -4
  746. edc_sites/single_site/get_languages.py +1 -3
  747. edc_sites/site.py +4 -11
  748. edc_sites/system_checks.py +1 -4
  749. edc_sites/utils/add_or_update_django_sites.py +1 -3
  750. edc_subject_dashboard/migrations/0001_initial.py +1 -1
  751. edc_subject_dashboard/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
  752. edc_subject_dashboard/requisition_labels.py +1 -3
  753. edc_subject_dashboard/requisition_report.py +5 -15
  754. edc_subject_dashboard/requisition_verifier.py +2 -7
  755. edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -6
  756. edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +1 -2
  757. edc_subject_dashboard/view_utils/crf_button.py +1 -3
  758. edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +1 -3
  759. edc_subject_dashboard/view_utils/timepoint_status_button.py +1 -3
  760. edc_subject_dashboard/views/requisition_print_actions_view.py +4 -12
  761. edc_subject_dashboard/views/requisition_verify_actions_view.py +1 -3
  762. edc_subject_dashboard/views/subject_dashboard_view.py +1 -3
  763. edc_timepoint/apps.py +1 -3
  764. edc_timepoint/timepoint.py +1 -3
  765. edc_timepoint/timepoint_lookup.py +1 -3
  766. edc_transfer/form_validators.py +4 -6
  767. edc_transfer/model_mixins.py +1 -3
  768. edc_transfer/modelform_mixins.py +1 -3
  769. edc_unblinding/action_items.py +1 -3
  770. edc_unblinding/admin_site.py +1 -3
  771. edc_unblinding/migrations/0001_initial.py +6 -4
  772. edc_unblinding/migrations/0002_auto_20210908_2318.py +1 -1
  773. edc_unblinding/migrations/0009_alter_unblindingrequest_managers_and_more.py +2 -1
  774. edc_unblinding/migrations/0010_alter_historicalunblindingrequest_device_created_and_more.py +9 -25
  775. edc_unblinding/models/unblinding_request.py +1 -3
  776. edc_unblinding/models/unblinding_review.py +1 -3
  777. edc_utils/age.py +1 -3
  778. edc_utils/date.py +1 -3
  779. edc_utils/paths_for_urlpatterns.py +1 -3
  780. edc_utils/show_urls.py +1 -3
  781. edc_utils/text.py +1 -2
  782. edc_view_utils/model_button.py +5 -13
  783. edc_view_utils/query_button.py +1 -3
  784. edc_visit_schedule/admin/subject_schedule_history_admin.py +1 -3
  785. edc_visit_schedule/baseline.py +1 -3
  786. edc_visit_schedule/migrations/0001_initial.py +3 -4
  787. edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +1 -3
  788. edc_visit_schedule/migrations/0004_auto_20190629_1800.py +1 -3
  789. edc_visit_schedule/migrations/0011_alter_historicalvisitschedule_device_created_and_more.py +7 -19
  790. edc_visit_schedule/migrations/0012_alter_subjectschedulehistory_managers_and_more.py +2 -1
  791. edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +9 -13
  792. edc_visit_schedule/migrations/0017_alter_onschedule_managers.py +2 -1
  793. edc_visit_schedule/model_mixins/crf/crf_schedule_model_mixin.py +1 -1
  794. edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +2 -6
  795. edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +1 -3
  796. edc_visit_schedule/modelform_mixins/off_schedule_modelform_mixin.py +1 -3
  797. edc_visit_schedule/models/subject_schedule_history.py +3 -8
  798. edc_visit_schedule/ordered_collection.py +1 -3
  799. edc_visit_schedule/schedule/schedule.py +6 -17
  800. edc_visit_schedule/simple_model_validator.py +3 -8
  801. edc_visit_schedule/site_visit_schedules.py +5 -15
  802. edc_visit_schedule/subject_schedule.py +4 -16
  803. edc_visit_schedule/system_checks.py +1 -3
  804. edc_visit_schedule/utils.py +8 -17
  805. edc_visit_schedule/view_mixins.py +4 -10
  806. edc_visit_schedule/visit/crf.py +1 -2
  807. edc_visit_schedule/visit/requisition.py +1 -3
  808. edc_visit_schedule/visit/visit.py +6 -16
  809. edc_visit_schedule/visit/window_period.py +3 -3
  810. edc_visit_schedule/visit_schedule/visit_schedule.py +2 -5
  811. edc_visit_tracking/crf_date_validator.py +1 -2
  812. edc_visit_tracking/form_validators/visit_form_validator.py +2 -8
  813. edc_visit_tracking/form_validators/visit_missed_form_validator.py +3 -9
  814. edc_visit_tracking/migrations/0003_auto_20220913_2139.py +2 -6
  815. edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +8 -16
  816. edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +2 -6
  817. edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +1 -3
  818. edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +1 -3
  819. edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +1 -3
  820. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +1 -2
  821. edc_visit_tracking/modeladmin_mixins/crf_model_admin_mixin.py +4 -8
  822. edc_visit_tracking/modeladmin_mixins/visit_model_admin_mixin.py +4 -6
  823. edc_visit_tracking/modelform_mixins/crf/visit_tracking_crf_modelform_mixin.py +2 -6
  824. edc_visit_tracking/modelform_mixins/utils.py +1 -3
  825. edc_visit_tracking/modelform_mixins/visit_tracking_modelform_mixin.py +1 -2
  826. edc_visit_tracking/models/signals.py +1 -3
  827. edc_visit_tracking/stubs.py +1 -3
  828. edc_visit_tracking/utils.py +1 -2
  829. edc_visit_tracking/view_utils/related_visit_button.py +1 -3
  830. edc_visit_tracking/visit_sequence.py +1 -3
  831. edc_vitals/__init__.py +2 -0
  832. edc_vitals/apps.py +6 -0
  833. edc_vitals/calculators/__init__.py +1 -0
  834. edc_vitals/calculators/bmi.py +70 -0
  835. edc_vitals/form_validators/__init__.py +5 -0
  836. edc_vitals/form_validators/blood_pressure_form_validator_mixin.py +40 -0
  837. edc_vitals/form_validators/bmi_form_validator_mixin.py +19 -0
  838. edc_vitals/form_validators/weight_height_with_bmi_form_validator_mixin.py +13 -0
  839. edc_vitals/migrations/__init__.py +0 -0
  840. edc_vitals/model_mixins/__init__.py +5 -0
  841. edc_vitals/model_mixins/blood_pressure_model_mixin.py +80 -0
  842. edc_vitals/model_mixins/weight_height_bmi_model_mixin.py +42 -0
  843. edc_vitals/models/__init__.py +10 -0
  844. edc_vitals/models/fields/__init__.py +7 -0
  845. edc_vitals/models/fields/blood_pressure.py +36 -0
  846. edc_vitals/models/fields/heart_rate.py +22 -0
  847. edc_vitals/models/fields/height.py +26 -0
  848. edc_vitals/models/fields/respiratory_rate.py +22 -0
  849. edc_vitals/models/fields/temperature.py +26 -0
  850. edc_vitals/models/fields/waist_circumference.py +23 -0
  851. edc_vitals/models/fields/weight.py +26 -0
  852. edc_vitals/utils.py +51 -0
  853. edc_vitals/validators.py +5 -0
  854. edc_lab_results/model_mixin_factory/__init__.py +0 -2
  855. {clinicedc-2.0.1.dist-info → clinicedc-2.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -399,9 +399,7 @@ class Migration(migrations.Migration):
399
399
  ),
400
400
  migrations.AddIndex(
401
401
  model_name="exportreceipt",
402
- index=models.Index(
403
- fields=["-timestamp"], name="edc_export__timesta_6a2406_idx"
404
- ),
402
+ index=models.Index(fields=["-timestamp"], name="edc_export__timesta_6a2406_idx"),
405
403
  ),
406
404
  migrations.AddIndex(
407
405
  model_name="filehistory",
@@ -437,8 +435,6 @@ class Migration(migrations.Migration):
437
435
  ),
438
436
  migrations.AddIndex(
439
437
  model_name="uploadexportreceiptfile",
440
- index=models.Index(
441
- fields=["-created"], name="edc_export__created_f54b3c_idx"
442
- ),
438
+ index=models.Index(fields=["-created"], name="edc_export__created_f54b3c_idx"),
443
439
  ),
444
440
  ]
@@ -38,9 +38,7 @@ class Migration(migrations.Migration):
38
38
  ),
39
39
  migrations.AddIndex(
40
40
  model_name="exportreceipt",
41
- index=models.Index(
42
- fields=["timestamp"], name="edc_export__timesta_a855d0_idx"
43
- ),
41
+ index=models.Index(fields=["timestamp"], name="edc_export__timesta_a855d0_idx"),
44
42
  ),
45
43
  migrations.AddIndex(
46
44
  model_name="filehistory",
@@ -50,8 +48,6 @@ class Migration(migrations.Migration):
50
48
  ),
51
49
  migrations.AddIndex(
52
50
  model_name="uploadexportreceiptfile",
53
- index=models.Index(
54
- fields=["created"], name="edc_export__created_bd7ff7_idx"
55
- ),
51
+ index=models.Index(fields=["created"], name="edc_export__created_bd7ff7_idx"),
56
52
  ),
57
53
  ]
@@ -100,17 +100,10 @@ class ModelExporter(object):
100
100
  self.field_names.pop(self._field_names.index(f))
101
101
 
102
102
  for f in self._field_names:
103
- if (
104
- f in self.export_fields
105
- or f in self.audit_fields
106
- or f in self.required_fields
107
- ):
103
+ if f in self.export_fields or f in self.audit_fields or f in self.required_fields:
108
104
  self._field_names.pop(self._field_names.index(f))
109
105
  self._field_names = (
110
- self.export_fields
111
- + self.required_fields
112
- + self.field_names
113
- + self.audit_fields
106
+ self.export_fields + self.required_fields + self.field_names + self.audit_fields
114
107
  )
115
108
 
116
109
  @property
@@ -159,16 +152,12 @@ class ModelExporter(object):
159
152
  file_history_updater.update()
160
153
  return path
161
154
 
162
- def prepare_row(
163
- self, model_obj=None, exported_datetime=None, export_change_type=None
164
- ):
155
+ def prepare_row(self, model_obj=None, exported_datetime=None, export_change_type=None):
165
156
  """Returns one row for the CSV writer.
166
157
 
167
158
  Most of the work is done by the ValueGetter class.
168
159
  """
169
- additional_values = self.additional_values_cls(
170
- export_datetime=exported_datetime
171
- )
160
+ additional_values = self.additional_values_cls(export_datetime=exported_datetime)
172
161
  row = {}
173
162
  for field_name in self.field_names:
174
163
  value_getter = self.value_getter_cls(
@@ -108,9 +108,7 @@ class ObjectHistoryHelper:
108
108
  self.create = create
109
109
 
110
110
  def get_not_exported(self):
111
- return self.obj_getter.get_not_exported(
112
- model_obj=self.model_obj, create=self.create
113
- )
111
+ return self.obj_getter.get_not_exported(model_obj=self.model_obj, create=self.create)
114
112
 
115
113
  def update_as_exported(self, **kwargs):
116
114
  self.obj_updater.update_as_exported(**kwargs)
@@ -82,9 +82,7 @@ class ValueGetter:
82
82
  self._value = self.strip_value(self._value)
83
83
  return self._value
84
84
 
85
- def _get_field_value(
86
- self, model_obj: Type[MyModel] = None, field_name: str = None
87
- ) -> Any:
85
+ def _get_field_value(self, model_obj: Type[MyModel] = None, field_name: str = None) -> Any:
88
86
  """Returns a field value.
89
87
 
90
88
  1. Tries to access a field as a model instance attribute;
@@ -104,13 +102,10 @@ class ValueGetter:
104
102
  value = getattr(model_obj, field_name)
105
103
  except AttributeError:
106
104
  if field_name in self.lookups:
107
- value = self.get_lookup_value(
108
- model_obj=model_obj, field_name=field_name
109
- )
105
+ value = self.get_lookup_value(model_obj=model_obj, field_name=field_name)
110
106
  else:
111
107
  raise ValueGetterUnknownField(
112
- f"Unknown field name. Perhaps add a lookup. "
113
- f"Got {field_name}.",
108
+ f"Unknown field name. Perhaps add a lookup. " f"Got {field_name}.",
114
109
  code=field_name,
115
110
  )
116
111
  if isinstance(value, Manager):
@@ -122,9 +117,7 @@ class ValueGetter:
122
117
  )
123
118
  return value
124
119
 
125
- def get_lookup_value(
126
- self, model_obj: Type[MyModel] = None, field_name: str = None
127
- ) -> Any:
120
+ def get_lookup_value(self, model_obj: Type[MyModel] = None, field_name: str = None) -> Any:
128
121
  """Returns the field value by following the lookup string
129
122
  to a related instance.
130
123
  """
@@ -144,9 +137,7 @@ class ValueGetter:
144
137
  """Returns the list of m2m field names for this model."""
145
138
  return [m2m.name for m2m in self.model_cls._meta.many_to_many]
146
139
 
147
- def get_m2m_value(
148
- self, model_obj: Type[MyModel] = None, field_name: str = None
149
- ) -> str:
140
+ def get_m2m_value(self, model_obj: Type[MyModel] = None, field_name: str = None) -> str:
150
141
  """Returns an m2m field value as a delimited string."""
151
142
  return self.m2m_delimiter.join(
152
143
  [value.name for value in getattr(model_obj, field_name).all()]
@@ -21,9 +21,7 @@ def export_transaction_history_on_post_save(
21
21
  raise AttributeError(e)
22
22
 
23
23
 
24
- @receiver(
25
- pre_delete, weak=False, dispatch_uid="export_transaction_history_on_pre_delete"
26
- )
24
+ @receiver(pre_delete, weak=False, dispatch_uid="export_transaction_history_on_pre_delete")
27
25
  def export_transaction_history_on_pre_delete(sender, instance, using, **kwargs):
28
26
  """Serializes the model instance, before deleting, to export
29
27
  history model if manager exists."""
@@ -42,9 +42,7 @@ class UploadExportReceiptFile(BaseUuidModel):
42
42
 
43
43
  def save(self, *args, **kwargs):
44
44
  if not self.id:
45
- self.file_name = self.export_receipt_file.name.replace("\\", "/").split(
46
- "/"
47
- )[-1]
45
+ self.file_name = self.export_receipt_file.name.replace("\\", "/").split("/")[-1]
48
46
  self.update_file_history()
49
47
  super(UploadExportReceiptFile, self).save(*args, **kwargs)
50
48
 
edc_export/utils.py CHANGED
@@ -60,10 +60,7 @@ def raise_if_prohibited_from_export_pii_group(username: str, groups: Iterable) -
60
60
 
61
61
  See also edc_auth's UserForm.
62
62
  """
63
- if (
64
- EXPORT_PII in [grp.name for grp in groups]
65
- and username not in get_export_pii_users()
66
- ):
63
+ if EXPORT_PII in [grp.name for grp in groups] and username not in get_export_pii_users():
67
64
  raise forms.ValidationError(
68
65
  {
69
66
  "groups": format_html(
@@ -45,8 +45,7 @@ class ExportSelectedModelsView(EdcViewMixin, TemplateView):
45
45
  if self.request.session.get("selected_models"):
46
46
  kwargs.update(
47
47
  selected_models=[
48
- ModelOptions(**dct)
49
- for dct in self.request.session["selected_models"]
48
+ ModelOptions(**dct) for dct in self.request.session["selected_models"]
50
49
  ]
51
50
  )
52
51
  return super().get_context_data(**kwargs)
@@ -74,9 +73,7 @@ class ExportSelectedModelsView(EdcViewMixin, TemplateView):
74
73
  "Nothing to do. Select one or more models and try again.",
75
74
  )
76
75
  except FilesEmailerError as e:
77
- messages.error(
78
- request, f"Failed to send the data you requested. Got '{e}'"
79
- )
76
+ messages.error(request, f"Failed to send the data you requested. Got '{e}'")
80
77
  url = reverse(self.post_action_url, kwargs=self.kwargs)
81
78
  return HttpResponseRedirect(url)
82
79
 
@@ -110,9 +107,7 @@ class ExportSelectedModelsView(EdcViewMixin, TemplateView):
110
107
  "Please check your email."
111
108
  )
112
109
  else:
113
- msg = (
114
- f"Your data request has been saved to {exporter.archive_filename}. "
115
- )
110
+ msg = f"Your data request has been saved to {exporter.archive_filename}. "
116
111
 
117
112
  messages.success(request, msg)
118
113
  summary = [str(x) for x in exporter.exported]
@@ -143,18 +138,12 @@ class ExportSelectedModelsView(EdcViewMixin, TemplateView):
143
138
  exportables = Exportables(request=request, user=request.user)
144
139
  selected_models = []
145
140
  for exportable in exportables:
146
- selected_models.extend(
147
- request.POST.getlist(f"chk_{exportable}_models") or []
148
- )
141
+ selected_models.extend(request.POST.getlist(f"chk_{exportable}_models") or [])
149
142
  selected_models.extend(
150
143
  request.POST.getlist(f"chk_{exportable}_historical_models") or []
151
144
  )
152
- selected_models.extend(
153
- request.POST.getlist(f"chk_{exportable}_list_models") or []
154
- )
155
- selected_models.extend(
156
- request.POST.getlist(f"chk_{exportable}_inlines") or []
157
- )
145
+ selected_models.extend(request.POST.getlist(f"chk_{exportable}_list_models") or [])
146
+ selected_models.extend(request.POST.getlist(f"chk_{exportable}_inlines") or [])
158
147
  if selected_models:
159
148
  selected_models = [ModelOptions(model=m) for m in selected_models if m]
160
149
  return selected_models
@@ -14,9 +14,7 @@ default_definitions: dict[str, dict[str, list | bool]] = {
14
14
  SEVEN_DAY_CLINIC: dict(
15
15
  days=[MO, TU, WE, TH, FR, SA, SU], slots=[100, 100, 100, 100, 100, 100, 100]
16
16
  ),
17
- SIX_DAY_CLINIC: dict(
18
- days=[MO, TU, WE, TH, FR, SA], slots=[100, 100, 100, 100, 100, 100]
19
- ),
17
+ SIX_DAY_CLINIC: dict(days=[MO, TU, WE, TH, FR, SA], slots=[100, 100, 100, 100, 100, 100]),
20
18
  FIVE_DAY_CLINIC: dict(days=[MO, TU, WE, TH, FR], slots=[100, 100, 100, 100, 100]),
21
19
  FOUR_DAY_CLINIC: dict(days=[MO, TU, WE, TH], slots=[100, 100, 100, 100]),
22
20
  TU_WE_TH_CLINIC: dict(
edc_facility/facility.py CHANGED
@@ -44,9 +44,7 @@ class Facility:
44
44
  if not name:
45
45
  raise FacilityError(f"Name cannot be None. See {repr(self)}")
46
46
  self.best_effort_available_datetime = (
47
- True
48
- if best_effort_available_datetime is None
49
- else best_effort_available_datetime
47
+ True if best_effort_available_datetime is None else best_effort_available_datetime
50
48
  )
51
49
  for day in days:
52
50
  try:
@@ -63,10 +61,7 @@ class Facility:
63
61
 
64
62
  def __str__(self):
65
63
  description = ", ".join(
66
- [
67
- str(day) + "(" + str(slot) + " slots)"
68
- for day, slot in self.config.items()
69
- ]
64
+ [str(day) + "(" + str(slot) + " slots)" for day, slot in self.config.items()]
70
65
  )
71
66
  return f"{self.name.title()} {description}"
72
67
 
@@ -111,10 +106,7 @@ class Facility:
111
106
  max_arr = Arrow.fromdate(
112
107
  suggested_arr.datetime + forward_delta, tzinfo=ZoneInfo("UTC")
113
108
  )
114
- span = [
115
- arw[0]
116
- for arw in Arrow.span_range("day", min_arr.datetime, max_arr.datetime)
117
- ]
109
+ span = [arw[0] for arw in Arrow.span_range("day", min_arr.datetime, max_arr.datetime)]
118
110
  span_lt = [arw for arw in span if arw.date() < suggested_arr.date()]
119
111
  span_lt = sorted(span_lt, key=methodcaller("date"), reverse=True)
120
112
  span_gt = [arw for arw in span if arw.date() > suggested_arr.date()]
@@ -172,9 +164,7 @@ class Facility:
172
164
  if arr.date().weekday() in self.weekdays and (
173
165
  min_arr.date() <= arr.date() < max_arr.date()
174
166
  ):
175
- is_holiday = (
176
- False if schedule_on_holidays else self.is_holiday(arr.datetime)
177
- )
167
+ is_holiday = False if schedule_on_holidays else self.is_holiday(arr.datetime)
178
168
  if (
179
169
  not is_holiday
180
170
  and arr.date() not in [a.date() for a in taken_arr]
@@ -76,9 +76,7 @@ def import_file(path: str, recs: list, model_cls: Holiday):
76
76
  )
77
77
  else:
78
78
  try:
79
- obj = model_cls.objects.get(
80
- country=row["country"], local_date=local_date
81
- )
79
+ obj = model_cls.objects.get(country=row["country"], local_date=local_date)
82
80
  except ObjectDoesNotExist:
83
81
  model_cls.objects.create(
84
82
  country=row["country"], local_date=local_date, name=row["label"]
@@ -10,14 +10,14 @@ import django_audit_fields.fields.userfield
10
10
  import django_audit_fields.fields.uuid_auto_field
11
11
  import django_audit_fields.models.audit_model_mixin
12
12
  import django_revision.revision_field
13
- import edc_model_fields.fields.other_charfield
14
- import edc_sites.models
15
- import edc_utils.date
16
13
  import simple_history.models
17
14
  from django.conf import settings
18
15
  from django.db import migrations, models
19
16
 
20
17
  import edc_facility.model_mixins
18
+ import edc_model_fields.fields.other_charfield
19
+ import edc_sites.models
20
+ import edc_utils.date
21
21
 
22
22
 
23
23
  class Migration(migrations.Migration):
@@ -195,9 +195,7 @@ class Migration(migrations.Migration):
195
195
  ),
196
196
  (
197
197
  "plural_name",
198
- models.CharField(
199
- max_length=250, null=True, verbose_name="Plural name"
200
- ),
198
+ models.CharField(max_length=250, null=True, verbose_name="Plural name"),
201
199
  ),
202
200
  (
203
201
  "display_name",
@@ -1,7 +1,7 @@
1
1
  # Generated by Django 4.2.3 on 2023-07-25 18:31
2
2
 
3
- from django.db import migrations, models
4
3
  import django.db.models.deletion
4
+ from django.db import migrations, models
5
5
 
6
6
 
7
7
  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="healthfacility",
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="healthfacility",
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="healthfacility",
@@ -49,16 +45,12 @@ class Migration(migrations.Migration):
49
45
  migrations.AlterField(
50
46
  model_name="historicalhealthfacility",
51
47
  name="device_created",
52
- field=models.CharField(
53
- blank=True, max_length=10, verbose_name="Device created"
54
- ),
48
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device created"),
55
49
  ),
56
50
  migrations.AlterField(
57
51
  model_name="historicalhealthfacility",
58
52
  name="device_modified",
59
- field=models.CharField(
60
- blank=True, max_length=10, verbose_name="Device modified"
61
- ),
53
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device modified"),
62
54
  ),
63
55
  migrations.AlterField(
64
56
  model_name="historicalhealthfacility",
@@ -21,9 +21,7 @@ class Holiday(models.Model):
21
21
 
22
22
  @property
23
23
  def formatted_date(self) -> str:
24
- return self.local_date.strftime(
25
- convert_php_dateformat(settings.SHORT_DATE_FORMAT)
26
- )
24
+ return self.local_date.strftime(convert_php_dateformat(settings.SHORT_DATE_FORMAT))
27
25
 
28
26
  def __str__(self):
29
27
  return f"{self.label} on {self.formatted_date}"
edc_facility/utils.py CHANGED
@@ -40,9 +40,7 @@ def get_facility(name: str = None) -> Facility:
40
40
  facilities = get_facilities()
41
41
  facility = facilities.get(name)
42
42
  if not facility:
43
- raise FacilityError(
44
- f"Facility '{name}' does not exist. Expected one of {facilities}."
45
- )
43
+ raise FacilityError(f"Facility '{name}' does not exist. Expected one of {facilities}.")
46
44
  return facility
47
45
 
48
46
 
@@ -71,9 +71,7 @@ class FieldsetsModelAdminMixin:
71
71
  except AttributeError:
72
72
  pass
73
73
  try:
74
- fieldsets.remove_fields(
75
- *fieldlist.remove_fields, section=fieldlist.section
76
- )
74
+ fieldsets.remove_fields(*fieldlist.remove_fields, section=fieldlist.section)
77
75
  except AttributeError:
78
76
  pass
79
77
  fieldsets.move_to_end(self.fieldsets_move_to_end)
@@ -66,9 +66,7 @@ class FormDescriber:
66
66
  except AttributeError:
67
67
  self.model_cls = admin_cls.form._meta.model
68
68
  self.visit_code = visit_code
69
- self.models_fields = {
70
- fld.name: fld for fld in self.model_cls._meta.get_fields()
71
- }
69
+ self.models_fields = {fld.name: fld for fld in self.model_cls._meta.get_fields()}
72
70
 
73
71
  # include custom labels from admin
74
72
  try:
@@ -171,9 +169,7 @@ class FormDescriber:
171
169
  if field_cls.help_text:
172
170
  self.markdown.append(f"\n&nbsp;&nbsp;&nbsp;&nbsp; *{field_cls.help_text}*")
173
171
  if self.custom_form_labels.get(fname):
174
- self.markdown.append(
175
- f"* custom_prompt: *{self.custom_form_labels.get(fname)}*"
176
- )
172
+ self.markdown.append(f"* custom_prompt: *{self.custom_form_labels.get(fname)}*")
177
173
  self.markdown.append(f"- db_table: {self.model_cls._meta.db_table}")
178
174
  self.markdown.append(f"- column: {field_cls.name}")
179
175
  try:
@@ -195,9 +191,7 @@ class FormDescriber:
195
191
  if field_cls.choices:
196
192
  self.markdown.append("- responses:")
197
193
  # TODO: expand custom choices
198
- for response in [
199
- f"`{tpl[0]}`: *{tpl[1]}*" for tpl in field_cls.choices
200
- ]:
194
+ for response in [f"`{tpl[0]}`: *{tpl[1]}*" for tpl in field_cls.choices]:
201
195
  self.markdown.append(f" - {response}")
202
196
  else:
203
197
  self.markdown.append("- responses: *free text*")
@@ -25,9 +25,7 @@ def make_forms_reference(
25
25
  module = import_module(app_label)
26
26
  admin_site = getattr(getattr(module, "admin_site"), admin_site_name)
27
27
  visit_schedule = site_visit_schedules.get_visit_schedule(visit_schedule_name)
28
- title = title or _("%(title_app)s Forms Reference") % dict(
29
- title_app=app_label.upper()
30
- )
28
+ title = title or _("%(title_app)s Forms Reference") % dict(title_app=app_label.upper())
31
29
  sys.stdout.write(
32
30
  style.MIGRATE_HEADING(f"Refreshing CRF reference document for {app_label}\n")
33
31
  )
@@ -29,9 +29,7 @@ def update_forms_reference(
29
29
  filename = filename or "forms_reference.md"
30
30
  admin_site = getattr(getattr(module, "admin_site"), admin_site_name)
31
31
  visit_schedule = site_visit_schedules.get_visit_schedule(visit_schedule_name)
32
- title = title or _("%(title_app)s Forms Reference") % dict(
33
- title_app=app_label.upper()
34
- )
32
+ title = title or _("%(title_app)s Forms Reference") % dict(title_app=app_label.upper())
35
33
  sys.stdout.write(
36
34
  style.MIGRATE_HEADING(f"Refreshing CRF reference document for {app_label}\n")
37
35
  )
@@ -128,9 +128,7 @@ class IssueAdmin(
128
128
 
129
129
  @admin.display(description="Message", ordering="short_message")
130
130
  def error_msg(self, obj):
131
- return format_html(
132
- "<BR>".join(wrap(obj.short_message, 45)).replace(" ", "&nbsp")
133
- )
131
+ return format_html("<BR>".join(wrap(obj.short_message, 45)).replace(" ", "&nbsp"))
134
132
 
135
133
  @admin.display(description="Visit", ordering="visit_code")
136
134
  def visit(self, obj):
@@ -139,9 +137,7 @@ class IssueAdmin(
139
137
  @admin.display(description="Document", ordering="verbose_name")
140
138
  def document(self, obj):
141
139
  if obj.panel_name:
142
- return (
143
- f"{obj.verbose_name.title()} {obj.panel_name.replace('_', ' ').title()}"
144
- )
140
+ return f"{obj.verbose_name.title()} {obj.panel_name.replace('_', ' ').title()}"
145
141
  return obj.verbose_name
146
142
 
147
143
  def get_subject_dashboard_url_kwargs(self, obj) -> dict:
@@ -79,9 +79,7 @@ class FormRunner:
79
79
  form = self.modelform_cls(data, instance=src_obj)
80
80
  form.is_valid()
81
81
  errors = {
82
- k: v
83
- for k, v in form._errors.items()
84
- if k not in self.get_exclude_formfields()
82
+ k: v for k, v in form._errors.items() if k not in self.get_exclude_formfields()
85
83
  }
86
84
  if errors:
87
85
  for fldname, errmsg in errors.items():
@@ -112,10 +110,7 @@ class FormRunner:
112
110
  )
113
111
 
114
112
  fields = [
115
- k
116
- for k, v in getattr(
117
- self.modeladmin_cls.form(), "fields", {}
118
- ).items()
113
+ k for k, v in getattr(self.modeladmin_cls.form(), "fields", {}).items()
119
114
  ]
120
115
  fields = list(set(fields))
121
116
  return fields
@@ -151,9 +146,7 @@ class FormRunner:
151
146
  def unique_opts(self, src_obj: Model) -> dict[str, Any]:
152
147
  """Note: unique constraint includes `field_name`"""
153
148
  model_obj_or_related_visit = src_obj
154
- get_related_visit_model_attr = getattr(
155
- src_obj, "related_visit_model_attr", None
156
- )
149
+ get_related_visit_model_attr = getattr(src_obj, "related_visit_model_attr", None)
157
150
  if (
158
151
  get_related_visit_model_attr
159
152
  and get_related_visit_model_attr()
@@ -185,9 +178,7 @@ class FormRunner:
185
178
 
186
179
  @property
187
180
  def src_qs(self) -> QuerySet:
188
- return self.src_model_cls.objects.filter(
189
- **(self.get_src_filter_options() or {})
190
- )
181
+ return self.src_model_cls.objects.filter(**(self.get_src_filter_options() or {}))
191
182
 
192
183
  def get_form_data(self, src_obj: Any) -> dict[str, Any]:
193
184
  data = {
@@ -30,7 +30,5 @@ class BaseFormRunnerBySrcId:
30
30
 
31
31
 
32
32
  class FormRunnerBySrcId(BaseFormRunnerBySrcId, FormRunner):
33
- def __init__(
34
- self, src_id: uuid.UUID, model_name: str | None, verbose: bool | None = None
35
- ):
33
+ def __init__(self, src_id: uuid.UUID, model_name: str | None, verbose: bool | None = None):
36
34
  super().__init__(src_id=src_id, model_name=model_name, verbose=verbose)
@@ -6,9 +6,7 @@ from .site import site_form_runners
6
6
  __all__ = ["get_form_runner"]
7
7
 
8
8
 
9
- def get_form_runner(
10
- model_name: str | None = None, verbose: bool | None = None
11
- ) -> FormRunner:
9
+ def get_form_runner(model_name: str | None = None, verbose: bool | None = None) -> FormRunner:
12
10
  if form_runner_cls := site_form_runners.registry.get(model_name):
13
11
  return form_runner_cls(model_name=model_name, verbose=verbose)
14
12
  return FormRunner(model_name=model_name, verbose=verbose)
@@ -14,7 +14,7 @@ def get_form_runner_by_src_id(
14
14
  verbose: bool | None = None,
15
15
  ) -> BaseFormRunnerBySrcId | FormRunnerBySrcId:
16
16
  if form_runner_cls := site_form_runners.registry.get(model_name):
17
- return type(
18
- "CustomFormRunnerBySrcId", (BaseFormRunnerBySrcId, form_runner_cls), {}
19
- )(src_id=src_id, model_name=model_name)
17
+ return type("CustomFormRunnerBySrcId", (BaseFormRunnerBySrcId, form_runner_cls), {})(
18
+ src_id=src_id, model_name=model_name
19
+ )
20
20
  return FormRunnerBySrcId(src_id=src_id, model_name=model_name, verbose=verbose)
@@ -87,9 +87,7 @@ def get_model_names(app_labels, model_names, skip_model_names):
87
87
  for app_config in django_apps.get_app_configs():
88
88
  if app_config.name in app_labels:
89
89
  for model_cls in app_config.get_models():
90
- if not model_cls._meta.label_lower.split(".")[1].startswith(
91
- "historical"
92
- ):
90
+ if not model_cls._meta.label_lower.split(".")[1].startswith("historical"):
93
91
  model_names.append(model_cls._meta.label_lower)
94
92
 
95
93
  return [m for m in model_names if m not in skip_model_names]
@@ -1,13 +1,13 @@
1
1
  # Generated by Django 4.2.7 on 2023-11-28 19:39
2
2
 
3
3
  import _socket
4
- from django.db import migrations, models
5
4
  import django.db.models.deletion
6
5
  import django_audit_fields.fields.hostname_modification_field
7
6
  import django_audit_fields.fields.userfield
8
7
  import django_audit_fields.fields.uuid_auto_field
9
8
  import django_audit_fields.models.audit_model_mixin
10
9
  import django_revision.revision_field
10
+ from django.db import migrations, models
11
11
 
12
12
 
13
13
  class Migration(migrations.Migration):
@@ -85,9 +85,7 @@ class Migration(migrations.Migration):
85
85
  ),
86
86
  (
87
87
  "device_created",
88
- models.CharField(
89
- blank=True, max_length=10, verbose_name="Device created"
90
- ),
88
+ models.CharField(blank=True, max_length=10, verbose_name="Device created"),
91
89
  ),
92
90
  (
93
91
  "device_modified",
@@ -23,9 +23,7 @@ def run_form_runners(
23
23
  for app_config in django_apps.get_app_configs():
24
24
  if app_config.name in app_labels:
25
25
  for model_cls in app_config.get_models():
26
- if not model_cls._meta.label_lower.split(".")[1].startswith(
27
- "historical"
28
- ):
26
+ if not model_cls._meta.label_lower.split(".")[1].startswith("historical"):
29
27
  model_names.append(model_cls._meta.label_lower)
30
28
  if not model_names:
31
29
  raise FormRunnerError("Nothing to do.")
edc_form_runners/utils.py CHANGED
@@ -19,9 +19,7 @@ if TYPE_CHECKING:
19
19
 
20
20
  from .models import Issue
21
21
 
22
- class RelatedVisitModel(
23
- SiteModelMixin, CreatesMetadataModelMixin, Base, BaseUuidModel
24
- ):
22
+ class RelatedVisitModel(SiteModelMixin, CreatesMetadataModelMixin, Base, BaseUuidModel):
25
23
  pass
26
24
 
27
25