clinicedc 2.0.5__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 (387) hide show
  1. {clinicedc-2.0.5.dist-info → clinicedc-2.0.7.dist-info}/METADATA +2 -2
  2. {clinicedc-2.0.5.dist-info → clinicedc-2.0.7.dist-info}/RECORD +387 -336
  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/form_validators/blood_pressure_form_validator_mixin.py +3 -1
  385. edc_vitals/utils.py +1 -1
  386. {clinicedc-2.0.5.dist-info → clinicedc-2.0.7.dist-info}/WHEEL +0 -0
  387. {clinicedc-2.0.5.dist-info → clinicedc-2.0.7.dist-info}/licenses/LICENSE +0 -0
@@ -1,10 +1,10 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
 
3
4
  from edc_constants.choices import YES_NO_NA
4
5
  from edc_constants.constants import NOT_APPLICABLE
5
6
  from edc_model import REPORT_STATUS
6
7
  from edc_model.validators import datetime_not_future
7
- from edc_utils import get_utcnow
8
8
 
9
9
  from ..choices import DEVIATION_VIOLATION
10
10
  from ..models import ActionsRequired, ProtocolViolations
@@ -12,13 +12,13 @@ from ..models import ActionsRequired, ProtocolViolations
12
12
 
13
13
  class ProtocolDeviationViolationModelMixin(models.Model):
14
14
  report_datetime = models.DateTimeField(
15
- verbose_name="Report Date and Time", default=get_utcnow
15
+ verbose_name="Report Date and Time", default=timezone.now
16
16
  )
17
17
 
18
18
  short_description = models.CharField(
19
19
  verbose_name="Provide a short description of this occurrence",
20
20
  max_length=35,
21
- null=True,
21
+ default="",
22
22
  blank=False,
23
23
  help_text=(
24
24
  'Max 35 characters. Note: If this occurrence is a "violation" '
@@ -39,7 +39,7 @@ class ProtocolDeviationViolationModelMixin(models.Model):
39
39
  )
40
40
 
41
41
  safety_impact_details = models.TextField(
42
- verbose_name='If "Yes", provide details', null=True, blank=True
42
+ verbose_name='If "Yes", provide details', default="", blank=True
43
43
  )
44
44
 
45
45
  study_outcomes_impact = models.CharField(
@@ -50,7 +50,7 @@ class ProtocolDeviationViolationModelMixin(models.Model):
50
50
  )
51
51
 
52
52
  study_outcomes_impact_details = models.TextField(
53
- verbose_name='If "Yes", provide details', null=True, blank=True
53
+ verbose_name='If "Yes", provide details', default="", blank=True
54
54
  )
55
55
 
56
56
  violation_datetime = models.DateTimeField(
@@ -70,21 +70,24 @@ class ProtocolDeviationViolationModelMixin(models.Model):
70
70
  )
71
71
 
72
72
  violation_other = models.CharField(
73
- null=True, blank=True, verbose_name="If other, please specify", max_length=75
73
+ verbose_name="If other, please specify",
74
+ max_length=75,
75
+ default="",
76
+ blank=True,
74
77
  )
75
78
 
76
79
  violation_description = models.TextField(
77
80
  verbose_name="Describe the violation",
78
- null=True,
79
- blank=True,
80
81
  help_text=(
81
82
  "Describe in full. Explain how the violation happened, what occurred, etc."
82
83
  ),
84
+ default="",
85
+ blank=True,
83
86
  )
84
87
 
85
88
  violation_reason = models.TextField(
86
89
  verbose_name="Explain the reason why the violation occurred",
87
- null=True,
90
+ default="",
88
91
  blank=True,
89
92
  )
90
93
 
@@ -96,7 +99,9 @@ class ProtocolDeviationViolationModelMixin(models.Model):
96
99
  )
97
100
 
98
101
  corrective_action = models.TextField(
99
- verbose_name="Corrective action taken", null=True, blank=True
102
+ verbose_name="Corrective action taken",
103
+ default="",
104
+ blank=True,
100
105
  )
101
106
 
102
107
  preventative_action_datetime = models.DateTimeField(
@@ -107,7 +112,9 @@ class ProtocolDeviationViolationModelMixin(models.Model):
107
112
  )
