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,49 @@
1
+ # Generated by Django 5.2.6 on 2025-09-17 16:53
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("edc_listboard", "0006_alter_listboard_revision"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="listboard",
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="listboard",
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="listboard",
29
+ name="locale_created",
30
+ field=models.CharField(
31
+ blank=True,
32
+ default="",
33
+ help_text="Auto-updated by Modeladmin",
34
+ max_length=10,
35
+ verbose_name="Locale created",
36
+ ),
37
+ ),
38
+ migrations.AlterField(
39
+ model_name="listboard",
40
+ name="locale_modified",
41
+ field=models.CharField(
42
+ blank=True,
43
+ default="",
44
+ help_text="Auto-updated by Modeladmin",
45
+ max_length=10,
46
+ verbose_name="Locale modified",
47
+ ),
48
+ ),
49
+ ]
edc_locator/auths.py CHANGED
@@ -1,17 +1,22 @@
1
1
  from edc_auth.constants import PII, PII_VIEW
2
2
  from edc_auth.site_auths import site_auths
3
3
 
4
- site_auths.update_group(
5
- "edc_locator.add_subjectlocator",
6
- "edc_locator.change_subjectlocator",
7
- "edc_locator.view_historicalsubjectlocator",
8
- "edc_locator.view_subjectlocator",
9
- name=PII,
10
- )
11
4
 
12
- site_auths.update_group(
13
- "edc_locator.view_historicalsubjectlocator",
14
- "edc_locator.view_subjectlocator",
15
- name=PII_VIEW,
16
- )
17
- site_auths.add_pii_model("edc_locator.subjectlocator")
5
+ def update_site_auths():
6
+ site_auths.update_group(
7
+ "edc_locator.add_subjectlocator",
8
+ "edc_locator.change_subjectlocator",
9
+ "edc_locator.view_historicalsubjectlocator",
10
+ "edc_locator.view_subjectlocator",
11
+ name=PII,
12
+ )
13
+
14
+ site_auths.update_group(
15
+ "edc_locator.view_historicalsubjectlocator",
16
+ "edc_locator.view_subjectlocator",
17
+ name=PII_VIEW,
18
+ )
19
+ site_auths.add_pii_model("edc_locator.subjectlocator")
20
+
21
+
22
+ update_site_auths()
@@ -14,7 +14,7 @@ from django.db import migrations, models
14
14
  import edc_model.validators.phone
15
15
  import edc_model_fields.fields.hostname_modification_field
16
16
  import edc_model_fields.fields.userfield
17
- import edc_utils
17
+ import django.utils.timezone
18
18
 
19
19
 
20
20
  class Migration(migrations.Migration):
