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,398 @@
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
+ (
10
+ "edc_action_item",
11
+ "0038_alter_actionitem_revision_alter_actiontype_revision_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name="actionitem",
18
+ name="auto_created_comment",
19
+ field=models.CharField(blank=True, default="", max_length=25),
20
+ ),
21
+ migrations.AlterField(
22
+ model_name="actionitem",
23
+ name="device_created",
24
+ field=models.CharField(
25
+ blank=True, default="", max_length=10, verbose_name="Device created"
26
+ ),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name="actionitem",
30
+ name="device_modified",
31
+ field=models.CharField(
32
+ blank=True, default="", max_length=10, verbose_name="Device modified"
33
+ ),
34
+ ),
35
+ migrations.AlterField(
36
+ model_name="actionitem",
37
+ name="instructions",
38
+ field=models.TextField(
39
+ blank=True, default="", help_text="populated by action class"
40
+ ),
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="actionitem",
44
+ name="locale_created",
45
+ field=models.CharField(
46
+ blank=True,
47
+ default="",
48
+ help_text="Auto-updated by Modeladmin",
49
+ max_length=10,
50
+ verbose_name="Locale created",
51
+ ),
52
+ ),
53
+ migrations.AlterField(
54
+ model_name="actionitem",
55
+ name="locale_modified",
56
+ field=models.CharField(
57
+ blank=True,
58
+ default="",
59
+ help_text="Auto-updated by Modeladmin",
60
+ max_length=10,
61
+ verbose_name="Locale modified",
62
+ ),
63
+ ),
64
+ migrations.AlterField(
65
+ model_name="actionitem",
66
+ name="parent_action_identifier",
67
+ field=models.CharField(
68
+ blank=True,
69
+ default="",
70
+ help_text="May be left blank. e.g. action identifier from reference model that opened the item (parent).",
71
+ max_length=50,
72
+ ),
73
+ ),
74
+ migrations.AlterField(
75
+ model_name="actionitem",
76
+ name="priority",
77
+ field=models.CharField(
78
+ blank=True,
79
+ choices=[
80
+ ("high", "High Priority"),
81
+ ("medium", "Medium Priority"),
82
+ ("low", "Low Priority"),
83
+ ],
84
+ default="",
85
+ help_text="Leave blank to use default for this action type.",
86
+ max_length=25,
87
+ ),
88
+ ),
89
+ migrations.AlterField(
90
+ model_name="actionitem",
91
+ name="related_action_identifier",
92
+ field=models.CharField(
93
+ blank=True,
94
+ default="",
95
+ help_text="May be left blank. e.g. action identifier from source model that opened the item.",
96
+ max_length=50,
97
+ ),
98
+ ),
99
+ migrations.AlterField(
100
+ model_name="actiontype",
101
+ name="device_created",
102
+ field=models.CharField(
103
+ blank=True, default="", max_length=10, verbose_name="Device created"
104
+ ),
105
+ ),
106
+ migrations.AlterField(
107
+ model_name="actiontype",
108
+ name="device_modified",
109
+ field=models.CharField(
110
+ blank=True, default="", max_length=10, verbose_name="Device modified"
111
+ ),
112
+ ),
113
+ migrations.AlterField(
114
+ model_name="actiontype",
115
+ name="instructions",
116
+ field=models.TextField(blank=True, default="", max_length=250),
117
+ ),
118
+ migrations.AlterField(
119
+ model_name="actiontype",
120
+ name="locale_created",
121
+ field=models.CharField(
122
+ blank=True,
123
+ default="",
124
+ help_text="Auto-updated by Modeladmin",
125
+ max_length=10,
126
+ verbose_name="Locale created",
127
+ ),
128
+ ),
129
+ migrations.AlterField(
130
+ model_name="actiontype",
131
+ name="locale_modified",
132
+ field=models.CharField(
133
+ blank=True,
134
+ default="",
135
+ help_text="Auto-updated by Modeladmin",
136
+ max_length=10,
137
+ verbose_name="Locale modified",
138
+ ),
139
+ ),
140
+ migrations.AlterField(
141
+ model_name="actiontype",
142
+ name="reference_model",
143
+ field=models.CharField(
144
+ blank=True, default="", help_text="reference model", max_length=100
145
+ ),
146
+ ),
147
+ migrations.AlterField(
148
+ model_name="actiontype",
149
+ name="related_reference_model",
150
+ field=models.CharField(
151
+ blank=True,
152
+ default="",
153
+ help_text="origin reference model",
154
+ max_length=100,
155
+ ),
156
+ ),
157
+ migrations.AlterField(
158
+ model_name="edcpermissions",
159
+ name="device_created",
160
+ field=models.CharField(
161
+ blank=True, default="", max_length=10, verbose_name="Device created"
162
+ ),
163
+ ),
164
+ migrations.AlterField(
165
+ model_name="edcpermissions",
166
+ name="device_modified",
167
+ field=models.CharField(
168
+ blank=True, default="", max_length=10, verbose_name="Device modified"
169
+ ),
170
+ ),
171
+ migrations.AlterField(
172
+ model_name="edcpermissions",
173
+ name="locale_created",
174
+ field=models.CharField(
175
+ blank=True,
176
+ default="",
177
+ help_text="Auto-updated by Modeladmin",
178
+ max_length=10,
179
+ verbose_name="Locale created",
180
+ ),
181
+ ),
182
+ migrations.AlterField(
183
+ model_name="edcpermissions",
184
+ name="locale_modified",
185
+ field=models.CharField(
186
+ blank=True,
187
+ default="",
188
+ help_text="Auto-updated by Modeladmin",
189
+ max_length=10,
190
+ verbose_name="Locale modified",
191
+ ),
192
+ ),
193
+ migrations.AlterField(
194
+ model_name="historicalactionitem",
195
+ name="auto_created_comment",
196
+ field=models.CharField(blank=True, default="", max_length=25),
197
+ ),
198
+ migrations.AlterField(
199
+ model_name="historicalactionitem",
200
+ name="device_created",
201
+ field=models.CharField(
202
+ blank=True, default="", max_length=10, verbose_name="Device created"
203
+ ),
204
+ ),
205
+ migrations.AlterField(
206
+ model_name="historicalactionitem",
207
+ name="device_modified",
208
+ field=models.CharField(
209
+ blank=True, default="", max_length=10, verbose_name="Device modified"
210
+ ),
211
+ ),
212
+ migrations.AlterField(
213
+ model_name="historicalactionitem",
214
+ name="instructions",
215
+ field=models.TextField(
216
+ blank=True, default="", help_text="populated by action class"
217
+ ),
218
+ ),
219
+ migrations.AlterField(
220
+ model_name="historicalactionitem",
221
+ name="locale_created",
222
+ field=models.CharField(
223
+ blank=True,
224
+ default="",
225
+ help_text="Auto-updated by Modeladmin",
226
+ max_length=10,
227
+ verbose_name="Locale created",
228
+ ),
229
+ ),
230
+ migrations.AlterField(
231
+ model_name="historicalactionitem",
232
+ name="locale_modified",
233
+ field=models.CharField(
234
+ blank=True,
235
+ default="",
236
+ help_text="Auto-updated by Modeladmin",
237
+ max_length=10,
238
+ verbose_name="Locale modified",
239
+ ),
240
+ ),
241
+ migrations.AlterField(
242
+ model_name="historicalactionitem",
243
+ name="parent_action_identifier",
244
+ field=models.CharField(
245
+ blank=True,
246
+ default="",
247
+ help_text="May be left blank. e.g. action identifier from reference model that opened the item (parent).",
248
+ max_length=50,
249
+ ),
250
+ ),
251
+ migrations.AlterField(
252
+ model_name="historicalactionitem",
253
+ name="priority",
254
+ field=models.CharField(
255
+ blank=True,
256
+ choices=[
257
+ ("high", "High Priority"),
258
+ ("medium", "Medium Priority"),
259
+ ("low", "Low Priority"),
260
+ ],
261
+ default="",
262
+ help_text="Leave blank to use default for this action type.",
263
+ max_length=25,
264
+ ),
265
+ ),
266
+ migrations.AlterField(
267
+ model_name="historicalactionitem",
268
+ name="related_action_identifier",
269
+ field=models.CharField(
270
+ blank=True,
271
+ default="",
272
+ help_text="May be left blank. e.g. action identifier from source model that opened the item.",
273
+ max_length=50,
274
+ ),
275
+ ),
276
+ migrations.AlterField(
277
+ model_name="historicalreference",
278
+ name="action_item_reason",
279
+ field=models.TextField(default="", editable=False),
280
+ ),
281
+ migrations.AlterField(
282
+ model_name="historicalreference",
283
+ name="device_created",
284
+ field=models.CharField(
285
+ blank=True, default="", max_length=10, verbose_name="Device created"
286
+ ),
287
+ ),
288
+ migrations.AlterField(
289
+ model_name="historicalreference",
290
+ name="device_modified",
291
+ field=models.CharField(
292
+ blank=True, default="", max_length=10, verbose_name="Device modified"
293
+ ),
294
+ ),
295
+ migrations.AlterField(
296
+ model_name="historicalreference",
297
+ name="locale_created",
298
+ field=models.CharField(
299
+ blank=True,
300
+ default="",
301
+ help_text="Auto-updated by Modeladmin",
302
+ max_length=10,
303
+ verbose_name="Locale created",
304
+ ),
305
+ ),
306
+ migrations.AlterField(
307
+ model_name="historicalreference",
308
+ name="locale_modified",
309
+ field=models.CharField(
310
+ blank=True,
311
+ default="",
312
+ help_text="Auto-updated by Modeladmin",
313
+ max_length=10,
314
+ verbose_name="Locale modified",
315
+ ),
316
+ ),
317
+ migrations.AlterField(
318
+ model_name="historicalreference",
319
+ name="parent_action_identifier",
320
+ field=models.CharField(
321
+ blank=True,
322
+ default="",
323
+ help_text="action identifier that links to parent reference model instance.",
324
+ max_length=30,
325
+ ),
326
+ ),
327
+ migrations.AlterField(
328
+ model_name="historicalreference",
329
+ name="related_action_identifier",
330
+ field=models.CharField(
331
+ blank=True,
332
+ default="",
333
+ help_text="action identifier that links to related reference model instance.",
334
+ max_length=30,
335
+ ),
336
+ ),
337
+ migrations.AlterField(
338
+ model_name="reference",
339
+ name="action_item_reason",
340
+ field=models.TextField(default="", editable=False),
341
+ ),
342
+ migrations.AlterField(
343
+ model_name="reference",
344
+ name="device_created",
345
+ field=models.CharField(
346
+ blank=True, default="", max_length=10, verbose_name="Device created"
347
+ ),
348
+ ),
349
+ migrations.AlterField(
350
+ model_name="reference",
351
+ name="device_modified",
352
+ field=models.CharField(
353
+ blank=True, default="", max_length=10, verbose_name="Device modified"
354
+ ),
355
+ ),
356
+ migrations.AlterField(
357
+ model_name="reference",
358
+ name="locale_created",
359
+ field=models.CharField(
360
+ blank=True,
361
+ default="",
362
+ help_text="Auto-updated by Modeladmin",
363
+ max_length=10,
364
+ verbose_name="Locale created",
365
+ ),
366
+ ),
367
+ migrations.AlterField(
368
+ model_name="reference",
369
+ name="locale_modified",
370
+ field=models.CharField(
371
+ blank=True,
372
+ default="",
373
+ help_text="Auto-updated by Modeladmin",
374
+ max_length=10,
375
+ verbose_name="Locale modified",
376
+ ),
377
+ ),
378
+ migrations.AlterField(
379
+ model_name="reference",
380
+ name="parent_action_identifier",
381
+ field=models.CharField(
382
+ blank=True,
383
+ default="",
384
+ help_text="action identifier that links to parent reference model instance.",
385
+ max_length=30,
386
+ ),
387
+ ),
388
+ migrations.AlterField(
389
+ model_name="reference",
390
+ name="related_action_identifier",
391
+ field=models.CharField(
392
+ blank=True,
393
+ default="",
394
+ help_text="action identifier that links to related reference model instance.",
395
+ max_length=30,
396
+ ),
397
+ ),
398
+ ]
@@ -0,0 +1,34 @@
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_action_item", "0039_alter_actionitem_auto_created_comment_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="actionitem",
16
+ name="report_datetime",
17
+ field=models.DateTimeField(default=django.utils.timezone.now),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="historicalactionitem",
21
+ name="report_datetime",
22
+ field=models.DateTimeField(default=django.utils.timezone.now),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="historicalreference",
26
+ name="report_datetime",
27
+ field=models.DateTimeField(default=django.utils.timezone.now),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="reference",
31
+ name="report_datetime",
32
+ field=models.DateTimeField(default=django.utils.timezone.now),
33
+ ),
34
+ ]
@@ -7,6 +7,7 @@ from django.apps import apps as django_apps
7
7
  from django.core.exceptions import ObjectDoesNotExist
