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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from django.utils import timezone
|
|
2
3
|
|
|
3
4
|
from edc_constants.choices import YES_NO_NA
|
|
4
5
|
from edc_constants.constants import NOT_APPLICABLE
|
|
5
6
|
from edc_model import REPORT_STATUS
|
|
6
7
|
from edc_model.validators import datetime_not_future
|
|
7
|
-
from edc_utils import get_utcnow
|
|
8
8
|
|
|
9
9
|
from ..choices import DEVIATION_VIOLATION
|
|
10
10
|
from ..models import ActionsRequired, ProtocolViolations
|
|
@@ -12,13 +12,13 @@ from ..models import ActionsRequired, ProtocolViolations
|
|
|
12
12
|
|
|
13
13
|
class ProtocolDeviationViolationModelMixin(models.Model):
|
|
14
14
|
report_datetime = models.DateTimeField(
|
|
15
|
-
verbose_name="Report Date and Time", default=
|
|
15
|
+
verbose_name="Report Date and Time", default=timezone.now
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
short_description = models.CharField(
|
|
19
19
|
verbose_name="Provide a short description of this occurrence",
|
|
20
20
|
max_length=35,
|
|
21
|
-
|
|
21
|
+
default="",
|
|
22
22
|
blank=False,
|
|
23
23
|
help_text=(
|
|
24
24
|
'Max 35 characters. Note: If this occurrence is a "violation" '
|
|
@@ -39,7 +39,7 @@ class ProtocolDeviationViolationModelMixin(models.Model):
|
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
safety_impact_details = models.TextField(
|
|
42
|
-
verbose_name='If "Yes", provide details',
|
|
42
|
+
verbose_name='If "Yes", provide details', default="", blank=True
|
|
43
43
|
)
|
|
44
44
|
|
|
45
45
|
study_outcomes_impact = models.CharField(
|
|
@@ -50,7 +50,7 @@ class ProtocolDeviationViolationModelMixin(models.Model):
|
|
|
50
50
|
)
|
|
51
51
|
|
|
52
52
|
study_outcomes_impact_details = models.TextField(
|
|
53
|
-
verbose_name='If "Yes", provide details',
|
|
53
|
+
verbose_name='If "Yes", provide details', default="", blank=True
|
|
54
54
|
)
|
|
55
55
|
|
|
56
56
|
violation_datetime = models.DateTimeField(
|
|
@@ -70,21 +70,24 @@ class ProtocolDeviationViolationModelMixin(models.Model):
|
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
violation_other = models.CharField(
|
|
73
|
-
|
|
73
|
+
verbose_name="If other, please specify",
|
|
74
|
+
max_length=75,
|
|
75
|
+
default="",
|
|
76
|
+
blank=True,
|
|
74
77
|
)
|
|
75
78
|
|
|
76
79
|
violation_description = models.TextField(
|
|
77
80
|
verbose_name="Describe the violation",
|
|
78
|
-
null=True,
|
|
79
|
-
blank=True,
|
|
80
81
|
help_text=(
|
|
81
82
|
"Describe in full. Explain how the violation happened, what occurred, etc."
|
|
82
83
|
),
|
|
84
|
+
default="",
|
|
85
|
+
blank=True,
|
|
83
86
|
)
|
|
84
87
|
|
|
85
88
|
violation_reason = models.TextField(
|
|
86
89
|
verbose_name="Explain the reason why the violation occurred",
|
|
87
|
-
|
|
90
|
+
default="",
|
|
88
91
|
blank=True,
|
|
89
92
|
)
|
|
90
93
|
|
|
@@ -96,7 +99,9 @@ class ProtocolDeviationViolationModelMixin(models.Model):
|
|
|
96
99
|
)
|
|
97
100
|
|
|
98
101
|
corrective_action = models.TextField(
|
|
99
|
-
verbose_name="Corrective action taken",
|
|
102
|
+
verbose_name="Corrective action taken",
|
|
103
|
+
default="",
|
|
104
|
+
blank=True,
|
|
100
105
|
)
|
|
101
106
|
|
|
102
107
|
preventative_action_datetime = models.DateTimeField(
|
|
@@ -107,7 +112,9 @@ class ProtocolDeviationViolationModelMixin(models.Model):
|
|
|
107
112
|
)
|
|
108
113
|
|
|
109
114
|
preventative_action = models.TextField(
|
|
110
|
-
verbose_name="Preventative action taken",
|
|
115
|
+
verbose_name="Preventative action taken",
|
|
116
|
+
default="",
|
|
117
|
+
blank=True,
|
|
111
118
|
)
|
|
112
119
|
|
|
113
120
|
action_required = models.ForeignKey(
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from django.utils import timezone
|
|
2
3
|
|
|
3
4
|
from edc_constants.choices import YES_NO
|
|
4
5
|
from edc_model.validators import datetime_not_future
|
|
5
|
-
from edc_utils import get_utcnow
|
|
6
6
|
|
|
7
7
|
from ..choices import DEVIATION_VIOLATION, REPORT_STATUS
|
|
8
8
|
from ..models import ActionsRequired, ProtocolViolations
|
|
@@ -10,13 +10,14 @@ from ..models import ActionsRequired, ProtocolViolations
|
|
|
10
10
|
|
|
11
11
|
class ProtocolIncidentModelMixin(models.Model):
|
|
12
12
|
report_datetime = models.DateTimeField(
|
|
13
|
-
verbose_name="Report Date and Time",
|
|
13
|
+
verbose_name="Report Date and Time",
|
|
14
|
+
default=timezone.now,
|
|
14
15
|
)
|
|
15
16
|
|
|
16
17
|
short_description = models.CharField(
|
|
17
18
|
verbose_name="Provide a short description of this incident",
|
|
18
19
|
max_length=35,
|
|
19
|
-
|
|
20
|
+
default="",
|
|
20
21
|
blank=False,
|
|
21
22
|
help_text=(
|
|
22
23
|
"Max 35 characters. Note: there is additional space below for "
|
|
@@ -35,7 +36,9 @@ class ProtocolIncidentModelMixin(models.Model):
|
|
|
35
36
|
)
|
|
36
37
|
|
|
37
38
|
safety_impact_details = models.TextField(
|
|
38
|
-
verbose_name='If "Yes", provide details',
|
|
39
|
+
verbose_name='If "Yes", provide details',
|
|
40
|
+
default="",
|
|
41
|
+
blank=True,
|
|
39
42
|
)
|
|
40
43
|
|
|
41
44
|
study_outcomes_impact = models.CharField(
|
|
@@ -45,7 +48,9 @@ class ProtocolIncidentModelMixin(models.Model):
|
|
|
45
48
|
)
|
|
46
49
|
|
|
47
50
|
study_outcomes_impact_details = models.TextField(
|
|
48
|
-
verbose_name='If "Yes", provide details',
|
|
51
|
+
verbose_name='If "Yes", provide details',
|
|
52
|
+
default="",
|
|
53
|
+
blank=True,
|
|
49
54
|
)
|
|
50
55
|
|
|
51
56
|
incident_datetime = models.DateTimeField(
|
|
@@ -65,19 +70,22 @@ class ProtocolIncidentModelMixin(models.Model):
|
|
|
65
70
|
)
|
|
66
71
|
|
|
67
72
|
incident_other = models.CharField(
|
|
68
|
-
|
|
73
|
+
verbose_name="If other, please specify",
|
|
74
|
+
max_length=75,
|
|
75
|
+
default="",
|
|
76
|
+
blank=True,
|
|
69
77
|
)
|
|
70
78
|
|
|
71
79
|
incident_description = models.TextField(
|
|
72
80
|
verbose_name="Describe the incident",
|
|
73
|
-
|
|
81
|
+
default="",
|
|
74
82
|
blank=False,
|
|
75
83
|
help_text="Describe in full. Explain how the incident happened, what occurred, etc.",
|
|
76
84
|
)
|
|
77
85
|
|
|
78
86
|
incident_reason = models.TextField(
|
|
79
87
|
verbose_name="Explain the reason why the incident occurred",
|
|
80
|
-
|
|
88
|
+
default="",
|
|
81
89
|
blank=False,
|
|
82
90
|
)
|
|
83
91
|
|
|
@@ -89,7 +97,9 @@ class ProtocolIncidentModelMixin(models.Model):
|
|
|
89
97
|
)
|
|
90
98
|
|
|
91
99
|
corrective_action = models.TextField(
|
|
92
|
-
verbose_name="Corrective action taken",
|
|
100
|
+
verbose_name="Corrective action taken",
|
|
101
|
+
default="",
|
|
102
|
+
blank=True,
|
|
93
103
|
)
|
|
94
104
|
|
|
95
105
|
preventative_action_datetime = models.DateTimeField(
|
|
@@ -100,7 +110,9 @@ class ProtocolIncidentModelMixin(models.Model):
|
|
|
100
110
|
)
|
|
101
111
|
|
|
102
112
|
preventative_action = models.TextField(
|
|
103
|
-
verbose_name="Preventative action taken",
|
|
113
|
+
verbose_name="Preventative action taken",
|
|
114
|
+
default="",
|
|
115
|
+
blank=True,
|
|
104
116
|
)
|
|
105
117
|
|
|
106
118
|
action_required = models.ForeignKey(
|
|
@@ -117,7 +129,10 @@ class ProtocolIncidentModelMixin(models.Model):
|
|
|
117
129
|
choices=REPORT_STATUS,
|
|
118
130
|
)
|
|
119
131
|
|
|
120
|
-
reasons_withdrawn = models.TextField(
|
|
132
|
+
reasons_withdrawn = models.TextField(
|
|
133
|
+
default="",
|
|
134
|
+
blank=True,
|
|
135
|
+
)
|
|
121
136
|
|
|
122
137
|
report_closed_datetime = models.DateTimeField(
|
|
123
138
|
blank=True,
|
edc_pylabels/actions.py
CHANGED
|
@@ -6,11 +6,10 @@ from django.apps import apps as django_apps
|
|
|
6
6
|
from django.contrib import admin, messages
|
|
7
7
|
from django.db.models import Count, QuerySet
|
|
8
8
|
from django.http import FileResponse
|
|
9
|
+
from django.utils import timezone
|
|
9
10
|
from django.utils.translation import gettext as _
|
|
10
11
|
from pylabels import Sheet, Specification
|
|
11
12
|
|
|
12
|
-
from edc_utils import get_utcnow
|
|
13
|
-
|
|
14
13
|
from .site_label_configs import LabelConfig, site_label_configs
|
|
15
14
|
|
|
16
15
|
if TYPE_CHECKING:
|
|
@@ -19,7 +18,6 @@ if TYPE_CHECKING:
|
|
|
19
18
|
|
|
20
19
|
@admin.action(description="Test print sheet of labels")
|
|
21
20
|
def print_test_label_sheet_action(modeladmin, request, queryset: QuerySet[LabelConfiguration]):
|
|
22
|
-
|
|
23
21
|
if queryset.count() > 1 or queryset.count() == 0:
|
|
24
22
|
messages.add_message(
|
|
25
23
|
request,
|
|
@@ -74,10 +72,10 @@ def print_label_sheet(modeladmin, request, queryset):
|
|
|
74
72
|
sheet = Sheet(specs, drawing_callable, border=config.label_specification.border)
|
|
75
73
|
sheet.add_labels(label_data)
|
|
76
74
|
buffer = sheet.save_to_buffer()
|
|
77
|
-
now =
|
|
75
|
+
now = timezone.now()
|
|
78
76
|
return FileResponse(
|
|
79
77
|
buffer,
|
|
80
78
|
as_attachment=True,
|
|
81
|
-
filename=f"{config.name}_{now.strftime(
|
|
79
|
+
filename=f"{config.name}_{now.strftime('%Y-%m-%d %H:%M')}.pdf",
|
|
82
80
|
)
|
|
83
81
|
return None
|
|
@@ -7,10 +7,10 @@ import django_audit_fields.fields.uuid_auto_field
|
|
|
7
7
|
import django_audit_fields.models.audit_model_mixin
|
|
8
8
|
import django_revision.revision_field
|
|
9
9
|
from django.db import migrations, models
|
|
10
|
+
import django.utils.timezone
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class Migration(migrations.Migration):
|
|
13
|
-
|
|
14
14
|
dependencies = [
|
|
15
15
|
("django_pylabels", "0003_rename_updated_labelspecification_modified"),
|
|
16
16
|
("edc_pylabels", "0001_initial"),
|
|
@@ -36,9 +36,7 @@ class Migration(migrations.Migration):
|
|
|
36
36
|
migrations.AddField(
|
|
37
37
|
model_name="label",
|
|
38
38
|
name="created",
|
|
39
|
-
field=models.DateTimeField(
|
|
40
|
-
blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
|
|
41
|
-
),
|
|
39
|
+
field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
|
|
42
40
|
),
|
|
43
41
|
migrations.AddField(
|
|
44
42
|
model_name="label",
|
|
@@ -96,9 +94,7 @@ class Migration(migrations.Migration):
|
|
|
96
94
|
migrations.AddField(
|
|
97
95
|
model_name="label",
|
|
98
96
|
name="modified",
|
|
99
|
-
field=models.DateTimeField(
|
|
100
|
-
blank=True, default=django_audit_fields.models.audit_model_mixin.utcnow
|
|
101
|
-
),
|
|
97
|
+
field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
|
|
102
98
|
),
|
|
103
99
|
migrations.AddField(
|
|
104
100
|
model_name="label",
|
|
@@ -8,10 +8,10 @@ import django_audit_fields.fields.uuid_auto_field
|
|
|
8
8
|
import django_audit_fields.models.audit_model_mixin
|
|
9
9
|
import django_revision.revision_field
|
|
10
10
|
from django.db import migrations, models
|
|
11
|
+
import django.utils.timezone
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class Migration(migrations.Migration):
|
|
14
|
-
|
|
15
15
|
dependencies = [
|
|
16
16
|
("django_pylabels", "0003_rename_updated_labelspecification_modified"),
|
|
17
17
|
("edc_pylabels", "0004_remove_label_drawing_callable_name_and_more"),
|
|
@@ -36,14 +36,14 @@ class Migration(migrations.Migration):
|
|
|
36
36
|
"created",
|
|
37
37
|
models.DateTimeField(
|
|
38
38
|
blank=True,
|
|
39
|
-
default=
|
|
39
|
+
default=django.utils.timezone.now,
|
|
40
40
|
),
|
|
41
41
|
),
|
|
42
42
|
(
|
|
43
43
|
"modified",
|
|
44
44
|
models.DateTimeField(
|
|
45
45
|
blank=True,
|
|
46
|
-
default=
|
|
46
|
+
default=django.utils.timezone.now,
|
|
47
47
|
),
|
|
48
48
|
),
|
|
49
49
|
(
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Generated by Django 5.2.6 on 2025-09-17 16:53
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
("edc_pylabels", "0012_alter_labelconfiguration_revision"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterField(
|
|
14
|
+
model_name="labelconfiguration",
|
|
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="labelconfiguration",
|
|
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="labelconfiguration",
|
|
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="labelconfiguration",
|
|
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
|
+
]
|
|
@@ -11,11 +11,10 @@ import django_revision.revision_field
|
|
|
11
11
|
from django.db import migrations, models
|
|
12
12
|
|
|
13
13
|
import edc_sites.managers
|
|
14
|
-
import
|
|
14
|
+
import django.utils.timezone
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class Migration(migrations.Migration):
|
|
18
|
-
|
|
19
18
|
initial = True
|
|
20
19
|
|
|
21
20
|
dependencies = [
|
|
@@ -41,14 +40,14 @@ class Migration(migrations.Migration):
|
|
|
41
40
|
"created",
|
|
42
41
|
models.DateTimeField(
|
|
43
42
|
blank=True,
|
|
44
|
-
default=
|
|
43
|
+
default=django.utils.timezone.now,
|
|
45
44
|
),
|
|
46
45
|
),
|
|
47
46
|
(
|
|
48
47
|
"modified",
|
|
49
48
|
models.DateTimeField(
|
|
50
49
|
blank=True,
|
|
51
|
-
default=
|
|
50
|
+
default=django.utils.timezone.now,
|
|
52
51
|
),
|
|
53
52
|
),
|
|
54
53
|
(
|
|
@@ -132,7 +131,7 @@ class Migration(migrations.Migration):
|
|
|
132
131
|
("report_model", models.CharField(max_length=150)),
|
|
133
132
|
(
|
|
134
133
|
"report_datetime",
|
|
135
|
-
models.DateTimeField(default=
|
|
134
|
+
models.DateTimeField(default=django.utils.timezone.now),
|
|
136
135
|
),
|
|
137
136
|
("note", models.TextField(null=True)),
|
|
138
137
|
(
|
|
@@ -7,10 +7,10 @@ import django_audit_fields.fields.uuid_auto_field
|
|
|
7
7
|
import django_audit_fields.models.audit_model_mixin
|
|
8
8
|
import django_revision.revision_field
|
|
9
9
|
from django.db import migrations, models
|
|
10
|
+
import django.utils.timezone
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class Migration(migrations.Migration):
|
|
13
|
-
|
|
14
14
|
dependencies = [
|
|
15
15
|
("edc_qareports", "0004_alter_qareportnote_status"),
|
|
16
16
|
]
|
|
@@ -34,14 +34,14 @@ class Migration(migrations.Migration):
|
|
|
34
34
|
"created",
|
|
35
35
|
models.DateTimeField(
|
|
36
36
|
blank=True,
|
|
37
|
-
default=
|
|
37
|
+
default=django.utils.timezone.now,
|
|
38
38
|
),
|
|
39
39
|
),
|
|
40
40
|
(
|
|
41
41
|
"modified",
|
|
42
42
|
models.DateTimeField(
|
|
43
43
|
blank=True,
|
|
44
|
-
default=
|
|
44
|
+
default=django.utils.timezone.now,
|
|
45
45
|
),
|
|
46
46
|
),
|
|
47
47
|
(
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
import django.db.models.deletion
|
|
4
4
|
from django.db import migrations, models
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import django.utils.timezone
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class Migration(migrations.Migration):
|
|
10
|
-
|
|
11
10
|
dependencies = [
|
|
12
11
|
("sites", "0002_alter_domain_unique"),
|
|
13
12
|
("edc_qareports", "0005_edcpermissions"),
|
|
@@ -28,7 +27,7 @@ class Migration(migrations.Migration):
|
|
|
28
27
|
),
|
|
29
28
|
("username", models.CharField(max_length=100)),
|
|
30
29
|
("report_model", models.CharField(max_length=100)),
|
|
31
|
-
("accessed", models.DateTimeField(default=
|
|
30
|
+
("accessed", models.DateTimeField(default=django.utils.timezone.now)),
|
|
32
31
|
(
|
|
33
32
|
"site",
|
|
34
33
|
models.ForeignKey(
|
|
@@ -0,0 +1,102 @@
|
|
|
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_qareports", "0018_alter_edcpermissions_revision_alter_note_revision"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterField(
|
|
14
|
+
model_name="edcpermissions",
|
|
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="edcpermissions",
|
|
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="edcpermissions",
|
|
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="edcpermissions",
|
|
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="note",
|
|
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="note",
|
|
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="note",
|
|
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="note",
|
|
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="note",
|
|
87
|
+
name="note",
|
|
88
|
+
field=models.TextField(blank=True, default=""),
|
|
89
|
+
),
|
|
90
|
+
migrations.AlterField(
|
|
91
|
+
model_name="note",
|
|
92
|
+
name="status",
|
|
93
|
+
field=models.CharField(
|
|
94
|
+
choices=[
|
|
95
|
+
("PENDING", "Data is pending"),
|
|
96
|
+
("not_available", "Data not available"),
|
|
97
|
+
],
|
|
98
|
+
default="",
|
|
99
|
+
max_length=25,
|
|
100
|
+
),
|
|
101
|
+
),
|
|
102
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
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_qareports", "0019_alter_edcpermissions_device_created_and_more"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name="note",
|
|
16
|
+
name="report_datetime",
|
|
17
|
+
field=models.DateTimeField(default=django.utils.timezone.now),
|
|
18
|
+
),
|
|
19
|
+
migrations.AlterField(
|
|
20
|
+
model_name="qareportlog",
|
|
21
|
+
name="accessed",
|
|
22
|
+
field=models.DateTimeField(default=django.utils.timezone.now),
|
|
23
|
+
),
|
|
24
|
+
]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from django.apps import apps as django_apps
|
|
2
2
|
from django.db import models
|
|
3
|
+
from django.utils import timezone
|
|
3
4
|
|
|
4
5
|
from edc_model.models import BaseUuidModel
|
|
5
6
|
from edc_sites.model_mixins import SiteModelMixin
|
|
6
|
-
from edc_utils import get_utcnow
|
|
7
7
|
|
|
8
8
|
from ..choices import NOTE_STATUSES
|
|
9
9
|
|
|
@@ -17,11 +17,14 @@ class NoteModelMixin(SiteModelMixin, BaseUuidModel):
|
|
|
17
17
|
|
|
18
18
|
report_model = models.CharField(max_length=150)
|
|
19
19
|
|
|
20
|
-
report_datetime = models.DateTimeField(default=
|
|
20
|
+
report_datetime = models.DateTimeField(default=timezone.now)
|
|
21
21
|
|
|
22
|
-
note = models.TextField(
|
|
22
|
+
note = models.TextField(
|
|
23
|
+
default="",
|
|
24
|
+
blank=True,
|
|
25
|
+
)
|
|
23
26
|
|
|
24
|
-
status = models.CharField(max_length=25, choices=NOTE_STATUSES,
|
|
27
|
+
status = models.CharField(max_length=25, choices=NOTE_STATUSES, default="", blank=False)
|
|
25
28
|
|
|
26
29
|
@property
|
|
27
30
|
def report_model_cls(self):
|
|
@@ -4,19 +4,19 @@ from django.db import models
|
|
|
4
4
|
class OnStudyMissingValuesModelMixin(models.Model):
|
|
5
5
|
original_id = models.UUIDField(null=True)
|
|
6
6
|
|
|
7
|
-
label_lower = models.CharField(max_length=150,
|
|
7
|
+
label_lower = models.CharField(max_length=150, default="")
|
|
8
8
|
|
|
9
9
|
subject_visit_id = models.UUIDField(null=True)
|
|
10
10
|
|
|
11
11
|
report_datetime = models.DateTimeField(null=True)
|
|
12
12
|
|
|
13
|
-
label = models.CharField(max_length=50,
|
|
13
|
+
label = models.CharField(max_length=50, default="")
|
|
14
14
|
|
|
15
|
-
visit_code = models.CharField(max_length=25,
|
|
15
|
+
visit_code = models.CharField(max_length=25, default="")
|
|
16
16
|
|
|
17
17
|
visit_code_sequence = models.IntegerField(null=True)
|
|
18
18
|
|
|
19
|
-
schedule_name = models.CharField(max_length=25,
|
|
19
|
+
schedule_name = models.CharField(max_length=25, default="")
|
|
20
20
|
|
|
21
21
|
modified = models.DateTimeField(null=True)
|
|
22
22
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
from django.contrib.sites.models import Site
|
|
2
2
|
from django.db import models
|
|
3
3
|
from django.db.models import DO_NOTHING, Index
|
|
4
|
-
|
|
5
|
-
from edc_utils import get_utcnow
|
|
4
|
+
from django.utils import timezone
|
|
6
5
|
|
|
7
6
|
from ..utils import recreate_db_view
|
|
8
7
|
from .qa_reports_permissions import qa_reports_permissions
|
|
@@ -15,7 +14,7 @@ class QaReportModelMixin(models.Model):
|
|
|
15
14
|
|
|
16
15
|
site = models.ForeignKey(Site, on_delete=DO_NOTHING)
|
|
17
16
|
|
|
18
|
-
created = models.DateTimeField(default=
|
|
17
|
+
created = models.DateTimeField(default=timezone.now)
|
|
19
18
|
|
|
20
19
|
def __str__(self):
|
|
21
20
|
return f"{self.subject_identifier}: {self.report_model}"
|
edc_qareports/models/note.py
CHANGED
|
@@ -21,11 +21,11 @@ class Note(NonUniqueSubjectIdentifierFieldMixin, NoteModelMixin):
|
|
|
21
21
|
class Meta(BaseUuidModel.Meta):
|
|
22
22
|
verbose_name = "Note"
|
|
23
23
|
verbose_name_plural = "Notes"
|
|
24
|
-
constraints =
|
|
24
|
+
constraints = (
|
|
25
25
|
UniqueConstraint(
|
|
26
26
|
fields=["report_model", "subject_identifier"],
|
|
27
27
|
name="%(app_label)s_%(class)s_report_model_subj_uniq",
|
|
28
|
-
)
|
|
29
|
-
|
|
28
|
+
),
|
|
29
|
+
)
|
|
30
30
|
indexes = BaseUuidModel.Meta.indexes
|
|
31
|
-
default_permissions = default_permissions
|
|
31
|
+
default_permissions = *default_permissions, "viewallsites"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from django.contrib.sites.models import Site
|
|
2
2
|
from django.db import models
|
|
3
|
-
|
|
4
|
-
from edc_utils import get_utcnow
|
|
3
|
+
from django.utils import timezone
|
|
5
4
|
|
|
6
5
|
from ..model_mixins import qa_reports_permissions
|
|
7
6
|
|
|
@@ -10,7 +9,7 @@ class QaReportLog(models.Model):
|
|
|
10
9
|
username = models.CharField(max_length=100)
|
|
11
10
|
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
|
12
11
|
report_model = models.CharField(max_length=100)
|
|
13
|
-
accessed = models.DateTimeField(default=
|
|
12
|
+
accessed = models.DateTimeField(default=timezone.now)
|
|
14
13
|
|
|
15
14
|
class Meta:
|
|
16
15
|
verbose_name = "QA Report Log"
|