clinicedc 2.0.4__py3-none-any.whl → 2.0.6__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 (478) hide show
  1. {clinicedc-2.0.4.dist-info → clinicedc-2.0.6.dist-info}/METADATA +41 -45
  2. {clinicedc-2.0.4.dist-info → clinicedc-2.0.6.dist-info}/RECORD +478 -478
  3. edc_action_item/action.py +76 -54
  4. edc_action_item/action_item_notification.py +1 -3
  5. edc_action_item/action_with_notification.py +4 -4
  6. edc_action_item/create_action_item.py +2 -2
  7. edc_action_item/create_or_update_action_type.py +1 -1
  8. edc_action_item/data_fixers.py +4 -5
  9. edc_action_item/delete_action_item.py +0 -1
  10. edc_action_item/modeladmin_mixins.py +2 -4
  11. edc_action_item/modelform_mixins/modelform_mixins.py +1 -1
  12. edc_action_item/models/action_item.py +53 -38
  13. edc_action_item/models/action_model_mixin.py +17 -17
  14. edc_action_item/models/action_type.py +33 -13
  15. edc_action_item/models/reference.py +3 -2
  16. edc_action_item/site_action_items.py +13 -14
  17. edc_action_item/stubs.py +9 -9
  18. edc_action_item/templatetags/action_item_extras.py +2 -2
  19. edc_action_item/view_utils/action_item_button.py +3 -3
  20. edc_action_item/view_utils/action_item_popover_list_item.py +4 -4
  21. edc_adherence/form_validator_mixin.py +1 -1
  22. edc_adverse_event/action_items/ae_followup_action.py +1 -1
  23. edc_adverse_event/action_items/ae_initial_action.py +1 -1
  24. edc_adverse_event/action_items/ae_susar_action.py +1 -1
  25. edc_adverse_event/action_items/ae_tmg_action.py +1 -1
  26. edc_adverse_event/action_items/death_report_action.py +1 -2
  27. edc_adverse_event/action_items/death_report_tmg_action.py +1 -1
  28. edc_adverse_event/action_items/death_report_tmg_second_action.py +1 -1
  29. edc_adverse_event/action_items/hospitalization_action.py +1 -1
  30. edc_adverse_event/form_validator_mixins/death_report_form_validator.py +3 -3
  31. edc_adverse_event/form_validator_mixins/requires_death_report_form_validator_mixin.py +3 -4
  32. edc_adverse_event/form_validators/death_report_tmg.py +1 -1
  33. edc_adverse_event/model_mixins/ae_followup/ae_followup_methods_model_mixin.py +3 -3
  34. edc_adverse_event/model_mixins/ae_followup/ae_followup_model_mixin.py +3 -3
  35. edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +0 -1
  36. edc_adverse_event/model_mixins/ae_initial/ae_initial_methods_model_mixin.py +3 -3
  37. edc_adverse_event/model_mixins/ae_initial/ae_initial_model_mixin.py +3 -3
  38. edc_adverse_event/model_mixins/ae_special_interest/aesi_methods_model_mixin.py +4 -4
  39. edc_adverse_event/model_mixins/ae_special_interest/aesi_model_mixin.py +3 -3
  40. edc_adverse_event/model_mixins/ae_susar/ae_susar_methods_model_mixin.py +4 -4
  41. edc_adverse_event/model_mixins/ae_susar/ae_susar_model_mixin.py +3 -3
  42. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +4 -5
  43. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_methods_model_mixin.py +4 -4
  44. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_model_mixin.py +3 -3
  45. edc_adverse_event/model_mixins/death_report/death_report_extra_fields_model_mixin.py +2 -3
  46. edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +11 -11
  47. edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +9 -11
  48. edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +7 -6
  49. edc_adverse_event/model_mixins/hospitaization/hospitalization_model_mixin.py +0 -1
  50. edc_adverse_event/modeladmin_mixins/ae_followup_admin_mixin.py +9 -11
  51. edc_adverse_event/modeladmin_mixins/ae_initial_admin_mixin.py +4 -6
  52. edc_adverse_event/modeladmin_mixins/modeladmin_mixins.py +1 -1
  53. edc_adverse_event/modeladmin_mixins/utils.py +4 -4
  54. edc_adverse_event/models/signals.py +7 -19
  55. edc_adverse_event/pdf_reports/death_pdf_report.py +8 -9
  56. edc_adverse_event/templatetags/edc_adverse_event_extras.py +10 -20
  57. edc_adverse_event/urls.py +7 -3
  58. edc_adverse_event/utils.py +2 -2
  59. edc_adverse_event/view_utils/tmg_button.py +4 -4
  60. edc_appconfig/system_checks.py +1 -1
  61. edc_appointment/appointment_status_updater.py +14 -15
  62. edc_appointment/creators/appointment_creator.py +7 -11
  63. edc_appointment/creators/appointments_creator.py +1 -1
  64. edc_appointment/creators/unscheduled_appointment_creator.py +12 -13
  65. edc_appointment/form_validator_mixins/next_appointment_crf_form_validator_mixin.py +1 -3
  66. edc_appointment/form_validator_mixins/window_period_form_validator_mixin.py +7 -6
  67. edc_appointment/form_validators/appointment_form_validator.py +2 -4
  68. edc_appointment/form_validators/utils.py +4 -4
  69. edc_appointment/managers.py +4 -4
  70. edc_appointment/model_mixins/appointment_methods_model_mixin.py +2 -2
  71. edc_appointment/model_mixins/appointment_model_mixin.py +5 -5
  72. edc_appointment/model_mixins/window_period_model_mixin.py +1 -1
  73. edc_appointment/models/appointment.py +1 -1
  74. edc_appointment/skip_appointments.py +5 -6
  75. edc_appointment/stubs.py +12 -12
  76. edc_appointment/utils.py +41 -47
  77. edc_appointment/view_utils/appointment_button.py +3 -5
  78. edc_auth/admin/role_admin.py +5 -7
  79. edc_auth/auth_objects/default_roles.py +1 -3
  80. edc_auth/auth_updater/auth_updater.py +5 -7
  81. edc_auth/auth_updater/group_updater.py +8 -8
  82. edc_auth/auth_updater/role_updater.py +1 -2
  83. edc_auth/get_app_codenames.py +1 -3
  84. edc_auth/import_users.py +19 -19
  85. edc_auth/models/role.py +4 -3
  86. edc_auth/password_setter.py +6 -7
  87. edc_auth/send_new_credentials_to_user.py +2 -3
  88. edc_auth/site_auths.py +3 -3
  89. edc_consent/actions.py +4 -5
  90. edc_consent/consent_definition.py +8 -11
  91. edc_consent/consent_definition_extension.py +3 -3
  92. edc_consent/form_validators/__init__.py +1 -1
  93. edc_consent/model_mixins/__init__.py +2 -2
  94. edc_consent/model_mixins/consent_version_model_mixin.py +1 -1
  95. edc_consent/modeladmin_mixins/consent_model_admin_mixin.py +1 -2
  96. edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py +3 -5
  97. edc_consent/site_consents.py +10 -15
  98. edc_consent/stubs.py +2 -2
  99. edc_consent/utils.py +1 -1
  100. edc_constants/utils.py +2 -4
  101. edc_crf/crf_form_validator_mixins.py +2 -2
  102. edc_crf/model_mixins/crf_no_manager_model_mixin.py +2 -2
  103. edc_crf/model_mixins/crf_status_model_mixin.py +1 -1
  104. edc_crf/models/crf_status.py +10 -12
  105. edc_crf/update_crf_status_command.py +1 -3
  106. edc_dashboard/management/commands/update_search_slugs.py +8 -11
  107. edc_dashboard/templatetags/edc_dashboard_extras.py +1 -1
  108. edc_dashboard/url_config.py +3 -3
  109. edc_dashboard/utils.py +3 -4
  110. edc_dashboard/views/dashboard_view.py +1 -1
  111. edc_data_manager/models/data_dictionary.py +1 -2
  112. edc_data_manager/models/data_query.py +3 -3
  113. edc_data_manager/models/query_rule.py +2 -2
  114. edc_data_manager/tasks.py +0 -2
  115. edc_device/device.py +1 -1
  116. edc_device/view_mixins.py +1 -1
  117. edc_document_status/fieldsets.py +1 -3
  118. edc_document_status/model_mixins.py +2 -2
  119. edc_document_status/modeladmin_mixins.py +1 -4
  120. edc_egfr/admin/egfr_drop_notification_admin_mixin.py +5 -7
  121. edc_egfr/egfr.py +6 -7
  122. edc_egfr/get_drop_notification_model.py +1 -1
  123. edc_egfr/model_mixins/egfr_drop_notification_model_mixin.py +1 -1
  124. edc_export/archive_exporter.py +26 -27
  125. edc_export/exportables.py +2 -3
  126. edc_export/management/commands/import_receipts.py +6 -6
  127. edc_export/model_exporter/file_history_updater.py +1 -1
  128. edc_export/model_exporter/model_exporter.py +1 -1
  129. edc_export/model_exporter/value_getter.py +6 -6
  130. edc_export/model_mixins/notification_model_mixin.py +4 -4
  131. edc_export/models/data_request.py +3 -3
  132. edc_export/models/data_request_history.py +2 -2
  133. edc_export/models/export_receipt.py +1 -1
  134. edc_export/models/file_history.py +5 -5
  135. edc_export/models/plan.py +4 -4
  136. edc_export/models/upload_export_receipt_file.py +2 -2
  137. edc_export/utils.py +1 -1
  138. edc_facility/facility.py +6 -6
  139. edc_facility/holidays.py +2 -5
  140. edc_facility/import_holidays.py +6 -6
  141. edc_facility/model_mixins.py +1 -1
  142. edc_facility/models/holiday.py +1 -1
  143. edc_facility/utils.py +3 -3
  144. edc_fieldsets/fieldsets.py +1 -1
  145. edc_form_describer/forms_reference.py +5 -8
  146. edc_form_describer/make_forms_reference.py +1 -1
  147. edc_form_describer/management/commands/make_forms_reference.py +1 -1
  148. edc_form_label/custom_label_condition.py +1 -1
  149. edc_form_label/form_label.py +2 -2
  150. edc_form_runners/exceptions.py +1 -1
  151. edc_form_runners/models/issue.py +3 -2
  152. edc_form_runners/site.py +2 -2
  153. edc_form_runners/templatetags/form_runners_extras.py +1 -1
  154. edc_form_runners/utils.py +5 -5
  155. edc_form_validators/applicable_field_validator.py +32 -32
  156. edc_form_validators/base_form_validator.py +1 -1
  157. edc_form_validators/extra_mixins/study_day_form_validator.py +1 -1
  158. edc_form_validators/many_to_many_field_validator.py +38 -43
  159. edc_form_validators/other_specify_field_validator.py +9 -17
  160. edc_form_validators/required_field_validator.py +34 -39
  161. edc_form_validators/test_case_mixin.py +5 -5
  162. edc_identifier/admin.py +1 -3
  163. edc_identifier/identifier.py +2 -3
  164. edc_identifier/model_mixins.py +5 -8
  165. edc_identifier/research_identifier.py +10 -12
  166. edc_identifier/short_identifier.py +1 -1
  167. edc_identifier/simple_identifier.py +22 -22
  168. edc_identifier/utils.py +1 -1
  169. edc_lab/admin/fieldsets.py +7 -9
  170. edc_lab/admin/modeladmin_mixins.py +5 -6
  171. edc_lab/form_validators/requisition_form_validator_mixin.py +2 -3
  172. edc_lab/forms/box_form.py +5 -11
  173. edc_lab/identifiers/aliquot_identifier.py +5 -8
  174. edc_lab/identifiers/prefix.py +2 -5
  175. edc_lab/lab/aliquot_creator.py +1 -2
  176. edc_lab/lab/aliquot_type.py +2 -4
  177. edc_lab/lab/manifest.py +5 -7
  178. edc_lab/lab/requisition_panel.py +2 -4
  179. edc_lab/lab/requisition_panel_group.py +5 -7
  180. edc_lab/model_mixins/requisition/requisition_model_mixin.py +5 -4
  181. edc_lab/model_mixins/shipping/manifest_model_mixin.py +6 -6
  182. edc_lab/model_mixins/shipping/verify_model_mixin.py +4 -3
  183. edc_lab/models/aliquot.py +1 -1
  184. edc_lab/models/box.py +2 -2
  185. edc_lab/models/box_item.py +1 -1
  186. edc_lab/models/box_type.py +1 -1
  187. edc_lab/models/manifest/manifest_item.py +1 -1
  188. edc_lab/pdf_reports/manifest_pdf_report.py +3 -7
  189. edc_lab/site_labs.py +3 -3
  190. edc_lab_dashboard/dashboard_templates.py +1 -1
  191. edc_lab_dashboard/view_mixins/box_view_mixin.py +4 -9
  192. edc_lab_dashboard/views/action_views/action_view.py +1 -2
  193. edc_lab_dashboard/views/action_views/manage_manifest_view.py +1 -1
  194. edc_lab_dashboard/views/action_views/manifest_view.py +9 -11
  195. edc_lab_dashboard/views/action_views/pack_view.py +11 -14
  196. edc_lab_results/calculate_missing.py +2 -2
  197. edc_lab_results/fieldsets.py +6 -6
  198. edc_lab_results/model_mixin_factories/__init__.py +2 -2
  199. edc_lab_results/model_mixin_factories/reportable_result_model_mixin_factory.py +7 -9
  200. edc_lab_results/model_mixin_factories/result_model_mixin_factory.py +7 -9
  201. edc_lab_results/model_mixins/fbg_model_mixin.py +1 -1
  202. edc_lab_results/model_mixins/glucose_model_mixin.py +1 -1
  203. edc_label/admin.py +1 -3
  204. edc_label/label.py +2 -4
  205. edc_label/label_template.py +1 -1
  206. edc_label/subject_label.py +1 -3
  207. edc_list_data/admin.py +3 -5
  208. edc_list_data/load_list_data.py +1 -1
  209. edc_list_data/load_model_data.py +1 -3
  210. edc_list_data/model_mixins.py +3 -5
  211. edc_list_data/preload_data.py +2 -4
  212. edc_list_data/site_list_data.py +6 -7
  213. edc_listboard/filters/listboard_filter.py +2 -2
  214. edc_listboard/views/listboard_view.py +1 -3
  215. edc_locator/models.py +2 -2
  216. edc_locator/view_mixins/subject_locator_view_mixins.py +2 -2
  217. edc_ltfu/action_items.py +1 -1
  218. edc_ltfu/model_mixins.py +0 -2
  219. edc_ltfu/models.py +4 -4
  220. edc_metadata/admin/modeladmin_mixins.py +1 -1
  221. edc_metadata/admin/requisition_metadata.py +2 -4
  222. edc_metadata/metadata/crf_metadata_getter.py +1 -3
  223. edc_metadata/metadata/requisition_metadata_getter.py +1 -3
  224. edc_metadata/metadata_handler.py +2 -2
  225. edc_metadata/metadata_helper/metadata_helper_mixin.py +2 -3
  226. edc_metadata/metadata_mixins/source_model_metadata_mixin.py +2 -2
  227. edc_metadata/metadata_refresher.py +1 -1
  228. edc_metadata/metadata_rules/crf/crf_rule_group.py +3 -5
  229. edc_metadata/metadata_rules/logic.py +1 -1
  230. edc_metadata/metadata_rules/requisition/requisition_rule.py +4 -4
  231. edc_metadata/metadata_rules/requisition/requisition_rule_group.py +2 -2
  232. edc_metadata/metadata_rules/rule_evaluator.py +5 -6
  233. edc_metadata/metadata_rules/rule_group_metaclass.py +2 -3
  234. edc_metadata/metadata_rules/site.py +6 -7
  235. edc_metadata/metadata_updater.py +2 -2
  236. edc_metadata/metadata_wrappers/metadata_wrapper.py +4 -4
  237. edc_metadata/model_mixins/creates/creates_metadata_model_mixin.py +6 -7
  238. edc_metadata/model_mixins/updates/updates_crf_metadata_model_mixin.py +2 -2
  239. edc_metadata/model_mixins/updates/updates_metadata_model_mixin.py +2 -2
  240. edc_metadata/model_mixins/updates/updates_requisition_metadata_model_mixin.py +2 -2
  241. edc_metadata/models/crf_metadata.py +27 -29
  242. edc_metadata/models/crf_metadata_model_mixin.py +1 -1
  243. edc_metadata/models/requisition_metadata.py +29 -31
  244. edc_metadata/stubs.py +17 -17
  245. edc_metadata/utils.py +4 -4
  246. edc_model/__init__.py +2 -2
  247. edc_model/models/historical_records.py +2 -2
  248. edc_model/models/signals.py +1 -1
  249. edc_model/models/url_model_mixin.py +1 -1
  250. edc_model/utils.py +0 -2
  251. edc_model_admin/dashboard/model_admin_dashboard_mixin.py +1 -3
  252. edc_model_admin/history/model_admin_simple_history.py +7 -9
  253. edc_model_admin/mixins/base_model_admin_redirect_mixin.py +4 -6
  254. edc_model_admin/mixins/model_admin_limit_to_selected_foreignkey.py +2 -2
  255. edc_model_admin/mixins/model_admin_model_redirect_mixin.py +2 -10
  256. edc_model_admin/mixins/model_admin_next_url_redirect_mixin.py +8 -9
  257. edc_model_admin/utils.py +6 -9
  258. edc_model_form/mixins/__init__.py +1 -1
  259. edc_model_form/mixins/base_model_form_mixin.py +1 -1
  260. edc_model_to_dataframe/model_to_dataframe.py +2 -4
  261. edc_navbar/site_navbars.py +2 -2
  262. edc_navbar/system_checks.py +1 -1
  263. edc_notification/mailing_list_manager.py +5 -8
  264. edc_notification/management/commands/list_recipients_by_notification.py +1 -1
  265. edc_notification/models/__init__.py +4 -2
  266. edc_notification/notification/graded_event_notification.py +2 -4
  267. edc_notification/notification/model_notification.py +1 -3
  268. edc_notification/notification/notification.py +14 -17
  269. edc_notification/site_notifications.py +7 -7
  270. edc_notification/stubs.py +6 -6
  271. edc_notification/update_mailing_lists_in_m2m.py +2 -2
  272. edc_offstudy/action_items.py +2 -2
  273. edc_offstudy/model_mixins/offstudy_model_mixin.py +1 -1
  274. edc_offstudy/models.py +1 -1
  275. edc_pdf_reports/crf_pdf_report.py +2 -2
  276. edc_pdf_reports/model_mixins.py +2 -2
  277. edc_pdf_reports/report.py +4 -5
  278. edc_pdf_reports/utils.py +1 -1
  279. edc_pdutils/dataframes/get_subject_consent.py +1 -3
  280. edc_pdutils/df_exporters/csv_exporter.py +5 -7
  281. edc_pdutils/df_exporters/tables_exporter.py +2 -2
  282. edc_pdutils/df_handlers/crf_df_handler.py +1 -2
  283. edc_pdutils/dialects/crf_dialect.py +3 -3
  284. edc_pdutils/management/commands/export_models.py +6 -7
  285. edc_pdutils/site_values_mappings.py +2 -2
  286. edc_pdutils/utils/datetime_to_date.py +1 -2
  287. edc_pdutils/utils/refresh_model_from_dataframe.py +1 -3
  288. edc_pdutils/utils/table_names.py +2 -4
  289. edc_pdutils/utils/undash.py +1 -1
  290. edc_pharmacy/admin/medication/assignment_admin.py +2 -4
  291. edc_pharmacy/admin/medication/dosage_guideline_admin.py +2 -4
  292. edc_pharmacy/admin/medication/formulation_admin.py +3 -5
  293. edc_pharmacy/admin/medication/medication_admin.py +3 -5
  294. edc_pharmacy/admin/prescription/rx_refill_admin.py +7 -9
  295. edc_pharmacy/admin/stock/lot_admin.py +5 -7
  296. edc_pharmacy/admin/stock/order_admin.py +2 -2
  297. edc_pharmacy/admin/stock/order_item_admin.py +6 -6
  298. edc_pharmacy/admin/stock/receive_admin.py +1 -1
  299. edc_pharmacy/admin/stock/receive_item_admin.py +2 -2
  300. edc_pharmacy/admin/stock/stock_request_admin.py +4 -6
  301. edc_pharmacy/dosage_calculator.py +4 -4
  302. edc_pharmacy/form_validators/crf/study_medication_form_validator.py +8 -8
  303. edc_pharmacy/forms/stock/stock_request_form.py +2 -4
  304. edc_pharmacy/model_mixins/study_medication_crf_model_mixin.py +2 -2
  305. edc_pharmacy/models/medication/formulation.py +3 -4
  306. edc_pharmacy/models/medication/medication.py +1 -2
  307. edc_pharmacy/models/prescription/rx.py +2 -2
  308. edc_pharmacy/models/prescription/rx_refill.py +7 -9
  309. edc_pharmacy/models/reports/stock_availability.py +3 -4
  310. edc_pharmacy/models/stock/confirmation_at_site.py +1 -3
  311. edc_pharmacy/models/stock/order.py +1 -2
  312. edc_pharmacy/models/stock/receive.py +3 -4
  313. edc_pharmacy/models/stock/receive_item.py +2 -3
  314. edc_pharmacy/models/stock/stock.py +1 -2
  315. edc_pharmacy/models/stock/stock_adjustment.py +1 -2
  316. edc_pharmacy/models/stock/stock_request.py +4 -5
  317. edc_pharmacy/models/storage/box.py +1 -1
  318. edc_pharmacy/models/storage/items/container_model_mixin.py +1 -1
  319. edc_pharmacy/models/storage/room.py +1 -1
  320. edc_pharmacy/models/storage/shelf.py +1 -1
  321. edc_pharmacy/models/storage/utils.py +15 -16
  322. edc_pharmacy/prescribe/create_prescription.py +5 -5
  323. edc_pharmacy/refill/refill_creator.py +1 -1
  324. edc_pharmacy/sample_usb_printing/usb_printing.py +1 -1
  325. edc_pharmacy/utils/__init__.py +1 -1
  326. edc_pharmacy/utils/confirm_stock.py +3 -3
  327. edc_pharmacy/utils/confirm_stock_at_site.py +9 -8
  328. edc_pharmacy/utils/dispense.py +5 -8
  329. edc_pharmacy/utils/format_qty.py +3 -3
  330. edc_pharmacy/utils/get_codenames.py +1 -1
  331. edc_pharmacy/utils/miscellaneous.py +1 -1
  332. edc_pharmacy/utils/process_repack_request.py +18 -19
  333. edc_pharmacy/utils/process_repack_request_queryset.py +0 -2
  334. edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -3
  335. edc_pharmacy/views/add_to_storage_bin_view.py +1 -1
  336. edc_pharmacy/views/allocate_to_subject_view.py +2 -6
  337. edc_pharmacy/views/confirm_stock_from_instance_view.py +4 -4
  338. edc_pharmacy/views/confirm_stock_from_queryset_view.py +1 -5
  339. edc_pharmacy/views/confirmation_at_site_view.py +2 -3
  340. edc_pharmacy/views/dispense_view.py +1 -1
  341. edc_pharmacy/views/move_to_storage_bin_view.py +2 -3
  342. edc_pharmacy/views/print_labels_view.py +30 -31
  343. edc_pharmacy/views/transfer_stock_view.py +1 -1
  344. edc_prn/prn.py +1 -1
  345. edc_prn/site_prn_forms.py +1 -2
  346. edc_protocol_incident/action_items.py +2 -2
  347. edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +3 -3
  348. edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +3 -5
  349. edc_protocol_incident/modeladmin_mixins.py +3 -5
  350. edc_protocol_incident/models/protocol_deviation_violation.py +5 -5
  351. edc_protocol_incident/models/protocol_incident.py +5 -5
  352. edc_pylabels/site_label_configs.py +5 -5
  353. edc_qareports/model_mixins/qa_report_model_mixin.py +4 -2
  354. edc_qareports/models/qa_reports_log.py +1 -2
  355. edc_qareports/utils.py +1 -2
  356. edc_randomization/admin.py +3 -5
  357. edc_randomization/auth_objects.py +2 -3
  358. edc_randomization/blinding.py +1 -1
  359. edc_randomization/constants.py +2 -4
  360. edc_randomization/model_mixins.py +3 -3
  361. edc_randomization/randomization_list_importer.py +13 -14
  362. edc_randomization/randomization_list_verifier.py +11 -13
  363. edc_randomization/randomizer.py +2 -2
  364. edc_randomization/system_checks.py +1 -2
  365. edc_randomization/utils.py +5 -5
  366. edc_refusal/admin.py +1 -1
  367. edc_refusal/model_mixins.py +1 -1
  368. edc_refusal/utils.py +1 -1
  369. edc_registration/model_mixins/updates_or_creates_registered_subject_model_mixin.py +2 -2
  370. edc_registration/modeladmin_mixins.py +4 -7
  371. edc_registration/models/registered_subject.py +7 -9
  372. edc_registration/utils.py +3 -4
  373. edc_reportable/data/grading_data/daids_july_2017.py +3 -3
  374. edc_reportable/evaluator.py +5 -5
  375. edc_reportable/formula.py +1 -1
  376. edc_reportable/reference_range_evaluator.py +3 -3
  377. edc_reportable/utils/convert_units.py +10 -12
  378. edc_reportable/utils/grading_data_model_cls.py +2 -2
  379. edc_reportable/utils/grading_exception_model_cls.py +2 -2
  380. edc_reportable/utils/molecular_weight_model_cls.py +2 -2
  381. edc_reportable/utils/normal_data_model_cls.py +2 -2
  382. edc_reportable/utils/reference_range_colllection_model_cls.py +2 -2
  383. edc_screening/age_evaluator.py +2 -4
  384. edc_screening/eligibility.py +1 -1
  385. edc_screening/form_validator_mixins.py +2 -2
  386. edc_screening/model_mixins/screening_methods_model_mixin.py +1 -1
  387. edc_screening/screening_eligibility.py +1 -1
  388. edc_screening/utils.py +4 -6
  389. edc_search/model_mixins.py +1 -1
  390. edc_search/search_slug.py +1 -3
  391. edc_search/updater.py +1 -1
  392. edc_sites/admin/site_model_admin_mixin.py +2 -2
  393. edc_sites/model_mixins/site_model_mixin.py +1 -2
  394. edc_sites/modelform_mixins.py +2 -2
  395. edc_sites/models/__init__.py +1 -1
  396. edc_sites/models/site_profile.py +4 -4
  397. edc_sites/site.py +24 -32
  398. edc_sites/system_checks.py +1 -1
  399. edc_sites/utils/get_message_text.py +1 -1
  400. edc_sites/utils/valid_site_for_subject_or_raise.py +5 -6
  401. edc_subject_dashboard/requisition_report.py +4 -5
  402. edc_subject_dashboard/requisition_verifier.py +4 -2
  403. edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +16 -17
  404. edc_subject_dashboard/view_utils/__init__.py +1 -1
  405. edc_subject_dashboard/view_utils/crf_button.py +1 -3
  406. edc_subject_dashboard/view_utils/subject_consent_dashboard_button.py +2 -2
  407. edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +2 -2
  408. edc_subject_dashboard/view_utils/timepoint_status_button.py +1 -4
  409. edc_subject_dashboard/views/requisition_print_actions_view.py +2 -2
  410. edc_subject_dashboard/views/subject_dashboard_view.py +1 -1
  411. edc_timepoint/model_mixins.py +2 -2
  412. edc_transfer/action_items.py +1 -1
  413. edc_transfer/model_mixins.py +4 -3
  414. edc_transfer/modeladmin_mixins.py +3 -6
  415. edc_unblinding/action_items.py +2 -2
  416. edc_unblinding/models/unblinding_request.py +3 -3
  417. edc_unblinding/models/unblinding_review.py +3 -3
  418. edc_utils/__init__.py +6 -5
  419. edc_utils/age.py +1 -1
  420. edc_utils/celery.py +3 -8
  421. edc_utils/get_static_file.py +1 -1
  422. edc_utils/text.py +5 -6
  423. edc_view_utils/__init__.py +3 -3
  424. edc_view_utils/dashboard_model_button.py +4 -4
  425. edc_view_utils/model_button.py +7 -8
  426. edc_view_utils/perms.py +3 -3
  427. edc_visit_schedule/action_items.py +2 -2
  428. edc_visit_schedule/admin/list_filters.py +11 -9
  429. edc_visit_schedule/admin/subject_schedule_history_admin.py +13 -15
  430. edc_visit_schedule/admin/visit_schedule_admin.py +7 -7
  431. edc_visit_schedule/fieldsets.py +4 -6
  432. edc_visit_schedule/management/commands/find_invalid_onschedules.py +1 -1
  433. edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +3 -1
  434. edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +1 -1
  435. edc_visit_schedule/modelform_mixins/__init__.py +1 -1
  436. edc_visit_schedule/modelform_mixins/off_schedule_modelform_mixin.py +1 -2
  437. edc_visit_schedule/models/subject_schedule_history.py +2 -1
  438. edc_visit_schedule/models/visit_schedule.py +2 -2
  439. edc_visit_schedule/schedule/schedule.py +11 -12
  440. edc_visit_schedule/schedule/visit_collection.py +4 -3
  441. edc_visit_schedule/schedule/window.py +19 -12
  442. edc_visit_schedule/site_visit_schedules.py +9 -9
  443. edc_visit_schedule/subject_schedule.py +6 -7
  444. edc_visit_schedule/system_checks.py +1 -1
  445. edc_visit_schedule/view_mixins.py +1 -1
  446. edc_visit_schedule/visit/crf.py +3 -7
  447. edc_visit_schedule/visit/requisition.py +2 -2
  448. edc_visit_schedule/visit/visit.py +6 -7
  449. edc_visit_schedule/visit/window_period.py +8 -8
  450. edc_visit_schedule/visit_schedule/schedules_collection.py +2 -5
  451. edc_visit_tracking/action_items.py +11 -13
  452. edc_visit_tracking/form_validators/visit_form_validator.py +5 -5
  453. edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +3 -4
  454. edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +2 -2
  455. edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +2 -3
  456. edc_visit_tracking/model_mixins/utils.py +1 -1
  457. edc_visit_tracking/model_mixins/visit_model_mixin/previous_visit_model_mixin.py +2 -2
  458. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_mixin.py +3 -3
  459. edc_visit_tracking/modeladmin_mixins/crf_model_admin_mixin.py +6 -4
  460. edc_visit_tracking/modeladmin_mixins/visit_model_admin_mixin.py +6 -7
  461. edc_visit_tracking/modelform_mixins/crf/visit_tracking_crf_modelform_mixin.py +4 -5
  462. edc_visit_tracking/modelform_mixins/visit_tracking_modelform_mixin.py +3 -4
  463. edc_visit_tracking/models/subject_visit.py +1 -1
  464. edc_visit_tracking/models/subject_visit_missed.py +1 -1
  465. edc_visit_tracking/stubs.py +7 -7
  466. edc_visit_tracking/typing_stubs.py +11 -11
  467. edc_visit_tracking/utils.py +5 -5
  468. edc_visit_tracking/view_utils/related_visit_button.py +5 -5
  469. edc_vitals/calculators/bmi.py +1 -1
  470. edc_vitals/form_validators/blood_pressure_form_validator_mixin.py +8 -10
  471. edc_vitals/form_validators/bmi_form_validator_mixin.py +1 -1
  472. edc_vitals/form_validators/weight_height_with_bmi_form_validator_mixin.py +5 -2
  473. edc_vitals/model_mixins/blood_pressure_model_mixin.py +3 -4
  474. edc_vitals/model_mixins/weight_height_bmi_model_mixin.py +4 -4
  475. edc_vitals/utils.py +1 -1
  476. edc_vitals/validators.py +1 -1
  477. {clinicedc-2.0.4.dist-info → clinicedc-2.0.6.dist-info}/WHEEL +0 -0
  478. {clinicedc-2.0.4.dist-info → clinicedc-2.0.6.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Type
3
+ from typing import TYPE_CHECKING, Any
4
4
 
5
5
  from django.apps import apps as django_apps
6
6
  from django.core.exceptions import ObjectDoesNotExist
@@ -32,7 +32,7 @@ class SourceModelMetadataMixin:
32
32
  return self._source_model
33
33
 
34
34
  @property
35
- def source_model_cls(self) -> Type[CrfModelMixin]:
35
+ def source_model_cls(self) -> type[CrfModelMixin]:
36
36
  return django_apps.get_model(self.source_model)
37
37
 
38
38
  @property
@@ -74,7 +74,7 @@ class MetadataRefresher:
74
74
  except AttributeError:
75
75
  try:
76
76
  instance.metadata_update()
77
- except (AttributeError,) as e:
77
+ except AttributeError as e:
78
78
  self._message(f" skipping (got {e}) \n")
79
79
  break
80
80
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Self, Tuple
3
+ from typing import TYPE_CHECKING, Any, Self
4
4
 
5
5
  from edc_visit_schedule.visit import CrfCollection
6
6
 
@@ -52,7 +52,7 @@ class CrfRuleGroup(RuleGroup, metaclass=RuleGroupMetaclass):
52
52
  cls: Any,
53
53
  related_visit: RelatedVisitModel = None,
54
54
  allow_create: bool | None = None,
55
- ) -> Tuple[dict[str, dict[str, dict]], dict[str, CrfMetadata]]:
55
+ ) -> tuple[dict[str, dict[str, dict]], dict[str, CrfMetadata]]:
56
56
  rule_results = {}
