endoreg-db 0.3.6__py3-none-any.whl → 0.3.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- endoreg_db/admin.py +3 -3
- endoreg_db/apps.py +6 -6
- endoreg_db/data/__init__.py +67 -64
- endoreg_db/data/active_model/data.yaml +2 -2
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
- endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
- endoreg_db/data/case_template/template/base.yaml +7 -7
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
- endoreg_db/data/case_template/tmp/_rule_value +13 -13
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
- endoreg_db/data/center/data.yaml +59 -59
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
- endoreg_db/data/disease/cardiovascular.yaml +37 -37
- endoreg_db/data/disease/hepatology.yaml +4 -4
- endoreg_db/data/disease/misc.yaml +5 -5
- endoreg_db/data/disease/renal.yaml +4 -4
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
- endoreg_db/data/distribution/date/patient.yaml +6 -6
- endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
- endoreg_db/data/endoscope_type/data.yaml +10 -10
- endoreg_db/data/endoscopy_processor/data.yaml +45 -45
- endoreg_db/data/event/cardiology.yaml +27 -27
- endoreg_db/data/event/neurology.yaml +13 -13
- endoreg_db/data/event/surgery.yaml +12 -12
- endoreg_db/data/event/thrombembolism.yaml +19 -19
- endoreg_db/data/examination/examinations/data.yaml +65 -65
- endoreg_db/data/examination/time/data.yaml +47 -47
- endoreg_db/data/examination/time-type/data.yaml +7 -7
- endoreg_db/data/examination/type/data.yaml +5 -5
- endoreg_db/data/gender/data.yaml +18 -18
- endoreg_db/data/information_source/data.yaml +30 -30
- endoreg_db/data/information_source/medication.yaml +5 -5
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
- endoreg_db/data/lab_value/coagulation.yaml +48 -48
- endoreg_db/data/lab_value/electrolytes.yaml +189 -189
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
- endoreg_db/data/lab_value/hematology.yaml +169 -169
- endoreg_db/data/lab_value/hormones.yaml +53 -53
- endoreg_db/data/lab_value/lipids.yaml +44 -44
- endoreg_db/data/lab_value/misc.yaml +30 -30
- endoreg_db/data/lab_value/renal_function.yaml +10 -10
- endoreg_db/data/label/label/data.yaml +62 -62
- endoreg_db/data/label/label-set/data.yaml +17 -17
- endoreg_db/data/label/label-type/data.yaml +6 -6
- endoreg_db/data/medication/anticoagulation.yaml +64 -64
- endoreg_db/data/medication/tah.yaml +69 -69
- endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
- endoreg_db/data/medication_indication_type/data.yaml +10 -10
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
- endoreg_db/data/medication_intake_time/base.yaml +30 -30
- endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
- endoreg_db/data/medication_schedule/ass.yaml +12 -12
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
- endoreg_db/data/model_type/data.yaml +6 -6
- endoreg_db/data/network_device/data.yaml +17 -0
- endoreg_db/data/network_device_type/data.yaml +8 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
- endoreg_db/data/pdf_type/data.yaml +28 -28
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
- endoreg_db/data/profession/data.yaml +70 -70
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
- endoreg_db/data/unit/concentration.yaml +92 -92
- endoreg_db/data/unit/data.yaml +17 -17
- endoreg_db/data/unit/length.yaml +30 -30
- endoreg_db/data/unit/misc.yaml +19 -19
- endoreg_db/data/unit/rate.yaml +5 -5
- endoreg_db/data/unit/time.yaml +12 -12
- endoreg_db/data/unit/volume.yaml +35 -35
- endoreg_db/data/unit/weight.yaml +37 -37
- endoreg_db/data/waste/data.yaml +11 -11
- endoreg_db/forms/__init__.py +2 -2
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
- endoreg_db/forms/settings/__init__.py +8 -8
- endoreg_db/forms/unit.py +5 -5
- endoreg_db/management/commands/_load_model_template.py +40 -40
- endoreg_db/management/commands/delete_all.py +18 -18
- endoreg_db/management/commands/delete_legacy_images.py +19 -19
- endoreg_db/management/commands/delete_legacy_videos.py +16 -16
- endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
- endoreg_db/management/commands/fix_auth_permission.py +20 -20
- endoreg_db/management/commands/import_legacy_images.py +94 -94
- endoreg_db/management/commands/import_legacy_videos.py +76 -76
- endoreg_db/management/commands/load_active_model_data.py +44 -44
- endoreg_db/management/commands/load_ai_model_data.py +44 -44
- endoreg_db/management/commands/load_base_db_data.py +132 -128
- endoreg_db/management/commands/load_center_data.py +42 -42
- endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
- endoreg_db/management/commands/load_disease_classification_data.py +40 -40
- endoreg_db/management/commands/load_disease_data.py +39 -39
- endoreg_db/management/commands/load_distribution_data.py +65 -65
- endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
- endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
- endoreg_db/management/commands/load_event_data.py +40 -40
- endoreg_db/management/commands/load_examination_data.py +74 -74
- endoreg_db/management/commands/load_g_play_data.py +112 -112
- endoreg_db/management/commands/load_gender_data.py +43 -43
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
- endoreg_db/management/commands/load_information_source.py +44 -44
- endoreg_db/management/commands/load_lab_value_data.py +49 -49
- endoreg_db/management/commands/load_label_data.py +66 -66
- endoreg_db/management/commands/load_medication_data.py +40 -40
- endoreg_db/management/commands/load_medication_indication_data.py +62 -62
- endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
- endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
- endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
- endoreg_db/management/commands/load_network_data.py +49 -0
- endoreg_db/management/commands/load_pdf_type_data.py +60 -60
- endoreg_db/management/commands/load_profession_data.py +43 -43
- endoreg_db/management/commands/load_report_reader_flag.py +45 -45
- endoreg_db/management/commands/load_unit_data.py +45 -45
- endoreg_db/management/commands/load_user_groups.py +28 -28
- endoreg_db/management/commands/register_ai_model.py +65 -65
- endoreg_db/management/commands/reset_celery_schedule.py +9 -9
- endoreg_db/migrations/0001_initial.py +582 -582
- endoreg_db/migrations/0002_rawvideofile.py +26 -26
- endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
- endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
- endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
- endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
- endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
- endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
- endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
- endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
- endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
- endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
- endoreg_db/migrations/0013_rawpdffile.py +31 -31
- endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
- endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
- endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
- endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
- endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
- endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
- endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
- endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
- endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
- endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
- endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
- endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -42
- endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
- endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
- endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
- endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
- endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
- endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
- endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
- endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
- endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
- endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
- endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
- endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
- endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
- endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
- endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
- endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
- endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
- endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
- endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
- endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
- endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
- endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
- endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
- endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
- endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
- endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
- endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
- endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
- endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
- endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
- endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
- endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
- endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
- endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
- endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
- endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
- endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
- endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
- endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
- endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
- endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
- endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
- endoreg_db/models/__init__.py +75 -74
- endoreg_db/models/ai_model/__init__.py +3 -3
- endoreg_db/models/ai_model/active_model.py +9 -9
- endoreg_db/models/ai_model/model_meta.py +24 -24
- endoreg_db/models/ai_model/model_type.py +25 -25
- endoreg_db/models/ai_model/utils.py +8 -8
- endoreg_db/models/annotation/__init__.py +1 -1
- endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
- endoreg_db/models/annotation/image_classification.py +26 -26
- endoreg_db/models/case_template/__init__.py +5 -5
- endoreg_db/models/case_template/case_template.py +81 -81
- endoreg_db/models/case_template/case_template_rule.py +276 -276
- endoreg_db/models/case_template/case_template_rule_value.py +73 -73
- endoreg_db/models/case_template/case_template_type.py +27 -27
- endoreg_db/models/center/__init__.py +4 -4
- endoreg_db/models/center/center.py +24 -24
- endoreg_db/models/center/center_product.py +33 -33
- endoreg_db/models/center/center_resource.py +18 -18
- endoreg_db/models/center/center_waste.py +10 -10
- endoreg_db/models/data_file/__init__.py +5 -5
- endoreg_db/models/data_file/base_classes/__init__.py +2 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
- endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
- endoreg_db/models/data_file/frame.py +45 -45
- endoreg_db/models/data_file/import_classes/__init__.py +31 -31
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
- endoreg_db/models/data_file/metadata/__init__.py +3 -3
- endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
- endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
- endoreg_db/models/data_file/metadata/video_meta.py +132 -132
- endoreg_db/models/data_file/report_file.py +89 -89
- endoreg_db/models/data_file/video/__init__.py +6 -6
- endoreg_db/models/data_file/video/import_meta.py +25 -25
- endoreg_db/models/data_file/video/video.py +25 -25
- endoreg_db/models/data_file/video_segment.py +107 -107
- endoreg_db/models/disease.py +55 -55
- endoreg_db/models/emission/emission_factor.py +19 -19
- endoreg_db/models/event.py +21 -21
- endoreg_db/models/examination/__init__.py +3 -3
- endoreg_db/models/examination/examination.py +26 -26
- endoreg_db/models/examination/examination_time.py +27 -27
- endoreg_db/models/examination/examination_time_type.py +24 -24
- endoreg_db/models/examination/examination_type.py +18 -18
- endoreg_db/models/hardware/__init__.py +1 -1
- endoreg_db/models/hardware/endoscope.py +44 -44
- endoreg_db/models/hardware/endoscopy_processor.py +143 -143
- endoreg_db/models/information_source.py +29 -29
- endoreg_db/models/label/label.py +84 -84
- endoreg_db/models/laboratory/lab_value.py +102 -102
- endoreg_db/models/legacy_data/__init__.py +3 -3
- endoreg_db/models/legacy_data/image.py +34 -34
- endoreg_db/models/medication/medication.py +148 -148
- endoreg_db/models/network/__init__.py +2 -0
- endoreg_db/models/network/network_device.py +27 -0
- endoreg_db/models/network/network_device_type.py +23 -0
- endoreg_db/models/other/__init__.py +4 -4
- endoreg_db/models/other/distribution.py +215 -215
- endoreg_db/models/other/material.py +16 -16
- endoreg_db/models/other/resource.py +17 -17
- endoreg_db/models/other/transport_route.py +20 -20
- endoreg_db/models/other/waste.py +20 -20
- endoreg_db/models/patient_examination/__init__.py +35 -35
- endoreg_db/models/permissions/__init__.py +44 -44
- endoreg_db/models/persons/__init__.py +6 -6
- endoreg_db/models/persons/examiner/__init__.py +1 -1
- endoreg_db/models/persons/examiner/examiner.py +15 -15
- endoreg_db/models/persons/examiner/examiner_type.py +1 -1
- endoreg_db/models/persons/first_name.py +17 -17
- endoreg_db/models/persons/gender.py +22 -22
- endoreg_db/models/persons/last_name.py +19 -19
- endoreg_db/models/persons/patient/__init__.py +7 -7
- endoreg_db/models/persons/patient/case/case.py +30 -30
- endoreg_db/models/persons/patient/patient.py +216 -216
- endoreg_db/models/persons/patient/patient_disease.py +16 -16
- endoreg_db/models/persons/patient/patient_event.py +22 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
- endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
- endoreg_db/models/persons/patient/patient_medication.py +43 -43
- endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
- endoreg_db/models/persons/person.py +31 -31
- endoreg_db/models/persons/portal_user_information.py +27 -27
- endoreg_db/models/prediction/__init__.py +1 -1
- endoreg_db/models/prediction/image_classification.py +37 -37
- endoreg_db/models/prediction/video_prediction_meta.py +244 -244
- endoreg_db/models/product/__init__.py +4 -4
- endoreg_db/models/product/product.py +97 -97
- endoreg_db/models/product/product_group.py +19 -19
- endoreg_db/models/product/product_material.py +24 -24
- endoreg_db/models/product/product_weight.py +26 -26
- endoreg_db/models/product/reference_product.py +99 -99
- endoreg_db/models/questionnaires/__init__.py +114 -114
- endoreg_db/models/quiz/__init__.py +1 -1
- endoreg_db/models/quiz/quiz_answer.py +41 -41
- endoreg_db/models/quiz/quiz_question.py +54 -54
- endoreg_db/models/report_reader/__init__.py +1 -1
- endoreg_db/models/report_reader/report_reader_config.py +53 -53
- endoreg_db/models/report_reader/report_reader_flag.py +19 -19
- endoreg_db/models/rules/__init__.py +4 -4
- endoreg_db/models/rules/rule.py +23 -23
- endoreg_db/models/rules/rule_applicator.py +224 -224
- endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
- endoreg_db/models/rules/rule_type.py +21 -21
- endoreg_db/models/rules/ruleset.py +19 -19
- endoreg_db/models/unit.py +21 -21
- endoreg_db/queries/__init__.py +4 -4
- endoreg_db/queries/annotations/__init__.py +2 -2
- endoreg_db/queries/annotations/legacy.py +159 -159
- endoreg_db/queries/get/__init__.py +5 -5
- endoreg_db/queries/get/center.py +42 -42
- endoreg_db/queries/get/model.py +13 -13
- endoreg_db/queries/get/patient.py +14 -14
- endoreg_db/queries/get/patient_examination.py +20 -20
- endoreg_db/queries/get/report_file.py +33 -33
- endoreg_db/queries/get/video.py +31 -31
- endoreg_db/serializers/__init__.py +9 -9
- endoreg_db/serializers/ai_model.py +18 -18
- endoreg_db/serializers/annotation.py +17 -17
- endoreg_db/serializers/center.py +11 -11
- endoreg_db/serializers/examination.py +32 -32
- endoreg_db/serializers/frame.py +13 -13
- endoreg_db/serializers/hardware.py +20 -20
- endoreg_db/serializers/label.py +22 -22
- endoreg_db/serializers/patient.py +10 -10
- endoreg_db/serializers/prediction.py +15 -15
- endoreg_db/serializers/report_file.py +7 -7
- endoreg_db/serializers/video.py +27 -27
- endoreg_db/tests.py +3 -3
- endoreg_db/utils/cropping.py +28 -28
- endoreg_db/utils/dataloader.py +92 -92
- endoreg_db/utils/file_operations.py +30 -30
- endoreg_db/utils/hashs.py +33 -33
- endoreg_db/utils/legacy_ocr.py +201 -201
- endoreg_db/utils/ocr.py +197 -197
- endoreg_db/utils/uuid.py +4 -4
- endoreg_db/utils/video_metadata.py +87 -87
- endoreg_db/views.py +3 -3
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.7.dist-info}/LICENSE +674 -674
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.7.dist-info}/METADATA +2 -2
- endoreg_db-0.3.7.dist-info/RECORD +363 -0
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.7.dist-info}/WHEEL +1 -1
- endoreg_db-0.3.6.dist-info/RECORD +0 -357
|
@@ -1,188 +1,188 @@
|
|
|
1
|
-
# models/data_file/import_classes/raw_pdf.py
|
|
2
|
-
# django db model "RawPdf"
|
|
3
|
-
# Class to store raw pdf file using django file field
|
|
4
|
-
# Class contains classmethod to create object from pdf file
|
|
5
|
-
# objects contains methods to extract text, extract metadata from text and anonymize text from pdf file uzing agl_report_reader.ReportReader class
|
|
6
|
-
# ------------------------------------------------------------------------------
|
|
7
|
-
|
|
8
|
-
from django.db import models
|
|
9
|
-
from django.core.files.storage import FileSystemStorage
|
|
10
|
-
from django.core.files import File
|
|
11
|
-
from django.conf import settings
|
|
12
|
-
from django.utils import timezone
|
|
13
|
-
from django.core.exceptions import ValidationError
|
|
14
|
-
from django.core.validators import FileExtensionValidator
|
|
15
|
-
from endoreg_db.utils.file_operations import get_uuid_filename
|
|
16
|
-
|
|
17
|
-
from agl_report_reader.report_reader import ReportReader
|
|
18
|
-
|
|
19
|
-
from endoreg_db.utils.hashs import get_pdf_hash
|
|
20
|
-
from ..metadata import SensitiveMeta
|
|
21
|
-
|
|
22
|
-
# setup logging to pdf_import.log
|
|
23
|
-
import logging
|
|
24
|
-
logger = logging.getLogger('pdf_import')
|
|
25
|
-
|
|
26
|
-
import shutil
|
|
27
|
-
|
|
28
|
-
# get pdf location from settings, default to ~/erc_data/raw_pdf and create if not exists
|
|
29
|
-
PSEUDO_DIR_RAW_PDF = getattr(settings, 'PSEUDO_DIR_RAW_PDF', settings.BASE_DIR / 'erc_data/raw_pdf')
|
|
30
|
-
|
|
31
|
-
class RawPdfFile(models.Model):
|
|
32
|
-
file = models.FileField(
|
|
33
|
-
upload_to='raw_pdf/',
|
|
34
|
-
validators=[FileExtensionValidator(allowed_extensions=['pdf'])],
|
|
35
|
-
storage=FileSystemStorage(location=PSEUDO_DIR_RAW_PDF.resolve().as_posix()),
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
pdf_hash = models.CharField(max_length=255, unique=True)
|
|
39
|
-
pdf_type = models.ForeignKey('PdfType', on_delete=models.CASCADE)
|
|
40
|
-
center = models.ForeignKey('Center', on_delete=models.CASCADE)
|
|
41
|
-
|
|
42
|
-
state_report_processing_required = models.BooleanField(default = True)
|
|
43
|
-
state_report_processed = models.BooleanField(default=False)
|
|
44
|
-
|
|
45
|
-
# report_file = models.OneToOneField("ReportFile", on_delete=models.CASCADE, null=True, blank=True)
|
|
46
|
-
sensitive_meta = models.OneToOneField(
|
|
47
|
-
'SensitiveMeta',
|
|
48
|
-
on_delete=models.CASCADE,
|
|
49
|
-
related_name='raw_pdf_file',
|
|
50
|
-
null=True,
|
|
51
|
-
blank=True,
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
text = models.TextField(blank=True, null=True)
|
|
55
|
-
anonymized_text = models.TextField(blank=True, null=True)
|
|
56
|
-
|
|
57
|
-
raw_meta = models.JSONField(blank=True, null=True)
|
|
58
|
-
|
|
59
|
-
created_at = models.DateTimeField(auto_now_add=True)
|
|
60
|
-
|
|
61
|
-
def __str__(self):
|
|
62
|
-
str_repr = f"RawPdfFile: {self.file.name}"
|
|
63
|
-
return str_repr
|
|
64
|
-
|
|
65
|
-
@classmethod
|
|
66
|
-
def create_from_file(
|
|
67
|
-
cls,
|
|
68
|
-
file_path,
|
|
69
|
-
center_name,
|
|
70
|
-
pdf_type_name,
|
|
71
|
-
destination_dir,
|
|
72
|
-
save=True,
|
|
73
|
-
):
|
|
74
|
-
from endoreg_db.models import PdfType, Center
|
|
75
|
-
logger.info(f"Creating RawPdfFile object from file: {file_path}")
|
|
76
|
-
original_file_name = file_path.name
|
|
77
|
-
|
|
78
|
-
new_file_name, uuid = get_uuid_filename(file_path)
|
|
79
|
-
|
|
80
|
-
if not destination_dir.exists():
|
|
81
|
-
destination_dir.mkdir(parents=True)
|
|
82
|
-
|
|
83
|
-
pdf_hash = get_pdf_hash(file_path)
|
|
84
|
-
|
|
85
|
-
# check if pdf file already exists
|
|
86
|
-
if cls.objects.filter(pdf_hash=pdf_hash).exists():
|
|
87
|
-
logger.warning(f"RawPdfFile with hash {pdf_hash} already exists")
|
|
88
|
-
return None
|
|
89
|
-
|
|
90
|
-
assert pdf_type_name is not None, "pdf_type_name is required"
|
|
91
|
-
assert center_name is not None, "center_name is required"
|
|
92
|
-
|
|
93
|
-
pdf_type = PdfType.objects.get(name=pdf_type_name)
|
|
94
|
-
center = Center.objects.get(name=center_name)
|
|
95
|
-
|
|
96
|
-
new_file_path = destination_dir / new_file_name
|
|
97
|
-
|
|
98
|
-
logger.info(f"Copying file to {new_file_path}")
|
|
99
|
-
success = shutil.copy(file_path, new_file_path)
|
|
100
|
-
|
|
101
|
-
# validate copy operation by comparing hashs
|
|
102
|
-
assert get_pdf_hash(new_file_path) == pdf_hash, "Copy operation failed"
|
|
103
|
-
|
|
104
|
-
raw_pdf = cls(
|
|
105
|
-
file=new_file_path.resolve().as_posix(),
|
|
106
|
-
pdf_hash=pdf_hash,
|
|
107
|
-
pdf_type=pdf_type,
|
|
108
|
-
center=center,
|
|
109
|
-
)
|
|
110
|
-
logger.info(f"RawPdfFile object created: {raw_pdf}")
|
|
111
|
-
|
|
112
|
-
# remove source file
|
|
113
|
-
file_path.unlink()
|
|
114
|
-
logger.info(f"Source file removed: {file_path}")
|
|
115
|
-
|
|
116
|
-
if save:
|
|
117
|
-
raw_pdf.save()
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return raw_pdf
|
|
121
|
-
|
|
122
|
-
def process_file(self, verbose = False):
|
|
123
|
-
|
|
124
|
-
pdf_path = self.file.path
|
|
125
|
-
rr_config = self.get_report_reader_config()
|
|
126
|
-
|
|
127
|
-
rr = ReportReader(**rr_config) #FIXME In future we need to pass a configuration file
|
|
128
|
-
# This configuration file should be associated with pdf type
|
|
129
|
-
|
|
130
|
-
text, anonymized_text, report_meta = rr.process_report(pdf_path, verbose=verbose)
|
|
131
|
-
if not self.sensitive_meta:
|
|
132
|
-
sensitive_meta = SensitiveMeta.create_from_dict(report_meta)
|
|
133
|
-
sensitive_meta.save()
|
|
134
|
-
self.sensitive_meta = sensitive_meta
|
|
135
|
-
|
|
136
|
-
else:
|
|
137
|
-
# update existing sensitive meta
|
|
138
|
-
sensitive_meta = self.sensitive_meta
|
|
139
|
-
sensitive_meta.update_from_dict(report_meta)
|
|
140
|
-
|
|
141
|
-
return text, anonymized_text, report_meta
|
|
142
|
-
|
|
143
|
-
def update(self, save=True, verbose = True):
|
|
144
|
-
try:
|
|
145
|
-
self.text, self.anonymized_text, self.raw_meta = self.process_file(verbose = verbose)
|
|
146
|
-
self.state_report_processed = True
|
|
147
|
-
self.state_report_processing_required = False
|
|
148
|
-
|
|
149
|
-
if save:
|
|
150
|
-
|
|
151
|
-
self.save()
|
|
152
|
-
|
|
153
|
-
return True
|
|
154
|
-
|
|
155
|
-
except:
|
|
156
|
-
logger.error(f"Error processing file: {self.file.path}")
|
|
157
|
-
return False
|
|
158
|
-
|
|
159
|
-
def save(self, *args, **kwargs):
|
|
160
|
-
if not self.file.name.endswith('.pdf'):
|
|
161
|
-
raise ValidationError('Only PDF files are allowed')
|
|
162
|
-
|
|
163
|
-
if not self.pdf_hash:
|
|
164
|
-
self.pdf_hash = get_pdf_hash(self.file.path)
|
|
165
|
-
|
|
166
|
-
super().save(*args, **kwargs)
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
def get_report_reader_config(self):
|
|
170
|
-
if self.pdf_type.endoscope_info_line:
|
|
171
|
-
endoscope_info_line = self.pdf_type.endoscope_info_line.value
|
|
172
|
-
else:
|
|
173
|
-
endoscope_info_line = None
|
|
174
|
-
settings_dict = {
|
|
175
|
-
"locale": "de_DE",
|
|
176
|
-
"employee_first_names": [_.name for _ in self.center.first_names.all()],
|
|
177
|
-
"employee_last_names": [_.name for _ in self.center.last_names.all()],
|
|
178
|
-
"text_date_format":'%d.%m.%Y',
|
|
179
|
-
"flags": {
|
|
180
|
-
"patient_info_line": self.pdf_type.patient_info_line.value,
|
|
181
|
-
"endoscope_info_line": endoscope_info_line,
|
|
182
|
-
"examiner_info_line": self.pdf_type.examiner_info_line.value,
|
|
183
|
-
"cut_off_below": [_.value for _ in self.pdf_type.cut_off_below_lines.all()],
|
|
184
|
-
"cut_off_above": [_.value for _ in self.pdf_type.cut_off_above_lines.all()],
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return settings_dict
|
|
1
|
+
# models/data_file/import_classes/raw_pdf.py
|
|
2
|
+
# django db model "RawPdf"
|
|
3
|
+
# Class to store raw pdf file using django file field
|
|
4
|
+
# Class contains classmethod to create object from pdf file
|
|
5
|
+
# objects contains methods to extract text, extract metadata from text and anonymize text from pdf file uzing agl_report_reader.ReportReader class
|
|
6
|
+
# ------------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
from django.db import models
|
|
9
|
+
from django.core.files.storage import FileSystemStorage
|
|
10
|
+
from django.core.files import File
|
|
11
|
+
from django.conf import settings
|
|
12
|
+
from django.utils import timezone
|
|
13
|
+
from django.core.exceptions import ValidationError
|
|
14
|
+
from django.core.validators import FileExtensionValidator
|
|
15
|
+
from endoreg_db.utils.file_operations import get_uuid_filename
|
|
16
|
+
|
|
17
|
+
from agl_report_reader.report_reader import ReportReader
|
|
18
|
+
|
|
19
|
+
from endoreg_db.utils.hashs import get_pdf_hash
|
|
20
|
+
from ..metadata import SensitiveMeta
|
|
21
|
+
|
|
22
|
+
# setup logging to pdf_import.log
|
|
23
|
+
import logging
|
|
24
|
+
logger = logging.getLogger('pdf_import')
|
|
25
|
+
|
|
26
|
+
import shutil
|
|
27
|
+
|
|
28
|
+
# get pdf location from settings, default to ~/erc_data/raw_pdf and create if not exists
|
|
29
|
+
PSEUDO_DIR_RAW_PDF = getattr(settings, 'PSEUDO_DIR_RAW_PDF', settings.BASE_DIR / 'erc_data/raw_pdf')
|
|
30
|
+
|
|
31
|
+
class RawPdfFile(models.Model):
|
|
32
|
+
file = models.FileField(
|
|
33
|
+
upload_to='raw_pdf/',
|
|
34
|
+
validators=[FileExtensionValidator(allowed_extensions=['pdf'])],
|
|
35
|
+
storage=FileSystemStorage(location=PSEUDO_DIR_RAW_PDF.resolve().as_posix()),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
pdf_hash = models.CharField(max_length=255, unique=True)
|
|
39
|
+
pdf_type = models.ForeignKey('PdfType', on_delete=models.CASCADE)
|
|
40
|
+
center = models.ForeignKey('Center', on_delete=models.CASCADE)
|
|
41
|
+
|
|
42
|
+
state_report_processing_required = models.BooleanField(default = True)
|
|
43
|
+
state_report_processed = models.BooleanField(default=False)
|
|
44
|
+
|
|
45
|
+
# report_file = models.OneToOneField("ReportFile", on_delete=models.CASCADE, null=True, blank=True)
|
|
46
|
+
sensitive_meta = models.OneToOneField(
|
|
47
|
+
'SensitiveMeta',
|
|
48
|
+
on_delete=models.CASCADE,
|
|
49
|
+
related_name='raw_pdf_file',
|
|
50
|
+
null=True,
|
|
51
|
+
blank=True,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
text = models.TextField(blank=True, null=True)
|
|
55
|
+
anonymized_text = models.TextField(blank=True, null=True)
|
|
56
|
+
|
|
57
|
+
raw_meta = models.JSONField(blank=True, null=True)
|
|
58
|
+
|
|
59
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
|
60
|
+
|
|
61
|
+
def __str__(self):
|
|
62
|
+
str_repr = f"RawPdfFile: {self.file.name}"
|
|
63
|
+
return str_repr
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def create_from_file(
|
|
67
|
+
cls,
|
|
68
|
+
file_path,
|
|
69
|
+
center_name,
|
|
70
|
+
pdf_type_name,
|
|
71
|
+
destination_dir,
|
|
72
|
+
save=True,
|
|
73
|
+
):
|
|
74
|
+
from endoreg_db.models import PdfType, Center
|
|
75
|
+
logger.info(f"Creating RawPdfFile object from file: {file_path}")
|
|
76
|
+
original_file_name = file_path.name
|
|
77
|
+
|
|
78
|
+
new_file_name, uuid = get_uuid_filename(file_path)
|
|
79
|
+
|
|
80
|
+
if not destination_dir.exists():
|
|
81
|
+
destination_dir.mkdir(parents=True)
|
|
82
|
+
|
|
83
|
+
pdf_hash = get_pdf_hash(file_path)
|
|
84
|
+
|
|
85
|
+
# check if pdf file already exists
|
|
86
|
+
if cls.objects.filter(pdf_hash=pdf_hash).exists():
|
|
87
|
+
logger.warning(f"RawPdfFile with hash {pdf_hash} already exists")
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
assert pdf_type_name is not None, "pdf_type_name is required"
|
|
91
|
+
assert center_name is not None, "center_name is required"
|
|
92
|
+
|
|
93
|
+
pdf_type = PdfType.objects.get(name=pdf_type_name)
|
|
94
|
+
center = Center.objects.get(name=center_name)
|
|
95
|
+
|
|
96
|
+
new_file_path = destination_dir / new_file_name
|
|
97
|
+
|
|
98
|
+
logger.info(f"Copying file to {new_file_path}")
|
|
99
|
+
success = shutil.copy(file_path, new_file_path)
|
|
100
|
+
|
|
101
|
+
# validate copy operation by comparing hashs
|
|
102
|
+
assert get_pdf_hash(new_file_path) == pdf_hash, "Copy operation failed"
|
|
103
|
+
|
|
104
|
+
raw_pdf = cls(
|
|
105
|
+
file=new_file_path.resolve().as_posix(),
|
|
106
|
+
pdf_hash=pdf_hash,
|
|
107
|
+
pdf_type=pdf_type,
|
|
108
|
+
center=center,
|
|
109
|
+
)
|
|
110
|
+
logger.info(f"RawPdfFile object created: {raw_pdf}")
|
|
111
|
+
|
|
112
|
+
# remove source file
|
|
113
|
+
file_path.unlink()
|
|
114
|
+
logger.info(f"Source file removed: {file_path}")
|
|
115
|
+
|
|
116
|
+
if save:
|
|
117
|
+
raw_pdf.save()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
return raw_pdf
|
|
121
|
+
|
|
122
|
+
def process_file(self, verbose = False):
|
|
123
|
+
|
|
124
|
+
pdf_path = self.file.path
|
|
125
|
+
rr_config = self.get_report_reader_config()
|
|
126
|
+
|
|
127
|
+
rr = ReportReader(**rr_config) #FIXME In future we need to pass a configuration file
|
|
128
|
+
# This configuration file should be associated with pdf type
|
|
129
|
+
|
|
130
|
+
text, anonymized_text, report_meta = rr.process_report(pdf_path, verbose=verbose)
|
|
131
|
+
if not self.sensitive_meta:
|
|
132
|
+
sensitive_meta = SensitiveMeta.create_from_dict(report_meta)
|
|
133
|
+
sensitive_meta.save()
|
|
134
|
+
self.sensitive_meta = sensitive_meta
|
|
135
|
+
|
|
136
|
+
else:
|
|
137
|
+
# update existing sensitive meta
|
|
138
|
+
sensitive_meta = self.sensitive_meta
|
|
139
|
+
sensitive_meta.update_from_dict(report_meta)
|
|
140
|
+
|
|
141
|
+
return text, anonymized_text, report_meta
|
|
142
|
+
|
|
143
|
+
def update(self, save=True, verbose = True):
|
|
144
|
+
try:
|
|
145
|
+
self.text, self.anonymized_text, self.raw_meta = self.process_file(verbose = verbose)
|
|
146
|
+
self.state_report_processed = True
|
|
147
|
+
self.state_report_processing_required = False
|
|
148
|
+
|
|
149
|
+
if save:
|
|
150
|
+
|
|
151
|
+
self.save()
|
|
152
|
+
|
|
153
|
+
return True
|
|
154
|
+
|
|
155
|
+
except:
|
|
156
|
+
logger.error(f"Error processing file: {self.file.path}")
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
def save(self, *args, **kwargs):
|
|
160
|
+
if not self.file.name.endswith('.pdf'):
|
|
161
|
+
raise ValidationError('Only PDF files are allowed')
|
|
162
|
+
|
|
163
|
+
if not self.pdf_hash:
|
|
164
|
+
self.pdf_hash = get_pdf_hash(self.file.path)
|
|
165
|
+
|
|
166
|
+
super().save(*args, **kwargs)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def get_report_reader_config(self):
|
|
170
|
+
if self.pdf_type.endoscope_info_line:
|
|
171
|
+
endoscope_info_line = self.pdf_type.endoscope_info_line.value
|
|
172
|
+
else:
|
|
173
|
+
endoscope_info_line = None
|
|
174
|
+
settings_dict = {
|
|
175
|
+
"locale": "de_DE",
|
|
176
|
+
"employee_first_names": [_.name for _ in self.center.first_names.all()],
|
|
177
|
+
"employee_last_names": [_.name for _ in self.center.last_names.all()],
|
|
178
|
+
"text_date_format":'%d.%m.%Y',
|
|
179
|
+
"flags": {
|
|
180
|
+
"patient_info_line": self.pdf_type.patient_info_line.value,
|
|
181
|
+
"endoscope_info_line": endoscope_info_line,
|
|
182
|
+
"examiner_info_line": self.pdf_type.examiner_info_line.value,
|
|
183
|
+
"cut_off_below": [_.value for _ in self.pdf_type.cut_off_below_lines.all()],
|
|
184
|
+
"cut_off_above": [_.value for _ in self.pdf_type.cut_off_above_lines.all()],
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return settings_dict
|