endoreg-db 0.8.5.2__py3-none-any.whl → 0.8.5.4__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.

Potentially problematic release.


This version of endoreg-db might be problematic. Click here for more details.

@@ -215,7 +215,7 @@ def create_pseudo_examiner_logic(instance: "SensitiveMeta") -> "Examiner":
215
215
  )
216
216
  # Ensure default center exists or handle appropriately
217
217
  try:
218
- default_center = Center.objects.get_by_natural_key("endoreg_db_demo")
218
+ default_center = Center.objects.get(name="endoreg_db_demo")
219
219
  except Center.DoesNotExist:
220
220
  logger.error(
221
221
  "Default center 'endoreg_db_demo' not found. Cannot create default examiner."
@@ -448,7 +448,50 @@ def perform_save_logic(instance: "SensitiveMeta") -> "Examiner":
448
448
  def create_sensitive_meta_from_dict(
449
449
  cls: Type["SensitiveMeta"], data: Dict[str, Any]
450
450
  ) -> "SensitiveMeta":
451
- """Logic to create a SensitiveMeta instance from a dictionary."""
451
+ """
452
+ Create a SensitiveMeta instance from a dictionary.
453
+
454
+ **Center handling:**
455
+ This function accepts TWO ways to specify the center:
456
+ 1. `center` (Center object) - Directly pass a Center instance
457
+ 2. `center_name` (string) - Pass the center name as a string (will be resolved to Center object)
458
+
459
+ At least ONE of these must be provided.
460
+
461
+ **Example usage:**
462
+ ```python
463
+ # Option 1: With Center object
464
+ data = {
465
+ "patient_first_name": "Patient",
466
+ "patient_last_name": "Unknown",
467
+ "patient_dob": date(1990, 1, 1),
468
+ "examination_date": date.today(),
469
+ "center": center_obj, # ← Center object
470
+ }
471
+ sm = SensitiveMeta.create_from_dict(data)
472
+
473
+ # Option 2: With center name string
474
+ data = {
475
+ "patient_first_name": "Patient",
476
+ "patient_last_name": "Unknown",
477
+ "patient_dob": date(1990, 1, 1),
478
+ "examination_date": date.today(),
479
+ "center_name": "university_hospital_wuerzburg", # ← String
480
+ }
481
+ sm = SensitiveMeta.create_from_dict(data)
482
+ ```
483
+
484
+ Args:
485
+ cls: The SensitiveMeta class
486
+ data: Dictionary containing field values
487
+
488
+ Returns:
489
+ SensitiveMeta: The created instance
490
+
491
+ Raises:
492
+ ValueError: If neither center nor center_name is provided
493
+ ValueError: If center_name does not match any Center in database
494
+ """
452
495
 
453
496
  field_names = {
454
497
  f.name
@@ -585,15 +628,29 @@ def create_sensitive_meta_from_dict(
585
628
  )
586
629
  selected_data.pop("examination_date", None)
587
630
 
588
- # Handle Center
631
+ # Handle Center - accept both center_name (string) and center (object)
632
+ from ..administration import Center
633
+
634
+ center = data.get("center") # First try direct Center object
589
635
  center_name = data.get("center_name")
590
- if not center_name:
591
- raise ValueError("center_name is required in data dictionary.")
592
- try:
593
- center = Center.objects.get_by_natural_key(center_name)
636
+
637
+ if center is not None:
638
+ # Center object provided directly - validate it's a Center instance
639
+ if not isinstance(center, Center):
640
+ raise ValueError(f"'center' must be a Center instance, got {type(center)}")
594
641
  selected_data["center"] = center
595
- except Center.DoesNotExist as exc:
596
- raise ValueError(f"Center with name '{center_name}' does not exist.") from exc
642
+ elif center_name:
643
+ # center_name string provided - resolve to Center object
644
+ try:
645
+ center = Center.objects.get(name=center_name)
646
+ selected_data["center"] = center
647
+ except Center.DoesNotExist:
648
+ raise ValueError(f"Center with name '{center_name}' does not exist.")
649
+ else:
650
+ # Neither center nor center_name provided
651
+ raise ValueError(
652
+ "Either 'center' (Center object) or 'center_name' (string) is required in data dictionary."
653
+ )
597
654
 
598
655
  # Handle Names and Gender
599
656
  first_name = selected_data.get("patient_first_name") or DEFAULT_UNKNOWN_NAME
@@ -708,17 +765,37 @@ def update_sensitive_meta_from_dict(
708
765
  k: v for k, v in data.items() if k in field_names and k not in excluded_fields
709
766
  }
710
767
 
711
- # Handle potential Center update
768
+ # Handle potential Center update - accept both center_name (string) and center (object)
769
+ from ..administration import Center
770
+
771
+ center = data.get("center") # First try direct Center object
712
772
  center_name = data.get("center_name")
713
- if center_name:
773
+
774
+ if center is not None:
775
+ # Center object provided directly - validate and update
776
+ if isinstance(center, Center):
777
+ instance.center = center
778
+ logger.debug(f"Updated center from Center object: {center.name}")
779
+ else:
780
+ logger.warning(
781
+ f"Invalid center type {type(center)}, expected Center instance. Ignoring."
782
+ )
783
+ # Remove from selected_data to prevent override
784
+ selected_data.pop("center", None)
785
+ elif center_name:
786
+ # center_name string provided - resolve to Center object
714
787
  try:
715
- center = Center.objects.get_by_natural_key(center_name)
716
- instance.center = center # Update center directly
717
- except Center.DoesNotExist as exc:
788
+ center_obj = Center.objects.get(name=center_name)
789
+ instance.center = center_obj
790
+ logger.debug(f"Updated center from center_name string: {center_name}")
791
+ except Center.DoesNotExist:
718
792
  logger.warning(
719
793
  f"Center '{center_name}' not found during update. Keeping existing center."
720
794
  )
721
- selected_data.pop("center", None) # Remove from dict if not found
795
+ else:
796
+ # Both are None/missing - remove 'center' from selected_data to preserve existing value
797
+ selected_data.pop("center", None)
798
+ # If both are None/missing, keep existing center (no update needed)
722
799
 
723
800
  # Set examiner names if provided, before calling save
724
801
  examiner_first_name = data.get("examiner_first_name")
@@ -801,6 +878,11 @@ def update_sensitive_meta_from_dict(
801
878
  # Update other attributes from selected_data
802
879
  patient_name_changed = False
803
880
  for k, v in selected_data.items():
881
+ # Skip None values to avoid overwriting existing data
882
+ if v is None:
883
+ logger.debug(f"Skipping field '{k}' during update because value is None")
884
+ continue
885
+
804
886
  # Avoid overwriting examiner names if they were just explicitly set
805
887
  if (
806
888
  k not in ["examiner_first_name", "examiner_last_name"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: endoreg-db
3
- Version: 0.8.5.2
3
+ Version: 0.8.5.4
4
4
  Summary: EndoReg Db Django App
5
5
  Project-URL: Homepage, https://info.coloreg.de
6
6
  Project-URL: Repository, https://github.com/wg-lux/endoreg-db
@@ -468,7 +468,7 @@ endoreg_db/models/metadata/model_meta.py,sha256=F_r-PTLeNi4J-4EaGCQkGIguhdl7Bwba
468
468
  endoreg_db/models/metadata/model_meta_logic.py,sha256=vAbNDaoZygH8xOCulWlXoHoR1T0BSvr9kIloxjzhfjo,12533
469
469
  endoreg_db/models/metadata/pdf_meta.py,sha256=BTmpSgqxmPKi0apcNjyrZAS4AFKCPXVdBd6VBeyyv6E,3174
470
470
  endoreg_db/models/metadata/sensitive_meta.py,sha256=ekLHrW-b5uYcjfkRd0EW5ncx5ef8Bu-K6msDkpWCAbk,13034
471
- endoreg_db/models/metadata/sensitive_meta_logic.py,sha256=s5wf_oPXhOuk0ReDE7SblRWO_thkq1ixCerc-xwWRB0,40100
471
+ endoreg_db/models/metadata/sensitive_meta_logic.py,sha256=FRkBX_EgR2cfXO2_7TzllyceJJgU2lfGPkGsPGiLF2E,43119
472
472
  endoreg_db/models/metadata/video_meta.py,sha256=c6xWdLW3uNqJ5VPJXHCxXA3mbXw-b0uR54-TOS3qL2Q,14966
473
473
  endoreg_db/models/metadata/video_prediction_logic.py,sha256=j5N82mHtiomeeIaf1HA65kT5d0htQfJmbI2bJb8mpxQ,7677
474
474
  endoreg_db/models/metadata/video_prediction_meta.py,sha256=EyfctAAAVcW9L0gf76ZBc9-G8MLMcD-tc2kkjaaLH4w,10592
@@ -788,7 +788,7 @@ endoreg_db/views/video/video_meta.py,sha256=C1wBMTtQb_yzEUrhFGAy2UHEWMk_CbU75WXX
788
788
  endoreg_db/views/video/video_processing_history.py,sha256=mhFuS8RG5GV8E-lTtuD0qrq-bIpnUFp8vy9aERfC-J8,770
789
789
  endoreg_db/views/video/video_remove_frames.py,sha256=2FmvNrSPM0fUXiBxINN6vBUUDCqDlBkNcGR3WsLDgKo,1696
790
790
  endoreg_db/views/video/video_stream.py,sha256=kLyuf0ORTmsLeYUQkTQ6iRYqlIQozWhMMR3Lhfe_trk,12148
791
- endoreg_db-0.8.5.2.dist-info/METADATA,sha256=U-mn6p7DpJNoCpAn01fAr14bYmJKzpwfbx2nDOuz_Qs,14719
792
- endoreg_db-0.8.5.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
793
- endoreg_db-0.8.5.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
794
- endoreg_db-0.8.5.2.dist-info/RECORD,,
791
+ endoreg_db-0.8.5.4.dist-info/METADATA,sha256=F2Ma_FJzdqwLhv8CoQlTc3U2lXg-axA8T9EJd2KumPo,14719
792
+ endoreg_db-0.8.5.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
793
+ endoreg_db-0.8.5.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
794
+ endoreg_db-0.8.5.4.dist-info/RECORD,,