clinicedc 2.0.6__py3-none-any.whl → 2.0.8__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 (495) hide show
  1. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/METADATA +2 -2
  2. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/RECORD +489 -441
  3. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/WHEEL +1 -1
  4. edc_action_item/action.py +1 -1
  5. edc_action_item/action_item_notification.py +2 -2
  6. edc_action_item/auths.py +37 -32
  7. edc_action_item/create_action_item.py +1 -1
  8. edc_action_item/decorators.py +1 -1
  9. edc_action_item/migrations/0001_initial.py +21 -22
  10. edc_action_item/migrations/0006_auto_20180707_1659.py +4 -4
  11. edc_action_item/migrations/0008_auto_20180809_0303.py +4 -4
  12. edc_action_item/migrations/0015_auto_20190114_0250.py +4 -4
  13. edc_action_item/migrations/0017_auto_20190305_0123.py +11 -30
  14. edc_action_item/migrations/0030_edcpermissions.py +3 -2
  15. edc_action_item/migrations/0039_alter_actionitem_auto_created_comment_and_more.py +398 -0
  16. edc_action_item/migrations/0040_alter_actionitem_report_datetime_and_more.py +34 -0
  17. edc_action_item/models/action_item.py +9 -4
  18. edc_action_item/models/action_model_mixin.py +5 -6
  19. edc_action_item/models/reference.py +2 -2
  20. edc_action_item/models/signals.py +22 -23
  21. edc_action_item/post_migrate_signals.py +1 -1
  22. edc_action_item/send_email.py +0 -85
  23. edc_action_item/site_action_items.py +5 -9
  24. edc_action_item/utils.py +3 -3
  25. edc_adherence/migrations/0005_alter_nonadherencereasons_extra_value_and_more.py +36 -0
  26. edc_adherence/model_mixins.py +1 -1
  27. edc_adverse_event/auths.py +55 -51
  28. edc_adverse_event/migrations/0001_initial.py +5 -4
  29. edc_adverse_event/migrations/0002_auto_20190802_0059.py +3 -2
  30. edc_adverse_event/migrations/0008_auto_20220825_0451.py +3 -2
  31. edc_adverse_event/migrations/0009_auto_20220907_0157.py +3 -2
  32. edc_adverse_event/migrations/0016_alter_aeactionclassification_device_created_and_more.py +285 -0
  33. edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +2 -2
  34. edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +6 -5
  35. edc_adverse_event/model_mixins/ae_special_interest/aesi_fields_model_mixin.py +2 -2
  36. edc_adverse_event/model_mixins/ae_susar/ae_susar_fields_model_mixin.py +2 -2
  37. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +15 -11
  38. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_methods_model_mixin.py +2 -4
  39. edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +5 -4
  40. edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +6 -3
  41. edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +2 -2
  42. edc_adverse_event/model_mixins/hospitaization/hospitalization_model_mixin.py +4 -3
  43. edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +3 -3
  44. edc_adverse_event/models/signals.py +7 -7
  45. edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -4
  46. edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +3 -5
  47. edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +6 -8
  48. edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -2
  49. edc_adverse_event/views/tmg/summary_listboard_view.py +3 -2
  50. edc_appointment/admin/appointment_admin.py +2 -2
  51. edc_appointment/admin/list_filters.py +2 -2
  52. edc_appointment/auths.py +14 -10
  53. edc_appointment/creators/appointment_creator.py +1 -1
  54. edc_appointment/creators/appointments_creator.py +1 -1
  55. edc_appointment/form_validators/appointment_form_validator.py +108 -82
  56. edc_appointment/migrations/0003_auto_20161127_2226.py +5 -6
  57. edc_appointment/migrations/0006_auto_20170106_2118.py +5 -5
  58. edc_appointment/migrations/0018_auto_20190305_0123.py +5 -12
  59. edc_appointment/migrations/0050_alter_appointment_appt_type_and_more.py +220 -0
  60. edc_appointment/model_mixins/appointment_fields_model_mixin.py +1 -2
  61. edc_appointment/model_mixins/appointment_methods_model_mixin.py +2 -3
  62. edc_appointment/model_mixins/appointment_model_mixin.py +31 -28
  63. edc_appointment/model_mixins/window_period_model_mixin.py +6 -7
  64. edc_appointment/models/appointment.py +1 -1
  65. edc_appointment/models/signals.py +44 -35
  66. edc_appointment/utils.py +19 -24
  67. edc_appointment/view_utils/appointment_button.py +2 -2
  68. edc_auth/admin/user_admin.py +1 -1
  69. edc_auth/auth_objects/__init__.py +2 -20
  70. edc_auth/auth_objects/default_groups.py +13 -11
  71. edc_auth/auth_objects/default_roles.py +26 -24
  72. edc_auth/auth_updater/auth_updater.py +13 -2
  73. edc_auth/auth_updater/group_updater.py +12 -10
  74. edc_auth/auth_updater/role_updater.py +2 -2
  75. edc_auth/constants.py +10 -0
  76. edc_auth/import_users.py +3 -3
  77. edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +5 -5
  78. edc_auth/migrations/0012_auto_20191026_0034.py +3 -2
  79. edc_auth/migrations/0013_auto_20191026_0055.py +3 -2
  80. edc_auth/migrations/0025_permissions.py +3 -2
  81. edc_auth/migrations/0035_alter_edcpermissions_device_created_and_more.py +85 -0
  82. edc_auth/models/user_profile.py +14 -11
  83. edc_auth/post_migrate_signals.py +1 -1
  84. edc_auth/site_auths.py +80 -67
  85. edc_consent/actions.py +4 -5
  86. edc_consent/auths.py +18 -12
  87. edc_consent/migrations/0001_initial.py +3 -2
  88. edc_consent/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  89. edc_consent/model_mixins/consent_extension_model_mixin.py +4 -5
  90. edc_consent/model_mixins/requires_consent_fields_model_mixin.py +2 -2
  91. edc_consent/utils.py +1 -1
  92. edc_constants/constants.py +1 -0
  93. edc_crf/auths.py +5 -0
  94. edc_crf/migrations/0001_initial.py +3 -2
  95. edc_crf/migrations/0009_alter_crfstatus_device_created_and_more.py +54 -0
  96. edc_dashboard/auths.py +10 -6
  97. edc_dashboard/migrations/0001_initial.py +3 -2
  98. edc_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  99. edc_dashboard/templatetags/edc_dashboard_extras.py +3 -2
  100. edc_dashboard/url_config.py +92 -83
  101. edc_dashboard/url_names.py +4 -4
  102. edc_dashboard/view_mixins/url_request_context_mixin.py +6 -5
  103. edc_data_manager/action_items.py +4 -6
  104. edc_data_manager/admin/actions.py +5 -5
  105. edc_data_manager/admin/data_query_admin.py +12 -11
  106. edc_data_manager/auths.py +37 -34
  107. edc_data_manager/handlers/handlers.py +6 -7
  108. edc_data_manager/migrations/0001_initial.py +19 -19
  109. edc_data_manager/migrations/0025_edcpermissions.py +3 -2
  110. edc_data_manager/migrations/0040_alter_datadictionary_device_created_and_more.py +327 -0
  111. edc_data_manager/migrations/0041_alter_dataquery_dm_user_and_more.py +164 -0
  112. edc_data_manager/models/data_query.py +5 -5
  113. edc_data_manager/models/model_mixins.py +8 -8
  114. edc_data_manager/rule/query_rule_wrapper.py +7 -7
  115. edc_data_manager/rule/rule_runner.py +4 -3
  116. edc_document_status/model_mixins.py +1 -1
  117. edc_egfr/egfr.py +11 -7
  118. edc_egfr/model_mixins/egfr_model_mixin.py +3 -7
  119. edc_export/admin/data_request_admin.py +2 -2
  120. edc_export/archive_exporter.py +7 -5
  121. edc_export/auths.py +32 -28
  122. edc_export/files_archiver.py +3 -2
  123. edc_export/migrations/0001_initial.py +26 -26
  124. edc_export/migrations/0004_auto_20190305_0123.py +25 -72
  125. edc_export/migrations/0013_edcpermissions.py +3 -2
  126. edc_export/migrations/0022_alter_datarequest_description_and_more.py +611 -0
  127. edc_export/migrations/0023_alter_datarequesthistory_archive_filename_and_more.py +29 -0
  128. edc_export/model_exporter/file_history_updater.py +10 -10
  129. edc_export/model_exporter/model_exporter.py +17 -15
  130. edc_export/model_exporter/object_history_helpers.py +2 -2
  131. edc_export/models/data_request_history.py +4 -4
  132. edc_export/utils.py +10 -15
  133. edc_facility/auths.py +8 -3
  134. edc_facility/facility.py +16 -22
  135. edc_facility/import_holidays.py +13 -13
  136. edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +8 -7
  137. edc_facility/migrations/0016_alter_healthfacility_device_created_and_more.py +139 -0
  138. edc_facility/migrations/0017_alter_healthfacility_gps_and_more.py +54 -0
  139. edc_facility/model_mixins.py +5 -5
  140. edc_form_label/custom_label_condition.py +11 -8
  141. edc_form_label/form_label.py +1 -1
  142. edc_form_runners/auths.py +11 -6
  143. edc_form_runners/form_runner.py +3 -5
  144. edc_form_runners/migrations/0001_initial.py +3 -2
  145. edc_form_runners/migrations/0005_alter_issue_device_created_and_more.py +49 -0
  146. edc_form_validators/applicable_field_validator.py +7 -6
  147. edc_form_validators/base_form_validator.py +8 -9
  148. edc_form_validators/other_specify_field_validator.py +2 -8
  149. edc_form_validators/required_field_validator.py +19 -16
  150. edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -3
  151. edc_identifier/migrations/0002_auto_20190305_0123.py +3 -6
  152. edc_identifier/migrations/0006_auto_20161127_2226.py +15 -15
  153. edc_identifier/migrations/0007_auto_20161204_2227.py +3 -3
  154. edc_identifier/migrations/0009_auto_20161221_2323.py +3 -5
  155. edc_identifier/migrations/0010_auto_20170112_0602.py +17 -17
  156. edc_identifier/migrations/0011_alter_identifiermodel_device_created_and_more.py +79 -0
  157. edc_identifier/model_mixins.py +1 -1
  158. edc_identifier/models.py +9 -9
  159. edc_identifier/research_identifier.py +11 -10
  160. edc_identifier/simple_identifier.py +9 -5
  161. edc_identifier/subject_identifier.py +3 -2
  162. edc_lab/auths.py +26 -23
  163. edc_lab/lab/aliquot_creator.py +5 -8
  164. edc_lab/lab/primary_aliquot.py +14 -5
  165. edc_lab/migrations/0001_initial.py +29 -29
  166. edc_lab/migrations/0008_auto_20170921_0719.py +3 -3
  167. edc_lab/migrations/0010_auto_20171127_1541.py +15 -15
  168. edc_lab/migrations/0012_auto_20180114_1438.py +3 -3
  169. edc_lab/migrations/0019_auto_20190305_0123.py +43 -127
  170. edc_lab/migrations/0036_alter_aliquot_comment_alter_aliquot_device_created_and_more.py +1139 -0
  171. edc_lab/migrations/0037_alter_historicalorder_order_datetime_and_more.py +31 -0
  172. edc_lab/model_mixins/aliquot/aliquot_identifier_model_mixin.py +2 -2
  173. edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +2 -2
  174. edc_lab/model_mixins/panel_model_mixin.py +18 -7
  175. edc_lab/model_mixins/requisition/crf_with_requisition_model_mixin.py +2 -4
  176. edc_lab/model_mixins/requisition/requisition_model_mixin.py +13 -16
  177. edc_lab/model_mixins/requisition/requisition_verify_model_mixin.py +1 -1
  178. edc_lab/model_mixins/result/result_item_model_mixin.py +4 -4
  179. edc_lab/model_mixins/shipping/manifest_model_mixin.py +4 -5
  180. edc_lab/model_mixins/shipping/verify_model_mixin.py +4 -6
  181. edc_lab/models/aliquot.py +2 -2
  182. edc_lab/models/box.py +1 -1
  183. edc_lab/models/box_item.py +6 -7
  184. edc_lab/models/manifest/manifest.py +3 -3
  185. edc_lab/models/manifest/manifest_item.py +7 -7
  186. edc_lab/models/manifest/shipper.py +3 -4
  187. edc_lab/models/order.py +6 -4
  188. edc_lab/models/panel.py +4 -4
  189. edc_lab/models/result.py +2 -2
  190. edc_lab/models/result_item.py +2 -2
  191. edc_lab_dashboard/auths.py +16 -11
  192. edc_lab_dashboard/migrations/0001_initial.py +3 -2
  193. edc_lab_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  194. edc_lab_dashboard/views/action_views/receive_view.py +2 -2
  195. edc_lab_dashboard/views/action_views/verify_box_item_view.py +2 -2
  196. edc_lab_results/calculate_missing.py +8 -8
  197. edc_lab_results/form_validator_mixins/blood_results_form_validator_mixin.py +2 -2
  198. edc_lab_results/get_summary.py +26 -25
  199. edc_lab_results/model_mixins/blood_result_model_mixin.py +9 -7
  200. edc_lab_results/model_mixins/fbg_model_mixin.py +3 -3
  201. edc_lab_results/model_mixins/glucose_model_mixin.py +3 -3
  202. edc_lab_results/model_mixins/hba1c_model_mixin.py +3 -3
  203. edc_label/auths.py +6 -1
  204. edc_label/label_template.py +8 -8
  205. edc_label/migrations/0001_initial.py +3 -2
  206. edc_label/migrations/0007_alter_zpllabeltemplates_device_created_and_more.py +49 -0
  207. edc_list_data/list_model_maker.py +2 -2
  208. edc_list_data/load_list_data.py +11 -14
  209. edc_list_data/load_model_data.py +3 -3
  210. edc_list_data/model_mixins.py +12 -4
  211. edc_list_data/post_migrate_signals.py +1 -1
  212. edc_list_data/preload_data.py +4 -4
  213. edc_list_data/row.py +1 -1
  214. edc_list_data/site_list_data.py +6 -5
  215. edc_listboard/migrations/0001_initial.py +3 -2
  216. edc_listboard/migrations/0007_alter_listboard_device_created_and_more.py +49 -0
  217. edc_locator/auths.py +18 -13
  218. edc_locator/migrations/0001_initial.py +7 -7
  219. edc_locator/migrations/0018_auto_20190305_0123.py +5 -12
  220. edc_locator/migrations/0040_alter_historicalsubjectlocator_action_identifier_and_more.py +187 -0
  221. edc_locator/migrations/0041_alter_historicalsubjectlocator_report_datetime_and_more.py +27 -0
  222. edc_locator/model_mixins/locator_model_mixin.py +2 -2
  223. edc_locator/model_mixins/subject_contact_fields_mixin.py +1 -1
  224. edc_locator/modeladmin_mixins.py +5 -4
  225. edc_ltfu/model_mixins.py +7 -5
  226. edc_metadata/auths.py +11 -7
  227. edc_metadata/metadata/metadata.py +1 -1
  228. edc_metadata/metadata_rules/crf/crf_rule.py +1 -1
  229. edc_metadata/metadata_rules/decorators.py +1 -1
  230. edc_metadata/metadata_rules/metadata_rule_evaluator.py +5 -3
  231. edc_metadata/metadata_rules/rule.py +2 -3
  232. edc_metadata/metadata_rules/rule_evaluator.py +1 -1
  233. edc_metadata/migrations/0002_auto_20161127_2226.py +5 -5
  234. edc_metadata/migrations/0005_auto_20170112_0602.py +5 -5
  235. edc_metadata/migrations/0011_auto_20190305_0123.py +5 -12
  236. edc_metadata/migrations/0031_alter_crfmetadata_device_created_and_more.py +120 -0
  237. edc_metadata/model_mixins/updates/updates_crf_metadata_model_mixin.py +7 -4
  238. edc_metadata/model_mixins/updates/updates_requisition_metadata_model_mixin.py +5 -2
  239. edc_metadata/models/crf_metadata.py +5 -5
  240. edc_metadata/models/crf_metadata_model_mixin.py +4 -5
  241. edc_metadata/models/requisition_metadata.py +6 -6
  242. edc_metadata/models/signals.py +10 -11
  243. edc_metadata/views/refresh_metadata_actions_view.py +3 -3
  244. edc_model/models/address_mixin.py +6 -6
  245. edc_model/models/fields/initials_field.py +2 -1
  246. edc_model/models/historical_records.py +2 -9
  247. edc_model/models/url_model_mixin.py +2 -2
  248. edc_model/validators/date.py +7 -8
  249. edc_model_admin/list_filters/future_date_list_filter.py +3 -3
  250. edc_model_admin/list_filters/past_date_list_filter.py +3 -3
  251. edc_model_admin/mixins/model_admin_protect_pii_mixin.py +4 -5
  252. edc_model_fields/fields/other_charfield.py +2 -2
  253. edc_navbar/auths.py +18 -13
  254. edc_navbar/migrations/0004_auto_20220825_0451.py +3 -2
  255. edc_navbar/migrations/0009_alter_edcpermissions_device_created_and_more.py +49 -0
  256. edc_notification/auths.py +9 -4
  257. edc_notification/migrations/0001_initial.py +3 -3
  258. edc_notification/migrations/0004_auto_20190305_0123.py +3 -6
  259. edc_notification/migrations/0011_alter_notification_device_created_and_more.py +59 -0
  260. edc_notification/models/notification.py +1 -1
  261. edc_notification/notification/graded_event_notification.py +2 -2
  262. edc_notification/notification/model_notification.py +3 -30
  263. edc_notification/notification/new_model_notification.py +1 -1
  264. edc_notification/notification/notification.py +12 -12
  265. edc_notification/notification/updated_model_notification.py +2 -2
  266. edc_offstudy/auths.py +12 -7
  267. edc_offstudy/migrations/0001_initial.py +4 -4
  268. edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -4
  269. edc_offstudy/migrations/0005_auto_20190305_0123.py +5 -12
  270. edc_offstudy/migrations/0023_alter_historicalsubjectoffstudy_action_identifier_and_more.py +188 -0
  271. edc_offstudy/migrations/0024_alter_historicalsubjectoffstudy_offstudy_datetime_and_more.py +43 -0
  272. edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -2
  273. edc_pdutils/df_exporters/csv_exporter.py +33 -37
  274. edc_pdutils/df_exporters/csv_model_exporter.py +7 -3
  275. edc_pdutils/migrations/0001_initial.py +8 -8
  276. edc_pharmacy/admin/prescription/rx_refill_admin.py +4 -3
  277. edc_pharmacy/admin/reports/stock_availability_admin.py +5 -6
  278. edc_pharmacy/auths.py +19 -15
  279. edc_pharmacy/migrations/0001_initial.py +64 -63
  280. edc_pharmacy/migrations/0015_auto_20220913_2139.py +26 -26
  281. edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +81 -86
  282. edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +5 -5
  283. edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -8
  284. edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +12 -12
  285. edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +5 -5
  286. edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +3 -4
  287. edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +3 -3
  288. edc_pharmacy/migrations/0057_scanduplicates.py +3 -3
  289. edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +13 -15
  290. edc_pharmacy/migrations/0068_stockout.py +2 -3
  291. edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -5
  292. edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +3 -4
  293. edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -8
  294. edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +0 -2
  295. edc_pharmacy/migrations/0089_alter_allocation_allocated_by_and_more.py +3284 -0
  296. edc_pharmacy/migrations/0090_alter_allocation_allocation_datetime_and_more.py +227 -0
  297. edc_pharmacy/model_mixins/study_medication_refill_model_mixin.py +2 -2
  298. edc_pharmacy/models/medication/formulation.py +5 -7
  299. edc_pharmacy/models/medication/medication.py +3 -3
  300. edc_pharmacy/models/model_mixins.py +10 -11
  301. edc_pharmacy/models/prescription/rx.py +13 -12
  302. edc_pharmacy/models/prescription/rx_refill.py +0 -1
  303. edc_pharmacy/models/stock/allocation.py +3 -3
  304. edc_pharmacy/models/stock/confirmation.py +3 -3
  305. edc_pharmacy/models/stock/confirmation_at_site.py +3 -2
  306. edc_pharmacy/models/stock/confirmation_at_site_item.py +3 -4
  307. edc_pharmacy/models/stock/dispense.py +5 -6
  308. edc_pharmacy/models/stock/dispense_item.py +2 -2
  309. edc_pharmacy/models/stock/location.py +3 -4
  310. edc_pharmacy/models/stock/lot.py +6 -7
  311. edc_pharmacy/models/stock/order.py +1 -1
  312. edc_pharmacy/models/stock/receive.py +3 -3
  313. edc_pharmacy/models/stock/receive_item.py +4 -4
  314. edc_pharmacy/models/stock/repack_request.py +2 -2
  315. edc_pharmacy/models/stock/stock.py +12 -18
  316. edc_pharmacy/models/stock/stock_adjustment.py +4 -4
  317. edc_pharmacy/models/stock/stock_request.py +2 -2
  318. edc_pharmacy/models/stock/stock_request_item.py +2 -2
  319. edc_pharmacy/models/stock/stock_transfer.py +3 -3
  320. edc_pharmacy/models/stock/stock_transfer_item.py +2 -2
  321. edc_pharmacy/models/stock/storage_bin.py +3 -4
  322. edc_pharmacy/models/stock/storage_bin_item.py +2 -2
  323. edc_pharmacy/models/stock/supplier.py +3 -4
  324. edc_pharmacy/models/storage/box.py +2 -2
  325. edc_pharmacy/models/storage/items/container_model_mixin.py +3 -4
  326. edc_pharmacy/models/storage/items/pill_bottle_model_mixin.py +2 -2
  327. edc_pharmacy/models/storage/items/subject_pill_bottle.py +1 -1
  328. edc_pharmacy/models/storage/room.py +2 -2
  329. edc_pharmacy/models/storage/shelf.py +2 -2
  330. edc_pharmacy/models/storage/utils.py +1 -1
  331. edc_pharmacy/prescribe/create_prescription.py +3 -3
  332. edc_pharmacy/utils/allocate_stock.py +2 -3
  333. edc_pharmacy/utils/confirm_stock.py +3 -4
  334. edc_pharmacy/utils/confirm_stock_at_site.py +4 -5
  335. edc_pharmacy/utils/dispense.py +3 -4
  336. edc_pharmacy/utils/process_repack_request.py +4 -5
  337. edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -3
  338. edc_pharmacy/utils/transfer_stock.py +2 -3
  339. edc_pharmacy/views/add_to_storage_bin_view.py +2 -2
  340. edc_pharmacy/views/allocate_to_subject_view.py +2 -2
  341. edc_pharmacy/views/confirmation_at_site_view.py +6 -9
  342. edc_pharmacy/views/dispense_view.py +2 -2
  343. edc_pharmacy/views/move_to_storage_bin_view.py +2 -3
  344. edc_pharmacy/views/print_labels_view.py +2 -2
  345. edc_prn/admin_site.py +5 -0
  346. edc_prn/prn.py +10 -11
  347. edc_prn/urls.py +11 -0
  348. edc_protocol/research_protocol_config.py +2 -3
  349. edc_protocol_incident/action_items.py +4 -4
  350. edc_protocol_incident/auths.py +27 -20
  351. edc_protocol_incident/migrations/0001_initial.py +7 -7
  352. edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +13 -13
  353. edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +7 -7
  354. edc_protocol_incident/migrations/0024_alter_actionsrequired_extra_value_and_more.py +625 -0
  355. edc_protocol_incident/migrations/0025_alter_historicalprotocoldeviationviolation_report_datetime_and_more.py +42 -0
  356. edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +18 -11
  357. edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +26 -11
  358. edc_pylabels/actions.py +3 -5
  359. edc_pylabels/auths.py +6 -1
  360. edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +3 -7
  361. edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +3 -3
  362. edc_pylabels/migrations/0013_alter_labelconfiguration_device_created_and_more.py +49 -0
  363. edc_qareports/auths.py +11 -7
  364. edc_qareports/migrations/0001_initial.py +4 -5
  365. edc_qareports/migrations/0005_edcpermissions.py +3 -3
  366. edc_qareports/migrations/0006_qareportlog.py +2 -3
  367. edc_qareports/migrations/0019_alter_edcpermissions_device_created_and_more.py +102 -0
  368. edc_qareports/migrations/0020_alter_note_report_datetime_and_more.py +24 -0
  369. edc_qareports/model_mixins/note_model_mixin.py +7 -4
  370. edc_qareports/model_mixins/on_study_missing_values_model_mixin.py +4 -4
  371. edc_qareports/model_mixins/qa_report_model_mixin.py +2 -3
  372. edc_qareports/models/note.py +4 -4
  373. edc_qareports/models/qa_reports_log.py +2 -3
  374. edc_randomization/admin.py +30 -24
  375. edc_randomization/auths.py +12 -7
  376. edc_randomization/decorators.py +1 -1
  377. edc_randomization/migrations/0001_initial.py +3 -2
  378. edc_randomization/migrations/0002_historicalrandomizationlist.py +3 -2
  379. edc_randomization/migrations/0009_edcpermissions.py +3 -2
  380. edc_randomization/migrations/0014_alter_edcpermissions_device_created_and_more.py +141 -0
  381. edc_randomization/model_mixins.py +9 -9
  382. edc_randomization/randomizer.py +22 -20
  383. edc_randomization/utils.py +19 -18
  384. edc_refusal/auths.py +7 -2
  385. edc_refusal/migrations/0001_initial.py +4 -4
  386. edc_refusal/migrations/0002_historicalsubjectrefusal.py +4 -4
  387. edc_refusal/migrations/0012_alter_historicalsubjectrefusal_comment_and_more.py +122 -0
  388. edc_refusal/migrations/0013_alter_historicalsubjectrefusal_report_datetime_and_more.py +28 -0
  389. edc_refusal/model_mixins.py +4 -4
  390. edc_registration/auths.py +28 -23
  391. edc_registration/migrations/0002_auto_20161127_2226.py +3 -4
  392. edc_registration/migrations/0005_auto_20170111_1809.py +4 -2
  393. edc_registration/migrations/0016_historicalregisteredsubject.py +3 -2
  394. edc_registration/migrations/0017_auto_20190305_0123.py +5 -12
  395. edc_registration/migrations/0033_alter_historicalregisteredsubject_additional_key_and_more.py +302 -0
  396. edc_registration/model_mixins/updates_or_creates_registered_subject_model_mixin.py +15 -7
  397. edc_registration/models/registered_subject.py +28 -27
  398. edc_reportable/age_evaluator.py +4 -2
  399. edc_reportable/formula.py +5 -5
  400. edc_reportable/migrations/0001_initial.py +7 -7
  401. edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -3
  402. edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +5 -5
  403. edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +5 -6
  404. edc_reportable/migrations/0007_alter_gradingdata_age_phrase_and_more.py +509 -0
  405. edc_reportable/models/normal_data.py +4 -5
  406. edc_reportable/models/reference_model_mixins.py +10 -11
  407. edc_reportable/models/reference_range_collection.py +12 -13
  408. edc_reportable/post_migrate_signals.py +1 -1
  409. edc_reportable/utils/convert_units.py +11 -45
  410. edc_reportable/utils/get_normal_data_or_raise.py +2 -2
  411. edc_reportable/utils/get_reference_range_collection.py +2 -3
  412. edc_reportable/utils/load_data.py +4 -4
  413. edc_reportable/utils/update_grading_data.py +5 -5
  414. edc_review_dashboard/auths.py +23 -18
  415. edc_review_dashboard/migrations/0001_initial.py +3 -2
  416. edc_review_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  417. edc_screening/age_evaluator.py +6 -6
  418. edc_screening/auths.py +35 -30
  419. edc_screening/eligibility.py +1 -1
  420. edc_screening/gender_evaluator.py +1 -1
  421. edc_screening/migrations/0001_initial.py +3 -2
  422. edc_screening/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  423. edc_screening/model_mixins/eligibility_model_mixin.py +3 -6
  424. edc_screening/model_mixins/screening_fields_model_mixin.py +6 -8
  425. edc_screening/model_mixins/screening_methods_model_mixin.py +1 -1
  426. edc_screening/screening_eligibility.py +2 -4
  427. edc_screening/utils.py +9 -9
  428. edc_search/generate_slug.py +26 -0
  429. edc_search/model_mixins.py +10 -22
  430. edc_sites/auths.py +8 -3
  431. edc_sites/migrations/0007_edcpermissions.py +3 -2
  432. edc_sites/migrations/0010_alter_edcpermissions_device_created_and_more.py +69 -0
  433. edc_sites/model_mixins/site_model_mixin.py +2 -2
  434. edc_sites/site.py +5 -5
  435. edc_sites/system_checks.py +1 -1
  436. edc_subject_dashboard/auths.py +27 -22
  437. edc_subject_dashboard/migrations/0001_initial.py +3 -2
  438. edc_subject_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  439. edc_subject_dashboard/requisition_report.py +6 -4
  440. edc_subject_dashboard/requisition_verifier.py +6 -6
  441. edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -2
  442. edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +7 -8
  443. edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +3 -2
  444. edc_subject_dashboard/view_utils/timepoint_status_button.py +2 -2
  445. edc_timepoint/apps.py +0 -21
  446. edc_timepoint/model_mixins.py +22 -20
  447. edc_transfer/model_mixins.py +4 -4
  448. edc_transfer/modeladmin_mixins.py +1 -1
  449. edc_unblinding/auths.py +9 -4
  450. edc_unblinding/migrations/0001_initial.py +13 -13
  451. edc_unblinding/migrations/0014_alter_historicalunblindingrequest_action_identifier_and_more.py +291 -0
  452. edc_unblinding/migrations/0015_alter_historicalunblindingrequest_report_datetime_and_more.py +45 -0
  453. edc_unblinding/models/unblinding_request.py +2 -2
  454. edc_unblinding/models/unblinding_review.py +3 -3
  455. edc_utils/__init__.py +3 -1
  456. edc_utils/age.py +10 -16
  457. edc_utils/show_urls.py +29 -2
  458. edc_visit_schedule/auths.py +6 -1
  459. edc_visit_schedule/migrations/0001_initial.py +3 -3
  460. edc_visit_schedule/migrations/0002_auto_20190305_0123.py +3 -6
  461. edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +5 -4
  462. edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +10 -10
  463. edc_visit_schedule/migrations/0019_alter_historicalonschedule_device_created_and_more.py +229 -0
  464. edc_visit_schedule/migrations/0020_alter_historicalonschedule_onschedule_datetime_and_more.py +65 -0
  465. edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +5 -4
  466. edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +5 -4
  467. edc_visit_schedule/model_mixins/visit_schedule/visit_code_fields_model_mixin.py +1 -1
  468. edc_visit_schedule/models/subject_schedule_history.py +6 -6
  469. edc_visit_schedule/schedule/visit_collection.py +1 -1
  470. edc_visit_schedule/site_visit_schedules.py +2 -2
  471. edc_visit_schedule/subject_schedule.py +5 -4
  472. edc_visit_schedule/view_mixins.py +2 -3
  473. edc_visit_schedule/visit/visit.py +3 -2
  474. edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +13 -13
  475. edc_visit_tracking/migrations/0009_alter_historicalsubjectvisit_comments_and_more.py +450 -0
  476. edc_visit_tracking/migrations/0010_alter_historicalsubjectvisit_report_datetime_and_more.py +68 -0
  477. edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +3 -3
  478. edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +2 -2
  479. edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +2 -2
  480. edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +2 -2
  481. edc_visit_tracking/model_mixins/visit_model_mixin/caretaker_fields_mixin.py +2 -3
  482. edc_visit_tracking/model_mixins/visit_model_mixin/previous_visit_model_mixin.py +1 -1
  483. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +8 -11
  484. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_mixin.py +1 -1
  485. edc_visit_tracking/models/signals.py +3 -3
  486. edc_visit_tracking/models/subject_visit.py +1 -1
  487. edc_vitals/calculators/bmi.py +7 -5
  488. edc_vitals/utils.py +1 -1
  489. edc_form_label/models.py +0 -0
  490. edc_search/constants.py +0 -1
  491. edc_search/models.py +0 -0
  492. edc_search/search_slug.py +0 -50
  493. edc_search/updater.py +0 -30
  494. edc_search/wsgi.py +0 -7
  495. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,285 @@
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_adverse_event", "0015_alter_aeactionclassification_revision_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="aeactionclassification",
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="aeactionclassification",
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="aeactionclassification",
29
+ name="extra_value",
30
+ field=models.CharField(default="", max_length=250),
31
+ ),
32
+ migrations.AlterField(
33
+ model_name="aeactionclassification",
34
+ name="field_name",
35
+ field=models.CharField(
36
+ blank=True,
37
+ default="",
38
+ editable=False,
39
+ help_text="Not required",
40
+ max_length=25,
41
+ ),
42
+ ),
43
+ migrations.AlterField(
44
+ model_name="aeactionclassification",
45
+ name="locale_created",
46
+ field=models.CharField(
47
+ blank=True,
48
+ default="",
49
+ help_text="Auto-updated by Modeladmin",
50
+ max_length=10,
51
+ verbose_name="Locale created",
52
+ ),
53
+ ),
54
+ migrations.AlterField(
55
+ model_name="aeactionclassification",
56
+ name="locale_modified",
57
+ field=models.CharField(
58
+ blank=True,
59
+ default="",
60
+ help_text="Auto-updated by Modeladmin",
61
+ max_length=10,
62
+ verbose_name="Locale modified",
63
+ ),
64
+ ),
65
+ migrations.AlterField(
66
+ model_name="aeactionclassification",
67
+ name="plural_name",
68
+ field=models.CharField(
69
+ default="", max_length=250, verbose_name="Plural name"
70
+ ),
71
+ ),
72
+ migrations.AlterField(
73
+ model_name="aeclassification",
74
+ name="device_created",
75
+ field=models.CharField(
76
+ blank=True, default="", max_length=10, verbose_name="Device created"
77
+ ),
78
+ ),
79
+ migrations.AlterField(
80
+ model_name="aeclassification",
81
+ name="device_modified",
82
+ field=models.CharField(
83
+ blank=True, default="", max_length=10, verbose_name="Device modified"
84
+ ),
85
+ ),
86
+ migrations.AlterField(
87
+ model_name="aeclassification",
88
+ name="extra_value",
89
+ field=models.CharField(default="", max_length=250),
90
+ ),
91
+ migrations.AlterField(
92
+ model_name="aeclassification",
93
+ name="field_name",
94
+ field=models.CharField(
95
+ blank=True,
96
+ default="",
97
+ editable=False,
98
+ help_text="Not required",
99
+ max_length=25,
100
+ ),
101
+ ),
102
+ migrations.AlterField(
103
+ model_name="aeclassification",
104
+ name="locale_created",
105
+ field=models.CharField(
106
+ blank=True,
107
+ default="",
108
+ help_text="Auto-updated by Modeladmin",
109
+ max_length=10,
110
+ verbose_name="Locale created",
111
+ ),
112
+ ),
113
+ migrations.AlterField(
114
+ model_name="aeclassification",
115
+ name="locale_modified",
116
+ field=models.CharField(
117
+ blank=True,
118
+ default="",
119
+ help_text="Auto-updated by Modeladmin",
120
+ max_length=10,
121
+ verbose_name="Locale modified",
122
+ ),
123
+ ),
124
+ migrations.AlterField(
125
+ model_name="aeclassification",
126
+ name="plural_name",
127
+ field=models.CharField(
128
+ default="", max_length=250, verbose_name="Plural name"
129
+ ),
130
+ ),
131
+ migrations.AlterField(
132
+ model_name="causeofdeath",
133
+ name="device_created",
134
+ field=models.CharField(
135
+ blank=True, default="", max_length=10, verbose_name="Device created"
136
+ ),
137
+ ),
138
+ migrations.AlterField(
139
+ model_name="causeofdeath",
140
+ name="device_modified",
141
+ field=models.CharField(
142
+ blank=True, default="", max_length=10, verbose_name="Device modified"
143
+ ),
144
+ ),
145
+ migrations.AlterField(
146
+ model_name="causeofdeath",
147
+ name="extra_value",
148
+ field=models.CharField(default="", max_length=250),
149
+ ),
150
+ migrations.AlterField(
151
+ model_name="causeofdeath",
152
+ name="field_name",
153
+ field=models.CharField(
154
+ blank=True,
155
+ default="",
156
+ editable=False,
157
+ help_text="Not required",
158
+ max_length=25,
159
+ ),
160
+ ),
161
+ migrations.AlterField(
162
+ model_name="causeofdeath",
163
+ name="locale_created",
164
+ field=models.CharField(
165
+ blank=True,
166
+ default="",
167
+ help_text="Auto-updated by Modeladmin",
168
+ max_length=10,
169
+ verbose_name="Locale created",
170
+ ),
171
+ ),
172
+ migrations.AlterField(
173
+ model_name="causeofdeath",
174
+ name="locale_modified",
175
+ field=models.CharField(
176
+ blank=True,
177
+ default="",
178
+ help_text="Auto-updated by Modeladmin",
179
+ max_length=10,
180
+ verbose_name="Locale modified",
181
+ ),
182
+ ),
183
+ migrations.AlterField(
184
+ model_name="causeofdeath",
185
+ name="plural_name",
186
+ field=models.CharField(
187
+ default="", max_length=250, verbose_name="Plural name"
188
+ ),
189
+ ),
190
+ migrations.AlterField(
191
+ model_name="edcpermissions",
192
+ name="device_created",
193
+ field=models.CharField(
194
+ blank=True, default="", max_length=10, verbose_name="Device created"
195
+ ),
196
+ ),
197
+ migrations.AlterField(
198
+ model_name="edcpermissions",
199
+ name="device_modified",
200
+ field=models.CharField(
201
+ blank=True, default="", max_length=10, verbose_name="Device modified"
202
+ ),
203
+ ),
204
+ migrations.AlterField(
205
+ model_name="edcpermissions",
206
+ name="locale_created",
207
+ field=models.CharField(
208
+ blank=True,
209
+ default="",
210
+ help_text="Auto-updated by Modeladmin",
211
+ max_length=10,
212
+ verbose_name="Locale created",
213
+ ),
214
+ ),
215
+ migrations.AlterField(
216
+ model_name="edcpermissions",
217
+ name="locale_modified",
218
+ field=models.CharField(
219
+ blank=True,
220
+ default="",
221
+ help_text="Auto-updated by Modeladmin",
222
+ max_length=10,
223
+ verbose_name="Locale modified",
224
+ ),
225
+ ),
226
+ migrations.AlterField(
227
+ model_name="saereason",
228
+ name="device_created",
229
+ field=models.CharField(
230
+ blank=True, default="", max_length=10, verbose_name="Device created"
231
+ ),
232
+ ),
233
+ migrations.AlterField(
234
+ model_name="saereason",
235
+ name="device_modified",
236
+ field=models.CharField(
237
+ blank=True, default="", max_length=10, verbose_name="Device modified"
238
+ ),
239
+ ),
240
+ migrations.AlterField(
241
+ model_name="saereason",
242
+ name="extra_value",
243
+ field=models.CharField(default="", max_length=250),
244
+ ),
245
+ migrations.AlterField(
246
+ model_name="saereason",
247
+ name="field_name",
248
+ field=models.CharField(
249
+ blank=True,
250
+ default="",
251
+ editable=False,
252
+ help_text="Not required",
253
+ max_length=25,
254
+ ),
255
+ ),
256
+ migrations.AlterField(
257
+ model_name="saereason",
258
+ name="locale_created",
259
+ field=models.CharField(
260
+ blank=True,
261
+ default="",
262
+ help_text="Auto-updated by Modeladmin",
263
+ max_length=10,
264
+ verbose_name="Locale created",
265
+ ),
266
+ ),
267
+ migrations.AlterField(
268
+ model_name="saereason",
269
+ name="locale_modified",
270
+ field=models.CharField(
271
+ blank=True,
272
+ default="",
273
+ help_text="Auto-updated by Modeladmin",
274
+ max_length=10,
275
+ verbose_name="Locale modified",
276
+ ),
277
+ ),
278
+ migrations.AlterField(
279
+ model_name="saereason",
280
+ name="plural_name",
281
+ field=models.CharField(
282
+ default="", max_length=250, verbose_name="Plural name"
283
+ ),
284
+ ),
285
+ ]
@@ -1,9 +1,9 @@
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_constants.constants import NOT_APPLICABLE, YES
5
6
  from edc_model.validators import date_not_future
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from ...choices import AE_GRADE_SIMPLE, AE_OUTCOME
9
9
  from ...utils import get_adverse_event_app_label