57
57
  metadata_objects = {}
58
58
  for rule in cls._meta.options.get("rules"):
@@ -70,9 +70,7 @@ class CrfRuleGroup(RuleGroup, metaclass=RuleGroupMetaclass):
70
70
  f"Target model and visit model are the same! "
71
71
  f"Got {target_model}=={related_visit._meta.label_lower}"
72
72
  )
73
- elif (
74
- target_model.split(".")[1] == related_visit._meta.label_lower.split(".")[1]
75
- ):
73
+ if target_model.split(".")[1] == related_visit._meta.label_lower.split(".")[1]:
76
74
  raise TargetModelConflict(
77
75
  f"Target model and visit model might be the same. "
78
76
  f"Got {target_model}~={related_visit._meta.label_lower}"
@@ -33,7 +33,7 @@ class Logic:
33
33
  alternative: str = None,
34
34
  comment: str | None = None,
35
35
  ) -> None:
36
- if not hasattr(predicate, "__call__"):
36
+ if not callable(predicate):
37
37
  raise RuleLogicError(
38
38
  "Predicate must be a callable. For example a "
39
39
  'predicate class such as "P" or "PF"'
@@ -1,4 +1,4 @@
1
- from typing import Any, Optional
1
+ from typing import Any
2
2
 
3
3
  from ...constants import REQUISITION
4
4
  from ..rule import Rule
@@ -10,7 +10,7 @@ class RequisitionRuleEvaluatorError(Exception):
10
10
 
11
11
 
12
12
  class RequisitionRuleEvaluator(RuleEvaluator):
13
- def __init__(self, source_panel: Optional[Any] = None, **kwargs) -> None:
13
+ def __init__(self, source_panel: Any | None = None, **kwargs) -> None:
14
14
  self.source_panel = source_panel
15
15
  super().__init__(**kwargs)
16
16
 
@@ -20,8 +20,8 @@ class RequisitionRule(Rule):
20
20
 
21
21
  def __init__(
22
22
  self,
23
- source_panel: Optional[Any] = None,
24
- target_panels: Optional[list] = None,
23
+ source_panel: Any | None = None,
24
+ target_panels: list | None = None,
25
25
  **kwargs,
26
26
  ) -> None:
27
27
  self.metadata_category = REQUISITION
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections import namedtuple
4
- from typing import TYPE_CHECKING, Any, Tuple
4
+ from typing import TYPE_CHECKING, Any
5
5
 
6
6
  from django.core.exceptions import ValidationError
7
7
 
@@ -97,7 +97,7 @@ class RequisitionRuleGroup(RuleGroup, metaclass=RequisitionMetaclass):
97
97
  cls: Any,
98
98
  related_visit: RelatedVisitModel = None,
99
99
  allow_create: bool | None = None,
100
- ) -> Tuple[dict[str, dict[str, list[RuleResult]]], dict[str, RequisitionMetadata]]:
100
+ ) -> tuple[dict[str, dict[str, list[RuleResult]]], dict[str, RequisitionMetadata]]:
101
101
  """Returns a tuple of (rule_results, metadata_objects) where
102
102
  rule_results ...
103
103
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Type
3
+ from typing import TYPE_CHECKING, Any
4
4
 
5
5
  from django.conf import settings
6
6
  from django.core.exceptions import ObjectDoesNotExist
@@ -57,12 +57,11 @@ class RuleEvaluator:
57
57
  if predicate:
58
58
  if self.logic.consequence != DO_NOTHING:
59
59
  self.result = self.logic.consequence
60
- else:
61
- if self.logic.alternative != DO_NOTHING:
62
- self.result = self.logic.alternative
60
+ elif self.logic.alternative != DO_NOTHING:
61
+ self.result = self.logic.alternative
63
62
 
64
63
  @property
65
- def registered_subject_model(self) -> Type[RegisteredSubject]:
64
+ def registered_subject_model(self) -> type[RegisteredSubject]:
66
65
  return get_registered_subject_model_cls()
67
66
 
68
67
  @property
@@ -75,7 +74,7 @@ class RuleEvaluator:
75
74
  )
76
75
  except ObjectDoesNotExist as e:
77
76
  raise RuleEvaluatorRegisterSubjectError(
78
- f"Registered subject required for rule {repr(self)}. "
77
+ f"Registered subject required for rule {self!r}. "
79
78
  f"subject_identifier='{self.related_visit.subject_identifier}'. "
80
79
  f"Got {e}."
81
80
  )
@@ -70,10 +70,9 @@ class RuleGroupMetaclass(type):
70
70
  raise RuleGroupError(
71
71
  "RuleGroup Meta attr `predicates` may not be `None` if a "
72
72
  "rule.predicate in the RuleGroup is a string. "
73
- f'See {attrs.get("__qualname__")}.'
73
+ f"See {attrs.get('__qualname__')}."
74
74
  )
75
- else:
76
- rule.predicate = getattr(meta.predicates, rule.predicate)
75
+ rule.predicate = getattr(meta.predicates, rule.predicate)
77
76
  for k, v in meta.options.items():
78
77
  setattr(rule, k, v)
79
78
  rule.target_models = mcs.__get_target_models(rule, meta)
@@ -1,6 +1,6 @@
1
1
  import copy
2
2
  import sys
3
- from typing import Any, Optional
3
+ from typing import Any
4
4
 
5
5
  from django.apps import apps as django_apps
6
6
  from django.core.management.color import color_style
@@ -23,14 +23,14 @@ class SiteMetadataRules:
23
23
  def __init__(self) -> None:
24
24
  self.registry = {}
25
25
 
26
- def register(self, rule_group_cls: Optional[Any] = None) -> None:
26
+ def register(self, rule_group_cls: Any | None = None) -> None:
27
27
  """Register MetadataRules to a list per app_label
