endoreg-db 0.3.6__py3-none-any.whl → 0.3.8__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.
Files changed (351) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +67 -64
  4. endoreg_db/data/active_model/data.yaml +2 -2
  5. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
  6. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
  7. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
  8. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
  9. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
  10. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
  11. endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
  12. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
  13. endoreg_db/data/case_template/rule_value/.init +0 -0
  14. endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
  15. endoreg_db/data/case_template/template/base.yaml +7 -7
  16. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
  17. endoreg_db/data/case_template/tmp/_rule_value +13 -13
  18. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
  19. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
  20. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
  21. endoreg_db/data/center/data.yaml +59 -59
  22. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
  23. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
  24. endoreg_db/data/disease/cardiovascular.yaml +37 -37
  25. endoreg_db/data/disease/hepatology.yaml +4 -4
  26. endoreg_db/data/disease/misc.yaml +5 -5
  27. endoreg_db/data/disease/renal.yaml +4 -4
  28. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
  29. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
  30. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
  31. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
  32. endoreg_db/data/distribution/date/patient.yaml +6 -6
  33. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  34. endoreg_db/data/distribution/numeric/.init +0 -0
  35. endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
  36. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
  37. endoreg_db/data/endoscope_type/data.yaml +10 -10
  38. endoreg_db/data/endoscopy_processor/data.yaml +45 -45
  39. endoreg_db/data/event/cardiology.yaml +27 -27
  40. endoreg_db/data/event/neurology.yaml +13 -13
  41. endoreg_db/data/event/surgery.yaml +12 -12
  42. endoreg_db/data/event/thrombembolism.yaml +19 -19
  43. endoreg_db/data/examination/examinations/data.yaml +65 -65
  44. endoreg_db/data/examination/time/data.yaml +47 -47
  45. endoreg_db/data/examination/time-type/data.yaml +7 -7
  46. endoreg_db/data/examination/type/data.yaml +5 -5
  47. endoreg_db/data/gender/data.yaml +18 -18
  48. endoreg_db/data/information_source/data.yaml +30 -30
  49. endoreg_db/data/information_source/medication.yaml +5 -5
  50. endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
  51. endoreg_db/data/lab_value/coagulation.yaml +48 -48
  52. endoreg_db/data/lab_value/electrolytes.yaml +189 -189
  53. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
  54. endoreg_db/data/lab_value/hematology.yaml +169 -169
  55. endoreg_db/data/lab_value/hormones.yaml +53 -53
  56. endoreg_db/data/lab_value/lipids.yaml +44 -44
  57. endoreg_db/data/lab_value/misc.yaml +30 -30
  58. endoreg_db/data/lab_value/renal_function.yaml +10 -10
  59. endoreg_db/data/label/label/data.yaml +62 -62
  60. endoreg_db/data/label/label-set/data.yaml +17 -17
  61. endoreg_db/data/label/label-type/data.yaml +6 -6
  62. endoreg_db/data/medication/anticoagulation.yaml +64 -64
  63. endoreg_db/data/medication/tah.yaml +69 -69
  64. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
  65. endoreg_db/data/medication_indication_type/data.yaml +10 -10
  66. endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
  67. endoreg_db/data/medication_intake_time/base.yaml +30 -30
  68. endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
  69. endoreg_db/data/medication_schedule/ass.yaml +12 -12
  70. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
  71. endoreg_db/data/model_type/data.yaml +6 -6
  72. endoreg_db/data/network_device/data.yaml +17 -0
  73. endoreg_db/data/network_device_type/data.yaml +8 -0
  74. endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
  75. endoreg_db/data/pdf_type/data.yaml +28 -28
  76. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
  77. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
  78. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
  79. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
  80. endoreg_db/data/profession/data.yaml +70 -70
  81. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
  82. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  83. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  84. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
  85. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
  86. endoreg_db/data/unit/concentration.yaml +92 -92
  87. endoreg_db/data/unit/data.yaml +17 -17
  88. endoreg_db/data/unit/length.yaml +30 -30
  89. endoreg_db/data/unit/misc.yaml +19 -19
  90. endoreg_db/data/unit/rate.yaml +5 -5
  91. endoreg_db/data/unit/time.yaml +12 -12
  92. endoreg_db/data/unit/volume.yaml +35 -35
  93. endoreg_db/data/unit/weight.yaml +37 -37
  94. endoreg_db/data/waste/data.yaml +11 -11
  95. endoreg_db/forms/__init__.py +2 -2
  96. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  97. endoreg_db/forms/settings/__init__.py +8 -8
  98. endoreg_db/forms/unit.py +5 -5
  99. endoreg_db/management/commands/_load_model_template.py +40 -40
  100. endoreg_db/management/commands/delete_all.py +18 -18
  101. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  102. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  103. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  104. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  105. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  106. endoreg_db/management/commands/import_legacy_images.py +94 -94
  107. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  108. endoreg_db/management/commands/load_active_model_data.py +44 -44
  109. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  110. endoreg_db/management/commands/load_base_db_data.py +132 -128
  111. endoreg_db/management/commands/load_center_data.py +42 -42
  112. endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
  113. endoreg_db/management/commands/load_disease_classification_data.py +40 -40
  114. endoreg_db/management/commands/load_disease_data.py +39 -39
  115. endoreg_db/management/commands/load_distribution_data.py +65 -65
  116. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  117. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  118. endoreg_db/management/commands/load_event_data.py +40 -40
  119. endoreg_db/management/commands/load_examination_data.py +74 -74
  120. endoreg_db/management/commands/load_g_play_data.py +112 -112
  121. endoreg_db/management/commands/load_gender_data.py +43 -43
  122. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
  123. endoreg_db/management/commands/load_information_source.py +44 -44
  124. endoreg_db/management/commands/load_lab_value_data.py +49 -49
  125. endoreg_db/management/commands/load_label_data.py +66 -66
  126. endoreg_db/management/commands/load_medication_data.py +40 -40
  127. endoreg_db/management/commands/load_medication_indication_data.py +62 -62
  128. endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
  129. endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
  130. endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
  131. endoreg_db/management/commands/load_network_data.py +49 -0
  132. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  133. endoreg_db/management/commands/load_profession_data.py +43 -43
  134. endoreg_db/management/commands/load_report_reader_flag.py +45 -45
  135. endoreg_db/management/commands/load_unit_data.py +45 -45
  136. endoreg_db/management/commands/load_user_groups.py +28 -28
  137. endoreg_db/management/commands/register_ai_model.py +65 -65
  138. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  139. endoreg_db/migrations/0001_initial.py +582 -582
  140. endoreg_db/migrations/0002_rawvideofile.py +26 -26
  141. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
  142. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
  143. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
  144. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
  145. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
  146. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
  147. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
  148. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
  149. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
  150. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
  151. endoreg_db/migrations/0013_rawpdffile.py +31 -31
  152. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
  153. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
  154. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
  155. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
  156. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
  157. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
  158. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
  159. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
  160. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
  161. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
  162. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
  163. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -42
  164. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
  165. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
  166. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
  167. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
  168. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
  169. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
  170. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
  171. endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
  172. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
  173. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
  174. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
  175. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
  176. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
  177. endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
  178. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
  179. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
  180. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
  181. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
  182. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
  183. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
  184. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
  185. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
  186. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
  187. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
  188. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
  189. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
  190. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
  191. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
  192. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
  193. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
  194. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
  195. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
  196. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
  197. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
  198. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
  199. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
  200. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
  201. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
  202. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
  203. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
  204. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
  205. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
  206. endoreg_db/migrations/0068_networkdevicetype_networkdevicetypemanager_and_more.py +57 -0
  207. endoreg_db/models/__init__.py +75 -74
  208. endoreg_db/models/ai_model/__init__.py +3 -3
  209. endoreg_db/models/ai_model/active_model.py +9 -9
  210. endoreg_db/models/ai_model/model_meta.py +24 -24
  211. endoreg_db/models/ai_model/model_type.py +25 -25
  212. endoreg_db/models/ai_model/utils.py +8 -8
  213. endoreg_db/models/annotation/__init__.py +1 -1
  214. endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
  215. endoreg_db/models/annotation/image_classification.py +26 -26
  216. endoreg_db/models/case_template/__init__.py +5 -5
  217. endoreg_db/models/case_template/case_template.py +81 -81
  218. endoreg_db/models/case_template/case_template_rule.py +276 -276
  219. endoreg_db/models/case_template/case_template_rule_value.py +73 -73
  220. endoreg_db/models/case_template/case_template_type.py +27 -27
  221. endoreg_db/models/center/__init__.py +4 -4
  222. endoreg_db/models/center/center.py +24 -24
  223. endoreg_db/models/center/center_product.py +33 -33
  224. endoreg_db/models/center/center_resource.py +18 -18
  225. endoreg_db/models/center/center_waste.py +10 -10
  226. endoreg_db/models/data_file/__init__.py +5 -5
  227. endoreg_db/models/data_file/base_classes/__init__.py +2 -2
  228. endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
  229. endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
  230. endoreg_db/models/data_file/frame.py +45 -45
  231. endoreg_db/models/data_file/import_classes/__init__.py +31 -31
  232. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
  233. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
  234. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
  235. endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -188
  236. endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
  237. endoreg_db/models/data_file/metadata/__init__.py +3 -3
  238. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
  239. endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
  240. endoreg_db/models/data_file/metadata/video_meta.py +132 -132
  241. endoreg_db/models/data_file/report_file.py +89 -89
  242. endoreg_db/models/data_file/video/__init__.py +6 -6
  243. endoreg_db/models/data_file/video/import_meta.py +25 -25
  244. endoreg_db/models/data_file/video/video.py +25 -25
  245. endoreg_db/models/data_file/video_segment.py +107 -107
  246. endoreg_db/models/disease.py +55 -55
  247. endoreg_db/models/emission/emission_factor.py +19 -19
  248. endoreg_db/models/event.py +21 -21
  249. endoreg_db/models/examination/__init__.py +3 -3
  250. endoreg_db/models/examination/examination.py +26 -26
  251. endoreg_db/models/examination/examination_time.py +27 -27
  252. endoreg_db/models/examination/examination_time_type.py +24 -24
  253. endoreg_db/models/examination/examination_type.py +18 -18
  254. endoreg_db/models/hardware/__init__.py +1 -1
  255. endoreg_db/models/hardware/endoscope.py +44 -44
  256. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  257. endoreg_db/models/information_source.py +29 -29
  258. endoreg_db/models/label/label.py +84 -84
  259. endoreg_db/models/laboratory/lab_value.py +102 -102
  260. endoreg_db/models/legacy_data/__init__.py +3 -3
  261. endoreg_db/models/legacy_data/image.py +34 -34
  262. endoreg_db/models/medication/medication.py +148 -148
  263. endoreg_db/models/network/__init__.py +2 -0
  264. endoreg_db/models/network/network_device.py +27 -0
  265. endoreg_db/models/network/network_device_type.py +23 -0
  266. endoreg_db/models/other/__init__.py +4 -4
  267. endoreg_db/models/other/distribution.py +215 -215
  268. endoreg_db/models/other/material.py +16 -16
  269. endoreg_db/models/other/resource.py +17 -17
  270. endoreg_db/models/other/transport_route.py +20 -20
  271. endoreg_db/models/other/waste.py +20 -20
  272. endoreg_db/models/patient_examination/__init__.py +35 -35
  273. endoreg_db/models/permissions/__init__.py +44 -44
  274. endoreg_db/models/persons/__init__.py +6 -6
  275. endoreg_db/models/persons/examiner/__init__.py +1 -1
  276. endoreg_db/models/persons/examiner/examiner.py +15 -15
  277. endoreg_db/models/persons/examiner/examiner_type.py +1 -1
  278. endoreg_db/models/persons/first_name.py +17 -17
  279. endoreg_db/models/persons/gender.py +22 -22
  280. endoreg_db/models/persons/last_name.py +19 -19
  281. endoreg_db/models/persons/patient/__init__.py +7 -7
  282. endoreg_db/models/persons/patient/case/case.py +30 -30
  283. endoreg_db/models/persons/patient/patient.py +216 -216
  284. endoreg_db/models/persons/patient/patient_disease.py +16 -16
  285. endoreg_db/models/persons/patient/patient_event.py +22 -22
  286. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
  287. endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
  288. endoreg_db/models/persons/patient/patient_medication.py +43 -43
  289. endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
  290. endoreg_db/models/persons/person.py +31 -31
  291. endoreg_db/models/persons/portal_user_information.py +27 -27
  292. endoreg_db/models/prediction/__init__.py +1 -1
  293. endoreg_db/models/prediction/image_classification.py +37 -37
  294. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  295. endoreg_db/models/product/__init__.py +4 -4
  296. endoreg_db/models/product/product.py +97 -97
  297. endoreg_db/models/product/product_group.py +19 -19
  298. endoreg_db/models/product/product_material.py +24 -24
  299. endoreg_db/models/product/product_weight.py +26 -26
  300. endoreg_db/models/product/reference_product.py +99 -99
  301. endoreg_db/models/questionnaires/__init__.py +114 -114
  302. endoreg_db/models/quiz/__init__.py +1 -1
  303. endoreg_db/models/quiz/quiz_answer.py +41 -41
  304. endoreg_db/models/quiz/quiz_question.py +54 -54
  305. endoreg_db/models/report_reader/__init__.py +1 -1
  306. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  307. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  308. endoreg_db/models/rules/__init__.py +4 -4
  309. endoreg_db/models/rules/rule.py +23 -23
  310. endoreg_db/models/rules/rule_applicator.py +224 -224
  311. endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
  312. endoreg_db/models/rules/rule_type.py +21 -21
  313. endoreg_db/models/rules/ruleset.py +19 -19
  314. endoreg_db/models/unit.py +21 -21
  315. endoreg_db/queries/__init__.py +4 -4
  316. endoreg_db/queries/annotations/__init__.py +2 -2
  317. endoreg_db/queries/annotations/legacy.py +159 -159
  318. endoreg_db/queries/get/__init__.py +5 -5
  319. endoreg_db/queries/get/center.py +42 -42
  320. endoreg_db/queries/get/model.py +13 -13
  321. endoreg_db/queries/get/patient.py +14 -14
  322. endoreg_db/queries/get/patient_examination.py +20 -20
  323. endoreg_db/queries/get/report_file.py +33 -33
  324. endoreg_db/queries/get/video.py +31 -31
  325. endoreg_db/serializers/__init__.py +9 -9
  326. endoreg_db/serializers/ai_model.py +18 -18
  327. endoreg_db/serializers/annotation.py +17 -17
  328. endoreg_db/serializers/center.py +11 -11
  329. endoreg_db/serializers/examination.py +32 -32
  330. endoreg_db/serializers/frame.py +13 -13
  331. endoreg_db/serializers/hardware.py +20 -20
  332. endoreg_db/serializers/label.py +22 -22
  333. endoreg_db/serializers/patient.py +10 -10
  334. endoreg_db/serializers/prediction.py +15 -15
  335. endoreg_db/serializers/report_file.py +7 -7
  336. endoreg_db/serializers/video.py +27 -27
  337. endoreg_db/tests.py +3 -3
  338. endoreg_db/utils/cropping.py +28 -28
  339. endoreg_db/utils/dataloader.py +92 -92
  340. endoreg_db/utils/file_operations.py +30 -30
  341. endoreg_db/utils/hashs.py +33 -33
  342. endoreg_db/utils/legacy_ocr.py +201 -201
  343. endoreg_db/utils/ocr.py +197 -197
  344. endoreg_db/utils/uuid.py +4 -4
  345. endoreg_db/utils/video_metadata.py +87 -87
  346. endoreg_db/views.py +3 -3
  347. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/LICENSE +674 -674
  348. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/METADATA +3 -1
  349. endoreg_db-0.3.8.dist-info/RECORD +367 -0
  350. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/WHEEL +1 -1
  351. endoreg_db-0.3.6.dist-info/RECORD +0 -357
@@ -1,7 +1,7 @@
1
- from .video import (
2
- Video,
3
- LegacyVideo,
4
- )
5
- from ..metadata import (
6
- VideoImportMeta,
1
+ from .video import (
2
+ Video,
3
+ LegacyVideo,
4
+ )
5
+ from ..metadata import (
6
+ VideoImportMeta,
7
7
  )
@@ -1,25 +1,25 @@
1
- # from django.db import models
2
-
3
- # class VideoImportMeta(models.Model):
4
- # processor = models.ForeignKey('EndoscopyProcessor', on_delete=models.CASCADE)
5
- # endoscope = models.ForeignKey('Endoscope', on_delete=models.CASCADE, blank=True, null=True)
6
- # center = models.ForeignKey('Center', on_delete=models.CASCADE)
7
- # video_anonymized = models.BooleanField(default=False)
8
- # video_patient_data_detected = models.BooleanField(default=False)
9
- # outside_detected = models.BooleanField(default=False)
10
- # patient_data_removed = models.BooleanField(default=False)
11
- # outside_removed = models.BooleanField(default=False)
12
-
13
- # def __str__(self):
14
- # result_html = ""
15
-
16
- # result_html += f"Processor: {self.processor.name}<br>"
17
- # result_html += f"Endoscope: {self.endoscope.name}<br>"
18
- # result_html += f"Center: {self.center.name}<br>"
19
- # result_html += f"Video anonymized: {self.video_anonymized}<br>"
20
- # result_html += f"Video patient data detected: {self.video_patient_data_detected}<br>"
21
- # result_html += f"Outside detected: {self.outside_detected}<br>"
22
- # result_html += f"Patient data removed: {self.patient_data_removed}<br>"
23
- # result_html += f"Outside removed: {self.outside_removed}<br>"
24
- # return result_html
25
-
1
+ # from django.db import models
2
+
3
+ # class VideoImportMeta(models.Model):
4
+ # processor = models.ForeignKey('EndoscopyProcessor', on_delete=models.CASCADE)
5
+ # endoscope = models.ForeignKey('Endoscope', on_delete=models.CASCADE, blank=True, null=True)
6
+ # center = models.ForeignKey('Center', on_delete=models.CASCADE)
7
+ # video_anonymized = models.BooleanField(default=False)
8
+ # video_patient_data_detected = models.BooleanField(default=False)
9
+ # outside_detected = models.BooleanField(default=False)
10
+ # patient_data_removed = models.BooleanField(default=False)
11
+ # outside_removed = models.BooleanField(default=False)
12
+
13
+ # def __str__(self):
14
+ # result_html = ""
15
+
16
+ # result_html += f"Processor: {self.processor.name}<br>"
17
+ # result_html += f"Endoscope: {self.endoscope.name}<br>"
18
+ # result_html += f"Center: {self.center.name}<br>"
19
+ # result_html += f"Video anonymized: {self.video_anonymized}<br>"
20
+ # result_html += f"Video patient data detected: {self.video_patient_data_detected}<br>"
21
+ # result_html += f"Outside detected: {self.outside_detected}<br>"
22
+ # result_html += f"Patient data removed: {self.patient_data_removed}<br>"
23
+ # result_html += f"Outside removed: {self.outside_removed}<br>"
24
+ # return result_html
25
+
@@ -1,25 +1,25 @@
1
- from ..base_classes import AbstractVideo
2
- from django.db import models
3
-
4
- from endoreg_db.models.data_file.frame import Frame
5
- from endoreg_db.models.data_file.frame import LegacyFrame
6
-
7
- BATCH_SIZE = 1000
8
-
9
- class Video(AbstractVideo):
10
- import_meta = models.OneToOneField('VideoImportMeta', on_delete=models.CASCADE, blank=True, null=True)
11
- def get_video_model(self):
12
- return Video
13
-
14
- def get_frame_model(self):
15
- return Frame
16
-
17
-
18
- class LegacyVideo(AbstractVideo):
19
- file = models.FileField(upload_to="legacy_videos", blank=True, null=True)
20
-
21
- def get_video_model(self):
22
- return LegacyVideo
23
-
24
- def get_frame_model(self):
25
- return LegacyFrame
1
+ from ..base_classes import AbstractVideo
2
+ from django.db import models
3
+
4
+ from endoreg_db.models.data_file.frame import Frame
5
+ from endoreg_db.models.data_file.frame import LegacyFrame
6
+
7
+ BATCH_SIZE = 1000
8
+
9
+ class Video(AbstractVideo):
10
+ import_meta = models.OneToOneField('VideoImportMeta', on_delete=models.CASCADE, blank=True, null=True)
11
+ def get_video_model(self):
12
+ return Video
13
+
14
+ def get_frame_model(self):
15
+ return Frame
16
+
17
+
18
+ class LegacyVideo(AbstractVideo):
19
+ file = models.FileField(upload_to="legacy_videos", blank=True, null=True)
20
+
21
+ def get_video_model(self):
22
+ return LegacyVideo
23
+
24
+ def get_frame_model(self):
25
+ return LegacyFrame
@@ -1,107 +1,107 @@
1
- from django.db import models
2
- import numpy as np
3
- from ..annotation import ImageClassificationAnnotation
4
-
5
- def find_segments_in_prediction_array(prediction_array: np.array, min_frame_len: int):
6
- """
7
- Expects a prediction array of shape (num_frames) and a minimum frame length.
8
- Returns a list of tuples (start_frame_number, end_frame_number) that represent the segments.
9
- """
10
- # Add False to the beginning and end to detect changes at the array boundaries
11
- padded_prediction = np.pad(prediction_array, (1, 1), 'constant', constant_values=False)
12
-
13
- # Find the start points and end points of the segments
14
- diffs = np.diff(padded_prediction.astype(int))
15
- segment_starts = np.where(diffs == 1)[0]
16
- segment_ends = np.where(diffs == -1)[0]
17
-
18
- # Filter segments based on min_frame_len
19
- segments = [(start, end) for start, end in zip(segment_starts, segment_ends) if end - start >= min_frame_len]
20
-
21
- return segments
22
-
23
- class AbstractLabelVideoSegment(models.Model):
24
- video = None # Placeholder for the video field, to be defined in derived classes
25
- prediction_meta = None # Placeholder for the prediction_meta field, to be defined in derived classes
26
- start_frame_number = models.IntegerField()
27
- end_frame_number = models.IntegerField()
28
- source = models.ForeignKey("InformationSource", on_delete=models.CASCADE)
29
- label = models.ForeignKey("Label", on_delete=models.CASCADE)
30
-
31
- class Meta:
32
- abstract = True
33
-
34
- def __str__(self):
35
- return self.video.file.path + " Label - " + self.label.name + " - " + str(self.start_frame_number) + " - " + str(self.end_frame_number)
36
-
37
- def get_frames(self):
38
- return self.video.get_frame_range(self.start_frame_number, self.end_frame_number)
39
-
40
- def get_annotations(self) -> ImageClassificationAnnotation.objects:
41
- frames = self.get_frames()
42
- annotations = ImageClassificationAnnotation.objects.filter(frame__in=frames, label=self.label)
43
-
44
- return annotations
45
-
46
- def get_frames_without_annotation(self):
47
- """
48
- Get a frame without an annotation.
49
- """
50
- assert 1 == 2, "This method should be overridden in derived classes"
51
-
52
- def get_segment_len_in_s(self):
53
- return (self.end_frame_number - self.start_frame_number) / self.video.fps
54
-
55
- class LegacyLabelVideoSegment(AbstractLabelVideoSegment):
56
- video = models.ForeignKey("LegacyVideo", on_delete=models.CASCADE)
57
- prediction_meta = models.ForeignKey("LegacyVideoPredictionMeta", on_delete=models.CASCADE, related_name="video_segments")
58
-
59
- def get_video_model(self):
60
- from endoreg_db.models.data_file.video import LegacyVideo
61
- return LegacyVideo
62
-
63
- def get_annotations(self) -> ImageClassificationAnnotation.objects:
64
- frames = self.get_frames()
65
- annotations = ImageClassificationAnnotation.objects.filter(legacy_frame__in=frames, label=self.label)
66
-
67
- return annotations
68
-
69
- def get_frames_without_annotation(self, n_frames):
70
- """
71
- Get a frame without an annotation.
72
- """
73
- frames = self.get_frames()
74
- annotations = ImageClassificationAnnotation.objects.filter(legacy_frame__in=frames, label=self.label)
75
-
76
- annotated_frames = [annotation.legacy_frame for annotation in annotations]
77
- frames_without_annotation = [frame for frame in frames if frame not in annotated_frames]
78
-
79
- # draw n random frames
80
- if len(frames_without_annotation) > n_frames:
81
- frames_without_annotation = np.random.choice(frames_without_annotation, n_frames, replace=False)
82
-
83
- return frames_without_annotation
84
-
85
- class LabelVideoSegment(AbstractLabelVideoSegment):
86
- video = models.ForeignKey("Video", on_delete=models.CASCADE)
87
- prediction_meta = models.ForeignKey("VideoPredictionMeta", on_delete=models.CASCADE, related_name="video_segments")
88
-
89
- def get_video_model(self):
90
- from endoreg_db.models.data_file.video import Video
91
- return Video
92
-
93
- def get_frames_without_annotation(self, n_frames):
94
- """
95
- Get a frame without an annotation.
96
- """
97
- frames = self.get_frames()
98
- annotations = ImageClassificationAnnotation.objects.filter(frame__in=frames, label=self.label)
99
-
100
- annotated_frames = [annotation.frame for annotation in annotations]
101
- frames_without_annotation = [frame for frame in frames if frame not in annotated_frames]
102
-
103
- # draw n random frames
104
- if len(frames_without_annotation) > n_frames:
105
- frames_without_annotation = np.random.choice(frames_without_annotation, n_frames, replace=False)
106
-
107
- return frames_without_annotation
1
+ from django.db import models
2
+ import numpy as np
3
+ from ..annotation import ImageClassificationAnnotation
4
+
5
+ def find_segments_in_prediction_array(prediction_array: np.array, min_frame_len: int):
6
+ """
7
+ Expects a prediction array of shape (num_frames) and a minimum frame length.
8
+ Returns a list of tuples (start_frame_number, end_frame_number) that represent the segments.
9
+ """
10
+ # Add False to the beginning and end to detect changes at the array boundaries
11
+ padded_prediction = np.pad(prediction_array, (1, 1), 'constant', constant_values=False)
12
+
13
+ # Find the start points and end points of the segments
14
+ diffs = np.diff(padded_prediction.astype(int))
15
+ segment_starts = np.where(diffs == 1)[0]
16
+ segment_ends = np.where(diffs == -1)[0]
17
+
18
+ # Filter segments based on min_frame_len
19
+ segments = [(start, end) for start, end in zip(segment_starts, segment_ends) if end - start >= min_frame_len]
20
+
21
+ return segments
22
+
23
+ class AbstractLabelVideoSegment(models.Model):
24
+ video = None # Placeholder for the video field, to be defined in derived classes
25
+ prediction_meta = None # Placeholder for the prediction_meta field, to be defined in derived classes
26
+ start_frame_number = models.IntegerField()
27
+ end_frame_number = models.IntegerField()
28
+ source = models.ForeignKey("InformationSource", on_delete=models.CASCADE)
29
+ label = models.ForeignKey("Label", on_delete=models.CASCADE)
30
+
31
+ class Meta:
32
+ abstract = True
33
+
34
+ def __str__(self):
35
+ return self.video.file.path + " Label - " + self.label.name + " - " + str(self.start_frame_number) + " - " + str(self.end_frame_number)
36
+
37
+ def get_frames(self):
38
+ return self.video.get_frame_range(self.start_frame_number, self.end_frame_number)
39
+
40
+ def get_annotations(self) -> ImageClassificationAnnotation.objects:
41
+ frames = self.get_frames()
42
+ annotations = ImageClassificationAnnotation.objects.filter(frame__in=frames, label=self.label)
43
+
44
+ return annotations
45
+
46
+ def get_frames_without_annotation(self):
47
+ """
48
+ Get a frame without an annotation.
49
+ """
50
+ assert 1 == 2, "This method should be overridden in derived classes"
51
+
52
+ def get_segment_len_in_s(self):
53
+ return (self.end_frame_number - self.start_frame_number) / self.video.fps
54
+
55
+ class LegacyLabelVideoSegment(AbstractLabelVideoSegment):
56
+ video = models.ForeignKey("LegacyVideo", on_delete=models.CASCADE)
57
+ prediction_meta = models.ForeignKey("LegacyVideoPredictionMeta", on_delete=models.CASCADE, related_name="video_segments")
58
+
59
+ def get_video_model(self):
60
+ from endoreg_db.models.data_file.video import LegacyVideo
61
+ return LegacyVideo
62
+
63
+ def get_annotations(self) -> ImageClassificationAnnotation.objects:
64
+ frames = self.get_frames()
65
+ annotations = ImageClassificationAnnotation.objects.filter(legacy_frame__in=frames, label=self.label)
66
+
67
+ return annotations
68
+
69
+ def get_frames_without_annotation(self, n_frames):
70
+ """
71
+ Get a frame without an annotation.
72
+ """
73
+ frames = self.get_frames()
74
+ annotations = ImageClassificationAnnotation.objects.filter(legacy_frame__in=frames, label=self.label)
75
+
76
+ annotated_frames = [annotation.legacy_frame for annotation in annotations]
77
+ frames_without_annotation = [frame for frame in frames if frame not in annotated_frames]
78
+
79
+ # draw n random frames
80
+ if len(frames_without_annotation) > n_frames:
81
+ frames_without_annotation = np.random.choice(frames_without_annotation, n_frames, replace=False)
82
+
83
+ return frames_without_annotation
84
+
85
+ class LabelVideoSegment(AbstractLabelVideoSegment):
86
+ video = models.ForeignKey("Video", on_delete=models.CASCADE)
87
+ prediction_meta = models.ForeignKey("VideoPredictionMeta", on_delete=models.CASCADE, related_name="video_segments")
88
+
89
+ def get_video_model(self):
90
+ from endoreg_db.models.data_file.video import Video
91
+ return Video
92
+
93
+ def get_frames_without_annotation(self, n_frames):
94
+ """
95
+ Get a frame without an annotation.
96
+ """
97
+ frames = self.get_frames()
98
+ annotations = ImageClassificationAnnotation.objects.filter(frame__in=frames, label=self.label)
99
+
100
+ annotated_frames = [annotation.frame for annotation in annotations]
101
+ frames_without_annotation = [frame for frame in frames if frame not in annotated_frames]
102
+
103
+ # draw n random frames
104
+ if len(frames_without_annotation) > n_frames:
105
+ frames_without_annotation = np.random.choice(frames_without_annotation, n_frames, replace=False)
106
+
107
+ return frames_without_annotation
@@ -1,56 +1,56 @@
1
- from django.db import models
2
-
3
- class DiseaseManager(models.Manager):
4
- def get_by_natural_key(self, name):
5
- return self.get(name=name)
6
-
7
- class Disease(models.Model):
8
- name = models.CharField(max_length=255, unique=True)
9
- name_de = models.CharField(max_length=255, blank=True, null=True)
10
- name_en = models.CharField(max_length=255, blank=True, null=True)
11
-
12
- objects = DiseaseManager()
13
-
14
- def natural_key(self):
15
- return (self.name,)
16
-
17
- def __str__(self):
18
- return self.name
19
-
20
- class DiseaseClassificationManager(models.Manager):
21
- def get_by_natural_key(self, name):
22
- return self.get(name=name)
23
-
24
- class DiseaseClassification(models.Model):
25
- name = models.CharField(max_length=255, unique=True)
26
- name_de = models.CharField(max_length=255, blank=True, null=True)
27
- name_en = models.CharField(max_length=255, blank=True, null=True)
28
-
29
- disease = models.ForeignKey(Disease, on_delete=models.CASCADE)
30
-
31
- objects = DiseaseClassificationManager()
32
-
33
- def natural_key(self):
34
- return (self.name,)
35
-
36
- def __str__(self):
37
- return self.name
38
-
39
- class DiseaseClassificationChoiceManager(models.Manager):
40
- def get_by_natural_key(self, name):
41
- return self.get(name=name)
42
-
43
- class DiseaseClassificationChoice(models.Model):
44
- name = models.CharField(max_length=255, unique=True)
45
- name_de = models.CharField(max_length=255, blank=True, null=True)
46
- name_en = models.CharField(max_length=255, blank=True, null=True)
47
-
48
- disease_classification = models.ForeignKey(DiseaseClassification, on_delete=models.CASCADE)
49
-
50
- objects = DiseaseClassificationChoiceManager()
51
-
52
- def natural_key(self):
53
- return (self.name,)
54
-
55
- def __str__(self):
1
+ from django.db import models
2
+
3
+ class DiseaseManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class Disease(models.Model):
8
+ name = models.CharField(max_length=255, unique=True)
9
+ name_de = models.CharField(max_length=255, blank=True, null=True)
10
+ name_en = models.CharField(max_length=255, blank=True, null=True)
11
+
12
+ objects = DiseaseManager()
13
+
14
+ def natural_key(self):
15
+ return (self.name,)
16
+
17
+ def __str__(self):
18
+ return self.name
19
+
20
+ class DiseaseClassificationManager(models.Manager):
21
+ def get_by_natural_key(self, name):
22
+ return self.get(name=name)
23
+
24
+ class DiseaseClassification(models.Model):
25
+ name = models.CharField(max_length=255, unique=True)
26
+ name_de = models.CharField(max_length=255, blank=True, null=True)
27
+ name_en = models.CharField(max_length=255, blank=True, null=True)
28
+
29
+ disease = models.ForeignKey(Disease, on_delete=models.CASCADE)
30
+
31
+ objects = DiseaseClassificationManager()
32
+
33
+ def natural_key(self):
34
+ return (self.name,)
35
+
36
+ def __str__(self):
37
+ return self.name
38
+
39
+ class DiseaseClassificationChoiceManager(models.Manager):
40
+ def get_by_natural_key(self, name):
41
+ return self.get(name=name)
42
+
43
+ class DiseaseClassificationChoice(models.Model):
44
+ name = models.CharField(max_length=255, unique=True)
45
+ name_de = models.CharField(max_length=255, blank=True, null=True)
46
+ name_en = models.CharField(max_length=255, blank=True, null=True)
47
+
48
+ disease_classification = models.ForeignKey(DiseaseClassification, on_delete=models.CASCADE)
49
+
50
+ objects = DiseaseClassificationChoiceManager()
51
+
52
+ def natural_key(self):
53
+ return (self.name,)
54
+
55
+ def __str__(self):
56
56
  return self.name
@@ -1,20 +1,20 @@
1
- from django.db import models
2
-
3
- class EmissionFactorManager(models.Manager):
4
- def get_by_natural_key(self, name):
5
- return self.get(name=name)
6
-
7
- class EmissionFactor(models.Model):
8
- objects = EmissionFactorManager()
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
- unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
14
- value = models.FloatField()
15
-
16
- def natural_key(self):
17
- return (self.name,)
18
-
19
- def __str__(self):
1
+ from django.db import models
2
+
3
+ class EmissionFactorManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class EmissionFactor(models.Model):
8
+ objects = EmissionFactorManager()
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
+ unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
14
+ value = models.FloatField()
15
+
16
+ def natural_key(self):
17
+ return (self.name,)
18
+
19
+ def __str__(self):
20
20
  return self.name
@@ -1,22 +1,22 @@
1
- from django.db import models
2
-
3
- class Event(models.Model):
4
- """
5
- A class representing an event.
6
-
7
- Attributes:
8
- name (str): The name of the event.
9
- name_de (str): The German name of the event.
10
- name_en (str): The English name of the event.
11
- description (str): A description of the event.
12
- """
13
- name = models.CharField(max_length=100, unique=True)
14
- name_de = models.CharField(max_length=100, blank=True, null=True)
15
- name_en = models.CharField(max_length=100, blank=True, null=True)
16
- description = models.TextField(blank=True, null=True)
17
-
18
- def natural_key(self):
19
- return (self.name,)
20
-
21
- def __str__(self):
1
+ from django.db import models
2
+
3
+ class Event(models.Model):
4
+ """
5
+ A class representing an event.
6
+
7
+ Attributes:
8
+ name (str): The name of the event.
9
+ name_de (str): The German name of the event.
10
+ name_en (str): The English name of the event.
11
+ description (str): A description of the event.
12
+ """
13
+ name = models.CharField(max_length=100, unique=True)
14
+ name_de = models.CharField(max_length=100, blank=True, null=True)
15
+ name_en = models.CharField(max_length=100, blank=True, null=True)
16
+ description = models.TextField(blank=True, null=True)
17
+
18
+ def natural_key(self):
19
+ return (self.name,)
20
+
21
+ def __str__(self):
22
22
  return self.name
@@ -1,4 +1,4 @@
1
- from .examination import Examination
2
- from .examination_type import ExaminationType
3
- from .examination_time import ExaminationTime
1
+ from .examination import Examination
2
+ from .examination_type import ExaminationType
3
+ from .examination_time import ExaminationTime
4
4
  from .examination_time_type import ExaminationTimeType
@@ -1,26 +1,26 @@
1
- from django.db import models
2
-
3
- class ExaminationManager(models.Manager):
4
- def get_by_natural_key(self, name):
5
- return self.get(name=name)
6
-
7
- class Examination(models.Model):
8
- name = models.CharField(max_length=100, unique=True)
9
- name_de = models.CharField(max_length=100, blank=True, null=True)
10
- name_en = models.CharField(max_length=100, blank=True, null=True)
11
- examination_types = models.ManyToManyField('ExaminationType', blank=True)
12
- objects = ExaminationManager()
13
- date = models.DateField(blank=True, null=True)
14
- time = models.TimeField(blank=True, null=True)
15
-
16
- def __str__(self):
17
- return self.name
18
-
19
- def natural_key(self):
20
- return (self.name,)
21
-
22
- class Meta:
23
- verbose_name = 'Examination'
24
- verbose_name_plural = 'Examinations'
25
- ordering = ['name']
26
-
1
+ from django.db import models
2
+
3
+ class ExaminationManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class Examination(models.Model):
8
+ name = models.CharField(max_length=100, unique=True)
9
+ name_de = models.CharField(max_length=100, blank=True, null=True)
10
+ name_en = models.CharField(max_length=100, blank=True, null=True)
11
+ examination_types = models.ManyToManyField('ExaminationType', blank=True)
12
+ objects = ExaminationManager()
13
+ date = models.DateField(blank=True, null=True)
14
+ time = models.TimeField(blank=True, null=True)
15
+
16
+ def __str__(self):
17
+ return self.name
18
+
19
+ def natural_key(self):
20
+ return (self.name,)
21
+
22
+ class Meta:
23
+ verbose_name = 'Examination'
24
+ verbose_name_plural = 'Examinations'
25
+ ordering = ['name']
26
+
@@ -1,27 +1,27 @@
1
- from django.db import models
2
- from rest_framework import serializers
3
-
4
- class ExaminationTimeManager(models.Manager):
5
- def get_by_natural_key(self, name):
6
- return self.get(name=name)
7
-
8
- class ExaminationTime(models.Model):
9
- name = models.CharField(max_length=100, unique=True)
10
- name_de = models.CharField(max_length=100, blank=True, null=True)
11
- name_en = models.CharField(max_length=100, blank=True, null=True)
12
- start_time = models.TimeField(blank=True, null=True)
13
- time_types = models.ManyToManyField('ExaminationTimeType', blank=True)
14
- end_time = models.TimeField(blank=True, null=True)
15
- objects = ExaminationTimeManager()
16
-
17
- def __str__(self):
18
- return self.name
19
-
20
- def natural_key(self):
21
- return (self.name,)
22
-
23
- class Meta:
24
- verbose_name = 'Examination Time'
25
- verbose_name_plural = 'Examination Times'
26
- ordering = ['name']
27
-
1
+ from django.db import models
2
+ from rest_framework import serializers
3
+
4
+ class ExaminationTimeManager(models.Manager):
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+ class ExaminationTime(models.Model):
9
+ name = models.CharField(max_length=100, unique=True)
10
+ name_de = models.CharField(max_length=100, blank=True, null=True)
11
+ name_en = models.CharField(max_length=100, blank=True, null=True)
12
+ start_time = models.TimeField(blank=True, null=True)
13
+ time_types = models.ManyToManyField('ExaminationTimeType', blank=True)
14
+ end_time = models.TimeField(blank=True, null=True)
15
+ objects = ExaminationTimeManager()
16
+
17
+ def __str__(self):
18
+ return self.name
19
+
20
+ def natural_key(self):
21
+ return (self.name,)
22
+
23
+ class Meta:
24
+ verbose_name = 'Examination Time'
25
+ verbose_name_plural = 'Examination Times'
26
+ ordering = ['name']
27
+