clinicedc 2.0.6__py3-none-any.whl → 2.0.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of clinicedc might be problematic. Click here for more details.

Files changed (495) hide show
  1. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/METADATA +2 -2
  2. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/RECORD +489 -441
  3. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/WHEEL +1 -1
  4. edc_action_item/action.py +1 -1
  5. edc_action_item/action_item_notification.py +2 -2
  6. edc_action_item/auths.py +37 -32
  7. edc_action_item/create_action_item.py +1 -1
  8. edc_action_item/decorators.py +1 -1
  9. edc_action_item/migrations/0001_initial.py +21 -22
  10. edc_action_item/migrations/0006_auto_20180707_1659.py +4 -4
  11. edc_action_item/migrations/0008_auto_20180809_0303.py +4 -4
  12. edc_action_item/migrations/0015_auto_20190114_0250.py +4 -4
  13. edc_action_item/migrations/0017_auto_20190305_0123.py +11 -30
  14. edc_action_item/migrations/0030_edcpermissions.py +3 -2
  15. edc_action_item/migrations/0039_alter_actionitem_auto_created_comment_and_more.py +398 -0
  16. edc_action_item/migrations/0040_alter_actionitem_report_datetime_and_more.py +34 -0
  17. edc_action_item/models/action_item.py +9 -4
  18. edc_action_item/models/action_model_mixin.py +5 -6
  19. edc_action_item/models/reference.py +2 -2
  20. edc_action_item/models/signals.py +22 -23
  21. edc_action_item/post_migrate_signals.py +1 -1
  22. edc_action_item/send_email.py +0 -85
  23. edc_action_item/site_action_items.py +5 -9
  24. edc_action_item/utils.py +3 -3
  25. edc_adherence/migrations/0005_alter_nonadherencereasons_extra_value_and_more.py +36 -0
  26. edc_adherence/model_mixins.py +1 -1
  27. edc_adverse_event/auths.py +55 -51
  28. edc_adverse_event/migrations/0001_initial.py +5 -4
  29. edc_adverse_event/migrations/0002_auto_20190802_0059.py +3 -2
  30. edc_adverse_event/migrations/0008_auto_20220825_0451.py +3 -2
  31. edc_adverse_event/migrations/0009_auto_20220907_0157.py +3 -2
  32. edc_adverse_event/migrations/0016_alter_aeactionclassification_device_created_and_more.py +285 -0
  33. edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +2 -2
  34. edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +6 -5
  35. edc_adverse_event/model_mixins/ae_special_interest/aesi_fields_model_mixin.py +2 -2
  36. edc_adverse_event/model_mixins/ae_susar/ae_susar_fields_model_mixin.py +2 -2
  37. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +15 -11
  38. edc_adverse_event/model_mixins/ae_tmg/ae_tmg_methods_model_mixin.py +2 -4
  39. edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +5 -4
  40. edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +6 -3
  41. edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +2 -2
  42. edc_adverse_event/model_mixins/hospitaization/hospitalization_model_mixin.py +4 -3
  43. edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +3 -3
  44. edc_adverse_event/models/signals.py +7 -7
  45. edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -4
  46. edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +3 -5
  47. edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +6 -8
  48. edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -2
  49. edc_adverse_event/views/tmg/summary_listboard_view.py +3 -2
  50. edc_appointment/admin/appointment_admin.py +2 -2
  51. edc_appointment/admin/list_filters.py +2 -2
  52. edc_appointment/auths.py +14 -10
  53. edc_appointment/creators/appointment_creator.py +1 -1
  54. edc_appointment/creators/appointments_creator.py +1 -1
  55. edc_appointment/form_validators/appointment_form_validator.py +108 -82
  56. edc_appointment/migrations/0003_auto_20161127_2226.py +5 -6
  57. edc_appointment/migrations/0006_auto_20170106_2118.py +5 -5
  58. edc_appointment/migrations/0018_auto_20190305_0123.py +5 -12
  59. edc_appointment/migrations/0050_alter_appointment_appt_type_and_more.py +220 -0
  60. edc_appointment/model_mixins/appointment_fields_model_mixin.py +1 -2
  61. edc_appointment/model_mixins/appointment_methods_model_mixin.py +2 -3
  62. edc_appointment/model_mixins/appointment_model_mixin.py +31 -28
  63. edc_appointment/model_mixins/window_period_model_mixin.py +6 -7
  64. edc_appointment/models/appointment.py +1 -1
  65. edc_appointment/models/signals.py +44 -35
  66. edc_appointment/utils.py +19 -24
  67. edc_appointment/view_utils/appointment_button.py +2 -2
  68. edc_auth/admin/user_admin.py +1 -1
  69. edc_auth/auth_objects/__init__.py +2 -20
  70. edc_auth/auth_objects/default_groups.py +13 -11
  71. edc_auth/auth_objects/default_roles.py +26 -24
  72. edc_auth/auth_updater/auth_updater.py +13 -2
  73. edc_auth/auth_updater/group_updater.py +12 -10
  74. edc_auth/auth_updater/role_updater.py +2 -2
  75. edc_auth/constants.py +10 -0
  76. edc_auth/import_users.py +3 -3
  77. edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +5 -5
  78. edc_auth/migrations/0012_auto_20191026_0034.py +3 -2
  79. edc_auth/migrations/0013_auto_20191026_0055.py +3 -2
  80. edc_auth/migrations/0025_permissions.py +3 -2
  81. edc_auth/migrations/0035_alter_edcpermissions_device_created_and_more.py +85 -0
  82. edc_auth/models/user_profile.py +14 -11
  83. edc_auth/post_migrate_signals.py +1 -1
  84. edc_auth/site_auths.py +80 -67
  85. edc_consent/actions.py +4 -5
  86. edc_consent/auths.py +18 -12
  87. edc_consent/migrations/0001_initial.py +3 -2
  88. edc_consent/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  89. edc_consent/model_mixins/consent_extension_model_mixin.py +4 -5
  90. edc_consent/model_mixins/requires_consent_fields_model_mixin.py +2 -2
  91. edc_consent/utils.py +1 -1
  92. edc_constants/constants.py +1 -0
  93. edc_crf/auths.py +5 -0
  94. edc_crf/migrations/0001_initial.py +3 -2
  95. edc_crf/migrations/0009_alter_crfstatus_device_created_and_more.py +54 -0
  96. edc_dashboard/auths.py +10 -6
  97. edc_dashboard/migrations/0001_initial.py +3 -2
  98. edc_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  99. edc_dashboard/templatetags/edc_dashboard_extras.py +3 -2
  100. edc_dashboard/url_config.py +92 -83
  101. edc_dashboard/url_names.py +4 -4
  102. edc_dashboard/view_mixins/url_request_context_mixin.py +6 -5
  103. edc_data_manager/action_items.py +4 -6
  104. edc_data_manager/admin/actions.py +5 -5
  105. edc_data_manager/admin/data_query_admin.py +12 -11
  106. edc_data_manager/auths.py +37 -34
  107. edc_data_manager/handlers/handlers.py +6 -7
  108. edc_data_manager/migrations/0001_initial.py +19 -19
  109. edc_data_manager/migrations/0025_edcpermissions.py +3 -2
  110. edc_data_manager/migrations/0040_alter_datadictionary_device_created_and_more.py +327 -0
  111. edc_data_manager/migrations/0041_alter_dataquery_dm_user_and_more.py +164 -0
  112. edc_data_manager/models/data_query.py +5 -5
  113. edc_data_manager/models/model_mixins.py +8 -8
  114. edc_data_manager/rule/query_rule_wrapper.py +7 -7
  115. edc_data_manager/rule/rule_runner.py +4 -3
  116. edc_document_status/model_mixins.py +1 -1
  117. edc_egfr/egfr.py +11 -7
  118. edc_egfr/model_mixins/egfr_model_mixin.py +3 -7
  119. edc_export/admin/data_request_admin.py +2 -2
  120. edc_export/archive_exporter.py +7 -5
  121. edc_export/auths.py +32 -28
  122. edc_export/files_archiver.py +3 -2
  123. edc_export/migrations/0001_initial.py +26 -26
  124. edc_export/migrations/0004_auto_20190305_0123.py +25 -72
  125. edc_export/migrations/0013_edcpermissions.py +3 -2
  126. edc_export/migrations/0022_alter_datarequest_description_and_more.py +611 -0
  127. edc_export/migrations/0023_alter_datarequesthistory_archive_filename_and_more.py +29 -0
  128. edc_export/model_exporter/file_history_updater.py +10 -10
  129. edc_export/model_exporter/model_exporter.py +17 -15
  130. edc_export/model_exporter/object_history_helpers.py +2 -2
  131. edc_export/models/data_request_history.py +4 -4
  132. edc_export/utils.py +10 -15
  133. edc_facility/auths.py +8 -3
  134. edc_facility/facility.py +16 -22
  135. edc_facility/import_holidays.py +13 -13
  136. edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +8 -7
  137. edc_facility/migrations/0016_alter_healthfacility_device_created_and_more.py +139 -0
  138. edc_facility/migrations/0017_alter_healthfacility_gps_and_more.py +54 -0
  139. edc_facility/model_mixins.py +5 -5
  140. edc_form_label/custom_label_condition.py +11 -8
  141. edc_form_label/form_label.py +1 -1
  142. edc_form_runners/auths.py +11 -6
  143. edc_form_runners/form_runner.py +3 -5
  144. edc_form_runners/migrations/0001_initial.py +3 -2
  145. edc_form_runners/migrations/0005_alter_issue_device_created_and_more.py +49 -0
  146. edc_form_validators/applicable_field_validator.py +7 -6
  147. edc_form_validators/base_form_validator.py +8 -9
  148. edc_form_validators/other_specify_field_validator.py +2 -8
  149. edc_form_validators/required_field_validator.py +19 -16
  150. edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -3
  151. edc_identifier/migrations/0002_auto_20190305_0123.py +3 -6
  152. edc_identifier/migrations/0006_auto_20161127_2226.py +15 -15
  153. edc_identifier/migrations/0007_auto_20161204_2227.py +3 -3
  154. edc_identifier/migrations/0009_auto_20161221_2323.py +3 -5
  155. edc_identifier/migrations/0010_auto_20170112_0602.py +17 -17
  156. edc_identifier/migrations/0011_alter_identifiermodel_device_created_and_more.py +79 -0
  157. edc_identifier/model_mixins.py +1 -1
  158. edc_identifier/models.py +9 -9
  159. edc_identifier/research_identifier.py +11 -10
  160. edc_identifier/simple_identifier.py +9 -5
  161. edc_identifier/subject_identifier.py +3 -2
  162. edc_lab/auths.py +26 -23
  163. edc_lab/lab/aliquot_creator.py +5 -8
  164. edc_lab/lab/primary_aliquot.py +14 -5
  165. edc_lab/migrations/0001_initial.py +29 -29
  166. edc_lab/migrations/0008_auto_20170921_0719.py +3 -3
  167. edc_lab/migrations/0010_auto_20171127_1541.py +15 -15
  168. edc_lab/migrations/0012_auto_20180114_1438.py +3 -3
  169. edc_lab/migrations/0019_auto_20190305_0123.py +43 -127
  170. edc_lab/migrations/0036_alter_aliquot_comment_alter_aliquot_device_created_and_more.py +1139 -0
  171. edc_lab/migrations/0037_alter_historicalorder_order_datetime_and_more.py +31 -0
  172. edc_lab/model_mixins/aliquot/aliquot_identifier_model_mixin.py +2 -2
  173. edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +2 -2
  174. edc_lab/model_mixins/panel_model_mixin.py +18 -7
  175. edc_lab/model_mixins/requisition/crf_with_requisition_model_mixin.py +2 -4
  176. edc_lab/model_mixins/requisition/requisition_model_mixin.py +13 -16
  177. edc_lab/model_mixins/requisition/requisition_verify_model_mixin.py +1 -1
  178. edc_lab/model_mixins/result/result_item_model_mixin.py +4 -4
  179. edc_lab/model_mixins/shipping/manifest_model_mixin.py +4 -5
  180. edc_lab/model_mixins/shipping/verify_model_mixin.py +4 -6
  181. edc_lab/models/aliquot.py +2 -2
  182. edc_lab/models/box.py +1 -1
  183. edc_lab/models/box_item.py +6 -7
  184. edc_lab/models/manifest/manifest.py +3 -3
  185. edc_lab/models/manifest/manifest_item.py +7 -7
  186. edc_lab/models/manifest/shipper.py +3 -4
  187. edc_lab/models/order.py +6 -4
  188. edc_lab/models/panel.py +4 -4
  189. edc_lab/models/result.py +2 -2
  190. edc_lab/models/result_item.py +2 -2
  191. edc_lab_dashboard/auths.py +16 -11
  192. edc_lab_dashboard/migrations/0001_initial.py +3 -2
  193. edc_lab_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  194. edc_lab_dashboard/views/action_views/receive_view.py +2 -2
  195. edc_lab_dashboard/views/action_views/verify_box_item_view.py +2 -2
  196. edc_lab_results/calculate_missing.py +8 -8
  197. edc_lab_results/form_validator_mixins/blood_results_form_validator_mixin.py +2 -2
  198. edc_lab_results/get_summary.py +26 -25
  199. edc_lab_results/model_mixins/blood_result_model_mixin.py +9 -7
  200. edc_lab_results/model_mixins/fbg_model_mixin.py +3 -3
  201. edc_lab_results/model_mixins/glucose_model_mixin.py +3 -3
  202. edc_lab_results/model_mixins/hba1c_model_mixin.py +3 -3
  203. edc_label/auths.py +6 -1
  204. edc_label/label_template.py +8 -8
  205. edc_label/migrations/0001_initial.py +3 -2
  206. edc_label/migrations/0007_alter_zpllabeltemplates_device_created_and_more.py +49 -0
  207. edc_list_data/list_model_maker.py +2 -2
  208. edc_list_data/load_list_data.py +11 -14
  209. edc_list_data/load_model_data.py +3 -3
  210. edc_list_data/model_mixins.py +12 -4
  211. edc_list_data/post_migrate_signals.py +1 -1
  212. edc_list_data/preload_data.py +4 -4
  213. edc_list_data/row.py +1 -1
  214. edc_list_data/site_list_data.py +6 -5
  215. edc_listboard/migrations/0001_initial.py +3 -2
  216. edc_listboard/migrations/0007_alter_listboard_device_created_and_more.py +49 -0
  217. edc_locator/auths.py +18 -13
  218. edc_locator/migrations/0001_initial.py +7 -7
  219. edc_locator/migrations/0018_auto_20190305_0123.py +5 -12
  220. edc_locator/migrations/0040_alter_historicalsubjectlocator_action_identifier_and_more.py +187 -0
  221. edc_locator/migrations/0041_alter_historicalsubjectlocator_report_datetime_and_more.py +27 -0
  222. edc_locator/model_mixins/locator_model_mixin.py +2 -2
  223. edc_locator/model_mixins/subject_contact_fields_mixin.py +1 -1
  224. edc_locator/modeladmin_mixins.py +5 -4
  225. edc_ltfu/model_mixins.py +7 -5
  226. edc_metadata/auths.py +11 -7
  227. edc_metadata/metadata/metadata.py +1 -1
  228. edc_metadata/metadata_rules/crf/crf_rule.py +1 -1
  229. edc_metadata/metadata_rules/decorators.py +1 -1
  230. edc_metadata/metadata_rules/metadata_rule_evaluator.py +5 -3
  231. edc_metadata/metadata_rules/rule.py +2 -3
  232. edc_metadata/metadata_rules/rule_evaluator.py +1 -1
  233. edc_metadata/migrations/0002_auto_20161127_2226.py +5 -5
  234. edc_metadata/migrations/0005_auto_20170112_0602.py +5 -5
  235. edc_metadata/migrations/0011_auto_20190305_0123.py +5 -12
  236. edc_metadata/migrations/0031_alter_crfmetadata_device_created_and_more.py +120 -0
  237. edc_metadata/model_mixins/updates/updates_crf_metadata_model_mixin.py +7 -4
  238. edc_metadata/model_mixins/updates/updates_requisition_metadata_model_mixin.py +5 -2
  239. edc_metadata/models/crf_metadata.py +5 -5
  240. edc_metadata/models/crf_metadata_model_mixin.py +4 -5
  241. edc_metadata/models/requisition_metadata.py +6 -6
  242. edc_metadata/models/signals.py +10 -11
  243. edc_metadata/views/refresh_metadata_actions_view.py +3 -3
  244. edc_model/models/address_mixin.py +6 -6
  245. edc_model/models/fields/initials_field.py +2 -1
  246. edc_model/models/historical_records.py +2 -9
  247. edc_model/models/url_model_mixin.py +2 -2
  248. edc_model/validators/date.py +7 -8
  249. edc_model_admin/list_filters/future_date_list_filter.py +3 -3
  250. edc_model_admin/list_filters/past_date_list_filter.py +3 -3
  251. edc_model_admin/mixins/model_admin_protect_pii_mixin.py +4 -5
  252. edc_model_fields/fields/other_charfield.py +2 -2
  253. edc_navbar/auths.py +18 -13
  254. edc_navbar/migrations/0004_auto_20220825_0451.py +3 -2
  255. edc_navbar/migrations/0009_alter_edcpermissions_device_created_and_more.py +49 -0
  256. edc_notification/auths.py +9 -4
  257. edc_notification/migrations/0001_initial.py +3 -3
  258. edc_notification/migrations/0004_auto_20190305_0123.py +3 -6
  259. edc_notification/migrations/0011_alter_notification_device_created_and_more.py +59 -0
  260. edc_notification/models/notification.py +1 -1
  261. edc_notification/notification/graded_event_notification.py +2 -2
  262. edc_notification/notification/model_notification.py +3 -30
  263. edc_notification/notification/new_model_notification.py +1 -1
  264. edc_notification/notification/notification.py +12 -12
  265. edc_notification/notification/updated_model_notification.py +2 -2
  266. edc_offstudy/auths.py +12 -7
  267. edc_offstudy/migrations/0001_initial.py +4 -4
  268. edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -4
  269. edc_offstudy/migrations/0005_auto_20190305_0123.py +5 -12
  270. edc_offstudy/migrations/0023_alter_historicalsubjectoffstudy_action_identifier_and_more.py +188 -0
  271. edc_offstudy/migrations/0024_alter_historicalsubjectoffstudy_offstudy_datetime_and_more.py +43 -0
  272. edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -2
  273. edc_pdutils/df_exporters/csv_exporter.py +33 -37
  274. edc_pdutils/df_exporters/csv_model_exporter.py +7 -3
  275. edc_pdutils/migrations/0001_initial.py +8 -8
  276. edc_pharmacy/admin/prescription/rx_refill_admin.py +4 -3
  277. edc_pharmacy/admin/reports/stock_availability_admin.py +5 -6
  278. edc_pharmacy/auths.py +19 -15
  279. edc_pharmacy/migrations/0001_initial.py +64 -63
  280. edc_pharmacy/migrations/0015_auto_20220913_2139.py +26 -26
  281. edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +81 -86
  282. edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +5 -5
  283. edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -8
  284. edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +12 -12
  285. edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +5 -5
  286. edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +3 -4
  287. edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +3 -3
  288. edc_pharmacy/migrations/0057_scanduplicates.py +3 -3
  289. edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +13 -15
  290. edc_pharmacy/migrations/0068_stockout.py +2 -3
  291. edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -5
  292. edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +3 -4
  293. edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -8
  294. edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +0 -2
  295. edc_pharmacy/migrations/0089_alter_allocation_allocated_by_and_more.py +3284 -0
  296. edc_pharmacy/migrations/0090_alter_allocation_allocation_datetime_and_more.py +227 -0
  297. edc_pharmacy/model_mixins/study_medication_refill_model_mixin.py +2 -2
  298. edc_pharmacy/models/medication/formulation.py +5 -7
  299. edc_pharmacy/models/medication/medication.py +3 -3
  300. edc_pharmacy/models/model_mixins.py +10 -11
  301. edc_pharmacy/models/prescription/rx.py +13 -12
  302. edc_pharmacy/models/prescription/rx_refill.py +0 -1
  303. edc_pharmacy/models/stock/allocation.py +3 -3
  304. edc_pharmacy/models/stock/confirmation.py +3 -3
  305. edc_pharmacy/models/stock/confirmation_at_site.py +3 -2
  306. edc_pharmacy/models/stock/confirmation_at_site_item.py +3 -4
  307. edc_pharmacy/models/stock/dispense.py +5 -6
  308. edc_pharmacy/models/stock/dispense_item.py +2 -2
  309. edc_pharmacy/models/stock/location.py +3 -4
  310. edc_pharmacy/models/stock/lot.py +6 -7
  311. edc_pharmacy/models/stock/order.py +1 -1
  312. edc_pharmacy/models/stock/receive.py +3 -3
  313. edc_pharmacy/models/stock/receive_item.py +4 -4
  314. edc_pharmacy/models/stock/repack_request.py +2 -2
  315. edc_pharmacy/models/stock/stock.py +12 -18
  316. edc_pharmacy/models/stock/stock_adjustment.py +4 -4
  317. edc_pharmacy/models/stock/stock_request.py +2 -2
  318. edc_pharmacy/models/stock/stock_request_item.py +2 -2
  319. edc_pharmacy/models/stock/stock_transfer.py +3 -3
  320. edc_pharmacy/models/stock/stock_transfer_item.py +2 -2
  321. edc_pharmacy/models/stock/storage_bin.py +3 -4
  322. edc_pharmacy/models/stock/storage_bin_item.py +2 -2
  323. edc_pharmacy/models/stock/supplier.py +3 -4
  324. edc_pharmacy/models/storage/box.py +2 -2
  325. edc_pharmacy/models/storage/items/container_model_mixin.py +3 -4
  326. edc_pharmacy/models/storage/items/pill_bottle_model_mixin.py +2 -2
  327. edc_pharmacy/models/storage/items/subject_pill_bottle.py +1 -1
  328. edc_pharmacy/models/storage/room.py +2 -2
  329. edc_pharmacy/models/storage/shelf.py +2 -2
  330. edc_pharmacy/models/storage/utils.py +1 -1
  331. edc_pharmacy/prescribe/create_prescription.py +3 -3
  332. edc_pharmacy/utils/allocate_stock.py +2 -3
  333. edc_pharmacy/utils/confirm_stock.py +3 -4
  334. edc_pharmacy/utils/confirm_stock_at_site.py +4 -5
  335. edc_pharmacy/utils/dispense.py +3 -4
  336. edc_pharmacy/utils/process_repack_request.py +4 -5
  337. edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -3
  338. edc_pharmacy/utils/transfer_stock.py +2 -3
  339. edc_pharmacy/views/add_to_storage_bin_view.py +2 -2
  340. edc_pharmacy/views/allocate_to_subject_view.py +2 -2
  341. edc_pharmacy/views/confirmation_at_site_view.py +6 -9
  342. edc_pharmacy/views/dispense_view.py +2 -2
  343. edc_pharmacy/views/move_to_storage_bin_view.py +2 -3
  344. edc_pharmacy/views/print_labels_view.py +2 -2
  345. edc_prn/admin_site.py +5 -0
  346. edc_prn/prn.py +10 -11
  347. edc_prn/urls.py +11 -0
  348. edc_protocol/research_protocol_config.py +2 -3
  349. edc_protocol_incident/action_items.py +4 -4
  350. edc_protocol_incident/auths.py +27 -20
  351. edc_protocol_incident/migrations/0001_initial.py +7 -7
  352. edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +13 -13
  353. edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +7 -7
  354. edc_protocol_incident/migrations/0024_alter_actionsrequired_extra_value_and_more.py +625 -0
  355. edc_protocol_incident/migrations/0025_alter_historicalprotocoldeviationviolation_report_datetime_and_more.py +42 -0
  356. edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +18 -11
  357. edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +26 -11
  358. edc_pylabels/actions.py +3 -5
  359. edc_pylabels/auths.py +6 -1
  360. edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +3 -7
  361. edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +3 -3
  362. edc_pylabels/migrations/0013_alter_labelconfiguration_device_created_and_more.py +49 -0
  363. edc_qareports/auths.py +11 -7
  364. edc_qareports/migrations/0001_initial.py +4 -5
  365. edc_qareports/migrations/0005_edcpermissions.py +3 -3
  366. edc_qareports/migrations/0006_qareportlog.py +2 -3
  367. edc_qareports/migrations/0019_alter_edcpermissions_device_created_and_more.py +102 -0
  368. edc_qareports/migrations/0020_alter_note_report_datetime_and_more.py +24 -0
  369. edc_qareports/model_mixins/note_model_mixin.py +7 -4
  370. edc_qareports/model_mixins/on_study_missing_values_model_mixin.py +4 -4
  371. edc_qareports/model_mixins/qa_report_model_mixin.py +2 -3
  372. edc_qareports/models/note.py +4 -4
  373. edc_qareports/models/qa_reports_log.py +2 -3
  374. edc_randomization/admin.py +30 -24
  375. edc_randomization/auths.py +12 -7
  376. edc_randomization/decorators.py +1 -1
  377. edc_randomization/migrations/0001_initial.py +3 -2
  378. edc_randomization/migrations/0002_historicalrandomizationlist.py +3 -2
  379. edc_randomization/migrations/0009_edcpermissions.py +3 -2
  380. edc_randomization/migrations/0014_alter_edcpermissions_device_created_and_more.py +141 -0
  381. edc_randomization/model_mixins.py +9 -9
  382. edc_randomization/randomizer.py +22 -20
  383. edc_randomization/utils.py +19 -18
  384. edc_refusal/auths.py +7 -2
  385. edc_refusal/migrations/0001_initial.py +4 -4
  386. edc_refusal/migrations/0002_historicalsubjectrefusal.py +4 -4
  387. edc_refusal/migrations/0012_alter_historicalsubjectrefusal_comment_and_more.py +122 -0
  388. edc_refusal/migrations/0013_alter_historicalsubjectrefusal_report_datetime_and_more.py +28 -0
  389. edc_refusal/model_mixins.py +4 -4
  390. edc_registration/auths.py +28 -23
  391. edc_registration/migrations/0002_auto_20161127_2226.py +3 -4
  392. edc_registration/migrations/0005_auto_20170111_1809.py +4 -2
  393. edc_registration/migrations/0016_historicalregisteredsubject.py +3 -2
  394. edc_registration/migrations/0017_auto_20190305_0123.py +5 -12
  395. edc_registration/migrations/0033_alter_historicalregisteredsubject_additional_key_and_more.py +302 -0
  396. edc_registration/model_mixins/updates_or_creates_registered_subject_model_mixin.py +15 -7
  397. edc_registration/models/registered_subject.py +28 -27
  398. edc_reportable/age_evaluator.py +4 -2
  399. edc_reportable/formula.py +5 -5
  400. edc_reportable/migrations/0001_initial.py +7 -7
  401. edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -3
  402. edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +5 -5
  403. edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +5 -6
  404. edc_reportable/migrations/0007_alter_gradingdata_age_phrase_and_more.py +509 -0
  405. edc_reportable/models/normal_data.py +4 -5
  406. edc_reportable/models/reference_model_mixins.py +10 -11
  407. edc_reportable/models/reference_range_collection.py +12 -13
  408. edc_reportable/post_migrate_signals.py +1 -1
  409. edc_reportable/utils/convert_units.py +11 -45
  410. edc_reportable/utils/get_normal_data_or_raise.py +2 -2
  411. edc_reportable/utils/get_reference_range_collection.py +2 -3
  412. edc_reportable/utils/load_data.py +4 -4
  413. edc_reportable/utils/update_grading_data.py +5 -5
  414. edc_review_dashboard/auths.py +23 -18
  415. edc_review_dashboard/migrations/0001_initial.py +3 -2
  416. edc_review_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
  417. edc_screening/age_evaluator.py +6 -6
  418. edc_screening/auths.py +35 -30
  419. edc_screening/eligibility.py +1 -1
  420. edc_screening/gender_evaluator.py +1 -1
  421. edc_screening/migrations/0001_initial.py +3 -2
  422. edc_screening/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  423. edc_screening/model_mixins/eligibility_model_mixin.py +3 -6
  424. edc_screening/model_mixins/screening_fields_model_mixin.py +6 -8
  425. edc_screening/model_mixins/screening_methods_model_mixin.py +1 -1
  426. edc_screening/screening_eligibility.py +2 -4
  427. edc_screening/utils.py +9 -9
  428. edc_search/generate_slug.py +26 -0
  429. edc_search/model_mixins.py +10 -22
  430. edc_sites/auths.py +8 -3
  431. edc_sites/migrations/0007_edcpermissions.py +3 -2
  432. edc_sites/migrations/0010_alter_edcpermissions_device_created_and_more.py +69 -0
  433. edc_sites/model_mixins/site_model_mixin.py +2 -2
  434. edc_sites/site.py +5 -5
  435. edc_sites/system_checks.py +1 -1
  436. edc_subject_dashboard/auths.py +27 -22
  437. edc_subject_dashboard/migrations/0001_initial.py +3 -2
  438. edc_subject_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
  439. edc_subject_dashboard/requisition_report.py +6 -4
  440. edc_subject_dashboard/requisition_verifier.py +6 -6
  441. edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -2
  442. edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +7 -8
  443. edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +3 -2
  444. edc_subject_dashboard/view_utils/timepoint_status_button.py +2 -2
  445. edc_timepoint/apps.py +0 -21
  446. edc_timepoint/model_mixins.py +22 -20
  447. edc_transfer/model_mixins.py +4 -4
  448. edc_transfer/modeladmin_mixins.py +1 -1
  449. edc_unblinding/auths.py +9 -4
  450. edc_unblinding/migrations/0001_initial.py +13 -13
  451. edc_unblinding/migrations/0014_alter_historicalunblindingrequest_action_identifier_and_more.py +291 -0
  452. edc_unblinding/migrations/0015_alter_historicalunblindingrequest_report_datetime_and_more.py +45 -0
  453. edc_unblinding/models/unblinding_request.py +2 -2
  454. edc_unblinding/models/unblinding_review.py +3 -3
  455. edc_utils/__init__.py +3 -1
  456. edc_utils/age.py +10 -16
  457. edc_utils/show_urls.py +29 -2
  458. edc_visit_schedule/auths.py +6 -1
  459. edc_visit_schedule/migrations/0001_initial.py +3 -3
  460. edc_visit_schedule/migrations/0002_auto_20190305_0123.py +3 -6
  461. edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +5 -4
  462. edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +10 -10
  463. edc_visit_schedule/migrations/0019_alter_historicalonschedule_device_created_and_more.py +229 -0
  464. edc_visit_schedule/migrations/0020_alter_historicalonschedule_onschedule_datetime_and_more.py +65 -0
  465. edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +5 -4
  466. edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +5 -4
  467. edc_visit_schedule/model_mixins/visit_schedule/visit_code_fields_model_mixin.py +1 -1
  468. edc_visit_schedule/models/subject_schedule_history.py +6 -6
  469. edc_visit_schedule/schedule/visit_collection.py +1 -1
  470. edc_visit_schedule/site_visit_schedules.py +2 -2
  471. edc_visit_schedule/subject_schedule.py +5 -4
  472. edc_visit_schedule/view_mixins.py +2 -3
  473. edc_visit_schedule/visit/visit.py +3 -2
  474. edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +13 -13
  475. edc_visit_tracking/migrations/0009_alter_historicalsubjectvisit_comments_and_more.py +450 -0
  476. edc_visit_tracking/migrations/0010_alter_historicalsubjectvisit_report_datetime_and_more.py +68 -0
  477. edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +3 -3
  478. edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +2 -2
  479. edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +2 -2
  480. edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +2 -2
  481. edc_visit_tracking/model_mixins/visit_model_mixin/caretaker_fields_mixin.py +2 -3
  482. edc_visit_tracking/model_mixins/visit_model_mixin/previous_visit_model_mixin.py +1 -1
  483. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +8 -11
  484. edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_mixin.py +1 -1
  485. edc_visit_tracking/models/signals.py +3 -3
  486. edc_visit_tracking/models/subject_visit.py +1 -1
  487. edc_vitals/calculators/bmi.py +7 -5
  488. edc_vitals/utils.py +1 -1
  489. edc_form_label/models.py +0 -0
  490. edc_search/constants.py +0 -1
  491. edc_search/models.py +0 -0
  492. edc_search/search_slug.py +0 -50
  493. edc_search/updater.py +0 -30
  494. edc_search/wsgi.py +0 -7
  495. {clinicedc-2.0.6.dist-info → clinicedc-2.0.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,227 @@
1
+ # Generated by Django 5.2.6 on 2025-09-18 00:24
2
+
3
+ import django.utils.timezone
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("edc_pharmacy", "0089_alter_allocation_allocated_by_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="allocation",
16
+ name="allocation_datetime",
17
+ field=models.DateTimeField(default=django.utils.timezone.now),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="confirmation",
21
+ name="confirmed_datetime",
22
+ field=models.DateTimeField(default=django.utils.timezone.now),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="confirmationatsite",
26
+ name="transfer_confirmation_datetime",
27
+ field=models.DateTimeField(default=django.utils.timezone.now),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="confirmationatsiteitem",
31
+ name="transfer_confirmation_item_datetime",
32
+ field=models.DateTimeField(default=django.utils.timezone.now),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="dispense",
36
+ name="dispense_datetime",
37
+ field=models.DateTimeField(default=django.utils.timezone.now),
38
+ ),
39
+ migrations.AlterField(
40
+ model_name="dispenseitem",
41
+ name="dispense_item_datetime",
42
+ field=models.DateTimeField(default=django.utils.timezone.now),
43
+ ),
44
+ migrations.AlterField(
45
+ model_name="historicalallocation",
46
+ name="allocation_datetime",
47
+ field=models.DateTimeField(default=django.utils.timezone.now),
48
+ ),
49
+ migrations.AlterField(
50
+ model_name="historicalconfirmation",
51
+ name="confirmed_datetime",
52
+ field=models.DateTimeField(default=django.utils.timezone.now),
53
+ ),
54
+ migrations.AlterField(
55
+ model_name="historicalconfirmationatsite",
56
+ name="transfer_confirmation_datetime",
57
+ field=models.DateTimeField(default=django.utils.timezone.now),
58
+ ),
59
+ migrations.AlterField(
60
+ model_name="historicalconfirmationatsiteitem",
61
+ name="transfer_confirmation_item_datetime",
62
+ field=models.DateTimeField(default=django.utils.timezone.now),
63
+ ),
64
+ migrations.AlterField(
65
+ model_name="historicaldispense",
66
+ name="dispense_datetime",
67
+ field=models.DateTimeField(default=django.utils.timezone.now),
68
+ ),
69
+ migrations.AlterField(
70
+ model_name="historicaldispenseitem",
71
+ name="dispense_item_datetime",
72
+ field=models.DateTimeField(default=django.utils.timezone.now),
73
+ ),
74
+ migrations.AlterField(
75
+ model_name="historicalreceive",
76
+ name="receive_datetime",
77
+ field=models.DateTimeField(default=django.utils.timezone.now),
78
+ ),
79
+ migrations.AlterField(
80
+ model_name="historicalreceiveitem",
81
+ name="receive_item_datetime",
82
+ field=models.DateTimeField(default=django.utils.timezone.now),
83
+ ),
84
+ migrations.AlterField(
85
+ model_name="historicalrepackrequest",
86
+ name="repack_datetime",
87
+ field=models.DateTimeField(default=django.utils.timezone.now),
88
+ ),
89
+ migrations.AlterField(
90
+ model_name="historicalrx",
91
+ name="report_datetime",
92
+ field=models.DateTimeField(default=django.utils.timezone.now),
93
+ ),
94
+ migrations.AlterField(
95
+ model_name="historicalrx",
96
+ name="rx_date",
97
+ field=models.DateField(
98
+ default=django.utils.timezone.now, verbose_name="Date RX written"
99
+ ),
100
+ ),
101
+ migrations.AlterField(
102
+ model_name="historicalstock",
103
+ name="stock_datetime",
104
+ field=models.DateTimeField(
105
+ default=django.utils.timezone.now, help_text="date stock record created"
106
+ ),
107
+ ),
108
+ migrations.AlterField(
109
+ model_name="historicalstockadjustment",
110
+ name="adjustment_datetime",
111
+ field=models.DateTimeField(default=django.utils.timezone.now),
112
+ ),
113
+ migrations.AlterField(
114
+ model_name="historicalstockrequest",
115
+ name="request_datetime",
116
+ field=models.DateTimeField(default=django.utils.timezone.now),
117
+ ),
118
+ migrations.AlterField(
119
+ model_name="historicalstockrequestitem",
120
+ name="request_item_datetime",
121
+ field=models.DateTimeField(default=django.utils.timezone.now),
122
+ ),
123
+ migrations.AlterField(
124
+ model_name="historicalstocktransfer",
125
+ name="transfer_datetime",
126
+ field=models.DateTimeField(default=django.utils.timezone.now),
127
+ ),
128
+ migrations.AlterField(
129
+ model_name="historicalstocktransferitem",
130
+ name="transfer_item_datetime",
131
+ field=models.DateTimeField(default=django.utils.timezone.now),
132
+ ),
133
+ migrations.AlterField(
134
+ model_name="historicalstoragebin",
135
+ name="bin_datetime",
136
+ field=models.DateTimeField(default=django.utils.timezone.now),
137
+ ),
138
+ migrations.AlterField(
139
+ model_name="historicalstoragebinitem",
140
+ name="item_datetime",
141
+ field=models.DateTimeField(default=django.utils.timezone.now),
142
+ ),
143
+ migrations.AlterField(
144
+ model_name="historicalsupplier",
145
+ name="supplier_datetime",
146
+ field=models.DateTimeField(default=django.utils.timezone.now),
147
+ ),
148
+ migrations.AlterField(
149
+ model_name="receive",
150
+ name="receive_datetime",
151
+ field=models.DateTimeField(default=django.utils.timezone.now),
152
+ ),
153
+ migrations.AlterField(
154
+ model_name="receiveitem",
155
+ name="receive_item_datetime",
156
+ field=models.DateTimeField(default=django.utils.timezone.now),
157
+ ),
158
+ migrations.AlterField(
159
+ model_name="repackrequest",
160
+ name="repack_datetime",
161
+ field=models.DateTimeField(default=django.utils.timezone.now),
162
+ ),
163
+ migrations.AlterField(
164
+ model_name="rx",
165
+ name="report_datetime",
166
+ field=models.DateTimeField(default=django.utils.timezone.now),
167
+ ),
168
+ migrations.AlterField(
169
+ model_name="rx",
170
+ name="rx_date",
171
+ field=models.DateField(
172
+ default=django.utils.timezone.now, verbose_name="Date RX written"
173
+ ),
174
+ ),
175
+ migrations.AlterField(
176
+ model_name="stock",
177
+ name="stock_datetime",
178
+ field=models.DateTimeField(
179
+ default=django.utils.timezone.now, help_text="date stock record created"
180
+ ),
181
+ ),
182
+ migrations.AlterField(
183
+ model_name="stockadjustment",
184
+ name="adjustment_datetime",
185
+ field=models.DateTimeField(default=django.utils.timezone.now),
186
+ ),
187
+ migrations.AlterField(
188
+ model_name="stockavailability",
189
+ name="created",
190
+ field=models.DateTimeField(default=django.utils.timezone.now),
191
+ ),
192
+ migrations.AlterField(
193
+ model_name="stockrequest",
194
+ name="request_datetime",
195
+ field=models.DateTimeField(default=django.utils.timezone.now),
196
+ ),
197
+ migrations.AlterField(
198
+ model_name="stockrequestitem",
199
+ name="request_item_datetime",
200
+ field=models.DateTimeField(default=django.utils.timezone.now),
201
+ ),
202
+ migrations.AlterField(
203
+ model_name="stocktransfer",
204
+ name="transfer_datetime",
205
+ field=models.DateTimeField(default=django.utils.timezone.now),
206
+ ),
207
+ migrations.AlterField(
208
+ model_name="stocktransferitem",
209
+ name="transfer_item_datetime",
210
+ field=models.DateTimeField(default=django.utils.timezone.now),
211
+ ),
212
+ migrations.AlterField(
213
+ model_name="storagebin",
214
+ name="bin_datetime",
215
+ field=models.DateTimeField(default=django.utils.timezone.now),
216
+ ),
217
+ migrations.AlterField(
218
+ model_name="storagebinitem",
219
+ name="item_datetime",
220
+ field=models.DateTimeField(default=django.utils.timezone.now),
221
+ ),
222
+ migrations.AlterField(
223
+ model_name="supplier",
224
+ name="supplier_datetime",
225
+ field=models.DateTimeField(default=django.utils.timezone.now),
226
+ ),
227
+ ]
@@ -53,7 +53,7 @@ class StudyMedicationRefillModelMixin(models.Model):
53
53
 