28
28
  for the module the rule groups were declared in.
29
29
  """
30
30
  if rule_group_cls:
31
31
  if not rule_group_cls._meta.options.get("rules"):
32
32
  raise SiteMetadataNoRulesError(
33
- f"The metadata rule group {rule_group_cls.name} " f"has no rule!"
33
+ f"The metadata rule group {rule_group_cls.name} has no rule!"
34
34
  )
35
35
 
36
36
  if rule_group_cls._meta.app_label not in self.registry:
@@ -39,8 +39,7 @@ class SiteMetadataRules:
39
39
  for rgroup in self.registry.get(rule_group_cls._meta.app_label):
40
40
  if rgroup.name == rule_group_cls.name:
41
41
  raise SiteMetadataRulesAlreadyRegistered(
42
- f"The metadata rule group {rule_group_cls.name} "
43
- f"is already registered"
42
+ f"The metadata rule group {rule_group_cls.name} is already registered"
44
43
  )
45
44
  self.registry.get(rule_group_cls._meta.app_label).append(rule_group_cls)
46
45
 
@@ -51,11 +50,11 @@ class SiteMetadataRules:
51
50
  def validate(self) -> None:
52
51
  for rule_groups in self.registry.values():
53
52
  for rule_group in rule_groups:
54
- sys.stdout.write(f"{repr(rule_group)}\n")
53
+ sys.stdout.write(f"{rule_group!r}\n")
55
54
  rule_group.validate()
56
55
 
57
56
  @staticmethod
58
- def autodiscover(module_name: Optional[str] = None) -> None:
57
+ def autodiscover(module_name: str | None = None) -> None:
59
58
  """Autodiscovers rules in the metadata_rules.py file