@@ -15,7 +15,7 @@ class AeFollowupFieldsModelMixin(models.Model):
15
15
  )
16
16
 
17
17
  report_datetime = models.DateTimeField(
18
- verbose_name="Report date and time", default=get_utcnow
18
+ verbose_name="Report date and time", default=timezone.now
19
19
  )
20
20
 
21
21
  outcome = models.CharField(blank=False, null=False, max_length=25, choices=AE_OUTCOME)
@@ -1,9 +1,9 @@
1
+ import django.utils.timezone
1
2
  from django.db import models
2
3
 
3
4
  from edc_constants.constants import NOT_APPLICABLE
4
5
  from edc_model.validators import date_not_future
5
6
  from edc_model_fields.fields.other_charfield import OtherCharField
6
- from edc_utils.date import get_utcnow
7
7
 
8
8
  from ...choices import AE_GRADE, STUDY_DRUG_RELATIONSHIP
9
9
  from ...models import AeClassification
@@ -17,7 +17,7 @@ class AeInitialFieldsModelMixin(models.Model):
17
17
  )
18
18
 
19
19
  report_datetime = models.DateTimeField(
20
- verbose_name="Report Date and Time", default=get_utcnow
20
+ verbose_name="Report Date and Time", default=django.utils.timezone.now
21
21
  )