54
54
  stock_codes = models.TextField(
55
55
  max_length=30,
56
- null=True,
56
+ default="",
57
57
  blank=True,
58
58
  validators=[
59
59
  RegexValidator(
@@ -65,7 +65,7 @@ class StudyMedicationRefillModelMixin(models.Model):
65
65
  help_text="Enter the medication bottle barcode or barcodes. Type one code per line",
66
66
  )
67
67
 
68
- special_instructions = models.TextField(null=True, blank=True)
68
+ special_instructions = models.TextField(blank=True, default="")
69
69
 
70
70
  class Meta:
71
71
  verbose_name = "Study Medication"
@@ -61,18 +61,17 @@ class Formulation(BaseUuidModel):
61
61
  def save(self, *args, **kwargs):
62
62
  self.description = self.get_description()
63
63
  if not self.imp:
64
- self.imp_description = None
64
+ self.imp_description = ""
65
65
  else:
66
66
  self.imp_description = (
67
67
  self.imp_description if self.imp_description else self.description
68
68
  )
69
69
  super().save(*args, **kwargs)
70
70
 
71
- def get_description(self):
71
+ def get_description(self) -> str:
72
72
  return (
73
73
  f"{self.medication} {round_half_away_from_zero(self.strength, 0)}"
74
74
  f"{self.get_units_display()} "
75
- # f"{self.get_formulation_type_display()} "
76
75
  f"{self.get_route_display()}"
77
76
  )
78
77
 
@@ -80,7 +79,6 @@ class Formulation(BaseUuidModel):
80
79
  return (
81
80
  f"{self.medication} {round_half_away_from_zero(self.strength, 0)}"
82
81
  f"{self.get_units_display()} "
83
- # f"{self.get_formulation_type_display()} "
84
82
  )
85
83
 
86
84
  def get_description_with_assignment(self, assignment: Assignment) -> str:
@@ -103,9 +101,9 @@ class Formulation(BaseUuidModel):
103
101
  class Meta(BaseUuidModel.Meta):
104
102
  verbose_name = "Formulation"
105
103
  verbose_name_plural = "Formulations"
106
- constraints = [
104
+ constraints = (
107
105
  UniqueConstraint(
108
106
  fields=["medication", "strength", "units", "formulation_type"],
109
107
  name="%(app_label)s_%(class)s_med_stren_uniq",
110
- )
111
- ]
108
+ ),
109
+ )
@@ -37,9 +37,9 @@ class Medication(BaseUuidModel):
37
37
  class Meta(BaseUuidModel.Meta):
38
38
  verbose_name = "Medication"
39
39
  verbose_name_plural = "Medications"
40
- constraints = [
40
+ constraints = (
41
41
  UniqueConstraint(
42
42
  fields=["name", "display_name"],
43
43
  name="%(app_label)s_%(class)s_name_uniq",
44
- )
45
- ]
44
+ ),
45
+ )
@@ -2,31 +2,30 @@ from django.db import models
2
2
 
