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
@@ -38,15 +38,11 @@ class CrfMetadataModelMixin(
38
38
 
39
39
  model = models.CharField(max_length=50)
40
40
 
41
- document_name = models.CharField(
42
- verbose_name=_("Document"), max_length=250, null=True
43
- )
41
+ document_name = models.CharField(verbose_name=_("Document"), max_length=250, null=True)
44
42
 
45
43
  show_order = models.IntegerField() # must always be provided!
46
44
 
47
- entry_status = models.CharField(
48
- max_length=25, choices=ENTRY_STATUS, default=REQUIRED
49
- )
45
+ entry_status = models.CharField(max_length=25, choices=ENTRY_STATUS, default=REQUIRED)
50
46
 
51
47
  due_datetime = models.DateTimeField(null=True, blank=True)
52
48
 
@@ -79,9 +79,7 @@ class NextFormGetter:
79
79
  appointment=self.appointment
80
80
  )
81
81
  else:
82
- self._getter = self.crf_metadata_getter_cls(
83
- appointment=self.appointment
84
- )
82
+ self._getter = self.crf_metadata_getter_cls(appointment=self.appointment)
85
83
  return self._getter
86
84
 
87
85
  @property
@@ -35,8 +35,9 @@ class RequisitionMetadataHandler(MetadataHandler):
35
35
  except IndexError as e:
36
36
  if self.related_visit.reason != MISSED_VISIT:
37
37
  raise MetadataHandlerError(
38
- "Model not found. Not in visit.all_requisitions. "
39
- f"Model {self.model}. Got {e}"
38
+ "Panel not found. Not in visit.all_requisitions. "
39
+ f"Panel `{self.panel}` at `{self.creator.related_visit.visit}`. "
40
+ f"Got {e}. Check your visit schedule."
40
41
  )
41
42
  else:
42
43
  metadata_obj = self.creator.create_requisition(requisition_object)
@@ -42,6 +42,4 @@ class RequisitionMetadataUpdater(MetadataUpdater):
42
42
  """Returns a dictionary of query options to filter for, or
43
43
  get, the SubjectRequisition model instance.
44
44
  """
45
- return dict(
46
- subject_visit_id=self.related_visit.id, panel__name=self.source_panel.name
47
- )
45
+ return dict(subject_visit_id=self.related_visit.id, panel__name=self.source_panel.name)
@@ -22,9 +22,7 @@ class UpdateMetadataOnScheduleChange:
22
22
  sys.stdout.write(style.SUCCESS("\n\nUpdate metadata.\n"))
23
23
  sys.stdout.write(style.SUCCESS(f"Field is '{self.fieldname}'.\n"))
24
24
  sys.stdout.write(
25
- style.SUCCESS(
26
- f"Old value='{self.old_value}', New value='{self.new_value}'.\n"
27
- )
25
+ style.SUCCESS(f"Old value='{self.old_value}', New value='{self.new_value}'.\n")
28
26
  )
29
27
  if self.dry_run:
30
28
  sys.stdout.write(
@@ -36,25 +34,20 @@ class UpdateMetadataOnScheduleChange:
36
34
  f"Old value='{self.old_value}', New value='{self.new_value}'.\n"
37
35
  )
38
36
  for name, model_cls in self.models.items():
39
- count = model_cls.objects.filter(
40
- **{self.fieldname: self.old_value}
41
- ).count()
42
- sys.stdout.write(
43
- f"{model_cls._meta.label_lower}. {count} records found.\n"
44
- )
37
+ count = model_cls.objects.filter(**{self.fieldname: self.old_value}).count()
38
+ sys.stdout.write(f"{model_cls._meta.label_lower}. {count} records found.\n")
45
39
  sys.stdout.write(
46
40
  style.ERROR(
47
- "No records have been updated. \n"
48
- "Set --dry-run=False to update.\n"
41
+ "No records have been updated. \n" "Set --dry-run=False to update.\n"
49
42
  )
50
43
  )
51
44
  else:
52
45
  sys.stdout.write(style.SUCCESS("Updating... \n"))
53
46
  for name, model_cls in self.models.items():
54
47
  sys.stdout.write(f"Updating {name} ...\r")
55
- updated = model_cls.objects.filter(
56
- **{self.fieldname: self.old_value}
57
- ).update(**{self.fieldname: self.new_value})
48
+ updated = model_cls.objects.filter(**{self.fieldname: self.old_value}).update(
49
+ **{self.fieldname: self.new_value}
50
+ )
58
51
  sys.stdout.write(f"Updated {name}. {updated} records. \n")
59
52
  sys.stdout.write(style.SUCCESS("Done. \n"))
60
53
 
@@ -12,9 +12,7 @@ class InitialsField(CharField):
12
12
  kwargs.setdefault("editable", True)
13
13
  kwargs.setdefault("verbose_name", _("Initials"))
14
14
  kwargs.setdefault("max_length", 3)
15
- kwargs.setdefault(
16
- "help_text", _("Type 2-3 letters, all in uppercase and no spaces")
17
- )
15
+ kwargs.setdefault("help_text", _("Type 2-3 letters, all in uppercase and no spaces"))
18
16
  CharField.__init__(self, *args, **kwargs)
19
17
 
20
18
  def get_internal_type(self):
@@ -3,9 +3,7 @@ from django.db.models import expressions
3
3
  from simple_history import signals
4
4
 
5
5
 
6
- @dispatch.receiver(
7
- signals.pre_create_historical_record, dispatch_uid="simple_history_refresh"
8
- )
6
+ @dispatch.receiver(signals.pre_create_historical_record, dispatch_uid="simple_history_refresh")
9
7
  def remove_f_expressions(sender, instance, history_instance, **kwargs) -> None:
10
8
  """Model with history manager fails to save if update contains
11
9
  an F() expression.
@@ -5,8 +5,6 @@ from django.core.checks import CheckMessage, Error
5
5
  def check_for_edc_model(app_configs, **kwargs) -> list[CheckMessage]:
6
6
  errors = []
7
7
  if not settings.USE_TZ:
8
- errors.append(
9
- Error("EDC requires settings.USE_TZ = True", id="settings.USE_TZ")
10
- )
8
+ errors.append(Error("EDC requires settings.USE_TZ = True", id="settings.USE_TZ"))
11
9
 
12
10
  return errors
@@ -14,9 +14,7 @@ dh_validator = RegexValidator(
14
14
 
15
15
  hm_validator = RegexValidator(
16
16
  r"^([0-9]{1,3}h([0-5]?[0-9]m)?)$",
17
- message=_(
18
- "Invalid format. Expected something like 1h20m, 11h5m, etc. No spaces allowed."
19
- ),
17
+ message=_("Invalid format. Expected something like 1h20m, 11h5m, etc. No spaces allowed."),
20
18
  )
21
19
 
22
20
  ymd_validator = RegexValidator(
@@ -106,6 +106,4 @@ class EdcAdminSite(DjangoAdminSite):
106
106
  **(extra_context or {}),
107
107
  }
108
108
  request.current_app = self.name
109
- return TemplateResponse(
110
- request, self.index_template or "admin/index.html", context
111
- )
109
+ return TemplateResponse(request, self.index_template or "admin/index.html", context)
@@ -6,9 +6,7 @@ from django.utils.translation import gettext_lazy as _
6
6
 
7
7
 
8
8
  class ModelAdminChangelistButtonMixin:
9
- changelist_model_button_template_name = (
10
- "edc_model_admin/changelist_model_button.html"
11
- )
9
+ changelist_model_button_template_name = "edc_model_admin/changelist_model_button.html"
12
10
 
13
11
  def button(
14
12
  self,
@@ -23,9 +21,7 @@ class ModelAdminChangelistButtonMixin:
23
21
  if namespace:
24
22
  url_name = f"{namespace}:{url_name}"
25
23
  url = reverse(url_name, args=reverse_args)
26
- return self.button_template(
27
- label=label, url=url, disabled=disabled, title=title
28
- )
24
+ return self.button_template(label=label, url=url, disabled=disabled, title=title)
29
25
 
30
26
  def change_button(
31
27
  self,
@@ -40,9 +36,7 @@ class ModelAdminChangelistButtonMixin:
40
36
  if namespace:
41
37
  url_name = f"{namespace}:{url_name}"
42
38
  url = reverse(url_name, args=reverse_args)
43
- return self.button_template(
44
- label=label, url=url, disabled=disabled, title=title
45
- )
39
+ return self.button_template(label=label, url=url, disabled=disabled, title=title)
46
40
 
47
41
  def add_button(
48
42
  self,
@@ -57,9 +51,7 @@ class ModelAdminChangelistButtonMixin:
57
51
  if namespace:
58
52
  url_name = f"{namespace}:{url_name}"
59
53
  url = reverse(url_name) + "" if querystring is None else querystring
60
- return self.button_template(
61
- label=label, url=url, disabled=disabled, title=title
62
- )
54
+ return self.button_template(label=label, url=url, disabled=disabled, title=title)
63
55
 
64
56
  def button_template(
65
57
  self,
@@ -93,9 +93,7 @@ class ChangelistButtonModelAdminMixin(ModelAdminChangelistButtonMixin):
93
93
  if querystring_value:
94
94
  querystring = f"?q={querystring_value}"
95
95
  url = reverse(f"{namespace}:{app_label}_{model_name}_changelist") + querystring
96
- return self.button_template(
97
- label=label, disabled=disabled, title=title, url=url
98
- )
96
+ return self.button_template(label=label, disabled=disabled, title=title, url=url)
99
97
 
100
98
  def disabled_button(self, label):
101
99
  return self.button_template(label=label, disabled="disabled", url="#")
@@ -32,8 +32,6 @@ class ModelAdminCrfDashboardMixin(
32
32
  except ObjectDoesNotExist:
33
33
  report_datetime = None
34
34
  else:
35
- report_datetime = getattr(
36
- related_visit, self.report_datetime_field_attr, None
37
- )
35
+ report_datetime = getattr(related_visit, self.report_datetime_field_attr, None)
38
36
  initial_data.update(report_datetime=report_datetime)
39
37
  return initial_data
@@ -29,9 +29,7 @@ class ModelAdminDashboardMixin:
29
29
  kwargs=self.get_subject_dashboard_url_kwargs(obj),
30
30
  )
31
31
  context = dict(title=_("Go to subject's dashboard"), url=url, label=label)
32
- return render_to_string(
33
- "edc_subject_dashboard/dashboard_button.html", context=context
34
- )
32
+ return render_to_string("edc_subject_dashboard/dashboard_button.html", context=context)
35
33
 
36
34
  def get_screening_listboard_url_name(self) -> str:
37
35
  return url_names.get(self.screening_listboard_url_name)
@@ -9,14 +9,10 @@ class BaseModelAdminRedirectMixin:
9
9
  def redirect_url(self, request, obj, post_url_continue=None) -> Optional[str]:
10
10
  pass
11
11
 
12
- def redirect_url_on_add(
13
- self, request, obj, post_url_continue=None
14
- ) -> Optional[str]:
12
+ def redirect_url_on_add(self, request, obj, post_url_continue=None) -> Optional[str]:
15
13
  return self.redirect_url(request, obj, post_url_continue=post_url_continue)
16
14
 
17
- def redirect_url_on_change(
18
- self, request, obj, post_url_continue=None
19
- ) -> Optional[str]:
15
+ def redirect_url_on_change(self, request, obj, post_url_continue=None) -> Optional[str]:
20
16
  return self.redirect_url(request, obj, post_url_continue=post_url_continue)
21
17
 
22
18
  def redirect_url_on_delete(self, request, obj_display, obj_id) -> Optional[str]:
@@ -40,9 +40,7 @@ class LimitedAdminInlineMixin:
40
40
  formset.form.base_fields[field].queryset = qs
41
41
 
42
42
  def get_formset(self, request, obj=None, **kwargs):
43
- formset = super(LimitedAdminInlineMixin, self).get_formset(
44
- request, obj, **kwargs
45
- )
43
+ formset = super(LimitedAdminInlineMixin, self).get_formset(request, obj, **kwargs)
46
44
 
47
45
  for field, filters in self.get_filters(obj):
48
46
  if obj:
@@ -38,9 +38,7 @@ class ModelAdminBypassDefaultFormClsMixin:
38
38
  """
39
39
 
40
40
  # if custom_form_codename is None, this mixin does nothing
41
- custom_form_codename: str | None = (
42
- None # "e.g. edc_data_manager.special_bypassmodelform"
43
- )
41
+ custom_form_codename: str | None = None # "e.g. edc_data_manager.special_bypassmodelform"
44
42
 
45
43
  def custom_modelform_factory(self):
46
44
  """Returns a basic modelform (with no validation checks)"""
@@ -64,9 +62,7 @@ class ModelAdminBypassDefaultFormClsMixin:
64
62
  permissions otherwise returns the Form class originally
65
63
  declared on this ModelAdmin class.
66
64
  """
67
- if self.custom_form_codename and request.user.has_perm(
68
- self.custom_form_codename
69
- ):
65
+ if self.custom_form_codename and request.user.has_perm(self.custom_form_codename):
70
66
  try:
71
67
  messages.add_message(
72
68
  request,
@@ -126,9 +122,7 @@ class ModelAdminBypassDefaultFormClsMixin:
126
122
  exclude = exclude or None
127
123
 
128
124
  # Remove declared form fields which are in readonly_fields.
129
- new_attrs = dict.fromkeys(
130
- f for f in readonly_fields if f in self.form.declared_fields
131
- )
125
+ new_attrs = dict.fromkeys(f for f in readonly_fields if f in self.form.declared_fields)
132
126
  form = type(form_cls.__name__, (form_cls,), new_attrs)
133
127
 
134
128
  defaults = {
@@ -139,9 +133,7 @@ class ModelAdminBypassDefaultFormClsMixin:
139
133
  **kwargs,
140
134
  }
141
135
 
142
- if defaults["fields"] is None and not modelform_defines_fields(
143
- defaults["form"]
144
- ):
136
+ if defaults["fields"] is None and not modelform_defines_fields(defaults["form"]):
145
137
  defaults["fields"] = forms.ALL_FIELDS
146
138
 
147
139
  try:
@@ -25,15 +25,11 @@ class ModelAdminFormAutoNumberMixin:
25
25
  widget = 1
26
26
  start = getattr(form, "AUTO_NUMBER_START", 1)
27
27
  base_fields = {
28
- k: v
29
- for k, v in form.base_fields.items()
30
- if k not in self.skip_auto_numbering
28
+ k: v for k, v in form.base_fields.items() if k not in self.skip_auto_numbering
31
29
  }
32
30
  for index, fld in enumerate(base_fields.items(), start=start):
33
31
  label = str(fld[widget].label)
34
- if not re.match(r"^\d+\.", label) and not re.match(
35
- r"\<a\ title\=\"", label
36
- ):
32
+ if not re.match(r"^\d+\.", label) and not re.match(r"\<a\ title\=\"", label):
37
33
  fld[widget].original_label = copy(label)
38
34
  fld[widget].label = format_html(
39
35
  '<a title="{}">{}</a>. {}',
@@ -65,15 +65,11 @@ class ModelAdminFormInstructionsMixin:
65
65
  )
66
66
  return extra_context
67
67
 
68
- def add_view(
69
- self, request: WSGIRequest, form_url: str = "", extra_context: dict = None
70
- ):
68
+ def add_view(self, request: WSGIRequest, form_url: str = "", extra_context: dict = None):
71
69
  extra_context = self.get_add_instructions(extra_context, request=request)
72
70
  return super().add_view(request, form_url=form_url, extra_context=extra_context)
73
71
 
74
- def change_view(
75
- self, request: WSGIRequest, object_id, form_url="", extra_context=None
76
- ):
72
+ def change_view(self, request: WSGIRequest, object_id, form_url="", extra_context=None):
77
73
  extra_context = self.get_change_instructions(extra_context, request=request)
78
74
  return super().change_view(
79
75
  request, object_id, form_url=form_url, extra_context=extra_context
@@ -57,16 +57,12 @@ class ModelAdminNextUrlRedirectMixin(BaseModelAdminRedirectMixin):
57
57
  extra_context = self.extra_context(extra_context)
58
58
  return super().add_view(request, form_url=form_url, extra_context=extra_context)
59
59
 
60
- def change_view(
61
- self, request: WSGIRequest, object_id, form_url="", extra_context=None
62
- ):
60
+ def change_view(self, request: WSGIRequest, object_id, form_url="", extra_context=None):
63
61
  """Redirect before save on "cancel", otherwise return
64
62
  normal behavior.
65
63
  """
66
64
  if self.show_cancel and request.POST.get("_cancel"):
67
- redirect_url = self.get_next_redirect_url(
68
- request=request, object_id=object_id
69
- )
65
+ redirect_url = self.get_next_redirect_url(request=request, object_id=object_id)
70
66
  return HttpResponseRedirect(redirect_url)
71
67
  extra_context = self.extra_context(extra_context)
72
68
  return super().change_view(
@@ -155,9 +151,7 @@ class ModelAdminNextUrlRedirectMixin(BaseModelAdminRedirectMixin):
155
151
  redirect_url = reverse(f"{url_name}_change", args=(next_obj.id,))
156
152
  next_querystring = request.GET.get(self.next_querystring_attr)
157
153
  querystring_opts = self.get_next_options(request=request)
158
- querystring_opts.update(
159
- {obj.related_visit_model_attr(): str(obj.related_visit.id)}
160
- )
154
+ querystring_opts.update({obj.related_visit_model_attr(): str(obj.related_visit.id)})
161
155
  if panel_name:
162
156
  panel_model_cls = django_apps.get_model("edc_lab.panel")
163
157
  panel = panel_model_cls.objects.get(name=panel_name)
@@ -36,9 +36,7 @@ class ModelAdminProtectPiiMixin:
36
36
  list_display = super().get_list_display(request)
37
37
  if not request.user.groups.filter(name__in=[PII, PII_VIEW]).exists():
38
38
  # TODO: search replace from list_display if extra_pii_attr has tuple
39
- list_display = [
40
- f for f in list_display if f not in self.get_encrypted_fields()
41
- ]
39
+ list_display = [f for f in list_display if f not in self.get_encrypted_fields()]
42
40
  list_display = tuple(list_display)
43
41
  return list_display
44
42
 
@@ -29,9 +29,7 @@ class ModelAdminRedirectAllToChangelistMixin:
29
29
 
30
30
  def redirect_url(self, request, obj, post_url_continue=None) -> str | None:
31
31
  if request.GET.dict().get(self.next_querystring_attr):
32
- return super().redirect_url(
33
- request, obj, post_url_continue=post_url_continue
34
- )
32
+ return super().redirect_url(request, obj, post_url_continue=post_url_continue)
35
33
  return self.response_post_save_change(request, obj)
36
34
 
37
35
  def response_post_save_change(self, request, obj):
@@ -54,9 +52,7 @@ class ModelAdminRedirectAllToChangelistMixin:
54
52
  def add_view(self, request, form_url="", extra_context=None):
55
53
  q = get_value_from_lookup_string(
56
54
  self.add_search_field_name, request=request
57
- ) or get_value_from_lookup_string(
58
- self.change_search_field_name, request=request
59
- )
55
+ ) or get_value_from_lookup_string(self.change_search_field_name, request=request)
60
56
  extra_context = extra_context or {}
61
57
  extra_context.update(
62
58
  cancel_url=self.get_changelist_url(request),
@@ -33,9 +33,7 @@ class ModelAdminRedirectOnDeleteMixin:
33
33
  def get_post_url_on_delete(self, request, obj) -> str | None:
34
34
  """Returns a url for the redirect after delete."""
35
35
  post_url_on_delete = None
36
- querystring = urlencode(
37
- self.post_url_on_delete_querystring_kwargs(request, obj)
38
- )
36
+ querystring = urlencode(self.post_url_on_delete_querystring_kwargs(request, obj))
39
37
  if self.get_post_full_url_on_delete(request):
40
38
  post_url_on_delete = reverse(self.get_post_full_url_on_delete(request))
41
39
  else:
@@ -103,9 +103,7 @@ def edc_submit_row(
103
103
  See also ModelAdminRedirectAllToChangelistMixin
104
104
  """
105
105
  request: WSGIRequest = get_request_object(context)
106
- model_site_id: int | None = getattr(
107
- getattr(context["original"], "site", None), "id", None
108
- )
106
+ model_site_id: int | None = getattr(getattr(context["original"], "site", None), "id", None)
109
107
  if model_site_id and request.site.id != model_site_id:
110
108
  context["has_add_permission"] = False
111
109
  context["has_change_permission"] = False
@@ -150,9 +148,7 @@ def instructions(context):
150
148
  return {"instructions": context.get("instructions")}
151
149
 
152
150
 
153
- @register.inclusion_tag(
154
- "edc_model_admin/edc_additional_instructions.html", takes_context=True
155
- )
151
+ @register.inclusion_tag("edc_model_admin/edc_additional_instructions.html", takes_context=True)
156
152
  def additional_instructions(context):
157
153
  return {
158
154
  "additional_instructions": context.get("additional_instructions"),
@@ -180,9 +176,7 @@ def yes_no_coloring(value) -> dict:
180
176
  return context
181
177
 
182
178
 
183
- @register.inclusion_tag(
184
- "edc_model_admin/navbar_for_admin_templates.html", takes_context=True
185
- )
179
+ @register.inclusion_tag("edc_model_admin/navbar_for_admin_templates.html", takes_context=True)
186
180
  def show_navbar_for_admin_templates(context):
187
181
  return context
188
182
 
@@ -13,9 +13,7 @@ class InitialsField(CharField):
13
13
  kwargs.setdefault("editable", True)
14
14
  kwargs.setdefault("verbose_name", _("Initials"))
15
15
  kwargs.setdefault("max_length", 3)
16
- kwargs.setdefault(
17
- "help_text", _("Type 2-3 letters, all in uppercase and no spaces")
18
- )
16
+ kwargs.setdefault("help_text", _("Type 2-3 letters, all in uppercase and no spaces"))
19
17
  CharField.__init__(self, *args, **kwargs)
20
18
 
21
19
  def get_internal_type(self):
@@ -32,9 +32,7 @@ class InlineModelFormMixin:
32
32
  field_values.append(self.data[inline_field])
33
33
  return field_values
34
34
 
35
- def unique_inline_values_or_raise(
36
- self, field=None, inline_model=None, field_label=None
37
- ):
35
+ def unique_inline_values_or_raise(self, field=None, inline_model=None, field_label=None):
38
36
  self.field_exists_or_raise(field, inline_model)
39
37
  inline_set = f"{inline_model.split('.')[1]}_set"
40
38
  items = self.get_inline_field_values(field=field, inline_set=inline_set)
@@ -44,9 +42,7 @@ class InlineModelFormMixin:
44
42
  f"{field_label}: The list of values below must be unique"
45
43
  )
46
44
 
47
- def dates_not_after_report_datetime(
48
- self, field=None, inline_model=None, field_label=None
49
- ):
45
+ def dates_not_after_report_datetime(self, field=None, inline_model=None, field_label=None):
50
46
  self.field_cls_is_date_or_raise(field=field, inline_model=inline_model)
51
47
  inline_set = f"{inline_model.split('.')[1]}_set"
52
48
  dates_as_str = self.get_inline_field_values(field=field, inline_set=inline_set)
