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
@@ -10,16 +10,12 @@ def update_new_appt_type(apps, schema_editor):
10
10
  historical_model_cls = apps.get_model("edc_appointment.historicalappointment")
11
11
  total = appointment_model_cls.objects.all().count()
12
12
  for appointment in tqdm(appointment_model_cls.objects.all(), total=total):
13
- appt_type = appointment_type_model_cls.objects.get(
14
- name=appointment.appt_type_old
15
- )
13
+ appt_type = appointment_type_model_cls.objects.get(name=appointment.appt_type_old)
16
14
  appointment.appt_type = appt_type
17
15
  appointment.save(update_fields=["appt_type"])
18
16
 
19
17
  for appointment in tqdm(historical_model_cls.objects.all(), total=total):
20
- appt_type = appointment_type_model_cls.objects.get(
21
- name=appointment.appt_type_old
22
- )
18
+ appt_type = appointment_type_model_cls.objects.get(name=appointment.appt_type_old)
23
19
  appointment.appt_type = appt_type
24
20
  appointment.save(update_fields=["appt_type"])
25
21
 
@@ -1,6 +1,7 @@
1
1
  # Generated by Django 4.2.3 on 2023-08-16 15:25
2
2
 
3
3
  from django.db import migrations
4
+
4
5
  import edc_model_fields.fields.other_charfield
5
6
 
6
7
 
@@ -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="appointment",
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="appointment",
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="appointment",
@@ -49,16 +45,12 @@ class Migration(migrations.Migration):
49
45
  migrations.AlterField(
50
46
  model_name="historicalappointment",
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="historicalappointment",
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="historicalappointment",
@@ -24,9 +24,7 @@ class Migration(migrations.Migration):
24
24
  ),
25
25
  (
26
26
  "plural_name",
27
- models.CharField(
28
- max_length=250, null=True, verbose_name="Plural name"
29
- ),
27
+ models.CharField(max_length=250, null=True, verbose_name="Plural name"),
30
28
  ),
31
29
  (
32
30
  "display_name",
@@ -175,9 +175,7 @@ class Migration(migrations.Migration):
175
175
  ),
176
176
  migrations.AddIndex(
177
177
  model_name="appointment",
178
- index=models.Index(
179
- fields=["appt_status"], name="edc_appoint_appt_st_57c8d0_idx"
180
- ),
178
+ index=models.Index(fields=["appt_status"], name="edc_appoint_appt_st_57c8d0_idx"),
181
179
  ),
182
180
  migrations.AddIndex(
183
181
  model_name="appointment",
@@ -0,0 +1,38 @@
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_appointment", "0048_alter_appointment_site_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="appointment",
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
+ migrations.AlterField(
27
+ model_name="historicalappointment",
28
+ name="revision",
29
+ field=django_revision.revision_field.RevisionField(
30
+ blank=True,
31
+ editable=False,
32
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
33
+ max_length=75,
34
+ null=True,
35
+ verbose_name="Revision",
36
+ ),
37
+ ),
38
+ ]
@@ -31,11 +31,7 @@ class AppointmentMethodsModelMixin(models.Model):
31
31
  """Mixin of methods for the appointment model only"""
32
32
 
33
33
  def get_appt_type_display(self: Appointment) -> str:
34
- return (
35
- get_appointment_type_model_cls()
36
- .objects.get(id=self.appt_type_id)
37
- .display_name
38
- )
34
+ return get_appointment_type_model_cls().objects.get(id=self.appt_type_id).display_name
39
35
 
40
36
  @property
41
37
  def facility(self: Appointment) -> Facility:
@@ -22,14 +22,15 @@ from edc_visit_schedule.model_mixins import VisitScheduleModelMixin
22
22
  from edc_visit_schedule.site_visit_schedules import site_visit_schedules
23
23
  from edc_visit_schedule.subject_schedule import NotOnScheduleError
24
24
  from edc_visit_schedule.utils import is_baseline