3
3
 
4
4
  class AddressModelMixin(models.Model):
5
+ address_one = models.CharField(max_length=255, default="", blank=True)
5
6
 
6
- address_one = models.CharField(max_length=255, null=True, blank=True)
7
+ address_two = models.CharField(max_length=255, default="", blank=True)
7
8
 
8
- address_two = models.CharField(max_length=255, null=True, blank=True)
9
+ city = models.CharField(max_length=255, default="", blank=True)
9
10
 
10
- city = models.CharField(max_length=255, null=True, blank=True)
11
+ postal_code = models.CharField(max_length=255, default="", blank=True)
11
12
 
12
- postal_code = models.CharField(max_length=255, null=True, blank=True)
13
+ state = models.CharField(max_length=255, default="", blank=True)
13
14
 
14
- state = models.CharField(max_length=255, null=True, blank=True)
15
-
16
- country = models.CharField(max_length=255, null=True, blank=True)
15
+ country = models.CharField(max_length=255, default="", blank=True)
17
16
 
18
17
  class Meta:
19
18
  abstract = True
20
19
 
21
20
 
22
21
  class ContactModelMixin(models.Model):
23
- email = models.EmailField(null=True, blank=True)
22
+ email = models.EmailField(default="", blank=True)
24
23
 
25
- email_alternative = models.EmailField(null=True, blank=True)
24
+ email_alternative = models.EmailField(default="", blank=True)
26
25
 