60
59
  of any INSTALLED_APP.
61
60
  """
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Type
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from .constants import CRF, KEYED
6
6
  from .metadata_handler import MetadataHandler
@@ -25,7 +25,7 @@ class MetadataUpdater(SourceModelMetadataMixin):
25
25
  the related_visit, source model name and desired entry status.
26
26
  """
27
27
 
28
- metadata_handler_cls: Type[MetadataHandler] = MetadataHandler
28
+ metadata_handler_cls: type[MetadataHandler] = MetadataHandler
29
29
  metadata_category: str = CRF
30
30
  metadata_model: str = "edc_metadata.crfmetadata"
31
31
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Type
3
+ from typing import TYPE_CHECKING, Any
4
4
 
5
5
  from django.apps import apps as django_apps
6
6
  from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
@@ -41,7 +41,7 @@ class MetadataWrapper:
41
41
  f"Visit code mismatch. Visit is {self.visit.visit_code}."
42
42
  f"{self.visit.visit_code_sequence} but metadata object has "
43
43
  f"{self.metadata_obj.visit_code}."
44
- f"{self.metadata_obj.visit_code_sequence}. Got {repr(metadata_obj)}."
44
+ f"{self.metadata_obj.visit_code_sequence}. Got {metadata_obj!r}."
45
45
  )