25
- from .appointment_fields_model_mixin import AppointmentFieldsModelMixin
26
- from .appointment_methods_model_mixin import AppointmentMethodsModelMixin
27
- from .missed_appointment_model_mixin import MissedAppointmentModelMixin
28
- from .window_period_model_mixin import WindowPeriodModelMixin
25
+
29
26
  from ..constants import CANCELLED_APPT, IN_PROGRESS_APPT
30
27
  from ..exceptions import AppointmentDatetimeError, UnknownVisitCode
31
28
  from ..managers import AppointmentManager
32
29
  from ..utils import raise_on_appt_may_not_be_missed, update_appt_status
30
+ from .appointment_fields_model_mixin import AppointmentFieldsModelMixin
31
+ from .appointment_methods_model_mixin import AppointmentMethodsModelMixin
32
+ from .missed_appointment_model_mixin import MissedAppointmentModelMixin
33
+ from .window_period_model_mixin import WindowPeriodModelMixin
33
34
 
34
35
  if TYPE_CHECKING:
35
36
  from edc_visit_schedule.schedule import Schedule
@@ -138,16 +139,10 @@ class AppointmentModelMixin(
138
139
  )
139
140
 
140
141
  def validate_appt_datetime_not_after_next(self) -> None:
141
- if (
142
- self.appt_status != CANCELLED_APPT
143
- and self.appt_datetime
144
- and self.relative_next
145
- ):
142
+ if self.appt_status != CANCELLED_APPT and self.appt_datetime and self.relative_next:
146
143
  if self.appt_datetime >= self.relative_next.appt_datetime:
147
144
  appt_datetime = formatted_datetime(self.appt_datetime)
148
- next_appt_datetime = formatted_datetime(
149
- self.relative_next.appt_datetime
150
- )
145
+ next_appt_datetime = formatted_datetime(self.relative_next.appt_datetime)
151
146
  raise AppointmentDatetimeError(
152
147
  "Datetime cannot be on or after next appointment datetime. "
153
148
  f"Got {appt_datetime} >= {next_appt_datetime}. "
@@ -22,9 +22,7 @@ class NextAppointmentCrfModelMixin(models.Model):
22
22
  choices=YES_NO,
23
23
  default=NO,
24
24
  max_length=15,
25
- help_text=_(
26
- "If going off schedule today, additional CRFs will be added for today."
27
- ),
25
+ help_text=_("If going off schedule today, additional CRFs will be added for today."),
28
26
  )
29
27
 
30
28
  appt_date = models.DateField(
@@ -104,6 +104,4 @@ class NextAppointmentCrfModelAdminMixin(admin.ModelAdmin):
104
104
  )
105
105
 
106
106
  def get_default_info_source(self, request):
107
- return django_apps.get_model("edc_appointment.infosources").objects.get(
108
- name=PATIENT
109
- )
107
+ return django_apps.get_model("edc_appointment.infosources").objects.get(name=PATIENT)
@@ -110,11 +110,7 @@ class NextAppointmentCrfModelFormMixin:
110
110
  raise forms.ValidationError({self.appt_date_fld: str(e)})
111
111
  if not appointment:
112
112
  raise forms.ValidationError(
113
- {
114
- self.appt_date_fld: _(
115
- "Invalid. Must be within the followup period."
116
- )
117
- }
113
+ {self.appt_date_fld: _("Invalid. Must be within the followup period.")}
118
114
  )
119
115
 