27
- telephone = models.CharField(max_length=15, null=True, blank=True)
26
+ telephone = models.CharField(max_length=15, default="", blank=True)
28
27
 
29
- telephone_alternative = models.CharField(max_length=15, null=True, blank=True)
28
+ telephone_alternative = models.CharField(max_length=15, default="", blank=True)
30
29
 
31
30
  class Meta:
32
31
  abstract = True
@@ -3,6 +3,7 @@ from uuid import uuid4
3
3
  from django.core.exceptions import ObjectDoesNotExist
4
4
  from django.db import models
5
5
  from django.db.models import PROTECT, Index
6
+ from django.utils import timezone
6
7
 
7
8
  from edc_action_item.models import ActionModelMixin
8
9
  from edc_constants.constants import NEW
@@ -12,7 +13,7 @@ from edc_randomization.site_randomizers import site_randomizers
12
13
  from edc_registration.models import RegisteredSubject
13
14
  from edc_sites.managers import CurrentSiteManager
14
15
  from edc_sites.model_mixins import SiteModelMixin
15
- from edc_utils import formatted_age, get_utcnow
16
+ from edc_utils import formatted_age
16
17
 
17
18
  from ...choices import PRESCRIPTION_STATUS
18
19
  from ...constants import PRESCRIPTION_ACTION
