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
@@ -3,8 +3,7 @@
3
3
  from __future__ import unicode_literals
4
4
 
5
5
  from django.db import migrations, models
6
-
7
- import edc_utils
6
+ import django.utils.timezone
8
7
 
9
8
 
10
9
  class Migration(migrations.Migration):
@@ -16,22 +15,22 @@ class Migration(migrations.Migration):
16
15
  migrations.AlterField(
17
16
  model_name="appointment",
18
17
  name="created",
19
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
18
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
20
19
  ),
21
20
  migrations.AlterField(
22
21
  model_name="appointment",
23
22
  name="modified",
24
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
23
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
25
24
  ),
26
25
  migrations.AlterField(
27
26
  model_name="historicalappointment",
28
27
  name="created",
29
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
28
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
30
29
  ),
31
30
  migrations.AlterField(
32
31
  model_name="historicalappointment",
33
32
  name="modified",
34
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
33
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
35
34
  ),
36
35
  migrations.AlterUniqueTogether(name="appointment", unique_together=set([])),
37
36
  migrations.RemoveField(model_name="appointment", name="consent_version"),
@@ -6,7 +6,7 @@ from django.db import migrations, models
6
6
 
7
7
  import edc_model_fields.fields.hostname_modification_field
8
8
  import edc_model_fields.fields.userfield
9
- import edc_utils
9
+ import django.utils.timezone
10
10
 
11
11
 
12
12
  class Migration(migrations.Migration):
@@ -16,7 +16,7 @@ class Migration(migrations.Migration):
16
16
  migrations.AlterField(
17
17
  model_name="appointment",
18
18
  name="created",
19
- field=models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
19
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
20
20
  ),
