Refactor: O(1) lookup table for CRYPT_FIELDS in per-record encryption

Add CRYPT_FIELDS_BY_MODEL to CryptMixin, derived from CRYPT_FIELDS at
class definition time. _encrypt_record_inline() now does a single dict
lookup instead of a linear scan per record, eliminating the loop and
break pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Trenton H
2026-03-06 14:43:56 -08:00
co-authored by Claude Sonnet 4.6
parent 3e961eff0e
commit ac8bab7ed0
2 changed files with 11 additions and 9 deletions
@@ -605,15 +605,13 @@ class Command(CryptMixin, BaseCommand):
"""Encrypt sensitive fields in a single record, if passphrase is set."""
if not self.passphrase:
return
model = record.get("model", "")
for cfg in self.CRYPT_FIELDS:
if model == cfg["model_name"]:
for field in cfg["fields"]:
if record["fields"].get(field):
record["fields"][field] = self.encrypt_string(
value=record["fields"][field],
)
break
fields = self.CRYPT_FIELDS_BY_MODEL.get(record.get("model", ""))
if fields:
for field in fields:
if record["fields"].get(field):
record["fields"][field] = self.encrypt_string(
value=record["fields"][field],
)
def _write_split_manifest(
self,
@@ -89,6 +89,10 @@ class CryptMixin:
],
},
]
# O(1) lookup for per-record encryption; derived from CRYPT_FIELDS at class definition time
CRYPT_FIELDS_BY_MODEL: dict[str, list[str]] = {
cfg["model_name"]: cfg["fields"] for cfg in CRYPT_FIELDS
}
def get_crypt_params(self) -> dict[str, dict[str, str | int]]:
return {