@@ -54,9 +55,9 @@ class Rx(
54
55
  blank=False,
55
56
  )
56
57
 
57
- report_datetime = models.DateTimeField(default=get_utcnow)
58
+ report_datetime = models.DateTimeField(default=timezone.now)
58
59
 
59
- rx_date = models.DateField(verbose_name="Date RX written", default=get_utcnow)
60
+ rx_date = models.DateField(verbose_name="Date RX written", default=timezone.now)
60
61
 
61
62
  rx_expiration_date = models.DateField(
62
63
  verbose_name="Date RX expires",
@@ -75,17 +76,17 @@ class Rx(
75
76
  help_text="Number of times this prescription may be refilled",
76
77
  )
77
78
 
78
- rando_sid = models.CharField(max_length=25, null=True, blank=True)
79
+ rando_sid = models.CharField(max_length=25, default="", blank=True)
79
80
 
80
- randomizer_name = models.CharField(max_length=25, null=True, blank=True)
81
+ randomizer_name = models.CharField(max_length=25, default="", blank=True)
81
82
 
82
83
  weight_in_kgs = models.DecimalField(max_digits=6, decimal_places=1, null=True, blank=True)
83
84
 
84
- clinician_initials = models.CharField(max_length=3, null=True)
85
+ clinician_initials = models.CharField(max_length=3, default="")
85
86
 
86
87
  notes = models.TextField(
87
88
  max_length=250,
88
- null=True,
89
+ default="",
89
90
  blank=True,
90
91
  help_text="Private notes for pharmacist only",
91
92
  )
@@ -112,18 +113,18 @@ class Rx(
112
113
  .objects.get(subject_identifier=self.subject_identifier)
113
114
  .sid
114
115
  )
115
- except ObjectDoesNotExist:
116
+ except ObjectDoesNotExist as e:
116
117
  raise PrescriptionError(
117
118
  "Unable to create prescription. Subject has not been "
118
119
  f"randomized (randomizer={self.randomizer_name}"
119
- )
120
+ ) from e
120
121
  super().save(*args, **kwargs)