@@ -31,11 +31,11 @@ class Migration(migrations.Migration):
31
31
  fields=[
32
32
  (
33
33
  "created",
34
- models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
34
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
35
35
  ),
36
36
  (
37
37
  "modified",
38
- models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
38
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
39
39
  ),
40
40
  (
41
41
  "user_created",
@@ -293,7 +293,7 @@ class Migration(migrations.Migration):
293
293
  ),
294
294
  (
295
295
  "report_datetime",
296
- models.DateTimeField(default=edc_utils.date.get_utcnow),
296
+ models.DateTimeField(default=django.utils.timezone.now),
297
297
  ),
298
298
  ("history_date", models.DateTimeField()),
299
299
  ("history_change_reason", models.CharField(max_length=100, null=True)),
@@ -342,11 +342,11 @@ class Migration(migrations.Migration):
342
342
  fields=[
343
343
  (
344
344
  "created",
345
- models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
345
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
346
346
  ),
347
347
  (
348
348
  "modified",
349
- models.DateTimeField(blank=True, default=edc_utils.date.get_utcnow),
349
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
350
350
  ),
351
351
  (
352
352
  "user_created",
@@ -605,7 +605,7 @@ class Migration(migrations.Migration):
605
605
  ),
606
606
  (
607
607
  "report_datetime",
608
- models.DateTimeField(default=edc_utils.date.get_utcnow),
608
+ models.DateTimeField(default=django.utils.timezone.now),
609
609
  ),
610
610
  (
611
611
  "site",
@@ -4,6 +4,7 @@ import django_audit_fields.fields.hostname_modification_field
4
4
  import django_audit_fields.fields.userfield
5
5
  import django_audit_fields.models.audit_model_mixin
6
6
  from django.db import migrations, models
7
+ import django.utils.timezone
7
8
 
8
9
 
9
10
  class Migration(migrations.Migration):
@@ -13,9 +14,7 @@ class Migration(migrations.Migration):
13
14
  migrations.AlterField(
14
15
  model_name="historicalsubjectlocator",
15
16
  name="created",
16
- field=models.DateTimeField(
17
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
18
- ),
17
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
19
18
  ),
20
19
  migrations.AlterField(
21
20
  model_name="historicalsubjectlocator",
@@ -29,9 +28,7 @@ class Migration(migrations.Migration):
29
28
  migrations.AlterField(
30
29
  model_name="historicalsubjectlocator",
31
30
  name="modified",
32
- field=models.DateTimeField(
33
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
34
- ),
31
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
35
32
  ),
36
33
  migrations.AlterField(
37
34
  model_name="historicalsubjectlocator",
@@ -56,9 +53,7 @@ class Migration(migrations.Migration):
56
53
  migrations.AlterField(
57
54
  model_name="subjectlocator",
58
55
  name="created",
59
- field=models.DateTimeField(
60
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
61
- ),
56
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
62
57
  ),
63
58
  migrations.AlterField(
64
59
  model_name="subjectlocator",
@@ -72,9 +67,7 @@ class Migration(migrations.Migration):
72
67
  migrations.AlterField(
73
68
  model_name="subjectlocator",
74
69
  name="modified",
75
- field=models.DateTimeField(
76
- blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
77
- ),
70
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
78
71
  ),
79
72
  migrations.AlterField(
80
73
  model_name="subjectlocator",
@@ -0,0 +1,187 @@
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_locator", "0039_alter_historicalsubjectlocator_revision_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="historicalsubjectlocator",
15
+ name="action_identifier",
16
+ field=models.CharField(
17
+ blank=True, db_index=True, default="", max_length=50
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="historicalsubjectlocator",
22
+ name="action_item_reason",
23
+ field=models.TextField(default="", editable=False),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="historicalsubjectlocator",
27
+ name="consent_model",
28
+ field=models.CharField(blank=True, default="", max_length=50),
29
+ ),
30
+ migrations.AlterField(
31
+ model_name="historicalsubjectlocator",
32
+ name="consent_version",
33
+ field=models.CharField(blank=True, default="", max_length=10),
34
+ ),
35
+ migrations.AlterField(
36
+ model_name="historicalsubjectlocator",
37
+ name="device_created",
38
+ field=models.CharField(
39
+ blank=True, default="", max_length=10, verbose_name="Device created"
40
+ ),
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="historicalsubjectlocator",
44
+ name="device_modified",
45
+ field=models.CharField(
46
+ blank=True, default="", max_length=10, verbose_name="Device modified"
47
+ ),
48
+ ),
49
+ migrations.AlterField(
50
+ model_name="historicalsubjectlocator",
51
+ name="locale_created",
52
+ field=models.CharField(
53
+ blank=True,
54
+ default="",
55
+ help_text="Auto-updated by Modeladmin",
56
+ max_length=10,
57
+ verbose_name="Locale created",
58
+ ),
59
+ ),
60
+ migrations.AlterField(
61
+ model_name="historicalsubjectlocator",
62
+ name="locale_modified",
63
+ field=models.CharField(
64
+ blank=True,
65
+ default="",
66
+ help_text="Auto-updated by Modeladmin",
67
+ max_length=10,
68
+ verbose_name="Locale modified",
69
+ ),
70
+ ),
71
+ migrations.AlterField(
72
+ model_name="historicalsubjectlocator",
73
+ name="may_sms",
74
+ field=models.CharField(
75
+ choices=[("Yes", "Yes"), ("No", "No")],
76
+ default="",
77
+ max_length=25,
78
+ verbose_name="Has the participant given permission <b>to be contacted by SMS</b> by study staff for follow-up purposes during the study?",
79
+ ),
80
+ ),
81
+ migrations.AlterField(
82
+ model_name="historicalsubjectlocator",
83
+ name="parent_action_identifier",
84
+ field=models.CharField(
85
+ blank=True,
86
+ default="",
87
+ help_text="action identifier that links to parent reference model instance.",
88
+ max_length=30,
89
+ ),
90
+ ),
91
+ migrations.AlterField(
92
+ model_name="historicalsubjectlocator",
93
+ name="related_action_identifier",
94
+ field=models.CharField(
95
+ blank=True,
96
+ default="",
97
+ help_text="action identifier that links to related reference model instance.",
98
+ max_length=30,
99
+ ),
100
+ ),
101
+ migrations.AlterField(
102
+ model_name="subjectlocator",
103
+ name="action_identifier",
104
+ field=models.CharField(blank=True, default="", max_length=50, unique=True),
105
+ ),
106
+ migrations.AlterField(
107
+ model_name="subjectlocator",
108
+ name="action_item_reason",
109
+ field=models.TextField(default="", editable=False),
110
+ ),
111
+ migrations.AlterField(
112
+ model_name="subjectlocator",
113
+ name="consent_model",
114
+ field=models.CharField(blank=True, default="", max_length=50),
115
+ ),
116
+ migrations.AlterField(
117
+ model_name="subjectlocator",
118
+ name="consent_version",
119
+ field=models.CharField(blank=True, default="", max_length=10),
120
+ ),
121
+ migrations.AlterField(
122
+ model_name="subjectlocator",
123
+ name="device_created",
124
+ field=models.CharField(
125
+ blank=True, default="", max_length=10, verbose_name="Device created"
126
+ ),
127
+ ),
128
+ migrations.AlterField(
129
+ model_name="subjectlocator",
130
+ name="device_modified",
131
+ field=models.CharField(
132
+ blank=True, default="", max_length=10, verbose_name="Device modified"
133
+ ),
134
+ ),
135
+ migrations.AlterField(
136
+ model_name="subjectlocator",
137
+ name="locale_created",
138
+ field=models.CharField(
139
+ blank=True,
140
+ default="",
141
+ help_text="Auto-updated by Modeladmin",
142
+ max_length=10,
143
+ verbose_name="Locale created",
144
+ ),
145
+ ),
146
+ migrations.AlterField(
147
+ model_name="subjectlocator",
148
+ name="locale_modified",
149
+ field=models.CharField(
150
+ blank=True,
151
+ default="",
152
+ help_text="Auto-updated by Modeladmin",
153
+ max_length=10,
154
+ verbose_name="Locale modified",
155
+ ),
156
+ ),
157
+ migrations.AlterField(
158
+ model_name="subjectlocator",
159
+ name="may_sms",
160
+ field=models.CharField(
161
+ choices=[("Yes", "Yes"), ("No", "No")],
162
+ default="",
163
+ max_length=25,
164
+ verbose_name="Has the participant given permission <b>to be contacted by SMS</b> by study staff for follow-up purposes during the study?",
165
+ ),
166
+ ),
167
+ migrations.AlterField(
168
+ model_name="subjectlocator",
169
+ name="parent_action_identifier",
170
+ field=models.CharField(
171
+ blank=True,
172
+ default="",
173
+ help_text="action identifier that links to parent reference model instance.",
174
+ max_length=30,
175
+ ),
176
+ ),
177
+ migrations.AlterField(
178
+ model_name="subjectlocator",
179
+ name="related_action_identifier",
180
+ field=models.CharField(
181
+ blank=True,
182
+ default="",
183
+ help_text="action identifier that links to related reference model instance.",
184
+ max_length=30,
185
+ ),
186
+ ),
187
+ ]
@@ -0,0 +1,27 @@
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
+ (
11
+ "edc_locator",
12
+ "0040_alter_historicalsubjectlocator_action_identifier_and_more",
13
+ ),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.AlterField(
18
+ model_name="historicalsubjectlocator",
19
+ name="report_datetime",
20
+ field=models.DateTimeField(default=django.utils.timezone.now),
21
+ ),
22
+ migrations.AlterField(
23
+ model_name="subjectlocator",
24
+ name="report_datetime",
25
+ field=models.DateTimeField(default=django.utils.timezone.now),
26
+ ),
27
+ ]
@@ -1,7 +1,7 @@
1
+ import django.utils.timezone
1
2
  from django.db import models
2
3
 
3
4
  from edc_identifier.model_mixins import UniqueSubjectIdentifierFieldMixin
4
- from edc_utils import get_utcnow
5
5
 
6
6
  from .locator_methods_model_mixin import LocatorMethodsModelMixin
7
7
  from .subject_contact_fields_mixin import SubjectContactFieldsMixin
@@ -30,7 +30,7 @@ class LocatorModelMixin(
30
30
  This model is used in ListboardViews.
31
31
  """
32
32
 
33
- report_datetime = models.DateTimeField(default=get_utcnow)
33
+ report_datetime = models.DateTimeField(default=django.utils.timezone.now)
34
34
 
35
35
  objects = LocatorManager()
36
36
 
@@ -30,7 +30,7 @@ class SubjectContactFieldsMixin(models.Model):
30
30
  may_sms = models.CharField(
31
31
  max_length=25,
32
32
  choices=YES_NO,
33
- null=True,
33
+ default="",
34
34
  blank=False,
35
35
  verbose_name=format_html(
36
36
  "Has the participant given permission <b>{text}</b> "
@@ -1,12 +1,13 @@
1
1
  from django.contrib import admin
2
2
  from django.template.loader import render_to_string
3
+ from django.utils import timezone
3
4
  from django_audit_fields.admin import audit_fieldset_tuple
4
5
 
5
6
  from edc_consent import site_consents
6
7
  from edc_constants.constants import NO, YES
7
8
  from edc_model_admin.mixins import ModelAdminProtectPiiMixin
8
9
  from edc_sites import site_sites
9
- from edc_utils import age, get_utcnow
10
+ from edc_utils.age import age
10
11
 
11
12
  from .fieldsets import (
12
13
  indirect_contacts_fieldset,
@@ -19,7 +20,7 @@ from .forms import SubjectLocatorForm
19
20
  class SubjectLocatorModelAdminMixin(ModelAdminProtectPiiMixin):
20
21
  form = SubjectLocatorForm
21
22
 
22
- extra_pii_attrs: list[str] = ["contacts"]
23
+ extra_pii_attrs: list[str] = ("contacts",)
23
24
 
24
25
  fieldsets = (
25
26
  (None, {"fields": ("subject_identifier",)}),
@@ -29,7 +30,7 @@ class SubjectLocatorModelAdminMixin(ModelAdminProtectPiiMixin):
29
30
  audit_fieldset_tuple,
30
31
  )
31
32
 
32
- radio_fields = {
33
+ radio_fields = { # noqa: RUF012
33
34
  "may_visit_home": admin.VERTICAL,
34
35
  "may_call": admin.VERTICAL,
35
36
  "may_sms": admin.VERTICAL,
@@ -74,7 +75,7 @@ class SubjectLocatorModelAdminMixin(ModelAdminProtectPiiMixin):
74
75
  context = dict(
75
76
  subject_identifier=obj.subject_identifier,
76
77
  gender=consent.gender.upper(),
77
- age_in_years=age(born=consent.dob, reference_dt=get_utcnow()).years,
78
+ age_in_years=age(born=consent.dob, reference_dt=timezone.now()).years,
78
79
  initials=consent.initials,
79
80
  )
80
81
  return render_to_string("edc_locator/changelist_locator_subject.html", context=context)
edc_ltfu/model_mixins.py CHANGED
@@ -1,10 +1,10 @@
1
1
  from django.core.validators import MinValueValidator
2
2
  from django.db import models
3
+ from django.utils import timezone
3
4
 
4
5
  from edc_constants.choices import YES_NO
5
6
  from edc_model import models as edc_models
6
7
  from edc_protocol.validators import date_not_before_study_start
7
- from edc_utils.date import get_utcnow
8
8
 
9
9
  from .choices import LTFU_CHOICES
10
10
 
@@ -12,7 +12,7 @@ from .choices import LTFU_CHOICES
12
12
  class LtfuModelMixin(models.Model):
13
13
  report_datetime = models.DateTimeField(
14
14
  verbose_name="Report Date and Time",
15
- default=get_utcnow,
15
+ default=timezone.now,
16
16
  validators=[date_not_before_study_start],
17
17
  )
18
18
 
@@ -33,7 +33,7 @@ class LtfuModelMixin(models.Model):
33
33
 
34
34
  ltfu_date = models.DateField(
35
35
  verbose_name="Date participant considered lost to follow up",
36
- default=get_utcnow,
36
+ default=timezone.now,
37
37
  null=True,
38
38
  blank=False,
39
39
  )
@@ -42,12 +42,12 @@ class LtfuModelMixin(models.Model):
42
42
  verbose_name="Was contact by phone attempted",
43
43
  max_length=15,
44
44
  choices=YES_NO,
45
- null=True,
45
+ default="",
46
46
  blank=False,
47
47
  )
48
48
  phone_attempts = models.IntegerField(
49
49
  verbose_name=(
50
- "If YES, how many attempts were made to contact the participant by phone",
50
+ "If YES, how many attempts were made to contact the participant by phone"
51
51
  ),
52
52
  validators=[MinValueValidator(0)],
53
53
  default=0,
@@ -60,6 +60,7 @@ class LtfuModelMixin(models.Model):
60
60
  home_visit_detail = models.TextField(
61
61
  verbose_name="If YES, provide any further details of the home visit",
62
62
  blank=True,
63
+ default="",
63
64
  )
64
65
 
65
66
  ltfu_category = models.CharField(
@@ -76,6 +77,7 @@ class LtfuModelMixin(models.Model):
76
77
  "circumstances that led to this decision."
77
78
  ),
78
79
  blank=True,
80
+ default="",
79
81
  )
80
82
 
81
83
  class Meta:
edc_metadata/auths.py CHANGED
@@ -1,12 +1,16 @@
1
1
  from django.apps import apps as django_apps
2
2
 
3
3
  from edc_auth.site_auths import site_auths
4
+ from edc_export.constants import EXPORT
4
5
 
5
- if django_apps.is_installed("edc_export"):
6
- from edc_export.constants import EXPORT
7
6
 
8
- site_auths.update_group(
9
- "edc_metadata.export_crfmetadata",
10
- "edc_metadata.export_requisitionmetadata",
11
- name=EXPORT,
12
- )
7
+ def update_site_auths():
8
+ if django_apps.is_installed("edc_export"):
9
+ site_auths.update_group(
10
+ "edc_metadata.export_crfmetadata",
11
+ "edc_metadata.export_requisitionmetadata",
12
+ name=EXPORT,
13
+ )
14
+
15
+
16
+ update_site_auths()
@@ -110,7 +110,7 @@ class CrfCreator(SourceModelMetadataMixin):
110
110
  metadata_obj = self.metadata_model_cls.objects.create(**opts)
111
111
  except IntegrityError as e:
112
112
  msg = f"Integrity error creating. Tried with {opts}. Got {e}."
113
- raise CreatesMetadataError(msg)
113
+ raise CreatesMetadataError(msg) from e
114
114
  else:
115
115
  if not registered:
116
116
  metadata_obj.delete()
@@ -14,7 +14,7 @@ if TYPE_CHECKING:
14
14
  pass
15
15
 
16
16
 
17
- class CrfRuleModelConflict(Exception):
17
+ class CrfRuleModelConflict(Exception): # noqa: N818
18
18
  pass
19
19
 
20
20
 
@@ -9,7 +9,7 @@ class RegisterRuleGroupError(Exception):
9
9
  pass
10
10
 
11
11
 
12
- def register(site=None, **kwargs) -> Any: # noqa
12
+ def register(site=None, **kwargs) -> Any:
13
13
  """Registers a rule group."""
14
14
  site = site or site_metadata_rules
15
15
 
@@ -29,9 +29,11 @@ class MetadataRuleEvaluator:
29
29
  if not self.app_labels:
30
30
  for rule_groups in site_metadata_rules.registry.values():
31
31
  for rule_group in rule_groups:
32
- if rule_group._meta.related_visit_model == self.related_visit_model:
33
- if rule_group._meta.app_label not in self.app_labels:
34
- self.app_labels.append(rule_group._meta.app_label)
32
+ if (
33
+ rule_group._meta.related_visit_model == self.related_visit_model
34
+ and rule_group._meta.app_label not in self.app_labels
35
+ ):
36
+ self.app_labels.append(rule_group._meta.app_label)
35
37
 
36
38
  def evaluate_rules(self) -> None:
37
39
  for app_label in self.app_labels:
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import contextlib
3
4
  from typing import TYPE_CHECKING
4
5
 
5
6
  from edc_appointment.constants import MISSED_APPT
@@ -91,8 +92,6 @@ class Rule:
91
92
  try:
92
93
  field_names = [self.predicate.attr]
93
94
  except AttributeError:
94
- try:
95
+ with contextlib.suppress(AttributeError):
95
96
  field_names = self.predicate.attrs
96
- except AttributeError:
97
- pass
98
97
  return field_names
@@ -77,5 +77,5 @@ class RuleEvaluator:
77
77
  f"Registered subject required for rule {self!r}. "
78
78
  f"subject_identifier='{self.related_visit.subject_identifier}'. "
79
79
  f"Got {e}."
80
- )
80
+ ) from e
81
81
  return self._registered_subject
@@ -4,7 +4,7 @@ from __future__ import unicode_literals
4
4
 
5
5
  from django.db import migrations, models
6
6
 
7
- import edc_utils
7
+ import django.utils.timezone
8
8
 
9
9
 
10
10
  class Migration(migrations.Migration):
@@ -14,21 +14,21 @@ class Migration(migrations.Migration):
14
14
  migrations.AlterField(
15
15
  model_name="crfmetadata",
16
16
  name="created",
17
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
17
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
18
18
  ),
19
19
  migrations.AlterField(
20
20
  model_name="crfmetadata",
21
21
  name="modified",
22
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
22
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
23
23
  ),
24
24
  migrations.AlterField(
25
25
  model_name="requisitionmetadata",
26
26
  name="created",
27
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
27
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
28
28
  ),
29
29
  migrations.AlterField(
30
30
  model_name="requisitionmetadata",
31
31
  name="modified",
32
- field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
32
+ field=models.DateTimeField(default=django.utils.timezone.now, editable=False),
33
33
  ),
34
34
  ]