46
46
 
47
47
  def __repr__(self) -> str:
@@ -59,7 +59,7 @@ class MetadataWrapper:
59
59
  self._source_model_obj = self.source_model_cls.objects.get(**self.options)
60
60
  except AttributeError as e:
61
61
  if "related_visit_model_attr" not in str(e):
62
- raise ImproperlyConfigured(f"{e} See {repr(self.source_model_cls)}")
62
+ raise ImproperlyConfigured(f"{e} See {self.source_model_cls!r}")
63
63
  except ObjectDoesNotExist:
64
64
  self._source_model_obj = None
65
65
  return self._source_model_obj
@@ -69,6 +69,6 @@ class MetadataWrapper:
69
69
  self._source_model_obj = value
70
70
 
71
71
  @property
72
- def source_model_cls(self) -> Type[CrfModelMixin]:
72
+ def source_model_cls(self) -> type[CrfModelMixin]:
73
73
  """Returns a CRF model class"""
74
74
  return django_apps.get_model(self.metadata_obj.model)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Type
3
+ from typing import TYPE_CHECKING, Any
4
4
 
5
5
  from django.db import models, transaction
6
6
 
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
19
19
  from edc_visit_tracking.typing_stubs import RelatedVisitProtocol
20
20
  else:
21
21
 