120
116
  if (
@@ -26,9 +26,7 @@ from ..utils import (
26
26
  from .appointment import Appointment
27
27
 
28
28
 
29
- @receiver(
30
- post_save, sender=Appointment, weak=False, dispatch_uid="appointment_post_save"
31
- )
29
+ @receiver(post_save, sender=Appointment, weak=False, dispatch_uid="appointment_post_save")
32
30
  def appointment_post_save(sender, instance, raw, update_fields, **kwargs):
33
31
  if not raw and not update_fields:
34
32
  # use the AppointmentStatusUpdater to set all
@@ -68,9 +66,7 @@ def create_appointments_on_post_save(sender, instance, raw, created, using, **kw
68
66
  raise
69
67
 
70
68
 
71
- @receiver(
72
- post_save, weak=False, dispatch_uid="update_appt_status_on_related_visit_post_save"
73
- )
69
+ @receiver(post_save, weak=False, dispatch_uid="update_appt_status_on_related_visit_post_save")
74
70
  def update_appt_status_on_related_visit_post_save(
75
71
  sender, instance, created, raw, update_fields, **kwargs
76
72
  ):
@@ -144,11 +140,7 @@ def appointments_on_pre_delete(sender, instance, using, **kwargs):
144
140
  f"first."
145
141
  )
146
142
  else:
147
- if (
148
- onschedule_datetime
149
- <= instance.appt_datetime
150
- <= offschedule_datetime
151
- ):
143
+ if onschedule_datetime <= instance.appt_datetime <= offschedule_datetime:
152
144
  raise AppointmentDeleteError(
153
145
  f"Appointment may not be deleted. "
154
146
  f"Subject {instance.subject_identifier} is on schedule "
@@ -184,9 +176,7 @@ def appointments_on_post_delete(sender, instance, using, **kwargs):
184
176
  weak=False,
185
177
  dispatch_uid="update_appointments_to_next_on_post_save",
186
178
  )
187
- def update_appointments_to_next_on_post_save(
188
- sender, instance, raw, created, using, **kwargs
189
- ):
179
+ def update_appointments_to_next_on_post_save(sender, instance, raw, created, using, **kwargs):
190
180
  if not raw and not kwargs.get("update_fields"):
191
181
  if get_allow_skipped_appt_using().get(instance._meta.label_lower):
192
182
  skip_appt = SkipAppointments(instance)
@@ -199,9 +189,7 @@ def update_appointments_to_next_on_post_save(
199
189
  )
200
190
 
201
191
 
202
- @receiver(
203
- post_delete, weak=False, dispatch_uid="update_appointments_to_next_on_post_delete"
204
- )
192
+ @receiver(post_delete, weak=False, dispatch_uid="update_appointments_to_next_on_post_delete")
205
193
  def update_appointments_to_next_on_post_delete(sender, instance, using, **kwargs):
206
194
  if get_allow_skipped_appt_using().get(instance._meta.label_lower):
207
195
  SkipAppointments(instance).reset_appointments()
edc_appointment/utils.py CHANGED
@@ -291,9 +291,7 @@ def reset_visit_code_sequence_or_pass(
291
291
  f"{subject_identifier} {visit_code}: {actual=} {expected=} ...\n"
292
292
  )
293
293
  # reset visit code sequence for this visit code
294
- get_crf_metadata_model_cls().objects.filter(
295
- visit_code_sequence__gt=0, **opts
296
- ).delete()
294
+ get_crf_metadata_model_cls().objects.filter(visit_code_sequence__gt=0, **opts).delete()
297
295
  get_requisition_metadata_model_cls().objects.filter(
298
296
  visit_code_sequence__gt=0, **opts
299
297
  ).delete()
@@ -309,9 +307,7 @@ def reset_visit_code_sequence_or_pass(
309
307
  obj.save_base(update_fields=["visit_code_sequence"])
310
308
  if getattr(obj, "related_visit", None):
311
309
  obj.related_visit.visit_code_sequence = obj.visit_code_sequence
312
- obj.related_visit.save_base(
313
- update_fields=["visit_code_sequence"]
314
- )
310
+ obj.related_visit.save_base(update_fields=["visit_code_sequence"])
315
311
  obj.related_visit.metadata_create()
316
312
 
317
313
  # reset sequence order by appt_datetime
@@ -325,9 +321,7 @@ def reset_visit_code_sequence_or_pass(
325
321
  obj.save_base(update_fields=["visit_code_sequence"])
326
322
  if getattr(obj, "related_visit", None):
327
323
  obj.related_visit.visit_code_sequence = index
328
- obj.related_visit.save_base(
329
- update_fields=["visit_code_sequence"]
330
- )
324
+ obj.related_visit.save_base(update_fields=["visit_code_sequence"])
331
325
  obj.related_visit.metadata_create()
332
326
 
333
327
  except IntegrityError:
@@ -385,10 +379,7 @@ def update_appt_status(appointment: Appointment, save: bool | None = None):
385
379
  relative to the visit tracking model and CRFs and
386
380
  requisitions
387
381
  """
388
- if (
389
- appointment.appt_status == CANCELLED_APPT
390
- or appointment.appt_status == SKIPPED_APPT
391
- ):
382
+ if appointment.appt_status == CANCELLED_APPT or appointment.appt_status == SKIPPED_APPT:
392
383
  pass
393
384
  elif not appointment.related_visit:
394
385
  appointment.appt_status = NEW_APPT
@@ -451,9 +442,7 @@ def get_previous_appointment(
451
442
  return previous_appt
452
443
 
453
444
 
454
- def get_next_appointment(
455
- appointment: Appointment, include_interim=None
456
- ) -> Appointment | None:
445
+ def get_next_appointment(appointment: Appointment, include_interim=None) -> Appointment | None:
457
446
  """Returns the next appointment model instance,
458
447
  or None, in this schedule.
459
448
 
@@ -511,9 +500,7 @@ def raise_on_appt_datetime_not_in_window(
511
500
  appt_datetime: datetime | None = None,
512
501
  baseline_timepoint_datetime: datetime | None = None,
513
502
  ) -> None:
514
- if appointment.appt_status != CANCELLED_APPT and not is_baseline(
515
- instance=appointment
516
- ):
503
+ if appointment.appt_status != CANCELLED_APPT and not is_baseline(instance=appointment):
517
504
  baseline_timepoint_datetime = baseline_timepoint_datetime or (
518
505
  appointment.__class__.objects.first_appointment(
519
506
  subject_identifier=appointment.subject_identifier,
@@ -555,9 +542,7 @@ def get_window_gap_days(appointment) -> int:
555
542
  return gap_days
556
543
 
557
544
 
558
- def appt_datetime_in_gap(
559
- appointment: Appointment, suggested_appt_datetime: datetime
560
- ) -> bool:
545
+ def appt_datetime_in_gap(appointment: Appointment, suggested_appt_datetime: datetime) -> bool:
561
546
  """Return True if datetime falls in a gap between this and the
562
547
  next appointment window.
563
548
  """
@@ -575,8 +560,7 @@ def appt_datetime_in_gap(
575
560
  def get_max_window_gap_to_lower(appointment) -> int:
576
561
  if (
577
562
  appointment.visit.max_window_gap_to_lower is not None
578
- and appointment.visit.max_window_gap_to_lower
579
- < get_default_max_visit_window_gap()
563
+ and appointment.visit.max_window_gap_to_lower < get_default_max_visit_window_gap()
580
564
  ):
581
565
  max_gap = appointment.visit.max_window_gap_to_lower
582
566
  else:
@@ -759,18 +743,14 @@ def update_appt_status_for_timepoint(related_visit: RelatedVisitModel) -> None:
759
743
  if related_visit.appointment.appt_status == COMPLETE_APPT:
760
744
  if (
761
745
  related_visit.metadata[CRF].filter(entry_status=REQUIRED).exists()
762
- or related_visit.metadata[REQUISITION]
763
- .filter(entry_status=REQUIRED)
764
- .exists()
746
+ or related_visit.metadata[REQUISITION].filter(entry_status=REQUIRED).exists()
765
747
  ):
766
748
  related_visit.appointment.appt_status = INCOMPLETE_APPT
767
749
  related_visit.appointment.save_base(update_fields=["appt_status"])
768
750
  elif related_visit.appointment.appt_status == INCOMPLETE_APPT:
769
751
  if (
770
752
  not related_visit.metadata[CRF].filter(entry_status=REQUIRED).exists()
771
- and not related_visit.metadata[REQUISITION]
772
- .filter(entry_status=REQUIRED)
773
- .exists()
753
+ and not related_visit.metadata[REQUISITION].filter(entry_status=REQUIRED).exists()
774
754
  ):
775
755
  related_visit.appointment.appt_status = COMPLETE_APPT
776
756
  related_visit.appointment.save_base(update_fields=["appt_status"])
@@ -854,9 +834,7 @@ def validate_date_is_on_clinic_day(
854
834
  "mon": day_abbr[calendar.MONDAY],
855
835
  "fri": day_abbr[calendar.FRIDAY],
856
836
  "day": day_abbr[
857
- calendar.weekday(
858
- appt_date.year, appt_date.month, appt_date.day
859
- )
837
+ calendar.weekday(appt_date.year, appt_date.month, appt_date.day)
860
838
  ],
861
839
  }
862
840
  },
@@ -50,9 +50,7 @@ class AppointmentViewMixin:
50
50
  if self.appointment.related_visit:
51
51
  report_datetime = self.appointment.related_visit.report_datetime
52
52
  kwargs.update(report_datetime=report_datetime)
53
- has_call_manager = (
54
- True if django_apps.app_configs.get("edc_call_manager") else False
55
- )
53
+ has_call_manager = True if django_apps.app_configs.get("edc_call_manager") else False
56
54
  kwargs.update(
57
55
  appointment=self.appointment,
58
56
  appointments=self.appointments,
@@ -103,9 +101,7 @@ class AppointmentViewMixin:
103
101
  except ObjectDoesNotExist:
104
102
  if opts := self.appointment_options:
105
103
  try:
106
- self._appointment = self.appointment_model_cls.objects.get(
107
- **opts
108
- )
104
+ self._appointment = self.appointment_model_cls.objects.get(**opts)
109
105
  except ObjectDoesNotExist:
110
106
  pass
111
107
  return self._appointment
@@ -17,9 +17,7 @@ class SitesListFilter(SimpleListFilter):
17
17
  """Returns a queryset if the site name is in the list of sites"""
18
18
  qs = None
19
19
  if self.value():
20
- qs = get_user_model().objects.filter(
21
- userprofile__sites__name__in=[self.value()]
22
- )
20
+ qs = get_user_model().objects.filter(userprofile__sites__name__in=[self.value()])
23
21
  return qs
24
22
 
25
23
 
@@ -39,9 +37,7 @@ class CountriesListFilter(SimpleListFilter):
39
37
  if self.value():
40
38
  qs = (
41
39
  get_user_model()
42
- .objects.filter(
43
- userprofile__sites__siteprofile__country__in=[self.value()]
44
- )
40
+ .objects.filter(userprofile__sites__siteprofile__country__in=[self.value()])
45
41
  .distinct()
46
42
  )
47
43
  return qs
@@ -12,9 +12,7 @@ from ..models import Role
12
12
 
13
13
  @admin.register(Role, site=edc_auth_admin)
14
14
  class RoleAdmin(TemplatesModelAdminMixin, admin.ModelAdmin):
15
- fieldsets = (
16
- (None, ({"fields": ("display_name", "name", "display_index", "groups")})),
17
- )
15
+ fieldsets = ((None, ({"fields": ("display_name", "name", "display_index", "groups")})),)
18
16
 
19
17
  list_display_links: Tuple[str, ...] = ("display_name", "group_list")
20
18
 
@@ -23,9 +23,7 @@ def send_new_credentials_to_user_action(modeladmin, request, queryset): # noqa
23
23
  messages.error(request, "You do not have permissions to run this action.")
24
24
 
25
25
 
26
- send_new_credentials_to_user_action.short_description = (
27
- "Reset password and email to user"
28
- )
26
+ send_new_credentials_to_user_action.short_description = "Reset password and email to user"
29
27
 
30
28
 
31
29
  @admin.register(User, site=edc_auth_admin)
@@ -85,12 +83,8 @@ class UserAdmin(TemplatesModelAdminMixin, BaseUserAdmin):
85
83
  role_group_names = []
86
84
  for role in obj.userprofile.roles.all():
87
85
  roles.append(role)
88
- role_group_names.extend(
89
- [grp.name for grp in role.groups.all().order_by("name")]
90
- )
91
- extra_groups = [
92
- obj for obj in obj.groups.all() if obj.name not in role_group_names
93
- ]
86
+ role_group_names.extend([grp.name for grp in role.groups.all().order_by("name")])
87
+ extra_groups = [obj for obj in obj.groups.all() if obj.name not in role_group_names]
94
88
  context = dict(
95
89
  role_names=[role.display_name for role in roles],
96
90
  extra_group_names=[grp.name.replace("_", " ") for grp in extra_groups],
@@ -101,9 +95,7 @@ class UserAdmin(TemplatesModelAdminMixin, BaseUserAdmin):
101
95
  @admin.display(description="Sites")
102
96
  def sites(self, obj=None) -> str:
103
97
  country_sites = {}
104
- for site in obj.userprofile.sites.all().order_by(
105
- "siteprofile__country", "name"
106
- ):
98
+ for site in obj.userprofile.sites.all().order_by("siteprofile__country", "name"):
107
99
  country_name = site.siteprofile.country.replace("_", " ").title()
108
100
  site_name = site.name.replace("_", " ").title()
109
101
  try:
@@ -50,12 +50,9 @@ class UserProfileAdmin(TemplatesModelAdminMixin, admin.ModelAdmin):
50
50
  @staticmethod
51
51
  def user_email_notifications(obj=None):
52
52
  display_names = [
53
- o.display_name
54
- for o in obj.email_notifications.all().order_by("display_name")
53
+ o.display_name for o in obj.email_notifications.all().order_by("display_name")
55
54
  ]
56
- return format_html(
57
- "{}", mark_safe("<BR>".join(display_names))
58
- ) # nosec B703 B308
55
+ return format_html("{}", mark_safe("<BR>".join(display_names))) # nosec B703 B308
59
56
 
60
57
  @staticmethod
61
58
  def user_sms_notifications(obj=None):
@@ -46,9 +46,7 @@ class AuthUpdater:
46
46
  self.verbose = verbose
47
47
  self.apps = apps
48
48
  if self.verbose:
49
- sys.stdout.write(
50
- style.MIGRATE_HEADING("Updating groups and permissions:\n")
51
- )
49
+ sys.stdout.write(style.MIGRATE_HEADING("Updating groups and permissions:\n"))
52
50
  self.group_updater = self.group_updater_cls(
53
51
  groups=groups,
54
52
  pii_models=pii_models,
edc_auth/forms.py CHANGED
@@ -41,9 +41,7 @@ class UserProfileForm(forms.ModelForm):
41
41
  codenames = get_codenames_for_user(
42
42
  user=self.cleaned_data.get("user"), roles=self.cleaned_data.get("roles")
43
43
  )
44
- if c := [
45
- c for c in codenames if "add_" in c or "change_" in c or "delete_" in c
46
- ]:
44
+ if c := [c for c in codenames if "add_" in c or "change_" in c or "delete_" in c]:
47
45
  raise forms.ValidationError(
48
46
  {
49
47
  "is_multisite_viewer": (
@@ -5,9 +5,7 @@ from django.apps import apps as django_apps
5
5
 
6
6
  def get_models(app_config, exclude_models: list[str] | None):
7
7
  exclude_models = exclude_models or []
8
- return [
9
- m for m in app_config.get_models() if m._meta.label_lower not in exclude_models
10
- ]
8
+ return [m for m in app_config.get_models() if m._meta.label_lower not in exclude_models]
11
9
 
12
10
 
13
11
  def get_app_codenames(
edc_auth/import_users.py CHANGED
@@ -111,9 +111,7 @@ def import_users(
111
111
  opts.update(email=csv_data.get("email"))
112
112
  opts.update(alternate_email=csv_data.get("alternate_email"))
113
113
  opts.update(job_title=csv_data.get("job_title"))
114
- opts.update(
115
- is_active=True if csv_data.get("is_active") == "True" else False
116
- )
114
+ opts.update(is_active=True if csv_data.get("is_active") == "True" else False)
117
115
  opts.update(is_staff=True if csv_data.get("is_staff") == "True" else False)
118
116
  UserImporter(
119
117
  resource_name=resource_name,
@@ -177,12 +175,8 @@ class UserImporter:
177
175
  self.resend_as_newly_created = resend_as_new
178
176
  self.test_email_address = test_email_address
179
177
  self.username = username or self.get_username()
180
- self.created_email_template = (
181
- created_email_template or self.created_email_template
182
- )
183
- self.updated_email_template = (
184
- updated_email_template or self.updated_email_template
185
- )
178
+ self.created_email_template = created_email_template or self.created_email_template
179
+ self.updated_email_template = updated_email_template or self.updated_email_template
186
180
  self.validate_username()
187
181
  if ACCOUNT_MANAGER_ROLE in role_names:
188
182
  site_names = [s.name for s in Site.objects.all()]
@@ -7,9 +7,7 @@ class Command(BaseCommand):
7
7
  help = "Export users to a CSV file in the current directory"
8
8
 
9
9
  def add_arguments(self, parser):
10
- parser.add_argument(
11
- "--csvfile", default=None, dest="csvfile", help="CSV filename"
12
- )
10
+ parser.add_argument("--csvfile", default=None, dest="csvfile", help="CSV filename")
13
11
 
14
12
  parser.add_argument(
15
13
  "--verbose",
@@ -33,6 +33,4 @@ class Command(BaseCommand):
33
33
  else:
34
34
  p = PasswordSetter(super_username=options["super_user"])
35
35
  p.reset_user(username=options["username"])
36
- sys.stdout.write(
37
- f"\nYour password has been reset and emailed to {user.email}\n"
38
- )
36
+ sys.stdout.write(f"\nYour password has been reset and emailed to {user.email}\n")
@@ -249,9 +249,7 @@ class Migration(migrations.Migration):
249
249
  help_text="e.g. +1234567890",
250
250
  max_length=25,
251
251
  null=True,
252
- validators=[
253
- django.core.validators.RegexValidator(regex="^\\+\\d+")
254
- ],
252
+ validators=[django.core.validators.RegexValidator(regex="^\\+\\d+")],
255
253
  ),
256
254
  ),
257
255
  (
@@ -453,9 +451,7 @@ class Migration(migrations.Migration):
453
451
  ),
454
452
  (
455
453
  "device_created",
456
- models.CharField(
457
- blank=True, max_length=10, verbose_name="Device created"
458
- ),
454
+ models.CharField(blank=True, max_length=10, verbose_name="Device created"),
459
455
  ),
460
456
  (
461
457
  "device_modified",
@@ -483,16 +479,12 @@ class Migration(migrations.Migration):
483
479
  migrations.AlterField(
484
480
  model_name="role",
485
481
  name="device_created",
486
- field=models.CharField(
487
- blank=True, max_length=10, verbose_name="Device created"
488
- ),
482
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device created"),
489
483
  ),
490
484
  migrations.AlterField(
491
485
  model_name="role",
492
486
  name="device_modified",
493
- field=models.CharField(
494
- blank=True, max_length=10, verbose_name="Device modified"
495
- ),
487
+ field=models.CharField(blank=True, max_length=10, verbose_name="Device modified"),
496
488
  ),
497
489
  migrations.AlterField(
498
490
  model_name="role",
@@ -13,9 +13,7 @@ class Migration(migrations.Migration):
13
13
  migrations.RemoveIndex(model_name="role", name="edc_auth_ro_id_587a9b_idx"),
14
14
  migrations.RemoveField(model_name="role", name="field_name"),
15
15
  migrations.RemoveField(model_name="role", name="version"),
16
- migrations.RenameField(
17
- model_name="role", old_name="name", new_name="display_name"
18
- ),
16
+ migrations.RenameField(model_name="role", old_name="name", new_name="display_name"),
19
17
  migrations.AddIndex(
20
18
  model_name="role",
21
19
  index=models.Index(