clinicedc 2.0.6__py3-none-any.whl → 2.0.7__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.
- {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/METADATA +2 -2
- {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/RECORD +386 -335
- edc_action_item/action.py +1 -1
- edc_action_item/action_item_notification.py +2 -2
- edc_action_item/create_action_item.py +1 -1
- edc_action_item/decorators.py +1 -1
- edc_action_item/migrations/0001_initial.py +21 -22
- edc_action_item/migrations/0006_auto_20180707_1659.py +4 -4
- edc_action_item/migrations/0008_auto_20180809_0303.py +4 -4
- edc_action_item/migrations/0015_auto_20190114_0250.py +4 -4
- edc_action_item/migrations/0017_auto_20190305_0123.py +11 -30
- edc_action_item/migrations/0030_edcpermissions.py +3 -2
- edc_action_item/migrations/0039_alter_actionitem_auto_created_comment_and_more.py +398 -0
- edc_action_item/migrations/0040_alter_actionitem_report_datetime_and_more.py +34 -0
- edc_action_item/models/action_item.py +9 -4
- edc_action_item/models/action_model_mixin.py +4 -4
- edc_action_item/models/reference.py +2 -2
- edc_action_item/post_migrate_signals.py +1 -1
- edc_action_item/send_email.py +0 -85
- edc_adherence/migrations/0005_alter_nonadherencereasons_extra_value_and_more.py +36 -0
- edc_adherence/model_mixins.py +1 -1
- edc_adverse_event/migrations/0001_initial.py +5 -4
- edc_adverse_event/migrations/0002_auto_20190802_0059.py +3 -2
- edc_adverse_event/migrations/0008_auto_20220825_0451.py +3 -2
- edc_adverse_event/migrations/0009_auto_20220907_0157.py +3 -2
- edc_adverse_event/migrations/0016_alter_aeactionclassification_device_created_and_more.py +285 -0
- edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +2 -2
- edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +6 -5
- edc_adverse_event/model_mixins/ae_special_interest/aesi_fields_model_mixin.py +2 -2
- edc_adverse_event/model_mixins/ae_susar/ae_susar_fields_model_mixin.py +2 -2
- edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +15 -11
- edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +5 -4
- edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +6 -3
- edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +2 -2
- edc_adverse_event/model_mixins/hospitaization/hospitalization_model_mixin.py +4 -3
- edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +3 -3
- edc_adverse_event/models/signals.py +7 -7
- edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -4
- edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +3 -5
- edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +6 -8
- edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -2
- edc_adverse_event/views/tmg/summary_listboard_view.py +3 -2
- edc_appointment/admin/appointment_admin.py +2 -2
- edc_appointment/admin/list_filters.py +2 -2
- edc_appointment/form_validators/appointment_form_validator.py +108 -82
- edc_appointment/migrations/0003_auto_20161127_2226.py +5 -6
- edc_appointment/migrations/0006_auto_20170106_2118.py +5 -5
- edc_appointment/migrations/0018_auto_20190305_0123.py +5 -12
- edc_appointment/migrations/0050_alter_appointment_appt_type_and_more.py +220 -0
- edc_appointment/model_mixins/appointment_fields_model_mixin.py +1 -2
- edc_appointment/model_mixins/window_period_model_mixin.py +6 -7
- edc_appointment/models/signals.py +44 -35
- edc_appointment/view_utils/appointment_button.py +2 -2
- edc_auth/admin/user_admin.py +1 -1
- edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +5 -5
- edc_auth/migrations/0012_auto_20191026_0034.py +3 -2
- edc_auth/migrations/0013_auto_20191026_0055.py +3 -2
- edc_auth/migrations/0025_permissions.py +3 -2
- edc_auth/migrations/0035_alter_edcpermissions_device_created_and_more.py +85 -0
- edc_auth/post_migrate_signals.py +1 -1
- edc_consent/actions.py +4 -5
- edc_consent/migrations/0001_initial.py +3 -2
- edc_consent/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_consent/model_mixins/consent_extension_model_mixin.py +4 -5
- edc_consent/model_mixins/requires_consent_fields_model_mixin.py +2 -2
- edc_consent/utils.py +1 -1
- edc_crf/migrations/0001_initial.py +3 -2
- edc_crf/migrations/0009_alter_crfstatus_device_created_and_more.py +54 -0
- edc_dashboard/migrations/0001_initial.py +3 -2
- edc_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_dashboard/templatetags/edc_dashboard_extras.py +3 -2
- edc_data_manager/action_items.py +4 -6
- edc_data_manager/admin/actions.py +5 -5
- edc_data_manager/handlers/handlers.py +6 -7
- edc_data_manager/migrations/0001_initial.py +19 -19
- edc_data_manager/migrations/0025_edcpermissions.py +3 -2
- edc_data_manager/migrations/0040_alter_datadictionary_device_created_and_more.py +327 -0
- edc_data_manager/migrations/0041_alter_dataquery_dm_user_and_more.py +164 -0
- edc_data_manager/models/data_query.py +5 -5
- edc_data_manager/models/model_mixins.py +8 -8
- edc_data_manager/rule/rule_runner.py +4 -3
- edc_document_status/model_mixins.py +1 -1
- edc_egfr/egfr.py +11 -7
- edc_egfr/model_mixins/egfr_model_mixin.py +3 -7
- edc_export/admin/data_request_admin.py +2 -2
- edc_export/archive_exporter.py +4 -3
- edc_export/files_archiver.py +3 -2
- edc_export/migrations/0001_initial.py +26 -26
- edc_export/migrations/0004_auto_20190305_0123.py +25 -72
- edc_export/migrations/0013_edcpermissions.py +3 -2
- edc_export/migrations/0022_alter_datarequest_description_and_more.py +611 -0
- edc_export/migrations/0023_alter_datarequesthistory_archive_filename_and_more.py +29 -0
- edc_export/model_exporter/file_history_updater.py +10 -10
- edc_export/model_exporter/model_exporter.py +13 -14
- edc_export/model_exporter/object_history_helpers.py +2 -2
- edc_export/models/data_request_history.py +4 -4
- edc_export/utils.py +10 -15
- edc_facility/facility.py +10 -15
- edc_facility/import_holidays.py +13 -13
- edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +8 -7
- edc_facility/migrations/0016_alter_healthfacility_device_created_and_more.py +139 -0
- edc_facility/migrations/0017_alter_healthfacility_gps_and_more.py +54 -0
- edc_facility/model_mixins.py +5 -5
- edc_form_runners/form_runner.py +3 -5
- edc_form_runners/migrations/0001_initial.py +3 -2
- edc_form_runners/migrations/0005_alter_issue_device_created_and_more.py +49 -0
- edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -3
- edc_identifier/migrations/0002_auto_20190305_0123.py +3 -6
- edc_identifier/migrations/0006_auto_20161127_2226.py +15 -15
- edc_identifier/migrations/0007_auto_20161204_2227.py +3 -3
- edc_identifier/migrations/0009_auto_20161221_2323.py +3 -5
- edc_identifier/migrations/0010_auto_20170112_0602.py +17 -17
- edc_identifier/migrations/0011_alter_identifiermodel_device_created_and_more.py +79 -0
- edc_identifier/model_mixins.py +1 -1
- edc_identifier/models.py +9 -9
- edc_identifier/simple_identifier.py +1 -3
- edc_identifier/subject_identifier.py +3 -2
- edc_lab/migrations/0001_initial.py +29 -29
- edc_lab/migrations/0008_auto_20170921_0719.py +3 -3
- edc_lab/migrations/0010_auto_20171127_1541.py +15 -15
- edc_lab/migrations/0012_auto_20180114_1438.py +3 -3
- edc_lab/migrations/0019_auto_20190305_0123.py +43 -127
- edc_lab/migrations/0036_alter_aliquot_comment_alter_aliquot_device_created_and_more.py +1139 -0
- edc_lab/migrations/0037_alter_historicalorder_order_datetime_and_more.py +31 -0
- edc_lab/model_mixins/aliquot/aliquot_identifier_model_mixin.py +2 -2
- edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +2 -2
- edc_lab/model_mixins/panel_model_mixin.py +18 -7
- edc_lab/model_mixins/requisition/crf_with_requisition_model_mixin.py +2 -4
- edc_lab/model_mixins/requisition/requisition_model_mixin.py +7 -8
- edc_lab/model_mixins/requisition/requisition_verify_model_mixin.py +1 -1
- edc_lab/model_mixins/result/result_item_model_mixin.py +4 -4
- edc_lab/model_mixins/shipping/manifest_model_mixin.py +4 -5
- edc_lab/model_mixins/shipping/verify_model_mixin.py +4 -6
- edc_lab/models/box.py +1 -1
- edc_lab/models/box_item.py +6 -7
- edc_lab/models/manifest/manifest.py +1 -1
- edc_lab/models/manifest/manifest_item.py +6 -6
- edc_lab/models/manifest/shipper.py +3 -4
- edc_lab/models/order.py +6 -4
- edc_lab/models/panel.py +4 -4
- edc_lab/models/result.py +2 -2
- edc_lab/models/result_item.py +2 -2
- edc_lab_dashboard/migrations/0001_initial.py +3 -2
- edc_lab_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_lab_dashboard/views/action_views/receive_view.py +2 -2
- edc_lab_dashboard/views/action_views/verify_box_item_view.py +2 -2
- edc_lab_results/model_mixins/blood_result_model_mixin.py +7 -7
- edc_lab_results/model_mixins/fbg_model_mixin.py +3 -3
- edc_lab_results/model_mixins/glucose_model_mixin.py +3 -3
- edc_lab_results/model_mixins/hba1c_model_mixin.py +3 -3
- edc_label/migrations/0001_initial.py +3 -2
- edc_label/migrations/0007_alter_zpllabeltemplates_device_created_and_more.py +49 -0
- edc_list_data/list_model_maker.py +2 -2
- edc_list_data/load_list_data.py +11 -14
- edc_list_data/model_mixins.py +12 -4
- edc_list_data/preload_data.py +3 -3
- edc_listboard/migrations/0001_initial.py +3 -2
- edc_listboard/migrations/0007_alter_listboard_device_created_and_more.py +49 -0
- edc_locator/migrations/0001_initial.py +7 -7
- edc_locator/migrations/0018_auto_20190305_0123.py +5 -12
- edc_locator/migrations/0040_alter_historicalsubjectlocator_action_identifier_and_more.py +187 -0
- edc_locator/migrations/0041_alter_historicalsubjectlocator_report_datetime_and_more.py +27 -0
- edc_locator/model_mixins/locator_model_mixin.py +2 -2
- edc_locator/model_mixins/subject_contact_fields_mixin.py +1 -1
- edc_locator/modeladmin_mixins.py +5 -4
- edc_ltfu/model_mixins.py +7 -5
- edc_metadata/metadata_rules/decorators.py +1 -1
- edc_metadata/migrations/0002_auto_20161127_2226.py +5 -5
- edc_metadata/migrations/0005_auto_20170112_0602.py +5 -5
- edc_metadata/migrations/0011_auto_20190305_0123.py +5 -12
- edc_metadata/migrations/0031_alter_crfmetadata_device_created_and_more.py +120 -0
- edc_metadata/model_mixins/updates/updates_crf_metadata_model_mixin.py +1 -1
- edc_metadata/model_mixins/updates/updates_requisition_metadata_model_mixin.py +1 -1
- edc_metadata/models/crf_metadata.py +5 -5
- edc_metadata/models/crf_metadata_model_mixin.py +4 -5
- edc_metadata/models/requisition_metadata.py +6 -6
- edc_metadata/views/refresh_metadata_actions_view.py +3 -3
- edc_model/models/address_mixin.py +6 -6
- edc_model/models/fields/initials_field.py +2 -1
- edc_model/models/historical_records.py +2 -9
- edc_model/models/url_model_mixin.py +2 -2
- edc_model/validators/date.py +7 -8
- edc_model_admin/list_filters/future_date_list_filter.py +3 -3
- edc_model_admin/list_filters/past_date_list_filter.py +3 -3
- edc_model_admin/mixins/model_admin_protect_pii_mixin.py +4 -5
- edc_model_fields/fields/other_charfield.py +2 -2
- edc_navbar/migrations/0004_auto_20220825_0451.py +3 -2
- edc_navbar/migrations/0009_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_notification/migrations/0001_initial.py +3 -3
- edc_notification/migrations/0004_auto_20190305_0123.py +3 -6
- edc_notification/migrations/0011_alter_notification_device_created_and_more.py +59 -0
- edc_notification/models/notification.py +1 -1
- edc_notification/notification/notification.py +12 -12
- edc_offstudy/migrations/0001_initial.py +4 -4
- edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -4
- edc_offstudy/migrations/0005_auto_20190305_0123.py +5 -12
- edc_offstudy/migrations/0023_alter_historicalsubjectoffstudy_action_identifier_and_more.py +188 -0
- edc_offstudy/migrations/0024_alter_historicalsubjectoffstudy_offstudy_datetime_and_more.py +43 -0
- edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -2
- edc_pdutils/df_exporters/csv_exporter.py +33 -37
- edc_pdutils/df_exporters/csv_model_exporter.py +2 -1
- edc_pdutils/migrations/0001_initial.py +8 -8
- edc_pharmacy/admin/prescription/rx_refill_admin.py +4 -3
- edc_pharmacy/admin/reports/stock_availability_admin.py +5 -6
- edc_pharmacy/migrations/0001_initial.py +64 -63
- edc_pharmacy/migrations/0015_auto_20220913_2139.py +26 -26
- edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +81 -86
- edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +5 -5
- edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -8
- edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +12 -12
- edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +5 -5
- edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +3 -4
- edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +3 -3
- edc_pharmacy/migrations/0057_scanduplicates.py +3 -3
- edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +13 -15
- edc_pharmacy/migrations/0068_stockout.py +2 -3
- edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -5
- edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +3 -4
- edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -8
- edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +0 -2
- edc_pharmacy/migrations/0089_alter_allocation_allocated_by_and_more.py +3284 -0
- edc_pharmacy/migrations/0090_alter_allocation_allocation_datetime_and_more.py +227 -0
- edc_pharmacy/model_mixins/study_medication_refill_model_mixin.py +2 -2
- edc_pharmacy/models/medication/medication.py +3 -3
- edc_pharmacy/models/model_mixins.py +10 -11
- edc_pharmacy/models/prescription/rx.py +13 -12
- edc_pharmacy/models/prescription/rx_refill.py +0 -1
- edc_pharmacy/models/stock/allocation.py +3 -3
- edc_pharmacy/models/stock/confirmation.py +3 -3
- edc_pharmacy/models/stock/confirmation_at_site.py +3 -2
- edc_pharmacy/models/stock/confirmation_at_site_item.py +3 -4
- edc_pharmacy/models/stock/dispense.py +5 -6
- edc_pharmacy/models/stock/dispense_item.py +2 -2
- edc_pharmacy/models/stock/location.py +3 -4
- edc_pharmacy/models/stock/lot.py +6 -7
- edc_pharmacy/models/stock/order.py +1 -1
- edc_pharmacy/models/stock/receive.py +3 -3
- edc_pharmacy/models/stock/receive_item.py +4 -4
- edc_pharmacy/models/stock/repack_request.py +2 -2
- edc_pharmacy/models/stock/stock.py +12 -18
- edc_pharmacy/models/stock/stock_adjustment.py +4 -4
- edc_pharmacy/models/stock/stock_request.py +2 -2
- edc_pharmacy/models/stock/stock_request_item.py +2 -2
- edc_pharmacy/models/stock/stock_transfer.py +3 -3
- edc_pharmacy/models/stock/stock_transfer_item.py +2 -2
- edc_pharmacy/models/stock/storage_bin.py +3 -4
- edc_pharmacy/models/stock/storage_bin_item.py +2 -2
- edc_pharmacy/models/stock/supplier.py +3 -4
- edc_pharmacy/models/storage/box.py +2 -2
- edc_pharmacy/models/storage/items/container_model_mixin.py +3 -4
- edc_pharmacy/models/storage/items/pill_bottle_model_mixin.py +2 -2
- edc_pharmacy/models/storage/items/subject_pill_bottle.py +1 -1
- edc_pharmacy/models/storage/room.py +2 -2
- edc_pharmacy/models/storage/shelf.py +2 -2
- edc_pharmacy/models/storage/utils.py +1 -1
- edc_pharmacy/utils/allocate_stock.py +2 -3
- edc_pharmacy/utils/confirm_stock.py +2 -3
- edc_pharmacy/utils/confirm_stock_at_site.py +3 -4
- edc_pharmacy/utils/dispense.py +3 -4
- edc_pharmacy/utils/process_repack_request.py +4 -5
- edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -3
- edc_pharmacy/utils/transfer_stock.py +2 -3
- edc_pharmacy/views/add_to_storage_bin_view.py +2 -2
- edc_pharmacy/views/allocate_to_subject_view.py +2 -2
- edc_pharmacy/views/dispense_view.py +2 -2
- edc_pharmacy/views/move_to_storage_bin_view.py +2 -3
- edc_pharmacy/views/print_labels_view.py +2 -2
- edc_protocol/research_protocol_config.py +2 -3
- edc_protocol_incident/migrations/0001_initial.py +7 -7
- edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +13 -13
- edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +7 -7
- edc_protocol_incident/migrations/0024_alter_actionsrequired_extra_value_and_more.py +625 -0
- edc_protocol_incident/migrations/0025_alter_historicalprotocoldeviationviolation_report_datetime_and_more.py +42 -0
- edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +18 -11
- edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +26 -11
- edc_pylabels/actions.py +3 -5
- edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +3 -7
- edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +3 -3
- edc_pylabels/migrations/0013_alter_labelconfiguration_device_created_and_more.py +49 -0
- edc_qareports/migrations/0001_initial.py +4 -5
- edc_qareports/migrations/0005_edcpermissions.py +3 -3
- edc_qareports/migrations/0006_qareportlog.py +2 -3
- edc_qareports/migrations/0019_alter_edcpermissions_device_created_and_more.py +102 -0
- edc_qareports/migrations/0020_alter_note_report_datetime_and_more.py +24 -0
- edc_qareports/model_mixins/note_model_mixin.py +7 -4
- edc_qareports/model_mixins/on_study_missing_values_model_mixin.py +4 -4
- edc_qareports/model_mixins/qa_report_model_mixin.py +2 -3
- edc_qareports/models/note.py +4 -4
- edc_qareports/models/qa_reports_log.py +2 -3
- edc_randomization/decorators.py +1 -1
- edc_randomization/migrations/0001_initial.py +3 -2
- edc_randomization/migrations/0002_historicalrandomizationlist.py +3 -2
- edc_randomization/migrations/0009_edcpermissions.py +3 -2
- edc_randomization/migrations/0014_alter_edcpermissions_device_created_and_more.py +141 -0
- edc_randomization/model_mixins.py +9 -9
- edc_randomization/utils.py +2 -2
- edc_refusal/migrations/0001_initial.py +4 -4
- edc_refusal/migrations/0002_historicalsubjectrefusal.py +4 -4
- edc_refusal/migrations/0012_alter_historicalsubjectrefusal_comment_and_more.py +122 -0
- edc_refusal/migrations/0013_alter_historicalsubjectrefusal_report_datetime_and_more.py +28 -0
- edc_refusal/model_mixins.py +3 -3
- edc_registration/migrations/0002_auto_20161127_2226.py +3 -4
- edc_registration/migrations/0005_auto_20170111_1809.py +4 -2
- edc_registration/migrations/0016_historicalregisteredsubject.py +3 -2
- edc_registration/migrations/0017_auto_20190305_0123.py +5 -12
- edc_registration/migrations/0033_alter_historicalregisteredsubject_additional_key_and_more.py +302 -0
- edc_registration/model_mixins/updates_or_creates_registered_subject_model_mixin.py +2 -3
- edc_registration/models/registered_subject.py +27 -26
- edc_reportable/age_evaluator.py +4 -2
- edc_reportable/formula.py +5 -5
- edc_reportable/migrations/0001_initial.py +7 -7
- edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -3
- edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +5 -5
- edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +5 -6
- edc_reportable/migrations/0007_alter_gradingdata_age_phrase_and_more.py +509 -0
- edc_reportable/models/normal_data.py +4 -5
- edc_reportable/models/reference_model_mixins.py +10 -11
- edc_reportable/models/reference_range_collection.py +12 -13
- edc_reportable/post_migrate_signals.py +1 -1
- edc_reportable/utils/convert_units.py +11 -45
- edc_reportable/utils/get_normal_data_or_raise.py +2 -2
- edc_reportable/utils/load_data.py +4 -4
- edc_reportable/utils/update_grading_data.py +5 -5
- edc_review_dashboard/migrations/0001_initial.py +3 -2
- edc_review_dashboard/migrations/0006_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_screening/age_evaluator.py +3 -3
- edc_screening/migrations/0001_initial.py +3 -2
- edc_screening/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_screening/model_mixins/eligibility_model_mixin.py +3 -4
- edc_screening/model_mixins/screening_fields_model_mixin.py +6 -8
- edc_search/model_mixins.py +2 -3
- edc_search/search_slug.py +9 -8
- edc_search/updater.py +2 -2
- edc_sites/migrations/0007_edcpermissions.py +3 -2
- edc_sites/migrations/0010_alter_edcpermissions_device_created_and_more.py +69 -0
- edc_sites/model_mixins/site_model_mixin.py +2 -2
- edc_sites/site.py +5 -5
- edc_sites/system_checks.py +1 -1
- edc_subject_dashboard/migrations/0001_initial.py +3 -2
- edc_subject_dashboard/migrations/0005_alter_edcpermissions_device_created_and_more.py +49 -0
- edc_subject_dashboard/requisition_report.py +6 -4
- edc_subject_dashboard/requisition_verifier.py +6 -6
- edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -2
- edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +7 -8
- edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +3 -2
- edc_subject_dashboard/view_utils/timepoint_status_button.py +2 -2
- edc_timepoint/model_mixins.py +22 -20
- edc_transfer/model_mixins.py +4 -4
- edc_transfer/modeladmin_mixins.py +1 -1
- edc_unblinding/migrations/0001_initial.py +13 -13
- edc_unblinding/migrations/0014_alter_historicalunblindingrequest_action_identifier_and_more.py +291 -0
- edc_unblinding/migrations/0015_alter_historicalunblindingrequest_report_datetime_and_more.py +45 -0
- edc_unblinding/models/unblinding_request.py +2 -2
- edc_unblinding/models/unblinding_review.py +3 -3
- edc_utils/age.py +10 -16
- edc_visit_schedule/migrations/0001_initial.py +3 -3
- edc_visit_schedule/migrations/0002_auto_20190305_0123.py +3 -6
- edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +5 -4
- edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +10 -10
- edc_visit_schedule/migrations/0019_alter_historicalonschedule_device_created_and_more.py +229 -0
- edc_visit_schedule/migrations/0020_alter_historicalonschedule_onschedule_datetime_and_more.py +65 -0
- edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +5 -4
- edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +5 -4
- edc_visit_schedule/model_mixins/visit_schedule/visit_code_fields_model_mixin.py +1 -1
- edc_visit_schedule/models/subject_schedule_history.py +6 -6
- edc_visit_schedule/schedule/visit_collection.py +1 -1
- edc_visit_schedule/subject_schedule.py +5 -4
- edc_visit_schedule/view_mixins.py +2 -3
- edc_visit_schedule/visit/visit.py +3 -2
- edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +13 -13
- edc_visit_tracking/migrations/0009_alter_historicalsubjectvisit_comments_and_more.py +450 -0
- edc_visit_tracking/migrations/0010_alter_historicalsubjectvisit_report_datetime_and_more.py +68 -0
- edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +3 -3
- edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +2 -2
- edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +2 -2
- edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +2 -2
- edc_visit_tracking/model_mixins/visit_model_mixin/caretaker_fields_mixin.py +2 -3
- edc_visit_tracking/model_mixins/visit_model_mixin/previous_visit_model_mixin.py +1 -1
- edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +8 -11
- edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_mixin.py +1 -1
- edc_visit_tracking/models/signals.py +1 -1
- edc_visit_tracking/models/subject_visit.py +1 -1
- edc_vitals/calculators/bmi.py +7 -5
- edc_vitals/utils.py +1 -1
- {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/WHEEL +0 -0
- {clinicedc-2.0.6.dist-info → clinicedc-2.0.7.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Generated by Django 5.2.6 on 2025-09-17 16:53
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
("edc_visit_schedule", "0018_alter_historicalonschedule_revision_and_more"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterField(
|
|
14
|
+
model_name="historicalonschedule",
|
|
15
|
+
name="device_created",
|
|
16
|
+
field=models.CharField(
|
|
17
|
+
blank=True, default="", max_length=10, verbose_name="Device created"
|
|
18
|
+
),
|
|
19
|
+
),
|
|
20
|
+
migrations.AlterField(
|
|
21
|
+
model_name="historicalonschedule",
|
|
22
|
+
name="device_modified",
|
|
23
|
+
field=models.CharField(
|
|
24
|
+
blank=True, default="", max_length=10, verbose_name="Device modified"
|
|
25
|
+
),
|
|
26
|
+
),
|
|
27
|
+
migrations.AlterField(
|
|
28
|
+
model_name="historicalonschedule",
|
|
29
|
+
name="locale_created",
|
|
30
|
+
field=models.CharField(
|
|
31
|
+
blank=True,
|
|
32
|
+
default="",
|
|
33
|
+
help_text="Auto-updated by Modeladmin",
|
|
34
|
+
max_length=10,
|
|
35
|
+
verbose_name="Locale created",
|
|
36
|
+
),
|
|
37
|
+
),
|
|
38
|
+
migrations.AlterField(
|
|
39
|
+
model_name="historicalonschedule",
|
|
40
|
+
name="locale_modified",
|
|
41
|
+
field=models.CharField(
|
|
42
|
+
blank=True,
|
|
43
|
+
default="",
|
|
44
|
+
help_text="Auto-updated by Modeladmin",
|
|
45
|
+
max_length=10,
|
|
46
|
+
verbose_name="Locale modified",
|
|
47
|
+
),
|
|
48
|
+
),
|
|
49
|
+
migrations.AlterField(
|
|
50
|
+
model_name="historicalvisitschedule",
|
|
51
|
+
name="device_created",
|
|
52
|
+
field=models.CharField(
|
|
53
|
+
blank=True, default="", max_length=10, verbose_name="Device created"
|
|
54
|
+
),
|
|
55
|
+
),
|
|
56
|
+
migrations.AlterField(
|
|
57
|
+
model_name="historicalvisitschedule",
|
|
58
|
+
name="device_modified",
|
|
59
|
+
field=models.CharField(
|
|
60
|
+
blank=True, default="", max_length=10, verbose_name="Device modified"
|
|
61
|
+
),
|
|
62
|
+
),
|
|
63
|
+
migrations.AlterField(
|
|
64
|
+
model_name="historicalvisitschedule",
|
|
65
|
+
name="locale_created",
|
|
66
|
+
field=models.CharField(
|
|
67
|
+
blank=True,
|
|
68
|
+
default="",
|
|
69
|
+
help_text="Auto-updated by Modeladmin",
|
|
70
|
+
max_length=10,
|
|
71
|
+
verbose_name="Locale created",
|
|
72
|
+
),
|
|
73
|
+
),
|
|
74
|
+
migrations.AlterField(
|
|
75
|
+
model_name="historicalvisitschedule",
|
|
76
|
+
name="locale_modified",
|
|
77
|
+
field=models.CharField(
|
|
78
|
+
blank=True,
|
|
79
|
+
default="",
|
|
80
|
+
help_text="Auto-updated by Modeladmin",
|
|
81
|
+
max_length=10,
|
|
82
|
+
verbose_name="Locale modified",
|
|
83
|
+
),
|
|
84
|
+
),
|
|
85
|
+
migrations.AlterField(
|
|
86
|
+
model_name="offschedule",
|
|
87
|
+
name="device_created",
|
|
88
|
+
field=models.CharField(
|
|
89
|
+
blank=True, default="", max_length=10, verbose_name="Device created"
|
|
90
|
+
),
|
|
91
|
+
),
|
|
92
|
+
migrations.AlterField(
|
|
93
|
+
model_name="offschedule",
|
|
94
|
+
name="device_modified",
|
|
95
|
+
field=models.CharField(
|
|
96
|
+
blank=True, default="", max_length=10, verbose_name="Device modified"
|
|
97
|
+
),
|
|
98
|
+
),
|
|
99
|
+
migrations.AlterField(
|
|
100
|
+
model_name="offschedule",
|
|
101
|
+
name="locale_created",
|
|
102
|
+
field=models.CharField(
|
|
103
|
+
blank=True,
|
|
104
|
+
default="",
|
|
105
|
+
help_text="Auto-updated by Modeladmin",
|
|
106
|
+
max_length=10,
|
|
107
|
+
verbose_name="Locale created",
|
|
108
|
+
),
|
|
109
|
+
),
|
|
110
|
+
migrations.AlterField(
|
|
111
|
+
model_name="offschedule",
|
|
112
|
+
name="locale_modified",
|
|
113
|
+
field=models.CharField(
|
|
114
|
+
blank=True,
|
|
115
|
+
default="",
|
|
116
|
+
help_text="Auto-updated by Modeladmin",
|
|
117
|
+
max_length=10,
|
|
118
|
+
verbose_name="Locale modified",
|
|
119
|
+
),
|
|
120
|
+
),
|
|
121
|
+
migrations.AlterField(
|
|
122
|
+
model_name="onschedule",
|
|
123
|
+
name="device_created",
|
|
124
|
+
field=models.CharField(
|
|
125
|
+
blank=True, default="", max_length=10, verbose_name="Device created"
|
|
126
|
+
),
|
|
127
|
+
),
|
|
128
|
+
migrations.AlterField(
|
|
129
|
+
model_name="onschedule",
|
|
130
|
+
name="device_modified",
|
|
131
|
+
field=models.CharField(
|
|
132
|
+
blank=True, default="", max_length=10, verbose_name="Device modified"
|
|
133
|
+
),
|
|
134
|
+
),
|
|
135
|
+
migrations.AlterField(
|
|
136
|
+
model_name="onschedule",
|
|
137
|
+
name="locale_created",
|
|
138
|
+
field=models.CharField(
|
|
139
|
+
blank=True,
|
|
140
|
+
default="",
|
|
141
|
+
help_text="Auto-updated by Modeladmin",
|
|
142
|
+
max_length=10,
|
|
143
|
+
verbose_name="Locale created",
|
|
144
|
+
),
|
|
145
|
+
),
|
|
146
|
+
migrations.AlterField(
|
|
147
|
+
model_name="onschedule",
|
|
148
|
+
name="locale_modified",
|
|
149
|
+
field=models.CharField(
|
|
150
|
+
blank=True,
|
|
151
|
+
default="",
|
|
152
|
+
help_text="Auto-updated by Modeladmin",
|
|
153
|
+
max_length=10,
|
|
154
|
+
verbose_name="Locale modified",
|
|
155
|
+
),
|
|
156
|
+
),
|
|
157
|
+
migrations.AlterField(
|
|
158
|
+
model_name="subjectschedulehistory",
|
|
159
|
+
name="device_created",
|
|
160
|
+
field=models.CharField(
|
|
161
|
+
blank=True, default="", max_length=10, verbose_name="Device created"
|
|
162
|
+
),
|
|
163
|
+
),
|
|
164
|
+
migrations.AlterField(
|
|
165
|
+
model_name="subjectschedulehistory",
|
|
166
|
+
name="device_modified",
|
|
167
|
+
field=models.CharField(
|
|
168
|
+
blank=True, default="", max_length=10, verbose_name="Device modified"
|
|
169
|
+
),
|
|
170
|
+
),
|
|
171
|
+
migrations.AlterField(
|
|
172
|
+
model_name="subjectschedulehistory",
|
|
173
|
+
name="locale_created",
|
|
174
|
+
field=models.CharField(
|
|
175
|
+
blank=True,
|
|
176
|
+
default="",
|
|
177
|
+
help_text="Auto-updated by Modeladmin",
|
|
178
|
+
max_length=10,
|
|
179
|
+
verbose_name="Locale created",
|
|
180
|
+
),
|
|
181
|
+
),
|
|
182
|
+
migrations.AlterField(
|
|
183
|
+
model_name="subjectschedulehistory",
|
|
184
|
+
name="locale_modified",
|
|
185
|
+
field=models.CharField(
|
|
186
|
+
blank=True,
|
|
187
|
+
default="",
|
|
188
|
+
help_text="Auto-updated by Modeladmin",
|
|
189
|
+
max_length=10,
|
|
190
|
+
verbose_name="Locale modified",
|
|
191
|
+
),
|
|
192
|
+
),
|
|
193
|
+
migrations.AlterField(
|
|
194
|
+
model_name="visitschedule",
|
|
195
|
+
name="device_created",
|
|
196
|
+
field=models.CharField(
|
|
197
|
+
blank=True, default="", max_length=10, verbose_name="Device created"
|
|
198
|
+
),
|
|
199
|
+
),
|
|
200
|
+
migrations.AlterField(
|
|
201
|
+
model_name="visitschedule",
|
|
202
|
+
name="device_modified",
|
|
203
|
+
field=models.CharField(
|
|
204
|
+
blank=True, default="", max_length=10, verbose_name="Device modified"
|
|
205
|
+
),
|
|
206
|
+
),
|
|
207
|
+
migrations.AlterField(
|
|
208
|
+
model_name="visitschedule",
|
|
209
|
+
name="locale_created",
|
|
210
|
+
field=models.CharField(
|
|
211
|
+
blank=True,
|
|
212
|
+
default="",
|
|
213
|
+
help_text="Auto-updated by Modeladmin",
|
|
214
|
+
max_length=10,
|
|
215
|
+
verbose_name="Locale created",
|
|
216
|
+
),
|
|
217
|
+
),
|
|
218
|
+
migrations.AlterField(
|
|
219
|
+
model_name="visitschedule",
|
|
220
|
+
name="locale_modified",
|
|
221
|
+
field=models.CharField(
|
|
222
|
+
blank=True,
|
|
223
|
+
default="",
|
|
224
|
+
help_text="Auto-updated by Modeladmin",
|
|
225
|
+
max_length=10,
|
|
226
|
+
verbose_name="Locale modified",
|
|
227
|
+
),
|
|
228
|
+
),
|
|
229
|
+
]
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Generated by Django 5.2.6 on 2025-09-18 00:24
|
|
2
|
+
|
|
3
|
+
import django.utils.timezone
|
|
4
|
+
import edc_model.validators.date
|
|
5
|
+
import edc_protocol.validators
|
|
6
|
+
from django.db import migrations, models
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Migration(migrations.Migration):
|
|
10
|
+
|
|
11
|
+
dependencies = [
|
|
12
|
+
(
|
|
13
|
+
"edc_visit_schedule",
|
|
14
|
+
"0019_alter_historicalonschedule_device_created_and_more",
|
|
15
|
+
),
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
operations = [
|
|
19
|
+
migrations.AlterField(
|
|
20
|
+
model_name="historicalonschedule",
|
|
21
|
+
name="onschedule_datetime",
|
|
22
|
+
field=models.DateTimeField(
|
|
23
|
+
default=django.utils.timezone.now,
|
|
24
|
+
validators=[
|
|
25
|
+
edc_protocol.validators.datetime_not_before_study_start,
|
|
26
|
+
edc_model.validators.date.datetime_not_future,
|
|
27
|
+
],
|
|
28
|
+
),
|
|
29
|
+
),
|
|
30
|
+
migrations.AlterField(
|
|
31
|
+
model_name="offschedule",
|
|
32
|
+
name="offschedule_datetime",
|
|
33
|
+
field=models.DateTimeField(
|
|
34
|
+
default=django.utils.timezone.now,
|
|
35
|
+
validators=[
|
|
36
|
+
edc_protocol.validators.datetime_not_before_study_start,
|
|
37
|
+
edc_model.validators.date.datetime_not_future,
|
|
38
|
+
],
|
|
39
|
+
verbose_name="Date and time subject taken off schedule",
|
|
40
|
+
),
|
|
41
|
+
),
|
|
42
|
+
migrations.AlterField(
|
|
43
|
+
model_name="onschedule",
|
|
44
|
+
name="onschedule_datetime",
|
|
45
|
+
field=models.DateTimeField(
|
|
46
|
+
default=django.utils.timezone.now,
|
|
47
|
+
validators=[
|
|
48
|
+
edc_protocol.validators.datetime_not_before_study_start,
|
|
49
|
+
edc_model.validators.date.datetime_not_future,
|
|
50
|
+
],
|
|
51
|
+
),
|
|
52
|
+
),
|
|
53
|
+
migrations.AlterField(
|
|
54
|
+
model_name="subjectschedulehistory",
|
|
55
|
+
name="schedule_status",
|
|
56
|
+
field=models.CharField(
|
|
57
|
+
choices=[
|
|
58
|
+
("onschedule", "On schedule"),
|
|
59
|
+
("offschedule", "Off schedule"),
|
|
60
|
+
],
|
|
61
|
+
default="",
|
|
62
|
+
max_length=15,
|
|
63
|
+
),
|
|
64
|
+
),
|
|
65
|
+
]
|
|
@@ -6,13 +6,14 @@ from zoneinfo import ZoneInfo
|
|
|
6
6
|
from django.conf import settings
|
|
7
7
|
from django.core.exceptions import ImproperlyConfigured
|
|
8
8
|
from django.db import models
|
|
9
|
+
from django.utils import timezone
|
|
9
10
|
|
|
10
11
|
from edc_identifier.managers import SubjectIdentifierManager
|
|
11
12
|
from edc_identifier.model_mixins import UniqueSubjectIdentifierFieldMixin
|
|
12
13
|
from edc_model.validators import datetime_not_future
|
|
13
14
|
from edc_protocol.validators import datetime_not_before_study_start
|
|
14
15
|
from edc_sites.managers import CurrentSiteManager as BaseCurrentSiteManager
|
|
15
|
-
from edc_utils import convert_php_dateformat
|
|
16
|
+
from edc_utils import convert_php_dateformat
|
|
16
17
|
|
|
17
18
|
from ..site_visit_schedules import site_visit_schedules
|
|
18
19
|
|
|
@@ -36,7 +37,7 @@ class OffScheduleModelMixin(UniqueSubjectIdentifierFieldMixin, models.Model):
|
|
|
36
37
|
offschedule_datetime = models.DateTimeField(
|
|
37
38
|
verbose_name="Date and time subject taken off schedule",
|
|
38
39
|
validators=[datetime_not_before_study_start, datetime_not_future],
|
|
39
|
-
default=
|
|
40
|
+
default=timezone.now,
|
|
40
41
|
)
|
|
41
42
|
|
|
42
43
|
report_datetime = models.DateTimeField(editable=False)
|
|
@@ -62,11 +63,11 @@ class OffScheduleModelMixin(UniqueSubjectIdentifierFieldMixin, models.Model):
|
|
|
62
63
|
self.offschedule_datetime = getattr(self, self.offschedule_datetime_field_attr)
|
|
63
64
|
try:
|
|
64
65
|
self.offschedule_datetime.date()
|
|
65
|
-
except AttributeError:
|
|
66
|
+
except AttributeError as e:
|
|
66
67
|
raise ImproperlyConfigured(
|
|
67
68
|
f"Field class must be DateTimeField. See {self.__class__}."
|
|
68
69
|
f"{self.offschedule_datetime_field_attr}."
|
|
69
|
-
)
|
|
70
|
+
) from e
|
|
70
71
|
|
|
71
72
|
datetime_not_before_study_start(self.offschedule_datetime)
|
|
72
73
|
datetime_not_future(self.offschedule_datetime)
|
|
@@ -5,13 +5,14 @@ from zoneinfo import ZoneInfo
|
|
|
5
5
|
|
|
6
6
|
from django.conf import settings
|
|
7
7
|
from django.db import models
|
|
8
|
+
from django.utils import timezone
|
|
8
9
|
|
|
9
10
|
from edc_identifier.managers import SubjectIdentifierManager
|
|
10
11
|
from edc_identifier.model_mixins import UniqueSubjectIdentifierFieldMixin
|
|
11
12
|
from edc_model.models import HistoricalRecords
|
|
12
13
|
from edc_model.validators import datetime_not_future
|
|
13
14
|
from edc_protocol.validators import datetime_not_before_study_start
|
|
14
|
-
from edc_utils import convert_php_dateformat
|
|
15
|
+
from edc_utils import convert_php_dateformat
|
|
15
16
|
|
|
16
17
|
from ..site_visit_schedules import site_visit_schedules
|
|
17
18
|
|
|
@@ -25,8 +26,8 @@ if TYPE_CHECKING:
|
|
|
25
26
|
class OnScheduleManager(SubjectIdentifierManager):
|
|
26
27
|
def put_on_schedule(
|
|
27
28
|
self,
|
|
28
|
-
subject_identifier: str
|
|
29
|
-
onschedule_datetime: datetime
|
|
29
|
+
subject_identifier: str,
|
|
30
|
+
onschedule_datetime: datetime,
|
|
30
31
|
skip_get_current_site: bool | None = None,
|
|
31
32
|
) -> None:
|
|
32
33
|
"""Puts a subject on the schedule associated with this
|
|
@@ -51,7 +52,7 @@ class OnScheduleModelMixin(UniqueSubjectIdentifierFieldMixin, models.Model):
|
|
|
51
52
|
|
|
52
53
|
onschedule_datetime = models.DateTimeField(
|
|
53
54
|
validators=[datetime_not_before_study_start, datetime_not_future],
|
|
54
|
-
default=
|
|
55
|
+
default=timezone.now,
|
|
55
56
|
)
|
|
56
57
|
|
|
57
58
|
report_datetime = models.DateTimeField(editable=False)
|
|
@@ -2,7 +2,7 @@ from django.db import models
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class VisitCodeFieldsModelMixin(models.Model):
|
|
5
|
-
visit_code = models.CharField(max_length=25,
|
|
5
|
+
visit_code = models.CharField(max_length=25, default="", editable=False)
|
|
6
6
|
|
|
7
7
|
visit_code_sequence = models.IntegerField(
|
|
8
8
|
verbose_name="Sequence",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from django.apps import apps as django_apps
|
|
2
2
|
from django.db import models
|
|
3
3
|
from django.db.models import Q, UniqueConstraint
|
|
4
|
+
from django.utils import timezone
|
|
4
5
|
|
|
5
6
|
from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
|
|
6
7
|
from edc_model.models import BaseUuidModel
|
|
@@ -8,7 +9,6 @@ from edc_model.validators import datetime_not_future
|
|
|
8
9
|
from edc_protocol.validators import datetime_not_before_study_start
|
|
9
10
|
from edc_sites.managers import CurrentSiteManager
|
|
10
11
|
from edc_sites.model_mixins import SiteModelMixin
|
|
11
|
-
from edc_utils import get_utcnow
|
|
12
12
|
|
|
13
13
|
from ..choices import SCHEDULE_STATUS
|
|
14
14
|
from ..model_mixins import VisitScheduleFieldsModelMixin
|
|
@@ -32,7 +32,7 @@ class SubjectScheduleModelManager(models.Manager):
|
|
|
32
32
|
relative to the report_datetime.
|
|
33
33
|
"""
|
|
34
34
|
onschedules = []
|
|
35
|
-
report_datetime = report_datetime or
|
|
35
|
+
report_datetime = report_datetime or timezone.now()
|
|
36
36
|
qs = self.filter(
|
|
37
37
|
Q(subject_identifier=subject_identifier),
|
|
38
38
|
Q(onschedule_datetime__lte=report_datetime),
|
|
@@ -67,7 +67,7 @@ class SubjectScheduleHistory(
|
|
|
67
67
|
validators=[datetime_not_before_study_start, datetime_not_future], null=True
|
|
68
68
|
)
|
|
69
69
|
|
|
70
|
-
schedule_status = models.CharField(max_length=15, choices=SCHEDULE_STATUS,
|
|
70
|
+
schedule_status = models.CharField(max_length=15, choices=SCHEDULE_STATUS, default="")
|
|
71
71
|
|
|
72
72
|
objects = SubjectScheduleModelManager()
|
|
73
73
|
|
|
@@ -101,12 +101,12 @@ class SubjectScheduleHistory(
|
|
|
101
101
|
return django_apps.get_model(self.offschedule_model)
|
|
102
102
|
|
|
103
103
|
class Meta(BaseUuidModel.Meta, NonUniqueSubjectIdentifierFieldMixin.Meta):
|
|
104
|
-
constraints =
|
|
104
|
+
constraints = (
|
|
105
105
|
UniqueConstraint(
|
|
106
106
|
fields=["subject_identifier", "visit_schedule_name", "schedule_name"],
|
|
107
107
|
name="%(app_label)s_%(class)s_subject_uniq",
|
|
108
|
-
)
|
|
109
|
-
|
|
108
|
+
),
|
|
109
|
+
)
|
|
110
110
|
indexes = (
|
|
111
111
|
*BaseUuidModel.Meta.indexes,
|
|
112
112
|
*NonUniqueSubjectIdentifierFieldMixin.Meta.indexes,
|
|
@@ -39,7 +39,7 @@ class VisitCollection(OrderedCollection):
|
|
|
39
39
|
except TypeError as e:
|
|
40
40
|
raise VisitCollectionError(
|
|
41
41
|
f"Invalid visit.rbase. visit.rbase={visit.rbase}. See {visit!r}. Got {e}."
|
|
42
|
-
)
|
|
42
|
+
) from e
|
|
43
43
|
else:
|
|
44
44
|
visit.timepoint_datetime = timepoint_datetime
|
|
45
45
|
timepoint_dates.update({visit: visit.timepoint_datetime})
|
|
@@ -6,6 +6,7 @@ from typing import TYPE_CHECKING
|
|
|
6
6
|
from django.apps import apps as django_apps
|
|
7
7
|
from django.conf import settings
|
|
8
8
|
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
|
|
9
|
+
from django.utils import timezone
|
|
9
10
|
|
|
10
11
|
from edc_appointment.constants import COMPLETE_APPT, IN_PROGRESS_APPT
|
|
11
12
|
from edc_appointment.creators import AppointmentsCreator
|
|
@@ -14,7 +15,7 @@ from edc_consent.exceptions import ConsentDefinitionError
|
|
|
14
15
|
from edc_consent.site_consents import site_consents
|
|
15
16
|
from edc_sites.site import sites as site_sites
|
|
16
17
|
from edc_sites.utils import valid_site_for_subject_or_raise
|
|
17
|
-
from edc_utils import convert_php_dateformat, formatted_datetime
|
|
18
|
+
from edc_utils import convert_php_dateformat, formatted_datetime
|
|
18
19
|
from edc_utils.date import to_local
|
|
19
20
|
|
|
20
21
|
from .constants import OFF_SCHEDULE, ON_SCHEDULE
|
|
@@ -112,7 +113,7 @@ class SubjectSchedule:
|
|
|
112
113
|
Appointment are created here by calling the
|
|
113
114
|
appointments_creator_cls.
|
|
114
115
|
"""
|
|
115
|
-
onschedule_datetime = onschedule_datetime or
|
|
116
|
+
onschedule_datetime = onschedule_datetime or timezone.now()
|
|
116
117
|
if not consent_definition and len(self.schedule.consent_definitions) == 1:
|
|
117
118
|
consent_definition = self.schedule.consent_definitions[0]
|
|
118
119
|
elif not consent_definition:
|
|
@@ -375,13 +376,13 @@ class SubjectSchedule:
|
|
|
375
376
|
in_date_range = (
|
|
376
377
|
onschedule_obj.onschedule_datetime
|
|
377
378
|
<= report_datetime
|
|
378
|
-
<= (offschedule_datetime or
|
|
379
|
+
<= (offschedule_datetime or timezone.now())
|
|
379
380
|
)
|
|
380
381
|
else:
|
|
381
382
|
in_date_range = (
|
|
382
383
|
onschedule_obj.onschedule_datetime.date()
|
|
383
384
|
<= report_datetime.date()
|
|
384
|
-
<= (offschedule_datetime or
|
|
385
|
+
<= (offschedule_datetime or timezone.now()).date()
|
|
385
386
|
)
|
|
386
387
|
|
|
387
388
|
if offschedule_datetime and not in_date_range:
|
|
@@ -3,8 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from typing import TYPE_CHECKING, Any
|
|
4
4
|
|
|
5
5
|
from django.core.exceptions import ObjectDoesNotExist
|
|
6
|
-
|
|
7
|
-
from edc_utils import get_utcnow
|
|
6
|
+
from django.utils import timezone
|
|
8
7
|
|
|
9
8
|
from .site_visit_schedules import site_visit_schedules
|
|
10
9
|
|
|
@@ -39,7 +38,7 @@ class VisitScheduleViewMixin:
|
|
|
39
38
|
else:
|
|
40
39
|
self.onschedule_models.append(onschedule_model_obj)
|
|
41
40
|
self.visit_schedules.update({visit_schedule.name: visit_schedule})
|
|
42
|
-
if schedule.is_onschedule(self.subject_identifier,
|
|
41
|
+
if schedule.is_onschedule(self.subject_identifier, timezone.now()):
|
|
43
42
|
self.current_schedule = schedule
|
|
44
43
|
self.current_visit_schedule = visit_schedule
|
|
45
44
|
self.current_onschedule_model = onschedule_model_obj
|
|
@@ -5,9 +5,10 @@ from decimal import Decimal
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
from django.apps import apps as django_apps
|
|
8
|
+
from django.utils import timezone
|
|
8
9
|
|
|
9
10
|
from edc_facility.utils import get_default_facility_name, get_facility
|
|
10
|
-
from edc_utils import
|
|
11
|
+
from edc_utils import to_local
|
|
11
12
|
|
|
12
13
|
from .crf_collection import CrfCollection
|
|
13
14
|
from .forms_collection import FormsCollection
|
|
@@ -172,7 +173,7 @@ class Visit:
|
|
|
172
173
|
timepoint=self.timepoint,
|
|
173
174
|
base_timepoint=self.base_timepoint,
|
|
174
175
|
)
|
|
175
|
-
utcnow =
|
|
176
|
+
utcnow = timezone.now()
|
|
176
177
|
self.validate_rlower_late(utcnow)
|
|
177
178
|
self.validate_rupper_late(utcnow)
|
|
178
179
|
self.title = title or f"Visit {self.code}"
|
edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py
CHANGED
|
@@ -21,8 +21,8 @@ import edc_model.validators.date
|
|
|
21
21
|
import edc_model_fields.fields.other_charfield
|
|
22
22
|
import edc_protocol.validators
|
|
23
23
|
import edc_sites.models
|
|
24
|
-
import edc_utils.date
|
|
25
24
|
import edc_visit_tracking.managers
|
|
25
|
+
import django.utils.timezone
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class Migration(migrations.Migration):
|
|
@@ -52,14 +52,14 @@ class Migration(migrations.Migration):
|
|
|
52
52
|
"created",
|
|
53
53
|
models.DateTimeField(
|
|
54
54
|
blank=True,
|
|
55
|
-
default=
|
|
55
|
+
default=django.utils.timezone.now,
|
|
56
56
|
),
|
|
57
57
|
),
|
|
58
58
|
(
|
|
59
59
|
"modified",
|
|
60
60
|
models.DateTimeField(
|
|
61
61
|
blank=True,
|
|
62
|
-
default=
|
|
62
|
+
default=django.utils.timezone.now,
|
|
63
63
|
),
|
|
64
64
|
),
|
|
65
65
|
(
|
|
@@ -146,7 +146,7 @@ class Migration(migrations.Migration):
|
|
|
146
146
|
(
|
|
147
147
|
"report_datetime",
|
|
148
148
|
models.DateTimeField(
|
|
149
|
-
default=
|
|
149
|
+
default=django.utils.timezone.now,
|
|
150
150
|
help_text="Date and time of this report",
|
|
151
151
|
validators=[
|
|
152
152
|
edc_protocol.validators.datetime_not_before_study_start,
|
|
@@ -414,14 +414,14 @@ class Migration(migrations.Migration):
|
|
|
414
414
|
"created",
|
|
415
415
|
models.DateTimeField(
|
|
416
416
|
blank=True,
|
|
417
|
-
default=
|
|
417
|
+
default=django.utils.timezone.now,
|
|
418
418
|
),
|
|
419
419
|
),
|
|
420
420
|
(
|
|
421
421
|
"modified",
|
|
422
422
|
models.DateTimeField(
|
|
423
423
|
blank=True,
|
|
424
|
-
default=
|
|
424
|
+
default=django.utils.timezone.now,
|
|
425
425
|
),
|
|
426
426
|
),
|
|
427
427
|
(
|
|
@@ -483,7 +483,7 @@ class Migration(migrations.Migration):
|
|
|
483
483
|
(
|
|
484
484
|
"report_datetime",
|
|
485
485
|
models.DateTimeField(
|
|
486
|
-
default=
|
|
486
|
+
default=django.utils.timezone.now,
|
|
487
487
|
help_text="If reporting today, use today's date/time, otherwise use the date/time this information was reported.",
|
|
488
488
|
validators=[
|
|
489
489
|
edc_protocol.validators.datetime_not_before_study_start,
|
|
@@ -673,14 +673,14 @@ class Migration(migrations.Migration):
|
|
|
673
673
|
"created",
|
|
674
674
|
models.DateTimeField(
|
|
675
675
|
blank=True,
|
|
676
|
-
default=
|
|
676
|
+
default=django.utils.timezone.now,
|
|
677
677
|
),
|
|
678
678
|
),
|
|
679
679
|
(
|
|
680
680
|
"modified",
|
|
681
681
|
models.DateTimeField(
|
|
682
682
|
blank=True,
|
|
683
|
-
default=
|
|
683
|
+
default=django.utils.timezone.now,
|
|
684
684
|
),
|
|
685
685
|
),
|
|
686
686
|
(
|
|
@@ -766,7 +766,7 @@ class Migration(migrations.Migration):
|
|
|
766
766
|
(
|
|
767
767
|
"report_datetime",
|
|
768
768
|
models.DateTimeField(
|
|
769
|
-
default=
|
|
769
|
+
default=django.utils.timezone.now,
|
|
770
770
|
help_text="Date and time of this report",
|
|
771
771
|
validators=[
|
|
772
772
|
edc_protocol.validators.datetime_not_before_study_start,
|
|
@@ -1033,14 +1033,14 @@ class Migration(migrations.Migration):
|
|
|
1033
1033
|
"created",
|
|
1034
1034
|
models.DateTimeField(
|
|
1035
1035
|
blank=True,
|
|
1036
|
-
default=
|
|
1036
|
+
default=django.utils.timezone.now,
|
|
1037
1037
|
),
|
|
1038
1038
|
),
|
|
1039
1039
|
(
|
|
1040
1040
|
"modified",
|
|
1041
1041
|
models.DateTimeField(
|
|
1042
1042
|
blank=True,
|
|
1043
|
-
default=
|
|
1043
|
+
default=django.utils.timezone.now,
|
|
1044
1044
|
),
|
|
1045
1045
|
),
|
|
1046
1046
|
(
|
|
@@ -1103,7 +1103,7 @@ class Migration(migrations.Migration):
|
|
|
1103
1103
|
(
|
|
1104
1104
|
"report_datetime",
|
|
1105
1105
|
models.DateTimeField(
|
|
1106
|
-
default=
|
|
1106
|
+
default=django.utils.timezone.now,
|
|
1107
1107
|
help_text="If reporting today, use today's date/time, otherwise use the date/time this information was reported.",
|
|
1108
1108
|
validators=[
|
|
1109
1109
|
edc_protocol.validators.datetime_not_before_study_start,
|