22
- class RelatedVisitProtocol: ... # noqa
22
+ class RelatedVisitProtocol: ...
23
23
 
24
24
 
25
25
  class CreatesMetadataModelMixin(RelatedVisitProtocol, models.Model):
@@ -27,9 +27,9 @@ class CreatesMetadataModelMixin(RelatedVisitProtocol, models.Model):
27
27
  create metadata on save.
28
28
  """
29
29
 
30
- metadata_cls: Type[Metadata] = Metadata
31
- metadata_destroyer_cls: Type[Destroyer] = Destroyer
32
- metadata_rule_evaluator_cls: Type[MetadataRuleEvaluator] = MetadataRuleEvaluator
30
+ metadata_cls: type[Metadata] = Metadata
31
+ metadata_destroyer_cls: type[Destroyer] = Destroyer
32
+ metadata_rule_evaluator_cls: type[MetadataRuleEvaluator] = MetadataRuleEvaluator
33
33
 
34
34
  def metadata_create(self) -> None:
35
35
  """Creates metadata, called by post_save signal."""
@@ -96,8 +96,7 @@ class CreatesMetadataModelMixin(RelatedVisitProtocol, models.Model):
96
96
  for key in [CRF, REQUISITION]:
97
97
  if [obj for obj in self.metadata[key] if obj.get_entry_status() == KEYED]:
98
98
  raise DeleteMetadataError(
99
- f"Metadata cannot be deleted. {key}s have been "
100
- f"keyed. Got {repr(self)}."
99
+ f"Metadata cannot be deleted. {key}s have been keyed. Got {self!r}."
101
100
  )
102
101
  destroyer = self.metadata_destroyer_cls(related_visit=self)
103
102
  destroyer.delete(entry_status_not_in=[KEYED])
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Type
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from django.apps import apps as django_apps
6
6
  from django.db import models
@@ -44,7 +44,7 @@ class UpdatesCrfMetadataModelMixin(UpdatesMetadataModelMixin):
44
44
  return super().metadata_query_options
45
45
 
46
46
  @property
47
- def metadata_model(self: CrfModel) -> Type[CrfMetadata]:
47
+ def metadata_model(self: CrfModel) -> type[CrfMetadata]:
48
48
  """Returns the metadata model associated with self."""
49
49
  metadata_model = "edc_metadata.crfmetadata"
50
50
  return django_apps.get_model(metadata_model)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Type
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from django.db import models
6
6
 
@@ -74,7 +74,7 @@ class UpdatesMetadataModelMixin(models.Model):
74
74
  @property
75
75
  def metadata_model(
76
76
  self: CrfModel | RequisitionModel,
77
- ) -> Type[CrfMetadata] | Type[RequisitionMetadata]:
77
+ ) -> type[CrfMetadata] | type[RequisitionMetadata]:
78
78
  """Returns the metadata model associated with self.
