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,611 @@
1
+ # Generated by Django 5.2.6 on 2025-09-17 16:53
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("edc_export", "0021_alter_datarequest_revision_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="datarequest",
15
+ name="description",
16
+ field=models.TextField(default=""),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name="datarequest",
20
+ name="device_created",
21
+ field=models.CharField(
22
+ blank=True, default="", max_length=10, verbose_name="Device created"
23
+ ),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="datarequest",
27
+ name="device_modified",
28
+ field=models.CharField(
29
+ blank=True, default="", max_length=10, verbose_name="Device modified"
30
+ ),
31
+ ),
32
+ migrations.AlterField(
33
+ model_name="datarequest",
34
+ name="locale_created",
35
+ field=models.CharField(
36
+ blank=True,
37
+ default="",
38
+ help_text="Auto-updated by Modeladmin",
39
+ max_length=10,
40
+ verbose_name="Locale created",
41
+ ),
42
+ ),
43
+ migrations.AlterField(
44
+ model_name="datarequest",
45
+ name="locale_modified",
46
+ field=models.CharField(
47
+ blank=True,
48
+ default="",
49
+ help_text="Auto-updated by Modeladmin",
50
+ max_length=10,
51
+ verbose_name="Locale modified",
52
+ ),
53
+ ),
54
+ migrations.AlterField(
55
+ model_name="datarequest",
56
+ name="models",
57
+ field=models.TextField(
58
+ default="",
59
+ help_text='List one table per line, no commas. Use "label lower" format.',
60
+ ),
61
+ ),
62
+ migrations.AlterField(
63
+ model_name="datarequesthistory",
64
+ name="device_created",
65
+ field=models.CharField(
66
+ blank=True, default="", max_length=10, verbose_name="Device created"
67
+ ),
68
+ ),
69
+ migrations.AlterField(
70
+ model_name="datarequesthistory",
71
+ name="device_modified",
72
+ field=models.CharField(
73
+ blank=True, default="", max_length=10, verbose_name="Device modified"
74
+ ),
75
+ ),
76
+ migrations.AlterField(
77
+ model_name="datarequesthistory",
78
+ name="locale_created",
79
+ field=models.CharField(
80
+ blank=True,
81
+ default="",
82
+ help_text="Auto-updated by Modeladmin",
83
+ max_length=10,
84
+ verbose_name="Locale created",
85
+ ),
86
+ ),
87
+ migrations.AlterField(
88
+ model_name="datarequesthistory",
89
+ name="locale_modified",
90
+ field=models.CharField(
91
+ blank=True,
92
+ default="",
93
+ help_text="Auto-updated by Modeladmin",
94
+ max_length=10,
95
+ verbose_name="Locale modified",
96
+ ),
97
+ ),
98
+ migrations.AlterField(
99
+ model_name="datarequesthistory",
100
+ name="summary",
101
+ field=models.TextField(default=""),
102
+ ),
103
+ migrations.AlterField(
104
+ model_name="edcpermissions",
105
+ name="device_created",
106
+ field=models.CharField(
107
+ blank=True, default="", max_length=10, verbose_name="Device created"
108
+ ),
109
+ ),
110
+ migrations.AlterField(
111
+ model_name="edcpermissions",
112
+ name="device_modified",
113
+ field=models.CharField(
114
+ blank=True, default="", max_length=10, verbose_name="Device modified"
115
+ ),
116
+ ),
117
+ migrations.AlterField(
118
+ model_name="edcpermissions",
119
+ name="locale_created",
120
+ field=models.CharField(
121
+ blank=True,
122
+ default="",
123
+ help_text="Auto-updated by Modeladmin",
124
+ max_length=10,
125
+ verbose_name="Locale created",
126
+ ),
127
+ ),
128
+ migrations.AlterField(
129
+ model_name="edcpermissions",
130
+ name="locale_modified",
131
+ field=models.CharField(
132
+ blank=True,
133
+ default="",
134
+ help_text="Auto-updated by Modeladmin",
135
+ max_length=10,
136
+ verbose_name="Locale modified",
137
+ ),
138
+ ),
139
+ migrations.AlterField(
140
+ model_name="exportreceipt",
141
+ name="device_created",
142
+ field=models.CharField(
143
+ blank=True, default="", max_length=10, verbose_name="Device created"
144
+ ),
145
+ ),
146
+ migrations.AlterField(
147
+ model_name="exportreceipt",
148
+ name="device_modified",
149
+ field=models.CharField(
150
+ blank=True, default="", max_length=10, verbose_name="Device modified"
151
+ ),
152
+ ),
153
+ migrations.AlterField(
154
+ model_name="exportreceipt",
155
+ name="locale_created",
156
+ field=models.CharField(
157
+ blank=True,
158
+ default="",
159
+ help_text="Auto-updated by Modeladmin",
160
+ max_length=10,
161
+ verbose_name="Locale created",
162
+ ),
163
+ ),
164
+ migrations.AlterField(
165
+ model_name="exportreceipt",
166
+ name="locale_modified",
167
+ field=models.CharField(
168
+ blank=True,
169
+ default="",
170
+ help_text="Auto-updated by Modeladmin",
171
+ max_length=10,
172
+ verbose_name="Locale modified",
173
+ ),
174
+ ),
175
+ migrations.AlterField(
176
+ model_name="filehistory",
177
+ name="device_created",
178
+ field=models.CharField(
179
+ blank=True, default="", max_length=10, verbose_name="Device created"
180
+ ),
181
+ ),
182
+ migrations.AlterField(
183
+ model_name="filehistory",
184
+ name="device_modified",
185
+ field=models.CharField(
186
+ blank=True, default="", max_length=10, verbose_name="Device modified"
187
+ ),
188
+ ),
189
+ migrations.AlterField(
190
+ model_name="filehistory",
191
+ name="export_uuid_list",
192
+ field=models.TextField(
193
+ default="",
194
+ help_text="list of export_uuid's of model app_label.model_name",
195
+ ),
196
+ ),
197
+ migrations.AlterField(
198
+ model_name="filehistory",
199
+ name="file_contents",
200
+ field=models.TextField(
201
+ default="", help_text="save contents of file as a list of rows"
202
+ ),
203
+ ),
204
+ migrations.AlterField(
205
+ model_name="filehistory",
206
+ name="locale_created",
207
+ field=models.CharField(
208
+ blank=True,
209
+ default="",
210
+ help_text="Auto-updated by Modeladmin",
211
+ max_length=10,
212
+ verbose_name="Locale created",
213
+ ),
214
+ ),
215
+ migrations.AlterField(
216
+ model_name="filehistory",
217
+ name="locale_modified",
218
+ field=models.CharField(
219
+ blank=True,
220
+ default="",
221
+ help_text="Auto-updated by Modeladmin",
222
+ max_length=10,
223
+ verbose_name="Locale modified",
224
+ ),
225
+ ),
226
+ migrations.AlterField(
227
+ model_name="filehistory",
228
+ name="notification_plan_name",
229
+ field=models.CharField(default="", max_length=50),
230
+ ),
231
+ migrations.AlterField(
232
+ model_name="filehistory",
233
+ name="pk_list",
234
+ field=models.TextField(
235
+ default="", help_text="list of pk's of model app_label.model_name"
236
+ ),
237
+ ),
238
+ migrations.AlterField(
239
+ model_name="historicaldatarequest",
240
+ name="description",
241
+ field=models.TextField(default=""),
242
+ ),
243
+ migrations.AlterField(
244
+ model_name="historicaldatarequest",
245
+ name="device_created",
246
+ field=models.CharField(
247
+ blank=True, default="", max_length=10, verbose_name="Device created"
248
+ ),
249
+ ),
250
+ migrations.AlterField(
251
+ model_name="historicaldatarequest",
252
+ name="device_modified",
253
+ field=models.CharField(
254
+ blank=True, default="", max_length=10, verbose_name="Device modified"
255
+ ),
256
+ ),
257
+ migrations.AlterField(
258
+ model_name="historicaldatarequest",
259
+ name="locale_created",
260
+ field=models.CharField(
261
+ blank=True,
262
+ default="",
263
+ help_text="Auto-updated by Modeladmin",
264
+ max_length=10,
265
+ verbose_name="Locale created",
266
+ ),
267
+ ),
268
+ migrations.AlterField(
269
+ model_name="historicaldatarequest",
270
+ name="locale_modified",
271
+ field=models.CharField(
272
+ blank=True,
273
+ default="",
274
+ help_text="Auto-updated by Modeladmin",
275
+ max_length=10,
276
+ verbose_name="Locale modified",
277
+ ),
278
+ ),
279
+ migrations.AlterField(
280
+ model_name="historicaldatarequest",
281
+ name="models",
282
+ field=models.TextField(
283
+ default="",
284
+ help_text='List one table per line, no commas. Use "label lower" format.',
285
+ ),
286
+ ),
287
+ migrations.AlterField(
288
+ model_name="historicalexportreceipt",
289
+ name="device_created",
290
+ field=models.CharField(
291
+ blank=True, default="", max_length=10, verbose_name="Device created"
292
+ ),
293
+ ),
294
+ migrations.AlterField(
295
+ model_name="historicalexportreceipt",
296
+ name="device_modified",
297
+ field=models.CharField(
298
+ blank=True, default="", max_length=10, verbose_name="Device modified"
299
+ ),
300
+ ),
301
+ migrations.AlterField(
302
+ model_name="historicalexportreceipt",
303
+ name="locale_created",
304
+ field=models.CharField(
305
+ blank=True,
306
+ default="",
307
+ help_text="Auto-updated by Modeladmin",
308
+ max_length=10,
309
+ verbose_name="Locale created",
310
+ ),
311
+ ),
312
+ migrations.AlterField(
313
+ model_name="historicalexportreceipt",
314
+ name="locale_modified",
315
+ field=models.CharField(
316
+ blank=True,
317
+ default="",
318
+ help_text="Auto-updated by Modeladmin",
319
+ max_length=10,
320
+ verbose_name="Locale modified",
321
+ ),
322
+ ),
323
+ migrations.AlterField(
324
+ model_name="historicalfilehistory",
325
+ name="device_created",
326
+ field=models.CharField(
327
+ blank=True, default="", max_length=10, verbose_name="Device created"
328
+ ),
329
+ ),
330
+ migrations.AlterField(
331
+ model_name="historicalfilehistory",
332
+ name="device_modified",
333
+ field=models.CharField(
334
+ blank=True, default="", max_length=10, verbose_name="Device modified"
335
+ ),
336
+ ),
337
+ migrations.AlterField(
338
+ model_name="historicalfilehistory",
339
+ name="export_uuid_list",
340
+ field=models.TextField(
341
+ default="",
342
+ help_text="list of export_uuid's of model app_label.model_name",
343
+ ),
344
+ ),
345
+ migrations.AlterField(
346
+ model_name="historicalfilehistory",
347
+ name="file_contents",
348
+ field=models.TextField(
349
+ default="", help_text="save contents of file as a list of rows"
350
+ ),
351
+ ),
352
+ migrations.AlterField(
353
+ model_name="historicalfilehistory",
354
+ name="locale_created",
355
+ field=models.CharField(
356
+ blank=True,
357
+ default="",
358
+ help_text="Auto-updated by Modeladmin",
359
+ max_length=10,
360
+ verbose_name="Locale created",
361
+ ),
362
+ ),
363
+ migrations.AlterField(
364
+ model_name="historicalfilehistory",
365
+ name="locale_modified",
366
+ field=models.CharField(
367
+ blank=True,
368
+ default="",
369
+ help_text="Auto-updated by Modeladmin",
370
+ max_length=10,
371
+ verbose_name="Locale modified",
372
+ ),
373
+ ),
374
+ migrations.AlterField(
375
+ model_name="historicalfilehistory",
376
+ name="notification_plan_name",
377
+ field=models.CharField(default="", max_length=50),
378
+ ),
379
+ migrations.AlterField(
380
+ model_name="historicalfilehistory",
381
+ name="pk_list",
382
+ field=models.TextField(
383
+ default="", help_text="list of pk's of model app_label.model_name"
384
+ ),
385
+ ),
386
+ migrations.AlterField(
387
+ model_name="historicalobjecthistory",
388
+ name="device_created",
389
+ field=models.CharField(
390
+ blank=True, default="", max_length=10, verbose_name="Device created"
391
+ ),
392
+ ),
393
+ migrations.AlterField(
394
+ model_name="historicalobjecthistory",
395
+ name="device_modified",
396
+ field=models.CharField(
397
+ blank=True, default="", max_length=10, verbose_name="Device modified"
398
+ ),
399
+ ),
400
+ migrations.AlterField(
401
+ model_name="historicalobjecthistory",
402
+ name="locale_created",
403
+ field=models.CharField(
404
+ blank=True,
405
+ default="",
406
+ help_text="Auto-updated by Modeladmin",
407
+ max_length=10,
408
+ verbose_name="Locale created",
409
+ ),
410
+ ),
411
+ migrations.AlterField(
412
+ model_name="historicalobjecthistory",
413
+ name="locale_modified",
414
+ field=models.CharField(
415
+ blank=True,
416
+ default="",
417
+ help_text="Auto-updated by Modeladmin",
418
+ max_length=10,
419
+ verbose_name="Locale modified",
420
+ ),
421
+ ),
422
+ migrations.AlterField(
423
+ model_name="historicalplan",
424
+ name="device_created",
425
+ field=models.CharField(
426
+ blank=True, default="", max_length=10, verbose_name="Device created"
427
+ ),
428
+ ),
429
+ migrations.AlterField(
430
+ model_name="historicalplan",
431
+ name="device_modified",
432
+ field=models.CharField(
433
+ blank=True, default="", max_length=10, verbose_name="Device modified"
434
+ ),
435
+ ),
436
+ migrations.AlterField(
437
+ model_name="historicalplan",
438
+ name="excluded_field_names",
439
+ field=models.TextField(blank=True, default="", max_length=500),
440
+ ),
441
+ migrations.AlterField(
442
+ model_name="historicalplan",
443
+ name="field_names",
444
+ field=models.TextField(blank=True, default="", max_length=500),
445
+ ),
446
+ migrations.AlterField(
447
+ model_name="historicalplan",
448
+ name="header_labels",
449
+ field=models.TextField(blank=True, default="", max_length=500),
450
+ ),
451
+ migrations.AlterField(
452
+ model_name="historicalplan",
453
+ name="locale_created",
454
+ field=models.CharField(
455
+ blank=True,
456
+ default="",
457
+ help_text="Auto-updated by Modeladmin",
458
+ max_length=10,
459
+ verbose_name="Locale created",
460
+ ),
461
+ ),
462
+ migrations.AlterField(
463
+ model_name="historicalplan",
464
+ name="locale_modified",
465
+ field=models.CharField(
466
+ blank=True,
467
+ default="",
468
+ help_text="Auto-updated by Modeladmin",
469
+ max_length=10,
470
+ verbose_name="Locale modified",
471
+ ),
472
+ ),
473
+ migrations.AlterField(
474
+ model_name="historicalplan",
475
+ name="lookups",
476
+ field=models.TextField(blank=True, default="", max_length=500),
477
+ ),
478
+ migrations.AlterField(
479
+ model_name="objecthistory",
480
+ name="device_created",
481
+ field=models.CharField(
482
+ blank=True, default="", max_length=10, verbose_name="Device created"
483
+ ),
484
+ ),
485
+ migrations.AlterField(
486
+ model_name="objecthistory",
487
+ name="device_modified",
488
+ field=models.CharField(
489
+ blank=True, default="", max_length=10, verbose_name="Device modified"
490
+ ),
491
+ ),
492
+ migrations.AlterField(
493
+ model_name="objecthistory",
494
+ name="locale_created",
495
+ field=models.CharField(
496
+ blank=True,
497
+ default="",
498
+ help_text="Auto-updated by Modeladmin",
499
+ max_length=10,
500
+ verbose_name="Locale created",
501
+ ),
502
+ ),
503
+ migrations.AlterField(
504
+ model_name="objecthistory",
505
+ name="locale_modified",
506
+ field=models.CharField(
507
+ blank=True,
508
+ default="",
509
+ help_text="Auto-updated by Modeladmin",
510
+ max_length=10,
511
+ verbose_name="Locale modified",
512
+ ),
513
+ ),
514
+ migrations.AlterField(
515
+ model_name="plan",
516
+ name="device_created",
517
+ field=models.CharField(
518
+ blank=True, default="", max_length=10, verbose_name="Device created"
519
+ ),
520
+ ),
521
+ migrations.AlterField(
522
+ model_name="plan",
523
+ name="device_modified",
524
+ field=models.CharField(
525
+ blank=True, default="", max_length=10, verbose_name="Device modified"
526
+ ),
527
+ ),
528
+ migrations.AlterField(
529
+ model_name="plan",
530
+ name="excluded_field_names",
531
+ field=models.TextField(blank=True, default="", max_length=500),
532
+ ),
533
+ migrations.AlterField(
534
+ model_name="plan",
535
+ name="field_names",
536
+ field=models.TextField(blank=True, default="", max_length=500),
537
+ ),
538
+ migrations.AlterField(
539
+ model_name="plan",
540
+ name="header_labels",
541
+ field=models.TextField(blank=True, default="", max_length=500),
542
+ ),
543
+ migrations.AlterField(
544
+ model_name="plan",
545
+ name="locale_created",
546
+ field=models.CharField(
547
+ blank=True,
548
+ default="",
549
+ help_text="Auto-updated by Modeladmin",
550
+ max_length=10,
551
+ verbose_name="Locale created",
552
+ ),
553
+ ),
554
+ migrations.AlterField(
555
+ model_name="plan",
556
+ name="locale_modified",
557
+ field=models.CharField(
558
+ blank=True,
559
+ default="",
560
+ help_text="Auto-updated by Modeladmin",
561
+ max_length=10,
562
+ verbose_name="Locale modified",
563
+ ),
564
+ ),
565
+ migrations.AlterField(
566
+ model_name="plan",
567
+ name="lookups",
568
+ field=models.TextField(blank=True, default="", max_length=500),
569
+ ),
570
+ migrations.AlterField(
571
+ model_name="uploadexportreceiptfile",
572
+ name="device_created",
573
+ field=models.CharField(
574
+ blank=True, default="", max_length=10, verbose_name="Device created"
575
+ ),
576
+ ),
577
+ migrations.AlterField(
578
+ model_name="uploadexportreceiptfile",
579
+ name="device_modified",
580
+ field=models.CharField(
581
+ blank=True, default="", max_length=10, verbose_name="Device modified"
582
+ ),
583
+ ),
584
+ migrations.AlterField(
585
+ model_name="uploadexportreceiptfile",
586
+ name="errors",
587
+ field=models.TextField(default="", editable=False),
588
+ ),
589
+ migrations.AlterField(
590
+ model_name="uploadexportreceiptfile",
591
+ name="locale_created",
592
+ field=models.CharField(
593
+ blank=True,
594
+ default="",
595
+ help_text="Auto-updated by Modeladmin",
596
+ max_length=10,
597
+ verbose_name="Locale created",
598
+ ),
599
+ ),
600
+ migrations.AlterField(
601
+ model_name="uploadexportreceiptfile",
602
+ name="locale_modified",
603
+ field=models.CharField(
604
+ blank=True,
605
+ default="",
606
+ help_text="Auto-updated by Modeladmin",
607
+ max_length=10,
608
+ verbose_name="Locale modified",
609
+ ),
610
+ ),
611
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 5.2.6 on 2025-09-18 00:24
2
+
3
+ import django.utils.timezone
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("edc_export", "0022_alter_datarequest_description_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="datarequesthistory",
16
+ name="archive_filename",
17
+ field=models.CharField(default="", max_length=200),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="datarequesthistory",
21
+ name="emailed_to",
22
+ field=models.EmailField(default="", max_length=254),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="datarequesthistory",
26
+ name="exported_datetime",
27
+ field=models.DateTimeField(default=django.utils.timezone.now),
28
+ ),
29
+ ]
@@ -1,8 +1,8 @@
1
1
  import csv