121
122
 
122
123
  def description(self):
123
124
  return (
124
125
  f"{','.join([o.display_name for o in self.medications.all()])} "
125
126
  f"{self.registered_subject.subject_identifier} {self.registered_subject.initials} "
126
- f"{formatted_age(born=self.registered_subject.dob, reference_dt=get_utcnow())} "
127
+ f"{formatted_age(born=self.registered_subject.dob, reference_dt=timezone.now())} "
127
128
  f"{self.registered_subject.gender} "
128
129
  f"Written: {self.rx_date}"
129
130
  )
@@ -134,11 +135,11 @@ class Rx(
134
135
  obj = randomizer.model_cls().objects.get(
135
136
  subject_identifier=self.subject_identifier
136
137
  )
137
- except ObjectDoesNotExist:
138
+ except ObjectDoesNotExist as e:
138
139
  raise PrescriptionError(
139
140
  "Unable to create prescription. Subject has not been "
140
141
  f"randomized (randomizer={self.randomizer_name}"
141
- )
142
+ ) from e
142
143
  return Assignment.objects.get(name=obj.assignment)
143
144
 
144
145
  class Meta(BaseUuidModel.Meta):
@@ -57,7 +57,6 @@ class RxRefill(
57
57
 
58
58
  refill_start_datetime = models.DateTimeField(
59
59
  verbose_name="Refill start date/time",
60
- # default=get_utcnow,
61
60
  help_text="Starting date for this refill",
62
61
  )
63
62
 
@@ -1,10 +1,10 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
  from sequences import get_next_value
3
4
 
4
5
  from edc_model.models import BaseUuidModel, HistoricalRecords
5
6
  from edc_randomization.site_randomizers import site_randomizers
6
7
  from edc_registration.models import RegisteredSubject
7
- from edc_utils import get_utcnow
8
8
 
9
9
  from ...exceptions import AllocationError
10
10
  from .. import Assignment, Rx
@@ -28,7 +28,7 @@ class Allocation(BaseUuidModel):
28
28
  help_text="A sequential unique identifier set by the EDC",
29
29
  )
