|
8 | 8 |
|
9 | 9 | from django_mongodb_backend.indexes import SearchIndex
|
10 | 10 |
|
11 |
| -from .fields import EmbeddedModelField |
| 11 | +from .fields import EmbeddedModelArrayField, EmbeddedModelField |
12 | 12 | from .gis.schema import GISSchemaEditor
|
13 | 13 | from .query import wrap_database_errors
|
14 | 14 | from .utils import OperationCollector, model_has_encrypted_fields
|
@@ -551,6 +551,7 @@ def _get_encrypted_fields(
|
551 | 551 | new_key_alt_name = f"{key_alt_name}.{field.column}"
|
552 | 552 | path = f"{path_prefix}.{field.column}" if path_prefix else field.column
|
553 | 553 |
|
| 554 | + # --- Embedded Single Document --- |
554 | 555 | if isinstance(field, EmbeddedModelField):
|
555 | 556 | if getattr(field, "encrypted", False):
|
556 | 557 | # Entire embedded object encrypted
|
@@ -582,7 +583,39 @@ def _get_encrypted_fields(
|
582 | 583 | field_list.extend(embedded_result["fields"])
|
583 | 584 | continue
|
584 | 585 |
|
585 |
| - # Leaf encrypted field |
| 586 | + # --- Array of Embedded Documents --- |
| 587 | + if isinstance(field, EmbeddedModelArrayField): |
| 588 | + if getattr(field, "encrypted", False): |
| 589 | + # Entire array contents encrypted - flat entry |
| 590 | + data_key = self._get_data_key( |
| 591 | + client_encryption, |
| 592 | + key_vault_collection, |
| 593 | + create_data_keys, |
| 594 | + kms_provider, |
| 595 | + master_key, |
| 596 | + new_key_alt_name, |
| 597 | + ) |
| 598 | + field_dict = { |
| 599 | + "bsonType": "array", |
| 600 | + "path": path, |
| 601 | + "keyId": data_key, |
| 602 | + } |
| 603 | + if getattr(field, "queries", False): |
| 604 | + field_dict["queries"] = field.queries |
| 605 | + field_list.append(field_dict) |
| 606 | + else: |
| 607 | + # Recurse into embedded model for fields inside array elements |
| 608 | + embedded_result = self._get_encrypted_fields( |
| 609 | + field.embedded_model, |
| 610 | + create_data_keys=create_data_keys, |
| 611 | + key_alt_name=new_key_alt_name, |
| 612 | + path_prefix=path, # array prefix in path |
| 613 | + ) |
| 614 | + if embedded_result and embedded_result.get("fields"): |
| 615 | + field_list.extend(embedded_result["fields"]) |
| 616 | + continue |
| 617 | + |
| 618 | + # --- Leaf encrypted field --- |
586 | 619 | if getattr(field, "encrypted", False):
|
587 | 620 | data_key = self._get_data_key(
|
588 | 621 | client_encryption,
|
|
0 commit comments