clinicedc 2.0.0__py3-none-any.whl → 2.0.2__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.0.dist-info → clinicedc-2.0.2.dist-info}/METADATA +15 -22
- {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/RECORD +895 -792
- {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/WHEEL +1 -1
- edc_action_item/action.py +13 -32
- edc_action_item/action_with_notification.py +1 -2
- edc_action_item/admin/action_item_admin.py +2 -6
- edc_action_item/admin_site.py +1 -3
- edc_action_item/auths.py +1 -3
- edc_action_item/create_or_update_action_type.py +1 -3
- edc_action_item/data_fixers.py +7 -20
- edc_action_item/forms/action_item_form.py +1 -3
- edc_action_item/management/commands/inspect_action_items.py +3 -9
- edc_action_item/migrations/0001_initial.py +4 -5
- edc_action_item/migrations/0003_auto_20180116_1528.py +2 -1
- edc_action_item/migrations/0006_auto_20180707_1659.py +3 -4
- edc_action_item/migrations/0007_auto_20180707_1715.py +1 -3
- edc_action_item/migrations/0008_auto_20180809_0303.py +2 -1
- edc_action_item/migrations/0014_auto_20181121_1738.py +2 -6
- edc_action_item/migrations/0015_auto_20190114_0250.py +4 -3
- edc_action_item/migrations/0021_auto_20190628_2113.py +1 -3
- edc_action_item/migrations/0022_auto_20190628_2136.py +2 -6
- edc_action_item/migrations/0030_edcpermissions.py +1 -1
- edc_action_item/migrations/0033_alter_actionitem_managers.py +1 -0
- edc_action_item/migrations/0034_alter_actionitem_device_created_and_more.py +13 -37
- edc_action_item/migrations/0038_alter_actionitem_revision_alter_actiontype_revision_and_more.py +86 -0
- edc_action_item/models/action_item.py +2 -6
- edc_action_item/models/action_model_mixin.py +5 -16
- edc_action_item/models/action_type.py +1 -3
- edc_action_item/models/reference.py +1 -2
- edc_action_item/models/signals.py +3 -9
- edc_action_item/site_action_items.py +4 -12
- edc_action_item/templatetags/action_item_extras.py +1 -3
- edc_action_item/view_utils/action_item_button.py +1 -3
- edc_action_item/view_utils/action_item_popover_list_item.py +1 -2
- edc_adherence/migrations/0002_nonadherencereasons_plural_name.py +1 -3
- edc_adherence/model_admin_mixin.py +1 -3
- edc_adverse_event/action_items/ae_followup_action.py +2 -6
- edc_adverse_event/action_items/ae_initial_action.py +3 -7
- edc_adverse_event/auth_objects.py +2 -6
- edc_adverse_event/constants.py +1 -3
- edc_adverse_event/form_validator_mixins/death_report_form_validator.py +1 -3
- edc_adverse_event/form_validator_mixins/requires_death_report_form_validator_mixin.py +2 -7
- edc_adverse_event/form_validators/hospitalization.py +1 -3
- edc_adverse_event/migrations/0003_auto_20191026_2231.py +3 -9
- edc_adverse_event/migrations/0008_auto_20220825_0451.py +1 -1
- edc_adverse_event/migrations/0009_auto_20220907_0157.py +1 -1
- edc_adverse_event/migrations/0010_auto_20220913_2139.py +4 -12
- edc_adverse_event/migrations/0013_alter_aeactionclassification_device_created_and_more.py +11 -31
- edc_adverse_event/migrations/0015_alter_aeactionclassification_revision_and_more.py +74 -0
- edc_adverse_event/model_mixins/ae_followup/ae_followup_fields_model_mixin.py +1 -3
- edc_adverse_event/model_mixins/ae_followup/ae_followup_model_mixin.py +1 -5
- edc_adverse_event/model_mixins/ae_initial/ae_initial_ae_model_mixin.py +1 -3
- edc_adverse_event/model_mixins/ae_initial/ae_initial_fields_model_mixin.py +1 -3
- edc_adverse_event/model_mixins/ae_initial/ae_initial_susar_model_mixin.py +1 -2
- edc_adverse_event/model_mixins/ae_special_interest/aesi_model_mixin.py +1 -5
- edc_adverse_event/model_mixins/ae_susar/ae_susar_model_mixin.py +1 -5
- edc_adverse_event/model_mixins/ae_tmg/ae_tmg_fields_model_mixin.py +2 -6
- edc_adverse_event/model_mixins/ae_tmg/ae_tmg_model_mixin.py +1 -5
- edc_adverse_event/model_mixins/death_report/death_report_extra_fields_model_mixin.py +1 -2
- edc_adverse_event/model_mixins/death_report/death_report_model_mixin.py +2 -5
- edc_adverse_event/model_mixins/death_report/death_report_tmg_model_mixin.py +2 -7
- edc_adverse_event/model_mixins/death_report/simple_death_report_model_mixin.py +1 -3
- edc_adverse_event/modeladmin_mixins/ae_tmg_admin_mixin.py +1 -3
- edc_adverse_event/modeladmin_mixins/death_report_admin_mixin.py +6 -10
- edc_adverse_event/modelform_mixins/ae_tmg_modelform_mixin.py +1 -3
- edc_adverse_event/models/signals.py +3 -9
- edc_adverse_event/pdf_reports/ae_pdf_report.py +6 -18
- edc_adverse_event/pdf_reports/death_pdf_report.py +3 -9
- edc_adverse_event/templatetags/edc_adverse_event_extras.py +5 -15
- edc_adverse_event/utils.py +2 -6
- edc_adverse_event/view_mixins/ae/ae_listboard_view_mixin.py +1 -3
- edc_adverse_event/view_mixins/ae/death_report_listboard_view_mixin.py +1 -3
- edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +2 -6
- edc_adverse_event/view_utils/tmg_button.py +2 -6
- edc_adverse_event/views/home_view.py +1 -3
- edc_adverse_event/views/tmg/death_listboard_view.py +1 -3
- edc_adverse_event/views/tmg/home_view.py +2 -6
- edc_adverse_event/views/tmg/summary_listboard_view.py +1 -3
- edc_appconfig/apps.py +3 -2
- edc_appointment/admin/appointment_admin.py +1 -3
- edc_appointment/admin/list_filters.py +1 -3
- edc_appointment/admin_site.py +1 -3
- edc_appointment/analytics/dataframes/get_appointment_df.py +2 -6
- edc_appointment/appointment_reason_updater.py +2 -5
- edc_appointment/appointment_status_updater.py +1 -4
- edc_appointment/constants.py +1 -3
- edc_appointment/creators/appointment_creator.py +4 -10
- edc_appointment/creators/appointments_creator.py +3 -2
- edc_appointment/creators/unscheduled_appointment_creator.py +3 -7
- edc_appointment/creators/utils.py +4 -0
- edc_appointment/form_validator_mixins/next_appointment_crf_form_validator_mixin.py +3 -10
- edc_appointment/form_validator_mixins/window_period_form_validator_mixin.py +3 -9
- edc_appointment/form_validators/appointment_form_validator.py +11 -37
- edc_appointment/form_validators/next_appointment_crf_form_validator.py +1 -3
- edc_appointment/form_validators/utils.py +1 -3
- edc_appointment/managers.py +2 -6
- edc_appointment/migrations/0002_auto_20161126_1156.py +5 -8
- edc_appointment/migrations/0003_auto_20161127_2226.py +7 -16
- edc_appointment/migrations/0006_auto_20170106_2118.py +2 -1
- edc_appointment/migrations/0008_auto_20171115_1601.py +3 -4
- edc_appointment/migrations/0014_auto_20180116_1411.py +2 -1
- edc_appointment/migrations/0024_auto_20200911_0425.py +1 -1
- edc_appointment/migrations/0034_appointmenttype_alter_appointment_appt_type_and_more.py +2 -4
- edc_appointment/migrations/0036_auto_20230124_1822.py +2 -6
- edc_appointment/migrations/0040_appointment_appt_type_other_and_more.py +1 -0
- edc_appointment/migrations/0042_alter_appointment_device_created_and_more.py +5 -13
- edc_appointment/migrations/0046_infosources.py +1 -3
- edc_appointment/migrations/0047_alter_appointment_options_and_more.py +1 -3
- edc_appointment/migrations/0049_alter_appointment_revision_and_more.py +38 -0
- edc_appointment/model_mixins/appointment_methods_model_mixin.py +1 -5
- edc_appointment/model_mixins/appointment_model_mixin.py +7 -12
- edc_appointment/model_mixins/next_appointment_crf_model_mixin.py +1 -3
- edc_appointment/modeladmin_mixins/next_appointment_crf_modeladmin_mixin.py +1 -3
- edc_appointment/modelform_mixins/next_appointment_crf_modelform_mixins.py +1 -5
- edc_appointment/models/signals.py +5 -17
- edc_appointment/utils.py +11 -33
- edc_appointment/view_mixins/appointment_view_mixin.py +2 -6
- edc_auth/admin/list_filters.py +2 -6
- edc_auth/admin/role_admin.py +1 -3
- edc_auth/admin/user_admin.py +4 -12
- edc_auth/admin/user_profile_admin.py +2 -5
- edc_auth/auth_updater/auth_updater.py +1 -3
- edc_auth/forms.py +1 -3
- edc_auth/get_app_codenames.py +1 -3
- edc_auth/import_users.py +3 -9
- edc_auth/management/commands/export_users.py +1 -3
- edc_auth/management/commands/reset_password.py +1 -3
- edc_auth/migrations/0001_squashed_0033_alter_userprofile_is_multisite_viewer.py +4 -12
- edc_auth/migrations/0015_auto_20191026_2149.py +1 -3
- edc_auth/migrations/0016_auto_20191026_2153.py +1 -3
- edc_auth/migrations/0025_permissions.py +1 -1
- edc_auth/migrations/0029_alter_edcpermissions_device_created_and_more.py +5 -13
- edc_auth/migrations/0034_alter_edcpermissions_revision_alter_role_revision.py +38 -0
- edc_auth/models/__init__.py +1 -3
- edc_auth/models/signals.py +2 -6
- edc_auth/models/user_profile.py +1 -3
- edc_auth/password_setter.py +1 -3
- edc_auth/system_checks.py +1 -5
- edc_auth/urls_for_accounts.py +1 -3
- edc_auth/utils.py +3 -9
- edc_consent/actions.py +3 -9
- edc_consent/consent_definition.py +5 -8
- edc_consent/consent_definition_extension.py +4 -12
- edc_consent/field_mixins/citizen_fields_mixin.py +2 -4
- edc_consent/field_mixins/identity_fields_mixin.py +1 -2
- edc_consent/field_mixins/personal_fields_mixin.py +8 -3
- edc_consent/field_mixins/site_fields_mixin.py +1 -2
- edc_consent/form_validators/subject_consent_form_validator.py +4 -8
- edc_consent/migrations/0001_initial.py +1 -1
- edc_consent/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_consent/migrations/0005_alter_edcpermissions_revision.py +26 -0
- edc_consent/model_mixins/consent_extension_model_mixin.py +2 -3
- edc_consent/model_mixins/consent_model_mixin.py +3 -9
- edc_consent/modeladmin_mixins/consent_model_admin_mixin.py +7 -17
- edc_consent/modelform_mixins/consent_modelform_mixin/consent_modelform_validation_mixin.py +6 -10
- edc_consent/modelform_mixins/requires_consent_modelform_mixin.py +1 -3
- edc_consent/models/signals.py +3 -6
- edc_consent/site_consents.py +6 -17
- edc_consent/system_checks.py +3 -9
- edc_consent/validators.py +1 -2
- edc_consent/view_mixins/consent_view_mixins.py +3 -5
- edc_crf/crf_form_validator.py +4 -7
- edc_crf/crf_form_validator_mixins.py +2 -6
- edc_crf/migrations/0004_alter_crfstatus_device_created_and_more.py +3 -7
- edc_crf/migrations/0008_alter_crfstatus_revision.py +26 -0
- edc_crf/utils.py +1 -3
- edc_dashboard/management/commands/update_search_slugs.py +1 -3
- edc_dashboard/migrations/0001_initial.py +1 -1
- edc_dashboard/migrations/0003_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_dashboard/migrations/0005_alter_edcpermissions_revision.py +26 -0
- edc_dashboard/templatetags/edc_dashboard_extras.py +2 -6
- edc_dashboard/view_mixins/administration_view_mixin.py +1 -3
- edc_dashboard/view_mixins/edc_view_mixin.py +1 -3
- edc_dashboard/views/administration_view.py +1 -3
- edc_data_manager/action_items.py +1 -3
- edc_data_manager/admin/actions.py +3 -9
- edc_data_manager/admin/data_query_admin.py +4 -12
- edc_data_manager/admin/query_rule_admin.py +4 -13
- edc_data_manager/auths.py +1 -3
- edc_data_manager/forms/data_query.py +2 -6
- edc_data_manager/forms/query_rule.py +1 -3
- edc_data_manager/get_longitudinal_value.py +2 -5
- edc_data_manager/handlers/handlers.py +2 -6
- edc_data_manager/migrations/0001_initial.py +4 -3
- edc_data_manager/migrations/0003_auto_20190806_1749.py +2 -6
- edc_data_manager/migrations/0004_auto_20190806_1750.py +1 -3
- edc_data_manager/migrations/0025_edcpermissions.py +1 -1
- edc_data_manager/migrations/0027_alter_dataquery_dm_user.py +1 -1
- edc_data_manager/migrations/0028_alter_dataquery_options_alter_queryrule_options_and_more.py +2 -1
- edc_data_manager/migrations/0029_alter_dataquery_managers.py +2 -1
- edc_data_manager/migrations/0030_alter_datadictionary_device_created_and_more.py +15 -43
- edc_data_manager/migrations/0039_alter_datadictionary_revision_and_more.py +101 -0
- edc_data_manager/models/model_mixins.py +1 -3
- edc_data_manager/populate_data_dictionary.py +1 -2
- edc_data_manager/post_migrate_signals.py +1 -3
- edc_data_manager/site_data_manager.py +1 -3
- edc_document_status/model_mixins.py +1 -3
- edc_egfr/__init__.py +1 -0
- edc_egfr/admin/__init__.py +1 -0
- edc_egfr/admin/egfr_drop_notification_admin_mixin.py +73 -0
- edc_egfr/apps.py +5 -0
- edc_egfr/calculators/__init__.py +4 -0
- edc_egfr/calculators/base_egrfr.py +56 -0
- edc_egfr/calculators/egfr_ckd_epi.py +68 -0
- edc_egfr/calculators/egfr_cockcroft_gault.py +63 -0
- edc_egfr/calculators/percent_change.py +7 -0
- edc_egfr/constants.py +1 -0
- edc_egfr/egfr.py +237 -0
- edc_egfr/form_validator_mixins/__init__.py +4 -0
- edc_egfr/form_validator_mixins/egfr_form_validator_mixins.py +55 -0
- edc_egfr/get_drop_notification_model.py +10 -0
- edc_egfr/get_egfr_for_subject.py +31 -0
- edc_egfr/model_mixins/__init__.py +2 -0
- edc_egfr/model_mixins/egfr_drop_notification_model_mixin.py +63 -0
- edc_egfr/model_mixins/egfr_model_mixin.py +120 -0
- edc_export/archive_exporter.py +2 -6
- edc_export/exportables.py +2 -6
- edc_export/files_emailer.py +1 -3
- edc_export/management/commands/import_receipts.py +1 -3
- edc_export/managers.py +3 -9
- edc_export/migrations/0001_initial.py +15 -36
- edc_export/migrations/0005_exportdata_importdata.py +1 -3
- edc_export/migrations/0006_auto_20200512_0208.py +2 -6
- edc_export/migrations/0010_auto_20210910_1636.py +2 -6
- edc_export/migrations/0013_edcpermissions.py +1 -1
- edc_export/migrations/0015_alter_datarequest_managers_and_more.py +2 -1
- edc_export/migrations/0016_alter_datarequest_device_created_and_more.py +27 -79
- edc_export/migrations/0017_alter_datarequest_options_and_more.py +2 -6
- edc_export/migrations/0020_remove_datarequesthistory_edc_export__exporte_ba8050_idx_and_more.py +2 -6
- edc_export/migrations/0021_alter_datarequest_revision_and_more.py +173 -0
- edc_export/model_exporter/model_exporter.py +4 -15
- edc_export/model_exporter/object_history_helpers.py +1 -3
- edc_export/model_exporter/value_getter.py +5 -14
- edc_export/models/signals.py +1 -3
- edc_export/models/upload_export_receipt_file.py +1 -3
- edc_export/utils.py +1 -4
- edc_export/views/export_selected_models_view.py +6 -17
- edc_facility/default_definitions.py +1 -3
- edc_facility/facility.py +4 -14
- edc_facility/import_holidays.py +1 -3
- edc_facility/migrations/0005_healthfacility_healthfacilitytypes_and_more.py +4 -6
- edc_facility/migrations/0006_alter_healthfacility_health_facility_type.py +1 -1
- edc_facility/migrations/0008_alter_healthfacility_device_created_and_more.py +5 -13
- edc_facility/migrations/0015_alter_healthfacility_revision_and_more.py +38 -0
- edc_facility/models/holiday.py +1 -3
- edc_facility/utils.py +1 -3
- edc_fieldsets/fieldsets_modeladmin_mixin.py +1 -3
- edc_form_describer/form_describer.py +3 -9
- edc_form_describer/make_forms_reference.py +1 -3
- edc_form_describer/management/commands/make_forms_reference.py +1 -3
- edc_form_runners/admin/issue_admin.py +2 -6
- edc_form_runners/form_runner.py +4 -13
- edc_form_runners/form_runner_by_scr_id.py +1 -3
- edc_form_runners/get_form_runner.py +1 -3
- edc_form_runners/get_form_runner_by_src_id.py +3 -3
- edc_form_runners/management/commands/run_form_runners.py +1 -3
- edc_form_runners/migrations/0001_initial.py +2 -4
- edc_form_runners/migrations/0004_alter_issue_revision.py +26 -0
- edc_form_runners/run_form_runners.py +1 -3
- edc_form_runners/utils.py +1 -3
- edc_form_validators/applicable_field_validator.py +6 -17
- edc_form_validators/base_form_validator.py +1 -3
- edc_form_validators/date_range_validator.py +4 -12
- edc_form_validators/date_validator.py +3 -9
- edc_form_validators/many_to_many_field_validator.py +1 -3
- edc_form_validators/other_specify_field_validator.py +3 -7
- edc_form_validators/range_field_validator.py +1 -3
- edc_form_validators/required_field_validator.py +5 -18
- edc_glucose/__init__.py +0 -0
- edc_glucose/apps.py +6 -0
- edc_glucose/constants.py +3 -0
- edc_glucose/fieldsets.py +14 -0
- edc_glucose/form_validators/__init__.py +6 -0
- edc_glucose/form_validators/fasting_form_validator.py +12 -0
- edc_glucose/form_validators/fbg_form_validator_mixin.py +32 -0
- edc_glucose/form_validators/fbg_ogtt_form_validator_mixin.py +47 -0
- edc_glucose/form_validators/glucose_form_validator.py +44 -0
- edc_glucose/form_validators/glucose_form_validator_mixin.py +53 -0
- edc_glucose/form_validators/ogtt_form_validator_mixin.py +91 -0
- edc_glucose/list_filters.py +42 -0
- edc_glucose/migrations/__init__.py +0 -0
- edc_glucose/model_mixin_factories/__init__.py +4 -0
- edc_glucose/model_mixin_factories/fasting_model_mixin_factory.py +63 -0
- edc_glucose/model_mixin_factories/fbg_model_mixin_factory.py +48 -0
- edc_glucose/model_mixin_factories/glucose_model_mixin_factory.py +49 -0
- edc_glucose/model_mixin_factories/ogtt_model_mixin_factory.py +71 -0
- edc_glucose/model_mixins/__init__.py +5 -0
- edc_glucose/model_mixins/fasting_model_mixin.py +15 -0
- edc_glucose/model_mixins/fbg_model_mixin.py +10 -0
- edc_glucose/model_mixins/glucose_model_mixin.py +17 -0
- edc_glucose/model_mixins/hba1c_model_mixin.py +42 -0
- edc_glucose/model_mixins/ogtt_model_mixin.py +10 -0
- edc_glucose/models.py +0 -0
- edc_glucose/utils.py +42 -0
- edc_identifier/admin_site.py +1 -3
- edc_identifier/identifier.py +1 -3
- edc_identifier/migrations/0001_initial.py +3 -4
- edc_identifier/migrations/0001_squashed_0018_auto_20180128_1054.py +3 -2
- edc_identifier/migrations/0005_alter_identifiermodel_managers.py +2 -1
- edc_identifier/migrations/0005_historicalidentifierhistory_historicalidentifiertracker_historicalsubjectidentifier.py +4 -5
- edc_identifier/migrations/0006_auto_20161127_2226.py +16 -43
- edc_identifier/migrations/0007_alter_identifiermodel_device_created_and_more.py +3 -7
- edc_identifier/migrations/0007_auto_20161204_2227.py +4 -7
- edc_identifier/migrations/0009_auto_20161221_2323.py +1 -0
- edc_identifier/migrations/0010_alter_identifiermodel_revision.py +26 -0
- edc_identifier/migrations/0010_auto_20170112_0602.py +2 -1
- edc_identifier/migrations/0012_auto_20171116_1606.py +2 -1
- edc_identifier/migrations/0013_auto_20171230_1316.py +3 -9
- edc_identifier/research_identifier.py +3 -11
- edc_identifier/short_identifier.py +5 -9
- edc_identifier/utils.py +1 -3
- edc_lab/admin/modeladmin_mixins.py +2 -8
- edc_lab/aliquot_types.py +1 -3
- edc_lab/form_validators/requisition_form_validator_mixin.py +1 -3
- edc_lab/forms/box_type_form.py +4 -6
- edc_lab/lab/aliquot_type.py +2 -6
- edc_lab/lab/manifest.py +2 -6
- edc_lab/lab/primary_aliquot.py +1 -3
- edc_lab/lab/requisition_panel.py +1 -3
- edc_lab/lab/requisition_panel_group.py +2 -6
- edc_lab/lab/specimen.py +1 -3
- edc_lab/labels/aliquot_label.py +4 -6
- edc_lab/labels/manifest_label.py +1 -3
- edc_lab/migrations/0001_initial.py +12 -29
- edc_lab/migrations/0002_auto_20170305_1939.py +4 -12
- edc_lab/migrations/0007_auto_20170321_1119.py +2 -6
- edc_lab/migrations/0008_auto_20170921_0719.py +2 -1
- edc_lab/migrations/0010_auto_20171127_1541.py +3 -2
- edc_lab/migrations/0012_auto_20180114_1438.py +2 -1
- edc_lab/migrations/0013_auto_20180117_1438.py +2 -1
- edc_lab/migrations/0022_auto_20211210_1839.py +1 -0
- edc_lab/migrations/0024_alter_manifestitem_managers.py +2 -1
- edc_lab/migrations/0027_alter_aliquot_managers_alter_box_managers_and_more.py +1 -1
- edc_lab/migrations/0028_alter_aliquot_device_created_and_more.py +43 -127
- edc_lab/migrations/0035_alter_aliquot_revision_alter_box_revision_and_more.py +266 -0
- edc_lab/model_mixins/aliquot/aliquot_label_mixin.py +1 -3
- edc_lab/model_mixins/aliquot/aliquot_model_mixin.py +4 -12
- edc_lab/model_mixins/requisition/requisition_identifier_mixin.py +1 -3
- edc_lab/model_mixins/shipping/manifest_model_mixin.py +1 -3
- edc_lab/models/box_item.py +1 -3
- edc_lab/models/box_type.py +1 -3
- edc_lab/models/manifest/manifest.py +3 -9
- edc_lab/models/manifest/manifest_item.py +1 -3
- edc_lab/models/order.py +1 -3
- edc_lab/models/signals.py +1 -3
- edc_lab/patterns.py +1 -3
- edc_lab/pdf_reports/manifest_pdf_report.py +9 -27
- edc_lab/post_migrate_signals.py +1 -3
- edc_lab/site_labs.py +4 -10
- edc_lab_dashboard/migrations/0001_initial.py +1 -1
- edc_lab_dashboard/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_lab_dashboard/migrations/0004_alter_edcpermissions_revision.py +26 -0
- edc_lab_dashboard/view_mixins/box_view_mixin.py +1 -3
- edc_lab_dashboard/view_mixins/manifest_view_mixin.py +4 -12
- edc_lab_dashboard/views/action_views/receive_view.py +1 -3
- edc_lab_dashboard/views/action_views/verify_box_item_view.py +1 -3
- edc_lab_dashboard/views/listboard_filters/aliquot_listboard_view_filters.py +2 -6
- edc_lab_dashboard/views/listboard_filters/manifest_listboard_filters.py +1 -3
- edc_lab_dashboard/views/listboard_views/base_box_item_listboard_view.py +1 -3
- edc_lab_dashboard/views/listboard_views/manifest_listboard_view.py +1 -3
- edc_lab_dashboard/views/listboard_views/process_listboard_view.py +2 -6
- edc_lab_dashboard/views/listboard_views/receive_listboard_view.py +2 -6
- edc_lab_dashboard/views/listboard_views/requisition_listboard_view.py +2 -6
- edc_lab_results/action_items.py +1 -3
- edc_lab_results/form_validator_mixins/blood_results_fbg_form_validator_mixin.py +2 -4
- edc_lab_results/form_validator_mixins/blood_results_form_validator_mixin.py +1 -3
- edc_lab_results/get_summary.py +3 -5
- edc_lab_results/model_mixin_factories/__init__.py +10 -0
- edc_lab_results/{model_mixin_factory → model_mixin_factories}/field_attrs.py +8 -8
- edc_lab_results/{model_mixin_factory → model_mixin_factories}/reportable_result_model_mixin_factory.py +2 -0
- edc_lab_results/{model_mixin_factory → model_mixin_factories}/result_model_mixin_factory.py +2 -0
- edc_lab_results/model_mixins/blood_result_model_mixin.py +2 -5
- edc_lab_results/model_mixins/electrolytes_model_mixins.py +1 -1
- edc_lab_results/model_mixins/fbc_model_mixins.py +1 -1
- edc_lab_results/model_mixins/fbg_model_mixin.py +6 -3
- edc_lab_results/model_mixins/glucose_model_mixin.py +2 -2
- edc_lab_results/model_mixins/hba1c_model_mixin.py +2 -28
- edc_lab_results/model_mixins/insulin_model_mixin.py +5 -11
- edc_lab_results/model_mixins/lft_model_mixins.py +1 -1
- edc_lab_results/model_mixins/lipid_model_mixins.py +1 -1
- edc_lab_results/model_mixins/proteinuria_model_mixin.py +1 -1
- edc_lab_results/model_mixins/rft_model_mixins.py +1 -1
- edc_label/apps.py +1 -2
- edc_label/migrations/0001_initial.py +1 -1
- edc_label/migrations/0003_alter_zpllabeltemplates_device_created_and_more.py +3 -7
- edc_label/migrations/0006_alter_zpllabeltemplates_revision.py +29 -0
- edc_label/printer.py +2 -6
- edc_label/printers_mixin.py +1 -3
- edc_label/urls.py +1 -3
- edc_label/view_mixins.py +1 -3
- edc_label/views/print_label_view.py +1 -3
- edc_list_data/model_mixins.py +1 -3
- edc_list_data/preload_data.py +2 -6
- edc_list_data/site_list_data.py +1 -3
- edc_listboard/migrations/0001_initial.py +1 -1
- edc_listboard/migrations/0003_alter_listboard_device_created_and_more.py +3 -7
- edc_listboard/migrations/0006_alter_listboard_revision.py +29 -0
- edc_listboard/view_mixins/listboard_filter_view_mixin.py +5 -15
- edc_listboard/view_mixins/search_listboard_view_mixin.py +2 -6
- edc_listboard/views/listboard_view.py +2 -6
- edc_listboard/views/screen/screening_listboard_view.py +1 -3
- edc_listboard/views/subject/subject_listboard_view.py +1 -3
- edc_locator/forms/subject_locator_form_validator.py +4 -12
- edc_locator/migrations/0001_initial.py +3 -2
- edc_locator/migrations/0003_auto_20180103_1351.py +2 -1
- edc_locator/migrations/0004_auto_20180106_2148.py +2 -1
- edc_locator/migrations/0007_auto_20180117_1819.py +2 -1
- edc_locator/migrations/0011_auto_20181007_0053.py +1 -1
- edc_locator/migrations/0013_auto_20181007_0054.py +2 -3
- edc_locator/migrations/0014_auto_20181009_0545.py +1 -0
- edc_locator/migrations/0032_alter_subjectlocator_managers.py +1 -1
- edc_locator/migrations/0034_alter_historicalsubjectlocator_device_created_and_more.py +5 -13
- edc_locator/migrations/0039_alter_historicalsubjectlocator_revision_and_more.py +38 -0
- edc_locator/modeladmin_mixins.py +1 -3
- edc_locator/view_mixins/subject_locator_view_mixins.py +1 -3
- edc_ltfu/admin.py +1 -3
- edc_ltfu/forms/ltfu_form.py +1 -3
- edc_ltfu/forms/ltfu_form_validator_mixin.py +1 -2
- edc_ltfu/modelform_mixins.py +3 -8
- edc_metadata/admin/modeladmin_mixins.py +2 -8
- edc_metadata/management/commands/validate_entry_status.py +1 -3
- edc_metadata/metadata/metadata.py +12 -41
- edc_metadata/metadata/metadata_getter.py +2 -9
- edc_metadata/metadata/requisition_metadata_getter.py +1 -3
- edc_metadata/metadata_handler.py +3 -9
- edc_metadata/metadata_helper/metadata_helper_mixin.py +1 -3
- edc_metadata/metadata_mixins/source_model_metadata_mixin.py +3 -9
- edc_metadata/metadata_refresher.py +3 -9
- edc_metadata/metadata_rules/crf/crf_rule_group.py +2 -5
- edc_metadata/metadata_rules/persistant_singleton_mixin.py +3 -3
- edc_metadata/metadata_rules/requisition/requisition_rule_group.py +1 -2
- edc_metadata/metadata_rules/rule_evaluator.py +1 -3
- edc_metadata/metadata_rules/rule_group.py +2 -6
- edc_metadata/metadata_rules/rule_group_meta_options.py +1 -3
- edc_metadata/metadata_updater.py +1 -3
- edc_metadata/metadata_wrappers/metadata_wrapper.py +1 -3
- edc_metadata/migrations/0001_initial.py +2 -1
- edc_metadata/migrations/0002_auto_20161127_2226.py +6 -13
- edc_metadata/migrations/0005_auto_20170112_0602.py +2 -1
- edc_metadata/migrations/0007_auto_20170810_1032.py +2 -1
- edc_metadata/migrations/0009_auto_20180116_1528.py +2 -1
- edc_metadata/migrations/0014_auto_20190707_0002.py +1 -1
- edc_metadata/migrations/0015_auto_20190709_0009.py +3 -5
- edc_metadata/migrations/0021_alter_crfmetadata_managers_and_more.py +1 -1
- edc_metadata/migrations/0023_alter_crfmetadata_device_created_and_more.py +5 -13
- edc_metadata/migrations/0030_alter_crfmetadata_revision_and_more.py +38 -0
- edc_metadata/model_mixins/creates/creates_metadata_model_mixin.py +1 -3
- edc_metadata/model_mixins/updates/updates_metadata_model_mixin.py +1 -3
- edc_metadata/models/crf_metadata_model_mixin.py +2 -6
- edc_metadata/next_form_getter.py +1 -3
- edc_metadata/requisition/requisition_metadata_handler.py +3 -2
- edc_metadata/requisition/requisition_metadata_updater.py +1 -3
- edc_metadata/update_metadata_on_schedule_change.py +7 -14
- edc_model/models/fields/initials_field.py +1 -3
- edc_model/models/signals.py +1 -3
- edc_model/system_checks.py +1 -3
- edc_model/validators/duration.py +1 -3
- edc_model_admin/admin_site.py +1 -3
- edc_model_admin/changelist_buttons/model_admin_changelist_button_mixin.py +4 -12
- edc_model_admin/changelist_buttons/model_admin_changelist_model_button_mixin.py +1 -3
- edc_model_admin/dashboard/model_admin_crf_dashboard_mixin.py +1 -3
- edc_model_admin/dashboard/model_admin_dashboard_mixin.py +1 -3
- edc_model_admin/mixins/base_model_admin_redirect_mixin.py +2 -6
- edc_model_admin/mixins/inlines/limited_admin_inline_mixin.py +1 -3
- edc_model_admin/mixins/model_admin_bypass_default_form_cls_mixin.py +4 -12
- edc_model_admin/mixins/model_admin_form_auto_number_mixin.py +2 -6
- edc_model_admin/mixins/model_admin_form_instructions_mixin.py +2 -6
- edc_model_admin/mixins/model_admin_next_url_redirect_mixin.py +3 -9
- edc_model_admin/mixins/model_admin_protect_pii_mixin.py +1 -3
- edc_model_admin/mixins/model_admin_redirect_all_to_changelist_mixin.py +2 -6
- edc_model_admin/mixins/model_admin_redirect_on_delete_mixin.py +1 -3
- edc_model_admin/templatetags/edc_admin_modify.py +3 -9
- edc_model_fields/fields/initials_field.py +1 -3
- edc_model_form/mixins/inline_model_form_mixin.py +5 -9
- edc_model_to_dataframe/model_to_dataframe.py +15 -46
- edc_navbar/get_default_navbar.py +1 -3
- edc_navbar/migrations/0004_auto_20220825_0451.py +1 -1
- edc_navbar/migrations/0006_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_navbar/migrations/0008_alter_edcpermissions_revision.py +26 -0
- edc_navbar/navbar.py +1 -3
- edc_navbar/navbar_item.py +1 -3
- edc_navbar/site_navbars.py +2 -6
- edc_navbar/templatetags/edc_navbar_extras.py +1 -3
- edc_notification/admin_site.py +1 -3
- edc_notification/mailing_list_manager.py +5 -15
- edc_notification/migrations/0001_initial.py +2 -1
- edc_notification/migrations/0008_alter_notification_device_created_and_more.py +3 -7
- edc_notification/migrations/0010_alter_notification_revision.py +26 -0
- edc_notification/modeladmin_mixins.py +1 -3
- edc_notification/models/notification.py +1 -3
- edc_notification/models/signals.py +3 -10
- edc_notification/notification/model_notification.py +3 -9
- edc_notification/notification/notification.py +4 -12
- edc_notification/site_notifications.py +5 -14
- edc_offstudy/migrations/0001_initial.py +2 -1
- edc_offstudy/migrations/0002_auto_20180921_0434.py +4 -3
- edc_offstudy/migrations/0008_auto_20191102_0033.py +2 -1
- edc_offstudy/migrations/0015_auto_20220925_0032.py +1 -1
- edc_offstudy/migrations/0016_auto_20220929_1742.py +1 -0
- edc_offstudy/migrations/0018_alter_subjectoffstudy_managers.py +2 -1
- edc_offstudy/migrations/0019_alter_historicalsubjectoffstudy_device_created_and_more.py +5 -13
- edc_offstudy/migrations/0022_alter_historicalsubjectoffstudy_revision_and_more.py +41 -0
- edc_offstudy/model_mixins/offstudy_model_mixin.py +3 -3
- edc_offstudy/modelform_mixins/crf/offstudy_crf_modelform_mixin.py +2 -6
- edc_offstudy/templatetags/edc_offstudy_extras.py +2 -6
- edc_offstudy/utils.py +1 -3
- edc_pdf_reports/admin/modeladmin_mixins.py +1 -3
- edc_pdf_reports/crf_pdf_report.py +3 -9
- edc_pdf_reports/flowables/textbox.py +1 -3
- edc_pdf_reports/report.py +6 -18
- edc_pdf_reports/utils.py +1 -3
- edc_pdf_reports/views/pdf_intermediate_view.py +1 -3
- edc_pdf_reports/views/print_pdf_report_view.py +2 -6
- edc_pdutils/actions.py +4 -12
- edc_pdutils/choices.py +1 -4
- edc_pdutils/database.py +1 -3
- edc_pdutils/df_exporters/csv_crf_inline_tables_exporter.py +4 -12
- edc_pdutils/df_exporters/csv_exporter.py +7 -22
- edc_pdutils/df_handlers/crf_df_handler.py +3 -9
- edc_pdutils/df_handlers/df_handler.py +1 -3
- edc_pdutils/df_handlers/registered_subject_df_handler.py +1 -3
- edc_pdutils/management/commands/export_models.py +2 -6
- edc_pdutils/migrations/0001_initial.py +6 -9
- edc_pdutils/site.py +2 -6
- edc_pdutils/site_values_mappings.py +3 -9
- edc_pdutils/tables/aliquot.py +2 -9
- edc_pdutils/tables/consent.py +2 -6
- edc_pdutils/tables/crf.py +4 -12
- edc_pdutils/tables/requisition.py +4 -12
- edc_pdutils/tables/visit.py +1 -3
- edc_pdutils/utils/convert_dates_from_model.py +3 -9
- edc_pdutils/utils/convert_numerics_from_model.py +1 -3
- edc_pdutils/utils/convert_timedelta_from_model.py +1 -3
- edc_pdutils/utils/missing_subject_identifiers.py +1 -3
- edc_pharmacy/admin/actions/confirm_stock.py +2 -6
- edc_pharmacy/admin/actions/delete_order_items.py +1 -3
- edc_pharmacy/admin/actions/delete_receive_items.py +1 -3
- edc_pharmacy/admin/actions/print_stock_report.py +1 -3
- edc_pharmacy/admin/list_filters.py +5 -17
- edc_pharmacy/admin/model_admin_mixin.py +1 -3
- edc_pharmacy/admin/prescription/rx_admin.py +2 -6
- edc_pharmacy/admin/prescription/rx_refill_admin.py +1 -3
- edc_pharmacy/admin/reports/stock_availability_admin.py +1 -5
- edc_pharmacy/admin/stock/allocation_admin.py +5 -15
- edc_pharmacy/admin/stock/allocation_proxy_admin.py +1 -3
- edc_pharmacy/admin/stock/confirmation_admin.py +1 -3
- edc_pharmacy/admin/stock/confirmation_at_site_admin.py +4 -12
- edc_pharmacy/admin/stock/confirmation_at_site_item_admin.py +5 -17
- edc_pharmacy/admin/stock/dispense_admin.py +3 -11
- edc_pharmacy/admin/stock/dispense_item_admin.py +4 -14
- edc_pharmacy/admin/stock/order_admin.py +1 -3
- edc_pharmacy/admin/stock/order_item_admin.py +5 -15
- edc_pharmacy/admin/stock/receive_admin.py +4 -12
- edc_pharmacy/admin/stock/receive_item_admin.py +4 -12
- edc_pharmacy/admin/stock/repack_request_admin.py +2 -6
- edc_pharmacy/admin/stock/stock_adjustment_admin.py +1 -3
- edc_pharmacy/admin/stock/stock_admin.py +8 -24
- edc_pharmacy/admin/stock/stock_proxy_admin.py +1 -5
- edc_pharmacy/admin/stock/stock_request_admin.py +5 -4
- edc_pharmacy/admin/stock/stock_request_item_admin.py +10 -19
- edc_pharmacy/admin/stock/stock_transfer_admin.py +4 -12
- edc_pharmacy/admin/stock/stock_transfer_item_admin.py +6 -18
- edc_pharmacy/admin/stock/storage_bin_admin.py +3 -11
- edc_pharmacy/admin/stock/storage_bin_item_admin.py +4 -14
- edc_pharmacy/analytics/dataframes/get_next_scheduled_visit_for_subjects_df.py +1 -1
- edc_pharmacy/analytics/dataframes/in_stock_for_subjects_df.py +2 -6
- edc_pharmacy/analytics/dataframes/stock_for_subjects.py +1 -3
- edc_pharmacy/form_validators/crf/study_medication_form_validator.py +9 -27
- edc_pharmacy/forms/stock/container_form.py +2 -6
- edc_pharmacy/forms/stock/receive_item_form.py +2 -6
- edc_pharmacy/forms/stock/repack_request_form.py +4 -11
- edc_pharmacy/forms/stock/stock_request_form.py +1 -0
- edc_pharmacy/forms/stock/stock_request_item_form.py +1 -3
- edc_pharmacy/labels/draw_bulk_stock_label_code128.py +1 -3
- edc_pharmacy/labels/draw_bulk_stock_label_code39.py +3 -9
- edc_pharmacy/labels/draw_patient_stock_label_code128.py +1 -3
- edc_pharmacy/migrations/0001_initial.py +7 -15
- edc_pharmacy/migrations/0005_alter_rx_managers.py +2 -1
- edc_pharmacy/migrations/0015_auto_20220913_2139.py +9 -22
- edc_pharmacy/migrations/0016_auto_20220929_1742.py +2 -1
- edc_pharmacy/migrations/0018_alter_rxrefill_managers.py +1 -1
- edc_pharmacy/migrations/0020_alter_box_device_created_alter_box_device_modified_and_more.py +71 -211
- edc_pharmacy/migrations/0021_alter_box_options_alter_container_options_and_more.py +1 -1
- edc_pharmacy/migrations/0023_remove_rx_edc_pharmac_modifie_986021_idx_and_more.py +1 -3
- edc_pharmacy/migrations/0024_allocation_assignment_containerunits_dispense_and_more.py +40 -104
- edc_pharmacy/migrations/0031_historicalrepackrequest_task_id_and_more.py +2 -1
- edc_pharmacy/migrations/0033_container_display_name_and_more.py +1 -3
- edc_pharmacy/migrations/0035_container_max_per_subject_and_more.py +2 -6
- edc_pharmacy/migrations/0037_remove_historicalstock_confirmed_at_site_by_and_more.py +2 -6
- edc_pharmacy/migrations/0039_remove_dispense_registered_subject_and_more.py +7 -9
- edc_pharmacy/migrations/0043_stockproxy_alter_historicallot_lot_no_and_more.py +2 -1
- edc_pharmacy/migrations/0049_remove_stocktransferconfirmation_stock_and_more.py +5 -13
- edc_pharmacy/migrations/0050_remove_stocktransferconfirmation2_location_and_more.py +2 -6
- edc_pharmacy/migrations/0051_alter_historicalstocktransferconfirmationitem_options_and_more.py +2 -1
- edc_pharmacy/migrations/0053_alter_location_managers_alter_historicalstock_lot_and_more.py +7 -11
- edc_pharmacy/migrations/0057_scanduplicates.py +3 -4
- edc_pharmacy/migrations/0058_stockrequestproxy_alter_stockproxy_options.py +2 -1
- edc_pharmacy/migrations/0060_alter_container_max_per_subject_and_more.py +8 -14
- edc_pharmacy/migrations/0061_alter_historicalstocktransferconfirmation_options_and_more.py +1 -1
- edc_pharmacy/migrations/0062_auto_20250312_1433.py +2 -6
- edc_pharmacy/migrations/0063_alter_allocation_managers_remove_allocation_site_and_more.py +2 -1
- edc_pharmacy/migrations/0065_allocationproxy.py +2 -1
- edc_pharmacy/migrations/0068_stockout.py +2 -1
- edc_pharmacy/migrations/0076_historicalstockadjustment_stockadjustment.py +5 -8
- edc_pharmacy/migrations/0077_historicalstockadjustment_adjustment_datetime_and_more.py +2 -1
- edc_pharmacy/migrations/0078_alter_historicalstock_qty_and_more.py +2 -1
- edc_pharmacy/migrations/0081_historicalconfirmation_confirmation.py +8 -10
- edc_pharmacy/migrations/0084_confirmationatsiteitem_and_more.py +2 -2
- edc_pharmacy/migrations/0088_alter_allocation_revision_alter_assignment_revision_and_more.py +794 -0
- edc_pharmacy/model_mixins/study_medication_crf_model_mixin.py +3 -9
- edc_pharmacy/models/medication/dosage_guideline.py +1 -3
- edc_pharmacy/models/medication/formulation.py +1 -3
- edc_pharmacy/models/prescription/rx.py +1 -3
- edc_pharmacy/models/prescription/rx_refill.py +2 -6
- edc_pharmacy/models/signals.py +11 -21
- edc_pharmacy/models/stock/allocation.py +3 -9
- edc_pharmacy/models/stock/confirmation.py +1 -3
- edc_pharmacy/models/stock/confirmation_at_site_item.py +1 -3
- edc_pharmacy/models/stock/container.py +1 -3
- edc_pharmacy/models/stock/dispense.py +1 -3
- edc_pharmacy/models/stock/dispense_item.py +1 -3
- edc_pharmacy/models/stock/lot.py +1 -3
- edc_pharmacy/models/stock/order_item.py +2 -6
- edc_pharmacy/models/stock/product.py +2 -6
- edc_pharmacy/models/stock/receive_item.py +4 -12
- edc_pharmacy/models/stock/repack_request.py +1 -3
- edc_pharmacy/models/stock/stock.py +3 -8
- edc_pharmacy/models/stock/stock_request_item.py +4 -4
- edc_pharmacy/models/stock/stock_transfer_item.py +1 -3
- edc_pharmacy/models/stock/supplier.py +1 -3
- edc_pharmacy/models/storage/utils.py +1 -4
- edc_pharmacy/pdf_reports/manifest_pdf_report.py +3 -9
- edc_pharmacy/pdf_reports/stock_pdf_report.py +6 -11
- edc_pharmacy/refill/adjust_previous_end_datetime.py +2 -6
- edc_pharmacy/refill/create_next_refill.py +1 -3
- edc_pharmacy/refill/create_refill.py +1 -3
- edc_pharmacy/refill/refill_creator.py +2 -6
- edc_pharmacy/sample_usb_printing/network_printers.py +1 -3
- edc_pharmacy/settings.py +3 -9
- edc_pharmacy/urls.py +1 -3
- edc_pharmacy/utils/allocate_stock.py +1 -3
- edc_pharmacy/utils/confirm_stock_at_site.py +3 -5
- edc_pharmacy/utils/dispense.py +1 -4
- edc_pharmacy/utils/get_unit_qty_out.py +1 -3
- edc_pharmacy/utils/process_repack_request.py +1 -3
- edc_pharmacy/utils/process_repack_request_queryset.py +1 -3
- edc_pharmacy/utils/stock_request/bulk_create_stock_request_items.py +2 -6
- edc_pharmacy/utils/stock_request/get_instock_and_nostock_data.py +3 -8
- edc_pharmacy/utils/transfer_stock.py +1 -3
- edc_pharmacy/utils/update_previous_refill_end_datetime.py +1 -3
- edc_pharmacy/views/add_to_storage_bin_view.py +2 -6
- edc_pharmacy/views/allocate_to_subject_view.py +7 -21
- edc_pharmacy/views/confirm_stock_from_instance_view.py +2 -6
- edc_pharmacy/views/confirm_stock_from_queryset_view.py +2 -7
- edc_pharmacy/views/confirmation_at_site_view.py +10 -31
- edc_pharmacy/views/dispense_view.py +2 -6
- edc_pharmacy/views/move_to_storage_bin_view.py +2 -6
- edc_pharmacy/views/prepare_and_review_stock_request_view.py +3 -9
- edc_pharmacy/views/print_labels_view.py +1 -3
- edc_pharmacy/views/print_stock_transfer_manifest_view.py +1 -3
- edc_pharmacy/views/transfer_stock_view.py +1 -3
- edc_prn/modelform_mixins.py +1 -3
- edc_prn/prn.py +2 -6
- edc_prn/templatetags/edc_prn_extras.py +4 -8
- edc_protocol/research_protocol_config.py +2 -5
- edc_protocol_incident/admin/protocol_deviation_violation_admin.py +1 -3
- edc_protocol_incident/auth_objects.py +1 -3
- edc_protocol_incident/auths.py +1 -3
- edc_protocol_incident/form_validators/mixins.py +3 -9
- edc_protocol_incident/form_validators/protocol_deviation_violation_form_validator.py +6 -18
- edc_protocol_incident/form_validators/protocol_incident_form_validator.py +3 -8
- edc_protocol_incident/migrations/0001_initial.py +4 -3
- edc_protocol_incident/migrations/0001_squashed_0015_auto_20220927_0401.py +7 -12
- edc_protocol_incident/migrations/0005_protocolincident_historicalprotocolincident_and_more.py +4 -3
- edc_protocol_incident/migrations/0012_auto_20220913_2139.py +3 -9
- edc_protocol_incident/migrations/0020_alter_historicalprotocoldeviationviolation_device_created_and_more.py +9 -25
- edc_protocol_incident/migrations/0023_alter_historicalprotocoldeviationviolation_revision_and_more.py +65 -0
- edc_protocol_incident/model_mixins/protocol_deviation_violation_model_mixin.py +3 -7
- edc_protocol_incident/model_mixins/protocol_incident_model_mixin.py +1 -3
- edc_protocol_incident/urls.py +1 -3
- edc_pylabels/actions.py +2 -6
- edc_pylabels/admin/label_configuration_admin.py +4 -4
- edc_pylabels/drawing_callable_example.py +1 -3
- edc_pylabels/migrations/0001_initial.py +1 -3
- edc_pylabels/migrations/0002_alter_label_options_label_created_and_more.py +2 -6
- edc_pylabels/migrations/0005_labelconfiguration_delete_label_and_more.py +1 -3
- edc_pylabels/migrations/0012_alter_labelconfiguration_revision.py +26 -0
- edc_pylabels/models/label_configuration.py +1 -3
- edc_qareports/migrations/0001_initial.py +3 -4
- edc_qareports/migrations/0005_edcpermissions.py +2 -4
- edc_qareports/migrations/0006_qareportlog.py +2 -1
- edc_qareports/migrations/0007_qareportlog_edc_qarepor_accesse_738ffe_idx.py +1 -3
- edc_qareports/migrations/0017_auto_20240816_0256.py +1 -0
- edc_qareports/migrations/0018_alter_edcpermissions_revision_alter_note_revision.py +38 -0
- edc_qareports/model_mixins/note_model_mixin.py +1 -3
- edc_qareports/modeladmin_mixins/list_filters.py +8 -12
- edc_qareports/modeladmin_mixins/note_modeladmin_mixin.py +1 -3
- edc_qareports/modeladmin_mixins/on_study_missing_values_modeladmin_mixin.py +2 -6
- edc_qareports/modeladmin_mixins/qa_report_modeladmin_mixin.py +1 -3
- edc_qareports/sql_generator/crf_case.py +1 -5
- edc_qareports/sql_generator/sql_view_generator.py +1 -3
- edc_qareports/utils.py +4 -7
- edc_randomization/admin.py +1 -3
- edc_randomization/auths.py +2 -6
- edc_randomization/blinding.py +1 -3
- edc_randomization/migrations/0001_initial.py +3 -4
- edc_randomization/migrations/0009_edcpermissions.py +1 -1
- edc_randomization/migrations/0011_alter_edcpermissions_device_created_and_more.py +7 -19
- edc_randomization/migrations/0013_alter_edcpermissions_revision_and_more.py +50 -0
- edc_randomization/model_mixins.py +2 -5
- edc_randomization/randomization_list_importer.py +3 -7
- edc_randomization/randomization_list_verifier.py +2 -7
- edc_randomization/randomizer.py +4 -7
- edc_randomization/site_randomizers.py +1 -3
- edc_randomization/system_checks.py +1 -3
- edc_randomization/utils.py +2 -6
- edc_refusal/admin.py +1 -3
- edc_refusal/forms.py +1 -2
- edc_refusal/migrations/0001_initial.py +2 -1
- edc_refusal/migrations/0002_historicalsubjectrefusal.py +6 -4
- edc_refusal/migrations/0004_refusalreasons_plural_name.py +1 -3
- edc_refusal/migrations/0005_alter_subjectrefusal_options_and_more.py +2 -1
- edc_refusal/migrations/0006_alter_subjectrefusal_managers.py +2 -1
- edc_refusal/migrations/0008_alter_historicalsubjectrefusal_device_created_and_more.py +5 -13
- edc_refusal/migrations/0011_alter_historicalsubjectrefusal_revision_and_more.py +38 -0
- edc_registration/admin_site.py +1 -3
- edc_registration/migrations/0001_initial.py +3 -4
- edc_registration/migrations/0002_auto_20161127_2226.py +4 -7
- edc_registration/migrations/0004_auto_20161221_0018.py +2 -1
- edc_registration/migrations/0005_auto_20170111_1809.py +2 -1
- edc_registration/migrations/0008_auto_20170810_1032.py +2 -1
- edc_registration/migrations/0012_auto_20180116_1528.py +2 -1
- edc_registration/migrations/0015_auto_20181006_2257.py +1 -1
- edc_registration/migrations/0016_historicalregisteredsubject.py +5 -6
- edc_registration/migrations/0026_historicalregisteredsubject_familiar_name_and_more.py +1 -1
- edc_registration/migrations/0028_alter_registeredsubject_managers.py +1 -1
- edc_registration/migrations/0029_alter_historicalregisteredsubject_device_created_and_more.py +5 -13
- edc_registration/migrations/0032_alter_historicalregisteredsubject_revision_and_more.py +38 -0
- edc_registration/modeladmin_mixins.py +1 -3
- edc_registration/models/registered_subject.py +4 -11
- edc_registration/utils.py +1 -3
- edc_reportable/admin_site.py +1 -3
- edc_reportable/data/normal_data/africa.py +4 -14
- edc_reportable/evaluator.py +2 -6
- edc_reportable/forms/reportables_form_validator_mixin.py +5 -4
- edc_reportable/formula.py +2 -6
- edc_reportable/management/commands/export_reportables.py +1 -3
- edc_reportable/migrations/0001_initial.py +3 -9
- edc_reportable/migrations/0003_referencerangecollection_grade1_and_more.py +3 -9
- edc_reportable/migrations/0004_alter_referencerangecollection_grade3_and_more.py +4 -7
- edc_reportable/migrations/0006_alter_gradingdata_revision_and_more.py +370 -0
- edc_reportable/models/mw.py +1 -3
- edc_reportable/models/reference_model_mixins.py +1 -3
- edc_reportable/models/reference_range_collection.py +3 -9
- edc_reportable/post_migrate_signals.py +1 -3
- edc_reportable/reference_range_evaluator.py +4 -11
- edc_reportable/utils/convert_units.py +3 -4
- edc_reportable/utils/get_grade_for_value.py +3 -1
- edc_reportable/utils/get_reference_range_collection.py +2 -2
- edc_reportable/utils/load_data.py +1 -3
- edc_reportable/utils/molecular_weight_model_cls.py +1 -1
- edc_reportable/utils/update_grading_data.py +2 -6
- edc_review_dashboard/migrations/0001_initial.py +1 -1
- edc_review_dashboard/migrations/0003_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_review_dashboard/migrations/0005_alter_edcpermissions_revision.py +26 -0
- edc_review_dashboard/views/subject_review_listboard_view.py +1 -3
- edc_screening/eligibility.py +1 -3
- edc_screening/fc.py +1 -3
- edc_screening/migrations/0001_initial.py +1 -1
- edc_screening/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_screening/migrations/0004_alter_edcpermissions_revision.py +26 -0
- edc_screening/model_mixins/eligibility_model_mixin.py +1 -3
- edc_screening/model_mixins/screening_fields_model_mixin.py +2 -0
- edc_screening/modelform_mixins.py +1 -3
- edc_screening/screening_eligibility.py +1 -0
- edc_search/search_slug.py +2 -6
- edc_search/updater.py +2 -5
- edc_sites/admin/site_model_admin_mixin.py +4 -12
- edc_sites/management/commands/sync_sites.py +1 -3
- edc_sites/migrations/0007_edcpermissions.py +2 -4
- edc_sites/migrations/0009_alter_edcpermissions_revision.py +26 -0
- edc_sites/single_site/get_languages.py +1 -3
- edc_sites/single_site/single_site.py +1 -1
- edc_sites/site.py +6 -12
- edc_sites/system_checks.py +1 -4
- edc_sites/utils/add_or_update_django_sites.py +2 -4
- edc_subject_dashboard/migrations/0001_initial.py +1 -1
- edc_subject_dashboard/migrations/0002_alter_edcpermissions_device_created_and_more.py +3 -7
- edc_subject_dashboard/migrations/0004_alter_edcpermissions_revision.py +26 -0
- edc_subject_dashboard/requisition_labels.py +1 -3
- edc_subject_dashboard/requisition_report.py +5 -15
- edc_subject_dashboard/requisition_verifier.py +2 -7
- edc_subject_dashboard/templatetags/edc_subject_dashboard_extras.py +2 -6
- edc_subject_dashboard/view_mixins/subject_visit_view_mixin.py +1 -2
- edc_subject_dashboard/view_utils/crf_button.py +1 -3
- edc_subject_dashboard/view_utils/subject_consent_listboard_button.py +1 -3
- edc_subject_dashboard/view_utils/timepoint_status_button.py +1 -3
- edc_subject_dashboard/views/requisition_print_actions_view.py +4 -12
- edc_subject_dashboard/views/requisition_verify_actions_view.py +1 -3
- edc_subject_dashboard/views/subject_dashboard_view.py +1 -3
- edc_timepoint/apps.py +1 -3
- edc_timepoint/timepoint.py +1 -3
- edc_timepoint/timepoint_lookup.py +1 -3
- edc_transfer/form_validators.py +4 -6
- edc_transfer/model_mixins.py +1 -3
- edc_transfer/modelform_mixins.py +1 -3
- edc_unblinding/action_items.py +1 -3
- edc_unblinding/admin_site.py +1 -3
- edc_unblinding/migrations/0001_initial.py +6 -4
- edc_unblinding/migrations/0002_auto_20210908_2318.py +1 -1
- edc_unblinding/migrations/0009_alter_unblindingrequest_managers_and_more.py +2 -1
- edc_unblinding/migrations/0010_alter_historicalunblindingrequest_device_created_and_more.py +9 -25
- edc_unblinding/migrations/0013_alter_historicalunblindingrequest_revision_and_more.py +62 -0
- edc_unblinding/models/unblinding_request.py +1 -3
- edc_unblinding/models/unblinding_review.py +1 -3
- edc_utils/age.py +1 -3
- edc_utils/date.py +1 -3
- edc_utils/paths_for_urlpatterns.py +1 -3
- edc_utils/show_urls.py +1 -3
- edc_utils/text.py +1 -2
- edc_view_utils/model_button.py +5 -13
- edc_view_utils/query_button.py +1 -3
- edc_visit_schedule/admin/subject_schedule_history_admin.py +1 -3
- edc_visit_schedule/baseline.py +1 -3
- edc_visit_schedule/migrations/0001_initial.py +3 -4
- edc_visit_schedule/migrations/0003_historicalvisitschedule_visitschedule.py +1 -3
- edc_visit_schedule/migrations/0004_auto_20190629_1800.py +1 -3
- edc_visit_schedule/migrations/0011_alter_historicalvisitschedule_device_created_and_more.py +7 -19
- edc_visit_schedule/migrations/0012_alter_subjectschedulehistory_managers_and_more.py +2 -1
- edc_visit_schedule/migrations/0015_historicalonschedule_offschedule_onschedule.py +9 -13
- edc_visit_schedule/migrations/0017_alter_onschedule_managers.py +2 -1
- edc_visit_schedule/migrations/0018_alter_historicalonschedule_revision_and_more.py +86 -0
- edc_visit_schedule/model_mixins/crf/crf_schedule_model_mixin.py +1 -1
- edc_visit_schedule/model_mixins/off_schedule_model_mixin.py +2 -6
- edc_visit_schedule/model_mixins/on_schedule_model_mixin.py +1 -3
- edc_visit_schedule/modelform_mixins/off_schedule_modelform_mixin.py +1 -3
- edc_visit_schedule/models/subject_schedule_history.py +3 -8
- edc_visit_schedule/ordered_collection.py +1 -3
- edc_visit_schedule/schedule/schedule.py +10 -20
- edc_visit_schedule/simple_model_validator.py +3 -8
- edc_visit_schedule/site_visit_schedules.py +6 -16
- edc_visit_schedule/subject_schedule.py +6 -17
- edc_visit_schedule/system_checks.py +1 -3
- edc_visit_schedule/utils.py +8 -17
- edc_visit_schedule/view_mixins.py +4 -10
- edc_visit_schedule/visit/crf.py +1 -2
- edc_visit_schedule/visit/requisition.py +1 -3
- edc_visit_schedule/visit/visit.py +6 -16
- edc_visit_schedule/visit/window_period.py +3 -3
- edc_visit_schedule/visit_schedule/visit_schedule.py +2 -5
- edc_visit_tracking/crf_date_validator.py +1 -2
- edc_visit_tracking/form_validators/visit_form_validator.py +2 -8
- edc_visit_tracking/form_validators/visit_missed_form_validator.py +3 -9
- edc_visit_tracking/migrations/0003_auto_20220913_2139.py +2 -6
- edc_visit_tracking/migrations/0004_subjectvisit_subjectvisitmissedreasons_extra_value_and_more.py +8 -16
- edc_visit_tracking/migrations/0008_alter_historicalsubjectvisit_revision_and_more.py +65 -0
- edc_visit_tracking/model_mixins/base/visit_methods_model_mixin.py +2 -6
- edc_visit_tracking/model_mixins/crfs/visit_tracking_crf_model_mixin.py +1 -3
- edc_visit_tracking/model_mixins/requisitions/visit_tracking_requisition_model_mixin.py +1 -3
- edc_visit_tracking/model_mixins/subject_visit_missed_model_mixin.py +1 -3
- edc_visit_tracking/model_mixins/visit_model_mixin/visit_model_fields_mixin.py +1 -2
- edc_visit_tracking/modeladmin_mixins/crf_model_admin_mixin.py +4 -8
- edc_visit_tracking/modeladmin_mixins/visit_model_admin_mixin.py +4 -6
- edc_visit_tracking/modelform_mixins/crf/visit_tracking_crf_modelform_mixin.py +2 -6
- edc_visit_tracking/modelform_mixins/utils.py +1 -3
- edc_visit_tracking/modelform_mixins/visit_tracking_modelform_mixin.py +1 -2
- edc_visit_tracking/models/signals.py +1 -3
- edc_visit_tracking/stubs.py +1 -3
- edc_visit_tracking/utils.py +1 -2
- edc_visit_tracking/view_utils/related_visit_button.py +1 -3
- edc_visit_tracking/visit_sequence.py +1 -3
- edc_vitals/__init__.py +2 -0
- edc_vitals/apps.py +6 -0
- edc_vitals/calculators/__init__.py +1 -0
- edc_vitals/calculators/bmi.py +70 -0
- edc_vitals/form_validators/__init__.py +5 -0
- edc_vitals/form_validators/blood_pressure_form_validator_mixin.py +40 -0
- edc_vitals/form_validators/bmi_form_validator_mixin.py +19 -0
- edc_vitals/form_validators/weight_height_with_bmi_form_validator_mixin.py +13 -0
- edc_vitals/migrations/__init__.py +0 -0
- edc_vitals/model_mixins/__init__.py +5 -0
- edc_vitals/model_mixins/blood_pressure_model_mixin.py +80 -0
- edc_vitals/model_mixins/weight_height_bmi_model_mixin.py +42 -0
- edc_vitals/models/__init__.py +10 -0
- edc_vitals/models/fields/__init__.py +7 -0
- edc_vitals/models/fields/blood_pressure.py +36 -0
- edc_vitals/models/fields/heart_rate.py +22 -0
- edc_vitals/models/fields/height.py +26 -0
- edc_vitals/models/fields/respiratory_rate.py +22 -0
- edc_vitals/models/fields/temperature.py +26 -0
- edc_vitals/models/fields/waist_circumference.py +23 -0
- edc_vitals/models/fields/weight.py +26 -0
- edc_vitals/utils.py +51 -0
- edc_vitals/validators.py +5 -0
- edc_lab_results/model_mixin_factory/__init__.py +0 -2
- {clinicedc-2.0.0.dist-info → clinicedc-2.0.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Generated by Django 5.0 on 2024-01-09 23:21
|
|
2
2
|
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
3
5
|
import _socket
|
|
4
6
|
import django.db.models.deletion
|
|
5
7
|
import django_audit_fields.fields.hostname_modification_field
|
|
@@ -7,15 +9,15 @@ import django_audit_fields.fields.userfield
|
|
|
7
9
|
import django_audit_fields.fields.uuid_auto_field
|
|
8
10
|
import django_audit_fields.models.audit_model_mixin
|
|
9
11
|
import django_revision.revision_field
|
|
12
|
+
import simple_history.models
|
|
13
|
+
from django.conf import settings
|
|
14
|
+
from django.db import migrations, models
|
|
15
|
+
|
|
10
16
|
import edc_identifier.managers
|
|
11
17
|
import edc_model.validators.date
|
|
12
18
|
import edc_protocol.validators
|
|
13
19
|
import edc_sites.managers
|
|
14
20
|
import edc_utils.date
|
|
15
|
-
import simple_history.models
|
|
16
|
-
import uuid
|
|
17
|
-
from django.conf import settings
|
|
18
|
-
from django.db import migrations, models
|
|
19
21
|
|
|
20
22
|
|
|
21
23
|
class Migration(migrations.Migration):
|
|
@@ -93,9 +95,7 @@ class Migration(migrations.Migration):
|
|
|
93
95
|
),
|
|
94
96
|
(
|
|
95
97
|
"device_created",
|
|
96
|
-
models.CharField(
|
|
97
|
-
blank=True, max_length=10, verbose_name="Device created"
|
|
98
|
-
),
|
|
98
|
+
models.CharField(blank=True, max_length=10, verbose_name="Device created"),
|
|
99
99
|
),
|
|
100
100
|
(
|
|
101
101
|
"device_modified",
|
|
@@ -259,9 +259,7 @@ class Migration(migrations.Migration):
|
|
|
259
259
|
),
|
|
260
260
|
(
|
|
261
261
|
"device_created",
|
|
262
|
-
models.CharField(
|
|
263
|
-
blank=True, max_length=10, verbose_name="Device created"
|
|
264
|
-
),
|
|
262
|
+
models.CharField(blank=True, max_length=10, verbose_name="Device created"),
|
|
265
263
|
),
|
|
266
264
|
(
|
|
267
265
|
"device_modified",
|
|
@@ -413,9 +411,7 @@ class Migration(migrations.Migration):
|
|
|
413
411
|
),
|
|
414
412
|
(
|
|
415
413
|
"device_created",
|
|
416
|
-
models.CharField(
|
|
417
|
-
blank=True, max_length=10, verbose_name="Device created"
|
|
418
|
-
),
|
|
414
|
+
models.CharField(blank=True, max_length=10, verbose_name="Device created"),
|
|
419
415
|
),
|
|
420
416
|
(
|
|
421
417
|
"device_modified",
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Generated by Django 5.2.4 on 2025-09-10 03:24
|
|
2
|
+
|
|
3
|
+
import django_revision.revision_field
|
|
4
|
+
from django.db import migrations
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
("edc_visit_schedule", "0017_alter_onschedule_managers"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name="historicalonschedule",
|
|
16
|
+
name="revision",
|
|
17
|
+
field=django_revision.revision_field.RevisionField(
|
|
18
|
+
blank=True,
|
|
19
|
+
editable=False,
|
|
20
|
+
help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
|
|
21
|
+
max_length=75,
|
|
22
|
+
null=True,
|
|
23
|
+
verbose_name="Revision",
|
|
24
|
+
),
|
|
25
|
+
),
|
|
26
|
+
migrations.AlterField(
|
|
27
|
+
model_name="historicalvisitschedule",
|
|
28
|
+
name="revision",
|
|
29
|
+
field=django_revision.revision_field.RevisionField(
|
|
30
|
+
blank=True,
|
|
31
|
+
editable=False,
|
|
32
|
+
help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
|
|
33
|
+
max_length=75,
|
|
34
|
+
null=True,
|
|
35
|
+
verbose_name="Revision",
|
|
36
|
+
),
|
|
37
|
+
),
|
|
38
|
+
migrations.AlterField(
|
|
39
|
+
model_name="offschedule",
|
|
40
|
+
name="revision",
|
|
41
|
+
field=django_revision.revision_field.RevisionField(
|
|
42
|
+
blank=True,
|
|
43
|
+
editable=False,
|
|
44
|
+
help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
|
|
45
|
+
max_length=75,
|
|
46
|
+
null=True,
|
|
47
|
+
verbose_name="Revision",
|
|
48
|
+
),
|
|
49
|
+
),
|
|
50
|
+
migrations.AlterField(
|
|
51
|
+
model_name="onschedule",
|
|
52
|
+
name="revision",
|
|
53
|
+
field=django_revision.revision_field.RevisionField(
|
|
54
|
+
blank=True,
|
|
55
|
+
editable=False,
|
|
56
|
+
help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
|
|
57
|
+
max_length=75,
|
|
58
|
+
null=True,
|
|
59
|
+
verbose_name="Revision",
|
|
60
|
+
),
|
|
61
|
+
),
|
|
62
|
+
migrations.AlterField(
|
|
63
|
+
model_name="subjectschedulehistory",
|
|
64
|
+
name="revision",
|
|
65
|
+
field=django_revision.revision_field.RevisionField(
|
|
66
|
+
blank=True,
|
|
67
|
+
editable=False,
|
|
68
|
+
help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
|
|
69
|
+
max_length=75,
|
|
70
|
+
null=True,
|
|
71
|
+
verbose_name="Revision",
|
|
72
|
+
),
|
|
73
|
+
),
|
|
74
|
+
migrations.AlterField(
|
|
75
|
+
model_name="visitschedule",
|
|
76
|
+
name="revision",
|
|
77
|
+
field=django_revision.revision_field.RevisionField(
|
|
78
|
+
blank=True,
|
|
79
|
+
editable=False,
|
|
80
|
+
help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
|
|
81
|
+
max_length=75,
|
|
82
|
+
null=True,
|
|
83
|
+
verbose_name="Revision",
|
|
84
|
+
),
|
|
85
|
+
),
|
|
86
|
+
]
|
|
@@ -45,7 +45,7 @@ class CrfScheduleModelMixin(models.Model):
|
|
|
45
45
|
return self.related_visit.schedule
|
|
46
46
|
|
|
47
47
|
def is_onschedule_or_raise(self) -> None:
|
|
48
|
-
cdefs = self.schedule.consent_definitions
|
|
48
|
+
# cdefs = self.schedule.consent_definitions
|
|
49
49
|
subject_schedule = SubjectSchedule(
|
|
50
50
|
self.subject_identifier,
|
|
51
51
|
visit_schedule=self.visit_schedule,
|
|
@@ -59,9 +59,7 @@ class OffScheduleModelMixin(UniqueSubjectIdentifierFieldMixin, models.Model):
|
|
|
59
59
|
f"cannot be None. See model {self.__class__.__name__}"
|
|
60
60
|
)
|
|
61
61
|
if self.offschedule_datetime_field_attr != "offschedule_datetime":
|
|
62
|
-
self.offschedule_datetime = getattr(
|
|
63
|
-
self, self.offschedule_datetime_field_attr
|
|
64
|
-
)
|
|
62
|
+
self.offschedule_datetime = getattr(self, self.offschedule_datetime_field_attr)
|
|
65
63
|
try:
|
|
66
64
|
self.offschedule_datetime.date()
|
|
67
65
|
except AttributeError:
|
|
@@ -91,6 +89,4 @@ class OffScheduleModelMixin(UniqueSubjectIdentifierFieldMixin, models.Model):
|
|
|
91
89
|
|
|
92
90
|
class Meta:
|
|
93
91
|
abstract = True
|
|
94
|
-
indexes = [
|
|
95
|
-
models.Index(fields=["subject_identifier", "offschedule_datetime", "site"])
|
|
96
|
-
]
|
|
92
|
+
indexes = [models.Index(fields=["subject_identifier", "offschedule_datetime", "site"])]
|
|
@@ -89,6 +89,4 @@ class OnScheduleModelMixin(UniqueSubjectIdentifierFieldMixin, models.Model):
|
|
|
89
89
|
|
|
90
90
|
class Meta:
|
|
91
91
|
abstract = True
|
|
92
|
-
indexes = [
|
|
93
|
-
models.Index(fields=["subject_identifier", "onschedule_datetime", "site"])
|
|
94
|
-
]
|
|
92
|
+
indexes = [models.Index(fields=["subject_identifier", "onschedule_datetime", "site"])]
|
|
@@ -22,9 +22,7 @@ class OffScheduleModelFormMixin(VisitScheduleNonCrfModelFormMixin):
|
|
|
22
22
|
visit_schedule_name=self.visit_schedule_name,
|
|
23
23
|
)
|
|
24
24
|
try:
|
|
25
|
-
self.schedule.subject(
|
|
26
|
-
self.get_subject_identifier()
|
|
27
|
-
).update_history_or_raise(
|
|
25
|
+
self.schedule.subject(self.get_subject_identifier()).update_history_or_raise(
|
|
28
26
|
history_obj=history_obj,
|
|
29
27
|
offschedule_datetime=self.offschedule_datetime,
|
|
30
28
|
update=False,
|
|
@@ -19,9 +19,7 @@ class OnScheduleModelError(Exception):
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class SubjectScheduleModelManager(models.Manager):
|
|
22
|
-
def get_by_natural_key(
|
|
23
|
-
self, subject_identifier, visit_schedule_name, schedule_name
|
|
24
|
-
):
|
|
22
|
+
def get_by_natural_key(self, subject_identifier, visit_schedule_name, schedule_name):
|
|
25
23
|
return self.get(
|
|
26
24
|
subject_identifier=subject_identifier,
|
|
27
25
|
visit_schedule_name=visit_schedule_name,
|
|
@@ -69,9 +67,7 @@ class SubjectScheduleHistory(
|
|
|
69
67
|
validators=[datetime_not_before_study_start, datetime_not_future], null=True
|
|
70
68
|
)
|
|
71
69
|
|
|
72
|
-
schedule_status = models.CharField(
|
|
73
|
-
max_length=15, choices=SCHEDULE_STATUS, null=True
|
|
74
|
-
)
|
|
70
|
+
schedule_status = models.CharField(max_length=15, choices=SCHEDULE_STATUS, null=True)
|
|
75
71
|
|
|
76
72
|
objects = SubjectScheduleModelManager()
|
|
77
73
|
|
|
@@ -112,6 +108,5 @@ class SubjectScheduleHistory(
|
|
|
112
108
|
)
|
|
113
109
|
]
|
|
114
110
|
indexes = (
|
|
115
|
-
BaseUuidModel.Meta.indexes
|
|
116
|
-
+ NonUniqueSubjectIdentifierFieldMixin.Meta.indexes
|
|
111
|
+
BaseUuidModel.Meta.indexes + NonUniqueSubjectIdentifierFieldMixin.Meta.indexes
|
|
117
112
|
)
|
|
@@ -15,9 +15,7 @@ class OrderedCollection(OrderedDict):
|
|
|
15
15
|
super().update(*args, **kwargs)
|
|
16
16
|
od = self.copy()
|
|
17
17
|
self.clear()
|
|
18
|
-
super().update(
|
|
19
|
-
**{getattr(v, self.key): v for v in sorted(od.values(), key=key_order)}
|
|
20
|
-
)
|
|
18
|
+
super().update(**{getattr(v, self.key): v for v in sorted(od.values(), key=key_order)})
|
|
21
19
|
|
|
22
20
|
@property
|
|
23
21
|
def first(self):
|
|
@@ -4,7 +4,7 @@ import re
|
|
|
4
4
|
from copy import deepcopy
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
from decimal import Decimal
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import TYPE_CHECKING, Type
|
|
8
8
|
|
|
9
9
|
from django.apps import apps as django_apps
|
|
10
10
|
|
|
@@ -17,12 +17,13 @@ from edc_registration import get_registered_subject_model_cls
|
|
|
17
17
|
from edc_sites import site_sites
|
|
18
18
|
from edc_sites.single_site import SingleSite
|
|
19
19
|
from edc_utils import formatted_date
|
|
20
|
-
|
|
21
|
-
from .window import Window
|
|
20
|
+
|
|
22
21
|
from ..exceptions import NotOnScheduleError, NotOnScheduleForDateError
|
|
23
22
|
from ..site_visit_schedules import site_visit_schedules
|
|
24
23
|
from ..subject_schedule import SubjectSchedule
|
|
25
24
|
from ..visit import Visit
|
|
25
|
+
from .visit_collection import VisitCollection
|
|
26
|
+
from .window import Window
|
|
26
27
|
|
|
27
28
|
if TYPE_CHECKING:
|
|
28
29
|
from edc_appointment.models import Appointment
|
|
@@ -106,13 +107,9 @@ class Schedule:
|
|
|
106
107
|
None if loss_to_followup_model is None else loss_to_followup_model.lower()
|
|
107
108
|
)
|
|
108
109
|
self.offstudymedication_model = (
|
|
109
|
-
None
|
|
110
|
-
if offstudymedication_model is None
|
|
111
|
-
else offstudymedication_model.lower()
|
|
112
|
-
)
|
|
113
|
-
self.history_model = (
|
|
114
|
-
history_model or "edc_visit_schedule.subjectschedulehistory"
|
|
110
|
+
None if offstudymedication_model is None else offstudymedication_model.lower()
|
|
115
111
|
)
|
|
112
|
+
self.history_model = history_model or "edc_visit_schedule.subjectschedulehistory"
|
|
116
113
|
|
|
117
114
|
def __repr__(self):
|
|
118
115
|
return f"Schedule({self.name})"
|
|
@@ -139,9 +136,7 @@ class Schedule:
|
|
|
139
136
|
f"ConsentDefinition(s) may not be None. See Schedule `{self}`. "
|
|
140
137
|
f"Got `{consent_definitions}`."
|
|
141
138
|
)
|
|
142
|
-
self._consent_definitions = sorted(
|
|
143
|
-
self._consent_definitions, key=lambda x: x.version
|
|
144
|
-
)
|
|
139
|
+
self._consent_definitions = sorted(self._consent_definitions, key=lambda x: x.version)
|
|
145
140
|
|
|
146
141
|
@property
|
|
147
142
|
def visits(self) -> VisitCollection:
|
|
@@ -288,8 +283,7 @@ class Schedule:
|
|
|
288
283
|
]
|
|
289
284
|
if not consent_definition:
|
|
290
285
|
raise ScheduleError(
|
|
291
|
-
"Consent definition may not be None. Expected one of "
|
|
292
|
-
f"{formatted_cdefs}."
|
|
286
|
+
"Consent definition may not be None. Expected one of " f"{formatted_cdefs}."
|
|
293
287
|
)
|
|
294
288
|
|
|
295
289
|
if consent_definition not in self.consent_definitions:
|
|
@@ -327,9 +321,7 @@ class Schedule:
|
|
|
327
321
|
return True
|
|
328
322
|
|
|
329
323
|
def datetime_in_window(self, **kwargs):
|
|
330
|
-
return self.window_cls(
|
|
331
|
-
name=self.name, visits=self.visits, **kwargs
|
|
332
|
-
).datetime_in_window
|
|
324
|
+
return self.window_cls(name=self.name, visits=self.visits, **kwargs).datetime_in_window
|
|
333
325
|
|
|
334
326
|
@property
|
|
335
327
|
def onschedule_model_cls(self) -> Type[OnSchedule]:
|
|
@@ -370,9 +362,7 @@ class Schedule:
|
|
|
370
362
|
"""
|
|
371
363
|
if consent_definition:
|
|
372
364
|
consent_definitions = [
|
|
373
|
-
c
|
|
374
|
-
for c in self.consent_definitions
|
|
375
|
-
if c.version == consent_definition.version
|
|
365
|
+
c for c in self.consent_definitions if c.version == consent_definition.version
|
|
376
366
|
]
|
|
377
367
|
else:
|
|
378
368
|
consent_definitions = self.consent_definitions
|
|
@@ -15,15 +15,10 @@ class SimpleModelValidator:
|
|
|
15
15
|
try:
|
|
16
16
|
app_label, _ = model.split(".")
|
|
17
17
|
except AttributeError:
|
|
18
|
-
raise InvalidModel(
|
|
19
|
-
f"Invalid label lower format for '{attr}'. " f"Got {model}"
|
|
20
|
-
)
|
|
18
|
+
raise InvalidModel(f"Invalid label lower format for '{attr}'. " f"Got {model}")
|
|
21
19
|
else:
|
|
22
|
-
app_labels = [
|
|
23
|
-
app_config.name for app_config in django_apps.get_app_configs()
|
|
24
|
-
]
|
|
20
|
+
app_labels = [app_config.name for app_config in django_apps.get_app_configs()]
|
|
25
21
|
if app_label not in app_labels:
|
|
26
22
|
raise InvalidModel(
|
|
27
|
-
f"Invalid model. app_label does not exist for "
|
|
28
|
-
f"'{attr}'. Got {model}"
|
|
23
|
+
f"Invalid model. app_label does not exist for " f"'{attr}'. Got {model}"
|
|
29
24
|
)
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import copy
|
|
4
4
|
import sys
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import TYPE_CHECKING, Tuple
|
|
6
6
|
|
|
7
7
|
from django.apps import apps as django_apps
|
|
8
8
|
from django.core.exceptions import ObjectDoesNotExist
|
|
@@ -92,9 +92,7 @@ class SiteVisitSchedules:
|
|
|
92
92
|
visit_schedule_name = visit_schedule_name.split(".")[0]
|
|
93
93
|
except AttributeError:
|
|
94
94
|
pass
|
|
95
|
-
visit_schedules[visit_schedule_name] = self.get_visit_schedule(
|
|
96
|
-
visit_schedule_name
|
|
97
|
-
)
|
|
95
|
+
visit_schedules[visit_schedule_name] = self.get_visit_schedule(visit_schedule_name)
|
|
98
96
|
return visit_schedules or self.registry
|
|
99
97
|
|
|
100
98
|
def get_by_consent_definition(
|
|
@@ -154,9 +152,7 @@ class SiteVisitSchedules:
|
|
|
154
152
|
|
|
155
153
|
attr `loss_to_followup_model` is in "label_lower" format.
|
|
156
154
|
"""
|
|
157
|
-
return self.get_by_model(
|
|
158
|
-
attr="loss_to_followup_model", model=loss_to_followup_model
|
|
159
|
-
)
|
|
155
|
+
return self.get_by_model(attr="loss_to_followup_model", model=loss_to_followup_model)
|
|
160
156
|
|
|
161
157
|
def get_by_model(
|
|
162
158
|
self, attr: str = None, model: str = None
|
|
@@ -207,9 +203,7 @@ class SiteVisitSchedules:
|
|
|
207
203
|
site: SingleSite | None = None,
|
|
208
204
|
) -> str:
|
|
209
205
|
"""Returns the consent model name specified on the schedule"""
|
|
210
|
-
schedule = self.get_visit_schedule(visit_schedule_name).schedules.get(
|
|
211
|
-
schedule_name
|
|
212
|
-
)
|
|
206
|
+
schedule = self.get_visit_schedule(visit_schedule_name).schedules.get(schedule_name)
|
|
213
207
|
if isinstance(schedule.consent_model, (dict,)):
|
|
214
208
|
# schedule returns a dict, get model name for this
|
|
215
209
|
# site_id or country
|
|
@@ -223,9 +217,7 @@ class SiteVisitSchedules:
|
|
|
223
217
|
|
|
224
218
|
def get_onschedule_model(self, visit_schedule_name: str, schedule_name: str) -> str:
|
|
225
219
|
"""Returns the onschedule model name"""
|
|
226
|
-
schedule = self.get_visit_schedule(visit_schedule_name).schedules.get(
|
|
227
|
-
schedule_name
|
|
228
|
-
)
|
|
220
|
+
schedule = self.get_visit_schedule(visit_schedule_name).schedules.get(schedule_name)
|
|
229
221
|
return schedule.onschedule_model
|
|
230
222
|
|
|
231
223
|
@staticmethod
|
|
@@ -321,9 +313,7 @@ class SiteVisitSchedules:
|
|
|
321
313
|
before_import_registry = copy.copy(site_visit_schedules._registry)
|
|
322
314
|
import_module(f"{app}.{module_name}")
|
|
323
315
|
if verbose:
|
|
324
|
-
sys.stdout.write(
|
|
325
|
-
" - registered visit schedule from " f"'{app}'\n"
|
|
326
|
-
)
|
|
316
|
+
sys.stdout.write(" - registered visit schedule from " f"'{app}'\n")
|
|
327
317
|
except Exception as e:
|
|
328
318
|
if f"No module named '{app}.{module_name}'" not in str(e):
|
|
329
319
|
raise
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import TYPE_CHECKING, Type
|
|
5
5
|
|
|
6
6
|
from django.apps import apps as django_apps
|
|
7
7
|
from django.conf import settings
|
|
@@ -16,6 +16,7 @@ from edc_sites.site import sites as site_sites
|
|
|
16
16
|
from edc_sites.utils import valid_site_for_subject_or_raise
|
|
17
17
|
from edc_utils import convert_php_dateformat, formatted_datetime, get_utcnow
|
|
18
18
|
from edc_utils.date import to_local
|
|
19
|
+
|
|
19
20
|
from .constants import OFF_SCHEDULE, ON_SCHEDULE
|
|
20
21
|
from .exceptions import (
|
|
21
22
|
InvalidOffscheduleDate,
|
|
@@ -76,9 +77,7 @@ class SubjectSchedule:
|
|
|
76
77
|
)
|
|
77
78
|
|
|
78
79
|
def __str__(self):
|
|
79
|
-
return
|
|
80
|
-
f"{self.subject_identifier} {self.visit_schedule_name}.{self.schedule_name}"
|
|
81
|
-
)
|
|
80
|
+
return f"{self.subject_identifier} {self.visit_schedule_name}.{self.schedule_name}"
|
|
82
81
|
|
|
83
82
|
@property
|
|
84
83
|
def onschedule_model_cls(self) -> Type[OnSchedule]:
|
|
@@ -293,11 +292,7 @@ class SubjectSchedule:
|
|
|
293
292
|
subject_identifier=self.subject_identifier,
|
|
294
293
|
schedule_name=self.schedule_name,
|
|
295
294
|
visit_schedule_name=self.visit_schedule_name,
|
|
296
|
-
**{
|
|
297
|
-
f"{related_visit_model_attr}__report_datetime__gt": (
|
|
298
|
-
offschedule_datetime
|
|
299
|
-
)
|
|
300
|
-
},
|
|
295
|
+
**{f"{related_visit_model_attr}__report_datetime__gt": (offschedule_datetime)},
|
|
301
296
|
)
|
|
302
297
|
except ObjectDoesNotExist:
|
|
303
298
|
appointments = None
|
|
@@ -306,11 +301,7 @@ class SubjectSchedule:
|
|
|
306
301
|
subject_identifier=self.subject_identifier,
|
|
307
302
|
schedule_name=self.schedule_name,
|
|
308
303
|
visit_schedule_name=self.visit_schedule_name,
|
|
309
|
-
**{
|
|
310
|
-
f"{related_visit_model_attr}__report_datetime__gt": (
|
|
311
|
-
offschedule_datetime
|
|
312
|
-
)
|
|
313
|
-
},
|
|
304
|
+
**{f"{related_visit_model_attr}__report_datetime__gt": (offschedule_datetime)},
|
|
314
305
|
)
|
|
315
306
|
if appointments:
|
|
316
307
|
raise InvalidOffscheduleDate(
|
|
@@ -369,9 +360,7 @@ class SubjectSchedule:
|
|
|
369
360
|
"""Raise an exception if subject is not on the schedule during
|
|
370
361
|
the given date.
|
|
371
362
|
"""
|
|
372
|
-
compare_as_datetimes =
|
|
373
|
-
True if compare_as_datetimes is None else compare_as_datetimes
|
|
374
|
-
)
|
|
363
|
+
compare_as_datetimes = True if compare_as_datetimes is None else compare_as_datetimes
|
|
375
364
|
|
|
376
365
|
onschedule_obj = self.onschedule_obj
|
|
377
366
|
|
|
@@ -183,9 +183,7 @@ def check_multiple_proxies_same_proxy_root(
|
|
|
183
183
|
|
|
184
184
|
# Find proxy models declared as sharing a proxy root
|
|
185
185
|
proxies_sharing_roots = get_proxy_models_from_collection(
|
|
186
|
-
collection=CrfCollection(
|
|
187
|
-
*[f for f in visit_crf_collection if f.shares_proxy_root]
|
|
188
|
-
)
|
|
186
|
+
collection=CrfCollection(*[f for f in visit_crf_collection if f.shares_proxy_root])
|
|
189
187
|
) + get_proxy_models_from_collection(
|
|
190
188
|
collection=CrfCollection(*[f for f in visit.crfs_prn if f.shares_proxy_root])
|
|
191
189
|
)
|
edc_visit_schedule/utils.py
CHANGED
|
@@ -68,16 +68,12 @@ def is_baseline(
|
|
|
68
68
|
|
|
69
69
|
def raise_if_baseline(subject_visit) -> None:
|
|
70
70
|
if subject_visit and is_baseline(instance=subject_visit):
|
|
71
|
-
raise forms.ValidationError(
|
|
72
|
-
"This form is not available for completion at baseline."
|
|
73
|
-
)
|
|
71
|
+
raise forms.ValidationError("This form is not available for completion at baseline.")
|
|
74
72
|
|
|
75
73
|
|
|
76
74
|
def raise_if_not_baseline(subject_visit) -> None:
|
|
77
75
|
if subject_visit and not is_baseline(instance=subject_visit):
|
|
78
|
-
raise forms.ValidationError(
|
|
79
|
-
"This form is only available for completion at baseline."
|
|
80
|
-
)
|
|
76
|
+
raise forms.ValidationError("This form is only available for completion at baseline.")
|
|
81
77
|
|
|
82
78
|
|
|
83
79
|
def get_onschedule_models(
|
|
@@ -163,9 +159,7 @@ def off_all_schedules_or_raise(subject_identifier: str = None):
|
|
|
163
159
|
subject_identifier=subject_identifier
|
|
164
160
|
)
|
|
165
161
|
except ObjectDoesNotExist:
|
|
166
|
-
model_name = (
|
|
167
|
-
schedule.offschedule_model_cls()._meta.verbose_name.title()
|
|
168
|
-
)
|
|
162
|
+
model_name = schedule.offschedule_model_cls()._meta.verbose_name.title()
|
|
169
163
|
raise OffScheduleError(
|
|
170
164
|
f"Subject cannot be taken off study. Subject is still on a "
|
|
171
165
|
f"schedule. Got schedule '{visit_schedule.name}."
|
|
@@ -247,9 +241,7 @@ def report_datetime_within_onschedule_offschedule_datetimes(
|
|
|
247
241
|
):
|
|
248
242
|
onschedule_datetime = formatted_datetime(onschedule_obj.onschedule_datetime)
|
|
249
243
|
if offschedule_obj:
|
|
250
|
-
offschedule_datetime = formatted_datetime(
|
|
251
|
-
offschedule_obj.offschedule_datetime
|
|
252
|
-
)
|
|
244
|
+
offschedule_datetime = formatted_datetime(offschedule_obj.offschedule_datetime)
|
|
253
245
|
error_msg = (
|
|
254
246
|
"Invalid report datetime. Expected a datetime between "
|
|
255
247
|
f"{onschedule_datetime} and {offschedule_datetime}. "
|
|
@@ -274,15 +266,14 @@ def get_onschedule_model_instance(
|
|
|
274
266
|
Increment reference_datetime by 1 sec to avoid millisecond
|
|
275
267
|
in lte comparison.
|
|
276
268
|
"""
|
|
277
|
-
schedule = site_visit_schedules.get_visit_schedule(
|
|
278
|
-
|
|
279
|
-
)
|
|
269
|
+
schedule = site_visit_schedules.get_visit_schedule(visit_schedule_name).schedules.get(
|
|
270
|
+
schedule_name
|
|
271
|
+
)
|
|
280
272
|
model_cls = django_apps.get_model(schedule.onschedule_model)
|
|
281
273
|
try:
|
|
282
274
|
onschedule_obj = model_cls.objects.get(
|
|
283
275
|
subject_identifier=subject_identifier,
|
|
284
|
-
onschedule_datetime__lte=to_utc(reference_datetime)
|
|
285
|
-
+ relativedelta(seconds=1),
|
|
276
|
+
onschedule_datetime__lte=to_utc(reference_datetime) + relativedelta(seconds=1),
|
|
286
277
|
)
|
|
287
278
|
except ObjectDoesNotExist as e:
|
|
288
279
|
dte_as_str = formatted_datetime(to_local(reference_datetime))
|
|
@@ -31,21 +31,15 @@ class VisitScheduleViewMixin:
|
|
|
31
31
|
if self.subject_identifier:
|
|
32
32
|
for schedule in visit_schedule.schedules.values():
|
|
33
33
|
try:
|
|
34
|
-
onschedule_model_obj = (
|
|
35
|
-
|
|
36
|
-
subject_identifier=self.subject_identifier
|
|
37
|
-
)
|
|
34
|
+
onschedule_model_obj = schedule.onschedule_model_cls.objects.get(
|
|
35
|
+
subject_identifier=self.subject_identifier
|
|
38
36
|
)
|
|
39
37
|
except ObjectDoesNotExist:
|
|
40
38
|
pass
|
|
41
39
|
else:
|
|
42
40
|
self.onschedule_models.append(onschedule_model_obj)
|
|
43
|
-
self.visit_schedules.update(
|
|
44
|
-
|
|
45
|
-
)
|
|
46
|
-
if schedule.is_onschedule(
|
|
47
|
-
self.subject_identifier, get_utcnow()
|
|
48
|
-
):
|
|
41
|
+
self.visit_schedules.update({visit_schedule.name: visit_schedule})
|
|
42
|
+
if schedule.is_onschedule(self.subject_identifier, get_utcnow()):
|
|
49
43
|
self.current_schedule = schedule
|
|
50
44
|
self.current_visit_schedule = visit_schedule
|
|
51
45
|
self.current_onschedule_model = onschedule_model_obj
|
edc_visit_schedule/visit/crf.py
CHANGED
|
@@ -39,8 +39,7 @@ class Crf:
|
|
|
39
39
|
|
|
40
40
|
def __repr__(self) -> str:
|
|
41
41
|
return (
|
|
42
|
-
f"{self.__class__.__name__}({self.show_order}, "
|
|
43
|
-
f"{self.model}, {self.required})"
|
|
42
|
+
f"{self.__class__.__name__}({self.show_order}, " f"{self.model}, {self.required})"
|
|
44
43
|
)
|
|
45
44
|
|
|
46
45
|
def __str__(self) -> str:
|
|
@@ -24,9 +24,7 @@ class Requisition(Crf):
|
|
|
24
24
|
f"Was the panel referred to by this schedule's requisition "
|
|
25
25
|
f"added to a lab profile and registered with site_labs?"
|
|
26
26
|
)
|
|
27
|
-
super().__init__(
|
|
28
|
-
required=required, model=self.panel.requisition_model, **kwargs
|
|
29
|
-
)
|
|
27
|
+
super().__init__(required=required, model=self.panel.requisition_model, **kwargs)
|
|
30
28
|
|
|
31
29
|
def __repr__(self):
|
|
32
30
|
return f"{self.__class__.__name__}({self.show_order}, {self.panel.name})"
|
|
@@ -80,8 +80,7 @@ class VisitDate:
|
|
|
80
80
|
def lower(self) -> datetime:
|
|
81
81
|
if not self.base:
|
|
82
82
|
raise BaseDatetimeNotSet(
|
|
83
|
-
"Base datetime is None, set the base datetime "
|
|
84
|
-
"before accessing attr lower"
|
|
83
|
+
"Base datetime is None, set the base datetime " "before accessing attr lower"
|
|
85
84
|
)
|
|
86
85
|
return self._lower
|
|
87
86
|
|
|
@@ -89,8 +88,7 @@ class VisitDate:
|
|
|
89
88
|
def upper(self) -> datetime:
|
|
90
89
|
if not self.base:
|
|
91
90
|
raise BaseDatetimeNotSet(
|
|
92
|
-
"Base datetime is None, set the base datetime "
|
|
93
|
-
"before accessing attr upper"
|
|
91
|
+
"Base datetime is None, set the base datetime " "before accessing attr upper"
|
|
94
92
|
)
|
|
95
93
|
return self._upper
|
|
96
94
|
|
|
@@ -136,9 +134,7 @@ class Visit:
|
|
|
136
134
|
self.crfs_prn: CrfCollection = crfs_prn or CrfCollection()
|
|
137
135
|
for prn in self.crfs_prn:
|
|
138
136
|
prn.required = False
|
|
139
|
-
self.requisitions: RequisitionCollection = (
|
|
140
|
-
requisitions or RequisitionCollection()
|
|
141
|
-
)
|
|
137
|
+
self.requisitions: RequisitionCollection = requisitions or RequisitionCollection()
|
|
142
138
|
self.requisitions_unscheduled: RequisitionCollection = (
|
|
143
139
|
requisitions_unscheduled or RequisitionCollection()
|
|
144
140
|
)
|
|
@@ -220,9 +216,7 @@ class Visit:
|
|
|
220
216
|
if crf.model not in [crf.model for crf in self.crfs]
|
|
221
217
|
]
|
|
222
218
|
crfs = crfs + [
|
|
223
|
-
crf
|
|
224
|
-
for crf in self.crfs_missed
|
|
225
|
-
if crf.model not in [crf.model for crf in crfs]
|
|
219
|
+
crf for crf in self.crfs_missed if crf.model not in [crf.model for crf in crfs]
|
|
226
220
|
]
|
|
227
221
|
crfs = crfs + [
|
|
228
222
|
crf for crf in self.crfs_prn if crf.model not in [crf.model for crf in crfs]
|
|
@@ -236,9 +230,7 @@ class Visit:
|
|
|
236
230
|
r for r in self.requisitions_unscheduled if r.name not in names
|
|
237
231
|
]
|
|
238
232
|
names = list(set([r.name for r in requisitions]))
|
|
239
|
-
requisitions = requisitions + [
|
|
240
|
-
r for r in self.requisitions_prn if r.name not in names
|
|
241
|
-
]
|
|
233
|
+
requisitions = requisitions + [r for r in self.requisitions_prn if r.name not in names]
|
|
242
234
|
return RequisitionCollection(
|
|
243
235
|
*requisitions, name="all_requisitions", check_sequence=False
|
|
244
236
|
)
|
|
@@ -285,9 +277,7 @@ class Visit:
|
|
|
285
277
|
def to_dict(self):
|
|
286
278
|
return dict(
|
|
287
279
|
crfs=[(crf.model, crf.required) for crf in self.crfs],
|
|
288
|
-
crfs_unscheduled=[
|
|
289
|
-
(crf.model, crf.required) for crf in self.crfs_unscheduled
|
|
290
|
-
],
|
|
280
|
+
crfs_unscheduled=[(crf.model, crf.required) for crf in self.crfs_unscheduled],
|
|
291
281
|
crfs_prn=[(crf.model, crf.required) for crf in self.crfs_prn],
|
|
292
282
|
crfs_missed=[(crf.model, crf.required) for crf in self.crfs_missed],
|
|
293
283
|
requisitions=[
|