30
30
 
31
- allocation_datetime = models.DateTimeField(default=get_utcnow)
31
+ allocation_datetime = models.DateTimeField(default=timezone.now)
32
32
 
33
33
  registered_subject = models.ForeignKey(
34
34
  RegisteredSubject,
@@ -48,7 +48,7 @@ class Allocation(BaseUuidModel):
48
48
  blank=False,
49
49
  )
50
50
 
51
- allocated_by = models.CharField(max_length=50, null=True, blank=True)
51
+ allocated_by = models.CharField(max_length=50, default="", blank=True)
52
52
 
53
53
  objects = Manager()
54
54
 
@@ -1,8 +1,8 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
  from sequences import get_next_value
3
4
 
4
5
  from edc_model.models import BaseUuidModel, HistoricalRecords
5
- from edc_utils import get_utcnow
6
6
 
7
7
 
8
8
  class Manager(models.Manager):
@@ -32,9 +32,9 @@ class Confirmation(BaseUuidModel):
32
32
  null=True,
33
33
  )
34
34
 
35
- confirmed_datetime = models.DateTimeField(default=get_utcnow)
35
+ confirmed_datetime = models.DateTimeField(default=timezone.now)
36
36
 
37
- confirmed_by = models.CharField(max_length=100, null=True, blank=True)
37
+ confirmed_by = models.CharField(max_length=100, default="", blank=True)
38
38
 
39
39
  objects = Manager()
40
40
 
@@ -1,9 +1,9 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
  from sequences import get_next_value
3
4
 
4
5
  from edc_model.models import BaseUuidModel, HistoricalRecords
5
6
  from edc_sites.model_mixins import SiteModelMixin
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from ...exceptions import StockTransferConfirmationError
9
9
  from .location import Location
@@ -19,10 +19,11 @@ class ConfirmationAtSite(SiteModelMixin, BaseUuidModel):
19
19
  max_length=36,