21
21
  migrations.AlterField(
22
22
  model_name="appointment",
@@ -40,7 +40,7 @@ class Migration(migrations.Migration):
40
40
  migrations.AlterField(
41
41
  model_name="appointment",
42
42
  name="modified",
43
- field=models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
43
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
44
44
  ),
45
45
  migrations.AlterField(
46
46
  model_name="appointment",
@@ -59,7 +59,7 @@ class Migration(migrations.Migration):
59
59
  migrations.AlterField(
60
60
  model_name="historicalappointment",
61
61
  name="created",
62
- field=models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
62
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
63
63
  ),
64
64
  migrations.AlterField(
65
65
  model_name="historicalappointment",
@@ -83,7 +83,7 @@ class Migration(migrations.Migration):
83
83
  migrations.AlterField(
84
84
  model_name="historicalappointment",
85
85
  name="modified",
86
- field=models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
86
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
87
87
  ),
88
88
  migrations.AlterField(
89
89
  model_name="historicalappointment",
@@ -4,6 +4,7 @@ import django_audit_fields.fields.hostname_modification_field
4
4
  import django_audit_fields.fields.userfield
5
5
  import django_audit_fields.models.audit_model_mixin
6
6
  from django.db import migrations, models
7
+ import django.utils.timezone
7
8
 
8
9
 
9
10
  class Migration(migrations.Migration):
@@ -13,9 +14,7 @@ class Migration(migrations.Migration):
13
14
  migrations.AlterField(
14
15
  model_name="appointment",
15
16
  name="created",
16
- field=models.DateTimeField(
17
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
18
- ),
17
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
19
18
  ),
20
19
  migrations.AlterField(
21
20
  model_name="appointment",
@@ -29,9 +28,7 @@ class Migration(migrations.Migration):
29
28
  migrations.AlterField(
30
29
  model_name="appointment",
31
30
  name="modified",
32
- field=models.DateTimeField(
33
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
34
- ),
31
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
35
32
  ),
36
33
  migrations.AlterField(
37
34
  model_name="appointment",
@@ -56,9 +53,7 @@ class Migration(migrations.Migration):
56
53
  migrations.AlterField(
57
54
  model_name="historicalappointment",
58
55
  name="created",
59
- field=models.DateTimeField(
60
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
61
- ),
56
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
62
57
  ),
63
58
  migrations.AlterField(
64
59
  model_name="historicalappointment",
@@ -72,9 +67,7 @@ class Migration(migrations.Migration):
72
67
  migrations.AlterField(
73
68
  model_name="historicalappointment",
74
69
  name="modified",
75
- field=models.DateTimeField(
76
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
77
- ),
70
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
78
71
  ),
79
72
  migrations.AlterField(
80
73
  model_name="historicalappointment",
@@ -0,0 +1,220 @@
1
+ # Generated by Django 5.2.6 on 2025-09-17 16:53
2
+
3
+ import django.db.models.deletion
4
+ import edc_model_fields.fields.other_charfield
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ("edc_appointment", "0049_alter_appointment_revision_and_more"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AlterField(
16
+ model_name="appointment",
17
+ name="appt_type",
18
+ field=models.ForeignKey(
19
+ null=True,
20
+ on_delete=django.db.models.deletion.PROTECT,
21
+ to="edc_appointment.appointmenttype",
22
+ verbose_name="Appointment type",
23
+ ),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="appointment",
27
+ name="appt_type_other",
28
+ field=edc_model_fields.fields.other_charfield.OtherCharField(
29
+ blank=True,
30
+ default="",
31
+ max_length=35,
32
+ verbose_name="If other appointment type, please specify ...",
33
+ ),
34
+ ),
35
+ migrations.AlterField(
36
+ model_name="appointment",
37
+ name="comment",
38
+ field=models.CharField(
39
+ blank=True, default="", max_length=250, verbose_name="Comment"
40
+ ),
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="appointment",
44
+ name="device_created",
45
+ field=models.CharField(
46
+ blank=True, default="", max_length=10, verbose_name="Device created"
47
+ ),
48
+ ),
49
+ migrations.AlterField(
50
+ model_name="appointment",
51
+ name="device_modified",
52
+ field=models.CharField(
53
+ blank=True, default="", max_length=10, verbose_name="Device modified"
54
+ ),
55
+ ),
56
+ migrations.AlterField(
57
+ model_name="appointment",
58
+ name="document_status_comments",
59
+ field=models.TextField(
60
+ blank=True,
61
+ default="",
62
+ help_text="for example, why some data is still pending",
63
+ verbose_name="Any comments related to status of this document",
64
+ ),
65
+ ),
66
+ migrations.AlterField(
67
+ model_name="appointment",
68
+ name="locale_created",
69
+ field=models.CharField(
70
+ blank=True,
71
+ default="",
72
+ help_text="Auto-updated by Modeladmin",
73
+ max_length=10,
74
+ verbose_name="Locale created",
75
+ ),
76
+ ),
77
+ migrations.AlterField(
78
+ model_name="appointment",
79
+ name="locale_modified",
80
+ field=models.CharField(
81
+ blank=True,
82
+ default="",
83
+ help_text="Auto-updated by Modeladmin",
84
+ max_length=10,
85
+ verbose_name="Locale modified",
86
+ ),
87
+ ),
88
+ migrations.AlterField(
89
+ model_name="appointment",
90
+ name="visit_code",
91
+ field=models.CharField(default="", editable=False, max_length=25),
92
+ ),
93
+ migrations.AlterField(
94
+ model_name="appointmenttype",
95
+ name="extra_value",
96
+ field=models.CharField(default="", max_length=250),
97
+ ),
98
+ migrations.AlterField(
99
+ model_name="appointmenttype",
100
+ name="field_name",
101
+ field=models.CharField(
102
+ blank=True,
103
+ default="",
104
+ editable=False,
105
+ help_text="Not required",
106
+ max_length=25,
107
+ ),
108
+ ),
109
+ migrations.AlterField(
110
+ model_name="appointmenttype",
111
+ name="plural_name",
112
+ field=models.CharField(
113
+ default="", max_length=250, verbose_name="Plural name"
114
+ ),
115
+ ),
116
+ migrations.AlterField(
117
+ model_name="historicalappointment",
118
+ name="appt_type",
119
+ field=models.ForeignKey(
120
+ blank=True,
121
+ db_constraint=False,
122
+ null=True,
123
+ on_delete=django.db.models.deletion.DO_NOTHING,
124
+ related_name="+",
125
+ to="edc_appointment.appointmenttype",
126
+ verbose_name="Appointment type",
127
+ ),
128
+ ),
129
+ migrations.AlterField(
130
+ model_name="historicalappointment",
131
+ name="appt_type_other",
132
+ field=edc_model_fields.fields.other_charfield.OtherCharField(
133
+ blank=True,
134
+ default="",
135
+ max_length=35,
136
+ verbose_name="If other appointment type, please specify ...",
137
+ ),
138
+ ),
139
+ migrations.AlterField(
140
+ model_name="historicalappointment",
141
+ name="comment",
142
+ field=models.CharField(
143
+ blank=True, default="", max_length=250, verbose_name="Comment"
144
+ ),
145
+ ),
146
+ migrations.AlterField(
147
+ model_name="historicalappointment",
148
+ name="device_created",
149
+ field=models.CharField(
150
+ blank=True, default="", max_length=10, verbose_name="Device created"
151
+ ),
152
+ ),
153
+ migrations.AlterField(
154
+ model_name="historicalappointment",
155
+ name="device_modified",
156
+ field=models.CharField(
157
+ blank=True, default="", max_length=10, verbose_name="Device modified"
158
+ ),
159
+ ),
160
+ migrations.AlterField(
161
+ model_name="historicalappointment",
162
+ name="document_status_comments",
163
+ field=models.TextField(
164
+ blank=True,
165
+ default="",
166
+ help_text="for example, why some data is still pending",
167
+ verbose_name="Any comments related to status of this document",
168
+ ),
169
+ ),
170
+ migrations.AlterField(
171
+ model_name="historicalappointment",
172
+ name="locale_created",
173
+ field=models.CharField(
174
+ blank=True,
175
+ default="",
176
+ help_text="Auto-updated by Modeladmin",
177
+ max_length=10,
178
+ verbose_name="Locale created",
179
+ ),
180
+ ),
181
+ migrations.AlterField(
182
+ model_name="historicalappointment",
183
+ name="locale_modified",
184
+ field=models.CharField(
185
+ blank=True,
186
+ default="",
187
+ help_text="Auto-updated by Modeladmin",
188
+ max_length=10,
189
+ verbose_name="Locale modified",
190
+ ),
191
+ ),
192
+ migrations.AlterField(
193
+ model_name="historicalappointment",
194
+ name="visit_code",
195
+ field=models.CharField(default="", editable=False, max_length=25),
196
+ ),
197
+ migrations.AlterField(
198
+ model_name="infosources",
199
+ name="extra_value",
200
+ field=models.CharField(default="", max_length=250),
201
+ ),
202
+ migrations.AlterField(
203
+ model_name="infosources",
204
+ name="field_name",
205
+ field=models.CharField(
206
+ blank=True,
207
+ default="",
208
+ editable=False,
209
+ help_text="Not required",
210
+ max_length=25,
211
+ ),
212
+ ),
213
+ migrations.AlterField(
214
+ model_name="infosources",
215
+ name="plural_name",
216
+ field=models.CharField(
217
+ default="", max_length=250, verbose_name="Plural name"
218
+ ),
219
+ ),
220
+ ]
@@ -36,7 +36,6 @@ class AppointmentFieldsModelMixin(models.Model):
36
36
  "edc_appointment.AppointmentType",
37
37
  verbose_name="Appointment type",
38
38
  on_delete=models.PROTECT,
39
- default=None,
40
39
  null=True,
41
40
  blank=False,
42
41
  help_text="",
@@ -82,7 +81,7 @@ class AppointmentFieldsModelMixin(models.Model):
82
81
  ),
83
82
  )
84
83
 
85
- comment = models.CharField("Comment", max_length=250, blank=True, null=True)
84
+ comment = models.CharField("Comment", max_length=250, blank=True, default="")
86
85
 
87
86
  is_confirmed = models.BooleanField(default=False, editable=False)
88
87
 
@@ -30,13 +30,12 @@ class WindowPeriodModelMixin(models.Model):
30
30
  and self.appt_status != CANCELLED_APPT
31
31
  and self.appt_datetime
32
32
  and self.timepoint_datetime
33
- ):
34
- if not self.ignore_window_period:
35
- try:
36
- raise_on_appt_datetime_not_in_window(self)
37
- except AppointmentWindowError as e:
38
- msg = f"{e} Perhaps catch this in the form"
39
- raise AppointmentWindowError(msg)
33
+ ) and not self.ignore_window_period:
34
+ try:
35
+ raise_on_appt_datetime_not_in_window(self)
36
+ except AppointmentWindowError as e:
37
+ msg = f"{e} Perhaps catch this in the form"
38
+ raise AppointmentWindowError(msg) from e
40
39
 
41
40
  class Meta:
42
41
  abstract = True
@@ -1,9 +1,10 @@
1
1
  from django.core.exceptions import ObjectDoesNotExist
2
2
  from django.db.models.signals import post_delete, post_save, pre_delete
3
3
  from django.dispatch import receiver
4
+ from django.utils import timezone
4
5
 
5
6
  from edc_constants.constants import NO
6
- from edc_utils import formatted_datetime, get_utcnow
7
+ from edc_utils import formatted_datetime
7
8
  from edc_visit_schedule.site_visit_schedules import site_visit_schedules
8
9
  from edc_visit_tracking.utils import get_related_visit_model_cls
9
10
 
@@ -70,19 +71,23 @@ def create_appointments_on_post_save(sender, instance, raw, created, using, **kw
70
71
  def update_appt_status_on_related_visit_post_save(
71
72
  sender, instance, created, raw, update_fields, **kwargs
72
73
  ):
73
- if not raw and not update_fields and created:
74
- if isinstance(instance, (get_related_visit_model_cls(),)):
75
- try:
76
- AppointmentStatusUpdater(
77
- instance.appointment,
78
- change_to_in_progress=True,
79
- clear_others_in_progress=True,
80
- )
81
- except AttributeError as e:
82
- if "appointment" not in str(e):
83
- raise
84
- except AppointmentStatusUpdaterError:
85
- pass
74
+ if (
75
+ not raw
76
+ and not update_fields
77
+ and created
78
+ and isinstance(instance, (get_related_visit_model_cls(),))
79
+ ):
80
+ try:
81
+ AppointmentStatusUpdater(
82
+ instance.appointment,
83
+ change_to_in_progress=True,
84
+ clear_others_in_progress=True,
85
+ )
86
+ except AttributeError as e:
87
+ if "appointment" not in str(e):
88
+ raise
89
+ except AppointmentStatusUpdaterError:
90
+ pass
86
91
 
87
92
 
88
93
  @receiver(
@@ -127,7 +132,7 @@ def appointments_on_pre_delete(sender, instance, using, **kwargs):
127
132
  offschedule_datetime = schedule.offschedule_model_cls.objects.get(
128
133
  subject_identifier=instance.subject_identifier
129
134
  ).offschedule_datetime
130
- except ObjectDoesNotExist:
135
+ except ObjectDoesNotExist as e:
131
136
  raise AppointmentDeleteError(
132
137
  f"Appointment may not be deleted. "
133
138
  f"Subject {instance.subject_identifier} is on schedule "
@@ -138,7 +143,7 @@ def appointments_on_pre_delete(sender, instance, using, **kwargs):
138
143
  f"Perhaps complete off schedule model "
139
144
  f"'{instance.schedule.offschedule_model_cls().verbose_name.title()}' "
140
145
  f"first."
141
- )
146
+ ) from e
142
147
  else:
143
148
  if onschedule_datetime <= instance.appt_datetime <= offschedule_datetime:
144
149
  raise AppointmentDeleteError(
@@ -146,7 +151,7 @@ def appointments_on_pre_delete(sender, instance, using, **kwargs):
146
151
  f"Subject {instance.subject_identifier} is on schedule "
147
152
  f"'{instance.visit_schedule.verbose_name}.{instance.schedule_name}' "
148
153
  f"as of '{formatted_datetime(onschedule_datetime)}' "
149
- f"until '{formatted_datetime(get_utcnow())}'. "
154
+ f"until '{formatted_datetime(timezone.now())}'. "
150
155
  f"Got appointment datetime "
151
156
  f"{formatted_datetime(instance.appt_datetime)}. "
152
157
  )
@@ -177,16 +182,19 @@ def appointments_on_post_delete(sender, instance, using, **kwargs):
177
182
  dispatch_uid="update_appointments_to_next_on_post_save",
178
183
  )
179
184
  def update_appointments_to_next_on_post_save(sender, instance, raw, created, using, **kwargs):
180
- if not raw and not kwargs.get("update_fields"):
181
- if get_allow_skipped_appt_using().get(instance._meta.label_lower):
182
- skip_appt = SkipAppointments(instance)
183
- next_appointment_updated = skip_appt.update()
184
- allow_create_interim = getattr(instance, "allow_create_interim", False)
185
- if not next_appointment_updated and allow_create_interim:
186
- create_next_appointment_as_interim(
187
- next_appt_datetime=skip_appt.next_appt_datetime,
188
- appointment=skip_appt.appointment,
189
- )
185
+ if (
186
+ not raw
187
+ and not kwargs.get("update_fields")
188
+ and get_allow_skipped_appt_using().get(instance._meta.label_lower)
189
+ ):
190
+ skip_appt = SkipAppointments(instance)
191
+ next_appointment_updated = skip_appt.update()
192
+ allow_create_interim = getattr(instance, "allow_create_interim", False)
193
+ if not next_appointment_updated and allow_create_interim:
194
+ create_next_appointment_as_interim(
195
+ next_appt_datetime=skip_appt.next_appt_datetime,
196
+ appointment=skip_appt.appointment,
197
+ )
190
198
 
191
199
 
192
200
  @receiver(post_delete, weak=False, dispatch_uid="update_appointments_to_next_on_post_delete")
@@ -203,11 +211,12 @@ def update_appointments_to_next_on_post_delete(sender, instance, using, **kwargs
203
211
  def update_appointment_from_nextappointment_post_save(
204
212
  sender, instance, raw, created, using, **kwargs
205
213
  ):
206
- if not raw and not kwargs.get("update_fields"):
207
- if isinstance(instance, (NextAppointmentCrfModelMixin,)):
208
- if instance.offschedule_today == NO:
209
- appointment = Appointment.objects.get(
210
- pk=instance.related_visit.appointment.next.id
211
- )
212
- appointment.appt_datetime = instance.appt_datetime
213
- appointment.save()
214
+ if (
215
+ not raw
216
+ and not kwargs.get("update_fields")
217
+ and isinstance(instance, (NextAppointmentCrfModelMixin,))
218
+ and instance.offschedule_today == NO
219
+ ):
220
+ appointment = Appointment.objects.get(pk=instance.related_visit.appointment.next.id)
221
+ appointment.appt_datetime = instance.appt_datetime
222
+ appointment.save()
@@ -5,9 +5,9 @@ from typing import TYPE_CHECKING
5
5
  from uuid import UUID
6
6
 
7
7
  from django.apps import apps as django_apps
8
+ from django.utils import timezone
8
9
  from django.utils.translation import gettext as _
9
10
 
10
- from edc_utils import get_utcnow
11
11
  from edc_view_utils.dashboard_model_button import DashboardModelButton
12
12
  from edc_view_utils.model_button import ADD
13
13
 
@@ -51,7 +51,7 @@ class AppointmentButton(DashboardModelButton):
51
51
  color = super().color
52
52
  if (
53
53
  self.model_obj
54
- and self.model_obj.appt_datetime <= get_utcnow()
54
+ and self.model_obj.appt_datetime <= timezone.now()
55
55
  and not self.model_obj.related_visit
56
56
  ):
57
57
  color = self.colors[ADD]
@@ -15,7 +15,7 @@ from .user_profile_admin import UserProfileInline
15
15
  admin.site.unregister(User)
16
16
 
17
17
 
18
- def send_new_credentials_to_user_action(modeladmin, request, queryset): # noqa
18
+ def send_new_credentials_to_user_action(modeladmin, request, queryset):
19
19
  if request.user.has_perm("auth.change_user"):
20
20
  for obj in queryset:
21
21
  send_new_credentials_to_user(user=obj)
@@ -10,10 +10,10 @@ import django_audit_fields.models.audit_model_mixin
10
10
  import django_revision.revision_field
11
11
  from django.conf import settings
12
12
  from django.db import migrations, models
13
+ import django.utils.timezone
13
14
 
14
15
 
15
16
  class Migration(migrations.Migration):
16
-
17
17
  replaces = [
18
18
  ("edc_auth", "0001_initial"),
19
19
  ("edc_auth", "0002_auto_20180803_0515"),
@@ -78,14 +78,14 @@ class Migration(migrations.Migration):
78
78
  "created",
79
79
  models.DateTimeField(
80
80
  blank=True,
81
- default=django_audit_fields.models.audit_model_mixin.utcnow,
81
+ default=django.utils.timezone.now,
82
82
  ),
83
83
  ),
84
84
  (
85
85
  "modified",
86
86
  models.DateTimeField(
87
87
  blank=True,
88
- default=django_audit_fields.models.audit_model_mixin.utcnow,
88
+ default=django.utils.timezone.now,
89
89
  ),
90
90
  ),
91
91
  (
@@ -402,14 +402,14 @@ class Migration(migrations.Migration):
402
402
  "created",
403
403
  models.DateTimeField(
404
404
  blank=True,
405
- default=django_audit_fields.models.audit_model_mixin.utcnow,
405
+ default=django.utils.timezone.now,
406
406
  ),
407
407
  ),
408
408
  (
409
409
  "modified",
410
410
  models.DateTimeField(
411
411
  blank=True,
412
- default=django_audit_fields.models.audit_model_mixin.utcnow,
412
+ default=django.utils.timezone.now,
413
413
  ),
414
414
  ),
415
415
  (
@@ -7,6 +7,7 @@ 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):
@@ -31,14 +32,14 @@ class Migration(migrations.Migration):
31
32
  "created",
32
33
  models.DateTimeField(
33
34
  blank=True,
34
- default=django_audit_fields.models.audit_model_mixin.utcnow,
35
+ default=django.utils.timezone.now,
35
36
  ),
36
37
  ),
37
38
  (
38
39
  "modified",
39
40
  models.DateTimeField(
40
41
  blank=True,
41
- default=django_audit_fields.models.audit_model_mixin.utcnow,
42
+ default=django.utils.timezone.now,
42
43
  ),
43
44
  ),
44
45
  (
@@ -7,6 +7,7 @@ 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):
@@ -34,14 +35,14 @@ class Migration(migrations.Migration):
34
35
  "created",
35
36
  models.DateTimeField(
36
37
  blank=True,
37
- default=django_audit_fields.models.audit_model_mixin.utcnow,
38
+ default=django.utils.timezone.now,
38
39
  ),
39
40
  ),
40
41
  (
41
42
  "modified",
42
43
  models.DateTimeField(
43
44
  blank=True,
44
- default=django_audit_fields.models.audit_model_mixin.utcnow,
45
+ default=django.utils.timezone.now,
45
46
  ),
46
47
  ),
47
48
  (
@@ -7,6 +7,7 @@ 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):
@@ -33,14 +34,14 @@ class Migration(migrations.Migration):
33
34
  "created",
34
35
  models.DateTimeField(
35
36
  blank=True,
36
- default=django_audit_fields.models.audit_model_mixin.utcnow,
37
+ default=django.utils.timezone.now,
37
38
  ),
38
39
  ),
39
40
  (
40
41
  "modified",
41
42
  models.DateTimeField(
42
43
  blank=True,
43
- default=django_audit_fields.models.audit_model_mixin.utcnow,
44
+ default=django.utils.timezone.now,
44
45
  ),
45
46
  ),
46
47
  (