8
8
  from django.db import models
9
9
  from django.db.models.deletion import PROTECT
10
+ from django.utils import timezone
10
11
 
11
12
  from edc_constants.constants import CANCELLED, NEW
12
13
  from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
@@ -14,7 +15,6 @@ from edc_model.models import BaseUuidModel, HistoricalRecords
14
15
  from edc_notification.model_mixins import NotificationModelMixin
15
16
  from edc_sites.managers import CurrentSiteManager as BaseCurrentSiteManager
16
17
  from edc_sites.model_mixins import SiteModelMixin
17
- from edc_utils import get_utcnow
18
18
 
19
19
  from ..choices import ACTION_STATUS, PRIORITY
20
20
  from ..exceptions import ActionItemStatusError, SubjectDoesNotExist
@@ -76,7 +76,7 @@ class ActionItem(
76
76
 
77
77
  action_identifier = models.CharField(max_length=50, unique=True)
78
78
 
79
- report_datetime = models.DateTimeField(default=get_utcnow)
79
+ report_datetime = models.DateTimeField(default=timezone.now)
80
80
 
81
81
  action_type = models.ForeignKey(
82
82
  ActionType, on_delete=PROTECT, related_name="action_type", verbose_name="Action"
@@ -101,6 +101,7 @@ class ActionItem(
101
101
  related_action_identifier = models.CharField(
102
102
  max_length=50,
103
103
  blank=True,
104
+ default="",
104
105
  help_text=(
105
106
  "May be left blank. e.g. action identifier from source model that opened the item."
106
107
  ),
@@ -109,6 +110,7 @@ class ActionItem(
109
110
  parent_action_identifier = models.CharField(
110
111
  max_length=50,
111
112
  blank=True,
113
+ default="",
112
114
  help_text=(
113
115
  "May be left blank. e.g. action identifier from "
114
116
  "reference model that opened the item (parent)."
@@ -119,6 +121,7 @@ class ActionItem(
119
121
  max_length=25,
120
122
  choices=PRIORITY,
121
123
  blank=True,
124
+ default="",
122
125
  help_text="Leave blank to use default for this action type.",
123
126
  )
124
127
 
@@ -142,11 +145,13 @@ class ActionItem(
142
145
 
143
146
  status = models.CharField(max_length=25, default=NEW, choices=ACTION_STATUS)
144
147
 
145
- instructions = models.TextField(blank=True, help_text="populated by action class")
148
+ instructions = models.TextField(
149
+ blank=True, default="", help_text="populated by action class"
150
+ )
146
151
 
147
152
  auto_created = models.BooleanField(default=False)
148
153
 
149
- auto_created_comment = models.CharField(max_length=25, blank=True)
154
+ auto_created_comment = models.CharField(max_length=25, blank=True, default="")
150
155
 
151
156
  objects = ActionItemManager()
152
157
 
@@ -23,7 +23,7 @@ class ActionNoManagersModelMixin(models.Model):
23
23
 
24
24
  subject_dashboard_url: str = "subject_dashboard_url"
25
25
 
26
- action_identifier = models.CharField(max_length=50, unique=True, null=True, blank=True)
26
+ action_identifier = models.CharField(max_length=50, unique=True, default="", blank=True)
27
27
 
28
28
  action_item = models.ForeignKey(ActionItem, null=True, blank=True, on_delete=PROTECT)
29
29
 
@@ -38,7 +38,7 @@ class ActionNoManagersModelMixin(models.Model):
38
38
  # remove
39
39
  parent_action_identifier = models.CharField(
40
40
  max_length=30,
41
- null=True,
41
+ default="",
42
42
  blank=True,
43
43
  help_text="action identifier that links to parent reference model instance.",
44
44
  )
@@ -46,12 +46,12 @@ class ActionNoManagersModelMixin(models.Model):
46
46
  # remove
47
47
  related_action_identifier = models.CharField(
48
48
  max_length=30,
49
- null=True,
49
+ default="",
50
50
  blank=True,
51
51
  help_text="action identifier that links to related reference model instance.",
52
52
  )
53
53
 
54
- action_item_reason = models.TextField(null=True, editable=False)
54
+ action_item_reason = models.TextField(default="", editable=False)
55
55
 
56
56
  class Meta:
57
57
  abstract = True
@@ -1,9 +1,9 @@
1
1
  from django.db import models
2
2
  from django.db.models.deletion import PROTECT
3
+ from django.utils import timezone
3
4
 
4
5
  from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
5
6
  from edc_model.models import BaseUuidModel
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from .action_model_mixin import ActionModelMixin
9
9
  from .action_type import ActionType
@@ -24,7 +24,7 @@ class Reference(NonUniqueSubjectIdentifierFieldMixin, ActionModelMixin, BaseUuid
24
24
 
25
25
  action_identifier = models.CharField(max_length=25, unique=True)
26
26
 
27
- report_datetime = models.DateTimeField(default=get_utcnow)
27
+ report_datetime = models.DateTimeField(default=timezone.now)
28
28
 
29
29
  action_type = models.ForeignKey(
30
30
  ActionType, on_delete=PROTECT, related_name="action", verbose_name="Action"
@@ -5,7 +5,7 @@ from django.core.management.color import color_style
5
5
  style = color_style()
6
6
 
7
7
 
8
- def update_action_types(sender=None, verbose=None, **kwargs): # noqa
8
+ def update_action_types(sender=None, verbose=None, **kwargs):
9
9
  from .site_action_items import site_action_items
10
10
 
11
11
  sys.stdout.write(style.MIGRATE_HEADING("Updating action types:\n"))
@@ -1,85 +0,0 @@
1
- # import sys
2
- #
3
- # from django.conf import settings
4
- # from django.utils.safestring import mark_safe
5
- # from django.core.mail.message import EmailMessage
6
- # from edc_utils import get_utcnow
7
- #
8
- # NEW_REPORT = 'new_report'
9
- # UPDATED_REPORT = 'updated_report'
10
- #
11
- # message_templates = {
12
- # NEW_REPORT: (
13
- # 'Do not reply to this email\n\n'
14
- # '{test_message}'
15
- # 'A report has been submitted for patient '
16
- # '{action_item.subject_identifier} '
17
- # 'at site {action_item.site} which may require '
18
- # 'your attention.\n\n'
19
- # 'Title: {action_item.action_type.display_name}\n\n'
20
- # 'You received this message because you are listed as a '
21
- # 'member the Ambition Trial TMG\n\n'
22
- # '{test_message}'
23
- # 'Thanks.'),
24
- # UPDATED_REPORT: (
25
- # 'Do not reply to this email\n\n'
26
- # '{test_message}'
27
- # 'A report has been updated for patient '
28
- # '{action_item.subject_identifier} '
29
- # 'at site {action_item.site} which may require '
30
- # 'your attention.\n\n'
31
- # 'Title: {action_item.action_type.display_name}\n\n'
32
- # 'Reason: {reason}\n\n'
33
- # 'You received this message because you are listed as a '
34
- # 'member the Ambition Trial TMG\n\n'
35
- # '{test_message}'
36
- # 'Thanks.')
37
- # }
38
- #
39
- #
40
- # def send_email(action_item=None, reason=None, template_name=None,
41
- # force_send=None, using=None):
42
- # # if template_name:
43
- # # print('send_email', f'action_item={action_item}',
44
- # # f'reason={reason}', f'template_name={template_name}')
45
- # # else:
46
- # # print('send_email', f'action_item={action_item}')
47
- # return None
48
- #
49
- # if 'migrate' not in sys.argv:
50
- # template_name = template_name or 'new_report'
51
- # updated = '*UPDATE* ' if template_name == 'updated_report' else ''
52
- # email_recipients = action_item.action_cls.email_recipients
53
- # try:
54
- # email_enabled = settings.EMAIL_ENABLED
55
- # except AttributeError:
56
- # email_enabled = False
57
- # if email_enabled and email_recipients and (
58
- # not action_item.emailed or force_send):
59
- # test_message = ''
60
- # test_subject = ''
61
- # try:
62
- # live_system = settings.LIVE_SYSTEM
63
- # except AttributeError:
64
- # live_system = False
65
- # if not live_system:
66
- # test_message = 'THIS IS A TEST MESSAGE. NO ACTION IS REQUIRED\n\n'
67
- # test_subject = 'TEST/UAT -- '
68
- # from_email = settings.EMAIL_CONTACTS.get('data_manager')
69
- # message = message_templates[template_name].format(
70
- # test_message=test_message,
71
- # action_item=action_item,
72
- # reason=reason)
73
- # body = [mark_safe(message)]
74
- # email_message = EmailMessage(
75
- # subject=(
76
- # f'{test_subject}{updated}Ambition: '
77
- # f'{action_item.action_type.display_name} '
78
- # f'for {action_item.subject_identifier}'),
79
- # body='\n\n'.join(body),
80
- # from_email=from_email,
81
- # to=email_recipients)
82
- # email_message.send()
83
- # action_item.emailed = True
84
- # action_item.emailed_datetime = get_utcnow()
85
- # action_item.save(using=using)
@@ -0,0 +1,36 @@
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_adherence", "0004_alter_nonadherencereasons_options_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="nonadherencereasons",
15
+ name="extra_value",
16
+ field=models.CharField(default="", max_length=250),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name="nonadherencereasons",
20
+ name="field_name",
21
+ field=models.CharField(
22
+ blank=True,
23
+ default="",
24
+ editable=False,
25
+ help_text="Not required",
26
+ max_length=25,
27
+ ),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="nonadherencereasons",
31
+ name="plural_name",
32
+ field=models.CharField(
33
+ default="", max_length=250, verbose_name="Plural name"
34
+ ),
35
+ ),
36
+ ]
@@ -41,7 +41,7 @@ class MedicationAdherenceModelMixin(models.Model):
41
41
 
42
42
  pill_count_not_performed_reason = models.TextField(
43
43
  verbose_name="If not performed, please explain ...",
44
- null=True,
44
+ default="",
45
45
  blank=True,
46
46
  )
47
47