2
+ from pathlib import Path
2
3
 
3
4
  from django.apps import apps as django_apps
4
-
5
- from edc_utils import get_utcnow
5
+ from django.utils import timezone
6
6
 
7
7
 
8
8
  class FileHistoryUpdater:
@@ -10,15 +10,15 @@ class FileHistoryUpdater:
10
10
 
11
11
  def __init__(
12
12
  self,
13
- model=None,
14
- filename=None,
15
- notification_plan_name=None,
16
- path=None,
17
- delimiter=None,
13
+ path: Path,
14
+ delimiter: str,
15
+ model: str,
16
+ filename: str,
17
+ notification_plan_name: str | None = None,
18
18
  ):
19
19
  self.model = model
20
20
  self.filename = filename
21
- self.notification_plan_name = notification_plan_name
21
+ self.notification_plan_name = notification_plan_name or "Notification plan"
22
22
  self.path = path
23
23
  self.delimiter = delimiter
24
24
 
@@ -29,7 +29,7 @@ class FileHistoryUpdater:
29
29
  def update(self):
30
30
  exported_pks = []
31
31
  export_uuids = []
32
- with open(self.path) as f:
32
+ with self.path.open("r") as f:
33
33
  csv_reader = csv.DictReader(f, delimiter=self.delimiter)
34
34
  for row in csv_reader:
35
35
  exported_pks.append(row["id"])
@@ -39,7 +39,7 @@ class FileHistoryUpdater:
39
39
  pk_list="|".join(exported_pks),
40
40
  export_uuid_list="|".join(export_uuids),
41
41
  exported=True,
42
- exported_datetime=get_utcnow(),
42
+ exported_datetime=timezone.now(),
43
43
  filename=self.filename,
44
44
  notification_plan_name=self.notification_plan_name,
45
45
  )