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,9 +38,7 @@ class ManifestViewMixin(ContextMixin):
38
38
  self.original_manifest_identifier = escape(
39
39
  self.kwargs.get("manifest_identifier")
40
40
  ).strip()
41
- self._manifest_identifier = "".join(
42
- self.original_manifest_identifier.split("-")
43
- )
41
+ self._manifest_identifier = "".join(self.original_manifest_identifier.split("-"))
44
42
  return self._manifest_identifier
45
43
 
46
44
  @property
@@ -85,21 +83,15 @@ class ManifestViewMixin(ContextMixin):
85
83
  def get_manifest_item(self, position):
86
84
  """Returns a manifest item model instance for the given position."""
87
85
  try:
88
- manifest_item = ManifestItem.objects.get(
89
- manifest=self.manifest, position=position
90
- )
86
+ manifest_item = ManifestItem.objects.get(manifest=self.manifest, position=position)
91
87
  except ObjectDoesNotExist:
92
- messages.error(
93
- self.request, f"Invalid position for manifest. Got {position}"
94
- )
88
+ messages.error(self.request, f"Invalid position for manifest. Got {position}")
95
89
  return None
96
90
  return manifest_item
97
91
 
98
92
  def _clean_manifest_item_identifier(self):
99
93
  """Returns a valid identifier or raises."""
100
- manifest_item_identifier = "".join(
101
- self.original_manifest_item_identifier.split("-")
102
- )
94
+ manifest_item_identifier = "".join(self.original_manifest_item_identifier.split("-"))
103
95
  try:
104
96
  Box.objects.get(box_identifier=manifest_item_identifier)
105
97
  except ObjectDoesNotExist:
@@ -47,7 +47,5 @@ class ReceiveView(EdcViewMixin, ProcessRequisitionViewMixin, ActionView):
47
47
 
48
48
  def create_specimens(self):
49
49
  """Creates aliquots for each selected and received requisition."""
50
- for requisition in self.get_requisitions(
51
- pk__in=self.selected_items, received=True
52
- ):
50
+ for requisition in self.get_requisitions(pk__in=self.selected_items, received=True):
53
51
  self.specimen_cls(requisition=requisition)
@@ -42,9 +42,7 @@ class VerifyBoxItemView(EdcViewMixin, BoxViewMixin, ActionView):
42
42
  message = "Unable to verify. Box has already been shipped."
43
43
  messages.error(self.request, message)
44
44
  else:
45
- box_item_in_position = self.get_box_item(
46
- position=self.kwargs.get("position")
47
- )
45
+ box_item_in_position = self.get_box_item(position=self.kwargs.get("position"))
48
46
  self.redirect_querystring.update(alert=1)
49
47
  if box_item_in_position:
50
48
  if self.box_item:
@@ -11,9 +11,7 @@ class AliquotListboardViewFilters(ListboardViewFilters):
11
11
 
12
12
  is_primary = ListboardFilter(label="Primary", lookup={"is_primary": True})
13
13
 
14
- packed = ListboardFilter(
15
- label="Packed", lookup={"aliquot_identifier__in": get_box_items}
16
- )
14
+ packed = ListboardFilter(label="Packed", lookup={"aliquot_identifier__in": get_box_items})
17
15
 
18
16
  not_packed = ListboardFilter(
19
17
  label="Not Packed",
@@ -23,6 +21,4 @@ class AliquotListboardViewFilters(ListboardViewFilters):
23
21
 
24
22
  shipped = ListboardFilter(label="Shipped", lookup={"shipped": True})
25
23
 
26
- not_shipped = ListboardFilter(
27
- label="Not shipped", default=True, lookup={"shipped": False}
28
- )
24
+ not_shipped = ListboardFilter(label="Not shipped", default=True, lookup={"shipped": False})
@@ -10,6 +10,4 @@ class ManifestListboardViewFilters(ListboardViewFilters):
10
10
 
11
11
  printed = ListboardFilter(label="Printed", lookup={"printed": True})
12
12
 
13
- not_printed = ListboardFilter(
14
- label="Not printed", default=True, lookup={"printed": False}
15
- )
13
+ not_printed = ListboardFilter(label="Not printed", default=True, lookup={"printed": False})
@@ -16,8 +16,6 @@ class BaseBoxItemListboardView(BoxViewMixin, BaseListboardView):
16
16
  listboard_view_permission_codename = "edc_lab_dashboard.view_lab_box_listboard"
17
17
 
18
18
  def get_queryset_filter_options(self, request, *args, **kwargs) -> tuple[Q, dict]:
19
- q_object, options = super().get_queryset_filter_options(
20
- request, *args, **kwargs
21
- )
19
+ q_object, options = super().get_queryset_filter_options(request, *args, **kwargs)
22
20
  options.update({"box": self.box})
23
21
  return q_object, {"box": self.box}
@@ -42,7 +42,5 @@ class ManifestListboardView(BaseListboardView):
42
42
  )
43
43
 
44
44
  def print_manifest(self):
45
- manifest_report = ManifestPdfReport(
46
- manifest=self.manifest, user=self.request.user
47
- )
45
+ manifest_report = ManifestPdfReport(manifest=self.manifest, user=self.request.user)
48
46
  return manifest_report.render_to_response()
@@ -29,12 +29,8 @@ class ProcessListboardView(RequisitionListboardView):
29
29
  search_form_url = "process_listboard_url"
30
30
 
31
31
  def get_queryset_filter_options(self, request, *args, **kwargs) -> tuple[Q, dict]:
32
- q_object, options = super().get_queryset_filter_options(
33
- request, *args, **kwargs
34
- )
35
- options.update(
36
- is_drawn=YES, clinic_verified=YES, received=True, processed=False
37
- )
32
+ q_object, options = super().get_queryset_filter_options(request, *args, **kwargs)
33
+ options.update(is_drawn=YES, clinic_verified=YES, received=True, processed=False)
38
34
  return q_object, options
39
35
 
40
36
  def get_empty_queryset_message(self):
@@ -31,12 +31,8 @@ class ReceiveListboardView(RequisitionListboardView):
31
31
  search_form_url = "receive_listboard_url"
32
32
 
33
33
  def get_queryset_filter_options(self, request, *args, **kwargs) -> tuple[Q, dict]:
34
- q_object, options = super().get_queryset_filter_options(
35
- request, *args, **kwargs
36
- )
37
- options.update(
38
- is_drawn=YES, clinic_verified=YES, received=False, processed=False
39
- )
34
+ q_object, options = super().get_queryset_filter_options(request, *args, **kwargs)
35
+ options.update(is_drawn=YES, clinic_verified=YES, received=False, processed=False)
40
36
  return q_object, options
41
37
 
42
38
  def get_empty_queryset_message(self) -> str:
@@ -20,9 +20,7 @@ class RequisitionListboardView(BaseListboardView):
20
20
  listboard_template = "requisition_listboard_template"
21
21
  listboard_url = "requisition_listboard_url"
22
22
  listboard_view_filters = RequisitionListboardViewFilters()
23
- listboard_view_permission_codename = (
24
- "edc_lab_dashboard.view_lab_requisition_listboard"
25
- )
23
+ listboard_view_permission_codename = "edc_lab_dashboard.view_lab_requisition_listboard"
26
24
  listboard_view_only_my_permission_codename = None
27
25
  navbar_selected_item = "requisition"
28
26
  search_form_url = "requisition_listboard_url"
@@ -51,8 +49,6 @@ class RequisitionListboardView(BaseListboardView):
51
49
  return super().get_context_data(**kwargs)
52
50
 
53
51
  def get_queryset_filter_options(self, request, *args, **kwargs) -> tuple[Q, dict]:
54
- q_objects, options = super().get_queryset_filter_options(
55
- request, *args, **kwargs
56
- )
52
+ q_objects, options = super().get_queryset_filter_options(request, *args, **kwargs)
57
53
  options.update(is_drawn=YES)
58
54
  return Q(), options
@@ -36,9 +36,7 @@ class BaseResultsAction(Action):
36
36
 
37
37
  def get_next_actions(self):
38
38
  next_actions = []
39
- if self.is_reportable and not is_baseline(
40
- instance=self.reference_obj.related_visit
41
- ):
39
+ if self.is_reportable and not is_baseline(instance=self.reference_obj.related_visit):
42
40
  # AE for reportable result, though at baseline
43
41
  next_actions = [AE_INITIAL_ACTION]
44
42
  return next_actions
@@ -1,9 +1,9 @@
1
1
  from typing import Any
2
2
 
3
3
  from django import forms
4
- from edc_glucose.utils import validate_glucose_as_millimoles_per_liter
5
4
 
6
5
  from edc_constants.constants import FASTING, YES
6
+ from edc_glucose.utils import validate_glucose_as_millimoles_per_liter
7
7
 
8
8
 
9
9
  class BloodResultsFbgFormValidatorMixin:
@@ -23,6 +23,4 @@ class BloodResultsFbgFormValidatorMixin:
23
23
  return dict(fasting=fasting)
24
24
 
25
25
  def evaluate_value(self, prefix: str = None):
26
- validate_glucose_as_millimoles_per_liter(
27
- prefix=prefix, cleaned_data=self.cleaned_data
28
- )
26
+ validate_glucose_as_millimoles_per_liter(prefix=prefix, cleaned_data=self.cleaned_data)
@@ -88,9 +88,7 @@ class BloodResultsFormValidatorMixin(
88
88
  def fields_names_with_values(self: Any) -> list:
89
89
  """Returns a list result `value` fields that are not None"""
90
90
  fields_names_with_values = []
91
- field_names = [
92
- f"{utest_id}{self.value_field_suffix}" for utest_id in self.utest_ids
93
- ]
91
+ field_names = [f"{utest_id}{self.value_field_suffix}" for utest_id in self.utest_ids]
94
92
  for field_name in field_names:
95
93
  if self.cleaned_data.get(field_name):
96
94
  fields_names_with_values.append(field_name)
@@ -22,8 +22,8 @@ def get_summary(obj) -> tuple[list[str], list[str], list[str]]:
22
22
  if value := getattr(obj, field_name):
23
23
  opts.update(units=units, label=utest_id)
24
24
  try:
25
- grading_data, grading_eval_phrase = (
26
- reference_range_collection.get_grade(value, **opts)
25
+ grading_data, grading_eval_phrase = reference_range_collection.get_grade(
26
+ value, **opts
27
27
  )
28
28
  except NotEvaluated as e:
29
29
  errors.append(f"{e}.")
@@ -35,9 +35,7 @@ def get_summary(obj) -> tuple[list[str], list[str], list[str]]:
35
35
  in reference_range_collection.reportable_grades(utest_id)
36
36
  ):
37
37
  setattr(obj, f"{utest_id}_grade", grading_data.grade)
38
- setattr(
39
- obj, f"{utest_id}_grade_description", grading_data.description
40
- )
38
+ setattr(obj, f"{utest_id}_grade_description", grading_data.description)
41
39
  reportable.append(f"{grading_eval_phrase}")
42
40
  else:
43
41
  try:
@@ -0,0 +1,10 @@
1
+ from .field_attrs import get_field_attrs_for_reportable, get_field_attrs_for_utestid
2
+ from .reportable_result_model_mixin_factory import reportable_result_model_mixin_factory
3
+ from .result_model_mixin_factory import result_model_mixin_factory
4
+
5
+ __all__ = [
6
+ "reportable_result_model_mixin_factory",
7
+ "result_model_mixin_factory",
8
+ "get_field_attrs_for_utestid",
9
+ "get_field_attrs_for_reportable",
10
+ ]
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from __future__ import annotations
2
2
 
3
3
  from django.core.validators import MinValueValidator
4
4
  from django.db import models
@@ -12,13 +12,13 @@ from edc_reportable.choices import REPORTABLE
12
12
  def get_field_attrs_for_utestid(
13
13
  utest_id: str,
14
14
  units_choices: tuple,
15
- default_units: Optional[str] = None,
16
- verbose_name: Optional[str] = None,
17
- decimal_places: Optional[int] = None,
18
- max_digits: Optional[int] = None,
19
- validators: Optional[list] = None,
20
- quantifier: Optional[list] = None,
21
- help_text: Optional[list] = None,
15
+ default_units: str | None = None,
16
+ verbose_name: str | None = None,
17
+ decimal_places: int | None = None,
18
+ max_digits: int | None = None,
19
+ validators: list | None = None,
20
+ quantifier: list | None = None,
21
+ help_text: list | None = None,
22
22
  ) -> dict:
23
23
  """Returns a dictionary of field classes for the model"""
24
24
  value_options = dict(
@@ -4,6 +4,8 @@ from django.db import models
4
4
 
5
5
  from .field_attrs import get_field_attrs_for_reportable, get_field_attrs_for_utestid
6
6
 
7
+ __all__ = ["reportable_result_model_mixin_factory"]
8
+
7
9
 
8
10
  def reportable_result_model_mixin_factory(
9
11
  utest_id: str,
@@ -4,6 +4,8 @@ from django.db import models
4
4
 
5
5
  from .field_attrs import get_field_attrs_for_utestid
6
6
 
7
+ __all__ = ["result_model_mixin_factory"]
8
+
7
9
 
8
10
  def result_model_mixin_factory(
9
11
  utest_id: str,
@@ -16,15 +16,12 @@ class BloodResultsFieldsModelMixin(models.Model):
16
16
  choices=YES_NO,
17
17
  max_length=25,
18
18
  help_text=(
19
- "Abnormal results present at baseline or continuing from "
20
- "baseline not included."
19
+ "Abnormal results present at baseline or continuing from " "baseline not included."
21
20
  ),
22
21
  )
23
22
 
24
23
  results_reportable = models.CharField(
25
- verbose_name=(
26
- "If any results are abnormal, are results within grade 3 or above?"
27
- ),
24
+ verbose_name=("If any results are abnormal, are results within grade 3 or above?"),
28
25
  max_length=25,
29
26
  choices=YES_NO_NA,
30
27
  help_text=(
@@ -3,7 +3,7 @@ from django.db import models
3
3
  from edc_reportable import MILLIMOLES_PER_LITER_DISPLAY
4
4
  from edc_reportable.units import MILLIGRAMS_PER_DECILITER, MILLIMOLES_PER_LITER
5
5
 
6
- from ..model_mixin_factory import reportable_result_model_mixin_factory
6
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
7
7
 
8
8
 
9
9
  class MagnesiumModelMixin(
@@ -24,7 +24,7 @@ from edc_reportable.units import (
24
24
  TEN_X_9_PER_LITER,
25
25
  )
26
26
 
27
- from ..model_mixin_factory import reportable_result_model_mixin_factory
27
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
28
28
 
29
29
 
30
30
  class HaemoglobinModelMixin(
@@ -1,9 +1,9 @@
1
1
  from django.core.validators import MaxValueValidator, MinValueValidator
2
2
  from django.db import models
3
- from edc_glucose.constants import GLUCOSE_HIGH_READING
4
3
 
5
4
  from edc_constants.choices import FASTING_CHOICES, YES_NO
6
5
  from edc_constants.constants import FASTING
6
+ from edc_glucose.constants import GLUCOSE_HIGH_READING
7
7
  from edc_lab.choices import RESULT_QUANTIFIER
8
8
  from edc_lab.constants import EQ
9
9
  from edc_reportable import (
@@ -12,7 +12,7 @@ from edc_reportable import (
12
12
  MILLIMOLES_PER_LITER_DISPLAY,
13
13
  )
14
14
 
15
- from ..model_mixin_factory import reportable_result_model_mixin_factory
15
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
16
16
 
17
17
 
18
18
  class FbgModelMixin(
@@ -28,7 +28,10 @@ class FbgModelMixin(
28
28
  ),
29
29
  models.Model,
30
30
  ):
31
- """Impaired Fasting Glucose"""
31
+ """Impaired Fasting Glucose
32
+
33
+ See edc-glucose for a newer version of this mixin.
34
+ """
32
35
 
33
36
  is_poc = models.CharField(
34
37
  verbose_name="Was a point-of-care test used?",
@@ -2,10 +2,10 @@ from typing import Any
2
2
 
3
3
  from django.core.validators import MaxValueValidator, MinValueValidator
4
4
  from django.db import models
5
- from edc_glucose.constants import GLUCOSE_HIGH_READING
6
5
 
7
6
  from edc_constants.choices import FASTING_CHOICES, YES_NO
8
7
  from edc_constants.constants import FASTING
8
+ from edc_glucose.constants import GLUCOSE_HIGH_READING
9
9
  from edc_lab.choices import RESULT_QUANTIFIER
10
10
  from edc_lab.constants import EQ
11
11
  from edc_reportable import (
@@ -14,7 +14,7 @@ from edc_reportable import (
14
14
  MILLIMOLES_PER_LITER_DISPLAY,
15
15
  )
16
16
 
17
- from ..model_mixin_factory import reportable_result_model_mixin_factory
17
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
18
18
 
19
19
 
20
20
  class GlucoseModelMixin(
@@ -1,13 +1,11 @@
1
1
  from django.db import models
2
2
 
3
3
  from edc_constants.choices import YES_NO
4
- from edc_lab.choices import RESULT_QUANTIFIER
5
- from edc_lab.constants import EQ
6
- from edc_reportable import PERCENT
4
+ from edc_glucose.model_mixins import Hba1cModelMixin as BaseHba1cModelMixin
7
5
  from edc_reportable.choices import REPORTABLE
8
6
 
9
7
 
10
- class Hba1cModelMixin(models.Model):
8
+ class Hba1cModelMixin(BaseHba1cModelMixin, models.Model):
11
9
  is_poc = models.CharField(
12
10
  verbose_name="Was a point-of-care test used?",
13
11
  max_length=15,
@@ -15,30 +13,6 @@ class Hba1cModelMixin(models.Model):
15
13
  null=True,
16
14
  )
17
15
 
18
- hba1c_value = models.DecimalField(
19
- verbose_name="HbA1c value",
20
- max_digits=8,
21
- decimal_places=4,
22
- null=True,
23
- blank=True,
24
- )
25
-
26
- hba1c_quantifier = models.CharField(
27
- max_length=10,
28
- choices=RESULT_QUANTIFIER,
29
- default=EQ,
30
- null=True,
31
- blank=True,
32
- )
33
-
34
- hba1c_units = models.CharField(
35
- verbose_name="units",
36
- max_length=15,
37
- default=PERCENT,
38
- null=True,
39
- blank=True,
40
- )
41
-
42
16
  hba1c_abnormal = models.CharField(
43
17
  verbose_name="abnormal", choices=YES_NO, max_length=25, null=True, blank=True
44
18
  )
@@ -1,29 +1,23 @@
1
1
  from django.core.validators import MaxValueValidator, MinValueValidator
2
2
  from django.db import models
3
- from edc_glucose.model_mixin_factory import fasting_model_mixin_factory
4
3
 
5
4
  from edc_constants.choices import YES_NO
5
+ from edc_glucose.model_mixin_factories import fasting_model_mixin_factory
6
6
  from edc_reportable.units import MICRO_IU_MILLILITER, MICRO_IU_MILLILITER_DISPLAY
7
- from ..model_mixin_factory import reportable_result_model_mixin_factory
8
7
 
8
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
9
9
 
10
- class BaseInsulinModelMixin(
10
+
11
+ class InsulinModelMixin(
11
12
  reportable_result_model_mixin_factory(
12
13
  utest_id="ins",
13
14
  verbose_name="Insulin",
14
15
  units_choices=((MICRO_IU_MILLILITER, MICRO_IU_MILLILITER_DISPLAY),),
15
16
  validators=[MinValueValidator(0.0), MaxValueValidator(999.0)],
16
17
  ),
17
- models.Model,
18
- ):
19
- class Meta:
20
- abstract = True
21
-
22
-
23
- class InsulinModelMixin(
24
- BaseInsulinModelMixin,
25
18
  fasting_model_mixin_factory(
26
19
  None,
20
+ field_options={"fasting": dict(choices=YES_NO, default=None)},
27
21
  fasting=models.CharField(
28
22
  verbose_name="Has the participant fasted?",
29
23
  max_length=15,
@@ -10,7 +10,7 @@ from edc_reportable.units import (
10
10
  MILLIGRAMS_PER_LITER,
11
11
  )
12
12
 
13
- from ..model_mixin_factory import reportable_result_model_mixin_factory
13
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
14
14
 
15
15
 
16
16
  class AlbuminModelMixin(
@@ -3,7 +3,7 @@ from django.db import models
3
3
 
4
4
  from edc_reportable.units import MILLIMOLES_PER_LITER
5
5
 
6
- from ..model_mixin_factory import reportable_result_model_mixin_factory
6
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
7
7
 
8
8
 
9
9
  class CholModelMixin(
@@ -2,7 +2,7 @@ from django.db import models
2
2
 
3
3
  from edc_reportable.units import PLUS
4
4
 
5
- from ..model_mixin_factory import reportable_result_model_mixin_factory
5
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
6
6
 
7
7
 
8
8
  class ProteinuriaModelMixin(
@@ -8,7 +8,7 @@ from edc_reportable.units import (
8
8
  MILLIMOLES_PER_LITER_DISPLAY,
9
9
  )
10
10
 
11
- from ..model_mixin_factory import reportable_result_model_mixin_factory
11
+ from ..model_mixin_factories import reportable_result_model_mixin_factory
12
12
 
13
13
 
14
14
  class CreatinineModelMixin(
edc_label/apps.py CHANGED
@@ -34,8 +34,7 @@ class AppConfig(DjangoAppConfig):
34
34
  if not os.path.exists(label_template_folder):
35
35
  sys.stdout.write(
36
36
  style.ERROR(
37
- "Label template folder does not exist!\n"
38
- "Not loading label templates\n"
37
+ "Label template folder does not exist!\n" "Not loading label templates\n"
39
38
  )
40
39
  )
41
40
  else:
@@ -1,12 +1,12 @@
1
1
  # Generated by Django 3.2.7 on 2021-10-12 04:05
2
2
 
3
3
  import _socket
4
- from django.db import migrations, models
5
4
  import django_audit_fields.fields.hostname_modification_field
6
5
  import django_audit_fields.fields.userfield
7
6
  import django_audit_fields.fields.uuid_auto_field
8
7
  import django_audit_fields.models.audit_model_mixin
9
8
  import django_revision.revision_field
9
+ from django.db import migrations, models
10
10
 
11
11
 
12
12
  class Migration(migrations.Migration):
@@ -1,8 +1,8 @@
1
1
  # Generated by Django 4.2.4 on 2023-08-23 01:13
2
2
 
3
3
  import _socket
4
- from django.db import migrations, models
5
4
  import django_audit_fields.fields.hostname_modification_field
5
+ from django.db import migrations, models
6
6
 
7
7
 
8
8
  class Migration(migrations.Migration):
@@ -14,16 +14,12 @@ class Migration(migrations.Migration):
14
14
  migrations.AlterField(
15
15
  model_name="zpllabeltemplates",
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="zpllabeltemplates",
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="zpllabeltemplates",
@@ -0,0 +1,29 @@
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
+ (
11
+ "edc_label",
12
+ "0005_remove_zpllabeltemplates_edc_label_z_modifie_79a6b3_idx_and_more",
13
+ ),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.AlterField(
18
+ model_name="zpllabeltemplates",
19
+ name="revision",
20
+ field=django_revision.revision_field.RevisionField(
21
+ blank=True,
22
+ editable=False,
23
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
24
+ max_length=75,
25
+ null=True,
26
+ verbose_name="Revision",
27
+ ),
28
+ ),
29
+ ]
edc_label/printer.py CHANGED
@@ -41,9 +41,7 @@ class Printer:
41
41
  for k, v in cups_properties.items():
42
42
  k = k.replace("-", "_")
43
43
  setattr(self, k, v)
44
- self.printer_state_reasons = [
45
- r for r in self.printer_state_reasons if r != "none"
46
- ]
44
+ self.printer_state_reasons = [r for r in self.printer_state_reasons if r != "none"]
47
45
  if self.printer_state_reasons:
48
46
  self.printer_state_reasons = ", ".join(self.printer_state_reasons)
49
47
 
@@ -66,9 +64,7 @@ class Printer:
66
64
  cups_connection.writeRequestData(zpl_data, len(zpl_data))
67
65
  cups_connection.finishDocument(self.name)
68
66
  except cups.IPPError as e:
69
- raise PrinterError(
70
- f"Failed to print. Tried printing to '{self.name}'. Got '{e}'."
71
- )
67
+ raise PrinterError(f"Failed to print. Tried printing to '{self.name}'. Got '{e}'.")
72
68
  return job_id
73
69
 
74
70
  def print_file(self, zpl_data=None):
@@ -34,9 +34,7 @@ class PrintersMixin:
34
34
  @property
35
35
  def print_server_name(self):
36
36
  """Returns a string."""
37
- return self.request.session.get(
38
- PRINT_SERVER_NAME, self.user_profile.print_server
39
- )
37
+ return self.request.session.get(PRINT_SERVER_NAME, self.user_profile.print_server)
40
38
 
41
39
  @property
42
40
  def clinic_label_printer_name(self):
edc_label/urls.py CHANGED
@@ -39,9 +39,7 @@ urlpatterns = [
39
39
  HomeView.as_view(),
40
40
  name="print-test-label",
41
41
  ),
42
- re_path(
43
- r"print/(?P<label_name>\w+)/$", HomeView.as_view(), name="print-test-label"
44
- ),
42
+ re_path(r"print/(?P<label_name>\w+)/$", HomeView.as_view(), name="print-test-label"),
45
43
  path("printer_setup/", PrinterSetupView.as_view(), name="printer_setup_url"),
46
44
  path("", HomeView.as_view(), name="home_url"),
47
45
  ]
edc_label/view_mixins.py CHANGED
@@ -22,9 +22,7 @@ class EdcLabelViewMixin(PrintersMixin, ContextMixin):
22
22
  messages.error(self.request, str(e))
23
23
  else:
24
24
  try:
25
- kwargs.update(
26
- selected_clinic_label_printer=self.clinic_label_printer
27
- )
25
+ kwargs.update(selected_clinic_label_printer=self.clinic_label_printer)
28
26
  except PrinterError:
29
27
  pass
30
28
  try: