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,398 @@
1
+ # Generated by Django 5.2.6 on 2025-09-17 16:53
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ (
10
+ "edc_action_item",
11
+ "0038_alter_actionitem_revision_alter_actiontype_revision_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name="actionitem",
18
+ name="auto_created_comment",
19
+ field=models.CharField(blank=True, default="", max_length=25),
20
+ ),
21
+ migrations.AlterField(
22
+ model_name="actionitem",
23
+ name="device_created",
24
+ field=models.CharField(
25
+ blank=True, default="", max_length=10, verbose_name="Device created"
26
+ ),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name="actionitem",
30
+ name="device_modified",
31
+ field=models.CharField(
32
+ blank=True, default="", max_length=10, verbose_name="Device modified"
33
+ ),
34
+ ),
35
+ migrations.AlterField(
36
+ model_name="actionitem",
37
+ name="instructions",
38
+ field=models.TextField(
39
+ blank=True, default="", help_text="populated by action class"
40
+ ),
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="actionitem",
44
+ name="locale_created",
45
+ field=models.CharField(
46
+ blank=True,
47
+ default="",
48
+ help_text="Auto-updated by Modeladmin",
49
+ max_length=10,
50
+ verbose_name="Locale created",
51
+ ),
52
+ ),
53
+ migrations.AlterField(
54
+ model_name="actionitem",
55
+ name="locale_modified",
56
+ field=models.CharField(
57
+ blank=True,
58
+ default="",
59
+ help_text="Auto-updated by Modeladmin",
60
+ max_length=10,
61
+ verbose_name="Locale modified",
62
+ ),
63
+ ),
64
+ migrations.AlterField(
65
+ model_name="actionitem",
66
+ name="parent_action_identifier",
67
+ field=models.CharField(
68
+ blank=True,
69
+ default="",
70
+ help_text="May be left blank. e.g. action identifier from reference model that opened the item (parent).",
71
+ max_length=50,
72
+ ),
73
+ ),
74
+ migrations.AlterField(
75
+ model_name="actionitem",
76
+ name="priority",
77
+ field=models.CharField(
78
+ blank=True,
79
+ choices=[
80
+ ("high", "High Priority"),
81
+ ("medium", "Medium Priority"),
82
+ ("low", "Low Priority"),
83
+ ],
84
+ default="",
85
+ help_text="Leave blank to use default for this action type.",
86
+ max_length=25,
87
+ ),
88
+ ),
89
+ migrations.AlterField(
90
+ model_name="actionitem",
91
+ name="related_action_identifier",
92
+ field=models.CharField(
93
+ blank=True,
94
+ default="",
95
+ help_text="May be left blank. e.g. action identifier from source model that opened the item.",
96
+ max_length=50,
97
+ ),
98
+ ),
99
+ migrations.AlterField(
100
+ model_name="actiontype",
101
+ name="device_created",
102
+ field=models.CharField(
103
+ blank=True, default="", max_length=10, verbose_name="Device created"
104
+ ),
105
+ ),
106
+ migrations.AlterField(
107
+ model_name="actiontype",
108
+ name="device_modified",
109
+ field=models.CharField(
110
+ blank=True, default="", max_length=10, verbose_name="Device modified"
111
+ ),
112
+ ),
113
+ migrations.AlterField(
114
+ model_name="actiontype",
115
+ name="instructions",
116
+ field=models.TextField(blank=True, default="", max_length=250),
117
+ ),
118
+ migrations.AlterField(
119
+ model_name="actiontype",
120
+ name="locale_created",
121
+ field=models.CharField(
122
+ blank=True,
123
+ default="",
124
+ help_text="Auto-updated by Modeladmin",
125
+ max_length=10,
126
+ verbose_name="Locale created",
127
+ ),
128
+ ),
129
+ migrations.AlterField(
130
+ model_name="actiontype",
131
+ name="locale_modified",
132
+ field=models.CharField(
133
+ blank=True,
134
+ default="",
135
+ help_text="Auto-updated by Modeladmin",
136
+ max_length=10,
137
+ verbose_name="Locale modified",
138
+ ),
139
+ ),
140
+ migrations.AlterField(
141
+ model_name="actiontype",
142
+ name="reference_model",
143
+ field=models.CharField(
144
+ blank=True, default="", help_text="reference model", max_length=100
145
+ ),
146
+ ),
147
+ migrations.AlterField(
148
+ model_name="actiontype",
149
+ name="related_reference_model",
150
+ field=models.CharField(
151
+ blank=True,
152
+ default="",
153
+ help_text="origin reference model",
154
+ max_length=100,
155
+ ),
156
+ ),
157
+ migrations.AlterField(
158
+ model_name="edcpermissions",
159
+ name="device_created",
160
+ field=models.CharField(
161
+ blank=True, default="", max_length=10, verbose_name="Device created"
162
+ ),
163
+ ),
164
+ migrations.AlterField(
165
+ model_name="edcpermissions",
166
+ name="device_modified",
167
+ field=models.CharField(
168
+ blank=True, default="", max_length=10, verbose_name="Device modified"
169
+ ),
170
+ ),
171
+ migrations.AlterField(
172
+ model_name="edcpermissions",
173
+ name="locale_created",
174
+ field=models.CharField(
175
+ blank=True,
176
+ default="",
177
+ help_text="Auto-updated by Modeladmin",
178
+ max_length=10,
179
+ verbose_name="Locale created",
180
+ ),
181
+ ),
182
+ migrations.AlterField(
183
+ model_name="edcpermissions",
184
+ name="locale_modified",
185
+ field=models.CharField(
186
+ blank=True,
187
+ default="",
188
+ help_text="Auto-updated by Modeladmin",
189
+ max_length=10,
190
+ verbose_name="Locale modified",
191
+ ),
192
+ ),
193
+ migrations.AlterField(
194
+ model_name="historicalactionitem",
195
+ name="auto_created_comment",
196
+ field=models.CharField(blank=True, default="", max_length=25),
197
+ ),
198
+ migrations.AlterField(
199
+ model_name="historicalactionitem",
200
+ name="device_created",
201
+ field=models.CharField(
202
+ blank=True, default="", max_length=10, verbose_name="Device created"
203
+ ),
204
+ ),
205
+ migrations.AlterField(
206
+ model_name="historicalactionitem",
207
+ name="device_modified",
208
+ field=models.CharField(
209
+ blank=True, default="", max_length=10, verbose_name="Device modified"
210
+ ),
211
+ ),
212
+ migrations.AlterField(
213
+ model_name="historicalactionitem",
214
+ name="instructions",
215
+ field=models.TextField(
216
+ blank=True, default="", help_text="populated by action class"
217
+ ),
218
+ ),
219
+ migrations.AlterField(
220
+ model_name="historicalactionitem",
221
+ name="locale_created",
222
+ field=models.CharField(
223
+ blank=True,
224
+ default="",
225
+ help_text="Auto-updated by Modeladmin",
226
+ max_length=10,
227
+ verbose_name="Locale created",
228
+ ),
229
+ ),
230
+ migrations.AlterField(
231
+ model_name="historicalactionitem",
232
+ name="locale_modified",
233
+ field=models.CharField(
234
+ blank=True,
235
+ default="",
236
+ help_text="Auto-updated by Modeladmin",
237
+ max_length=10,
238
+ verbose_name="Locale modified",
239
+ ),
240
+ ),
241
+ migrations.AlterField(
242
+ model_name="historicalactionitem",
243
+ name="parent_action_identifier",
244
+ field=models.CharField(
245
+ blank=True,
246
+ default="",
247
+ help_text="May be left blank. e.g. action identifier from reference model that opened the item (parent).",
248
+ max_length=50,
249
+ ),
250
+ ),
251
+ migrations.AlterField(
252
+ model_name="historicalactionitem",
253
+ name="priority",
254
+ field=models.CharField(
255
+ blank=True,
256
+ choices=[
257
+ ("high", "High Priority"),
258
+ ("medium", "Medium Priority"),
259
+ ("low", "Low Priority"),
260
+ ],
261
+ default="",
262
+ help_text="Leave blank to use default for this action type.",
263
+ max_length=25,
264
+ ),
265
+ ),
266
+ migrations.AlterField(
267
+ model_name="historicalactionitem",
268
+ name="related_action_identifier",
269
+ field=models.CharField(
270
+ blank=True,
271
+ default="",
272
+ help_text="May be left blank. e.g. action identifier from source model that opened the item.",
273
+ max_length=50,
274
+ ),
275
+ ),
276
+ migrations.AlterField(
277
+ model_name="historicalreference",
278
+ name="action_item_reason",
279
+ field=models.TextField(default="", editable=False),
280
+ ),
281
+ migrations.AlterField(
282
+ model_name="historicalreference",
283
+ name="device_created",
284
+ field=models.CharField(
285
+ blank=True, default="", max_length=10, verbose_name="Device created"
286
+ ),
287
+ ),
288
+ migrations.AlterField(
289
+ model_name="historicalreference",
290
+ name="device_modified",
291
+ field=models.CharField(
292
+ blank=True, default="", max_length=10, verbose_name="Device modified"
293
+ ),
294
+ ),
295
+ migrations.AlterField(
296
+ model_name="historicalreference",
297
+ name="locale_created",
298
+ field=models.CharField(
299
+ blank=True,
300
+ default="",
301
+ help_text="Auto-updated by Modeladmin",
302
+ max_length=10,
303
+ verbose_name="Locale created",
304
+ ),
305
+ ),
306
+ migrations.AlterField(
307
+ model_name="historicalreference",
308
+ name="locale_modified",
309
+ field=models.CharField(
310
+ blank=True,
311
+ default="",
312
+ help_text="Auto-updated by Modeladmin",
313
+ max_length=10,
314
+ verbose_name="Locale modified",
315
+ ),
316
+ ),
317
+ migrations.AlterField(
318
+ model_name="historicalreference",
319
+ name="parent_action_identifier",
320
+ field=models.CharField(
321
+ blank=True,
322
+ default="",
323
+ help_text="action identifier that links to parent reference model instance.",
324
+ max_length=30,
325
+ ),
326
+ ),
327
+ migrations.AlterField(
328
+ model_name="historicalreference",
329
+ name="related_action_identifier",
330
+ field=models.CharField(
331
+ blank=True,
332
+ default="",
333
+ help_text="action identifier that links to related reference model instance.",
334
+ max_length=30,
335
+ ),
336
+ ),
337
+ migrations.AlterField(
338
+ model_name="reference",
339
+ name="action_item_reason",
340
+ field=models.TextField(default="", editable=False),
341
+ ),
342
+ migrations.AlterField(
343
+ model_name="reference",
344
+ name="device_created",
345
+ field=models.CharField(
346
+ blank=True, default="", max_length=10, verbose_name="Device created"
347
+ ),
348
+ ),
349
+ migrations.AlterField(
350
+ model_name="reference",
351
+ name="device_modified",
352
+ field=models.CharField(
353
+ blank=True, default="", max_length=10, verbose_name="Device modified"
354
+ ),
355
+ ),
356
+ migrations.AlterField(
357
+ model_name="reference",
358
+ name="locale_created",
359
+ field=models.CharField(
360
+ blank=True,
361
+ default="",
362
+ help_text="Auto-updated by Modeladmin",
363
+ max_length=10,
364
+ verbose_name="Locale created",
365
+ ),
366
+ ),
367
+ migrations.AlterField(
368
+ model_name="reference",
369
+ name="locale_modified",
370
+ field=models.CharField(
371
+ blank=True,
372
+ default="",
373
+ help_text="Auto-updated by Modeladmin",
374
+ max_length=10,
375
+ verbose_name="Locale modified",
376
+ ),
377
+ ),
378
+ migrations.AlterField(
379
+ model_name="reference",
380
+ name="parent_action_identifier",
381
+ field=models.CharField(
382
+ blank=True,
383
+ default="",
384
+ help_text="action identifier that links to parent reference model instance.",
385
+ max_length=30,
386
+ ),
387
+ ),
388
+ migrations.AlterField(
389
+ model_name="reference",
390
+ name="related_action_identifier",
391
+ field=models.CharField(
392
+ blank=True,
393
+ default="",
394
+ help_text="action identifier that links to related reference model instance.",
395
+ max_length=30,
396
+ ),
397
+ ),
398
+ ]
@@ -0,0 +1,34 @@
1
+ # Generated by Django 5.2.6 on 2025-09-18 00:24
2
+
3
+ import django.utils.timezone
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("edc_action_item", "0039_alter_actionitem_auto_created_comment_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="actionitem",
16
+ name="report_datetime",
17
+ field=models.DateTimeField(default=django.utils.timezone.now),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="historicalactionitem",
21
+ name="report_datetime",
22
+ field=models.DateTimeField(default=django.utils.timezone.now),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="historicalreference",
26
+ name="report_datetime",
27
+ field=models.DateTimeField(default=django.utils.timezone.now),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="reference",
31
+ name="report_datetime",
32
+ field=models.DateTimeField(default=django.utils.timezone.now),
33
+ ),
34
+ ]
@@ -7,6 +7,7 @@ from django.apps import apps as django_apps
7
7
  from django.core.exceptions import ObjectDoesNotExist
8
8
  from django.db import models
9
9
  from django.db.models.deletion import PROTECT
10
+ from django.utils import timezone
10
11
 
11
12
  from edc_constants.constants import CANCELLED, NEW
12
13
  from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
@@ -14,7 +15,6 @@ from edc_model.models import BaseUuidModel, HistoricalRecords
14
15
  from edc_notification.model_mixins import NotificationModelMixin
15
16
  from edc_sites.managers import CurrentSiteManager as BaseCurrentSiteManager
16
17
  from edc_sites.model_mixins import SiteModelMixin
17
- from edc_utils import get_utcnow
18
18
 
19
19
  from ..choices import ACTION_STATUS, PRIORITY
20
20
  from ..exceptions import ActionItemStatusError, SubjectDoesNotExist
@@ -76,7 +76,7 @@ class ActionItem(
76
76
 
77
77
  action_identifier = models.CharField(max_length=50, unique=True)
78
78
 
79
- report_datetime = models.DateTimeField(default=get_utcnow)
79
+ report_datetime = models.DateTimeField(default=timezone.now)
80
80
 
81
81
  action_type = models.ForeignKey(
82
82
  ActionType, on_delete=PROTECT, related_name="action_type", verbose_name="Action"
@@ -101,6 +101,7 @@ class ActionItem(
101
101
  related_action_identifier = models.CharField(
102
102
  max_length=50,
103
103
  blank=True,
104
+ default="",
104
105
  help_text=(
105
106
  "May be left blank. e.g. action identifier from source model that opened the item."
106
107
  ),
@@ -109,6 +110,7 @@ class ActionItem(
109
110
  parent_action_identifier = models.CharField(
110
111
  max_length=50,
111
112
  blank=True,
113
+ default="",
112
114
  help_text=(
113
115
  "May be left blank. e.g. action identifier from "
114
116
  "reference model that opened the item (parent)."
@@ -119,6 +121,7 @@ class ActionItem(
119
121
  max_length=25,
120
122
  choices=PRIORITY,
121
123
  blank=True,
124
+ default="",
122
125
  help_text="Leave blank to use default for this action type.",
123
126
  )
124
127
 
@@ -142,11 +145,13 @@ class ActionItem(
142
145
 
143
146
  status = models.CharField(max_length=25, default=NEW, choices=ACTION_STATUS)
144
147
 
145
- instructions = models.TextField(blank=True, help_text="populated by action class")
148
+ instructions = models.TextField(
149
+ blank=True, default="", help_text="populated by action class"
150
+ )
146
151
 
147
152
  auto_created = models.BooleanField(default=False)
148
153
 
149
- auto_created_comment = models.CharField(max_length=25, blank=True)
154
+ auto_created_comment = models.CharField(max_length=25, blank=True, default="")
150
155
 
151
156
  objects = ActionItemManager()
152
157
 
@@ -23,7 +23,7 @@ class ActionNoManagersModelMixin(models.Model):
23
23
 
24
24
  subject_dashboard_url: str = "subject_dashboard_url"
25
25
 
26
- action_identifier = models.CharField(max_length=50, unique=True, null=True, blank=True)
26
+ action_identifier = models.CharField(max_length=50, unique=True, default="", blank=True)
27
27
 
28
28
  action_item = models.ForeignKey(ActionItem, null=True, blank=True, on_delete=PROTECT)
29
29
 
@@ -38,7 +38,7 @@ class ActionNoManagersModelMixin(models.Model):
38
38
  # remove
39
39
  parent_action_identifier = models.CharField(
40
40
  max_length=30,
41
- null=True,
41
+ default="",
42
42
  blank=True,
43
43
  help_text="action identifier that links to parent reference model instance.",
44
44
  )
@@ -46,12 +46,12 @@ class ActionNoManagersModelMixin(models.Model):
46
46
  # remove
47
47
  related_action_identifier = models.CharField(
48
48
  max_length=30,
49
- null=True,
49
+ default="",
50
50
  blank=True,
51
51
  help_text="action identifier that links to related reference model instance.",
52
52
  )
53
53
 
54
- action_item_reason = models.TextField(null=True, editable=False)
54
+ action_item_reason = models.TextField(default="", editable=False)
55
55
 
56
56
  class Meta:
57
57
  abstract = True
@@ -113,8 +113,7 @@ class ActionNoManagersModelMixin(models.Model):
113
113
  def natural_key(self: Any) -> tuple:
114
114
  return (self.action_identifier,)
115
115
 
116
- # noinspection PyTypeHints
117
- natural_key.dependencies = ["edc_action_item.actionitem"] # type:ignore
116
+ natural_key.dependencies = ("edc_action_item.actionitem",)
118
117
 
119
118
  @classmethod
120
119
  def get_action_cls(cls) -> type[Action]:
@@ -1,9 +1,9 @@
1
1
  from django.db import models
2
2
  from django.db.models.deletion import PROTECT
3
+ from django.utils import timezone
3
4
 
4
5
  from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
5
6
  from edc_model.models import BaseUuidModel
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from .action_model_mixin import ActionModelMixin
9
9
  from .action_type import ActionType
@@ -24,7 +24,7 @@ class Reference(NonUniqueSubjectIdentifierFieldMixin, ActionModelMixin, BaseUuid
24
24
 
25
25
  action_identifier = models.CharField(max_length=25, unique=True)
26
26
 
27
- report_datetime = models.DateTimeField(default=get_utcnow)
27
+ report_datetime = models.DateTimeField(default=timezone.now)
28
28
 
29
29
  action_type = models.ForeignKey(
30
30
  ActionType, on_delete=PROTECT, related_name="action", verbose_name="Action"
@@ -97,18 +97,17 @@ def action_on_reference_model_post_delete(sender, instance: Any, using, **kwargs
97
97
  raise
98
98
  else:
99
99
  reset_and_delete_action_item(instance, using)
100
- elif isinstance(instance, ActionItem):
101
- if instance.parent_action_item:
102
- try:
103
- parent_reference_obj = instance.parent_reference_obj
104
- except ObjectDoesNotExist:
105
- pass
106
- else:
107
- parent_reference_obj.action_item.action_cls(
108
- action_item=instance.parent_reference_obj.action_item,
109
- subject_identifier=instance.subject_identifier,
110
- using=using,
111
- ).create_next_action_items()
100
+ elif isinstance(instance, ActionItem) and instance.parent_action_item:
101
+ try:
102
+ parent_reference_obj = instance.parent_reference_obj
103
+ except ObjectDoesNotExist:
104
+ pass
105
+ else:
106
+ parent_reference_obj.action_item.action_cls(
107
+ action_item=instance.parent_reference_obj.action_item,
108
+ subject_identifier=instance.subject_identifier,
109
+ using=using,
110
+ ).create_next_action_items()
112
111
 
113
112
 
114
113
  @receiver(
@@ -126,15 +125,15 @@ def action_item_notification_on_post_create_historical_record(
126
125
  if (
127
126
  site_notifications.loaded
128
127
  and instance._meta.label_lower == "edc_action_item.actionitem"
128
+ and instance.status != CLOSED
129
129
  ):
130
- if instance.status != CLOSED:
131
- opts = dict(
132
- instance=instance,
133
- user=instance.user_modified or instance.user_created,
134
- history_date=history_date,
135
- history_user=history_user,
136
- history_change_reason=history_change_reason,
137
- fail_silently=True,
138
- **kwargs,
139
- )
140
- site_notifications.notify(**opts)
130
+ opts = dict(
131
+ instance=instance,
132
+ user=instance.user_modified or instance.user_created,
133
+ history_date=history_date,
134
+ history_user=history_user,
135
+ history_change_reason=history_change_reason,
136
+ fail_silently=True,
137
+ **kwargs,
138
+ )
139
+ site_notifications.notify(**opts)
@@ -5,7 +5,7 @@ from django.core.management.color import color_style
5
5
  style = color_style()
6
6
 
7
7
 
8
- def update_action_types(sender=None, verbose=None, **kwargs): # noqa
8
+ def update_action_types(sender=None, verbose=None, **kwargs):
9
9
  from .site_action_items import site_action_items
10
10
 
11
11
  sys.stdout.write(style.MIGRATE_HEADING("Updating action types:\n"))