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
|
@@ -61,8 +61,6 @@ class SummaryListboardView(
|
|
|
61
61
|
return super().get_context_data(**kwargs)
|
|
62
62
|
|
|
63
63
|
def get_queryset_filter_options(self, request, *args, **kwargs) -> tuple[Q, dict]:
|
|
64
|
-
q_object, options = super().get_queryset_filter_options(
|
|
65
|
-
request, *args, **kwargs
|
|
66
|
-
)
|
|
64
|
+
q_object, options = super().get_queryset_filter_options(request, *args, **kwargs)
|
|
67
65
|
options.update({"action_type__name__in": self.action_type_names})
|
|
68
66
|
return q_object, options
|
edc_appconfig/apps.py
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import sys
|
|
2
2
|
|
|
3
|
-
from django.apps import AppConfig as DjangoAppConfig
|
|
3
|
+
from django.apps import AppConfig as DjangoAppConfig
|
|
4
|
+
from django.apps import apps as django_apps
|
|
4
5
|
from django.conf import settings
|
|
5
6
|
from django.contrib.sites.management import create_default_site
|
|
6
7
|
from django.core.checks import register
|
|
7
8
|
from django.core.management.color import color_style
|
|
8
9
|
from django.db.models.signals import post_migrate
|
|
10
|
+
from multisite.apps import post_migrate_sync_alias
|
|
9
11
|
|
|
10
12
|
from edc_action_item.post_migrate_signals import update_action_types
|
|
11
13
|
from edc_action_item.site_action_items import site_action_items
|
|
@@ -47,7 +49,6 @@ from edc_visit_schedule.system_checks import (
|
|
|
47
49
|
check_subject_schedule_history,
|
|
48
50
|
visit_schedule_check,
|
|
49
51
|
)
|
|
50
|
-
from multisite.apps import post_migrate_sync_alias
|
|
51
52
|
|
|
52
53
|
installed_apps = [x.split(".apps")[0] for x in settings.INSTALLED_APPS]
|
|
53
54
|
|
|
@@ -304,8 +304,6 @@ class AppointmentAdmin(
|
|
|
304
304
|
def get_view_only_site_ids_for_user(self, request) -> list[int]:
|
|
305
305
|
if request.user.userprofile.roles.filter(name=DATA_MANAGER_ROLE).exists():
|
|
306
306
|
return [
|
|
307
|
-
s.id
|
|
308
|
-
for s in request.user.userprofile.sites.all()
|
|
309
|
-
if s.id != request.site.id
|
|
307
|
+
s.id for s in request.user.userprofile.sites.all() if s.id != request.site.id
|
|
310
308
|
]
|
|
311
309
|
return super().get_view_only_site_ids_for_user(request)
|
|
@@ -35,9 +35,7 @@ class AppointmentStatusListFilter(SimpleListFilter):
|
|
|
35
35
|
field_name = "appt_status"
|
|
36
36
|
|
|
37
37
|
def lookups(self, request, model_admin) -> tuple:
|
|
38
|
-
return APPT_STATUS + (
|
|
39
|
-
(ATTENDED_APPT, "Attended (In progress, incomplete, done)"),
|
|
40
|
-
)
|
|
38
|
+
return APPT_STATUS + ((ATTENDED_APPT, "Attended (In progress, incomplete, done)"),)
|
|
41
39
|
|
|
42
40
|
def queryset(self, request, queryset):
|
|
43
41
|
qs = None
|
edc_appointment/admin_site.py
CHANGED
|
@@ -2,6 +2,4 @@ from edc_model_admin.admin_site import EdcAdminSite
|
|
|
2
2
|
|
|
3
3
|
from .apps import AppConfig
|
|
4
4
|
|
|
5
|
-
edc_appointment_admin = EdcAdminSite(
|
|
6
|
-
name="edc_appointment_admin", app_label=AppConfig.name
|
|
7
|
-
)
|
|
5
|
+
edc_appointment_admin = EdcAdminSite(name="edc_appointment_admin", app_label=AppConfig.name)
|
|
@@ -17,9 +17,7 @@ def get_appointment_df(
|
|
|
17
17
|
normalize = True if normalize is None else normalize
|
|
18
18
|
localize = True if localize is None else localize
|
|
19
19
|
appointment_model_cls = get_appointment_model_cls()
|
|
20
|
-
appointment_type_model_cls = django_apps.get_model(
|
|
21
|
-
"edc_appointment.appointmenttype"
|
|
22
|
-
)
|
|
20
|
+
appointment_type_model_cls = django_apps.get_model("edc_appointment.appointmenttype")
|
|
23
21
|
opts = {}
|
|
24
22
|
if site_id:
|
|
25
23
|
opts = {"site_id": site_id}
|
|
@@ -28,9 +26,7 @@ def get_appointment_df(
|
|
|
28
26
|
appointment_model_cls.objects.values(*values).filter(**opts), verbose=False
|
|
29
27
|
)
|
|
30
28
|
else:
|
|
31
|
-
df_appt = read_frame(
|
|
32
|
-
appointment_model_cls.objects.filter(**opts), verbose=False
|
|
33
|
-
)
|
|
29
|
+
df_appt = read_frame(appointment_model_cls.objects.filter(**opts), verbose=False)
|
|
34
30
|
df_appt = convert_dates_from_model(
|
|
35
31
|
df_appt, appointment_model_cls, normalize=normalize, localize=localize
|
|
36
32
|
)
|
|
@@ -173,8 +173,7 @@ class AppointmentReasonUpdater(MetadataHelperMixin):
|
|
|
173
173
|
"""
|
|
174
174
|
return (
|
|
175
175
|
self.get_crf_metadata_by(KEYED).count() == 1
|
|
176
|
-
and self.get_crf_metadata_by(KEYED)[0].model
|
|
177
|
-
== get_subject_visit_missed_model()
|
|
176
|
+
and self.get_crf_metadata_by(KEYED)[0].model == get_subject_visit_missed_model()
|
|
178
177
|
)
|
|
179
178
|
|
|
180
179
|
def delete_subject_visit_missed_if_exists(self) -> None:
|
|
@@ -187,9 +186,7 @@ class AppointmentReasonUpdater(MetadataHelperMixin):
|
|
|
187
186
|
"""Returns a subject visit reason given the appt reason"""
|
|
188
187
|
if appt_reason == SCHEDULED_APPT:
|
|
189
188
|
visit_reason = SCHEDULED
|
|
190
|
-
elif
|
|
191
|
-
appt_reason == UNSCHEDULED_APPT and self.appointment.visit_code_sequence > 0
|
|
192
|
-
):
|
|
189
|
+
elif appt_reason == UNSCHEDULED_APPT and self.appointment.visit_code_sequence > 0:
|
|
193
190
|
visit_reason = UNSCHEDULED
|
|
194
191
|
else:
|
|
195
192
|
raise AppointmentReasonUpdaterError(
|
|
@@ -30,10 +30,7 @@ class AppointmentStatusUpdater:
|
|
|
30
30
|
raise AppointmentStatusUpdaterError(
|
|
31
31
|
"Appointment instance must exist. Got `id` is None"
|
|
32
32
|
)
|
|
33
|
-
if
|
|
34
|
-
change_to_in_progress
|
|
35
|
-
and self.appointment.appt_status != IN_PROGRESS_APPT
|
|
36
|
-
):
|
|
33
|
+
if change_to_in_progress and self.appointment.appt_status != IN_PROGRESS_APPT:
|
|
37
34
|
self.appointment.appt_status = IN_PROGRESS_APPT
|
|
38
35
|
self.appointment.save_base(update_fields=["appt_status"])
|
|
39
36
|
if clear_others_in_progress:
|
edc_appointment/constants.py
CHANGED
|
@@ -19,9 +19,7 @@ INVALID_PREVIOUS_APPOINTMENT_NOT_UPDATED = "previous_appointment_not_updated"
|
|
|
19
19
|
INVALID_PREVIOUS_VISIT_MISSING = "previous_visit_missing"
|
|
20
20
|
INVALID_MISSED_APPT_NOT_ALLOWED = "invalid_missed_appt_not_allowed"
|
|
21
21
|
INVALID_APPT_STATUS_AT_BASELINE = "invalid_appt_status_at_baseline"
|
|
22
|
-
INVALID_SKIPPED_APPT_NOT_ALLOWED_AT_BASELINE =
|
|
23
|
-
"invalid_skipped_appt_not_allowed_at_baseline"
|
|
24
|
-
)
|
|
22
|
+
INVALID_SKIPPED_APPT_NOT_ALLOWED_AT_BASELINE = "invalid_skipped_appt_not_allowed_at_baseline"
|
|
25
23
|
INVALID_APPT_TIMING = "invalid_appt_timing"
|
|
26
24
|
INVALID_APPT_TIMING_CRFS_EXIST = "invalid_appt_timing_crfs_exist"
|
|
27
25
|
INVALID_APPT_TIMING_REQUISITIONS_EXIST = "invalid_appt_timing_requisitions_exist"
|
|
@@ -86,8 +86,7 @@ class AppointmentCreator:
|
|
|
86
86
|
try:
|
|
87
87
|
if is_naive(timepoint_datetime):
|
|
88
88
|
raise ValueError(
|
|
89
|
-
f"Naive datetime not allowed. {repr(self)}. "
|
|
90
|
-
f"Got {timepoint_datetime}"
|
|
89
|
+
f"Naive datetime not allowed. {repr(self)}. " f"Got {timepoint_datetime}"
|
|
91
90
|
)
|
|
92
91
|
else:
|
|
93
92
|
self.timepoint_datetime = timepoint_datetime
|
|
@@ -100,16 +99,13 @@ class AppointmentCreator:
|
|
|
100
99
|
# to timepoint_datetime still apply.
|
|
101
100
|
if suggested_datetime and is_naive(suggested_datetime):
|
|
102
101
|
raise ValueError(
|
|
103
|
-
f"Naive datetime not allowed. {repr(self)}. "
|
|
104
|
-
f"Got {suggested_datetime}"
|
|
102
|
+
f"Naive datetime not allowed. {repr(self)}. " f"Got {suggested_datetime}"
|
|
105
103
|
)
|
|
106
104
|
else:
|
|
107
105
|
self.suggested_datetime = suggested_datetime or self.timepoint_datetime
|
|
108
106
|
self.facility = facility or visit.facility
|
|
109
107
|
if not self.facility:
|
|
110
|
-
raise AppointmentCreatorError(
|
|
111
|
-
f"facility_name not defined. See {repr(visit)}"
|
|
112
|
-
)
|
|
108
|
+
raise AppointmentCreatorError(f"facility_name not defined. See {repr(visit)}")
|
|
113
109
|
self.get_appointment()
|
|
114
110
|
|
|
115
111
|
def __repr__(self):
|
|
@@ -129,9 +125,7 @@ class AppointmentCreator:
|
|
|
129
125
|
"""Returns a newly created or updated appointment model instance."""
|
|
130
126
|
if not self._appointment:
|
|
131
127
|
try:
|
|
132
|
-
self._appointment = self.appointment_model_cls.objects.get(
|
|
133
|
-
**self.options
|
|
134
|
-
)
|
|
128
|
+
self._appointment = self.appointment_model_cls.objects.get(**self.options)
|
|
135
129
|
except ObjectDoesNotExist:
|
|
136
130
|
self._appointment = self._create()
|
|
137
131
|
else:
|
|
@@ -9,15 +9,16 @@ from django.db.models.deletion import ProtectedError
|
|
|
9
9
|
|
|
10
10
|
from edc_facility.exceptions import FacilityError
|
|
11
11
|
from edc_facility.utils import get_facility
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
from ..exceptions import CreateAppointmentError
|
|
14
|
+
from .appointment_creator import AppointmentCreator
|
|
14
15
|
|
|
15
16
|
if TYPE_CHECKING:
|
|
16
17
|
from django.db.models import QuerySet
|
|
17
18
|
|
|
19
|
+
from edc_consent.consent_definition import ConsentDefinition
|
|
18
20
|
from edc_visit_schedule.schedule import Schedule
|
|
19
21
|
from edc_visit_schedule.visit_schedule import VisitSchedule
|
|
20
|
-
from edc_consent.consent_definition import ConsentDefinition
|
|
21
22
|
|
|
22
23
|
from ..models import Appointment
|
|
23
24
|
|
|
@@ -77,9 +77,7 @@ class UnscheduledAppointmentCreator:
|
|
|
77
77
|
"suggested visit code sequence cannot be less than 1"
|
|
78
78
|
)
|
|
79
79
|
self.facility = facility
|
|
80
|
-
self.visit_schedule = site_visit_schedules.get_visit_schedule(
|
|
81
|
-
visit_schedule_name
|
|
82
|
-
)
|
|
80
|
+
self.visit_schedule = site_visit_schedules.get_visit_schedule(visit_schedule_name)
|
|
83
81
|
self.schedule = self.visit_schedule.schedules.get(schedule_name)
|
|
84
82
|
self.appointment_model_cls = self.schedule.appointment_model_cls
|
|
85
83
|
self.visit = self.visit_schedule.schedules.get(self.schedule_name).visits.get(
|
|
@@ -264,10 +262,8 @@ class UnscheduledAppointmentCreator:
|
|
|
264
262
|
if (
|
|
265
263
|
self.calling_appointment
|
|
266
264
|
and self.calling_appointment.next
|
|
267
|
-
and self.calling_appointment.next.appt_status
|
|
268
|
-
|
|
269
|
-
and self.suggested_appt_datetime
|
|
270
|
-
< self.calling_appointment.next.appt_datetime
|
|
265
|
+
and self.calling_appointment.next.appt_status in [INCOMPLETE_APPT, COMPLETE_APPT]
|
|
266
|
+
and self.suggested_appt_datetime < self.calling_appointment.next.appt_datetime
|
|
271
267
|
):
|
|
272
268
|
value = True
|
|
273
269
|
return value
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
|
|
6
|
+
from dateutil.relativedelta import relativedelta
|
|
6
7
|
from django.db import transaction
|
|
7
8
|
|
|
8
9
|
from ..constants import INCOMPLETE_APPT, NEW_APPT
|
|
@@ -31,6 +32,9 @@ def create_unscheduled_appointment(
|
|
|
31
32
|
|
|
32
33
|
"""
|
|
33
34
|
unscheduled_appointment = None
|
|
35
|
+
next_appt_datetime = next_appt_datetime or appointment.appt_datetime + relativedelta(
|
|
36
|
+
days=1
|
|
37
|
+
)
|
|
34
38
|
next_appointment = get_appointment_by_datetime(
|
|
35
39
|
next_appt_datetime,
|
|
36
40
|
appointment.subject_identifier,
|
|
@@ -48,9 +48,7 @@ class NextAppointmentCrfFormValidatorMixin(FormValidator):
|
|
|
48
48
|
field_required="health_facility",
|
|
49
49
|
)
|
|
50
50
|
|
|
51
|
-
if self.cleaned_data.get("appt_date") and self.cleaned_data.get(
|
|
52
|
-
"visitschedule"
|
|
53
|
-
):
|
|
51
|
+
if self.cleaned_data.get("appt_date") and self.cleaned_data.get("visitschedule"):
|
|
54
52
|
self.validate_with_appointment_form_validator()
|
|
55
53
|
self.validate_date_is_on_clinic_day()
|
|
56
54
|
|
|
@@ -105,9 +103,7 @@ class NextAppointmentCrfFormValidatorMixin(FormValidator):
|
|
|
105
103
|
and instance.appt_datetime.date() != self.cleaned_data.get("appt_date")
|
|
106
104
|
):
|
|
107
105
|
self.raise_validation_error(
|
|
108
|
-
{
|
|
109
|
-
"appt_date": "May not be changed. Next appointment has already started"
|
|
110
|
-
},
|
|
106
|
+
{"appt_date": "May not be changed. Next appointment has already started"},
|
|
111
107
|
INVALID_ERROR,
|
|
112
108
|
)
|
|
113
109
|
|
|
@@ -159,10 +155,7 @@ class NextAppointmentCrfFormValidatorMixin(FormValidator):
|
|
|
159
155
|
def health_facility(self) -> HealthFacility | None:
|
|
160
156
|
if not self._health_facility:
|
|
161
157
|
if self.cleaned_data.get("health_facility"):
|
|
162
|
-
if (
|
|
163
|
-
self.cleaned_data.get("health_facility").site
|
|
164
|
-
!= self.related_visit.site
|
|
165
|
-
):
|
|
158
|
+
if self.cleaned_data.get("health_facility").site != self.related_visit.site:
|
|
166
159
|
raise self.raise_validation_error(
|
|
167
160
|
{"health_facility": "Invalid for this site"}, INVALID_ERROR
|
|
168
161
|
)
|
|
@@ -24,9 +24,7 @@ SCHEDULED_WINDOW_ERROR = "scheduled_window_error"
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class WindowPeriodFormValidatorMixin:
|
|
27
|
-
def validate_appt_datetime_in_window_period(
|
|
28
|
-
self, appointment: Appointment, *args
|
|
29
|
-
) -> None:
|
|
27
|
+
def validate_appt_datetime_in_window_period(self, appointment: Appointment, *args) -> None:
|
|
30
28
|
self.datetime_in_window_or_raise(appointment, *args)
|
|
31
29
|
|
|
32
30
|
@staticmethod
|
|
@@ -59,9 +57,7 @@ class WindowPeriodFormValidatorMixin:
|
|
|
59
57
|
dt=proposed_appt_datetime,
|
|
60
58
|
visit_code=appointment.visit_code,
|
|
61
59
|
visit_code_sequence=appointment.visit_code_sequence,
|
|
62
|
-
baseline_timepoint_datetime=self.baseline_timepoint_datetime(
|
|
63
|
-
appointment
|
|
64
|
-
),
|
|
60
|
+
baseline_timepoint_datetime=self.baseline_timepoint_datetime(appointment),
|
|
65
61
|
)
|
|
66
62
|
except UnScheduledVisitWindowError:
|
|
67
63
|
if not self.ignore_window_period_for_unscheduled(
|
|
@@ -93,9 +89,7 @@ class WindowPeriodFormValidatorMixin:
|
|
|
93
89
|
UNSCHEDULED_WINDOW_ERROR,
|
|
94
90
|
)
|
|
95
91
|
except ScheduledVisitWindowError as e:
|
|
96
|
-
self.raise_validation_error(
|
|
97
|
-
{form_field: (str(e))}, SCHEDULED_WINDOW_ERROR
|
|
98
|
-
)
|
|
92
|
+
self.raise_validation_error({form_field: (str(e))}, SCHEDULED_WINDOW_ERROR)
|
|
99
93
|
|
|
100
94
|
@staticmethod
|
|
101
95
|
def baseline_timepoint_datetime(appointment: Appointment) -> datetime:
|
|
@@ -135,9 +135,7 @@ class AppointmentFormValidator(
|
|
|
135
135
|
if self.cleaned_data.get("appt_status") == IN_PROGRESS_APPT and getattr(
|
|
136
136
|
self.instance, "id", None
|
|
137
137
|
):
|
|
138
|
-
previous_appt = get_previous_appointment(
|
|
139
|
-
self.instance, include_interim=True
|
|
140
|
-
)
|
|
138
|
+
previous_appt = get_previous_appointment(self.instance, include_interim=True)
|
|
141
139
|
if previous_appt and previous_appt.appt_status not in [
|
|
142
140
|
CANCELLED_APPT,
|
|
143
141
|
SKIPPED_APPT,
|
|
@@ -297,10 +295,7 @@ class AppointmentFormValidator(
|
|
|
297
295
|
appt_status = self.cleaned_data.get("appt_status")
|
|
298
296
|
if appt_datetime and appt_status and appt_status != NEW_APPT:
|
|
299
297
|
if self.instance.relative_previous:
|
|
300
|
-
if (
|
|
301
|
-
to_utc(appt_datetime)
|
|
302
|
-
< self.instance.relative_previous.appt_datetime
|
|
303
|
-
):
|
|
298
|
+
if to_utc(appt_datetime) < self.instance.relative_previous.appt_datetime:
|
|
304
299
|
formatted_date = formatted_datetime(
|
|
305
300
|
self.instance.relative_previous.appt_datetime
|
|
306
301
|
)
|
|
@@ -352,16 +347,12 @@ class AppointmentFormValidator(
|
|
|
352
347
|
appt_status = self.cleaned_data.get("appt_status")
|
|
353
348
|
if self.instance.visit_code_sequence == 0 and appt_status == CANCELLED_APPT:
|
|
354
349
|
self.raise_validation_error(
|
|
355
|
-
{
|
|
356
|
-
"appt_status": "Invalid. A scheduled appointment may not be cancelled."
|
|
357
|
-
},
|
|
350
|
+
{"appt_status": "Invalid. A scheduled appointment may not be cancelled."},
|
|
358
351
|
INVALID_APPT_STATUS,
|
|
359
352
|
)
|
|
360
353
|
elif self.instance.visit_code_sequence != 0 and appt_status == SKIPPED_APPT:
|
|
361
354
|
self.raise_validation_error(
|
|
362
|
-
{
|
|
363
|
-
"appt_status": "Invalid. An unscheduled appointment may not be skipped."
|
|
364
|
-
},
|
|
355
|
+
{"appt_status": "Invalid. An unscheduled appointment may not be skipped."},
|
|
365
356
|
INVALID_APPT_STATUS,
|
|
366
357
|
)
|
|
367
358
|
elif is_baseline(self.instance) and appt_status == SKIPPED_APPT:
|
|
@@ -388,10 +379,7 @@ class AppointmentFormValidator(
|
|
|
388
379
|
|
|
389
380
|
def validate_appt_inprogress_or_incomplete(self: Any) -> None:
|
|
390
381
|
appt_status = self.cleaned_data.get("appt_status")
|
|
391
|
-
if
|
|
392
|
-
appt_status in [CANCELLED_APPT, SKIPPED_APPT]
|
|
393
|
-
and self.crf_metadata_keyed_exists
|
|
394
|
-
):
|
|
382
|
+
if appt_status in [CANCELLED_APPT, SKIPPED_APPT] and self.crf_metadata_keyed_exists:
|
|
395
383
|
self.raise_validation_error(
|
|
396
384
|
{"appt_status": "Invalid. Some CRFs have already been keyed"},
|
|
397
385
|
INVALID_APPT_STATUS,
|
|
@@ -468,9 +456,7 @@ class AppointmentFormValidator(
|
|
|
468
456
|
)
|
|
469
457
|
elif not self.requisition_metadata_required_exists:
|
|
470
458
|
self.raise_validation_error(
|
|
471
|
-
{
|
|
472
|
-
"appt_status": "Invalid. All required requisitions have been keyed"
|
|
473
|
-
},
|
|
459
|
+
{"appt_status": "Invalid. All required requisitions have been keyed"},
|
|
474
460
|
INVALID_APPT_STATUS,
|
|
475
461
|
)
|
|
476
462
|
elif not self.required_additional_forms_exist:
|
|
@@ -509,9 +495,7 @@ class AppointmentFormValidator(
|
|
|
509
495
|
)
|
|
510
496
|
elif is_baseline(self.instance):
|
|
511
497
|
self.raise_validation_error(
|
|
512
|
-
{
|
|
513
|
-
"appt_status": "Invalid. Appointment may not be skipped at baseline"
|
|
514
|
-
},
|
|
498
|
+
{"appt_status": "Invalid. Appointment may not be skipped at baseline"},
|
|
515
499
|
INVALID_APPT_STATUS_AT_BASELINE,
|
|
516
500
|
)
|
|
517
501
|
|
|
@@ -528,9 +512,7 @@ class AppointmentFormValidator(
|
|
|
528
512
|
)
|
|
529
513
|
|
|
530
514
|
def validate_appt_type(self):
|
|
531
|
-
self.not_applicable_if(
|
|
532
|
-
SKIPPED_APPT, field="appt_status", field_applicable="appt_type"
|
|
533
|
-
)
|
|
515
|
+
self.not_applicable_if(SKIPPED_APPT, field="appt_status", field_applicable="appt_type")
|
|
534
516
|
|
|
535
517
|
def validate_appt_status(self):
|
|
536
518
|
pass
|
|
@@ -568,15 +550,9 @@ class AppointmentFormValidator(
|
|
|
568
550
|
{"appt_status": "Invalid. A scheduled appointment cannot be cancelled"},
|
|
569
551
|
INVALID_APPT_STATUS,
|
|
570
552
|
)
|
|
571
|
-
elif
|
|
572
|
-
appt_status
|
|
573
|
-
and self.instance.visit_code_sequence
|
|
574
|
-
and appt_status == SKIPPED_APPT
|
|
575
|
-
):
|
|
553
|
+
elif appt_status and self.instance.visit_code_sequence and appt_status == SKIPPED_APPT:
|
|
576
554
|
self.raise_validation_error(
|
|
577
|
-
{
|
|
578
|
-
"appt_status": "Invalid. An unscheduled appointment cannot be skipped"
|
|
579
|
-
},
|
|
555
|
+
{"appt_status": "Invalid. An unscheduled appointment cannot be skipped"},
|
|
580
556
|
INVALID_APPT_STATUS,
|
|
581
557
|
)
|
|
582
558
|
|
|
@@ -584,9 +560,7 @@ class AppointmentFormValidator(
|
|
|
584
560
|
if (
|
|
585
561
|
self.cleaned_data.get("appt_reason") == UNSCHEDULED_APPT
|
|
586
562
|
and get_previous_appointment(self.instance, include_interim=True)
|
|
587
|
-
and get_previous_appointment(
|
|
588
|
-
self.instance, include_interim=True
|
|
589
|
-
).appt_status
|
|
563
|
+
and get_previous_appointment(self.instance, include_interim=True).appt_status
|
|
590
564
|
== MISSED_APPT
|
|
591
565
|
):
|
|
592
566
|
self.raise_validation_error(
|
|
@@ -3,9 +3,7 @@ from edc_crf.crf_form_validator import CrfFormValidator
|
|
|
3
3
|
from ..form_validator_mixins import NextAppointmentCrfFormValidatorMixin
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class NextAppointmentCrfFormValidator(
|
|
7
|
-
NextAppointmentCrfFormValidatorMixin, CrfFormValidator
|
|
8
|
-
):
|
|
6
|
+
class NextAppointmentCrfFormValidator(NextAppointmentCrfFormValidatorMixin, CrfFormValidator):
|
|
9
7
|
def clean(self):
|
|
10
8
|
self.validate_date_is_on_clinic_day()
|
|
11
9
|
super().clean()
|
|
@@ -39,9 +39,7 @@ def validate_appt_datetime_unique(
|
|
|
39
39
|
"schedule_name": appointment.schedule_name,
|
|
40
40
|
"appt_datetime__date": appt_datetime_utc.date(),
|
|
41
41
|
}
|
|
42
|
-
other_appts = appointment.__class__.objects.filter(**opts).exclude(
|
|
43
|
-
id=appointment.id
|
|
44
|
-
)
|
|
42
|
+
other_appts = appointment.__class__.objects.filter(**opts).exclude(id=appointment.id)
|
|
45
43
|
if other_appts.count() > 1:
|
|
46
44
|
raise form_validator.raise_validation_error(
|
|
47
45
|
{form_field: "An appointment already exists for this date (M)"},
|
edc_appointment/managers.py
CHANGED
|
@@ -141,9 +141,7 @@ class AppointmentManager(models.Manager):
|
|
|
141
141
|
try:
|
|
142
142
|
last_appointment = [
|
|
143
143
|
obj
|
|
144
|
-
for obj in self.filter(**options).order_by(
|
|
145
|
-
"timepoint", "visit_code_sequence"
|
|
146
|
-
)
|
|
144
|
+
for obj in self.filter(**options).order_by("timepoint", "visit_code_sequence")
|
|
147
145
|
][-1]
|
|
148
146
|
except IndexError:
|
|
149
147
|
last_appointment = None
|
|
@@ -248,9 +246,7 @@ class AppointmentManager(models.Manager):
|
|
|
248
246
|
# delete future appointments until the first with a
|
|
249
247
|
# visit report
|
|
250
248
|
deleted = 0
|
|
251
|
-
appointments = self.filter(**options).order_by(
|
|
252
|
-
"timepoint", "visit_code_sequence"
|
|
253
|
-
)
|
|
249
|
+
appointments = self.filter(**options).order_by("timepoint", "visit_code_sequence")
|
|
254
250
|
for appointment in appointments.reverse():
|
|
255
251
|
try:
|
|
256
252
|
with transaction.atomic():
|
|
@@ -7,11 +7,12 @@ import django.db.models.deletion
|
|
|
7
7
|
import django_audit_fields.fields.uuid_auto_field
|
|
8
8
|
import django_extensions.db.fields
|
|
9
9
|
import django_revision.revision_field
|
|
10
|
-
import edc_model_fields.fields.hostname_modification_field
|
|
11
|
-
import edc_model_fields.fields.userfield
|
|
12
10
|
from django.conf import settings
|
|
13
11
|
from django.db import migrations, models
|
|
14
12
|
|
|
13
|
+
import edc_model_fields.fields.hostname_modification_field
|
|
14
|
+
import edc_model_fields.fields.userfield
|
|
15
|
+
|
|
15
16
|
|
|
16
17
|
class Migration(migrations.Migration):
|
|
17
18
|
dependencies = [
|
|
@@ -236,9 +237,7 @@ class Migration(migrations.Migration):
|
|
|
236
237
|
),
|
|
237
238
|
(
|
|
238
239
|
"comment",
|
|
239
|
-
models.CharField(
|
|
240
|
-
blank=True, max_length=250, verbose_name="Comment"
|
|
241
|
-
),
|
|
240
|
+
models.CharField(blank=True, max_length=250, verbose_name="Comment"),
|
|
242
241
|
),
|
|
243
242
|
("is_confirmed", models.BooleanField(default=False, editable=False)),
|
|
244
243
|
(
|
|
@@ -463,9 +462,7 @@ class Migration(migrations.Migration):
|
|
|
463
462
|
),
|
|
464
463
|
(
|
|
465
464
|
"comment",
|
|
466
|
-
models.CharField(
|
|
467
|
-
blank=True, max_length=250, verbose_name="Comment"
|
|
468
|
-
),
|
|
465
|
+
models.CharField(blank=True, max_length=250, verbose_name="Comment"),
|
|
469
466
|
),
|
|
470
467
|
("is_confirmed", models.BooleanField(default=False, editable=False)),
|
|
471
468
|
(
|
|
@@ -2,45 +2,36 @@
|
|
|
2
2
|
# Generated by Django 1.10.3 on 2016-11-27 22:26
|
|
3
3
|
from __future__ import unicode_literals
|
|
4
4
|
|
|
5
|
-
import edc_utils
|
|
6
5
|
from django.db import migrations, models
|
|
7
6
|
|
|
7
|
+
import edc_utils
|
|
8
|
+
|
|
8
9
|
|
|
9
10
|
class Migration(migrations.Migration):
|
|
10
11
|
dependencies = [("edc_appointment", "0002_auto_20161126_1156")]
|
|
11
12
|
|
|
12
13
|
operations = [
|
|
13
14
|
migrations.AlterModelOptions(name="appointment", options={}),
|
|
14
|
-
migrations.RemoveField(
|
|
15
|
-
model_name="historicalappointment", name="consent_version"
|
|
16
|
-
),
|
|
15
|
+
migrations.RemoveField(model_name="historicalappointment", name="consent_version"),
|
|
17
16
|
migrations.AlterField(
|
|
18
17
|
model_name="appointment",
|
|
19
18
|
name="created",
|
|
20
|
-
field=models.DateTimeField(
|
|
21
|
-
default=edc_utils.date.get_utcnow, editable=False
|
|
22
|
-
),
|
|
19
|
+
field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
|
|
23
20
|
),
|
|
24
21
|
migrations.AlterField(
|
|
25
22
|
model_name="appointment",
|
|
26
23
|
name="modified",
|
|
27
|
-
field=models.DateTimeField(
|
|
28
|
-
default=edc_utils.date.get_utcnow, editable=False
|
|
29
|
-
),
|
|
24
|
+
field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
|
|
30
25
|
),
|
|
31
26
|
migrations.AlterField(
|
|
32
27
|
model_name="historicalappointment",
|
|
33
28
|
name="created",
|
|
34
|
-
field=models.DateTimeField(
|
|
35
|
-
default=edc_utils.date.get_utcnow, editable=False
|
|
36
|
-
),
|
|
29
|
+
field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
|
|
37
30
|
),
|
|
38
31
|
migrations.AlterField(
|
|
39
32
|
model_name="historicalappointment",
|
|
40
33
|
name="modified",
|
|
41
|
-
field=models.DateTimeField(
|
|
42
|
-
default=edc_utils.date.get_utcnow, editable=False
|
|
43
|
-
),
|
|
34
|
+
field=models.DateTimeField(default=edc_utils.date.get_utcnow, editable=False),
|
|
44
35
|
),
|
|
45
36
|
migrations.AlterUniqueTogether(name="appointment", unique_together=set([])),
|
|
46
37
|
migrations.RemoveField(model_name="appointment", name="consent_version"),
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
# Generated by Django 1.10.4 on 2017-01-06 19:18
|
|
3
3
|
from __future__ import unicode_literals
|
|
4
4
|
|
|
5
|
+
from django.db import migrations, models
|
|
6
|
+
|
|
5
7
|
import edc_model_fields.fields.hostname_modification_field
|
|
6
8
|
import edc_model_fields.fields.userfield
|
|
7
9
|
import edc_utils
|
|
8
|
-
from django.db import migrations, models
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class Migration(migrations.Migration):
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# Generated by Django 2.0b1 on 2017-11-15 16:01
|
|
2
2
|
|
|
3
3
|
import _socket
|
|
4
|
-
import edc_model_fields.fields.userfield
|
|
5
4
|
from django.db import migrations, models
|
|
6
5
|
|
|
6
|
+
import edc_model_fields.fields.userfield
|
|
7
|
+
|
|
7
8
|
|
|
8
9
|
class Migration(migrations.Migration):
|
|
9
10
|
dependencies = [("edc_appointment", "0007_auto_20170302_2220")]
|
|
@@ -17,9 +18,7 @@ class Migration(migrations.Migration):
|
|
|
17
18
|
"verbose_name": "historical ",
|
|
18
19
|
},
|
|
19
20
|
),
|
|
20
|
-
migrations.RemoveField(
|
|
21
|
-
model_name="historicalappointment", name="visit_instance"
|
|
22
|
-
),
|
|
21
|
+
migrations.RemoveField(model_name="historicalappointment", name="visit_instance"),
|
|
23
22
|
migrations.AddField(
|
|
24
23
|
model_name="appointment",
|
|
25
24
|
name="device_created",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Generated by Django 4.1.2 on 2023-01-24 15:14
|
|
2
2
|
|
|
3
|
-
from django.db import migrations, models
|
|
4
3
|
import django.db.models.deletion
|
|
4
|
+
from django.db import migrations, models
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class Migration(migrations.Migration):
|
|
@@ -25,9 +25,7 @@ class Migration(migrations.Migration):
|
|
|
25
25
|
),
|
|
26
26
|
(
|
|
27
27
|
"plural_name",
|
|
28
|
-
models.CharField(
|
|
29
|
-
max_length=250, null=True, verbose_name="Plural name"
|
|
30
|
-
),
|
|
28
|
+
models.CharField(max_length=250, null=True, verbose_name="Plural name"),
|
|
31
29
|
),
|
|
32
30
|
(
|
|
33
31
|
"display_name",
|