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,97 +1,97 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class ProductManager(models.Manager):
|
|
4
|
-
def get_by_natural_key(self, name):
|
|
5
|
-
return self.get(name=name)
|
|
6
|
-
|
|
7
|
-
def sum_weights(product_materials):
|
|
8
|
-
# sum up the weights
|
|
9
|
-
weight = 0
|
|
10
|
-
reference_unit = None
|
|
11
|
-
for product_material in product_materials:
|
|
12
|
-
if not reference_unit:
|
|
13
|
-
reference_unit = product_material.unit
|
|
14
|
-
else:
|
|
15
|
-
assert reference_unit == product_material.unit, "ProductMaterial units do not match"
|
|
16
|
-
weight += product_material.quantity
|
|
17
|
-
|
|
18
|
-
return weight, reference_unit
|
|
19
|
-
|
|
20
|
-
def sum_emissions(product_materials):
|
|
21
|
-
# sum up the emissions
|
|
22
|
-
emission = 0
|
|
23
|
-
reference_unit = None
|
|
24
|
-
for product_material in product_materials:
|
|
25
|
-
if not reference_unit:
|
|
26
|
-
reference_unit = product_material.unit
|
|
27
|
-
else:
|
|
28
|
-
assert reference_unit == product_material.unit, "ProductMaterial units do not match"
|
|
29
|
-
emission, emission_unit = product_material.get_emission()
|
|
30
|
-
assert reference_unit == emission_unit, "ProductMaterial units do not match"
|
|
31
|
-
emission += emission
|
|
32
|
-
|
|
33
|
-
return emission, reference_unit
|
|
34
|
-
|
|
35
|
-
class Product(models.Model):
|
|
36
|
-
objects = ProductManager()
|
|
37
|
-
|
|
38
|
-
name = models.CharField(max_length=255)
|
|
39
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
40
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
41
|
-
|
|
42
|
-
transport_route = models.ForeignKey("TransportRoute", on_delete=models.SET_NULL, null=True)
|
|
43
|
-
product_group = models.ForeignKey("ProductGroup", on_delete=models.SET_NULL, null=True)
|
|
44
|
-
|
|
45
|
-
def natural_key(self):
|
|
46
|
-
return (self.name,)
|
|
47
|
-
|
|
48
|
-
def __str__(self):
|
|
49
|
-
return self.name
|
|
50
|
-
|
|
51
|
-
def get_product_weight(self):
|
|
52
|
-
# check if there is a product material weight
|
|
53
|
-
from .product_material import ProductMaterial
|
|
54
|
-
product_materials = ProductMaterial.objects.filter(product=self, component="product")
|
|
55
|
-
if product_materials:
|
|
56
|
-
return self.get_product_material_weight()
|
|
57
|
-
|
|
58
|
-
# check if there is a product weight
|
|
59
|
-
#TODO
|
|
60
|
-
|
|
61
|
-
def get_package_weight(self):
|
|
62
|
-
# check if there is a package material weight
|
|
63
|
-
from .product_material import ProductMaterial
|
|
64
|
-
product_materials = ProductMaterial.objects.filter(product=self, component="package")
|
|
65
|
-
if product_materials:
|
|
66
|
-
return self.get_package_material_weight()
|
|
67
|
-
|
|
68
|
-
# check if there is a package weight
|
|
69
|
-
#TODO
|
|
70
|
-
|
|
71
|
-
def get_product_material_weight(self):
|
|
72
|
-
# get all materials with component == "product"
|
|
73
|
-
from .product_material import ProductMaterial
|
|
74
|
-
product_materials = ProductMaterial.objects.filter(product=self, component="product")
|
|
75
|
-
|
|
76
|
-
return sum_weights(product_materials)
|
|
77
|
-
|
|
78
|
-
def get_package_material_weight(self):
|
|
79
|
-
# get all materials with component == "package"
|
|
80
|
-
from .product_material import ProductMaterial
|
|
81
|
-
product_materials = ProductMaterial.objects.filter(product=self, component="package")
|
|
82
|
-
|
|
83
|
-
return sum_weights(product_materials)
|
|
84
|
-
|
|
85
|
-
def get_product_material_emission(self):
|
|
86
|
-
# get all materials with component == "product"
|
|
87
|
-
from .product_material import ProductMaterial
|
|
88
|
-
product_materials = ProductMaterial.objects.filter(product=self, component="product")
|
|
89
|
-
|
|
90
|
-
return sum_emissions(product_materials)
|
|
91
|
-
|
|
92
|
-
def get_package_material_emission(self):
|
|
93
|
-
# get all materials with component == "package"
|
|
94
|
-
from .product_material import ProductMaterial
|
|
95
|
-
product_materials = ProductMaterial.objects.filter(product=self, component="package")
|
|
96
|
-
|
|
97
|
-
return sum_emissions(product_materials)
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ProductManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
def sum_weights(product_materials):
|
|
8
|
+
# sum up the weights
|
|
9
|
+
weight = 0
|
|
10
|
+
reference_unit = None
|
|
11
|
+
for product_material in product_materials:
|
|
12
|
+
if not reference_unit:
|
|
13
|
+
reference_unit = product_material.unit
|
|
14
|
+
else:
|
|
15
|
+
assert reference_unit == product_material.unit, "ProductMaterial units do not match"
|
|
16
|
+
weight += product_material.quantity
|
|
17
|
+
|
|
18
|
+
return weight, reference_unit
|
|
19
|
+
|
|
20
|
+
def sum_emissions(product_materials):
|
|
21
|
+
# sum up the emissions
|
|
22
|
+
emission = 0
|
|
23
|
+
reference_unit = None
|
|
24
|
+
for product_material in product_materials:
|
|
25
|
+
if not reference_unit:
|
|
26
|
+
reference_unit = product_material.unit
|
|
27
|
+
else:
|
|
28
|
+
assert reference_unit == product_material.unit, "ProductMaterial units do not match"
|
|
29
|
+
emission, emission_unit = product_material.get_emission()
|
|
30
|
+
assert reference_unit == emission_unit, "ProductMaterial units do not match"
|
|
31
|
+
emission += emission
|
|
32
|
+
|
|
33
|
+
return emission, reference_unit
|
|
34
|
+
|
|
35
|
+
class Product(models.Model):
|
|
36
|
+
objects = ProductManager()
|
|
37
|
+
|
|
38
|
+
name = models.CharField(max_length=255)
|
|
39
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
40
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
41
|
+
|
|
42
|
+
transport_route = models.ForeignKey("TransportRoute", on_delete=models.SET_NULL, null=True)
|
|
43
|
+
product_group = models.ForeignKey("ProductGroup", on_delete=models.SET_NULL, null=True)
|
|
44
|
+
|
|
45
|
+
def natural_key(self):
|
|
46
|
+
return (self.name,)
|
|
47
|
+
|
|
48
|
+
def __str__(self):
|
|
49
|
+
return self.name
|
|
50
|
+
|
|
51
|
+
def get_product_weight(self):
|
|
52
|
+
# check if there is a product material weight
|
|
53
|
+
from .product_material import ProductMaterial
|
|
54
|
+
product_materials = ProductMaterial.objects.filter(product=self, component="product")
|
|
55
|
+
if product_materials:
|
|
56
|
+
return self.get_product_material_weight()
|
|
57
|
+
|
|
58
|
+
# check if there is a product weight
|
|
59
|
+
#TODO
|
|
60
|
+
|
|
61
|
+
def get_package_weight(self):
|
|
62
|
+
# check if there is a package material weight
|
|
63
|
+
from .product_material import ProductMaterial
|
|
64
|
+
product_materials = ProductMaterial.objects.filter(product=self, component="package")
|
|
65
|
+
if product_materials:
|
|
66
|
+
return self.get_package_material_weight()
|
|
67
|
+
|
|
68
|
+
# check if there is a package weight
|
|
69
|
+
#TODO
|
|
70
|
+
|
|
71
|
+
def get_product_material_weight(self):
|
|
72
|
+
# get all materials with component == "product"
|
|
73
|
+
from .product_material import ProductMaterial
|
|
74
|
+
product_materials = ProductMaterial.objects.filter(product=self, component="product")
|
|
75
|
+
|
|
76
|
+
return sum_weights(product_materials)
|
|
77
|
+
|
|
78
|
+
def get_package_material_weight(self):
|
|
79
|
+
# get all materials with component == "package"
|
|
80
|
+
from .product_material import ProductMaterial
|
|
81
|
+
product_materials = ProductMaterial.objects.filter(product=self, component="package")
|
|
82
|
+
|
|
83
|
+
return sum_weights(product_materials)
|
|
84
|
+
|
|
85
|
+
def get_product_material_emission(self):
|
|
86
|
+
# get all materials with component == "product"
|
|
87
|
+
from .product_material import ProductMaterial
|
|
88
|
+
product_materials = ProductMaterial.objects.filter(product=self, component="product")
|
|
89
|
+
|
|
90
|
+
return sum_emissions(product_materials)
|
|
91
|
+
|
|
92
|
+
def get_package_material_emission(self):
|
|
93
|
+
# get all materials with component == "package"
|
|
94
|
+
from .product_material import ProductMaterial
|
|
95
|
+
product_materials = ProductMaterial.objects.filter(product=self, component="package")
|
|
96
|
+
|
|
97
|
+
return sum_emissions(product_materials)
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class ProductGroupManager(models.Manager):
|
|
4
|
-
def get_by_natural_key(self, name):
|
|
5
|
-
return self.get(name=name)
|
|
6
|
-
|
|
7
|
-
class ProductGroup(models.Model):
|
|
8
|
-
objects = ProductGroupManager()
|
|
9
|
-
|
|
10
|
-
name = models.CharField(max_length=255)
|
|
11
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
12
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
13
|
-
|
|
14
|
-
def natural_key(self):
|
|
15
|
-
return (self.name,)
|
|
16
|
-
|
|
17
|
-
def __str__(self):
|
|
18
|
-
return self.name
|
|
19
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ProductGroupManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class ProductGroup(models.Model):
|
|
8
|
+
objects = ProductGroupManager()
|
|
9
|
+
|
|
10
|
+
name = models.CharField(max_length=255)
|
|
11
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
12
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
13
|
+
|
|
14
|
+
def natural_key(self):
|
|
15
|
+
return (self.name,)
|
|
16
|
+
|
|
17
|
+
def __str__(self):
|
|
18
|
+
return self.name
|
|
19
|
+
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class ProductMaterial(models.Model):
|
|
4
|
-
component = models.CharField(max_length=255)
|
|
5
|
-
material = models.ForeignKey("Material", on_delete=models.CASCADE)
|
|
6
|
-
product = models.ForeignKey("Product", on_delete=models.CASCADE, related_name="product_materials")
|
|
7
|
-
unit = models.ForeignKey("Unit", on_delete=models.CASCADE)
|
|
8
|
-
quantity = models.FloatField()
|
|
9
|
-
|
|
10
|
-
def get_emission(self):
|
|
11
|
-
from ..emission import EmissionFactor
|
|
12
|
-
emission_factor:EmissionFactor = self.material.emission_factor
|
|
13
|
-
if emission_factor is None:
|
|
14
|
-
raise Exception("No emission factor for material " + self.material.name + " found.")
|
|
15
|
-
|
|
16
|
-
# make sure product_material.unit is the same as emission_factor.unit
|
|
17
|
-
if self.unit != emission_factor.unit:
|
|
18
|
-
raise Exception("Unit mismatch: " + self.unit.name + " != " + emission_factor.unit.name)
|
|
19
|
-
|
|
20
|
-
emmision_value = emission_factor.value * self.quantity
|
|
21
|
-
emission_unit = emission_factor.unit
|
|
22
|
-
return emmision_value, emission_unit
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ProductMaterial(models.Model):
|
|
4
|
+
component = models.CharField(max_length=255)
|
|
5
|
+
material = models.ForeignKey("Material", on_delete=models.CASCADE)
|
|
6
|
+
product = models.ForeignKey("Product", on_delete=models.CASCADE, related_name="product_materials")
|
|
7
|
+
unit = models.ForeignKey("Unit", on_delete=models.CASCADE)
|
|
8
|
+
quantity = models.FloatField()
|
|
9
|
+
|
|
10
|
+
def get_emission(self):
|
|
11
|
+
from ..emission import EmissionFactor
|
|
12
|
+
emission_factor:EmissionFactor = self.material.emission_factor
|
|
13
|
+
if emission_factor is None:
|
|
14
|
+
raise Exception("No emission factor for material " + self.material.name + " found.")
|
|
15
|
+
|
|
16
|
+
# make sure product_material.unit is the same as emission_factor.unit
|
|
17
|
+
if self.unit != emission_factor.unit:
|
|
18
|
+
raise Exception("Unit mismatch: " + self.unit.name + " != " + emission_factor.unit.name)
|
|
19
|
+
|
|
20
|
+
emmision_value = emission_factor.value * self.quantity
|
|
21
|
+
emission_unit = emission_factor.unit
|
|
22
|
+
return emmision_value, emission_unit
|
|
23
|
+
|
|
24
|
+
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
import pandas as pd
|
|
3
|
-
|
|
4
|
-
class ProductWeightManager(models.Manager):
|
|
5
|
-
def get_by_natural_key(self, product, product_group, weight):
|
|
6
|
-
return self.get(product=product, product_group=product_group, weight=weight)
|
|
7
|
-
|
|
8
|
-
class ProductWeight(models.Model):
|
|
9
|
-
objects = ProductWeightManager()
|
|
10
|
-
|
|
11
|
-
name = models.CharField(max_length=255, null = True)
|
|
12
|
-
product = models.ForeignKey("Product", on_delete=models.CASCADE)
|
|
13
|
-
measured = models.FloatField(null=True)
|
|
14
|
-
verified = models.FloatField(null=True)
|
|
15
|
-
manufacturer = models.FloatField(null=True)
|
|
16
|
-
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
17
|
-
|
|
18
|
-
def get_weight(self):
|
|
19
|
-
if not pd.isnull(self.verified):
|
|
20
|
-
return self.verified
|
|
21
|
-
elif not pd.isnull(self.measured):
|
|
22
|
-
return self.measured
|
|
23
|
-
elif not pd.isnull(self.manufacturer):
|
|
24
|
-
return self.manufacturer
|
|
25
|
-
else:
|
|
26
|
-
return None
|
|
1
|
+
from django.db import models
|
|
2
|
+
import pandas as pd
|
|
3
|
+
|
|
4
|
+
class ProductWeightManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, product, product_group, weight):
|
|
6
|
+
return self.get(product=product, product_group=product_group, weight=weight)
|
|
7
|
+
|
|
8
|
+
class ProductWeight(models.Model):
|
|
9
|
+
objects = ProductWeightManager()
|
|
10
|
+
|
|
11
|
+
name = models.CharField(max_length=255, null = True)
|
|
12
|
+
product = models.ForeignKey("Product", on_delete=models.CASCADE)
|
|
13
|
+
measured = models.FloatField(null=True)
|
|
14
|
+
verified = models.FloatField(null=True)
|
|
15
|
+
manufacturer = models.FloatField(null=True)
|
|
16
|
+
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
17
|
+
|
|
18
|
+
def get_weight(self):
|
|
19
|
+
if not pd.isnull(self.verified):
|
|
20
|
+
return self.verified
|
|
21
|
+
elif not pd.isnull(self.measured):
|
|
22
|
+
return self.measured
|
|
23
|
+
elif not pd.isnull(self.manufacturer):
|
|
24
|
+
return self.manufacturer
|
|
25
|
+
else:
|
|
26
|
+
return None
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
from typing import List
|
|
3
|
-
|
|
4
|
-
class ReferenceProductManager(models.Manager):
|
|
5
|
-
def get_by_natural_key(self, product_name:str, product_group_name:str):
|
|
6
|
-
return self.get(product__name=product_name, product_group__name=product_group_name)
|
|
7
|
-
|
|
8
|
-
class ReferenceProduct(models.Model):
|
|
9
|
-
name = models.CharField(max_length=255)
|
|
10
|
-
product = models.ForeignKey("Product", on_delete=models.CASCADE)
|
|
11
|
-
product_group = models.OneToOneField("ProductGroup", on_delete=models.CASCADE, related_name="reference_product")
|
|
12
|
-
emission_factor_total = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, blank = True)
|
|
13
|
-
emission_factor_package = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="reference_product_package")
|
|
14
|
-
emission_factor_product = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="reference_product_product")
|
|
15
|
-
|
|
16
|
-
objects = ReferenceProductManager()
|
|
17
|
-
|
|
18
|
-
def __str__(self):
|
|
19
|
-
return self.product.name + " (" + self.product_group.name + ")"
|
|
20
|
-
|
|
21
|
-
def set_emission_factors(self):
|
|
22
|
-
from .product import Product
|
|
23
|
-
from .product_material import ProductMaterial
|
|
24
|
-
from ..emission import EmissionFactor
|
|
25
|
-
|
|
26
|
-
product:Product = self.product
|
|
27
|
-
materials = product.product_materials.all()
|
|
28
|
-
emission_factor_name = f"{self.product_group.name}_{product.name}_total_emission_factor"
|
|
29
|
-
emission_factor_package_name = f"{self.product_group.name}_{product.name}_package_emission_factor"
|
|
30
|
-
emission_factor_product_name = f"{self.product_group.name}_{product.name}_product_emission_factor"
|
|
31
|
-
|
|
32
|
-
product_emissions = 0
|
|
33
|
-
package_emissions = 0
|
|
34
|
-
|
|
35
|
-
product_weight, product_weight_unit = product.get_product_material_weight()
|
|
36
|
-
package_weight, package_weight_unit = product.get_package_material_weight()
|
|
37
|
-
product_emission, product_emission_unit = product.get_product_material_emission()
|
|
38
|
-
package_emission, package_emission_unit = product.get_package_material_emission()
|
|
39
|
-
|
|
40
|
-
total_weight = product_weight + package_weight
|
|
41
|
-
total_emission = product_emission + package_emission
|
|
42
|
-
|
|
43
|
-
reference_unit = product_weight_unit
|
|
44
|
-
assert reference_unit == package_weight_unit, "Package weight units do not match"
|
|
45
|
-
assert reference_unit == product_emission_unit, "Product emission units do not match"
|
|
46
|
-
assert reference_unit == package_emission_unit, "Package emission units do not match"
|
|
47
|
-
|
|
48
|
-
product_emission_factor_value = product_emission / product_weight
|
|
49
|
-
package_emission_factor_value = package_emission / package_weight
|
|
50
|
-
total_emission_factor_value = total_emission / total_weight
|
|
51
|
-
|
|
52
|
-
emission_factor, created = EmissionFactor.objects.get_or_create(
|
|
53
|
-
name=emission_factor_name,
|
|
54
|
-
defaults={
|
|
55
|
-
"name": emission_factor_name,
|
|
56
|
-
"value": total_emission_factor_value,
|
|
57
|
-
"unit": reference_unit
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
self.emission_factor_total = emission_factor
|
|
61
|
-
|
|
62
|
-
emission_factor_package, created = EmissionFactor.objects.get_or_create(
|
|
63
|
-
name=emission_factor_package_name,
|
|
64
|
-
defaults={
|
|
65
|
-
"name": emission_factor_package_name,
|
|
66
|
-
"value": package_emission_factor_value,
|
|
67
|
-
"unit": reference_unit
|
|
68
|
-
}
|
|
69
|
-
)
|
|
70
|
-
self.emission_factor_package = emission_factor_package
|
|
71
|
-
|
|
72
|
-
emission_factor_product, created = EmissionFactor.objects.get_or_create(
|
|
73
|
-
name=emission_factor_product_name,
|
|
74
|
-
defaults={
|
|
75
|
-
"name": emission_factor_product_name,
|
|
76
|
-
"value": product_emission_factor_value,
|
|
77
|
-
"unit": reference_unit
|
|
78
|
-
}
|
|
79
|
-
)
|
|
80
|
-
self.emission_factor_product = emission_factor_product
|
|
81
|
-
|
|
82
|
-
self.save()
|
|
83
|
-
|
|
84
|
-
def get_emission_factor(self, component:str):
|
|
85
|
-
# check if emission_factor_total exists:
|
|
86
|
-
if self.emission_factor_total is None:
|
|
87
|
-
self.set_emission_factors()
|
|
88
|
-
|
|
89
|
-
if component == "total":
|
|
90
|
-
return self.emission_factor_total
|
|
91
|
-
elif component == "package":
|
|
92
|
-
return self.emission_factor_package
|
|
93
|
-
elif component == "product":
|
|
94
|
-
return self.emission_factor_product
|
|
95
|
-
else:
|
|
96
|
-
raise Exception("Unknown component: " + component)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
class ReferenceProductManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, product_name:str, product_group_name:str):
|
|
6
|
+
return self.get(product__name=product_name, product_group__name=product_group_name)
|
|
7
|
+
|
|
8
|
+
class ReferenceProduct(models.Model):
|
|
9
|
+
name = models.CharField(max_length=255)
|
|
10
|
+
product = models.ForeignKey("Product", on_delete=models.CASCADE)
|
|
11
|
+
product_group = models.OneToOneField("ProductGroup", on_delete=models.CASCADE, related_name="reference_product")
|
|
12
|
+
emission_factor_total = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, blank = True)
|
|
13
|
+
emission_factor_package = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="reference_product_package")
|
|
14
|
+
emission_factor_product = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="reference_product_product")
|
|
15
|
+
|
|
16
|
+
objects = ReferenceProductManager()
|
|
17
|
+
|
|
18
|
+
def __str__(self):
|
|
19
|
+
return self.product.name + " (" + self.product_group.name + ")"
|
|
20
|
+
|
|
21
|
+
def set_emission_factors(self):
|
|
22
|
+
from .product import Product
|
|
23
|
+
from .product_material import ProductMaterial
|
|
24
|
+
from ..emission import EmissionFactor
|
|
25
|
+
|
|
26
|
+
product:Product = self.product
|
|
27
|
+
materials = product.product_materials.all()
|
|
28
|
+
emission_factor_name = f"{self.product_group.name}_{product.name}_total_emission_factor"
|
|
29
|
+
emission_factor_package_name = f"{self.product_group.name}_{product.name}_package_emission_factor"
|
|
30
|
+
emission_factor_product_name = f"{self.product_group.name}_{product.name}_product_emission_factor"
|
|
31
|
+
|
|
32
|
+
product_emissions = 0
|
|
33
|
+
package_emissions = 0
|
|
34
|
+
|
|
35
|
+
product_weight, product_weight_unit = product.get_product_material_weight()
|
|
36
|
+
package_weight, package_weight_unit = product.get_package_material_weight()
|
|
37
|
+
product_emission, product_emission_unit = product.get_product_material_emission()
|
|
38
|
+
package_emission, package_emission_unit = product.get_package_material_emission()
|
|
39
|
+
|
|
40
|
+
total_weight = product_weight + package_weight
|
|
41
|
+
total_emission = product_emission + package_emission
|
|
42
|
+
|
|
43
|
+
reference_unit = product_weight_unit
|
|
44
|
+
assert reference_unit == package_weight_unit, "Package weight units do not match"
|
|
45
|
+
assert reference_unit == product_emission_unit, "Product emission units do not match"
|
|
46
|
+
assert reference_unit == package_emission_unit, "Package emission units do not match"
|
|
47
|
+
|
|
48
|
+
product_emission_factor_value = product_emission / product_weight
|
|
49
|
+
package_emission_factor_value = package_emission / package_weight
|
|
50
|
+
total_emission_factor_value = total_emission / total_weight
|
|
51
|
+
|
|
52
|
+
emission_factor, created = EmissionFactor.objects.get_or_create(
|
|
53
|
+
name=emission_factor_name,
|
|
54
|
+
defaults={
|
|
55
|
+
"name": emission_factor_name,
|
|
56
|
+
"value": total_emission_factor_value,
|
|
57
|
+
"unit": reference_unit
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
self.emission_factor_total = emission_factor
|
|
61
|
+
|
|
62
|
+
emission_factor_package, created = EmissionFactor.objects.get_or_create(
|
|
63
|
+
name=emission_factor_package_name,
|
|
64
|
+
defaults={
|
|
65
|
+
"name": emission_factor_package_name,
|
|
66
|
+
"value": package_emission_factor_value,
|
|
67
|
+
"unit": reference_unit
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
self.emission_factor_package = emission_factor_package
|
|
71
|
+
|
|
72
|
+
emission_factor_product, created = EmissionFactor.objects.get_or_create(
|
|
73
|
+
name=emission_factor_product_name,
|
|
74
|
+
defaults={
|
|
75
|
+
"name": emission_factor_product_name,
|
|
76
|
+
"value": product_emission_factor_value,
|
|
77
|
+
"unit": reference_unit
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
self.emission_factor_product = emission_factor_product
|
|
81
|
+
|
|
82
|
+
self.save()
|
|
83
|
+
|
|
84
|
+
def get_emission_factor(self, component:str):
|
|
85
|
+
# check if emission_factor_total exists:
|
|
86
|
+
if self.emission_factor_total is None:
|
|
87
|
+
self.set_emission_factors()
|
|
88
|
+
|
|
89
|
+
if component == "total":
|
|
90
|
+
return self.emission_factor_total
|
|
91
|
+
elif component == "package":
|
|
92
|
+
return self.emission_factor_package
|
|
93
|
+
elif component == "product":
|
|
94
|
+
return self.emission_factor_product
|
|
95
|
+
else:
|
|
96
|
+
raise Exception("Unknown component: " + component)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|