108
113
 
109
114
  preventative_action = models.TextField(
110
- verbose_name="Preventative action taken", null=True, blank=True
115
+ verbose_name="Preventative action taken",
116
+ default="",
117
+ blank=True,
111
118
  )
112
119
 
113
120
  action_required = models.ForeignKey(
@@ -1,8 +1,8 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
 
3
4
  from edc_constants.choices import YES_NO
4
5
  from edc_model.validators import datetime_not_future
5
- from edc_utils import get_utcnow
6
6
 
7
7
  from ..choices import DEVIATION_VIOLATION, REPORT_STATUS
8
8
  from ..models import ActionsRequired, ProtocolViolations
@@ -10,13 +10,14 @@ from ..models import ActionsRequired, ProtocolViolations
10
10
 
11
11
  class ProtocolIncidentModelMixin(models.Model):
12
12
  report_datetime = models.DateTimeField(
13
- verbose_name="Report Date and Time", default=get_utcnow
13
+ verbose_name="Report Date and Time",
14
+ default=timezone.now,
14
15
  )
15
16
 
16
17
  short_description = models.CharField(
17
18
  verbose_name="Provide a short description of this incident",
18
19
  max_length=35,
19
- null=True,
20
+ default="",
20
21
  blank=False,
21
22
  help_text=(
22
23
  "Max 35 characters. Note: there is additional space below for "
@@ -35,7 +36,9 @@ class ProtocolIncidentModelMixin(models.Model):
35
36
  )
36
37
 
37
38
  safety_impact_details = models.TextField(
38
- verbose_name='If "Yes", provide details', null=True, blank=True
39
+ verbose_name='If "Yes", provide details',
40
+ default="",
41
+ blank=True,
39
42
  )
40
43
 
41
44
  study_outcomes_impact = models.CharField(
@@ -45,7 +48,9 @@ class ProtocolIncidentModelMixin(models.Model):
45
48
  )
46
49
 
47
50
  study_outcomes_impact_details = models.TextField(
48
- verbose_name='If "Yes", provide details', null=True, blank=True
51
+ verbose_name='If "Yes", provide details',
52
+ default="",
53
+ blank=True,
49
54
  )
50
55
 
51
56
  incident_datetime = models.DateTimeField(
@@ -65,19 +70,22 @@ class ProtocolIncidentModelMixin(models.Model):
65
70
  )
66
71
 
67
72
  incident_other = models.CharField(
68
- null=True, blank=True, verbose_name="If other, please specify", max_length=75
73
+ verbose_name="If other, please specify",
74
+ max_length=75,
75
+ default="",
76
+ blank=True,
69
77
  )
70
78
 
71
79
  incident_description = models.TextField(
72
80
  verbose_name="Describe the incident",
73
- null=True,
81
+ default="",
74
82
  blank=False,
75
83
  help_text="Describe in full. Explain how the incident happened, what occurred, etc.",
76
84
  )
77
85
 
78
86
  incident_reason = models.TextField(
79
87
  verbose_name="Explain the reason why the incident occurred",
80
- null=True,
88
+ default="",
81
89
  blank=False,
82
90
  )
83
91
 
@@ -89,7 +97,9 @@ class ProtocolIncidentModelMixin(models.Model):
89
97
  )
90
98
 
91
99
  corrective_action = models.TextField(
92
- verbose_name="Corrective action taken", null=True, blank=True
100
+ verbose_name="Corrective action taken",
101
+ default="",
102
+ blank=True,
93
103
  )
94
104
 
95
105
  preventative_action_datetime = models.DateTimeField(
@@ -100,7 +110,9 @@ class ProtocolIncidentModelMixin(models.Model):
100
110
  )
101
111
 
102
112
  preventative_action = models.TextField(
103
- verbose_name="Preventative action taken", null=True, blank=True
113
+ verbose_name="Preventative action taken",
114
+ default="",
115
+ blank=True,
104
116
  )
105
117
 
106
118
  action_required = models.ForeignKey(
@@ -117,7 +129,10 @@ class ProtocolIncidentModelMixin(models.Model):
117
129
  choices=REPORT_STATUS,
118
130
  )
119
131
 
120
- reasons_withdrawn = models.TextField(null=True, blank=True)
132
+ reasons_withdrawn = models.TextField(
133
+ default="",
134
+ blank=True,
135
+ )
121
136
 
122
137
  report_closed_datetime = models.DateTimeField(
123
138
  blank=True,
edc_pylabels/actions.py CHANGED
@@ -6,11 +6,10 @@ from django.apps import apps as django_apps
6
6
  from django.contrib import admin, messages
7
7
  from django.db.models import Count, QuerySet
8
8
  from django.http import FileResponse
9
+ from django.utils import timezone
9
10
  from django.utils.translation import gettext as _
10
11
  from pylabels import Sheet, Specification
11
12
 
12
- from edc_utils import get_utcnow
13
-
14
13
  from .site_label_configs import LabelConfig, site_label_configs
15
14
 
16
15
  if TYPE_CHECKING:
@@ -19,7 +18,6 @@ if TYPE_CHECKING:
19
18
 
20
19
  @admin.action(description="Test print sheet of labels")
21
20
  def print_test_label_sheet_action(modeladmin, request, queryset: QuerySet[LabelConfiguration]):
22
-
23
21
  if queryset.count() > 1 or queryset.count() == 0:
24
22
  messages.add_message(
25
23
  request,
@@ -74,10 +72,10 @@ def print_label_sheet(modeladmin, request, queryset):
74
72
  sheet = Sheet(specs, drawing_callable, border=config.label_specification.border)
75
73
  sheet.add_labels(label_data)
76
74
  buffer = sheet.save_to_buffer()
77
- now = get_utcnow()
75
+ now = timezone.now()
78
76
  return FileResponse(
79
77
  buffer,
80
78
  as_attachment=True,
81
- filename=f"{config.name}_{now.strftime("%Y-%m-%d %H:%M")}.pdf",
79
+ filename=f"{config.name}_{now.strftime('%Y-%m-%d %H:%M')}.pdf",
82
80
  )
83
81
  return None
@@ -7,10 +7,10 @@ import django_audit_fields.fields.uuid_auto_field
7
7
  import django_audit_fields.models.audit_model_mixin
8
8
  import django_revision.revision_field
9
9
  from django.db import migrations, models
10
+ import django.utils.timezone
10
11
 
11
12
 
12
13
  class Migration(migrations.Migration):
13
-
14
14
  dependencies = [
15
15
  ("django_pylabels", "0003_rename_updated_labelspecification_modified"),
16
16
  ("edc_pylabels", "0001_initial"),
@@ -36,9 +36,7 @@ class Migration(migrations.Migration):
36
36
  migrations.AddField(
37
37
  model_name="label",
38
38
  name="created",
39
- field=models.DateTimeField(
40
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
41
- ),
39
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
42
40
  ),
43
41
  migrations.AddField(
44
42
  model_name="label",
@@ -96,9 +94,7 @@ class Migration(migrations.Migration):
96
94
  migrations.AddField(
97
95
  model_name="label",
98
96
  name="modified",
99
- field=models.DateTimeField(
100
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
101
- ),
97
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
102
98
  ),
103
99
  migrations.AddField(
104
100
  model_name="label",
@@ -8,10 +8,10 @@ import django_audit_fields.fields.uuid_auto_field
8
8
  import django_audit_fields.models.audit_model_mixin
9
9
  import django_revision.revision_field
10
10
  from django.db import migrations, models
11
+ import django.utils.timezone
11
12
 
12
13
 
13
14
  class Migration(migrations.Migration):
14
-
15
15
  dependencies = [
16
16
  ("django_pylabels", "0003_rename_updated_labelspecification_modified"),
17
17
  ("edc_pylabels", "0004_remove_label_drawing_callable_name_and_more"),
@@ -36,14 +36,14 @@ class Migration(migrations.Migration):
36
36
  "created",
37
37
  models.DateTimeField(
38
38
  blank=True,
39
- default=django_audit_fields.models.audit_model_mixin.utcnow,
39
+ default=django.utils.timezone.now,
40
40
  ),
41
41
  ),
42
42
  (
43
43
  "modified",
44
44
  models.DateTimeField(
45
45
  blank=True,
46
- default=django_audit_fields.models.audit_model_mixin.utcnow,
46
+ default=django.utils.timezone.now,
47
47
  ),
48
48
  ),
49
49
  (
@@ -0,0 +1,49 @@
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_pylabels", "0012_alter_labelconfiguration_revision"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="labelconfiguration",
15
+ name="device_created",
16
+ field=models.CharField(
17
+ blank=True, default="", max_length=10, verbose_name="Device created"
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="labelconfiguration",
22
+ name="device_modified",
23
+ field=models.CharField(
24
+ blank=True, default="", max_length=10, verbose_name="Device modified"
25
+ ),
26
+ ),
27
+ migrations.AlterField(
28
+ model_name="labelconfiguration",
29
+ name="locale_created",
30
+ field=models.CharField(
31
+ blank=True,
32
+ default="",
33
+ help_text="Auto-updated by Modeladmin",
34
+ max_length=10,
35
+ verbose_name="Locale created",
36
+ ),
37
+ ),
38
+ migrations.AlterField(
39
+ model_name="labelconfiguration",
40
+ name="locale_modified",
41
+ field=models.CharField(
42
+ blank=True,
43
+ default="",
44
+ help_text="Auto-updated by Modeladmin",
45
+ max_length=10,
46
+ verbose_name="Locale modified",
47
+ ),
48
+ ),
49
+ ]
@@ -11,11 +11,10 @@ import django_revision.revision_field
11
11
  from django.db import migrations, models
12
12
 
13
13
  import edc_sites.managers
14
- import edc_utils.date
14
+ import django.utils.timezone
15
15
 
16
16
 
17
17
  class Migration(migrations.Migration):
18
-
19
18
  initial = True
20
19
 
21
20
  dependencies = [
@@ -41,14 +40,14 @@ class Migration(migrations.Migration):
41
40
  "created",
42
41
  models.DateTimeField(
43
42
  blank=True,
44
- default=django_audit_fields.models.audit_model_mixin.utcnow,
43
+ default=django.utils.timezone.now,
45
44
  ),
46
45
  ),
47
46
  (
48
47
  "modified",
49
48
  models.DateTimeField(
50
49
  blank=True,
51
- default=django_audit_fields.models.audit_model_mixin.utcnow,
50
+ default=django.utils.timezone.now,
52
51
  ),
53
52
  ),
54
53
  (
@@ -132,7 +131,7 @@ class Migration(migrations.Migration):
132
131
  ("report_model", models.CharField(max_length=150)),
133
132
  (
134
133
  "report_datetime",
135
- models.DateTimeField(default=edc_utils.date.get_utcnow),
134
+ models.DateTimeField(default=django.utils.timezone.now),
136
135
  ),
137
136
  ("note", models.TextField(null=True)),
138
137
  (
@@ -7,10 +7,10 @@ import django_audit_fields.fields.uuid_auto_field
7
7
  import django_audit_fields.models.audit_model_mixin
8
8
  import django_revision.revision_field
9
9
  from django.db import migrations, models
10
+ import django.utils.timezone
10
11
 
11
12
 
12
13
  class Migration(migrations.Migration):
13
-
14
14
  dependencies = [
15
15
  ("edc_qareports", "0004_alter_qareportnote_status"),
16
16
  ]
@@ -34,14 +34,14 @@ class Migration(migrations.Migration):
34
34
  "created",
35
35
  models.DateTimeField(
36
36
  blank=True,
37
- default=django_audit_fields.models.audit_model_mixin.utcnow,
37
+ default=django.utils.timezone.now,
38
38
  ),
39
39
  ),
40
40
  (
41
41
  "modified",
42
42
  models.DateTimeField(
43
43
  blank=True,
44
- default=django_audit_fields.models.audit_model_mixin.utcnow,
44
+ default=django.utils.timezone.now,
45
45
  ),
46
46
  ),
47
47
  (
@@ -3,11 +3,10 @@
3
3
  import django.db.models.deletion
4
4
  from django.db import migrations, models
5
5
 
6
- import edc_utils.date
6
+ import django.utils.timezone
7
7
 
8
8
 
9
9
  class Migration(migrations.Migration):
10
-
11
10
  dependencies = [
12
11
  ("sites", "0002_alter_domain_unique"),
13
12
  ("edc_qareports", "0005_edcpermissions"),
@@ -28,7 +27,7 @@ class Migration(migrations.Migration):
28
27
  ),
29
28
  ("username", models.CharField(max_length=100)),
30
29
  ("report_model", models.CharField(max_length=100)),
31
- ("accessed", models.DateTimeField(default=edc_utils.date.get_utcnow)),
30
+ ("accessed", models.DateTimeField(default=django.utils.timezone.now)),
32
31
  (
33
32
  "site",
34
33
  models.ForeignKey(
@@ -0,0 +1,102 @@
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_qareports", "0018_alter_edcpermissions_revision_alter_note_revision"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="edcpermissions",
15
+ name="device_created",
16
+ field=models.CharField(
17
+ blank=True, default="", max_length=10, verbose_name="Device created"
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="edcpermissions",
22
+ name="device_modified",
23
+ field=models.CharField(
24
+ blank=True, default="", max_length=10, verbose_name="Device modified"
25
+ ),
26
+ ),
27
+ migrations.AlterField(
28
+ model_name="edcpermissions",
29
+ name="locale_created",
30
+ field=models.CharField(
31
+ blank=True,
32
+ default="",
33
+ help_text="Auto-updated by Modeladmin",
34
+ max_length=10,
35
+ verbose_name="Locale created",
36
+ ),
37
+ ),
38
+ migrations.AlterField(
39
+ model_name="edcpermissions",
40
+ name="locale_modified",
41
+ field=models.CharField(
42
+ blank=True,
43
+ default="",
44
+ help_text="Auto-updated by Modeladmin",
45
+ max_length=10,
46
+ verbose_name="Locale modified",
47
+ ),
48
+ ),
49
+ migrations.AlterField(
50
+ model_name="note",
51
+ name="device_created",
52
+ field=models.CharField(
53
+ blank=True, default="", max_length=10, verbose_name="Device created"
54
+ ),
55
+ ),
56
+ migrations.AlterField(
57
+ model_name="note",
58
+ name="device_modified",
59
+ field=models.CharField(
60
+ blank=True, default="", max_length=10, verbose_name="Device modified"
61
+ ),
62
+ ),
63
+ migrations.AlterField(
64
+ model_name="note",
65
+ name="locale_created",
66
+ field=models.CharField(
67
+ blank=True,
68
+ default="",
69
+ help_text="Auto-updated by Modeladmin",
70
+ max_length=10,
71
+ verbose_name="Locale created",
72
+ ),
73
+ ),
74
+ migrations.AlterField(
75
+ model_name="note",
76
+ name="locale_modified",
77
+ field=models.CharField(
78
+ blank=True,
79
+ default="",
80
+ help_text="Auto-updated by Modeladmin",
81
+ max_length=10,
82
+ verbose_name="Locale modified",
83
+ ),
84
+ ),
85
+ migrations.AlterField(
86
+ model_name="note",
87
+ name="note",
88
+ field=models.TextField(blank=True, default=""),
89
+ ),
90
+ migrations.AlterField(
91
+ model_name="note",
92
+ name="status",
93
+ field=models.CharField(
94
+ choices=[
95
+ ("PENDING", "Data is pending"),
96
+ ("not_available", "Data not available"),
97
+ ],
98
+ default="",
99
+ max_length=25,
100
+ ),
101
+ ),
102
+ ]
@@ -0,0 +1,24 @@
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_qareports", "0019_alter_edcpermissions_device_created_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="note",
16
+ name="report_datetime",
17
+ field=models.DateTimeField(default=django.utils.timezone.now),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="qareportlog",
21
+ name="accessed",
22
+ field=models.DateTimeField(default=django.utils.timezone.now),
23
+ ),
24
+ ]
@@ -1,9 +1,9 @@
1
1
  from django.apps import apps as django_apps
2
2
  from django.db import models
3
+ from django.utils import timezone
3
4
 
4
5
  from edc_model.models import BaseUuidModel
5
6
  from edc_sites.model_mixins import SiteModelMixin
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from ..choices import NOTE_STATUSES
9
9
 
@@ -17,11 +17,14 @@ class NoteModelMixin(SiteModelMixin, BaseUuidModel):
17
17
 
18
18
  report_model = models.CharField(max_length=150)
19
19
 
20
- report_datetime = models.DateTimeField(default=get_utcnow)
20
+ report_datetime = models.DateTimeField(default=timezone.now)
21
21
 
22
- note = models.TextField(null=True, blank=True)
22
+ note = models.TextField(
23
+ default="",
24
+ blank=True,
25
+ )
23
26
 
24
- status = models.CharField(max_length=25, choices=NOTE_STATUSES, null=True, blank=False)
27
+ status = models.CharField(max_length=25, choices=NOTE_STATUSES, default="", blank=False)
25
28
 
26
29
  @property
27
30
  def report_model_cls(self):
@@ -4,19 +4,19 @@ from django.db import models
4
4
  class OnStudyMissingValuesModelMixin(models.Model):
5
5
  original_id = models.UUIDField(null=True)
6
6
 
7
- label_lower = models.CharField(max_length=150, null=True)
7
+ label_lower = models.CharField(max_length=150, default="")
8
8
 
9
9
  subject_visit_id = models.UUIDField(null=True)
10
10
 
11
11
  report_datetime = models.DateTimeField(null=True)
12
12
 
13
- label = models.CharField(max_length=50, null=True)
13
+ label = models.CharField(max_length=50, default="")
14
14
 
15
- visit_code = models.CharField(max_length=25, null=True)
15
+ visit_code = models.CharField(max_length=25, default="")
16
16
 
17
17
  visit_code_sequence = models.IntegerField(null=True)
18
18
 
19
- schedule_name = models.CharField(max_length=25, null=True)
19
+ schedule_name = models.CharField(max_length=25, default="")
20
20
 
21
21
  modified = models.DateTimeField(null=True)
22
22
 
@@ -1,8 +1,7 @@
1
1
  from django.contrib.sites.models import Site
2
2
  from django.db import models
3
3
  from django.db.models import DO_NOTHING, Index
4
-
5
- from edc_utils import get_utcnow
4
+ from django.utils import timezone
6
5
 
7
6
  from ..utils import recreate_db_view
8
7
  from .qa_reports_permissions import qa_reports_permissions
@@ -15,7 +14,7 @@ class QaReportModelMixin(models.Model):
15
14
 
16
15
  site = models.ForeignKey(Site, on_delete=DO_NOTHING)
17
16
 
18
- created = models.DateTimeField(default=get_utcnow)
17
+ created = models.DateTimeField(default=timezone.now)
19
18
 
20
19
  def __str__(self):
21
20
  return f"{self.subject_identifier}: {self.report_model}"
@@ -21,11 +21,11 @@ class Note(NonUniqueSubjectIdentifierFieldMixin, NoteModelMixin):
21
21
  class Meta(BaseUuidModel.Meta):
22
22
  verbose_name = "Note"
23
23
  verbose_name_plural = "Notes"
24
- constraints = [
24
+ constraints = (
25
25
  UniqueConstraint(
26
26
  fields=["report_model", "subject_identifier"],
27
27
  name="%(app_label)s_%(class)s_report_model_subj_uniq",
28
- )
29
- ]
28
+ ),
29
+ )
30
30
  indexes = BaseUuidModel.Meta.indexes
31
- default_permissions = default_permissions + ("viewallsites",)
31
+ default_permissions = *default_permissions, "viewallsites"
@@ -1,7 +1,6 @@
1
1
  from django.contrib.sites.models import Site
2
2
  from django.db import models
3
-
4
- from edc_utils import get_utcnow
3
+ from django.utils import timezone
5
4
 
6
5
  from ..model_mixins import qa_reports_permissions
7
6
 
@@ -10,7 +9,7 @@ class QaReportLog(models.Model):
10
9
  username = models.CharField(max_length=100)
11
10
  site = models.ForeignKey(Site, on_delete=models.CASCADE)
12
11
  report_model = models.CharField(max_length=100)
13
- accessed = models.DateTimeField(default=get_utcnow)
12
+ accessed = models.DateTimeField(default=timezone.now)
14
13
 
15
14
  class Meta:
16
15
  verbose_name = "QA Report Log"