79
79
 
80
80
  Override
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Type
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from django.apps import apps as django_apps
6
6
  from django.db import models
@@ -68,7 +68,7 @@ class UpdatesRequisitionMetadataModelMixin(UpdatesMetadataModelMixin):
68
68
  return REQUIRED if requisition.required else NOT_REQUIRED
69
69
 
70
70
  @property
71
- def metadata_model(self: RequisitionModel) -> Type[RequisitionMetadata]:
71
+ def metadata_model(self: RequisitionModel) -> type[RequisitionMetadata]:
72
72
  """Returns the metadata model associated with self."""
73
73
  metadata_model = "edc_metadata.requisitionmetadata"
74
74
  return django_apps.get_model(metadata_model)
@@ -57,33 +57,31 @@ class CrfMetadata(CrfMetadataModelMixin, BaseUuidModel):
57
57
  )
58
58
  ]
59
59
  indexes = (
60
- CrfMetadataModelMixin.Meta.indexes
61
- + BaseUuidModel.Meta.indexes
62
- + [
63
- models.Index(
64
- fields=[
65
- "site",
66
- "entry_status",
67
- "visit_code",
68
- "visit_code_sequence",
69
- "model",
70
- "subject_identifier",
71
- "schedule_name",
72
- "visit_schedule_name",
73
- ],
74
- ),
75
- models.Index(
76
- fields=[
77
- "subject_identifier",
78
- "visit_schedule_name",
79
- "schedule_name",
80
- "visit_code",
81
- "visit_code_sequence",
82
- "model",
83
- "entry_status",
84
- "timepoint",
85
- "show_order",
86
- ],
87
- ),
88
- ]
60
+ *CrfMetadataModelMixin.Meta.indexes,
61
+ *BaseUuidModel.Meta.indexes,
62
+ models.Index(
63
+ fields=[
64
+ "site",
65
+ "entry_status",
66
+ "visit_code",
67
+ "visit_code_sequence",
68
+ "model",
69
+ "subject_identifier",
70
+ "schedule_name",
71
+ "visit_schedule_name",
72
+ ],
73
+ ),
74
+ models.Index(
75
+ fields=[
76
+ "subject_identifier",
77
+ "visit_schedule_name",
78
+ "schedule_name",
79
+ "visit_code",
80
+ "visit_code_sequence",
81
+ "model",
82
+ "entry_status",
83
+ "timepoint",
84
+ "show_order",
85
+ ],
86
+ ),
89
87
  )
@@ -48,7 +48,7 @@ class CrfMetadataModelMixin(
48
48
 
49
49
  report_datetime = models.DateTimeField(null=True, blank=True)
50
50
 
51
- entry_comment = models.TextField(max_length=250, null=True, blank=True)
51
+ entry_comment = models.TextField(max_length=250, default="", blank=True)
52
52
 
53
53
  close_datetime = models.DateTimeField(null=True, blank=True)
54
54
 
@@ -86,35 +86,33 @@ class RequisitionMetadata(CrfMetadataModelMixin, BaseUuidModel):
86
86
  )
87
87
  ]
88
88
  indexes = (
89
- CrfMetadataModelMixin.Meta.indexes
90
- + BaseUuidModel.Meta.indexes
91
- + [
92
- models.Index(
93
- fields=[
94
- "site",
95
- "entry_status",
96
- "visit_code",
97
- "visit_code_sequence",
98
- "model",
99
- "panel_name",
100
- "subject_identifier",
101
- "schedule_name",
102
- "visit_schedule_name",
103
- ],
104
- ),
105
- models.Index(
106
- fields=[
107
- "subject_identifier",
108
- "visit_schedule_name",
109
- "schedule_name",
110
- "visit_code",
111
- "visit_code_sequence",
112
- "model",
113
- "panel_name",
114
- "entry_status",
115
- "timepoint",
116
- "show_order",
117
- ],
118
- ),
119
- ]
89
+ *CrfMetadataModelMixin.Meta.indexes,
90
+ *BaseUuidModel.Meta.indexes,
91
+ models.Index(
92
+ fields=[
93
+ "site",
94
+ "entry_status",
95
+ "visit_code",
96
+ "visit_code_sequence",
97
+ "model",
98
+ "panel_name",
99
+ "subject_identifier",
100
+ "schedule_name",
101
+ "visit_schedule_name",
102
+ ],
103
+ ),
104
+ models.Index(
105
+ fields=[
106
+ "subject_identifier",
107
+ "visit_schedule_name",
108
+ "schedule_name",
109
+ "visit_code",
110
+ "visit_code_sequence",
111
+ "model",
112
+ "panel_name",
113
+ "entry_status",
114
+ "timepoint",
115
+ "show_order",
116
+ ],
117
+ ),
120
118
  )
