endoreg-db 0.3.5__py3-none-any.whl → 0.3.6__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 +64 -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/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 +128 -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_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 +74 -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/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.5.dist-info → endoreg_db-0.3.6.dist-info}/LICENSE +674 -674
- {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/METADATA +2 -2
- endoreg_db-0.3.6.dist-info/RECORD +357 -0
- {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/WHEEL +1 -1
- endoreg_db-0.3.5.dist-info/RECORD +0 -357
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
from django.conf import settings
|
|
2
|
-
from django.core.management.base import BaseCommand
|
|
3
|
-
from reports.models import Intervention, InterventionType # Replace 'your_app_name' with the actual app name
|
|
4
|
-
import os
|
|
5
|
-
from reports.dataloader_utils import load_model_data
|
|
6
|
-
|
|
7
|
-
SOURCE_DIR = None # e.g. settings.DATA_DIR_INTERVENTION
|
|
8
|
-
|
|
9
|
-
IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
10
|
-
]
|
|
11
|
-
|
|
12
|
-
IMPORT_METADATA = {
|
|
13
|
-
# "": { # same as model name in "import models", e.g. "Intervention"
|
|
14
|
-
# "dir": os.path.join(SOURCE_DIR,""), # e.g. "interventions"
|
|
15
|
-
# "model": None, # e.g. Intervention
|
|
16
|
-
# "foreign_keys": [], # e.g. ["intervention_types"]
|
|
17
|
-
# "foreign_key_models": [] # e.g. [InterventionType]
|
|
18
|
-
# },
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
class Command(BaseCommand):
|
|
22
|
-
help = """Load all .yaml files in the data/intervention directory
|
|
23
|
-
into the Intervention and InterventionType model"""
|
|
24
|
-
|
|
25
|
-
def add_arguments(self, parser):
|
|
26
|
-
parser.add_argument(
|
|
27
|
-
'--verbose',
|
|
28
|
-
action='store_true',
|
|
29
|
-
help='Display verbose output',
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
def handle(self, *args, **options):
|
|
33
|
-
verbose = options['verbose']
|
|
34
|
-
for model_name in IMPORT_MODELS:
|
|
35
|
-
_metadata = IMPORT_METADATA[model_name]
|
|
36
|
-
load_model_data(
|
|
37
|
-
self,
|
|
38
|
-
model_name,
|
|
39
|
-
_metadata,
|
|
40
|
-
verbose
|
|
1
|
+
from django.conf import settings
|
|
2
|
+
from django.core.management.base import BaseCommand
|
|
3
|
+
from reports.models import Intervention, InterventionType # Replace 'your_app_name' with the actual app name
|
|
4
|
+
import os
|
|
5
|
+
from reports.dataloader_utils import load_model_data
|
|
6
|
+
|
|
7
|
+
SOURCE_DIR = None # e.g. settings.DATA_DIR_INTERVENTION
|
|
8
|
+
|
|
9
|
+
IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
IMPORT_METADATA = {
|
|
13
|
+
# "": { # same as model name in "import models", e.g. "Intervention"
|
|
14
|
+
# "dir": os.path.join(SOURCE_DIR,""), # e.g. "interventions"
|
|
15
|
+
# "model": None, # e.g. Intervention
|
|
16
|
+
# "foreign_keys": [], # e.g. ["intervention_types"]
|
|
17
|
+
# "foreign_key_models": [] # e.g. [InterventionType]
|
|
18
|
+
# },
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class Command(BaseCommand):
|
|
22
|
+
help = """Load all .yaml files in the data/intervention directory
|
|
23
|
+
into the Intervention and InterventionType model"""
|
|
24
|
+
|
|
25
|
+
def add_arguments(self, parser):
|
|
26
|
+
parser.add_argument(
|
|
27
|
+
'--verbose',
|
|
28
|
+
action='store_true',
|
|
29
|
+
help='Display verbose output',
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def handle(self, *args, **options):
|
|
33
|
+
verbose = options['verbose']
|
|
34
|
+
for model_name in IMPORT_MODELS:
|
|
35
|
+
_metadata = IMPORT_METADATA[model_name]
|
|
36
|
+
load_model_data(
|
|
37
|
+
self,
|
|
38
|
+
model_name,
|
|
39
|
+
_metadata,
|
|
40
|
+
verbose
|
|
41
41
|
)
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
from django.core.management.base import BaseCommand
|
|
2
|
-
from django.apps import apps
|
|
3
|
-
from django.db import transaction
|
|
4
|
-
|
|
5
|
-
class Command(BaseCommand):
|
|
6
|
-
help = 'Deletes all objects from all models in the "endoreg_db" app.'
|
|
7
|
-
|
|
8
|
-
def handle(self, *args, **options):
|
|
9
|
-
app_models = apps.get_models()
|
|
10
|
-
app_models = [model for model in app_models if "endoreg_db" in model._meta.app_label] # Filter models by the "endoreg_db" app
|
|
11
|
-
for model in app_models:
|
|
12
|
-
with transaction.atomic(): # Use a separate transaction for each model
|
|
13
|
-
try:
|
|
14
|
-
model.objects.all().delete()
|
|
15
|
-
self.stdout.write(self.style.SUCCESS(f'Successfully deleted all objects in {model._meta.db_table}'))
|
|
16
|
-
except Exception as e:
|
|
17
|
-
# This catches exceptions and continues with the next model
|
|
18
|
-
self.stdout.write(self.style.ERROR(f'Error deleting objects in {model._meta.db_table}: {e}'))
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from django.apps import apps
|
|
3
|
+
from django.db import transaction
|
|
4
|
+
|
|
5
|
+
class Command(BaseCommand):
|
|
6
|
+
help = 'Deletes all objects from all models in the "endoreg_db" app.'
|
|
7
|
+
|
|
8
|
+
def handle(self, *args, **options):
|
|
9
|
+
app_models = apps.get_models()
|
|
10
|
+
app_models = [model for model in app_models if "endoreg_db" in model._meta.app_label] # Filter models by the "endoreg_db" app
|
|
11
|
+
for model in app_models:
|
|
12
|
+
with transaction.atomic(): # Use a separate transaction for each model
|
|
13
|
+
try:
|
|
14
|
+
model.objects.all().delete()
|
|
15
|
+
self.stdout.write(self.style.SUCCESS(f'Successfully deleted all objects in {model._meta.db_table}'))
|
|
16
|
+
except Exception as e:
|
|
17
|
+
# This catches exceptions and continues with the next model
|
|
18
|
+
self.stdout.write(self.style.ERROR(f'Error deleting objects in {model._meta.db_table}: {e}'))
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
# django command to delete all LegacyImage objects
|
|
2
|
-
|
|
3
|
-
from django.core.management.base import BaseCommand, CommandError
|
|
4
|
-
from endoreg_db.models import LegacyImage
|
|
5
|
-
from tqdm import tqdm
|
|
6
|
-
|
|
7
|
-
class Command(BaseCommand):
|
|
8
|
-
help = 'Deletes all LegacyImage objects including the linked files (legacy_image.image)'
|
|
9
|
-
|
|
10
|
-
def handle(self, *args, **options):
|
|
11
|
-
legacy_images = LegacyImage.objects.all()
|
|
12
|
-
|
|
13
|
-
for legacy_image in tqdm(legacy_images):
|
|
14
|
-
legacy_image.image.delete()
|
|
15
|
-
legacy_image.delete()
|
|
16
|
-
|
|
17
|
-
self.stdout.write(self.style.SUCCESS('Successfully deleted all LegacyImage objects and linked image files'))
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
# django command to delete all LegacyImage objects
|
|
2
|
+
|
|
3
|
+
from django.core.management.base import BaseCommand, CommandError
|
|
4
|
+
from endoreg_db.models import LegacyImage
|
|
5
|
+
from tqdm import tqdm
|
|
6
|
+
|
|
7
|
+
class Command(BaseCommand):
|
|
8
|
+
help = 'Deletes all LegacyImage objects including the linked files (legacy_image.image)'
|
|
9
|
+
|
|
10
|
+
def handle(self, *args, **options):
|
|
11
|
+
legacy_images = LegacyImage.objects.all()
|
|
12
|
+
|
|
13
|
+
for legacy_image in tqdm(legacy_images):
|
|
14
|
+
legacy_image.image.delete()
|
|
15
|
+
legacy_image.delete()
|
|
16
|
+
|
|
17
|
+
self.stdout.write(self.style.SUCCESS('Successfully deleted all LegacyImage objects and linked image files'))
|
|
18
|
+
|
|
19
|
+
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# Django command to fetch all LegacyVideo objects, delete the associated file and delete the object from the database
|
|
2
|
-
|
|
3
|
-
from endoreg_db.models.data_file.video import LegacyVideo
|
|
4
|
-
from tqdm import tqdm
|
|
5
|
-
from django.core.management.base import BaseCommand
|
|
6
|
-
|
|
7
|
-
class Command(BaseCommand):
|
|
8
|
-
"""
|
|
9
|
-
Deletes all LegacyVideos in the database.
|
|
10
|
-
"""
|
|
11
|
-
help = 'Deletes all LegacyVideos in the database.'
|
|
12
|
-
|
|
13
|
-
def handle(self, *args, **options):
|
|
14
|
-
videos = LegacyVideo.objects.all()
|
|
15
|
-
for video in tqdm(videos):
|
|
16
|
-
video.file.delete()
|
|
1
|
+
# Django command to fetch all LegacyVideo objects, delete the associated file and delete the object from the database
|
|
2
|
+
|
|
3
|
+
from endoreg_db.models.data_file.video import LegacyVideo
|
|
4
|
+
from tqdm import tqdm
|
|
5
|
+
from django.core.management.base import BaseCommand
|
|
6
|
+
|
|
7
|
+
class Command(BaseCommand):
|
|
8
|
+
"""
|
|
9
|
+
Deletes all LegacyVideos in the database.
|
|
10
|
+
"""
|
|
11
|
+
help = 'Deletes all LegacyVideos in the database.'
|
|
12
|
+
|
|
13
|
+
def handle(self, *args, **options):
|
|
14
|
+
videos = LegacyVideo.objects.all()
|
|
15
|
+
for video in tqdm(videos):
|
|
16
|
+
video.file.delete()
|
|
17
17
|
video.delete()
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
# Django Command to:
|
|
2
|
-
# fetch all LegacyVideos and extract frames from them
|
|
3
|
-
# track progress for all videos and for each video with tqdm
|
|
4
|
-
|
|
5
|
-
from endoreg_db.models.data_file.video import LegacyVideo
|
|
6
|
-
from tqdm import tqdm
|
|
7
|
-
from django.core.management.base import BaseCommand
|
|
8
|
-
|
|
9
|
-
class Command(BaseCommand):
|
|
10
|
-
"""
|
|
11
|
-
Extracts frames from all LegacyVideos in the database.
|
|
12
|
-
"""
|
|
13
|
-
help = 'Extracts frames from all LegacyVideos in the database.'
|
|
14
|
-
|
|
15
|
-
def handle(self, *args, **options):
|
|
16
|
-
videos = LegacyVideo.objects.all()
|
|
17
|
-
for video in tqdm(videos):
|
|
18
|
-
video.extract_all_frames()
|
|
1
|
+
# Django Command to:
|
|
2
|
+
# fetch all LegacyVideos and extract frames from them
|
|
3
|
+
# track progress for all videos and for each video with tqdm
|
|
4
|
+
|
|
5
|
+
from endoreg_db.models.data_file.video import LegacyVideo
|
|
6
|
+
from tqdm import tqdm
|
|
7
|
+
from django.core.management.base import BaseCommand
|
|
8
|
+
|
|
9
|
+
class Command(BaseCommand):
|
|
10
|
+
"""
|
|
11
|
+
Extracts frames from all LegacyVideos in the database.
|
|
12
|
+
"""
|
|
13
|
+
help = 'Extracts frames from all LegacyVideos in the database.'
|
|
14
|
+
|
|
15
|
+
def handle(self, *args, **options):
|
|
16
|
+
videos = LegacyVideo.objects.all()
|
|
17
|
+
for video in tqdm(videos):
|
|
18
|
+
video.extract_all_frames()
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
# command to fetch the legacy dataset and save it to a json file.
|
|
2
|
-
from django.core.management.base import BaseCommand, CommandError
|
|
3
|
-
from endoreg_db.queries import generate_legacy_dataset_output
|
|
4
|
-
import json
|
|
5
|
-
|
|
6
|
-
LABELSET_NAME = "multilabel_classification"
|
|
7
|
-
LABELSET_VERSION = 0
|
|
8
|
-
|
|
9
|
-
class Command(BaseCommand):
|
|
10
|
-
help = 'Fetches the legacy dataset and saves it to a jsonl file'
|
|
11
|
-
|
|
12
|
-
def handle(self, *args, **options):
|
|
13
|
-
output, labelset = generate_legacy_dataset_output(LABELSET_NAME, LABELSET_VERSION)
|
|
14
|
-
# output is a list of dicts, each dict is an image
|
|
15
|
-
labels_in_order = labelset.get_labels_in_order()
|
|
16
|
-
|
|
17
|
-
# write to file
|
|
18
|
-
with open('legacy_dataset.jsonl', 'w') as f:
|
|
19
|
-
for img_dict in output:
|
|
20
|
-
f.write(json.dumps(img_dict) + '\n')
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
_dict = {
|
|
24
|
-
"labels": [label.name for label in labels_in_order],
|
|
25
|
-
"name": LABELSET_NAME,
|
|
26
|
-
"version": LABELSET_VERSION
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
with open('legacy_dataset_info.json', 'w') as f:
|
|
30
|
-
f.write(json.dumps(_dict))
|
|
31
|
-
|
|
32
|
-
self.stdout.write(self.style.SUCCESS('Successfully fetched and saved the legacy dataset'))
|
|
1
|
+
# command to fetch the legacy dataset and save it to a json file.
|
|
2
|
+
from django.core.management.base import BaseCommand, CommandError
|
|
3
|
+
from endoreg_db.queries import generate_legacy_dataset_output
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
LABELSET_NAME = "multilabel_classification"
|
|
7
|
+
LABELSET_VERSION = 0
|
|
8
|
+
|
|
9
|
+
class Command(BaseCommand):
|
|
10
|
+
help = 'Fetches the legacy dataset and saves it to a jsonl file'
|
|
11
|
+
|
|
12
|
+
def handle(self, *args, **options):
|
|
13
|
+
output, labelset = generate_legacy_dataset_output(LABELSET_NAME, LABELSET_VERSION)
|
|
14
|
+
# output is a list of dicts, each dict is an image
|
|
15
|
+
labels_in_order = labelset.get_labels_in_order()
|
|
16
|
+
|
|
17
|
+
# write to file
|
|
18
|
+
with open('legacy_dataset.jsonl', 'w') as f:
|
|
19
|
+
for img_dict in output:
|
|
20
|
+
f.write(json.dumps(img_dict) + '\n')
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
_dict = {
|
|
24
|
+
"labels": [label.name for label in labels_in_order],
|
|
25
|
+
"name": LABELSET_NAME,
|
|
26
|
+
"version": LABELSET_VERSION
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
with open('legacy_dataset_info.json', 'w') as f:
|
|
30
|
+
f.write(json.dumps(_dict))
|
|
31
|
+
|
|
32
|
+
self.stdout.write(self.style.SUCCESS('Successfully fetched and saved the legacy dataset'))
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
from django.core.management.base import BaseCommand
|
|
2
|
-
from django.contrib.auth.models import Permission
|
|
3
|
-
from django.contrib.contenttypes.models import ContentType
|
|
4
|
-
from django.apps import apps
|
|
5
|
-
|
|
6
|
-
class Command(BaseCommand):
|
|
7
|
-
help = 'Sets up default permissions for each model in the app.'
|
|
8
|
-
|
|
9
|
-
def handle(self, *args, **options):
|
|
10
|
-
for model in apps.get_models():
|
|
11
|
-
content_type = ContentType.objects.get_for_model(model)
|
|
12
|
-
permissions = ['view', 'add', 'change', 'delete']
|
|
13
|
-
for perm in permissions:
|
|
14
|
-
codename = f'{perm}_{model._meta.model_name}'
|
|
15
|
-
name = f'Can {perm} {model._meta.verbose_name}'
|
|
16
|
-
Permission.objects.get_or_create(
|
|
17
|
-
codename=codename,
|
|
18
|
-
defaults={'name': name, 'content_type': content_type},
|
|
19
|
-
)
|
|
20
|
-
self.stdout.write(self.style.SUCCESS(f'Set up permissions for {model._meta.verbose_name}'))
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from django.contrib.auth.models import Permission
|
|
3
|
+
from django.contrib.contenttypes.models import ContentType
|
|
4
|
+
from django.apps import apps
|
|
5
|
+
|
|
6
|
+
class Command(BaseCommand):
|
|
7
|
+
help = 'Sets up default permissions for each model in the app.'
|
|
8
|
+
|
|
9
|
+
def handle(self, *args, **options):
|
|
10
|
+
for model in apps.get_models():
|
|
11
|
+
content_type = ContentType.objects.get_for_model(model)
|
|
12
|
+
permissions = ['view', 'add', 'change', 'delete']
|
|
13
|
+
for perm in permissions:
|
|
14
|
+
codename = f'{perm}_{model._meta.model_name}'
|
|
15
|
+
name = f'Can {perm} {model._meta.verbose_name}'
|
|
16
|
+
Permission.objects.get_or_create(
|
|
17
|
+
codename=codename,
|
|
18
|
+
defaults={'name': name, 'content_type': content_type},
|
|
19
|
+
)
|
|
20
|
+
self.stdout.write(self.style.SUCCESS(f'Set up permissions for {model._meta.verbose_name}'))
|
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
# command expects a directory as an argument
|
|
2
|
-
# directory should contain a img_dicts.jsonl file, a settings.json and an "images" directory
|
|
3
|
-
# images should be in jpeg format
|
|
4
|
-
# reads the img_dicts.jsonl file and creates a new database entry for each image
|
|
5
|
-
# img_dicts contains a line for each image in the following format:
|
|
6
|
-
# {"id": 30604292, "path": "images/30604292.jpg", "labels": ["appendix", "polyp"]}
|
|
7
|
-
|
|
8
|
-
# import_settings.json example:
|
|
9
|
-
# {
|
|
10
|
-
# "annotator": "legacy",
|
|
11
|
-
# "labelset_name": "multilabel_classification",
|
|
12
|
-
# "labelset_version": 0
|
|
13
|
-
# }
|
|
14
|
-
|
|
15
|
-
import os
|
|
16
|
-
import json
|
|
17
|
-
from tqdm import tqdm
|
|
18
|
-
from django.core.management.base import BaseCommand
|
|
19
|
-
from endoreg_db.models import LegacyImage, LabelSet, Label, ImageClassificationAnnotation
|
|
20
|
-
from django.core.files import File
|
|
21
|
-
from uuid import uuid4
|
|
22
|
-
|
|
23
|
-
class Command(BaseCommand):
|
|
24
|
-
"""
|
|
25
|
-
Imports images from a directory into the database
|
|
26
|
-
|
|
27
|
-
Usage:
|
|
28
|
-
python manage.py import_legacy_images <directory>
|
|
29
|
-
"""
|
|
30
|
-
help = 'Imports images from a directory into the database'
|
|
31
|
-
|
|
32
|
-
def add_arguments(self, parser):
|
|
33
|
-
parser.add_argument('directory', type=str)
|
|
34
|
-
|
|
35
|
-
def handle(self, *args, **options):
|
|
36
|
-
directory = options['directory']
|
|
37
|
-
if not os.path.isdir(directory):
|
|
38
|
-
raise Exception(f"Directory {directory} does not exist")
|
|
39
|
-
|
|
40
|
-
# read settings.json
|
|
41
|
-
with open(os.path.join(directory, 'import_settings.json'), 'r') as f:
|
|
42
|
-
settings = json.load(f)
|
|
43
|
-
|
|
44
|
-
# read img_dicts.jsonl
|
|
45
|
-
with open(os.path.join(directory, 'img_dicts.jsonl'), 'r') as f:
|
|
46
|
-
img_dicts = [json.loads(line) for line in f.readlines()]
|
|
47
|
-
|
|
48
|
-
# get labelset
|
|
49
|
-
labelset_name = settings['labelset_name']
|
|
50
|
-
labelset_version = settings['labelset_version']
|
|
51
|
-
try:
|
|
52
|
-
labelset = LabelSet.objects.get(name=labelset_name, version=labelset_version)
|
|
53
|
-
except LabelSet.DoesNotExist:
|
|
54
|
-
raise Exception(f"No labelset found with the name {labelset_name} and version {labelset_version}")
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
# get labels in dict to lookup by name
|
|
58
|
-
labels = {label.name: label for label in labelset.labels.all()}
|
|
59
|
-
|
|
60
|
-
# create images and image_classification_annotations
|
|
61
|
-
for img_dict in tqdm(img_dicts):
|
|
62
|
-
|
|
63
|
-
# Open the image file
|
|
64
|
-
with open(os.path.join(directory, img_dict['path']), 'rb') as f:
|
|
65
|
-
# Create the Django File object
|
|
66
|
-
django_file = File(f)
|
|
67
|
-
|
|
68
|
-
# Extract only the filename
|
|
69
|
-
filename = os.path.basename(img_dict['path'])
|
|
70
|
-
img_suffix = os.path.splitext(filename)[1]
|
|
71
|
-
# assign uuid as new filename
|
|
72
|
-
filename = str(uuid4()) + img_suffix
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# Create a new LegacyImage instance and save the image
|
|
76
|
-
image = LegacyImage(image=filename, suffix=img_suffix)
|
|
77
|
-
image.image.save(filename, django_file, save=True)
|
|
78
|
-
|
|
79
|
-
image_annotations = []
|
|
80
|
-
for label_name, label in labels.items():
|
|
81
|
-
if label_name in img_dict['labels']:
|
|
82
|
-
value = True
|
|
83
|
-
else:
|
|
84
|
-
value = False
|
|
85
|
-
|
|
86
|
-
image_annotations.append(ImageClassificationAnnotation(
|
|
87
|
-
legacy_image=image,
|
|
88
|
-
label=label,
|
|
89
|
-
value=value,
|
|
90
|
-
annotator=settings['annotator']
|
|
91
|
-
))
|
|
92
|
-
|
|
93
|
-
ImageClassificationAnnotation.objects.bulk_create(image_annotations)
|
|
94
|
-
|
|
1
|
+
# command expects a directory as an argument
|
|
2
|
+
# directory should contain a img_dicts.jsonl file, a settings.json and an "images" directory
|
|
3
|
+
# images should be in jpeg format
|
|
4
|
+
# reads the img_dicts.jsonl file and creates a new database entry for each image
|
|
5
|
+
# img_dicts contains a line for each image in the following format:
|
|
6
|
+
# {"id": 30604292, "path": "images/30604292.jpg", "labels": ["appendix", "polyp"]}
|
|
7
|
+
|
|
8
|
+
# import_settings.json example:
|
|
9
|
+
# {
|
|
10
|
+
# "annotator": "legacy",
|
|
11
|
+
# "labelset_name": "multilabel_classification",
|
|
12
|
+
# "labelset_version": 0
|
|
13
|
+
# }
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import json
|
|
17
|
+
from tqdm import tqdm
|
|
18
|
+
from django.core.management.base import BaseCommand
|
|
19
|
+
from endoreg_db.models import LegacyImage, LabelSet, Label, ImageClassificationAnnotation
|
|
20
|
+
from django.core.files import File
|
|
21
|
+
from uuid import uuid4
|
|
22
|
+
|
|
23
|
+
class Command(BaseCommand):
|
|
24
|
+
"""
|
|
25
|
+
Imports images from a directory into the database
|
|
26
|
+
|
|
27
|
+
Usage:
|
|
28
|
+
python manage.py import_legacy_images <directory>
|
|
29
|
+
"""
|
|
30
|
+
help = 'Imports images from a directory into the database'
|
|
31
|
+
|
|
32
|
+
def add_arguments(self, parser):
|
|
33
|
+
parser.add_argument('directory', type=str)
|
|
34
|
+
|
|
35
|
+
def handle(self, *args, **options):
|
|
36
|
+
directory = options['directory']
|
|
37
|
+
if not os.path.isdir(directory):
|
|
38
|
+
raise Exception(f"Directory {directory} does not exist")
|
|
39
|
+
|
|
40
|
+
# read settings.json
|
|
41
|
+
with open(os.path.join(directory, 'import_settings.json'), 'r') as f:
|
|
42
|
+
settings = json.load(f)
|
|
43
|
+
|
|
44
|
+
# read img_dicts.jsonl
|
|
45
|
+
with open(os.path.join(directory, 'img_dicts.jsonl'), 'r') as f:
|
|
46
|
+
img_dicts = [json.loads(line) for line in f.readlines()]
|
|
47
|
+
|
|
48
|
+
# get labelset
|
|
49
|
+
labelset_name = settings['labelset_name']
|
|
50
|
+
labelset_version = settings['labelset_version']
|
|
51
|
+
try:
|
|
52
|
+
labelset = LabelSet.objects.get(name=labelset_name, version=labelset_version)
|
|
53
|
+
except LabelSet.DoesNotExist:
|
|
54
|
+
raise Exception(f"No labelset found with the name {labelset_name} and version {labelset_version}")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# get labels in dict to lookup by name
|
|
58
|
+
labels = {label.name: label for label in labelset.labels.all()}
|
|
59
|
+
|
|
60
|
+
# create images and image_classification_annotations
|
|
61
|
+
for img_dict in tqdm(img_dicts):
|
|
62
|
+
|
|
63
|
+
# Open the image file
|
|
64
|
+
with open(os.path.join(directory, img_dict['path']), 'rb') as f:
|
|
65
|
+
# Create the Django File object
|
|
66
|
+
django_file = File(f)
|
|
67
|
+
|
|
68
|
+
# Extract only the filename
|
|
69
|
+
filename = os.path.basename(img_dict['path'])
|
|
70
|
+
img_suffix = os.path.splitext(filename)[1]
|
|
71
|
+
# assign uuid as new filename
|
|
72
|
+
filename = str(uuid4()) + img_suffix
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# Create a new LegacyImage instance and save the image
|
|
76
|
+
image = LegacyImage(image=filename, suffix=img_suffix)
|
|
77
|
+
image.image.save(filename, django_file, save=True)
|
|
78
|
+
|
|
79
|
+
image_annotations = []
|
|
80
|
+
for label_name, label in labels.items():
|
|
81
|
+
if label_name in img_dict['labels']:
|
|
82
|
+
value = True
|
|
83
|
+
else:
|
|
84
|
+
value = False
|
|
85
|
+
|
|
86
|
+
image_annotations.append(ImageClassificationAnnotation(
|
|
87
|
+
legacy_image=image,
|
|
88
|
+
label=label,
|
|
89
|
+
value=value,
|
|
90
|
+
annotator=settings['annotator']
|
|
91
|
+
))
|
|
92
|
+
|
|
93
|
+
ImageClassificationAnnotation.objects.bulk_create(image_annotations)
|
|
94
|
+
|