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
|
@@ -19,9 +19,7 @@ if TYPE_CHECKING:
|
|
|
19
19
|
from ..models import RxRefill
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
class StudyMedicationCrfModelMixin(
|
|
23
|
-
PreviousNextModelMixin, StudyMedicationRefillModelMixin
|
|
24
|
-
):
|
|
22
|
+
class StudyMedicationCrfModelMixin(PreviousNextModelMixin, StudyMedicationRefillModelMixin):
|
|
25
23
|
"""Declare with field subject_visit using a CRF model mixin"""
|
|
26
24
|
|
|
27
25
|
def save(self, *args, **kwargs):
|
|
@@ -50,9 +48,7 @@ class StudyMedicationCrfModelMixin(
|
|
|
50
48
|
"report_datetime",
|
|
51
49
|
None,
|
|
52
50
|
) or getattr(
|
|
53
|
-
get_next_appointment(
|
|
54
|
-
self.related_visit.appointment, include_interim=True
|
|
55
|
-
),
|
|
51
|
+
get_next_appointment(self.related_visit.appointment, include_interim=True),
|
|
56
52
|
"appt_datetime",
|
|
57
53
|
None,
|
|
58
54
|
)
|
|
@@ -60,9 +56,7 @@ class StudyMedicationCrfModelMixin(
|
|
|
60
56
|
# if None, means there is not a next appointment
|
|
61
57
|
self.refill_end_datetime = self.refill_start_datetime
|
|
62
58
|
|
|
63
|
-
self.number_of_days = (
|
|
64
|
-
self.refill_end_datetime - self.refill_start_datetime
|
|
65
|
-
).days
|
|
59
|
+
self.number_of_days = (self.refill_end_datetime - self.refill_start_datetime).days
|
|
66
60
|
|
|
67
61
|
if not self.rx:
|
|
68
62
|
dt = formatted_datetime(self.refill_start_datetime)
|
|
@@ -20,9 +20,7 @@ class Manager(models.Manager):
|
|
|
20
20
|
class DosageGuideline(BaseUuidModel):
|
|
21
21
|
"""Dosage guidelines."""
|
|
22
22
|
|
|
23
|
-
medication = models.ForeignKey(
|
|
24
|
-
Medication, on_delete=PROTECT, null=True, blank=False
|
|
25
|
-
)
|
|
23
|
+
medication = models.ForeignKey(Medication, on_delete=PROTECT, null=True, blank=False)
|
|
26
24
|
|
|
27
25
|
dose = models.DecimalField(
|
|
28
26
|
max_digits=8,
|
|
@@ -26,9 +26,7 @@ class Manager(models.Manager):
|
|
|
26
26
|
|
|
27
27
|
class Formulation(BaseUuidModel):
|
|
28
28
|
|
|
29
|
-
medication = models.ForeignKey(
|
|
30
|
-
Medication, on_delete=PROTECT, null=True, blank=False
|
|
31
|
-
)
|
|
29
|
+
medication = models.ForeignKey(Medication, on_delete=PROTECT, null=True, blank=False)
|
|
32
30
|
|
|
33
31
|
strength = models.DecimalField(max_digits=6, decimal_places=1)
|
|
34
32
|
|
|
@@ -79,9 +79,7 @@ class Rx(
|
|
|
79
79
|
|
|
80
80
|
randomizer_name = models.CharField(max_length=25, null=True, blank=True)
|
|
81
81
|
|
|
82
|
-
weight_in_kgs = models.DecimalField(
|
|
83
|
-
max_digits=6, decimal_places=1, null=True, blank=True
|
|
84
|
-
)
|
|
82
|
+
weight_in_kgs = models.DecimalField(max_digits=6, decimal_places=1, null=True, blank=True)
|
|
85
83
|
|
|
86
84
|
clinician_initials = models.CharField(max_length=3, null=True)
|
|
87
85
|
|
|
@@ -141,9 +141,7 @@ class RxRefill(
|
|
|
141
141
|
|
|
142
142
|
def save(self, *args, **kwargs):
|
|
143
143
|
self.adjust_end_datetimes()
|
|
144
|
-
self.number_of_days = (
|
|
145
|
-
self.refill_end_datetime - self.refill_start_datetime
|
|
146
|
-
).days
|
|
144
|
+
self.number_of_days = (self.refill_end_datetime - self.refill_start_datetime).days
|
|
147
145
|
if not self.weight_in_kgs:
|
|
148
146
|
self.weight_in_kgs = self.rx.weight_in_kgs
|
|
149
147
|
self.dose = Decimal(str(self.get_dose()))
|
|
@@ -191,9 +189,7 @@ class RxRefill(
|
|
|
191
189
|
)
|
|
192
190
|
* self.roundup_divisible_by
|
|
193
191
|
)
|
|
194
|
-
return (
|
|
195
|
-
float(self.get_dose()) * float(self.frequency) * float(self.number_of_days)
|
|
196
|
-
)
|
|
192
|
+
return float(self.get_dose()) * float(self.frequency) * float(self.number_of_days)
|
|
197
193
|
|
|
198
194
|
@property
|
|
199
195
|
def subject_identifier(self):
|
edc_pharmacy/models/signals.py
CHANGED
|
@@ -51,9 +51,7 @@ def stock_on_post_save(sender, instance, raw, created, update_fields, **kwargs):
|
|
|
51
51
|
sender=StockAdjustment,
|
|
52
52
|
dispatch_uid="update_stock_adjustment_on_post_save",
|
|
53
53
|
)
|
|
54
|
-
def stock_adjustment_on_post_save(
|
|
55
|
-
sender, instance, raw, created, update_fields, **kwargs
|
|
56
|
-
):
|
|
54
|
+
def stock_adjustment_on_post_save(sender, instance, raw, created, update_fields, **kwargs):
|
|
57
55
|
"""Update unit qty"""
|
|
58
56
|
if not raw and not update_fields:
|
|
59
57
|
instance.stock.unit_qty_in = instance.unit_qty_in_new
|
|
@@ -70,31 +68,25 @@ def order_item_on_post_save(sender, instance, raw, created, update_fields, **kwa
|
|
|
70
68
|
if not raw and not update_fields:
|
|
71
69
|
# recalculate unit_qty
|
|
72
70
|
unit_qty_ordered = instance.qty * instance.container.qty
|
|
73
|
-
instance.unit_qty = unit_qty_ordered - (
|
|
74
|
-
instance.unit_qty_received or Decimal(0)
|
|
75
|
-
)
|
|
71
|
+
instance.unit_qty = unit_qty_ordered - (instance.unit_qty_received or Decimal(0))
|
|
76
72
|
instance.save(update_fields=["unit_qty"])
|
|
77
73
|
|
|
78
74
|
|
|
79
75
|
@receiver(post_save, sender=Receive, dispatch_uid="receive_on_post_save")
|
|
80
|
-
def receive_on_post_save(
|
|
81
|
-
sender, instance, raw, created, update_fields, **kwargs
|
|
82
|
-
) -> None:
|
|
76
|
+
def receive_on_post_save(sender, instance, raw, created, update_fields, **kwargs) -> None:
|
|
83
77
|
if not raw and not update_fields:
|
|
84
78
|
pass
|
|
85
79
|
|
|
86
80
|
|
|
87
|
-
@receiver(
|
|
88
|
-
post_save, sender=ReceiveItem, dispatch_uid="update_receive_item_on_post_save"
|
|
89
|
-
)
|
|
81
|
+
@receiver(post_save, sender=ReceiveItem, dispatch_uid="update_receive_item_on_post_save")
|
|
90
82
|
def receive_item_on_post_save(sender, instance, raw, created, update_fields, **kwargs):
|
|
91
83
|
if not raw and update_fields != ["added_to_stock"]:
|
|
92
84
|
receive_items = ReceiveItem.objects.filter(receive=instance.receive)
|
|
93
85
|
instance.receive.item_count = receive_items.count()
|
|
94
86
|
instance.order_item.unit_qty_received = (
|
|
95
|
-
instance.order_item.receiveitem_set.all().aggregate(
|
|
96
|
-
|
|
97
|
-
|
|
87
|
+
instance.order_item.receiveitem_set.all().aggregate(unit_qty=Sum("unit_qty"))[
|
|
88
|
+
"unit_qty"
|
|
89
|
+
]
|
|
98
90
|
) or Decimal(0.0)
|
|
99
91
|
if instance.order_item.unit_qty_received == instance.order_item.unit_qty:
|
|
100
92
|
instance.order_item.status = COMPLETE
|
|
@@ -106,9 +98,9 @@ def receive_item_on_post_save(sender, instance, raw, created, update_fields, **k
|
|
|
106
98
|
unit_qty_received = OrderItem.objects.filter(order=order).aggregate(
|
|
107
99
|
unit_qty_received=Sum("unit_qty_received")
|
|
108
100
|
)["unit_qty_received"] or Decimal(0.0)
|
|
109
|
-
unit_qty = OrderItem.objects.filter(order=order).aggregate(
|
|
110
|
-
|
|
111
|
-
|
|
101
|
+
unit_qty = OrderItem.objects.filter(order=order).aggregate(unit_qty=Sum("unit_qty"))[
|
|
102
|
+
"unit_qty"
|
|
103
|
+
] or Decimal(0.0)
|
|
112
104
|
if unit_qty_received == unit_qty:
|
|
113
105
|
order.status = COMPLETE
|
|
114
106
|
order.save()
|
|
@@ -134,9 +126,7 @@ def stock_request_on_post_save(
|
|
|
134
126
|
instance.save(update_fields=["item_count"])
|
|
135
127
|
|
|
136
128
|
|
|
137
|
-
@receiver(
|
|
138
|
-
post_save, sender=StockRequestItem, dispatch_uid="stock_request_item_on_post_save"
|
|
139
|
-
)
|
|
129
|
+
@receiver(post_save, sender=StockRequestItem, dispatch_uid="stock_request_item_on_post_save")
|
|
140
130
|
def stock_request_item_on_post_save(
|
|
141
131
|
sender, instance, raw, created, update_fields, **kwargs
|
|
142
132
|
) -> None:
|
|
@@ -38,9 +38,7 @@ class Allocation(BaseUuidModel):
|
|
|
38
38
|
blank=False,
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
-
assignment = models.ForeignKey(
|
|
42
|
-
Assignment, on_delete=models.PROTECT, null=True, blank=True
|
|
43
|
-
)
|
|
41
|
+
assignment = models.ForeignKey(Assignment, on_delete=models.PROTECT, null=True, blank=True)
|
|
44
42
|
|
|
45
43
|
stock_request_item = models.OneToOneField(
|
|
46
44
|
StockRequestItem,
|
|
@@ -69,14 +67,10 @@ class Allocation(BaseUuidModel):
|
|
|
69
67
|
|
|
70
68
|
def get_assignment(self) -> Assignment:
|
|
71
69
|
rx = Rx.objects.get(
|
|
72
|
-
registered_subject=RegisteredSubject.objects.get(
|
|
73
|
-
id=self.registered_subject.id
|
|
74
|
-
)
|
|
70
|
+
registered_subject=RegisteredSubject.objects.get(id=self.registered_subject.id)
|
|
75
71
|
)
|
|
76
72
|
randomizer = site_randomizers.get(rx.randomizer_name)
|
|
77
|
-
assignment = randomizer.get_assignment(
|
|
78
|
-
self.registered_subject.subject_identifier
|
|
79
|
-
)
|
|
73
|
+
assignment = randomizer.get_assignment(self.registered_subject.subject_identifier)
|
|
80
74
|
return Assignment.objects.get(name=assignment)
|
|
81
75
|
|
|
82
76
|
class Meta(BaseUuidModel.Meta):
|
|
@@ -45,9 +45,7 @@ class Confirmation(BaseUuidModel):
|
|
|
45
45
|
|
|
46
46
|
def save(self, *args, **kwargs):
|
|
47
47
|
if not self.confirmation_identifier:
|
|
48
|
-
self.confirmation_identifier = (
|
|
49
|
-
f"{get_next_value(self._meta.label_lower):06d}"
|
|
50
|
-
)
|
|
48
|
+
self.confirmation_identifier = f"{get_next_value(self._meta.label_lower):06d}"
|
|
51
49
|
super().save(*args, **kwargs)
|
|
52
50
|
|
|
53
51
|
class Meta(BaseUuidModel.Meta):
|
|
@@ -16,9 +16,7 @@ class Manager(models.Manager):
|
|
|
16
16
|
|
|
17
17
|
class ConfirmationAtSiteItem(SiteModelMixin, BaseUuidModel):
|
|
18
18
|
|
|
19
|
-
confirmation_at_site = models.ForeignKey(
|
|
20
|
-
ConfirmationAtSite, on_delete=models.PROTECT
|
|
21
|
-
)
|
|
19
|
+
confirmation_at_site = models.ForeignKey(ConfirmationAtSite, on_delete=models.PROTECT)
|
|
22
20
|
|
|
23
21
|
transfer_confirmation_item_identifier = models.CharField(
|
|
24
22
|
max_length=36,
|
|
@@ -16,9 +16,7 @@ class Container(BaseUuidModel):
|
|
|
16
16
|
|
|
17
17
|
display_name = models.CharField(max_length=100, unique=True, null=True, blank=True)
|
|
18
18
|
|
|
19
|
-
container_type = models.ForeignKey(
|
|
20
|
-
ContainerType, on_delete=models.PROTECT, null=True
|
|
21
|
-
)
|
|
19
|
+
container_type = models.ForeignKey(ContainerType, on_delete=models.PROTECT, null=True)
|
|
22
20
|
|
|
23
21
|
units = models.ForeignKey(ContainerUnits, on_delete=models.PROTECT, null=True)
|
|
24
22
|
|
|
@@ -29,9 +29,7 @@ class Dispense(SiteModelMixin, BaseUuidModel):
|
|
|
29
29
|
|
|
30
30
|
rx = models.ForeignKey(Rx, on_delete=models.PROTECT, null=True, blank=False)
|
|
31
31
|
|
|
32
|
-
location = models.ForeignKey(
|
|
33
|
-
Location, on_delete=models.PROTECT, null=True, blank=False
|
|
34
|
-
)
|
|
32
|
+
location = models.ForeignKey(Location, on_delete=models.PROTECT, null=True, blank=False)
|
|
35
33
|
|
|
36
34
|
to_clinician = models.BooleanField(default=False)
|
|
37
35
|
to_clinician_datetime = models.DateTimeField(null=True, blank=True)
|
|
@@ -47,9 +47,7 @@ class DispenseItem(SiteModelMixin, VisitCodeFieldsModelMixin, BaseUuidModel):
|
|
|
47
47
|
def save(self, *args, **kwargs):
|
|
48
48
|
self.site = self.dispense.site
|
|
49
49
|
if not self.dispense_item_identifier:
|
|
50
|
-
self.dispense_item_identifier = (
|
|
51
|
-
f"{get_next_value(self._meta.label_lower):010d}"
|
|
52
|
-
)
|
|
50
|
+
self.dispense_item_identifier = f"{get_next_value(self._meta.label_lower):010d}"
|
|
53
51
|
super().save(*args, **kwargs)
|
|
54
52
|
|
|
55
53
|
class Meta(BaseUuidModel.Meta):
|
edc_pharmacy/models/stock/lot.py
CHANGED
|
@@ -27,9 +27,7 @@ class Lot(BaseUuidModel):
|
|
|
27
27
|
|
|
28
28
|
product = models.ForeignKey(Product, on_delete=PROTECT, null=True, blank=False)
|
|
29
29
|
|
|
30
|
-
assignment = models.ForeignKey(
|
|
31
|
-
Assignment, on_delete=models.PROTECT, null=True, blank=True
|
|
32
|
-
)
|
|
30
|
+
assignment = models.ForeignKey(Assignment, on_delete=models.PROTECT, null=True, blank=True)
|
|
33
31
|
|
|
34
32
|
manufactured_date = models.DateField(null=True, blank=True)
|
|
35
33
|
|
|
@@ -27,9 +27,7 @@ class OrderItem(BaseUuidModel):
|
|
|
27
27
|
|
|
28
28
|
order = models.ForeignKey(Order, on_delete=models.PROTECT, null=True, blank=False)
|
|
29
29
|
|
|
30
|
-
product = models.ForeignKey(
|
|
31
|
-
Product, on_delete=models.PROTECT, null=True, blank=False
|
|
32
|
-
)
|
|
30
|
+
product = models.ForeignKey(Product, on_delete=models.PROTECT, null=True, blank=False)
|
|
33
31
|
|
|
34
32
|
container = models.ForeignKey(
|
|
35
33
|
Container,
|
|
@@ -64,9 +62,7 @@ class OrderItem(BaseUuidModel):
|
|
|
64
62
|
history = HistoricalRecords()
|
|
65
63
|
|
|
66
64
|
def __str__(self):
|
|
67
|
-
return
|
|
68
|
-
f"{self.order_item_identifier}:{self.product.name} | {self.container.name}"
|
|
69
|
-
)
|
|
65
|
+
return f"{self.order_item_identifier}:{self.product.name} | {self.container.name}"
|
|
70
66
|
|
|
71
67
|
def save(self, *args, **kwargs):
|
|
72
68
|
if not self.id:
|
|
@@ -21,15 +21,11 @@ class Product(BaseUuidModel):
|
|
|
21
21
|
help_text="A sequential unique identifier set by the EDC",
|
|
22
22
|
)
|
|
23
23
|
|
|
24
|
-
name = models.CharField(
|
|
25
|
-
max_length=50, blank=True, help_text="Leave blank to use default"
|
|
26
|
-
)
|
|
24
|
+
name = models.CharField(max_length=50, blank=True, help_text="Leave blank to use default")
|
|
27
25
|
|
|
28
26
|
formulation = models.ForeignKey(Formulation, on_delete=PROTECT)
|
|
29
27
|
|
|
30
|
-
assignment = models.ForeignKey(
|
|
31
|
-
Assignment, on_delete=PROTECT, null=True, blank=False
|
|
32
|
-
)
|
|
28
|
+
assignment = models.ForeignKey(Assignment, on_delete=PROTECT, null=True, blank=False)
|
|
33
29
|
|
|
34
30
|
objects = Manager()
|
|
35
31
|
|
|
@@ -29,9 +29,7 @@ class ReceiveItem(BaseUuidModel):
|
|
|
29
29
|
|
|
30
30
|
receive_item_datetime = models.DateTimeField(default=get_utcnow)
|
|
31
31
|
|
|
32
|
-
receive = models.ForeignKey(
|
|
33
|
-
Receive, on_delete=models.PROTECT, null=True, blank=False
|
|
34
|
-
)
|
|
32
|
+
receive = models.ForeignKey(Receive, on_delete=models.PROTECT, null=True, blank=False)
|
|
35
33
|
|
|
36
34
|
container = models.ForeignKey(
|
|
37
35
|
Container,
|
|
@@ -41,9 +39,7 @@ class ReceiveItem(BaseUuidModel):
|
|
|
41
39
|
limit_choices_to={"may_receive_as": True},
|
|
42
40
|
)
|
|
43
41
|
|
|
44
|
-
order_item = models.ForeignKey(
|
|
45
|
-
OrderItem, on_delete=models.PROTECT, null=True, blank=False
|
|
46
|
-
)
|
|
42
|
+
order_item = models.ForeignKey(OrderItem, on_delete=models.PROTECT, null=True, blank=False)
|
|
47
43
|
|
|
48
44
|
lot = models.ForeignKey(
|
|
49
45
|
Lot,
|
|
@@ -89,9 +85,7 @@ class ReceiveItem(BaseUuidModel):
|
|
|
89
85
|
|
|
90
86
|
def save(self, *args, **kwargs):
|
|
91
87
|
if not self.receive_item_identifier:
|
|
92
|
-
self.receive_item_identifier = (
|
|
93
|
-
f"{get_next_value(self._meta.label_lower):06d}"
|
|
94
|
-
)
|
|
88
|
+
self.receive_item_identifier = f"{get_next_value(self._meta.label_lower):06d}"
|
|
95
89
|
if not self.receive:
|
|
96
90
|
raise ReceiveItemError("Receive may not be null.")
|
|
97
91
|
if not self.container:
|
|
@@ -112,9 +106,7 @@ class ReceiveItem(BaseUuidModel):
|
|
|
112
106
|
f"Got {self.container}"
|
|
113
107
|
)
|
|
114
108
|
if self.order_item.product.assignment != self.lot.assignment:
|
|
115
|
-
raise ReceiveError(
|
|
116
|
-
"Lot number assignment does not match product assignment!"
|
|
117
|
-
)
|
|
109
|
+
raise ReceiveError("Lot number assignment does not match product assignment!")
|
|
118
110
|
super().save(*args, **kwargs)
|
|
119
111
|
|
|
120
112
|
class Meta(BaseUuidModel.Meta):
|
|
@@ -91,9 +91,7 @@ class RepackRequest(BaseUuidModel):
|
|
|
91
91
|
"Unconfirmed stock item. Only confirmed stock items may "
|
|
92
92
|
"be used to repack. Perhaps catch this in the form"
|
|
93
93
|
)
|
|
94
|
-
self.processed_qty = (
|
|
95
|
-
Decimal(0) if self.processed_qty is None else self.processed_qty
|
|
96
|
-
)
|
|
94
|
+
self.processed_qty = Decimal(0) if self.processed_qty is None else self.processed_qty
|
|
97
95
|
super().save(*args, **kwargs)
|
|
98
96
|
|
|
99
97
|
class Meta(BaseUuidModel.Meta):
|
|
@@ -92,9 +92,7 @@ class Stock(BaseUuidModel):
|
|
|
92
92
|
Lot, verbose_name="Batch", on_delete=models.PROTECT, null=True, blank=False
|
|
93
93
|
)
|
|
94
94
|
|
|
95
|
-
container = models.ForeignKey(
|
|
96
|
-
Container, on_delete=models.PROTECT, null=True, blank=False
|
|
97
|
-
)
|
|
95
|
+
container = models.ForeignKey(Container, on_delete=models.PROTECT, null=True, blank=False)
|
|
98
96
|
|
|
99
97
|
location = models.ForeignKey(Location, on_delete=PROTECT, null=True, blank=False)
|
|
100
98
|
|
|
@@ -178,8 +176,7 @@ class Stock(BaseUuidModel):
|
|
|
178
176
|
def update_transferred(self) -> bool:
|
|
179
177
|
if (
|
|
180
178
|
self.allocation
|
|
181
|
-
and self.allocation.stock_request_item.stock_request.location
|
|
182
|
-
== self.location
|
|
179
|
+
and self.allocation.stock_request_item.stock_request.location == self.location
|
|
183
180
|
and self.container.may_request_as
|
|
184
181
|
):
|
|
185
182
|
return True
|
|
@@ -192,9 +189,7 @@ class Stock(BaseUuidModel):
|
|
|
192
189
|
if not stock:
|
|
193
190
|
stock = self
|
|
194
191
|
if stock.product.assignment != stock.lot.assignment:
|
|
195
|
-
raise AssignmentError(
|
|
196
|
-
"Lot number assignment does not match product assignment!"
|
|
197
|
-
)
|
|
192
|
+
raise AssignmentError("Lot number assignment does not match product assignment!")
|
|
198
193
|
if self.allocation and self.allocation.assignment != stock.lot.assignment:
|
|
199
194
|
raise AllocationError(
|
|
200
195
|
f"Allocation assignment does not match lot assignment! Got {self.code}."
|
|
@@ -40,9 +40,7 @@ class StockRequestItem(VisitCodeFieldsModelMixin, BaseUuidModel):
|
|
|
40
40
|
|
|
41
41
|
rx = models.ForeignKey(Rx, on_delete=models.PROTECT, null=True, blank=False)
|
|
42
42
|
|
|
43
|
-
assignment = models.ForeignKey(
|
|
44
|
-
Assignment, on_delete=models.PROTECT, null=True, blank=True
|
|
45
|
-
)
|
|
43
|
+
assignment = models.ForeignKey(Assignment, on_delete=models.PROTECT, null=True, blank=True)
|
|
46
44
|
|
|
47
45
|
registered_subject = models.ForeignKey(
|
|
48
46
|
RegisteredSubject,
|
|
@@ -59,7 +57,9 @@ class StockRequestItem(VisitCodeFieldsModelMixin, BaseUuidModel):
|
|
|
59
57
|
history = HistoricalRecords()
|
|
60
58
|
|
|
61
59
|
def __str__(self):
|
|
62
|
-
return
|
|
60
|
+
return (
|
|
61
|
+
f"{self.registered_subject.subject_identifier}: {self.stock_request.formulation}"
|
|
62
|
+
)
|
|
63
63
|
|
|
64
64
|
def save(self, *args, **kwargs):
|
|
65
65
|
"""Important: check `bulk_create_stock_request_items`
|
|
@@ -47,9 +47,7 @@ class StockTransferItem(BaseUuidModel):
|
|
|
47
47
|
|
|
48
48
|
def save(self, *args, **kwargs):
|
|
49
49
|
if not self.transfer_item_identifier:
|
|
50
|
-
self.transfer_item_identifier = (
|
|
51
|
-
f"{get_next_value(self._meta.label_lower):06d}"
|
|
52
|
-
)
|
|
50
|
+
self.transfer_item_identifier = f"{get_next_value(self._meta.label_lower):06d}"
|
|
53
51
|
if self.stock.location != self.stock_transfer.from_location:
|
|
54
52
|
raise StockTransferError(
|
|
55
53
|
"Location mismatch. Current stock location must match "
|
|
@@ -13,9 +13,7 @@ class Manager(models.Manager):
|
|
|
13
13
|
|
|
14
14
|
class Supplier(AddressModelMixin, ContactModelMixin, BaseUuidModel):
|
|
15
15
|
|
|
16
|
-
supplier_identifier = models.CharField(
|
|
17
|
-
max_length=36, unique=True, null=True, blank=True
|
|
18
|
-
)
|
|
16
|
+
supplier_identifier = models.CharField(max_length=36, unique=True, null=True, blank=True)
|
|
19
17
|
|
|
20
18
|
name = models.CharField(max_length=255, unique=True)
|
|
21
19
|
|
|
@@ -75,10 +75,7 @@ def repackage_for_subject(
|
|
|
75
75
|
"Did not expect subject identifier. SID has not been allocated. "
|
|
76
76
|
f"Got sid `{rando_sid}`."
|
|
77
77
|
)
|
|
78
|
-
if
|
|
79
|
-
subject_identifier
|
|
80
|
-
and randomization_list.subject_identifier != subject_identifier
|
|
81
|
-
):
|
|
78
|
+
if subject_identifier and randomization_list.subject_identifier != subject_identifier:
|
|
82
79
|
raise PackagingSubjectIdentifierMismatchError(
|
|
83
80
|
f"Subject identifier mismatch. Got sid `{rando_sid}`."
|
|
84
81
|
)
|
|
@@ -32,9 +32,7 @@ class ManifestReport(Report):
|
|
|
32
32
|
width, height = A4
|
|
33
33
|
canvas.setFontSize(6)
|
|
34
34
|
text_width = stringWidth(self.protocol_name, "Helvetica", 6)
|
|
35
|
-
canvas.drawRightString(
|
|
36
|
-
width - text_width, height - 20, self.protocol_name.upper()
|
|
37
|
-
)
|
|
35
|
+
canvas.drawRightString(width - text_width, height - 20, self.protocol_name.upper())
|
|
38
36
|
canvas.drawString(
|
|
39
37
|
40,
|
|
40
38
|
height - 30,
|
|
@@ -93,12 +91,8 @@ class ManifestReport(Report):
|
|
|
93
91
|
fontSize=8,
|
|
94
92
|
fontName="Helvetica-Bold",
|
|
95
93
|
)
|
|
96
|
-
left_style = ParagraphStyle(
|
|
97
|
-
|
|
98
|
-
)
|
|
99
|
-
right_style = ParagraphStyle(
|
|
100
|
-
name="line_data_medium", alignment=TA_RIGHT, fontSize=8
|
|
101
|
-
)
|
|
94
|
+
left_style = ParagraphStyle(name="line_data_medium", alignment=TA_LEFT, fontSize=8)
|
|
95
|
+
right_style = ParagraphStyle(name="line_data_medium", alignment=TA_RIGHT, fontSize=8)
|
|
102
96
|
from_location = self.stock_transfer.from_location.display_name
|
|
103
97
|
contact_name = self.stock_transfer.from_location.contact_name or ""
|
|
104
98
|
tel = self.stock_transfer.from_location.contact_tel or ""
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from django.db.models import QuerySet, Sum
|
|
2
2
|
from django.utils.translation import gettext as _
|
|
3
|
-
from edc_pdf_reports import Report
|
|
4
|
-
from edc_protocol.research_protocol_config import ResearchProtocolConfig
|
|
5
3
|
from reportlab.graphics.barcode import code128
|
|
6
4
|
from reportlab.lib import colors
|
|
7
5
|
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
|
|
@@ -10,6 +8,9 @@ from reportlab.lib.units import cm, mm
|
|
|
10
8
|
from reportlab.pdfbase.pdfmetrics import stringWidth
|
|
11
9
|
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer, Table, TableStyle
|
|
12
10
|
|
|
11
|
+
from edc_pdf_reports import Report
|
|
12
|
+
from edc_protocol.research_protocol_config import ResearchProtocolConfig
|
|
13
|
+
|
|
13
14
|
from ..models import Stock
|
|
14
15
|
from ..utils import get_related_or_none
|
|
15
16
|
|
|
@@ -25,9 +26,7 @@ class StockReport(Report):
|
|
|
25
26
|
width, height = self.page.get("pagesize")
|
|
26
27
|
canvas.setFontSize(6)
|
|
27
28
|
text_width = stringWidth(self.protocol_name, "Helvetica", 6)
|
|
28
|
-
canvas.drawRightString(
|
|
29
|
-
width - text_width, height - 20, self.protocol_name.upper()
|
|
30
|
-
)
|
|
29
|
+
canvas.drawRightString(width - text_width, height - 20, self.protocol_name.upper())
|
|
31
30
|
canvas.drawString(
|
|
32
31
|
40,
|
|
33
32
|
height - 30,
|
|
@@ -97,9 +96,7 @@ class StockReport(Report):
|
|
|
97
96
|
]
|
|
98
97
|
]
|
|
99
98
|
for index, stock_obj in enumerate(self.queryset.all()):
|
|
100
|
-
barcode = code128.Code128(
|
|
101
|
-
stock_obj.code, barHeight=5 * mm, barWidth=0.7, gap=1.7
|
|
102
|
-
)
|
|
99
|
+
barcode = code128.Code128(stock_obj.code, barHeight=5 * mm, barWidth=0.7, gap=1.7)
|
|
103
100
|
subject_identifier = (
|
|
104
101
|
stock_obj.allocation.registered_subject.subject_identifier
|
|
105
102
|
if get_related_or_none(stock_obj, "allocation")
|
|
@@ -207,9 +204,7 @@ class StockReport(Report):
|
|
|
207
204
|
catsd += "C" if get_related_or_none(stock_obj, "confirmation") else "-"
|
|
208
205
|
catsd += "A" if get_related_or_none(stock_obj, "allocation") else "-"
|
|
209
206
|
catsd += "T" if get_related_or_none(stock_obj, "stocktransferitem") else "-"
|
|
210
|
-
catsd += (
|
|
211
|
-
"S" if get_related_or_none(stock_obj, "confirmationatsiteitem") else "-"
|
|
212
|
-
)
|
|
207
|
+
catsd += "S" if get_related_or_none(stock_obj, "confirmationatsiteitem") else "-"
|
|
213
208
|
catsd += "B" if get_related_or_none(stock_obj, "stored_at_site") else "-"
|
|
214
209
|
catsd += "D" if get_related_or_none(stock_obj, "dispenseitem") else "-"
|
|
215
210
|
return catsd
|
|
@@ -11,12 +11,8 @@ def adjust_previous_end_datetime(
|
|
|
11
11
|
user_modified: str | None = None,
|
|
12
12
|
modified: str | None = None,
|
|
13
13
|
) -> None:
|
|
14
|
-
if previous_obj.refill_end_datetime != refill_start_datetime - relativedelta(
|
|
15
|
-
minutes=1
|
|
16
|
-
):
|
|
17
|
-
previous_obj.refill_end_datetime = refill_start_datetime - relativedelta(
|
|
18
|
-
minutes=1
|
|
19
|
-
)
|
|
14
|
+
if previous_obj.refill_end_datetime != refill_start_datetime - relativedelta(minutes=1):
|
|
15
|
+
previous_obj.refill_end_datetime = refill_start_datetime - relativedelta(minutes=1)
|
|
20
16
|
previous_obj.number_of_days = (
|
|
21
17
|
previous_obj.refill_end_datetime - previous_obj.refill_start_datetime
|
|
22
18
|
).days
|
|
@@ -31,9 +31,7 @@ def create_next_refill(instance: Any, related_visit_model_attr: str) -> Any | No
|
|
|
31
31
|
refill_start_datetime=instance.refill_end_datetime,
|
|
32
32
|
refill_end_datetime=refill_end_datetime,
|
|
33
33
|
roundup_divisible_by=instance.roundup_divisible_by,
|
|
34
|
-
subject_identifier=getattr(
|
|
35
|
-
instance, related_visit_model_attr
|
|
36
|
-
).subject_identifier,
|
|
34
|
+
subject_identifier=getattr(instance, related_visit_model_attr).subject_identifier,
|
|
37
35
|
weight_in_kgs=getattr(instance, "weight_in_kgs", None),
|
|
38
36
|
)
|
|
39
37
|
rx_refill = refill_creator.rx_refill
|
|
@@ -32,9 +32,7 @@ def create_refill(
|
|
|
32
32
|
rx_refill = None
|
|
33
33
|
creator = None
|
|
34
34
|
try:
|
|
35
|
-
rx_refill = get_rxrefill_model_cls().objects.get(
|
|
36
|
-
refill_identifier=refill_identifier
|
|
37
|
-
)
|
|
35
|
+
rx_refill = get_rxrefill_model_cls().objects.get(refill_identifier=refill_identifier)
|
|
38
36
|
except ObjectDoesNotExist:
|
|
39
37
|
creator = RefillCreator(
|
|
40
38
|
refill_identifier=refill_identifier,
|
|
@@ -128,14 +128,10 @@ class RefillCreator:
|
|
|
128
128
|
try:
|
|
129
129
|
rx = get_rx_model_cls().objects.get(**opts)
|
|
130
130
|
except ObjectDoesNotExist:
|
|
131
|
-
raise PrescriptionError(
|
|
132
|
-
f"Subject does not have a prescription. Got {opts}."
|
|
133
|
-
)
|
|
131
|
+
raise PrescriptionError(f"Subject does not have a prescription. Got {opts}.")
|
|
134
132
|
else:
|
|
135
133
|
if self.refill_start_datetime.date() < rx.rx_date:
|
|
136
|
-
rx_date = rx.rx_date.strftime(
|
|
137
|
-
convert_php_dateformat(settings.DATE_FORMAT)
|
|
138
|
-
)
|
|
134
|
+
rx_date = rx.rx_date.strftime(convert_php_dateformat(settings.DATE_FORMAT))
|
|
139
135
|
raise PrescriptionNotStarted(
|
|
140
136
|
f"Subject's prescription not started. Starts on {rx_date}. "
|
|
141
137
|
f"Got {self.subject_identifier} attempting "
|
|
@@ -20,9 +20,7 @@ def scan_network(ip_range):
|
|
|
20
20
|
try:
|
|
21
21
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
22
22
|
sock.settimeout(1) # Timeout in seconds
|
|
23
|
-
result = sock.connect_ex(
|
|
24
|
-
(ip, 9100)
|
|
25
|
-
) # Port 9100 is common for network printers
|
|
23
|
+
result = sock.connect_ex((ip, 9100)) # Port 9100 is common for network printers
|
|
26
24
|
if result == 0:
|
|
27
25
|
open_printers.append(ip)
|
|
28
26
|
sock.close()
|
edc_pharmacy/settings.py
CHANGED
|
@@ -15,9 +15,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
|
|
|
15
15
|
# See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/
|
|
16
16
|
|
|
17
17
|
# SECURITY WARNING: keep the secret key used in production secret!
|
|
18
|
-
SECRET_KEY =
|
|
19
|
-
"django-insecure-+#-*m&byi1w8=#e5nr))^kollb=k1b#rvjffo#+teji^qpm14o" # nosec B105
|
|
20
|
-
)
|
|
18
|
+
SECRET_KEY = "django-insecure-+#-*m&byi1w8=#e5nr))^kollb=k1b#rvjffo#+teji^qpm14o" # nosec B105
|
|
21
19
|
|
|
22
20
|
# SECURITY WARNING: don't run with debug turned on in production!
|
|
23
21
|
DEBUG = True
|
|
@@ -29,12 +27,8 @@ AUTO_CREATE_KEYS = True
|
|
|
29
27
|
APP_NAME = "edc_pharmacy"
|
|
30
28
|
|
|
31
29
|
SUBJECT_VISIT_MODEL = "edc_visit_tracking.subjectvisit"
|
|
32
|
-
EDC_PROTOCOL_STUDY_OPEN_DATETIME = datetime(
|
|
33
|
-
|
|
34
|
-
)
|
|
35
|
-
EDC_PROTOCOL_STUDY_CLOSE_DATETIME = datetime(
|
|
36
|
-
2033, 10, 15, tzinfo=ZoneInfo("Africa/Gaborone")
|
|
37
|
-
)
|
|
30
|
+
EDC_PROTOCOL_STUDY_OPEN_DATETIME = datetime(2013, 10, 15, tzinfo=ZoneInfo("Africa/Gaborone"))
|
|
31
|
+
EDC_PROTOCOL_STUDY_CLOSE_DATETIME = datetime(2033, 10, 15, tzinfo=ZoneInfo("Africa/Gaborone"))
|
|
38
32
|
EDC_ADVERSE_EVENT_APP_LABEL = "edc_adverse_event"
|
|
39
33
|
# Application definition
|
|
40
34
|
|
edc_pharmacy/urls.py
CHANGED
|
@@ -29,9 +29,7 @@ urlpatterns = [
|
|
|
29
29
|
DispenseView.as_view(),
|
|
30
30
|
name="dispense_url",
|
|
31
31
|
),
|
|
32
|
-
path(
|
|
33
|
-
"get-stock-transfers/", get_stock_transfers_view, name="get_stock_transfers_url"
|
|
34
|
-
),
|
|
32
|
+
path("get-stock-transfers/", get_stock_transfers_view, name="get_stock_transfers_url"),
|
|
35
33
|
path(
|
|
36
34
|
"confirmation-at-site/<uuid:session_uuid>/<str:stock_transfer_identifier>/"
|
|
37
35
|
"<int:location_id>/<int:items_to_scan>/",
|
|
@@ -37,9 +37,7 @@ def allocate_stock(
|
|
|
37
37
|
"""
|
|
38
38
|
stock_model_cls = django_apps.get_model("edc_pharmacy.stock")
|
|
39
39
|
allocation_model_cls = django_apps.get_model("edc_pharmacy.allocation")
|
|
40
|
-
registered_subject_model_cls = django_apps.get_model(
|
|
41
|
-
"edc_registration.registeredsubject"
|
|
42
|
-
)
|
|
40
|
+
registered_subject_model_cls = django_apps.get_model("edc_registration.registeredsubject")
|
|
43
41
|
allocated, skipped = [], []
|
|
44
42
|
stock_objs = []
|
|
45
43
|
for code, subject_identifier in allocation_data.items():
|