@@ -59,9 +55,9 @@ class InlineModelFormMixin:
59
55
  f"{field_label}: Invalid date or date format. Got {dte_as_str}"
60
56
  )
61
57
  else:
62
- if dte.astimezone(
63
- ZoneInfo(settings.TIME_ZONE)
64
- ) > self.cleaned_data.get("report_datetime"):
58
+ if dte.astimezone(ZoneInfo(settings.TIME_ZONE)) > self.cleaned_data.get(
59
+ "report_datetime"
60
+ ):
65
61
  raise forms.ValidationError(
66
62
  f"{field_label}: Date cannot be after report date/time. "
67
63
  f"Got `{dte_as_str}`."
@@ -87,9 +87,7 @@ class ModelToDataframe:
87
87
  self._encrypted_columns = None
88
88
  self._site_columns = None
89
89
  self._dataframe = pd.DataFrame()
90
- self.read_frame_verbose = (
91
- False if read_frame_verbose is None else read_frame_verbose
92
- )
90
+ self.read_frame_verbose = False if read_frame_verbose is None else read_frame_verbose
93
91
  self.sites = sites
94
92
  self.drop_sys_columns = True if drop_sys_columns is None else drop_sys_columns
95
93
  self.drop_action_item_columns = (
@@ -159,12 +157,8 @@ class ModelToDataframe:
159
157
 
160
158
  # remove timezone if asked
161
159
  if self.remove_timezone:
162
- for column in list(
163
- dataframe.select_dtypes(include=["datetimetz"]).columns
164
- ):
165
- dataframe[column] = pd.to_datetime(
166
- dataframe[column]
167
- ).dt.tz_localize(None)
160
+ for column in list(dataframe.select_dtypes(include=["datetimetz"]).columns):
161
+ dataframe[column] = pd.to_datetime(dataframe[column]).dt.tz_localize(None)
168
162
 
169
163
  # convert bool to int64
170
164
  for column in list(dataframe.select_dtypes(include=["bool"]).columns):
@@ -178,9 +172,7 @@ class ModelToDataframe:
178
172
  dataframe[column] = dataframe[column].astype(str)
179
173
 
180
174
  # convert timedeltas to secs
181
- for column in list(
182
- dataframe.select_dtypes(include=["timedelta64"]).columns
183
- ):
175
+ for column in list(dataframe.select_dtypes(include=["timedelta64"]).columns):
184
176
  dataframe[column] = dataframe[column].dt.total_seconds()
185
177
 
186
178
  # fillna
@@ -239,9 +231,7 @@ class ModelToDataframe:
239
231
  .values("id", m2m_field_name)
240
232
  )
241
233
  df_m2m = df_m2m.groupby("id")[m2m_field_name].apply(",".join).reset_index()
242
- df_m2m = df_m2m.rename(
243
- columns={m2m_field_name: m2m_field_name.split("__")[0]}
244
- )
234
+ df_m2m = df_m2m.rename(columns={m2m_field_name: m2m_field_name.split("__")[0]})
245
235
  dataframe = dataframe.merge(df_m2m, on="id", how="left")
246
236
  return dataframe
247
237
 
@@ -261,24 +251,17 @@ class ModelToDataframe:
261
251
 
262
252
  def move_sys_columns_to_end(self, columns: dict[str, str]) -> dict[str, str]:
263
253
  system_columns = [
264
- f.name
265
- for f in self.model_cls._meta.get_fields()
266
- if f.name in SYSTEM_COLUMNS
254
+ f.name for f in self.model_cls._meta.get_fields() if f.name in SYSTEM_COLUMNS
267
255
  ]
268
256
  new_columns = {k: v for k, v in columns.items() if k not in system_columns}
269
257
  if system_columns:
270
- if (
271
- len(new_columns.keys()) != len(columns.keys())
272
- and not self.drop_sys_columns
273
- ):
258
+ if len(new_columns.keys()) != len(columns.keys()) and not self.drop_sys_columns:
274
259
  new_columns.update({k: k for k in system_columns})
275
260
  return new_columns
276
261
 
277
262
  def move_action_item_columns(self, columns: dict[str, str]) -> dict[str, str]:
278
263
  action_item_columns = [
279
- f.name
280
- for f in self.model_cls._meta.get_fields()
281
- if f.name in ACTION_ITEM_COLUMNS
264
+ f.name for f in self.model_cls._meta.get_fields() if f.name in ACTION_ITEM_COLUMNS
282
265
  ]
283
266
  new_columns = {k: v for k, v in columns.items() if k not in ACTION_ITEM_COLUMNS}
284
267
  if action_item_columns:
@@ -322,9 +305,7 @@ class ModelToDataframe:
322
305
  columns = self.move_sys_columns_to_end(columns)
323
306
  # ensure no encrypted fields were added
324
307
  if not self.decrypt:
325
- columns = {
326
- k: v for k, v in columns.items() if k not in self.encrypted_columns
327
- }
308
+ columns = {k: v for k, v in columns.items() if k not in self.encrypted_columns}
328
309
  self._columns = columns
329
310
  return self._columns
330
311
 
@@ -342,9 +323,7 @@ class ModelToDataframe:
342
323
  except ValueError:
343
324
  pass
344
325
  if not self.decrypt:
345
- columns_list = [
346
- col for col in columns_list if col not in self.encrypted_columns
347
- ]
326
+ columns_list = [col for col in columns_list if col not in self.encrypted_columns]
348
327
  return columns_list
349
328
 
350
329
  @property
@@ -369,9 +348,7 @@ class ModelToDataframe:
369
348
  if (
370
349
  hasattr(fld_cls, "related_model")
371
350
  and fld_cls.related_model
372
- and issubclass(
373
- fld_cls.related_model, (ListModelMixin, ListUuidModelMixin)
374
- )
351
+ and issubclass(fld_cls.related_model, (ListModelMixin, ListUuidModelMixin))
375
352
  ):
376
353
  list_columns.append(fld_cls.attname)
377
354
  self._list_columns = list(set(list_columns))
@@ -417,9 +394,7 @@ class ModelToDataframe:
417
394
  def add_subject_identifier_column(self, columns: dict[str, str]) -> dict[str, str]:
418
395
  if "subject_identifier" not in [v for v in columns.values()]:
419
396
  subject_identifier_column = None
420
- id_columns = [
421
- col.replace("_id", "") for col in columns if col.endswith("_id")
422
- ]
397
+ id_columns = [col.replace("_id", "") for col in columns if col.endswith("_id")]
423
398
  for col in id_columns:
424
399
  field = getattr(self.model_cls, col, None)
425
400
  if field and [
@@ -439,13 +414,9 @@ class ModelToDataframe:
439
414
  ) -> dict[str, str]:
440
415
  if "subject_identifier" not in [v for v in columns.values()]:
441
416
  columns.update(
442
- {
443
- f"{column_name}__appointment__subject_identifier": "subject_identifier"
444
- }
417
+ {f"{column_name}__appointment__subject_identifier": "subject_identifier"}
445
418
  )
446
- columns.update(
447
- {f"{column_name}__appointment__appt_datetime": "appointment_datetime"}
448
- )
419
+ columns.update({f"{column_name}__appointment__appt_datetime": "appointment_datetime"})
449
420
  columns.update({f"{column_name}__appointment__visit_code": "visit_code"})
450
421
  columns.update(
451
422
  {f"{column_name}__appointment__visit_code_sequence": "visit_code_sequence"}
@@ -482,9 +453,7 @@ class ModelToDataframe:
482
453
  columns.update({f"{col_prefix}__name": f"{col_prefix}_name"})
483
454
  return columns
484
455
 
485
- def add_list_model_name_columns(
486
- self, columns: dict[str, str] = None
487
- ) -> dict[str, str]:
456
+ def add_list_model_name_columns(self, columns: dict[str, str] = None) -> dict[str, str]:
488
457
  for col in copy(columns):
489
458
  if col in self.list_columns:
490
459
  column_name = col.split("_id")[0]