22
22
 
23
23
  ae_classification = models.ForeignKey(
@@ -34,22 +34,23 @@ class AeInitialFieldsModelMixin(models.Model):
34
34
 
35
35
  ae_awareness_date = models.DateField(
36
36
  verbose_name="AE Awareness date",
37
- default=get_utcnow,
37
+ default=django.utils.timezone.now,
38
38
  validators=[date_not_future],
39
39
  )
40
40
 
41
41
  ae_start_date = models.DateField(
42
42
  verbose_name="Actual Start Date of AE",
43
- default=get_utcnow,
43
+ default=django.utils.timezone.now,
44
44
  validators=[date_not_future],
45
45
  )
46
46
 
47
47
  ae_grade = models.CharField(verbose_name="Severity of AE", max_length=25, choices=AE_GRADE)
48
48
 
49
- study_drug_relation = models.CharField(
49
+ study_drug_relation = models.CharField( # noqa: DJ001
50
50
  verbose_name="Relation to study drug:",
51
51
  max_length=25,
52
52
  choices=STUDY_DRUG_RELATIONSHIP,
53
+ null=True,
53
54
  )
54
55
 
55
56
  class Meta:
@@ -1,7 +1,7 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
 
3
4
  from edc_model.validators import datetime_not_future
4
- from edc_utils import get_utcnow
5
5
 
6
6
  from ...utils import get_adverse_event_app_label
7
7
 
@@ -14,7 +14,7 @@ class AesiFieldsModelMixin(models.Model):
14
14
  report_datetime = models.DateTimeField(
15
15
  verbose_name="Report date and time",
16
16
  validators=[datetime_not_future],
17
- default=get_utcnow,
17
+ default=timezone.now,
18
18
  )
19
19
 
20
20
  submitted_datetime = models.DateTimeField(
@@ -1,7 +1,7 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
 
3
4
  from edc_model.validators import datetime_not_future
4
- from edc_utils import get_utcnow
5
5
 
6
6
  from ...utils import get_adverse_event_app_label
7
7
 
@@ -14,7 +14,7 @@ class AeSusarFieldsModelMixin(models.Model):
14
14
  report_datetime = models.DateTimeField(
15
15
  verbose_name="Report date and time",
16
16
  validators=[datetime_not_future],
17
- default=get_utcnow,
17
+ default=timezone.now,
18
18
  )
19
19
 
20
20
  submitted_datetime = models.DateTimeField(
@@ -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, YES_NO_NA
4
5
  from edc_constants.constants import NOT_APPLICABLE
5
6
  from edc_model.validators import datetime_not_future
6
7
  from edc_model_fields.fields import OtherCharField
7
- from edc_utils import get_utcnow
8
8
 
9
9
  from ...models import AeClassification
10
10
  from ...utils import get_adverse_event_app_label
@@ -24,7 +24,7 @@ class AeTmgFieldsModelMixin(models.Model):
24
24
  report_datetime = models.DateTimeField(
25
25
  verbose_name="Report date and time",
26
26
  validators=[datetime_not_future],
27
- default=get_utcnow,
27
+ default=timezone.now,
28
28
  )
29
29
 
30
30
  ae_received_datetime = models.DateTimeField(
@@ -41,25 +41,31 @@ class AeTmgFieldsModelMixin(models.Model):
41
41
  verbose_name="Date and time of clinical review: ",
42
42
  )
43
43
 
44
- ae_description = models.TextField(blank=True, verbose_name="Description of AE:")
44
+ ae_description = models.TextField(
45
+ verbose_name="Description of AE:",
46
+ default="",
47
+ blank=True,
48
+ )
45
49
 
46
50
  investigator_comments = models.TextField(
47
- blank=True, verbose_name="This investigator's comments:"
51
+ verbose_name="This investigator's comments:",
52
+ default="",
53
+ blank=True,
48
54
  )
49
55
 
50
- ae_classification = models.CharField(max_length=150, blank=True)
56
+ ae_classification = models.CharField(max_length=150, blank=True, default="")
51
57
 
52
- ae_classification_other = OtherCharField(max_length=250, blank=True, null=True)
58
+ ae_classification_other = OtherCharField(max_length=250, blank=True, default="")
53
59
 
54
60
  original_report_agreed = models.CharField(
55
61
  verbose_name="Does this investigator agree with the original AE report?",
56
62
  max_length=15,
57
63
  choices=YES_NO,
58
- blank=False,
64
+ default="",
59
65
  help_text="If No, explain in the narrative below",
60
66
  )
61
67
 
62
- investigator_narrative = models.TextField(verbose_name="Narrative", blank=True)
68
+ investigator_narrative = models.TextField(verbose_name="Narrative", blank=True, default="")
63
69
 
64
70
  investigator_ae_classification_agreed = models.CharField(
65
71
  verbose_name=(
@@ -68,7 +74,6 @@ class AeTmgFieldsModelMixin(models.Model):
68
74
  ),
69
75
  max_length=15,
70
76
  choices=YES_NO_NA,
71
- blank=False,
72
77
  default=NOT_APPLICABLE,
73
78
  help_text="If No, select a classification below",
74
79
  )
@@ -78,14 +83,13 @@ class AeTmgFieldsModelMixin(models.Model):
78
83
  on_delete=models.PROTECT,
79
84
  verbose_name="Adverse Event (AE) Classification",
80
85
  null=True,
81
- blank=False,
82
86
  help_text=(
83
87
  "Only applicable if this investigator does not agree with the original AE report"
84
88
  ),
85
89
  )
86
90
 
87
91
  investigator_ae_classification_other = OtherCharField(
88
- max_length=250, blank=True, null=True
92
+ max_length=250, blank=True, default=""
89
93
  )
90
94
 
91
95
  officials_notified = models.DateTimeField(
@@ -18,8 +18,6 @@ class AeTmgMethodsModelMixin(models.Model):
18
18
  def get_action_item_reason(self):
19
19
  return self.ae_initial.ae_description
20
20
 
21
- def get_search_slug_fields(self):
21
+ def get_search_slug_fields(self) -> tuple[str]:
22
22
  fields = super().get_search_slug_fields()
23
- fields.append("subject_identifier")
24
- fields.append("report_status")
25
- return fields
23
+ return *fields, "subject_identifier", "report_status"
@@ -1,6 +1,7 @@
1
1
  from django.core.validators import MinValueValidator
2
2
  from django.db import models
3
3
  from django.db.models.deletion import PROTECT
4
+ from django.utils import timezone
4
5
 
5
6
  from edc_action_item.managers import (
6
7
  ActionIdentifierModelManager,
@@ -18,7 +19,6 @@ from edc_protocol.validators import (
18
19
  datetime_not_before_study_start,
19
20
  )
20
21
  from edc_sites.model_mixins import SiteModelMixin
21
- from edc_utils import get_utcnow
22
22
 
23
23
  from ...constants import DEATH_REPORT_ACTION
24
24
  from ...models import CauseOfDeath
@@ -41,7 +41,7 @@ class DeathReportModelMixin(
41
41
  report_datetime = models.DateTimeField(
42
42
  verbose_name="Report Date",
43
43
  validators=[datetime_not_before_study_start, datetime_not_future],
44
- default=get_utcnow,
44
+ default=timezone.now,
45
45
  )
46
46
 
47
47
  death_datetime = models.DateTimeField(
@@ -70,6 +70,7 @@ class DeathReportModelMixin(
70
70
  max_length=5,
71
71
  verbose_name="Death as inpatient",
72
72
  blank=False,
73
+ default="",
73
74
  )
74
75
 
75
76
  cause_of_death = models.ForeignKey(
@@ -83,9 +84,9 @@ class DeathReportModelMixin(
83
84
  blank=False,
84
85
  )
85
86
 
86
- cause_of_death_other = OtherCharField(max_length=100, blank=True, null=True)
87
+ cause_of_death_other = OtherCharField(max_length=100, blank=True, default="")
87
88
 
88
- narrative = models.TextField(verbose_name="Narrative", blank=False)
89
+ narrative = models.TextField(verbose_name="Narrative", default="")
89
90
 
90
91
  objects = ActionIdentifierModelManager()
91
92
 
@@ -1,5 +1,6 @@
1
1
  from django.db import models
2
2
  from django.db.models.deletion import PROTECT
3
+ from django.utils import timezone
3
4
 
4
5
  from edc_action_item.managers import (
5
6
  ActionIdentifierModelManager,
@@ -12,7 +13,6 @@ from edc_model.models import ReportStatusModelMixin
12
13
  from edc_model.validators import datetime_not_future
13
14
  from edc_protocol.validators import datetime_not_before_study_start
14
15
  from edc_sites.model_mixins import SiteModelMixin
15
- from edc_utils import get_utcnow
16
16
 
17
17
  from ...constants import DEATH_REPORT_TMG_ACTION, DEATH_REPORT_TMG_SECOND_ACTION
18
18
  from ...models import CauseOfDeath
@@ -51,7 +51,7 @@ class DeathReportTmgFieldsModelMixin(models.Model):
51
51
  report_datetime = models.DateTimeField(
52
52
  verbose_name="Report Date",
53
53
  validators=[datetime_not_before_study_start, datetime_not_future],
54
- default=get_utcnow,
54
+ default=timezone.now,
55
55
  )
56
56
 
57
57
  cause_of_death = models.ForeignKey(
@@ -62,22 +62,25 @@ class DeathReportTmgFieldsModelMixin(models.Model):
62
62
  "Main cause of death in the opinion of the local study doctor and local PI"
63
63
  ),
64
64
  null=True,
65
+ default="",
65
66
  )
66
67
 
67
68
  cause_of_death_other = models.CharField(
68
69
  verbose_name='If "Other" above, please specify',
69
70
  max_length=100,
70
71
  blank=True,
72
+ default="",
71
73
  )
72
74
 
73
75
  cause_of_death_agreed = models.CharField(
74
76
  verbose_name="Is the cause of death agreed between study doctor and TMG member?",
75
77
  max_length=15,
76
78
  choices=YES_NO,
79
+ default="",
77
80
  help_text="If No, explain in the narrative below",
78
81
  )
79
82
 
80
- narrative = models.TextField(verbose_name="Narrative", blank=True)
83
+ narrative = models.TextField(verbose_name="Narrative", blank=True, default="")
81
84
 
82
85
  class Meta:
83
86
  abstract = True
@@ -1,4 +1,5 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
 
3
4
  from edc_action_item.managers import (
4
5
  ActionIdentifierModelManager,
@@ -9,7 +10,6 @@ from edc_identifier.model_mixins import UniqueSubjectIdentifierFieldMixin
9
10
  from edc_model.validators import date_not_future, datetime_not_future
10
11
  from edc_protocol.validators import datetime_not_before_study_start
11
12
  from edc_sites.model_mixins import SiteModelMixin
12
- from edc_utils import get_utcnow
13
13
 
14
14
  from ...constants import DEATH_REPORT_ACTION
15
15
 
@@ -27,7 +27,7 @@ class SimpleDeathReportModelMixin(
27
27
  report_datetime = models.DateTimeField(
28
28
  verbose_name="Report Date",
29
29
  validators=[datetime_not_before_study_start, datetime_not_future],
30
- default=get_utcnow,
30
+ default=timezone.now,
31
31
  )
32
32
 
33
33
  death_datetime = models.DateTimeField(
@@ -1,22 +1,23 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
 
3
4
  from edc_constants.choices import YES_NO, YES_NO_UNKNOWN
4
5
  from edc_constants.constants import NOT_APPLICABLE
5
6
  from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
6
7
  from edc_model import models as edc_models
7
8
  from edc_model.validators import date_not_future, datetime_not_future
9
+ from edc_model_fields.fields import IsDateEstimatedField
8
10
  from edc_protocol.validators import (
9
11
  date_not_before_study_start,
10
12
  datetime_not_before_study_start,
11
13
  )
12
- from edc_utils import get_utcnow
13
14
 
14
15
 
15
16
  class HospitalizationModelMixin(NonUniqueSubjectIdentifierFieldMixin, models.Model):
16
17
  report_datetime = models.DateTimeField(
17
18
  verbose_name="Report Date",
18
19
  validators=[datetime_not_before_study_start, datetime_not_future],
19
- default=get_utcnow,
20
+ default=timezone.now,
20
21
  )
21
22
 
22
23
  have_details = models.CharField(
@@ -30,7 +31,7 @@ class HospitalizationModelMixin(NonUniqueSubjectIdentifierFieldMixin, models.Mod
30
31
  validators=[date_not_future, date_not_before_study_start],
31
32
  )
32
33
 
33
- admitted_date_estimated = edc_models.IsDateEstimatedField(
34
+ admitted_date_estimated = IsDateEstimatedField(
34
35
  verbose_name="Is this date estimated?",
35
36
  )
36
37
 
@@ -4,6 +4,7 @@ from django.contrib import admin
4
4
  from django.contrib.admin import display
5
5
  from django.template.loader import render_to_string
6
6
  from django.urls import NoReverseMatch, reverse
7
+ from django.utils import timezone
7
8
  from django_audit_fields.admin import audit_fieldset_tuple
8
9
 
9
10
  from edc_action_item.fieldsets import action_fieldset_tuple
@@ -12,7 +13,6 @@ from edc_constants.constants import CANCELLED, OTHER
12
13
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
13
14
  from edc_model_admin.list_filters import ReportDateListFilter
14
15
  from edc_pdf_reports.admin import PdfButtonModelAdminMixin, print_selected_to_pdf_action
15
- from edc_utils import get_utcnow
16
16
 
17
17
  from ..utils import get_adverse_event_app_label
18
18
  from .list_filters import CauseOfDeathListFilter, DeathDateListFilter
@@ -111,14 +111,14 @@ class DeathReportModelAdminMixin(
111
111
  def report_datetime_with_ago(self, obj=None):
112
112
  return render_to_string(
113
113
  "edc_adverse_event/datetime_with_ago.html",
114
- dict(utc_date=get_utcnow().date, report_datetime=obj.report_datetime),
114
+ dict(utc_date=timezone.now().date, report_datetime=obj.report_datetime),
115
115
  )
116
116
 
117
117
  @display(description="Death date", ordering="death_datetime")
118
118
  def death_datetime_with_ago(self, obj=None):
119
119
  return render_to_string(
120
120
  "edc_adverse_event/datetime_with_ago.html",
121
- dict(utc_date=get_utcnow().date, report_datetime=obj.death_datetime),
121
+ dict(utc_date=timezone.now().date, report_datetime=obj.death_datetime),
122
122
  )
123
123
 
124
124
  @display(description="Action item", ordering="action_identifier")