clinicedc 2.0.6__py3-none-any.whl → 2.0.7__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 (386) hide show
  1. {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/METADATA +2 -2
  2. {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/RECORD +386 -335
  3. edc_action_item/action.py +1 -1
  4. edc_action_item/action_item_notification.py +2 -2
  5. edc_action_item/create_action_item.py +1 -1
  6. edc_action_item/decorators.py +1 -1
  7. edc_action_item/migrations/0001_initial.py +21 -22
  8. edc_action_item/migrations/0006_auto_20180707_1659.py +4 -4
  9. edc_action_item/migrations/0008_auto_20180809_0303.py +4 -4
  10. edc_action_item/migrations/0015_auto_20190114_0250.py +4 -4
  11. edc_action_item/migrations/0017_auto_20190305_0123.py +11 -30
  12. edc_action_item/migrations/0030_edcpermissions.py +3 -2
  13. edc_action_item/migrations/0039_alter_actionitem_auto_created_comment_and_more.py +398 -0
  14. edc_action_item/migrations/0040_alter_actionitem_report_datetime_and_more.py +34 -0
  15. edc_action_item/models/action_item.py +9 -4
  16. edc_action_item/models/action_model_mixin.py +4 -4
  17. edc_action_item/models/reference.py +2 -2
  18. edc_action_item/post_migrate_signals.py +1 -1
  19. edc_action_item/send_email.py +0 -85
  20. edc_adherence/migrations/0005_alter_nonadherencereasons_extra_value_and_more.py +36 -0
  21. edc_adherence/model_mixins.py +1 -1
  22. edc_adverse_event/migrations/0001_initial.py +5 -4
  23. edc_adverse_event/migrations/0002_auto_20190802_0059.py +3 -2
  24. edc_adverse_event/migrations/0008_auto_20220825_0451.py +3 -2
  25. edc_adverse_event/migrations/0009_auto_20220907_0157.py +3 -2
  26. edc_adverse_event/migrations/0016_alter_aeactionclassification_device_created_and_more.py +285 -0
  27. edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +2 -2
  28. edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +6 -5
  29. edc_adverse_event/model_mixins/ae_special_interest/aesi_fields_model_mixin.py +2 -2
  30. edc_adverse_event/model_mixins/ae_susar/ae_susar_fields_model_mixin.py +2 -2
  31. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +15 -11
  32. edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +5 -4
  33. edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +6 -3
  34. edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +2 -2
  35. edc_adverse_event/model_mixins/hospitaization/hospitalization_model_mixin.py +4 -3
  36. edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +3 -3
  37. edc_adverse_event/models/signals.py +7 -7
  38. edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -4
  39. edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +3 -5
  40. edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +6 -8
  41. edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -2
  42. edc_adverse_event/views/tmg/summary_listboard_view.py +3 -2
  43. edc_appointment/admin/appointment_admin.py +2 -2
  44. edc_appointment/admin/list_filters.py +2 -2
  45. edc_appointment/form_validators/appointment_form_validator.py +108 -82
  46. edc_appointment/migrations/0003_auto_20161127_2226.py +5 -6
  47. edc_appointment/migrations/0006_auto_20170106_2118.py +5 -5
  48. edc_appointment/migrations/0018_auto_20190305_0123.py +5 -12
  49. edc_appointment/migrations/0050_alter_appointment_appt_type_and_more.py +220 -0
  50. edc_appointment/model_mixins/appointment_fields_model_mixin.py +1 -2
  51. edc_appointment/model_mixins/window_period_model_mixin.py +6 -7
  52. edc_appointment/models/signals.py +44 -35
  53. edc_appointment/view_utils/appointment_button.py +2 -2
  54. edc_auth/admin/user_admin.py +1 -1
  55. edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +5 -5
  56. edc_auth/migrations/0012_auto_20191026_0034.py +3 -2
  57. edc_auth/migrations/0013_auto_20191026_0055.py +3 -2
  58. edc_auth/migrations/0025_permissions.py +3 -2
  59. edc_auth/migrations/0035_alter_edcpermissions_device_created_and_more.py +85 -0
  60. edc_auth/post_migrate_signals.py +1 -1
  61. edc_consent/actions.py +4 -5
  62. edc_consent/migrations/0001_initial.py +3 -2
  63. edc_consent/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  64. edc_consent/model_mixins/consent_extension_model_mixin.py +4 -5
  65. edc_consent/model_mixins/requires_consent_fields_model_mixin.py +2 -2
  66. edc_consent/utils.py +1 -1
  67. edc_crf/migrations/0001_initial.py +3 -2
  68. edc_crf/migrations/0009_alter_crfstatus_device_created_and_more.py +54 -0
  69. edc_dashboard/migrations/0001_initial.py +3 -2
  70. edc_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  71. edc_dashboard/templatetags/edc_dashboard_extras.py +3 -2
  72. edc_data_manager/action_items.py +4 -6
  73. edc_data_manager/admin/actions.py +5 -5
  74. edc_data_manager/handlers/handlers.py +6 -7
  75. edc_data_manager/migrations/0001_initial.py +19 -19
  76. edc_data_manager/migrations/0025_edcpermissions.py +3 -2
  77. edc_data_manager/migrations/0040_alter_datadictionary_device_created_and_more.py +327 -0
  78. edc_data_manager/migrations/0041_alter_dataquery_dm_user_and_more.py +164 -0
  79. edc_data_manager/models/data_query.py +5 -5
  80. edc_data_manager/models/model_mixins.py +8 -8
  81. edc_data_manager/rule/rule_runner.py +4 -3
  82. edc_document_status/model_mixins.py +1 -1
  83. edc_egfr/egfr.py +11 -7
  84. edc_egfr/model_mixins/egfr_model_mixin.py +3 -7
  85. edc_export/admin/data_request_admin.py +2 -2
  86. edc_export/archive_exporter.py +4 -3
  87. edc_export/files_archiver.py +3 -2
  88. edc_export/migrations/0001_initial.py +26 -26
  89. edc_export/migrations/0004_auto_20190305_0123.py +25 -72
  90. edc_export/migrations/0013_edcpermissions.py +3 -2
  91. edc_export/migrations/0022_alter_datarequest_description_and_more.py +611 -0
  92. edc_export/migrations/0023_alter_datarequesthistory_archive_filename_and_more.py +29 -0
  93. edc_export/model_exporter/file_history_updater.py +10 -10
  94. edc_export/model_exporter/model_exporter.py +13 -14
  95. edc_export/model_exporter/object_history_helpers.py +2 -2
  96. edc_export/models/data_request_history.py +4 -4
  97. edc_export/utils.py +10 -15
  98. edc_facility/facility.py +10 -15
  99. edc_facility/import_holidays.py +13 -13
  100. edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +8 -7
  101. edc_facility/migrations/0016_alter_healthfacility_device_created_and_more.py +139 -0
  102. edc_facility/migrations/0017_alter_healthfacility_gps_and_more.py +54 -0
  103. edc_facility/model_mixins.py +5 -5
  104. edc_form_runners/form_runner.py +3 -5
  105. edc_form_runners/migrations/0001_initial.py +3 -2
  106. edc_form_runners/migrations/0005_alter_issue_device_created_and_more.py +49 -0
  107. edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -3
  108. edc_identifier/migrations/0002_auto_20190305_0123.py +3 -6
  109. edc_identifier/migrations/0006_auto_20161127_2226.py +15 -15
  110. edc_identifier/migrations/0007_auto_20161204_2227.py +3 -3
  111. edc_identifier/migrations/0009_auto_20161221_2323.py +3 -5
  112. edc_identifier/migrations/0010_auto_20170112_0602.py +17 -17
  113. edc_identifier/migrations/0011_alter_identifiermodel_device_created_and_more.py +79 -0
  114. edc_identifier/model_mixins.py +1 -1
  115. edc_identifier/models.py +9 -9
  116. edc_identifier/simple_identifier.py +1 -3
  117. edc_identifier/subject_identifier.py +3 -2
  118. edc_lab/migrations/0001_initial.py +29 -29
  119. edc_lab/migrations/0008_auto_20170921_0719.py +3 -3
  120. edc_lab/migrations/0010_auto_20171127_1541.py +15 -15
  121. edc_lab/migrations/0012_auto_20180114_1438.py +3 -3
  122. edc_lab/migrations/0019_auto_20190305_0123.py +43 -127
  123. edc_lab/migrations/0036_alter_aliquot_comment_alter_aliquot_device_created_and_more.py +1139 -0
  124. edc_lab/migrations/0037_alter_historicalorder_order_datetime_and_more.py +31 -0
  125. edc_lab/model_mixins/aliquot/aliquot_identifier_model_mixin.py +2 -2
  126. edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +2 -2
  127. edc_lab/model_mixins/panel_model_mixin.py +18 -7
  128. edc_lab/model_mixins/requisition/crf_with_requisition_model_mixin.py +2 -4
  129. edc_lab/model_mixins/requisition/requisition_model_mixin.py +7 -8
  130. edc_lab/model_mixins/requisition/requisition_verify_model_mixin.py +1 -1
  131. edc_lab/model_mixins/result/result_item_model_mixin.py +4 -4
  132. edc_lab/model_mixins/shipping/manifest_model_mixin.py +4 -5
  133. edc_lab/model_mixins/shipping/verify_model_mixin.py +4 -6
  134. edc_lab/models/box.py +1 -1
  135. edc_lab/models/box_item.py +6 -7
  136. edc_lab/models/manifest/manifest.py +1 -1
  137. edc_lab/models/manifest/manifest_item.py +6 -6
  138. edc_lab/models/manifest/shipper.py +3 -4
  139. edc_lab/models/order.py +6 -4
  140. edc_lab/models/panel.py +4 -4
  141. edc_lab/models/result.py +2 -2
  142. edc_lab/models/result_item.py +2 -2
  143. edc_lab_dashboard/migrations/0001_initial.py +3 -2
  144. edc_lab_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  145. edc_lab_dashboard/views/action_views/receive_view.py +2 -2
  146. edc_lab_dashboard/views/action_views/verify_box_item_view.py +2 -2
  147. edc_lab_results/model_mixins/blood_result_model_mixin.py +7 -7
  148. edc_lab_results/model_mixins/fbg_model_mixin.py +3 -3
  149. edc_lab_results/model_mixins/glucose_model_mixin.py +3 -3
  150. edc_lab_results/model_mixins/hba1c_model_mixin.py +3 -3
  151. edc_label/migrations/0001_initial.py +3 -2
  152. edc_label/migrations/0007_alter_zpllabeltemplates_device_created_and_more.py +49 -0
  153. edc_list_data/list_model_maker.py +2 -2
  154. edc_list_data/load_list_data.py +11 -14
  155. edc_list_data/model_mixins.py +12 -4
  156. edc_list_data/preload_data.py +3 -3
  157. edc_listboard/migrations/0001_initial.py +3 -2
  158. edc_listboard/migrations/0007_alter_listboard_device_created_and_more.py +49 -0
  159. edc_locator/migrations/0001_initial.py +7 -7
  160. edc_locator/migrations/0018_auto_20190305_0123.py +5 -12
  161. edc_locator/migrations/0040_alter_historicalsubjectlocator_action_identifier_and_more.py +187 -0
  162. edc_locator/migrations/0041_alter_historicalsubjectlocator_report_datetime_and_more.py +27 -0
  163. edc_locator/model_mixins/locator_model_mixin.py +2 -2
  164. edc_locator/model_mixins/subject_contact_fields_mixin.py +1 -1
  165. edc_locator/modeladmin_mixins.py +5 -4
  166. edc_ltfu/model_mixins.py +7 -5
  167. edc_metadata/metadata_rules/decorators.py +1 -1
  168. edc_metadata/migrations/0002_auto_20161127_2226.py +5 -5
  169. edc_metadata/migrations/0005_auto_20170112_0602.py +5 -5
  170. edc_metadata/migrations/0011_auto_20190305_0123.py +5 -12
  171. edc_metadata/migrations/0031_alter_crfmetadata_device_created_and_more.py +120 -0
  172. edc_metadata/model_mixins/updates/updates_crf_metadata_model_mixin.py +1 -1
  173. edc_metadata/model_mixins/updates/updates_requisition_metadata_model_mixin.py +1 -1
  174. edc_metadata/models/crf_metadata.py +5 -5
  175. edc_metadata/models/crf_metadata_model_mixin.py +4 -5
  176. edc_metadata/models/requisition_metadata.py +6 -6
  177. edc_metadata/views/refresh_metadata_actions_view.py +3 -3
  178. edc_model/models/address_mixin.py +6 -6
  179. edc_model/models/fields/initials_field.py +2 -1
  180. edc_model/models/historical_records.py +2 -9
  181. edc_model/models/url_model_mixin.py +2 -2
  182. edc_model/validators/date.py +7 -8
  183. edc_model_admin/list_filters/future_date_list_filter.py +3 -3
  184. edc_model_admin/list_filters/past_date_list_filter.py +3 -3
  185. edc_model_admin/mixins/model_admin_protect_pii_mixin.py +4 -5
  186. edc_model_fields/fields/other_charfield.py +2 -2
  187. edc_navbar/migrations/0004_auto_20220825_0451.py +3 -2
  188. edc_navbar/migrations/0009_alter_edcpermissions_device_created_and_more.py +49 -0
  189. edc_notification/migrations/0001_initial.py +3 -3
  190. edc_notification/migrations/0004_auto_20190305_0123.py +3 -6
  191. edc_notification/migrations/0011_alter_notification_device_created_and_more.py +59 -0
  192. edc_notification/models/notification.py +1 -1
  193. edc_notification/notification/notification.py +12 -12
  194. edc_offstudy/migrations/0001_initial.py +4 -4
  195. edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -4
  196. edc_offstudy/migrations/0005_auto_20190305_0123.py +5 -12
  197. edc_offstudy/migrations/0023_alter_historicalsubjectoffstudy_action_identifier_and_more.py +188 -0
  198. edc_offstudy/migrations/0024_alter_historicalsubjectoffstudy_offstudy_datetime_and_more.py +43 -0
  199. edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -2
  200. edc_pdutils/df_exporters/csv_exporter.py +33 -37
  201. edc_pdutils/df_exporters/csv_model_exporter.py +2 -1
  202. edc_pdutils/migrations/0001_initial.py +8 -8
  203. edc_pharmacy/admin/prescription/rx_refill_admin.py +4 -3
  204. edc_pharmacy/admin/reports/stock_availability_admin.py +5 -6
  205. edc_pharmacy/migrations/0001_initial.py +64 -63
  206. edc_pharmacy/migrations/0015_auto_20220913_2139.py +26 -26
  207. edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +81 -86
  208. edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +5 -5
  209. edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -8
  210. edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +12 -12
  211. edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +5 -5
  212. edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +3 -4
  213. edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +3 -3
  214. edc_pharmacy/migrations/0057_scanduplicates.py +3 -3
  215. edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +13 -15
  216. edc_pharmacy/migrations/0068_stockout.py +2 -3
  217. edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -5
  218. edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +3 -4
  219. edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -8
  220. edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +0 -2
  221. edc_pharmacy/migrations/0089_alter_allocation_allocated_by_and_more.py +3284 -0
  222. edc_pharmacy/migrations/0090_alter_allocation_allocation_datetime_and_more.py +227 -0
  223. edc_pharmacy/model_mixins/study_medication_refill_model_mixin.py +2 -2
  224. edc_pharmacy/models/medication/medication.py +3 -3
  225. edc_pharmacy/models/model_mixins.py +10 -11
  226. edc_pharmacy/models/prescription/rx.py +13 -12
  227. edc_pharmacy/models/prescription/rx_refill.py +0 -1
  228. edc_pharmacy/models/stock/allocation.py +3 -3
  229. edc_pharmacy/models/stock/confirmation.py +3 -3
  230. edc_pharmacy/models/stock/confirmation_at_site.py +3 -2
  231. edc_pharmacy/models/stock/confirmation_at_site_item.py +3 -4
  232. edc_pharmacy/models/stock/dispense.py +5 -6
  233. edc_pharmacy/models/stock/dispense_item.py +2 -2
  234. edc_pharmacy/models/stock/location.py +3 -4
  235. edc_pharmacy/models/stock/lot.py +6 -7
  236. edc_pharmacy/models/stock/order.py +1 -1
  237. edc_pharmacy/models/stock/receive.py +3 -3
  238. edc_pharmacy/models/stock/receive_item.py +4 -4
  239. edc_pharmacy/models/stock/repack_request.py +2 -2
  240. edc_pharmacy/models/stock/stock.py +12 -18
  241. edc_pharmacy/models/stock/stock_adjustment.py +4 -4
  242. edc_pharmacy/models/stock/stock_request.py +2 -2
  243. edc_pharmacy/models/stock/stock_request_item.py +2 -2
  244. edc_pharmacy/models/stock/stock_transfer.py +3 -3
  245. edc_pharmacy/models/stock/stock_transfer_item.py +2 -2
  246. edc_pharmacy/models/stock/storage_bin.py +3 -4
  247. edc_pharmacy/models/stock/storage_bin_item.py +2 -2
  248. edc_pharmacy/models/stock/supplier.py +3 -4
  249. edc_pharmacy/models/storage/box.py +2 -2
  250. edc_pharmacy/models/storage/items/container_model_mixin.py +3 -4
  251. edc_pharmacy/models/storage/items/pill_bottle_model_mixin.py +2 -2
  252. edc_pharmacy/models/storage/items/subject_pill_bottle.py +1 -1
  253. edc_pharmacy/models/storage/room.py +2 -2
  254. edc_pharmacy/models/storage/shelf.py +2 -2
  255. edc_pharmacy/models/storage/utils.py +1 -1
  256. edc_pharmacy/utils/allocate_stock.py +2 -3
  257. edc_pharmacy/utils/confirm_stock.py +2 -3
  258. edc_pharmacy/utils/confirm_stock_at_site.py +3 -4
  259. edc_pharmacy/utils/dispense.py +3 -4
  260. edc_pharmacy/utils/process_repack_request.py +4 -5
  261. edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -3
  262. edc_pharmacy/utils/transfer_stock.py +2 -3
  263. edc_pharmacy/views/add_to_storage_bin_view.py +2 -2
  264. edc_pharmacy/views/allocate_to_subject_view.py +2 -2
  265. edc_pharmacy/views/dispense_view.py +2 -2
  266. edc_pharmacy/views/move_to_storage_bin_view.py +2 -3
  267. edc_pharmacy/views/print_labels_view.py +2 -2
  268. edc_protocol/research_protocol_config.py +2 -3
  269. edc_protocol_incident/migrations/0001_initial.py +7 -7
  270. edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +13 -13
  271. edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +7 -7
  272. edc_protocol_incident/migrations/0024_alter_actionsrequired_extra_value_and_more.py +625 -0
  273. edc_protocol_incident/migrations/0025_alter_historicalprotocoldeviationviolation_report_datetime_and_more.py +42 -0
  274. edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +18 -11
  275. edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +26 -11
  276. edc_pylabels/actions.py +3 -5
  277. edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +3 -7
  278. edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +3 -3
  279. edc_pylabels/migrations/0013_alter_labelconfiguration_device_created_and_more.py +49 -0
  280. edc_qareports/migrations/0001_initial.py +4 -5
  281. edc_qareports/migrations/0005_edcpermissions.py +3 -3
  282. edc_qareports/migrations/0006_qareportlog.py +2 -3
  283. edc_qareports/migrations/0019_alter_edcpermissions_device_created_and_more.py +102 -0
  284. edc_qareports/migrations/0020_alter_note_report_datetime_and_more.py +24 -0
  285. edc_qareports/model_mixins/note_model_mixin.py +7 -4
  286. edc_qareports/model_mixins/on_study_missing_values_model_mixin.py +4 -4
  287. edc_qareports/model_mixins/qa_report_model_mixin.py +2 -3
  288. edc_qareports/models/note.py +4 -4
  289. edc_qareports/models/qa_reports_log.py +2 -3
  290. edc_randomization/decorators.py +1 -1
  291. edc_randomization/migrations/0001_initial.py +3 -2
  292. edc_randomization/migrations/0002_historicalrandomizationlist.py +3 -2
  293. edc_randomization/migrations/0009_edcpermissions.py +3 -2
  294. edc_randomization/migrations/0014_alter_edcpermissions_device_created_and_more.py +141 -0
  295. edc_randomization/model_mixins.py +9 -9
  296. edc_randomization/utils.py +2 -2
  297. edc_refusal/migrations/0001_initial.py +4 -4
  298. edc_refusal/migrations/0002_historicalsubjectrefusal.py +4 -4
  299. edc_refusal/migrations/0012_alter_historicalsubjectrefusal_comment_and_more.py +122 -0
  300. edc_refusal/migrations/0013_alter_historicalsubjectrefusal_report_datetime_and_more.py +28 -0
  301. edc_refusal/model_mixins.py +3 -3
  302. edc_registration/migrations/0002_auto_20161127_2226.py +3 -4
  303. edc_registration/migrations/0005_auto_20170111_1809.py +4 -2
  304. edc_registration/migrations/0016_historicalregisteredsubject.py +3 -2
  305. edc_registration/migrations/0017_auto_20190305_0123.py +5 -12
  306. edc_registration/migrations/0033_alter_historicalregisteredsubject_additional_key_and_more.py +302 -0
  307. edc_registration/model_mixins/updates_or_creates_registered_subject_model_mixin.py +2 -3
  308. edc_registration/models/registered_subject.py +27 -26
  309. edc_reportable/age_evaluator.py +4 -2
  310. edc_reportable/formula.py +5 -5
  311. edc_reportable/migrations/0001_initial.py +7 -7
  312. edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -3
  313. edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +5 -5
  314. edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +5 -6
  315. edc_reportable/migrations/0007_alter_gradingdata_age_phrase_and_more.py +509 -0
  316. edc_reportable/models/normal_data.py +4 -5
  317. edc_reportable/models/reference_model_mixins.py +10 -11
  318. edc_reportable/models/reference_range_collection.py +12 -13
  319. edc_reportable/post_migrate_signals.py +1 -1
  320. edc_reportable/utils/convert_units.py +11 -45
  321. edc_reportable/utils/get_normal_data_or_raise.py +2 -2
  322. edc_reportable/utils/load_data.py +4 -4
  323. edc_reportable/utils/update_grading_data.py +5 -5
  324. edc_review_dashboard/migrations/0001_initial.py +3 -2
  325. edc_review_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  326. edc_screening/age_evaluator.py +3 -3
  327. edc_screening/migrations/0001_initial.py +3 -2
  328. edc_screening/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  329. edc_screening/model_mixins/eligibility_model_mixin.py +3 -4
  330. edc_screening/model_mixins/screening_fields_model_mixin.py +6 -8
  331. edc_search/model_mixins.py +2 -3
  332. edc_search/search_slug.py +9 -8
  333. edc_search/updater.py +2 -2
  334. edc_sites/migrations/0007_edcpermissions.py +3 -2
  335. edc_sites/migrations/0010_alter_edcpermissions_device_created_and_more.py +69 -0
  336. edc_sites/model_mixins/site_model_mixin.py +2 -2
  337. edc_sites/site.py +5 -5
  338. edc_sites/system_checks.py +1 -1
  339. edc_subject_dashboard/migrations/0001_initial.py +3 -2
  340. edc_subject_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  341. edc_subject_dashboard/requisition_report.py +6 -4
  342. edc_subject_dashboard/requisition_verifier.py +6 -6
  343. edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -2
  344. edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +7 -8
  345. edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +3 -2
  346. edc_subject_dashboard/view_utils/timepoint_status_button.py +2 -2
  347. edc_timepoint/model_mixins.py +22 -20
  348. edc_transfer/model_mixins.py +4 -4
  349. edc_transfer/modeladmin_mixins.py +1 -1
  350. edc_unblinding/migrations/0001_initial.py +13 -13
  351. edc_unblinding/migrations/0014_alter_historicalunblindingrequest_action_identifier_and_more.py +291 -0
  352. edc_unblinding/migrations/0015_alter_historicalunblindingrequest_report_datetime_and_more.py +45 -0
  353. edc_unblinding/models/unblinding_request.py +2 -2
  354. edc_unblinding/models/unblinding_review.py +3 -3
  355. edc_utils/age.py +10 -16
  356. edc_visit_schedule/migrations/0001_initial.py +3 -3
  357. edc_visit_schedule/migrations/0002_auto_20190305_0123.py +3 -6
  358. edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +5 -4
  359. edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +10 -10
  360. edc_visit_schedule/migrations/0019_alter_historicalonschedule_device_created_and_more.py +229 -0
  361. edc_visit_schedule/migrations/0020_alter_historicalonschedule_onschedule_datetime_and_more.py +65 -0
  362. edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +5 -4
  363. edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +5 -4
  364. edc_visit_schedule/model_mixins/visit_schedule/visit_code_fields_model_mixin.py +1 -1
  365. edc_visit_schedule/models/subject_schedule_history.py +6 -6
  366. edc_visit_schedule/schedule/visit_collection.py +1 -1
  367. edc_visit_schedule/subject_schedule.py +5 -4
  368. edc_visit_schedule/view_mixins.py +2 -3
  369. edc_visit_schedule/visit/visit.py +3 -2
  370. edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +13 -13
  371. edc_visit_tracking/migrations/0009_alter_historicalsubjectvisit_comments_and_more.py +450 -0
  372. edc_visit_tracking/migrations/0010_alter_historicalsubjectvisit_report_datetime_and_more.py +68 -0
  373. edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +3 -3
  374. edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +2 -2
  375. edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +2 -2
  376. edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +2 -2
  377. edc_visit_tracking/model_mixins/visit_model_mixin/caretaker_fields_mixin.py +2 -3
  378. edc_visit_tracking/model_mixins/visit_model_mixin/previous_visit_model_mixin.py +1 -1
  379. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +8 -11
  380. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_mixin.py +1 -1
  381. edc_visit_tracking/models/signals.py +1 -1
  382. edc_visit_tracking/models/subject_visit.py +1 -1
  383. edc_vitals/calculators/bmi.py +7 -5
  384. edc_vitals/utils.py +1 -1
  385. {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/WHEEL +0 -0
  386. {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,450 @@
1
+ # Generated by Django 5.2.6 on 2025-09-17 16:53
2
+
3
+ import edc_model_fields.fields.other_charfield
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("edc_visit_tracking", "0008_alter_historicalsubjectvisit_revision_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="historicalsubjectvisit",
16
+ name="comments",
17
+ field=models.TextField(
18
+ blank=True,
19
+ default="",
20
+ max_length=250,
21
+ verbose_name="Comment if any additional pertinent information about the participant",
22
+ ),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="historicalsubjectvisit",
26
+ name="consent_model",
27
+ field=models.CharField(blank=True, default="", max_length=50),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="historicalsubjectvisit",
31
+ name="consent_version",
32
+ field=models.CharField(blank=True, default="", max_length=10),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="historicalsubjectvisit",
36
+ name="device_created",
37
+ field=models.CharField(
38
+ blank=True, default="", max_length=10, verbose_name="Device created"
39
+ ),
40
+ ),
41
+ migrations.AlterField(
42
+ model_name="historicalsubjectvisit",
43
+ name="device_modified",
44
+ field=models.CharField(
45
+ blank=True, default="", max_length=10, verbose_name="Device modified"
46
+ ),
47
+ ),
48
+ migrations.AlterField(
49
+ model_name="historicalsubjectvisit",
50
+ name="document_status_comments",
51
+ field=models.TextField(
52
+ blank=True,
53
+ default="",
54
+ help_text="for example, why some data is still pending",
55
+ verbose_name="Any comments related to status of this document",
56
+ ),
57
+ ),
58
+ migrations.AlterField(
59
+ model_name="historicalsubjectvisit",
60
+ name="info_source_other",
61
+ field=edc_model_fields.fields.other_charfield.OtherCharField(
62
+ blank=True,
63
+ default="",
64
+ max_length=35,
65
+ verbose_name='If "Other" source of information, specify',
66
+ ),
67
+ ),
68
+ migrations.AlterField(
69
+ model_name="historicalsubjectvisit",
70
+ name="locale_created",
71
+ field=models.CharField(
72
+ blank=True,
73
+ default="",
74
+ help_text="Auto-updated by Modeladmin",
75
+ max_length=10,
76
+ verbose_name="Locale created",
77
+ ),
78
+ ),
79
+ migrations.AlterField(
80
+ model_name="historicalsubjectvisit",
81
+ name="locale_modified",
82
+ field=models.CharField(
83
+ blank=True,
84
+ default="",
85
+ help_text="Auto-updated by Modeladmin",
86
+ max_length=10,
87
+ verbose_name="Locale modified",
88
+ ),
89
+ ),
90
+ migrations.AlterField(
91
+ model_name="historicalsubjectvisit",
92
+ name="reason_missed",
93
+ field=models.CharField(
94
+ blank=True,
95
+ choices=[
96
+ ("timepoint", "Missed timepoint"),
97
+ ("OTHER", "Other"),
98
+ ("N/A", "Not applicable"),
99
+ ],
100
+ default="",
101
+ max_length=35,
102
+ verbose_name="If 'missed', provide the reason for the missed visit",
103
+ ),
104
+ ),
105
+ migrations.AlterField(
106
+ model_name="historicalsubjectvisit",
107
+ name="reason_missed_other",
108
+ field=edc_model_fields.fields.other_charfield.OtherCharField(
109
+ blank=True,
110
+ default="",
111
+ max_length=25,
112
+ verbose_name='If the reason for the missed visit is "other", specify',
113
+ ),
114
+ ),
115
+ migrations.AlterField(
116
+ model_name="historicalsubjectvisit",
117
+ name="study_status",
118
+ field=models.CharField(
119
+ default="",
120
+ max_length=50,
121
+ verbose_name="What is the participant's current study status",
122
+ ),
123
+ ),
124
+ migrations.AlterField(
125
+ model_name="historicalsubjectvisit",
126
+ name="survival_status",
127
+ field=models.CharField(
128
+ choices=[
129
+ ("alive", "Alive"),
130
+ ("dead", "Deceased"),
131
+ ("unknown", "Unknown"),
132
+ ("N/A", "Not applicable (if missed)"),
133
+ ],
134
+ default="alive",
135
+ help_text="If YES, submit Death report",
136
+ max_length=10,
137
+ verbose_name="Participant's survival status",
138
+ ),
139
+ ),
140
+ migrations.AlterField(
141
+ model_name="historicalsubjectvisit",
142
+ name="visit_code",
143
+ field=models.CharField(default="", editable=False, max_length=25),
144
+ ),
145
+ migrations.AlterField(
146
+ model_name="historicalsubjectvisitmissed",
147
+ name="comment",
148
+ field=models.TextField(
149
+ blank=True,
150
+ default="",
151
+ verbose_name="Please provide further details, if any",
152
+ ),
153
+ ),
154
+ migrations.AlterField(
155
+ model_name="historicalsubjectvisitmissed",
156
+ name="consent_model",
157
+ field=models.CharField(blank=True, default="", max_length=50),
158
+ ),
159
+ migrations.AlterField(
160
+ model_name="historicalsubjectvisitmissed",
161
+ name="consent_version",
162
+ field=models.CharField(blank=True, default="", max_length=10),
163
+ ),
164
+ migrations.AlterField(
165
+ model_name="historicalsubjectvisitmissed",
166
+ name="contact_attempts_explained",
167
+ field=models.TextField(
168
+ blank=True,
169
+ default="",
170
+ verbose_name="If contact not made and less than 3 attempts, please explain",
171
+ ),
172
+ ),
173
+ migrations.AlterField(
174
+ model_name="historicalsubjectvisitmissed",
175
+ name="device_created",
176
+ field=models.CharField(
177
+ blank=True, default="", max_length=10, verbose_name="Device created"
178
+ ),
179
+ ),
180
+ migrations.AlterField(
181
+ model_name="historicalsubjectvisitmissed",
182
+ name="device_modified",
183
+ field=models.CharField(
184
+ blank=True, default="", max_length=10, verbose_name="Device modified"
185
+ ),
186
+ ),
187
+ migrations.AlterField(
188
+ model_name="historicalsubjectvisitmissed",
189
+ name="locale_created",
190
+ field=models.CharField(
191
+ blank=True,
192
+ default="",
193
+ help_text="Auto-updated by Modeladmin",
194
+ max_length=10,
195
+ verbose_name="Locale created",
196
+ ),
197
+ ),
198
+ migrations.AlterField(
199
+ model_name="historicalsubjectvisitmissed",
200
+ name="locale_modified",
201
+ field=models.CharField(
202
+ blank=True,
203
+ default="",
204
+ help_text="Auto-updated by Modeladmin",
205
+ max_length=10,
206
+ verbose_name="Locale modified",
207
+ ),
208
+ ),
209
+ migrations.AlterField(
210
+ model_name="subjectvisit",
211
+ name="comments",
212
+ field=models.TextField(
213
+ blank=True,
214
+ default="",
215
+ max_length=250,
216
+ verbose_name="Comment if any additional pertinent information about the participant",
217
+ ),
218
+ ),
219
+ migrations.AlterField(
220
+ model_name="subjectvisit",
221
+ name="consent_model",
222
+ field=models.CharField(blank=True, default="", max_length=50),
223
+ ),
224
+ migrations.AlterField(
225
+ model_name="subjectvisit",
226
+ name="consent_version",
227
+ field=models.CharField(blank=True, default="", max_length=10),
228
+ ),
229
+ migrations.AlterField(
230
+ model_name="subjectvisit",
231
+ name="device_created",
232
+ field=models.CharField(
233
+ blank=True, default="", max_length=10, verbose_name="Device created"
234
+ ),
235
+ ),
236
+ migrations.AlterField(
237
+ model_name="subjectvisit",
238
+ name="device_modified",
239
+ field=models.CharField(
240
+ blank=True, default="", max_length=10, verbose_name="Device modified"
241
+ ),
242
+ ),
243
+ migrations.AlterField(
244
+ model_name="subjectvisit",
245
+ name="document_status_comments",
246
+ field=models.TextField(
247
+ blank=True,
248
+ default="",
249
+ help_text="for example, why some data is still pending",
250
+ verbose_name="Any comments related to status of this document",
251
+ ),
252
+ ),
253
+ migrations.AlterField(
254
+ model_name="subjectvisit",
255
+ name="info_source_other",
256
+ field=edc_model_fields.fields.other_charfield.OtherCharField(
257
+ blank=True,
258
+ default="",
259
+ max_length=35,
260
+ verbose_name='If "Other" source of information, specify',
261
+ ),
262
+ ),
263
+ migrations.AlterField(
264
+ model_name="subjectvisit",
265
+ name="locale_created",
266
+ field=models.CharField(
267
+ blank=True,
268
+ default="",
269
+ help_text="Auto-updated by Modeladmin",
270
+ max_length=10,
271
+ verbose_name="Locale created",
272
+ ),
273
+ ),
274
+ migrations.AlterField(
275
+ model_name="subjectvisit",
276
+ name="locale_modified",
277
+ field=models.CharField(
278
+ blank=True,
279
+ default="",
280
+ help_text="Auto-updated by Modeladmin",
281
+ max_length=10,
282
+ verbose_name="Locale modified",
283
+ ),
284
+ ),
285
+ migrations.AlterField(
286
+ model_name="subjectvisit",
287
+ name="reason_missed",
288
+ field=models.CharField(
289
+ blank=True,
290
+ choices=[
291
+ ("timepoint", "Missed timepoint"),
292
+ ("OTHER", "Other"),
293
+ ("N/A", "Not applicable"),
294
+ ],
295
+ default="",
296
+ max_length=35,
297
+ verbose_name="If 'missed', provide the reason for the missed visit",
298
+ ),
299
+ ),
300
+ migrations.AlterField(
301
+ model_name="subjectvisit",
302
+ name="reason_missed_other",
303
+ field=edc_model_fields.fields.other_charfield.OtherCharField(
304
+ blank=True,
305
+ default="",
306
+ max_length=25,
307
+ verbose_name='If the reason for the missed visit is "other", specify',
308
+ ),
309
+ ),
310
+ migrations.AlterField(
311
+ model_name="subjectvisit",
312
+ name="study_status",
313
+ field=models.CharField(
314
+ default="",
315
+ max_length=50,
316
+ verbose_name="What is the participant's current study status",
317
+ ),
318
+ ),
319
+ migrations.AlterField(
320
+ model_name="subjectvisit",
321
+ name="survival_status",
322
+ field=models.CharField(
323
+ choices=[
324
+ ("alive", "Alive"),
325
+ ("dead", "Deceased"),
326
+ ("unknown", "Unknown"),
327
+ ("N/A", "Not applicable (if missed)"),
328
+ ],
329
+ default="alive",
330
+ help_text="If YES, submit Death report",
331
+ max_length=10,
332
+ verbose_name="Participant's survival status",
333
+ ),
334
+ ),
335
+ migrations.AlterField(
336
+ model_name="subjectvisit",
337
+ name="visit_code",
338
+ field=models.CharField(default="", editable=False, max_length=25),
339
+ ),
340
+ migrations.AlterField(
341
+ model_name="subjectvisitmissed",
342
+ name="comment",
343
+ field=models.TextField(
344
+ blank=True,
345
+ default="",
346
+ verbose_name="Please provide further details, if any",
347
+ ),
348
+ ),
349
+ migrations.AlterField(
350
+ model_name="subjectvisitmissed",
351
+ name="consent_model",
352
+ field=models.CharField(blank=True, default="", max_length=50),
353
+ ),
354
+ migrations.AlterField(
355
+ model_name="subjectvisitmissed",
356
+ name="consent_version",
357
+ field=models.CharField(blank=True, default="", max_length=10),
358
+ ),
359
+ migrations.AlterField(
360
+ model_name="subjectvisitmissed",
361
+ name="contact_attempts_explained",
362
+ field=models.TextField(
363
+ blank=True,
364
+ default="",
365
+ verbose_name="If contact not made and less than 3 attempts, please explain",
366
+ ),
367
+ ),
368
+ migrations.AlterField(
369
+ model_name="subjectvisitmissed",
370
+ name="device_created",
371
+ field=models.CharField(
372
+ blank=True, default="", max_length=10, verbose_name="Device created"
373
+ ),
374
+ ),
375
+ migrations.AlterField(
376
+ model_name="subjectvisitmissed",
377
+ name="device_modified",
378
+ field=models.CharField(
379
+ blank=True, default="", max_length=10, verbose_name="Device modified"
380
+ ),
381
+ ),
382
+ migrations.AlterField(
383
+ model_name="subjectvisitmissed",
384
+ name="locale_created",
385
+ field=models.CharField(
386
+ blank=True,
387
+ default="",
388
+ help_text="Auto-updated by Modeladmin",
389
+ max_length=10,
390
+ verbose_name="Locale created",
391
+ ),
392
+ ),
393
+ migrations.AlterField(
394
+ model_name="subjectvisitmissed",
395
+ name="locale_modified",
396
+ field=models.CharField(
397
+ blank=True,
398
+ default="",
399
+ help_text="Auto-updated by Modeladmin",
400
+ max_length=10,
401
+ verbose_name="Locale modified",
402
+ ),
403
+ ),
404
+ migrations.AlterField(
405
+ model_name="subjectvisitmissedreasons",
406
+ name="extra_value",
407
+ field=models.CharField(default="", max_length=250),
408
+ ),
409
+ migrations.AlterField(
410
+ model_name="subjectvisitmissedreasons",
411
+ name="field_name",
412
+ field=models.CharField(
413
+ blank=True,
414
+ default="",
415
+ editable=False,
416
+ help_text="Not required",
417
+ max_length=25,
418
+ ),
419
+ ),
420
+ migrations.AlterField(
421
+ model_name="subjectvisitmissedreasons",
422
+ name="plural_name",
423
+ field=models.CharField(
424
+ default="", max_length=250, verbose_name="Plural name"
425
+ ),
426
+ ),
427
+ migrations.AlterField(
428
+ model_name="visitreasons",
429
+ name="extra_value",
430
+ field=models.CharField(default="", max_length=250),
431
+ ),
432
+ migrations.AlterField(
433
+ model_name="visitreasons",
434
+ name="field_name",
435
+ field=models.CharField(
436
+ blank=True,
437
+ default="",
438
+ editable=False,
439
+ help_text="Not required",
440
+ max_length=25,
441
+ ),
442
+ ),
443
+ migrations.AlterField(
444
+ model_name="visitreasons",
445
+ name="plural_name",
446
+ field=models.CharField(
447
+ default="", max_length=250, verbose_name="Plural name"
448
+ ),
449
+ ),
450
+ ]
@@ -0,0 +1,68 @@
1
+ # Generated by Django 5.2.6 on 2025-09-18 00:24
2
+
3
+ import django.utils.timezone
4
+ import edc_model.validators.date
5
+ import edc_protocol.validators
6
+ from django.db import migrations, models
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ dependencies = [
12
+ ("edc_visit_tracking", "0009_alter_historicalsubjectvisit_comments_and_more"),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name="historicalsubjectvisit",
18
+ name="report_datetime",
19
+ field=models.DateTimeField(
20
+ default=django.utils.timezone.now,
21
+ help_text="Date and time of this report",
22
+ validators=[
23
+ edc_protocol.validators.datetime_not_before_study_start,
24
+ edc_model.validators.date.datetime_not_future,
25
+ ],
26
+ verbose_name="Report date and time",
27
+ ),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="historicalsubjectvisitmissed",
31
+ name="report_datetime",
32
+ field=models.DateTimeField(
33
+ default=django.utils.timezone.now,
34
+ help_text="If reporting today, use today's date/time, otherwise use the date/time this information was reported.",
35
+ validators=[
36
+ edc_protocol.validators.datetime_not_before_study_start,
37
+ edc_model.validators.date.datetime_not_future,
38
+ ],
39
+ verbose_name="Report Date",
40
+ ),
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="subjectvisit",
44
+ name="report_datetime",
45
+ field=models.DateTimeField(
46
+ default=django.utils.timezone.now,
47
+ help_text="Date and time of this report",
48
+ validators=[
49
+ edc_protocol.validators.datetime_not_before_study_start,
50
+ edc_model.validators.date.datetime_not_future,
51
+ ],
52
+ verbose_name="Report date and time",
53
+ ),
54
+ ),
55
+ migrations.AlterField(
56
+ model_name="subjectvisitmissed",
57
+ name="report_datetime",
58
+ field=models.DateTimeField(
59
+ default=django.utils.timezone.now,
60
+ help_text="If reporting today, use today's date/time, otherwise use the date/time this information was reported.",
61
+ validators=[
62
+ edc_protocol.validators.datetime_not_before_study_start,
63
+ edc_model.validators.date.datetime_not_future,
64
+ ],
65
+ verbose_name="Report Date",
66
+ ),
67
+ ),
68
+ ]
@@ -27,7 +27,7 @@ class VisitMethodsModelMixin(models.Model):
27
27
  def natural_key(self) -> tuple:
28
28
  return tuple(getattr(self, self.related_visit_model_attr()).natural_key())
29
29
 
30
- natural_key.dependencies = [settings.SUBJECT_VISIT_MODEL]
30
+ natural_key.dependencies = (settings.SUBJECT_VISIT_MODEL,)
31
31
 
32
32
  @classmethod
33
33
  def related_visit_model_attr(cls) -> str:
@@ -103,11 +103,11 @@ class VisitMethodsModelMixin(models.Model):
103
103
  if issubclass(related_model, (VisitModelMixin,)):
104
104
  try:
105
105
  related_visit = getattr(self, field.name)
106
- except ObjectDoesNotExist:
106
+ except ObjectDoesNotExist as e:
107
107
  raise RelatedVisitFieldError(
108
108
  f"Related visit cannot be None. See {self.__class__}. "
109
109
  "Perhaps catch this in the form."
110
- )
110
+ ) from e
111
111
  break
112
112
  related_model = None
113
113
  if not related_model:
@@ -2,11 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  from django.conf import settings
4
4
  from django.db import models
5
+ from django.utils import timezone
5
6
  from django.utils.translation import gettext_lazy as _
6
7
 
7
8
  from edc_model.validators import datetime_not_future
8
9
  from edc_protocol.validators import datetime_not_before_study_start
9
- from edc_utils import get_utcnow
10
10
  from edc_visit_schedule.model_mixins import CrfScheduleModelMixin
11
11
 
12
12
  from ..base import VisitMethodsModelMixin
@@ -31,7 +31,7 @@ class VisitTrackingCrfModelMixin(VisitMethodsModelMixin, CrfScheduleModelMixin,
31
31
  report_datetime = models.DateTimeField(
32
32
  verbose_name=_("Report Date"),
33
33
  validators=[datetime_not_before_study_start, datetime_not_future],
34
- default=get_utcnow,
34
+ default=timezone.now,
35
35
  help_text=_(
36
36
  "If reporting today, use today's date/time, otherwise use "
37
37
  "the date/time this information was reported."
@@ -1,10 +1,10 @@
1
1
  from django.conf import settings
2
2
  from django.db import models
3
+ from django.utils import timezone
3
4
  from django.utils.translation import gettext_lazy as _
4
5
 
5
6
  from edc_model.validators import datetime_not_future
6
7
  from edc_protocol.validators import datetime_not_before_study_start
7
- from edc_utils import get_utcnow
8
8
  from edc_visit_schedule.model_mixins import CrfScheduleModelMixin
9
9
 
10
10
  from ..base import VisitMethodsModelMixin
@@ -22,7 +22,7 @@ class VisitTrackingRequisitionModelMixin(
22
22
  report_datetime = models.DateTimeField(
23
23
  verbose_name=_("Report Date"),
24
24
  validators=[datetime_not_before_study_start, datetime_not_future],
25
- default=get_utcnow,
25
+ default=timezone.now,
26
26
  help_text=_(
27
27
  "If reporting today, use today's date/time, otherwise use "
28
28
  "the date/time this information was reported."
@@ -71,7 +71,7 @@ class SubjectVisitMissedModelMixin(models.Model):
71
71
 
72
72
  contact_attempts_explained = models.TextField(
73
73
  verbose_name=_("If contact not made and less than 3 attempts, please explain"),
74
- null=True,
74
+ default="",
75
75
  blank=True,
76
76
  )
77
77
 
@@ -105,7 +105,7 @@ class SubjectVisitMissedModelMixin(models.Model):
105
105
 
106
106
  comment = models.TextField(
107
107
  verbose_name=_("Please provide further details, if any"),
108
- null=True,
108
+ default="",
109
109
  blank=True,
110
110
  )
111
111
 
@@ -16,8 +16,7 @@ class CaretakerFieldsMixin(models.Model):
16
16
 
17
17
  information_provider = models.CharField(
18
18
  verbose_name=(
19
- "Please indicate who provided most of the "
20
- "information for this participant's visit"
19
+ "Please indicate who provided most of the information for this participant's visit"
21
20
  ),
22
21
  max_length=20,
23
22
  )
@@ -26,7 +25,7 @@ class CaretakerFieldsMixin(models.Model):
26
25
  verbose_name="if information provider is Other, please specify",
27
26
  max_length=20,
28
27
  blank=True,
29
- null=True,
28
+ default="",
30
29
  )
31
30
 
32
31
  is_present = models.CharField(
@@ -43,7 +43,7 @@ class PreviousVisitModelMixin(models.Model):
43
43
  try:
44
44
  visit_sequence.enforce_sequence()
45
45
  except VisitSequenceError as e:
46
- raise PreviousVisitError(e)
46
+ raise PreviousVisitError(e) from e
47
47
 
48
48
  @property
49
49
  def previous_visit(self: Appointment | RelatedVisitProtocol | Self) -> Any: