endoreg-db 0.3.1__py3-none-any.whl → 0.3.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. endoreg_db/data/__init__.py +3 -1
  2. endoreg_db/data/center/data.yaml +45 -0
  3. endoreg_db/data/pdf_type/data.yaml +28 -0
  4. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -0
  5. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -0
  6. endoreg_db/management/commands/load_base_db_data.py +12 -3
  7. endoreg_db/management/commands/load_center_data.py +3 -3
  8. endoreg_db/management/commands/load_pdf_type_data.py +61 -0
  9. endoreg_db/management/commands/load_report_reader_flag.py +46 -0
  10. endoreg_db/management/commands/reset_celery_schedule.py +9 -0
  11. endoreg_db/migrations/0013_rawpdffile.py +31 -0
  12. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -0
  13. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -0
  14. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -0
  15. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -0
  16. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -0
  17. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -0
  18. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -0
  19. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -0
  20. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -0
  21. endoreg_db/models/__init__.py +2 -0
  22. endoreg_db/models/center.py +6 -0
  23. endoreg_db/models/data_file/__init__.py +2 -3
  24. endoreg_db/models/data_file/import_classes/__init__.py +1 -0
  25. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +35 -0
  26. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -0
  27. endoreg_db/models/data_file/import_classes/{processing_functions.py → processing_functions/video.py} +6 -7
  28. endoreg_db/models/data_file/import_classes/raw_pdf.py +185 -0
  29. endoreg_db/models/data_file/import_classes/raw_video.py +7 -5
  30. endoreg_db/models/data_file/metadata/__init__.py +2 -132
  31. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -0
  32. endoreg_db/models/data_file/metadata/sensitive_meta.py +19 -1
  33. endoreg_db/models/data_file/metadata/video_meta.py +132 -0
  34. endoreg_db/models/data_file/report_file.py +1 -0
  35. endoreg_db/models/persons/__init__.py +3 -1
  36. endoreg_db/models/persons/first_name.py +18 -0
  37. endoreg_db/models/persons/last_name.py +20 -0
  38. endoreg_db/models/report_reader/__init__.py +2 -0
  39. endoreg_db/models/report_reader/report_reader_config.py +53 -0
  40. endoreg_db/models/report_reader/report_reader_flag.py +20 -0
  41. endoreg_db/utils/dataloader.py +172 -56
  42. endoreg_db/utils/hashs.py +18 -0
  43. {endoreg_db-0.3.1.dist-info → endoreg_db-0.3.2.dist-info}/METADATA +2 -1
  44. {endoreg_db-0.3.1.dist-info → endoreg_db-0.3.2.dist-info}/RECORD +46 -20
  45. {endoreg_db-0.3.1.dist-info → endoreg_db-0.3.2.dist-info}/LICENSE +0 -0
  46. {endoreg_db-0.3.1.dist-info → endoreg_db-0.3.2.dist-info}/WHEEL +0 -0
@@ -16,6 +16,7 @@ class ReportFile(models.Model):
16
16
  time = models.TimeField(blank=True, null=True)
17
17
 
18
18
  def get_pdf_hash(self):
19
+ #FIXME should use endoreg_db.utils.get_pdf_hash in future
19
20
  pdf = self.pdf
20
21
  pdf_hash = None
21
22
 
@@ -1,4 +1,6 @@
1
1
  from .person import Person
2
2
  from .patient import Patient, PatientForm
3
3
  from .examiner import Examiner, ExaminerSerializer
4
- from .portal_user_information import PortalUserInfo, Profession
4
+ from .portal_user_information import PortalUserInfo, Profession
5
+ from .first_name import FirstName
6
+ from .last_name import LastName
@@ -0,0 +1,18 @@
1
+ # class to represent unique first-names
2
+ # name attribute is natural key
3
+
4
+ from django.db import models
5
+
6
+ class FirstNameManager(models.Manager):
7
+ def get_by_natural_key(self, name):
8
+ return self.get(name=name)
9
+
10
+ class FirstName(models.Model):
11
+ objects = FirstNameManager()
12
+ name = models.CharField(max_length=255, unique=True)
13
+
14
+ def natural_key(self):
15
+ return (self.name,)
16
+
17
+ def __str__(self):
18
+ return self.name
@@ -0,0 +1,20 @@
1
+ # class to represent unique last_names
2
+ # name attribute is natural key
3
+ from django.db import models
4
+
5
+ class LastNameManager(models.Manager):
6
+ def get_by_natural_key(self, name):
7
+ return self.get(name=name)
8
+
9
+ class LastName(models.Model):
10
+ objects = LastNameManager()
11
+ name = models.CharField(max_length=255, unique=True)
12
+
13
+ def natural_key(self):
14
+ return (self.name,)
15
+
16
+ def __str__(self):
17
+ return self.name
18
+
19
+ # Path: endoreg_db/models/persons/first_name.py
20
+
@@ -0,0 +1,2 @@
1
+ from .report_reader_config import ReportReaderConfig
2
+ from .report_reader_flag import ReportReaderFlag
@@ -0,0 +1,53 @@
1
+ # ReportReaderConfig Class
2
+ # Description: This class is used to store the configuration of the ReportReader
3
+
4
+ # PATIENT_INFO_LINE_FLAG = "Patient: "
5
+ # ENDOSCOPE_INFO_LINE_FLAG = "Gerät: "
6
+ # EXAMINER_INFO_LINE_FLAG = "1. Unters.:"
7
+ # CUT_OFF_BELOW_LINE_FLAG = "________________"
8
+
9
+
10
+ # CUT_OFF_ABOVE_LINE_FLAGS = [
11
+ # ENDOSCOPE_INFO_LINE_FLAG,
12
+ # EXAMINER_INFO_LINE_FLAG,
13
+ # ]
14
+
15
+ # CUT_OFF_BELOW_LINE_FLAGS = [
16
+ # CUT_OFF_BELOW_LINE_FLAG
17
+ # ]
18
+
19
+ from django.db import models
20
+ from .report_reader_flag import ReportReaderFlag
21
+ from ..center import Center
22
+ from ..data_file import PdfType
23
+
24
+ class ReportReaderConfig(models.Model):
25
+
26
+ locale = models.CharField(default="de_DE", max_length=10)
27
+ first_names = models.ManyToManyField('FirstName', related_name='report_reader_configs')
28
+ last_names = models.ManyToManyField('LastName', related_name='report_reader_configs')
29
+ text_date_format = models.CharField(default = "%d.%m.%Y", max_length=10)
30
+ patient_info_line_flag = models.ForeignKey(ReportReaderFlag, related_name='report_reader_configs_patient_info_line', on_delete=models.CASCADE)
31
+ endoscope_info_line_flag = models.ForeignKey(ReportReaderFlag, related_name='report_reader_configs_endoscope_info_line', on_delete=models.CASCADE)
32
+ examiner_info_line_flag = models.ForeignKey(ReportReaderFlag, related_name='report_reader_configs_examiner_info_line', on_delete=models.CASCADE)
33
+ cut_off_below = models.ManyToManyField(ReportReaderFlag, related_name='report_reader_configs_cut_off_below')
34
+ cut_off_above = models.ManyToManyField(ReportReaderFlag, related_name='report_reader_configs_cut_off_above')
35
+
36
+ def __str__(self):
37
+ return self.locale
38
+
39
+ def update_names_by_center(self, center:Center, save = True):
40
+ self.first_names.set(center.first_names.all())
41
+ self.last_names.set(center.last_names.all())
42
+ if save:
43
+ self.save()
44
+
45
+ def update_flags_by_pdf_type(self, pdf_type:PdfType, save = True):
46
+ self.patient_info_line_flag = pdf_type.patient_info_line_flag
47
+ self.endoscope_info_line_flag = pdf_type.endoscope_info_line_flag
48
+ self.examiner_info_line_flag = pdf_type.examiner_info_line_flag
49
+ self.cut_off_below.set(pdf_type.cut_off_below.all())
50
+ self.cut_off_above.set(pdf_type.cut_off_above.all())
51
+ if save:
52
+ self.save()
53
+
@@ -0,0 +1,20 @@
1
+ # Django model for the report reader flag
2
+ # have name and value
3
+ # name is natural key
4
+
5
+ from django.db import models
6
+
7
+ class ReportReaderFlagManager(models.Manager):
8
+ def get_by_natural_key(self, name):
9
+ return self.get(name=name)
10
+
11
+ class ReportReaderFlag(models.Model):
12
+ objects = ReportReaderFlagManager()
13
+ name = models.CharField(max_length=255, unique=True)
14
+ value = models.CharField(max_length=255)
15
+
16
+ def natural_key(self):
17
+ return (self.name,)
18
+
19
+ def __str__(self):
20
+ return self.name
@@ -1,69 +1,185 @@
1
1
  import os
2
2
  import yaml
3
+ from django.core.exceptions import ObjectDoesNotExist
3
4
 
4
- def load_model_data_from_yaml(
5
- command,
6
- model_name,
7
- metadata,
8
- verbose,
9
- ):
10
-
5
+ def load_model_data_from_yaml(command, model_name, metadata, verbose):
6
+ """
7
+ Load model data from YAML files.
8
+
9
+ Args:
10
+ command: Command object for stdout writing.
11
+ model_name: Name of the model being loaded.
12
+ metadata: Metadata including directory and foreign key information.
13
+ verbose: Boolean indicating whether to print verbose output.
14
+ """
11
15
  if verbose:
12
- command.stdout.write(f"Start Loading {model_name}")
16
+ command.stdout.write(f"Start loading {model_name}")
13
17
  model = metadata["model"]
14
- dir = metadata["dir"]
18
+ dir_path = metadata["dir"]
15
19
  foreign_keys = metadata["foreign_keys"]
16
20
  foreign_key_models = metadata["foreign_key_models"]
17
21
 
18
- for file in [f for f in os.listdir(dir) if f.endswith('.yaml')]:
19
- with open(os.path.join(dir, file), 'r') as f:
20
- yaml_data = yaml.safe_load(f)
22
+ for file in [f for f in os.listdir(dir_path) if f.endswith('.yaml')]:
23
+ with open(os.path.join(dir_path, file), 'r') as file:
24
+ yaml_data = yaml.safe_load(file)
21
25
 
22
- load_data_with_foreign_keys(
23
- command,
24
- model,
25
- yaml_data,
26
- foreign_keys,
27
- foreign_key_models,
28
- verbose
29
- )
26
+ load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose)
30
27
 
31
28
  def load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose):
32
- # Since pathology types is a ManyToMany field, we need to hack arount
33
- for entry in yaml_data:
34
- fields = entry.get('fields', {})
35
- name = fields.pop('name', None)
36
- many_to_many_tuples = []
37
- foreign_key_tuples = zip(foreign_keys, foreign_key_models)
38
- for foreign_key, foreign_key_model in foreign_key_tuples:
39
- target_natural_key = fields.pop(foreign_key, None)
29
+ """
30
+ Load data handling foreign keys and many-to-many relationships.
31
+
32
+ Args:
33
+ command: Command object for stdout writing.
34
+ model: The Django model for the data.
35
+ yaml_data: Data loaded from YAML.
36
+ foreign_keys: List of foreign keys.
37
+ foreign_key_models: Corresponding models for the foreign keys.
38
+ verbose: Boolean indicating whether to print verbose output.
39
+ """
40
+ for entry in yaml_data:
41
+ fields = entry.get('fields', {})
42
+ name = fields.pop('name', None)
43
+ m2m_relationships = {} # Store many-to-many relationships
44
+
45
+ # Handle foreign keys and many-to-many relationships
46
+ for fk_field, fk_model in zip(foreign_keys, foreign_key_models):
47
+ target_keys = fields.pop(fk_field, None)
48
+
49
+ # Ensure the foreign key exists
50
+ if target_keys is None:
51
+ if verbose:
52
+ command.stdout.write(command.style.WARNING(f"Foreign key {fk_field} not found in fields"))
53
+ continue # Skip if no foreign key provided
54
+
55
+ # Process many-to-many fields or foreign keys
56
+ if isinstance(target_keys, list): # Assume many-to-many relationship
57
+ related_objects = []
58
+ for key in target_keys:
59
+ obj, created = fk_model.objects.get_or_create(name=key)
60
+ if created and verbose:
61
+ command.stdout.write(command.style.SUCCESS(f"Created {fk_model.__name__} {key}"))
62
+ related_objects.append(obj)
63
+ m2m_relationships[fk_field] = related_objects
64
+ else: # Single foreign key relationship
65
+ try:
66
+ obj = fk_model.objects.get_by_natural_key(target_keys)
67
+ except ObjectDoesNotExist:
68
+ if verbose:
69
+ command.stdout.write(command.style.WARNING(f"{fk_model.__name__} with key {target_keys} not found"))
70
+ continue
71
+ fields[fk_field] = obj
72
+
73
+ # Create or update the main object
74
+ obj, created = model.objects.update_or_create(defaults=fields, name=name)
75
+ if created and verbose:
76
+ command.stdout.write(command.style.SUCCESS(f'Created {model.__name__} {name}'))
77
+ elif verbose:
78
+ command.stdout.write(command.style.WARNING(f'Skipped {model.__name__} {name}, already exists'))
79
+
80
+ # Set many-to-many relationships
81
+ for field_name, related_objs in m2m_relationships.items():
82
+ getattr(obj, field_name).set(related_objs)
83
+
84
+
85
+ # def load_model_data_from_yaml(
86
+ # command,
87
+ # model_name,
88
+ # metadata,
89
+ # verbose,
90
+ # ):
91
+
92
+ # if verbose:
93
+ # command.stdout.write(f"Start Loading {model_name}")
94
+ # model = metadata["model"]
95
+ # dir = metadata["dir"]
96
+ # foreign_keys = metadata["foreign_keys"]
97
+ # foreign_key_models = metadata["foreign_key_models"]
98
+
99
+ # for file in [f for f in os.listdir(dir) if f.endswith('.yaml')]:
100
+ # with open(os.path.join(dir, file), 'r') as f:
101
+ # yaml_data = yaml.safe_load(f)
102
+
103
+ # load_data_with_foreign_keys(
104
+ # command,
105
+ # model,
106
+ # yaml_data,
107
+ # foreign_keys,
108
+ # foreign_key_models,
109
+ # verbose
110
+ # )
111
+
112
+ # def load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose):
113
+ # # Since pathology types is a ManyToMany field, we need to hack arount
114
+ # for entry in yaml_data:
115
+ # fields = entry.get('fields', {})
116
+ # name = fields.pop('name', None)
117
+ # many_to_many_tuples = []
118
+ # foreign_key_tuples = zip(foreign_keys, foreign_key_models)
119
+ # for foreign_key, foreign_key_model in foreign_key_tuples:
120
+ # # target_natural_key = fields.pop(foreign_key, None)
121
+ # # get the target natural key, if it exists, should not alter fields
122
+ # target_natural_key = fields.get(foreign_key, None)
123
+ # assert target_natural_key, f"Foreign Key {foreign_key} not found in fields {fields}"
40
124
 
125
+ # if (foreign_key == "first_names") or (foreign_key == "last_names"):
126
+ # if isinstance(target_natural_key, list):
127
+ # # For first_names and last_names, the field is a Many to Many field
128
+ # # if names dont exist yet, we create them
129
+ # fk_objects = []
130
+ # for __name in target_natural_key:
131
+ # obj, created = foreign_key_model.objects.get_or_create(name=__name)
132
+ # if created:
133
+ # command.stdout.write(command.style.SUCCESS(f'Created {foreign_key_model.__name__} {__name}'))
134
+ # # fk_objects.append(obj)
135
+
136
+ # fk_tuple = (foreign_key, fk_objects)
137
+ # many_to_many_tuples.append(fk_tuple)
138
+ # continue
139
+
140
+ # if isinstance(target_natural_key, list):
141
+ # # the field is a Many to X field.
142
+ # fk_objects = [foreign_key_model.objects.get_by_natural_key(_) for _ in target_natural_key]
143
+ # fk_tuple = (foreign_key, fk_objects)
144
+ # many_to_many_tuples.append(fk_tuple)
145
+ # continue
146
+ # # Use the natural key to look up the related object
147
+ # try:
148
+ # obj = foreign_key_model.objects.get_by_natural_key(target_natural_key)
149
+ # except:
150
+ # # commandline log that the object was not found
151
+ # command.stdout.write(command.style.WARNING(f'Object {foreign_key_model.__name__} {target_natural_key} not found'))
152
+ # # commandline log entry
153
+ # command.stdout.write(command.style.WARNING(_log))
154
+ # # try to create by name if name is available
155
+ # # create defaults dict from fields using the models fields
156
+ # _field_names = [_.name for _ in foreign_key_model._meta.fields]
157
+ # _defaults = {k: v for k, v in fields.items() if (k in _field_names) and v}
158
+
159
+ # if target_natural_key:
160
+ # # commandlie log
161
+ # command.stdout.write(command.style.SUCCESS(f'Creating {foreign_key_model.__name__} {name} with defaults {_defaults}'))
162
+ # obj, created = model.objects.get_or_create(
163
+ # name = target_natural_key,
164
+ # defaults=_defaults
165
+ # )
166
+ # # Assign the related object to the field
167
+ # fields[foreign_key] = obj
168
+
169
+ # if name:
170
+ # try:
171
+ # obj, created = model.objects.get_or_create(name=name, defaults=fields)
172
+ # except:
173
+ # # commandlinelog to print name, fields, target foreign key
174
+ # command.stdout.write(command.style.WARNING(f'Object {model.__name__} {name} not found'))
175
+ # else:
176
+ # obj, created = model.objects.get_or_create(**fields)
177
+ # if many_to_many_tuples:
178
+
179
+ # for fk, fk_objects in many_to_many_tuples:
180
+ # getattr(obj, fk).set(fk_objects)
41
181
 
42
- if isinstance(target_natural_key, list):
43
- # the field is a Many to X field.
44
- fk_objects = [foreign_key_model.objects.get_by_natural_key(_) for _ in target_natural_key]
45
- fk_tuple = (foreign_key, fk_objects)
46
- many_to_many_tuples.append(fk_tuple)
47
- continue
48
- # Use the natural key to look up the related object
49
- try:
50
- obj = foreign_key_model.objects.get_by_natural_key(target_natural_key)
51
- except model.DoesNotExist:
52
- command.stderr.write(command.style.ERROR(f'{model.__name__} with natural key {target_natural_key} does not exist. Skipping {name}.'))
53
- raise Exception(f'{model.__name__} with natural key {target_natural_key} does not exist. Skipping {name}.')
54
-
55
- # Assign the related object to the field
56
- fields[foreign_key] = obj
57
-
58
- if name:
59
- obj, created = model.objects.get_or_create(name=name, defaults=fields)
60
- else:
61
- obj, created = model.objects.get_or_create(**fields)
62
- if many_to_many_tuples:
63
- for fk, fk_objects in many_to_many_tuples:
64
- getattr(obj, fk).set(fk_objects)
65
-
66
- if created and verbose:
67
- command.stdout.write(command.style.SUCCESS(f'Created {model.__name__} {name}'))
68
- elif verbose:
69
- command.stdout.write(command.style.WARNING(f'Skipped {model.__name__} {name}, already exists'))
182
+ # if created and verbose:
183
+ # command.stdout.write(command.style.SUCCESS(f'Created {model.__name__} {name}'))
184
+ # elif verbose:
185
+ # command.stdout.write(command.style.WARNING(f'Skipped {model.__name__} {name}, already exists'))
endoreg_db/utils/hashs.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import hashlib
2
+ from pathlib import Path
2
3
 
3
4
  def get_video_hash(video_path):
