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
@@ -4,8 +4,7 @@ from uuid import UUID
4
4
 
5
5
  from celery import shared_task
6
6
  from django.apps import apps as django_apps
7
-
8
- from edc_utils import get_utcnow
7
+ from django.utils import timezone
9
8
 
10
9
  from ..exceptions import InsufficientStockError, RepackError
11
10
 
@@ -29,7 +28,7 @@ def process_repack_request(repack_request_id: UUID | None = None, username: str
29
28
  if not getattr(repack_request.from_stock, "confirmation", None):
30
29
  raise RepackError("Source stock item not confirmed")
31
30
  stock_model_cls = repack_request.from_stock.__class__
32
- for index in range(0, int(number_to_process)):
31
+ for _ in range(0, int(number_to_process)):
33
32
  try:
34
33
  stock_model_cls.objects.create(
35
34
  receive_item=None,
@@ -42,7 +41,7 @@ def process_repack_request(repack_request_id: UUID | None = None, username: str
42
41
  repack_request=repack_request,
43
42
  lot=repack_request.from_stock.lot,
44
43
  user_created=username,
45
- created=get_utcnow(),
44
+ created=timezone.now(),
46
45
  )
47
46
  except InsufficientStockError:
48
47
  break
@@ -50,7 +49,7 @@ def process_repack_request(repack_request_id: UUID | None = None, username: str
50
49
  repack_request=repack_request
51
50
  ).count()
52
51
  repack_request.user_modified = username
53
- repack_request.modified = get_utcnow()
52
+ repack_request.modified = timezone.now()
54
53
  repack_request.save(
55
54
  update_fields=[
56
55
  "requested_qty",
@@ -6,10 +6,9 @@ from typing import TYPE_CHECKING
6
6
  import pandas as pd
7
7
  from celery import shared_task
8
8
  from django.apps import apps as django_apps
9
+ from django.utils import timezone
9
10
  from sequences import get_next_value
10
11
 
11
- from edc_utils import get_utcnow
12
-
13
12
  if TYPE_CHECKING:
14
13
  from uuid import UUID
15
14
 
@@ -29,7 +28,7 @@ def bulk_create_stock_request_items(
29
28
 
30
29
  stock_request = stock_request_model_cls.objects.get(pk=stock_request_pk)
31
30
  df_nostock = pd.DataFrame(nostock_as_dict)
32
- now = get_utcnow()
31
+ now = timezone.now()
33
32
  data = []
34
33
  for i, row in df_nostock[df_nostock.stock_qty == 0].iterrows():
35
34
  registered_subject = registered_subject_model_cls.objects.get(
@@ -6,8 +6,7 @@ from django.apps import apps as django_apps
6
6
  from django.core.exceptions import ObjectDoesNotExist
7
7
  from django.core.handlers.wsgi import WSGIRequest
8
8
  from django.db import transaction
9
-
10
- from edc_utils import get_utcnow
9
+ from django.utils import timezone
11
10
 
12
11
  if TYPE_CHECKING:
13
12
  from ..models import StockTransfer
@@ -35,7 +34,7 @@ def transfer_stock(
35
34
  stock=stock,
36
35
  stock_transfer=stock_transfer,
37
36
  user_created=request.user.username,
38
- created=get_utcnow(),
37
+ created=timezone.now(),
39
38
  )
40
39
  stock.location = stock_transfer.to_location
41
40
  stock.save()
@@ -9,13 +9,13 @@ from django.contrib.auth.decorators import login_required
9
9
  from django.core.exceptions import ObjectDoesNotExist
10
10
  from django.http import HttpResponseRedirect
11
11
  from django.urls import reverse
12
+ from django.utils import timezone
12
13
  from django.utils.decorators import method_decorator
13
14
  from django.views.generic.base import TemplateView
14
15
 
15
16
  from edc_dashboard.view_mixins import EdcViewMixin
16
17
  from edc_navbar import NavbarViewMixin
17
18
  from edc_protocol.view_mixins import EdcProtocolViewMixin
18
- from edc_utils import get_utcnow
19
19
 
20
20
  from ..exceptions import StorageBinError
21
21
  from ..models import Stock, StorageBin, StorageBinItem
@@ -192,7 +192,7 @@ class AddToStorageBinView(EdcViewMixin, NavbarViewMixin, EdcProtocolViewMixin, T
192
192
  storage_bin,
193
193
  stock_codes,
194
194
  user_created=request.user.username,
195
- created=get_utcnow(),
195
+ created=timezone.now(),
196
196
  )
197
197
  except StorageBinError as e:
198
198
  messages.add_message(request, messages.ERROR, str(e))
@@ -9,6 +9,7 @@ from django.core.exceptions import ObjectDoesNotExist
9
9
  from django.db.models import Count
10
10
  from django.http import HttpResponseRedirect
11
11
  from django.urls import reverse
12
+ from django.utils import timezone
12
13
  from django.utils.decorators import method_decorator
13
14
  from django.utils.translation import gettext as _
14
15
  from django.views.generic.base import TemplateView
@@ -16,7 +17,6 @@ from django.views.generic.base import TemplateView
16
17
  from edc_dashboard.view_mixins import EdcViewMixin
17
18
  from edc_navbar import NavbarViewMixin
18
19
  from edc_protocol.view_mixins import EdcProtocolViewMixin
19
- from edc_utils import get_utcnow
20
20
 
21
21
  from ..exceptions import AllocationError, InsufficientStockError
22
22
  from ..models import Assignment, Stock, StockRequest, StockRequestItem
@@ -350,7 +350,7 @@ class AllocateToSubjectView(EdcViewMixin, NavbarViewMixin, EdcProtocolViewMixin,
350
350
  allocation_data,
351
351
  allocated_by=request.user.username,
352
352
  user_created=request.user.username,
353
- created=get_utcnow(),
353
+ created=timezone.now(),
354
354
  )
355
355
  except AllocationError as e:
356
356
  messages.add_message(request, messages.ERROR, str(e))
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import contextlib
3
4
  import uuid
4
5
  from uuid import uuid4
5
6
 
@@ -97,13 +98,12 @@ class ConfirmationAtSiteView(
97
98
  return min(unconfirmed_count, 12)
98
99
 
99
100
  def get_stock_codes(self, stock_transfer):
100
- stock_codes = [
101
+ return [
101
102
  code
102
103
  for code in stock_transfer.stocktransferitem_set.values_list(
103
104
  "stock__code", flat=True
104
105
  ).all()
105
106
  ]
106
- return stock_codes
107
107
 
108
108
  def get_unconfirmed_count(self, stock_transfer) -> int:
109
109
  return (
@@ -120,10 +120,8 @@ class ConfirmationAtSiteView(
120
120
  def site(self) -> Site | None:
121
121
  obj = None
122
122
  if self.kwargs.get("site_id"):
123
- try:
123
+ with contextlib.suppress(ObjectDoesNotExist):
124
124
  obj = Site.objects.get(id=self.kwargs.get("site_id"))
125
- except ObjectDoesNotExist:
126
- pass
127
125
  return obj
128
126
 
129
127
  @property
@@ -169,14 +167,13 @@ class ConfirmationAtSiteView(
169
167
  def confirmation_at_site_changelist_url(self) -> str:
170
168
  if self.confirmation_at_site:
171
169
  url = reverse("edc_pharmacy_admin:edc_pharmacy_confirmationatsite_changelist")
172
- url = f"{url}?q={self.confirmation_at_site.transfer_confirmation_identifier}"
173
- return url
170
+ return f"{url}?q={self.confirmation_at_site.transfer_confirmation_identifier}"
174
171
  return "/"
175
172
 
176
173
  def get_stock_transfer(
177
174
  self,
178
175
  stock_transfer_identifier: str,
179
- suppress_msg: bool = None,
176
+ suppress_msg: bool | None = None,
180
177
  ) -> StockTransfer | None:
181
178
  stock_transfer = None
182
179
  try:
@@ -198,7 +195,7 @@ class ConfirmationAtSiteView(
198
195
  )
199
196
  return stock_transfer
200
197
 
201
- def post(self, request, *args, **kwargs) -> HttpResponseRedirect:
198
+ def post(self, request, *args, **kwargs) -> HttpResponseRedirect: # noqa: ARG002
202
199
  # cancel
203
200
  if request.POST.get("cancel") and request.POST.get("cancel") == "cancel":
204
201
  url = reverse("edc_pharmacy:home_url")
@@ -6,13 +6,13 @@ from django.contrib.auth.decorators import login_required
6
6
  from django.core.exceptions import ObjectDoesNotExist
7
7
  from django.http import HttpResponseRedirect
8
8
  from django.urls import reverse
9
+ from django.utils import timezone
9
10
  from django.utils.decorators import method_decorator
10
11
  from django.views.generic.base import TemplateView
11
12
 
12
13
  from edc_dashboard.view_mixins import EdcViewMixin
13
14
  from edc_navbar import NavbarViewMixin
14
15
  from edc_protocol.view_mixins import EdcProtocolViewMixin
15
- from edc_utils import get_utcnow
16
16
 
17
17
  from ..models import ConfirmationAtSite, Formulation, Location, Rx
18
18
  from ..utils import dispense
@@ -61,7 +61,7 @@ class DispenseView(EdcViewMixin, NavbarViewMixin, EdcProtocolViewMixin, Template
61
61
  f"Subject {subject_identifier} not found at {location.display_name}.",
62
62
  )
63
63
  else:
64
- if rx.rx_expiration_date and rx.rx_expiration_date < get_utcnow():
64
+ if rx.rx_expiration_date and rx.rx_expiration_date < timezone.now():
65
65
  messages.add_message(
66
66
  self.request,
67
67
  messages.WARNING,
@@ -4,10 +4,9 @@ from django.contrib.auth.decorators import login_required
4
4
  from django.core.exceptions import ObjectDoesNotExist
5
5
  from django.http import HttpRequest, HttpResponseRedirect
6
6
  from django.urls import reverse
7
+ from django.utils import timezone
7
8
  from django.utils.decorators import method_decorator
8
9
 
9
- from edc_utils import get_utcnow
10
-
11
10
  from ..models import Stock, StorageBin, StorageBinItem
12
11
  from .add_to_storage_bin_view import AddToStorageBinView, StorageBinError
13
12
 
@@ -58,7 +57,7 @@ def move_to_bin(
58
57
  else:
59
58
  obj.storage_bin = storage_bin
60
59
  obj.user_modified = user_modified
61
- obj.modified = get_utcnow()
60
+ obj.modified = timezone.now()
62
61
  obj.save()
63
62
  codes_moved.append(code)
64
63
  return codes_moved, codes_not_moved
@@ -7,6 +7,7 @@ from django.contrib.auth.decorators import login_required
7
7
  from django.db.models import QuerySet
8
8
  from django.http import FileResponse, HttpResponseRedirect
9
9
  from django.urls import reverse
10
+ from django.utils import timezone
10
11
  from django.utils.decorators import method_decorator
11
12
  from django.views.generic.base import TemplateView
12
13
  from pylabels import Sheet, Specification
@@ -16,7 +17,6 @@ from edc_navbar import NavbarViewMixin
16
17
  from edc_protocol.view_mixins import EdcProtocolViewMixin
17
18
  from edc_pylabels.models import LabelConfiguration
18
19
  from edc_pylabels.site_label_configs import site_label_configs
19
- from edc_utils import get_utcnow
20
20
 
21
21
  from ..models import Stock
22
22
 
@@ -118,7 +118,7 @@ class PrintLabelsView(EdcViewMixin, NavbarViewMixin, EdcProtocolViewMixin, Templ
118
118
  return HttpResponseRedirect(request.META.get("HTTP_REFERER", ""))
119
119
  else:
120
120
  buffer = sheet.save_to_buffer()
121
- now = get_utcnow()
121
+ now = timezone.now()
122
122
  return FileResponse(
123
123
  buffer,
124
124
  as_attachment=True,
edc_prn/admin_site.py ADDED
@@ -0,0 +1,5 @@
1
+ from edc_model_admin.admin_site import EdcAdminSite
2
+
3
+ from .apps import AppConfig
4
+
5
+ edc_prn_admin = EdcAdminSite(name="edc_prn_admin", app_label=AppConfig.name)
edc_prn/prn.py CHANGED
@@ -58,19 +58,18 @@ class Prn:
58
58
  try:
59
59
  return django_apps.get_model(self.model)
60
60
  except LookupError as e:
61
- raise PrnError(f"{e}. See {self!r}")
61
+ raise PrnError(f"{e}. See {self!r}") from e
62
62
 
63
- def get_show_on_dashboard(self, subject_identifier=None, **kwargs):
63
+ def get_show_on_dashboard(self, subject_identifier=None, **kwargs): # noqa: ARG002
64
64
  count = 0
65
- if self.show_on_dashboard:
66
- if subject_identifier:
67
- opts = dict(subject_identifier=subject_identifier)
68
- try:
69
- count = self.model_cls.objects.filter(**opts).count()
70
- except FieldError:
71
- opts = self.get_query_opts(subject_identifier)
72
- count = self.model_cls.objects.filter(**opts).count()
73
- return True if count and self.show_on_dashboard else False
65
+ if self.show_on_dashboard and subject_identifier:
66
+ opts = dict(subject_identifier=subject_identifier)
67
+ try:
68
+ count = self.model_cls.objects.filter(**opts).count()
69
+ except FieldError:
70
+ opts = self.get_query_opts(subject_identifier)
71
+ count = self.model_cls.objects.filter(**opts).count()
72
+ return count and self.show_on_dashboard
74
73
 
75
74
  def get_query_opts(self, subject_identifier):
76
75
  """Returns alternative query opts to search on
edc_prn/urls.py ADDED
@@ -0,0 +1,11 @@
1
+ from django.urls import path
2
+ from django.views.generic.base import RedirectView
3
+
4
+ from .admin_site import edc_prn_admin
5
+
6
+ app_name = "edc_prn"
7
+
8
+ urlpatterns = [
9
+ path("admin/", edc_prn_admin.urls),
10
+ path("", RedirectView.as_view(url="admin/"), name="home_url"),
11
+ ]
@@ -3,10 +3,9 @@ from datetime import datetime
3
3
 
4
4
  from django.conf import settings
5
5
  from django.core.exceptions import ImproperlyConfigured
6
+ from django.utils import timezone
6
7
  from django.utils.translation import gettext_lazy as _
7
8
 
8
- from edc_utils import get_utcnow
9
-
10
9
  from .address import Address
11
10
 
12
11
 
@@ -112,7 +111,7 @@ class ResearchProtocolConfig:
112
111
 
113
112
  @property
114
113
  def copyright(self) -> str:
115
- return f"2010-{get_utcnow().year}"
114
+ return f"2010-{timezone.now().year}"
116
115
 
117
116
  @property
118
117
  def license(self) -> str:
@@ -9,8 +9,8 @@ from .constants import (
9
9
 
10
10
 
11
11
  class ProtocolDeviationViolationAction(ActionWithNotification):
12
- reference_model = None # "my_app.protocolincident"
13
- admin_site_name = None # "my_app_admin"
12
+ reference_model = "edc_protocol_incident.protocoldeviationviolation"
13
+ admin_site_name = "edc_protocol_incident_admin"
14
14
 
15
15
  name = PROTOCOL_DEVIATION_VIOLATION_ACTION
16
16
  display_name = "Submit Protocol Deviation / Violation Report"
@@ -25,8 +25,8 @@ class ProtocolDeviationViolationAction(ActionWithNotification):
25
25
 
26
26
 
27
27
  class ProtocolIncidentAction(ActionWithNotification):
28
- reference_model = None # "my_app.protocolincident"
29
- admin_site_name = None # "my_app"
28
+ reference_model = "edc_protocol_incident.protocolincident"
29
+ admin_site_name = "edc_protocol_incident_admin"
30
30
 
31
31
  name = PROTOCOL_INCIDENT_ACTION
32
32
  display_name = "Submit Protocol Incident Report"
@@ -14,24 +14,31 @@ from .auth_objects import (
14
14
  )
15
15
  from .constants import PROTOCOL_DEVIATION_VIOLATION, PROTOCOL_INCIDENT
16
16
 
17
- incident_type = getattr(settings, "EDC_PROTOCOL_VIOLATION_TYPE", PROTOCOL_DEVIATION_VIOLATION)
18
-
19
- site_auths.add_group(*protocol_violation_codenames, name=PROTOCOL_VIOLATION)
20
- site_auths.add_group(*protocol_violation_view_codenames, name=PROTOCOL_VIOLATION_VIEW)
21
- site_auths.add_group(*protocol_incident_codenames, name=PROTOCOL_INCIDENT)
22
- site_auths.add_group(*protocol_incident_view_codenames, name=PROTOCOL_INCIDENT_VIEW)
23
-
24
- if incident_type == PROTOCOL_DEVIATION_VIOLATION:
25
- site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_ROLE)
26
- site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_SUPER_ROLE)
27
- site_auths.update_role(PROTOCOL_VIOLATION_VIEW, name=AUDITOR_ROLE)
28
- elif incident_type == PROTOCOL_INCIDENT:
29
- site_auths.update_role(PROTOCOL_INCIDENT, name=CLINICIAN_ROLE)
30
- site_auths.update_role(PROTOCOL_INCIDENT, name=CLINICIAN_SUPER_ROLE)
31
- site_auths.update_role(PROTOCOL_INCIDENT_VIEW, name=AUDITOR_ROLE)
32
- else:
33
- raise ValueError(
34
- "Invalid value for settings.EDC_PROTOCOL_VIOLATION_TYPE. "
35
- f"Expected `{PROTOCOL_INCIDENT}` or `{PROTOCOL_DEVIATION_VIOLATION}`. "
36
- f"Got {incident_type}."
17
+
18
+ def update_site_auths() -> None:
19
+ incident_type = getattr(
20
+ settings, "EDC_PROTOCOL_VIOLATION_TYPE", PROTOCOL_DEVIATION_VIOLATION
37
21
  )
22
+
23
+ site_auths.add_group(*protocol_violation_codenames, name=PROTOCOL_VIOLATION)
24
+ site_auths.add_group(*protocol_violation_view_codenames, name=PROTOCOL_VIOLATION_VIEW)
25
+ site_auths.add_group(*protocol_incident_codenames, name=PROTOCOL_INCIDENT)
26
+ site_auths.add_group(*protocol_incident_view_codenames, name=PROTOCOL_INCIDENT_VIEW)
27
+
28
+ if incident_type == PROTOCOL_DEVIATION_VIOLATION:
29
+ site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_ROLE)
30
+ site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_SUPER_ROLE)
31
+ site_auths.update_role(PROTOCOL_VIOLATION_VIEW, name=AUDITOR_ROLE)
32
+ elif incident_type == PROTOCOL_INCIDENT:
33
+ site_auths.update_role(PROTOCOL_INCIDENT, name=CLINICIAN_ROLE)
34
+ site_auths.update_role(PROTOCOL_INCIDENT, name=CLINICIAN_SUPER_ROLE)
35
+ site_auths.update_role(PROTOCOL_INCIDENT_VIEW, name=AUDITOR_ROLE)
36
+ else:
37
+ raise ValueError(
38
+ "Invalid value for settings.EDC_PROTOCOL_VIOLATION_TYPE. "
39
+ f"Expected `{PROTOCOL_INCIDENT}` or `{PROTOCOL_DEVIATION_VIOLATION}`. "
40
+ f"Got {incident_type}."
41
+ )
42
+
43
+
44
+ update_site_auths()
@@ -15,7 +15,7 @@ from django.db import migrations, models
15
15
 
16
16
  import edc_action_item.managers
17
17
  import edc_model.validators.date
18
- import edc_utils.date
18
+ import django.utils.timezone
19
19
 
20
20
 
21
21
  class Migration(migrations.Migration):
@@ -109,14 +109,14 @@ class Migration(migrations.Migration):
109
109
  "created",
110
110
  models.DateTimeField(
111
111
  blank=True,
112
- default=django_audit_fields.models.audit_model_mixin.utcnow,
112
+ default=django.utils.timezone.now,
113
113
  ),
114
114
  ),
115
115
  (
116
116
  "modified",
117
117
  models.DateTimeField(
118
118
  blank=True,
119
- default=django_audit_fields.models.audit_model_mixin.utcnow,
119
+ default=django.utils.timezone.now,
120
120
  ),
121
121
  ),
122
122
  (
@@ -199,7 +199,7 @@ class Migration(migrations.Migration):
199
199
  (
200
200
  "report_datetime",
201
201
  models.DateTimeField(
202
- default=edc_utils.date.get_utcnow,
202
+ default=django.utils.timezone.now,
203
203
  verbose_name="Report Date and Time",
204
204
  ),
205
205
  ),
@@ -371,14 +371,14 @@ class Migration(migrations.Migration):
371
371
  "created",
372
372
  models.DateTimeField(
373
373
  blank=True,
374
- default=django_audit_fields.models.audit_model_mixin.utcnow,
374
+ default=django.utils.timezone.now,
375
375
  ),
376
376
  ),
377
377
  (
378
378
  "modified",
379
379
  models.DateTimeField(
380
380
  blank=True,
381
- default=django_audit_fields.models.audit_model_mixin.utcnow,
381
+ default=django.utils.timezone.now,
382
382
  ),
383
383
  ),
384
384
  (
@@ -453,7 +453,7 @@ class Migration(migrations.Migration):
453
453
  (
454
454
  "report_datetime",
455
455
  models.DateTimeField(
456
- default=edc_utils.date.get_utcnow,
456
+ default=django.utils.timezone.now,
457
457
  verbose_name="Report Date and Time",
458
458
  ),
459
459
  ),
@@ -15,7 +15,7 @@ from django.db import migrations, models
15
15
 
16
16
  import edc_action_item.managers
17
17
  import edc_model.validators.date
18
- import edc_utils.date
18
+ import django.utils.timezone
19
19
 
20
20
 
21
21
  class Migration(migrations.Migration):
@@ -133,14 +133,14 @@ class Migration(migrations.Migration):
133
133
  "created",
134
134
  models.DateTimeField(
135
135
  blank=True,
136
- default=django_audit_fields.models.audit_model_mixin.utcnow,
136
+ default=django.utils.timezone.now,
137
137
  ),
138
138
  ),
139
139
  (
140
140
  "modified",
141
141
  models.DateTimeField(
142
142
  blank=True,
143
- default=django_audit_fields.models.audit_model_mixin.utcnow,
143
+ default=django.utils.timezone.now,
144
144
  ),
145
145
  ),
146
146
  (
@@ -223,7 +223,7 @@ class Migration(migrations.Migration):
223
223
  (
224
224
  "report_datetime",
225
225
  models.DateTimeField(
226
- default=edc_utils.date.get_utcnow,
226
+ default=django.utils.timezone.now,
227
227
  verbose_name="Report Date and Time",
228
228
  ),
229
229
  ),
@@ -395,14 +395,14 @@ class Migration(migrations.Migration):
395
395
  "created",
396
396
  models.DateTimeField(
397
397
  blank=True,
398
- default=django_audit_fields.models.audit_model_mixin.utcnow,
398
+ default=django.utils.timezone.now,
399
399
  ),
400
400
  ),
401
401
  (
402
402
  "modified",
403
403
  models.DateTimeField(
404
404
  blank=True,
405
- default=django_audit_fields.models.audit_model_mixin.utcnow,
405
+ default=django.utils.timezone.now,
406
406
  ),
407
407
  ),
408
408
  (
@@ -477,7 +477,7 @@ class Migration(migrations.Migration):
477
477
  (
478
478
  "report_datetime",
479
479
  models.DateTimeField(
480
- default=edc_utils.date.get_utcnow,
480
+ default=django.utils.timezone.now,
481
481
  verbose_name="Report Date and Time",
482
482
  ),
483
483
  ),
@@ -971,14 +971,14 @@ class Migration(migrations.Migration):
971
971
  "created",
972
972
  models.DateTimeField(
973
973
  blank=True,
974
- default=django_audit_fields.models.audit_model_mixin.utcnow,
974
+ default=django.utils.timezone.now,
975
975
  ),
976
976
  ),
977
977
  (
978
978
  "modified",
979
979
  models.DateTimeField(
980
980
  blank=True,
981
- default=django_audit_fields.models.audit_model_mixin.utcnow,
981
+ default=django.utils.timezone.now,
982
982
  ),
983
983
  ),
984
984
  (
@@ -1053,7 +1053,7 @@ class Migration(migrations.Migration):
1053
1053
  (
1054
1054
  "report_datetime",
1055
1055
  models.DateTimeField(
1056
- default=edc_utils.date.get_utcnow,
1056
+ default=django.utils.timezone.now,
1057
1057
  verbose_name="Report Date and Time",
1058
1058
  ),
1059
1059
  ),
@@ -1285,14 +1285,14 @@ class Migration(migrations.Migration):
1285
1285
  "created",
1286
1286
  models.DateTimeField(
1287
1287
  blank=True,
1288
- default=django_audit_fields.models.audit_model_mixin.utcnow,
1288
+ default=django.utils.timezone.now,
1289
1289
  ),
1290
1290
  ),
1291
1291
  (
1292
1292
  "modified",
1293
1293
  models.DateTimeField(
1294
1294
  blank=True,
1295
- default=django_audit_fields.models.audit_model_mixin.utcnow,
1295
+ default=django.utils.timezone.now,
1296
1296
  ),
1297
1297
  ),
1298
1298
  (
@@ -1375,7 +1375,7 @@ class Migration(migrations.Migration):
1375
1375
  (
1376
1376
  "report_datetime",
1377
1377
  models.DateTimeField(
1378
- default=edc_utils.date.get_utcnow,
1378
+ default=django.utils.timezone.now,
1379
1379
  verbose_name="Report Date and Time",
1380
1380
  ),
1381
1381
  ),
@@ -15,7 +15,7 @@ from django.db import migrations, models
15
15
 
16
16
  import edc_action_item.managers
17
17
  import edc_model.validators.date
18
- import edc_utils.date
18
+ import django.utils.timezone
19
19
 
20
20
 
21
21
  class Migration(migrations.Migration):
@@ -45,14 +45,14 @@ class Migration(migrations.Migration):
45
45
  "created",
46
46
  models.DateTimeField(
47
47
  blank=True,
48
- default=django_audit_fields.models.audit_model_mixin.utcnow,
48
+ default=django.utils.timezone.now,
49
49
  ),
50
50
  ),
51
51
  (
52
52
  "modified",
53
53
  models.DateTimeField(
54
54
  blank=True,
55
- default=django_audit_fields.models.audit_model_mixin.utcnow,
55
+ default=django.utils.timezone.now,
56
56
  ),
57
57
  ),
58
58
  (
@@ -127,7 +127,7 @@ class Migration(migrations.Migration):
127
127
  (
128
128
  "report_datetime",
129
129
  models.DateTimeField(
130
- default=edc_utils.date.get_utcnow,
130
+ default=django.utils.timezone.now,
131
131
  verbose_name="Report Date and Time",
132
132
  ),
133
133
  ),
@@ -359,14 +359,14 @@ class Migration(migrations.Migration):
359
359
  "created",
360
360
  models.DateTimeField(
361
361
  blank=True,
362
- default=django_audit_fields.models.audit_model_mixin.utcnow,
362
+ default=django.utils.timezone.now,
363
363
  ),
364
364
  ),
365
365
  (
366
366
  "modified",
367
367
  models.DateTimeField(
368
368
  blank=True,
369
- default=django_audit_fields.models.audit_model_mixin.utcnow,
369
+ default=django.utils.timezone.now,
370
370
  ),
371
371
  ),
372
372
  (
@@ -449,7 +449,7 @@ class Migration(migrations.Migration):
449
449
  (
450
450
  "report_datetime",
451
451
  models.DateTimeField(
452
- default=edc_utils.date.get_utcnow,
452
+ default=django.utils.timezone.now,
453
453
  verbose_name="Report Date and Time",
454
454
  ),
455
455
  ),