20
20
  unique=True,
21
21
  blank=True,
22
+ null=True,
22
23
  help_text="A sequential unique identifier set by the EDC",
23
24
  )
24
25
 
25
- transfer_confirmation_datetime = models.DateTimeField(default=get_utcnow)
26
+ transfer_confirmation_datetime = models.DateTimeField(default=timezone.now)
26
27
 
27
28
  stock_transfer = models.OneToOneField(StockTransfer, on_delete=models.PROTECT)
28
29
 
@@ -1,9 +1,9 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
  from sequences import get_next_value
3
4
 
4
5
  from edc_model.models import BaseUuidModel, HistoricalRecords
5
6
  from edc_sites.model_mixins import SiteModelMixin
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from ...exceptions import ConfirmAtSiteError
9
9
  from .confirmation_at_site import ConfirmationAtSite
@@ -15,7 +15,6 @@ class Manager(models.Manager):
15
15
 
16
16
 
17
17
  class ConfirmationAtSiteItem(SiteModelMixin, BaseUuidModel):
18
-
19
18
  confirmation_at_site = models.ForeignKey(ConfirmationAtSite, on_delete=models.PROTECT)
20
19
 
21
20
  transfer_confirmation_item_identifier = models.CharField(
@@ -26,13 +25,13 @@ class ConfirmationAtSiteItem(SiteModelMixin, BaseUuidModel):
26
25
  help_text="A sequential unique identifier set by the EDC",
27
26
  )
28
27
 
29
- transfer_confirmation_item_datetime = models.DateTimeField(default=get_utcnow)
28
+ transfer_confirmation_item_datetime = models.DateTimeField(default=timezone.now)
30
29
 
31
30
  stock = models.OneToOneField(Stock, on_delete=models.PROTECT)
32
31
 
33
32
  confirmed_datetime = models.DateTimeField(null=True, blank=True)
34
33
 
35
- confirmed_by = models.CharField(max_length=150, null=True, blank=True)
34
+ confirmed_by = models.CharField(max_length=150, default="", blank=True)
36
35
 
37
36
  objects = Manager()
38
37
 
@@ -1,9 +1,9 @@
1
1
  from django.db import models
2
+ from django.utils import timezone
2
3
  from sequences import get_next_value
3
4
 
4
5
  from edc_model.models import BaseUuidModel, HistoricalRecords
5
6
  from edc_sites.model_mixins import SiteModelMixin
6
- from edc_utils import get_utcnow
7
7
 
8
8
  from ..prescription import Rx
9
9
  from .location import Location
@@ -14,7 +14,6 @@ class Manager(models.Manager):
14
14
 
15
15
 
16
16
  class Dispense(SiteModelMixin, BaseUuidModel):
17
-
18
17
  dispense_identifier = models.CharField(
19
18
  max_length=36,
20
19
  unique=True,
@@ -23,9 +22,9 @@ class Dispense(SiteModelMixin, BaseUuidModel):
23
22
  help_text="A sequential unique identifier set by the EDC",
24
23
  )
25
24
 
26
- dispense_datetime = models.DateTimeField(default=get_utcnow)
25
+ dispense_datetime = models.DateTimeField(default=timezone.now)
27
26
 
28
- dispensed_by = models.CharField(max_length=100, null=True, blank=True)
27
+ dispensed_by = models.CharField(max_length=100, default="", blank=True)
29
28
 
30
29
  rx = models.ForeignKey(Rx, on_delete=models.PROTECT, null=True, blank=False)
31
30
 
@@ -36,8 +35,8 @@ class Dispense(SiteModelMixin, BaseUuidModel):
36
35
 
37
36
  to_subject = models.BooleanField(default=False)
38
37
  to_subject_datetime = models.DateTimeField(null=True, blank=True)
39
- crf_label_lower = models.CharField(max_length=100, null=True, blank=True)
40
- crf_field_name = models.CharField(max_length=100, null=True, blank=True)
38
+ crf_label_lower = models.CharField(max_length=100, default="", blank=True)
39
+ crf_field_name = models.CharField(max_length=100, default="", blank=True)
41
40
  crf_id = models.UUIDField(null=True, blank=True)
42
41
 
43
42
  objects = Manager()
@@ -1,9 +1,9 @@
1
+ import django.utils.timezone
1
2
  from django.db import models
2
3
  from sequences import get_next_value
3
4
 
4
5
  from edc_model.models import BaseUuidModel, HistoricalRecords
5
6
  from edc_sites.model_mixins import SiteModelMixin
6
- from edc_utils import get_utcnow
7
7
  from edc_visit_schedule.model_mixins import VisitCodeFieldsModelMixin
8
8
 
9
9
  from .dispense import Dispense
@@ -25,7 +25,7 @@ class DispenseItem(SiteModelMixin, VisitCodeFieldsModelMixin, BaseUuidModel):
25
25
  help_text="A sequential unique identifier set by the EDC",
26
26
  )
27
27
 
28
- dispense_item_datetime = models.DateTimeField(default=get_utcnow)
28
+ dispense_item_datetime = models.DateTimeField(default=django.utils.timezone.now)
29
29
 
30
30
  dispense = models.ForeignKey(
31
31
  Dispense,
@@ -11,7 +11,6 @@ class Manager(models.Manager):
11
11
 
12
12
 
13
13
  class Location(ListModelMixin, BaseUuidModel):
14
-
15
14
  display_name = models.CharField(
16
15
  verbose_name="Name",
17
16
  max_length=250,
@@ -23,14 +22,14 @@ class Location(ListModelMixin, BaseUuidModel):
23
22
 
24
23
  site = models.ForeignKey(Site, on_delete=models.PROTECT, null=True, blank=True)
25
24
 
26
- contact_name = models.CharField(max_length=150, null=True, blank=True)
25
+ contact_name = models.CharField(max_length=150, default="", blank=True)
27
26
  contact_tel = models.CharField(
28
27
  max_length=150,
29
28
  validators=[RegexValidator("[0-9]{1,15}")],
30
- null=True,
29
+ default="",
31
30
  blank=True,
32
31
  )
33
- contact_email = models.EmailField(max_length=150, null=True, blank=True)
32
+ contact_email = models.EmailField(max_length=150, default="", blank=True)
34
33
 
35
34
  objects = Manager()
36
35
 
@@ -14,8 +14,7 @@ class Manager(models.Manager):
14
14
 
15
15
 
16
16
  class Lot(BaseUuidModel):
17
-
18
- lot_identifier = models.CharField(
17
+ lot_identifier = models.CharField( # noqa: DJ001
19
18
  max_length=25,
20
19
  unique=True,
21
20
  null=True,
@@ -35,15 +34,15 @@ class Lot(BaseUuidModel):
35
34
 
36
35
  expiration_date = models.DateField()
37
36
 
38
- manufactured_by = models.CharField(max_length=50, null=True, blank=True)
37
+ manufactured_by = models.CharField(max_length=50, default="", blank=True)
39
38
 
40
- country_of_origin = models.CharField(max_length=50, null=True, blank=True)
39
+ country_of_origin = models.CharField(max_length=50, default="", blank=True)
41
40
 
42
- storage_conditions = models.CharField(max_length=50, null=True, blank=True)
41
+ storage_conditions = models.CharField(max_length=50, default="", blank=True)
43
42
 
44
- reference = models.CharField(max_length=50, null=True, blank=True)
43
+ reference = models.CharField(max_length=50, default="", blank=True)
45
44
 
46
- comment = models.CharField(max_length=250, null=True, blank=True)
45
+ comment = models.CharField(max_length=250, default="", blank=True)
47
46
 
48
47
  objects = Manager()
49
48