4
5
  """
@@ -14,3 +15,20 @@ def get_video_hash(video_path):
14
15
 
15
16
  return video_hash
16
17
 
18
+ def get_pdf_hash(pdf_path:Path):
19
+ """
20
+ Get the hash of a pdf file.
21
+ """
22
+ pdf_hash = None
23
+
24
+ # Open the file in binary mode and read its contents
25
+ with open(pdf_path, 'rb') as f:
26
+ pdf_contents = f.read()
27
+ # Create a hash object using SHA-256 algorithm
28
+
29
+ hash_object = hashlib.sha256(pdf_contents, usedforsecurity=False)
30
+ # Get the hexadecimal representation of the hash
31
+ pdf_hash = hash_object.hexdigest()
32
+ assert len(pdf_hash) <= 255, "Hash length exceeds 255 characters"
33
+
34
+ return pdf_hash
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: endoreg-db
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: EndoReg Db Django App
5
5
  License: GNU3
6
6
  Author: Thomas J. Lux
@@ -9,6 +9,7 @@ Classifier: License :: Other/Proprietary License
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Dist: agl-report-reader (>=0.2.0,<0.3.0)
12
13
  Requires-Dist: django (>=4.2,<4.3)
13
14
  Requires-Dist: django-bootstrap5 (>=23.4,<24.0)
14
15
  Requires-Dist: djangorestframework (>=3.14.0,<4.0.0)
@@ -1,9 +1,9 @@
1
1
  endoreg_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  endoreg_db/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
3
3
  endoreg_db/apps.py,sha256=zYb2_RiEGIsLS6_OMWzCxcTHSNkF28CqF4xcd_6NHUg,151
4
- endoreg_db/data/__init__.py,sha256=ZMRXoDGfInChxzVqxeFjLjFCyIra9CY5qJadEZYYs2c,530
4
+ endoreg_db/data/__init__.py,sha256=as2ifgopSSKbsNWH1JYCZ3R9oqmw8jzU2HMne_qmSlo,634
5
5
  endoreg_db/data/active_model/data.yaml,sha256=G7PvKmGDm_Gt6Tzf99s18b5vlE5qWruvClzlcINqDQE,86
6
- endoreg_db/data/center/data.yaml,sha256=_gnE0ILE-wXB3JoL1G7XYtzgTbUGUr_ddzZBrvCUbBo,191
6
+ endoreg_db/data/center/data.yaml,sha256=laTM5d3LLYSgBSPslEBQYkBHVpxLtiM4R7TcccIaNXA,1067
7
7
  endoreg_db/data/endoscope_type/data.yaml,sha256=k8uF94svJsU02O-ceaLnQBoozJ6cT3iY_s_aKrvJZqg,242
8
8
  endoreg_db/data/endoscopy_processor/data.yaml,sha256=iu02flPMyz0YKjqDWS5KLp8We6DSsHtJcGvJMWvCV-s,1044
9
9
  endoreg_db/data/examination/examinations/data.yaml,sha256=IrUNRLJjKBfiZLCvkYpY7JYsntaN1KAEu9hEi7k7yhk,330
@@ -15,7 +15,10 @@ endoreg_db/data/label/label/data.yaml,sha256=fwBiybtizA_hSGJWWCWNfKoHncy4s5ObxhK
15
15
  endoreg_db/data/label/label-set/data.yaml,sha256=wpAxOPbpZzZWLM95yjoKXhhjMk6mOKcGQdoLtcDXCZ4,339
16
16
  endoreg_db/data/label/label-type/data.yaml,sha256=vffKYpTae_gu63_wza6LONs5ys4pna1EbrUUO6CafQs,136
17
17
  endoreg_db/data/model_type/data.yaml,sha256=vCMMo8wiI5uL2zrQROmgsHq1GrC8IdagGIgNdQunUeQ,149
18
+ endoreg_db/data/pdf_type/data.yaml,sha256=0eMCb3-j2_zY0NkyIFFM7H9658kILpd5mt_OgrXxs64,990
18
19
  endoreg_db/data/profession/data.yaml,sha256=3lRQ-SEiJHjmuQWXVLBoL7tpfO2t82NgGc3PpKIayQg,2151
20
+ endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml,sha256=AbYLl4D3BvEhvmXdjDECYIrf3eli9cg-MhPlb_jC6nM,742
21
+ endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml,sha256=1iaUFiVt_ldCPGqud_znD2-AFgSfrZr_oncAONM9Ic0,493
19
22
  endoreg_db/data/unit/data.yaml,sha256=t9D7xepTm_7g6q6MUacCigoCLI3_6R6WS3BaowI6tok,393
20
23
  endoreg_db/data/unit/length.yaml,sha256=wzDD3ZgnNRSIjItLMScrx0ZsEmrrJKuY9rZi8t8jkaU,633
21
24
  endoreg_db/data/unit/volume.yaml,sha256=JYRHRC6uAIe5TPkY8B2SfuEEIBEDePy7GXL2pWAGyUM,510
@@ -34,17 +37,20 @@ endoreg_db/management/commands/import_legacy_images.py,sha256=IcBmihG9rvqC37XgMg
34
37
  endoreg_db/management/commands/import_legacy_videos.py,sha256=OHFTNb53RtznRyVay88vo83fkfafTiwTgUMieI70NX4,2732
35
38
  endoreg_db/management/commands/load_active_model_data.py,sha256=NpWIksrVQIyrd-ZhI_B_34NFbLJI1_vhwuN6gXc8hgQ,1337
36
39
  endoreg_db/management/commands/load_ai_model_data.py,sha256=rjC-yK8NNr0a0TDqvGHufI27ANQYTWDkWlSEWRkubGY,1329
37
- endoreg_db/management/commands/load_base_db_data.py,sha256=T31Laf1ucqHX-63M6jcaFu4pCboJjR00aIjrW9UGlOA,2719
38
- endoreg_db/management/commands/load_center_data.py,sha256=ztuxy_gcu--Cq_r_msHMpSwPmUeZ2zX7bPtB28KHS3Q,1272
40
+ endoreg_db/management/commands/load_base_db_data.py,sha256=Kx6Ld207NZg5tV8YDPoM_TCPvW6rjZrAlpktlyD-iWU,3146
41
+ endoreg_db/management/commands/load_center_data.py,sha256=Ra7BikibHJF4Ks72WNGwJqtbIw-9MieCxKlZG_RUA-s,1339
39
42
  endoreg_db/management/commands/load_endoscope_type_data.py,sha256=zZbjSmsRxT5arZsi9TRh5sBFNyM99dywOFmYPMcL7Cw,1345
40
43
  endoreg_db/management/commands/load_endoscopy_processor_data.py,sha256=j-lVR624IGTl5NXfePggQW6Qx0AOaSxvmVUjEtTEImw,1365
41
44
  endoreg_db/management/commands/load_examination_data.py,sha256=kGGSRpHxvhugpKXpUMrttWYe9y81XOzyjgiBqV492KU,2748
42
45
  endoreg_db/management/commands/load_information_source.py,sha256=3sL906AMa7FGO3bgrNbfJlptrEwv925n-X_XB4PDZ_Q,1347
43
46
  endoreg_db/management/commands/load_label_data.py,sha256=0vSBzBweO-M7mjXJotg4q_W7gbcaBoilrnA9e7dyp8o,2217
47
+ endoreg_db/management/commands/load_pdf_type_data.py,sha256=sJeGI1M4Xwkagi7rModwUJH3MuQckZXdOkHekoAvRAw,1650
44
48
  endoreg_db/management/commands/load_profession_data.py,sha256=oF3OF7zRqxA-SVpMW6e7LJ3MSfEc5Hoz1XlcvcFACRg,1321
49
+ endoreg_db/management/commands/load_report_reader_flag.py,sha256=pvqRgtcjaYTgx2Ce7HYnNzsUB48yJe9lXTk-lzfJUPI,1371
45
50
  endoreg_db/management/commands/load_unit_data.py,sha256=tcux-iL-ByT2ApgmHEkLllZSEA3AGMK5l-ze2Mtty1Y,1319
46
51
  endoreg_db/management/commands/load_user_groups.py,sha256=D7SK2FvZEHoE4TIXNGCjDw5_12MH9bpGZvoS7eEv0Os,1031
47
52
  endoreg_db/management/commands/register_ai_model.py,sha256=e5hgEyLS-E98XWzINcZ79mgtHvZltmbmAmLYaNrcfQs,2544
53
+ endoreg_db/management/commands/reset_celery_schedule.py,sha256=U-m_FNRTw6LAwJoT9RUE4qrhmQXm7AyFToPcHYyJpIE,386
48
54
  endoreg_db/migrations/0001_initial.py,sha256=dVrXpuzaaHkollKimmBl5WUw1ZTIx91AWXJ3wRr2mlI,33643
49
55
  endoreg_db/migrations/0002_rawvideofile.py,sha256=EazXiUm61IJUxVi24pmzTFQJbfe-rzkfN5ZDULe-BLY,935
50
56
  endoreg_db/migrations/0003_rawvideofile_frames_required.py,sha256=wrHZQs6QZjjjO4yfSVQPc_47ksO7z_TwT9drWPJy5uk,399
@@ -57,8 +63,18 @@ endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py,sha256=p
57
63
  endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py,sha256=7kStqnOp3Z-FoDYaAvFcOwfAaAS0mcCmF3hFoUO7WQQ,420
58
64
  endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py,sha256=_Mw-OybAZrKsm0zD8iPVkgDv7-BKVxzFP5e_Bqnj5DI,460
59
65
  endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py,sha256=iIP5k6SoUFQR4zrN27BOC0MIuErlgTn9LNTfDq86C7I,3769
66
+ endoreg_db/migrations/0013_rawpdffile.py,sha256=gFH0-0nl8wSAwJCa8VMqSUCvg8RRISKfWHuckHTt_3I,1502
67
+ endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py,sha256=tlcd1XiExztvQz7rpS4Zu336X43aYBNl6g0C2FYscf4,1475
68
+ endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py,sha256=Qny4MHBe5z5dgcbN_eOTKGalBFnr2OUuFpqmFgfb9Pg,974
69
+ endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py,sha256=q147Hcn4_XCQUNrspG9GFJYOaa-P_3KmfECIF3Tl17I,468
70
+ endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py,sha256=iSKCwcT06wYIgKv17MadQFfCtI3lvZwvaVBW3c0kmTQ,1255
71
+ endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py,sha256=PK1Kh1TZWKbC9qcFxSsUHylRaxMqNbUvNw-gK8jPrNY,2203
72
+ endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py,sha256=M1oQp29O2BmqEURH43Y2Zs3gzaO857Bra_id4Z3ItmI,1717
73
+ endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py,sha256=g3XkBZHm7HdkRApkM14AANXNmWSkWQM4a4p9HRpXbZo,412
74
+ endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py,sha256=B2OBG5O5XoWq3dnljOYd_LnTl45QEkSuJJY9JakB_Kc,606
75
+ endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py,sha256=gbYOyECHsQ30oaYOb_g8K7tEbBUNeyTxZX81Aiz22UA,574
60
76
  endoreg_db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- endoreg_db/models/__init__.py,sha256=47Pcu9-CKjtAP8rYCzLsXJ67YN0jWZQuw2AbW6DaV0E,957
77
+ endoreg_db/models/__init__.py,sha256=4JB1AyZj1n9q8exHOFNr93RVp0N_55-VLLb0a7Z8eJY,1045
62
78
  endoreg_db/models/ai_model/__init__.py,sha256=rh5npLRGml5iiRocx359gsaA82pGJTW7wdVAfnbZP6w,106
63
79
  endoreg_db/models/ai_model/active_model.py,sha256=r7SE3yg54kbjfOkk0Ei0rgs_Wo3ikx88rcEELqvRzGc,343
64
80
  endoreg_db/models/ai_model/model_meta.py,sha256=YyYW8dScpAceHePnbrnRpgVBYDByi9x7u5Ydh03OJuo,869
@@ -67,18 +83,23 @@ endoreg_db/models/ai_model/utils.py,sha256=Vh6_3lbDuFhSVCaaZKKm0CjoGA5Man6gWYe46
67
83
  endoreg_db/models/annotation/__init__.py,sha256=jM8ISS4hWciC9cFUCMo6fSkmCGUptWkX5lM46zNre2I,191
68
84
  endoreg_db/models/annotation/binary_classification_annotation_task.py,sha256=CpvyDxLSJcoJyajtUsDGBt881SNSFcG8lvuQ01knMNM,3292
69
85
  endoreg_db/models/annotation/image_classification.py,sha256=Og1tRo1QKBMztwfdbFryUWghnGdsTqQdepn9rOcmVMc,1387
70
- endoreg_db/models/center.py,sha256=hDGN0ABWeCtfjPJfSObeCwXnxxpqVqWlKRrtRUijVXI,550
71
- endoreg_db/models/data_file/__init__.py,sha256=6_V9G8ghDxIVDwAj4pttEJNt8r74kNgsTc8in_ilY5s,288
86
+ endoreg_db/models/center.py,sha256=qTp-of40Z4uHQT0NX8x_lItqkS_FpSyieFcLDzyBVZw,728
87
+ endoreg_db/models/data_file/__init__.py,sha256=Q0RG-UyIAvqZrwErbtBznL52M-CrFx8OEmlFFS9vSqU,252
72
88
  endoreg_db/models/data_file/base_classes/__init__.py,sha256=uyjViKV7N3K264xapYAOCpQx-zSwdRAN_oguUWQlq10,84
73
89
  endoreg_db/models/data_file/base_classes/abstract_frame.py,sha256=wUGkPCYoOESfiragEEy6oMeGpdS2nzha6g2lBiK7pcA,2214
74
90
  endoreg_db/models/data_file/base_classes/abstract_video.py,sha256=4OUgHWbHpESpSnZGSiA13nQwtvUDJweFwJPOuL8taAo,7406
75
91
  endoreg_db/models/data_file/frame.py,sha256=-8O2yCfhTk2eMd3GB5PIPrO0i_oV6yk24UV-8Pvl2Ik,1935
76
- endoreg_db/models/data_file/import_classes/__init__.py,sha256=-6HVcCu27bhfYDlLTui0HeYcWvsMQbyG8Q_2uS-VYnM,1136
77
- endoreg_db/models/data_file/import_classes/processing_functions.py,sha256=BNhj0PtJLf8dMzjD3KwI1INbidrvxkVNqr1C6Zjbvto,8492
78
- endoreg_db/models/data_file/import_classes/raw_video.py,sha256=_Bsv3E-Pk7VA5eDSwg37kp8a44aT_V7ShJVJ85IeVKk,12465
79
- endoreg_db/models/data_file/metadata/__init__.py,sha256=m9Z1kQLK3PyrX9C8KQdf1dzyQ2rMe-_q8IgXyLY-MEY,5407
80
- endoreg_db/models/data_file/metadata/sensitive_meta.py,sha256=cUwL0NdoCxj8tfd2psBvb4F2EbECrzXxXNrShfpagAM,602
81
- endoreg_db/models/data_file/report_file.py,sha256=SsKwzhsaNhfOLCp7dg6GNBwPYdrqw7QHQtYzqeVgD18,3498
92
+ endoreg_db/models/data_file/import_classes/__init__.py,sha256=f5f6dwDU8spd94dpDFUuQEJGGD--V_hjl_4v8hpKCX0,1168
93
+ endoreg_db/models/data_file/import_classes/processing_functions/__init__.py,sha256=uathXg8ckLb_XBTRipdHrBXFpZpvKzuouk7lwRN0aqE,932
94
+ endoreg_db/models/data_file/import_classes/processing_functions/pdf.py,sha256=lEd1V_kS8758XuRZ0gj7bVhY5DgTfpEyeDgX3zWHuzE,716
95
+ endoreg_db/models/data_file/import_classes/processing_functions/video.py,sha256=ij3fMdqnZnX1FrS-hscy_pfaYIkxDFKVL7SVjCqCUxs,8530
96
+ endoreg_db/models/data_file/import_classes/raw_pdf.py,sha256=E4uEway3_hwnFm71hHlneFD8NF7ZznK4yKicVwrBWqA,6509
97
+ endoreg_db/models/data_file/import_classes/raw_video.py,sha256=j2WLaqxVm86Oq_zKPRAncq3QavmAMP0p3ThalGjieaQ,12444
98
+ endoreg_db/models/data_file/metadata/__init__.py,sha256=Hcv1L5xDnONyERwn4jnj-vI4maYMAEZ9iFPQ8baNrl0,144
99
+ endoreg_db/models/data_file/metadata/pdf_meta.py,sha256=Ipi1LZo36UqP43trHfNY4hamyRWjenxiPg2f_W3di-k,2183
100
+ endoreg_db/models/data_file/metadata/sensitive_meta.py,sha256=o613V-jK8JiturSHymcwb2dNGsn_x4f1f3iJ9ZuGG-Y,1312
101
+ endoreg_db/models/data_file/metadata/video_meta.py,sha256=AYEv1m5cQ2qAdyJMBzcJqEG_vaVifXUl5CAYqQmUk5k,5354
102
+ endoreg_db/models/data_file/report_file.py,sha256=V1Eh8xGKUpruUifQAQqF4nd0WvLn6TlfT_nmjEsZhAc,3564
82
103
  endoreg_db/models/data_file/video/__init__.py,sha256=3UUMcrlIZBeVGkt5hOvjUr2-VSxOTFE1miPTcmHF4v0,98
83
104
  endoreg_db/models/data_file/video/import_meta.py,sha256=NTRYIZI8TeNoPmJhE0ZFljGIOf5CS9LbFcdYO0p4-mA,1311
84
105
  endoreg_db/models/data_file/video/video.py,sha256=lx3Iu7pdsy_oGlrvKKY8V06ZSNNWcwPYjP5DgCE2MKA,673
@@ -98,16 +119,21 @@ endoreg_db/models/legacy_data/__init__.py,sha256=J0ewe30Y2qCxCUPktcFOm2WOEz2fQnw
98
119
  endoreg_db/models/legacy_data/image.py,sha256=mKQed6AIJL2XauPB2GevHX6NXaR8gphundI9_IC9Hpc,1622
99
120
  endoreg_db/models/patient_examination/__init__.py,sha256=s3ybaIdnvZDLKPnP1UctMRbao69yZowjmqjSYpfg1MI,1674
100
121
  endoreg_db/models/permissions/__init__.py,sha256=p4C61oKuwKwYcN0EZ6SqBZDW0GCRO2VS-12whhOZBuY,1766
101
- endoreg_db/models/persons/__init__.py,sha256=hp24oTdoneaXSJUVCFoVi-yqaF8rGoMJ1nl7AZWzb54,183
122
+ endoreg_db/models/persons/__init__.py,sha256=R1NDUsXTb6cV4QAi9foVjxx22tKgAaN1Nk0GwsPOn2s,250
102
123
  endoreg_db/models/persons/examiner/__init__.py,sha256=-e0mxzCacT04tOAg2NA2aKg6EbKvzuZPQR4E2MqMEfI,92
103
124
  endoreg_db/models/persons/examiner/examiner.py,sha256=-eaRF42Qpr3Tj_XqYhz60noRJ5ndvpoZH_X3wM23rVc,422
104
125
  endoreg_db/models/persons/examiner/examiner_type.py,sha256=wz9afexQBLl8oNJE40LYlKKgBux_Kv-lvviRxGqbwH4,72
126
+ endoreg_db/models/persons/first_name.py,sha256=L5K-f9B0mDuJdCPgyo8iDHCxEPEY8q4gj9aK1unP78U,456
127
+ endoreg_db/models/persons/last_name.py,sha256=wzBvqHtJRrSkaFnBR65DtB9xWjizFADjhKPFxDbT5pY,501
105
128
  endoreg_db/models/persons/patient.py,sha256=uZS4TbzrM7CNY_cVlWe3tZq2khJCSQxZ5qsh_cOB1n4,2396
106
129
  endoreg_db/models/persons/person.py,sha256=R4NSIeHwAh-K4ZU9ThzdY_tWT0zyCAy7vSaFW0WhAMg,1096
107
130
  endoreg_db/models/persons/portal_user_information.py,sha256=cpiGkqwLLCYs7yu7Qv2oo7u0MoHXq8z7j-oGvHJDrbs,969
108
131
  endoreg_db/models/prediction/__init__.py,sha256=1WBkYwM-h33AbZYCCnrPN3PYVhxATbITPocQgWxwMcI,145
109
132
  endoreg_db/models/prediction/image_classification.py,sha256=uOR5Eu0eX3gVRO_tOWydnzrpzPwpmJCpYJUqe02bUNQ,1619
110
133
  endoreg_db/models/prediction/video_prediction_meta.py,sha256=ICjOstujy5m8aqjh12ff2MUnYwopg-GGKuneD5RP_1U,9492
134
+ endoreg_db/models/report_reader/__init__.py,sha256=SKB-sGFDPkTmnNVTYx1w59gvW0T9hI-v2mTGvlDUK4Y,101
135
+ endoreg_db/models/report_reader/report_reader_config.py,sha256=ONlqtb4kBxWGHkX_eW6d_Jiwh0EtRPOH7jQT7759nuI,2353
136
+ endoreg_db/models/report_reader/report_reader_flag.py,sha256=j9tjbLRenxpWfeaseALl8rV2Dqem9YaM_duS1iJkARU,536
111
137
  endoreg_db/models/unit.py,sha256=uiyIhZeRpr9XGh1uUEk0VILboNFBSK2IUi5GsQZ6ogc,774
112
138
  endoreg_db/models.py,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57
113
139
  endoreg_db/queries/__init__.py,sha256=3yhFtU_yY2L8rK2--8WkjcyI0q94QPpTtv5w_v8rZRY,83
@@ -140,15 +166,15 @@ endoreg_db/serializers/video.py,sha256=mZ2CsSxVGUXB0FR-CLjIZpE86z1tmFPXBrHbgYY3j
140
166
  endoreg_db/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
141
167
  endoreg_db/utils/__init__.py,sha256=yj_2T_itUgmVW3nAqYLosTvga7J2eghkzbxLcEpYUl4,49
142
168
  endoreg_db/utils/cropping.py,sha256=wMLo5sCFdZAEVBe3RbCH26eQjRe8q3th4K3ZKDd9fww,1143
143
- endoreg_db/utils/dataloader.py,sha256=-XJJuvUpclvreNtTyuNqRhxG-p-xjM_oCsKyiHrUHd4,2999
169
+ endoreg_db/utils/dataloader.py,sha256=NsUksaYQ5Kc95JwHlUFUUqvVle0zYxQY9nulxonBhYs,9129
144
170
  endoreg_db/utils/file_operations.py,sha256=3mUY6jARIm927XK0nJoDO7fRp5quoSqPr95jDJERmr0,884
145
- endoreg_db/utils/hashs.py,sha256=01PRVvGLuFCfJxNIxM-O5rfk6E7DelTLvu_--zEQVpU,509
171
+ endoreg_db/utils/hashs.py,sha256=mLae54Vj7h5Q-9_MWtEB_KKE7x9qALpClgZyX5DB9Ek,1069
146
172
  endoreg_db/utils/legacy_ocr.py,sha256=c2EBP-9egUYyfsQ1n0QoZY2wKndWoKdEXrB-MQZ0Xn4,7633
147
173
  endoreg_db/utils/ocr.py,sha256=jkdT1bl-LSCjZ2PvxlX1AG2TmhdMclayxUPrdZWs7UE,7322
148
174
  endoreg_db/utils/uuid.py,sha256=T4HXqYtKwXFqE5kPyvlgWHyllBBF6LL6N48nl9TpwBk,53
149
175
  endoreg_db/utils/video_metadata.py,sha256=HDyXxAeNQOK3cGzQ06xosmObzEnJBARuKjwz9vmmRIM,2613
150
176
  endoreg_db/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
151
- endoreg_db-0.3.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
152
- endoreg_db-0.3.1.dist-info/METADATA,sha256=c4TG9KG92skP-TwdtVfVwjg6BlZ3Wj_MYxW_cmXyi9Q,926
153
- endoreg_db-0.3.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
154
- endoreg_db-0.3.1.dist-info/RECORD,,
177
+ endoreg_db-0.3.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
178
+ endoreg_db-0.3.2.dist-info/METADATA,sha256=xwbeSECHb5boXgtBTX8ZYjjUXl5_olgCxD-eVKt6YkA,976
179
+ endoreg_db-0.3.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
180
+ endoreg_db-0.3.2.dist-info/RECORD,,