edc_metadata/stubs.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Any, Protocol, Type
1
+ from typing import Any, Protocol
2
2
 
3
3
  from django.db.models import Manager, Model, QuerySet
4
4
 
@@ -28,11 +28,11 @@ class VisitModel(Protocol):
28
28
  visit_schedule_name: str
29
29
  _meta: ModelMetaStub
30
30
 
31
- def visit_schedule(self) -> VisitSchedule: ... # noqa
31
+ def visit_schedule(self) -> VisitSchedule: ...
32
32
 
33
33
 
34
34
  class CrfMetadataModelStub(Protocol):
35
- updater_cls = Type["CrfMetadataUpdaterStub"]
35
+ updater_cls = type["CrfMetadataUpdaterStub"]
36
36
  entry_status: str
37
37
  metadata_query_options: dict
38
38
  model: str
@@ -45,13 +45,13 @@ class CrfMetadataModelStub(Protocol):
45
45
  visit: VisitModel
46
46
  _meta: ModelMetaStub
47
47
 
48
- def save(self, *args, **kwargs) -> None: ... # noqa
48
+ def save(self, *args, **kwargs) -> None: ...
49
49
 
50
- def delete(self) -> int: ... # noqa
50
+ def delete(self) -> int: ...
51
51
 
52
- def metadata_visit_object(self) -> Visit: ... # noqa
52
+ def metadata_visit_object(self) -> Visit: ...
53
53
 
54
- def refresh_from_db(self) -> None: ... # noqa
54
+ def refresh_from_db(self) -> None: ...
55
55
 
56
56
 
57
57
  class PanelStub(Protocol):
@@ -59,7 +59,7 @@ class PanelStub(Protocol):
59
59
 
60
60
 
61
61
  class RequisitionMetadataModelStub(Protocol):
62
- updater_cls = Type["RequisitionMetadataUpdaterStub"]
62
+ updater_cls = type["RequisitionMetadataUpdaterStub"]
63
63
  entry_status: str
64
64
  metadata_query_options: dict
65
65
  model: str
@@ -73,13 +73,13 @@ class RequisitionMetadataModelStub(Protocol):
73
73
  visit: VisitModel
74
74
  _meta: ModelMetaStub
75
75
 
76
- def save(self, *args, **kwargs) -> None: ... # noqa
76
+ def save(self, *args, **kwargs) -> None: ...
77
77
 
78
78
  def delete(self) -> int: ...
79
79
 
80
- def metadata_visit_object(self) -> Visit: ... # noqa
80
+ def metadata_visit_object(self) -> Visit: ...
81
81
 
82
- def metadata_updater_cls(self, **opts: dict): ... # noqa
82
+ def metadata_updater_cls(self, **opts: dict): ...
83
83
 
84
84
 
85
85
  class MetadataGetterStub(Protocol):
@@ -87,23 +87,23 @@ class MetadataGetterStub(Protocol):
87
87
  visit: RelatedVisitModelStub | None
88
88
 
89
89
 
90
- class CrfMetadataUpdaterStub(Protocol): ... # noqa
90
+ class CrfMetadataUpdaterStub(Protocol): ...
91
91
 
92
92
 
93
- class RequisitionMetadataUpdaterStub(Protocol): ... # noqa
93
+ class RequisitionMetadataUpdaterStub(Protocol): ...
94
94
 
95
95
 
96
- class RequisitionMetadataGetterStub(MetadataGetterStub, Protocol): ... # noqa
96
+ class RequisitionMetadataGetterStub(MetadataGetterStub, Protocol): ...
97
97
 
98
98
 
99
99
  class MetadataWrapperStub(Protocol):
100
100
  options: dict
101
101
  model_obj: CrfMetadataModelStub
102
- model_cls: Type[CrfMetadataModelStub]
103
- ... # noqa
102
+ model_cls: type[CrfMetadataModelStub]
103
+ ...
104
104
 
105
105
 
106
- class RequisitionMetadataWrapperStub(MetadataWrapperStub, Protocol): ... # noqa
106
+ class RequisitionMetadataWrapperStub(MetadataWrapperStub, Protocol): ...
107
107
 
108
108
 
109
109
  class Predicate(Protocol):
edc_metadata/utils.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Type
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from django.apps import apps as django_apps
6
6
  from django.conf import settings
@@ -43,17 +43,17 @@ class HasKeyedMetadata(Exception):
43
43
  pass
44
44
 
45
45
 
46
- def get_crf_metadata_model_cls() -> Type[CrfMetadata]:
46
+ def get_crf_metadata_model_cls() -> type[CrfMetadata]:
47
47
  return django_apps.get_model("edc_metadata.crfmetadata")
48
48
 
49
49
 
50
- def get_requisition_metadata_model_cls() -> Type[RequisitionMetadata]:
50
+ def get_requisition_metadata_model_cls() -> type[RequisitionMetadata]:
51
51
  return django_apps.get_model("edc_metadata.requisitionmetadata")
52
52
 
53
53
 
54
54
  def get_metadata_model_cls(
55
55
  metadata_category: str,
56
- ) -> Type[CrfMetadata] | Type[RequisitionMetadata]:
56
+ ) -> type[CrfMetadata] | type[RequisitionMetadata]:
57
57
  if metadata_category == CRF:
58
58
  model_cls = get_crf_metadata_model_cls()
59
59
  elif metadata_category == REQUISITION:
edc_model/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
- from .choices import REPORT_STATUS # noqa
2
- from .constants import DEFAULT_BASE_FIELDS # noqa
1
+ from .choices import REPORT_STATUS
2
+ from .constants import DEFAULT_BASE_FIELDS
3
3
  from .utils import (
4
4
  InvalidFieldName,
5
5
  InvalidFormat,
@@ -13,7 +13,7 @@ class SerializableModel(models.Model):
13
13
  objects = SerializableModelManager()
14
14
 
15
15
  def natural_key(self) -> tuple:
16
- return (self.history_id,) # noqa
16
+ return (self.history_id,)
17
17
 
18
18
  def related_visit_model_attr(self):
19
19
  try:
@@ -37,7 +37,7 @@ class SerializableCrfModel(models.Model):
37
37
  return NotImplemented(self)
38
38
 
39
39
  def natural_key(self) -> tuple:
40
- return (self.history_id,) # noqa
40
+ return (self.history_id,)
41
41
 
42
42
  class Meta:
43
43
  abstract = True
@@ -16,7 +16,7 @@ def remove_f_expressions(sender, instance, history_instance, **kwargs) -> None:
16
16
  django-simple-history-by-overriding-save/62369328#62369328
17
17
  """
18
18
  f_expression_fields = []
19
- for field in history_instance._meta.fields: # noqa
19
+ for field in history_instance._meta.fields:
20
20
  field_value = getattr(history_instance, field.name)
21
21
  if isinstance(field_value, expressions.BaseExpression):
22
22
  f_expression_fields.append(field.name)