|
14 | 14 | from dataclasses import dataclass |
15 | 15 | from datetime import datetime, timezone |
16 | 16 | from pathlib import Path |
17 | | -from typing import Any |
| 17 | +from typing import Any, cast |
18 | 18 | from urllib.parse import urljoin, urlsplit, urlunsplit |
19 | 19 | from uuid import NAMESPACE_URL, uuid4, uuid5 |
20 | 20 |
|
@@ -94,6 +94,13 @@ class IntakeResumeFile: |
94 | 94 | source_url: str |
95 | 95 |
|
96 | 96 |
|
| 97 | +class _ResumeFileNotProvided: |
| 98 | + pass |
| 99 | + |
| 100 | + |
| 101 | +_RESUME_FILE_NOT_PROVIDED = _ResumeFileNotProvided() |
| 102 | + |
| 103 | + |
97 | 104 | class IntakeFormProcessor: |
98 | 105 | """Process a Google Forms member intake submission against CRM.""" |
99 | 106 |
|
@@ -464,7 +471,9 @@ def _build_intake_updates( |
464 | 471 | payload: Mapping[str, Any], |
465 | 472 | include_email: bool = True, |
466 | 473 | include_last_name: bool = True, |
467 | | - resume_file: IntakeResumeFile | None = None, |
| 474 | + resume_file: IntakeResumeFile | None | _ResumeFileNotProvided = ( |
| 475 | + _RESUME_FILE_NOT_PROVIDED |
| 476 | + ), |
468 | 477 | ) -> dict[str, Any]: |
469 | 478 | updates: dict[str, Any] = {"firstName": first_name} |
470 | 479 | if include_last_name: |
@@ -698,22 +707,27 @@ def _build_resume_updates( |
698 | 707 | self, |
699 | 708 | payload: Mapping[str, Any], |
700 | 709 | *, |
701 | | - resume_file: IntakeResumeFile | None = None, |
| 710 | + resume_file: IntakeResumeFile | None | _ResumeFileNotProvided = ( |
| 711 | + _RESUME_FILE_NOT_PROVIDED |
| 712 | + ), |
702 | 713 | ) -> dict[str, Any]: |
703 | | - if resume_file is None: |
704 | | - resume_file = self._prepare_resume_file(payload) |
705 | | - if resume_file is None: |
| 714 | + prepared_resume_file: IntakeResumeFile | None |
| 715 | + if resume_file is _RESUME_FILE_NOT_PROVIDED: |
| 716 | + prepared_resume_file = self._prepare_resume_file(payload) |
| 717 | + else: |
| 718 | + prepared_resume_file = cast(IntakeResumeFile | None, resume_file) |
| 719 | + if prepared_resume_file is None: |
706 | 720 | return {} |
707 | 721 |
|
708 | 722 | try: |
709 | 723 | resume_text = self.document_processor.extract_text( |
710 | | - resume_file.content, |
711 | | - resume_file.filename, |
| 724 | + prepared_resume_file.content, |
| 725 | + prepared_resume_file.filename, |
712 | 726 | ) |
713 | 727 | except Exception as exc: |
714 | 728 | logger.warning( |
715 | 729 | "Failed to parse resume masked_url=%s error=%s", |
716 | | - self._mask_resume_url_for_log(resume_file.source_url), |
| 730 | + self._mask_resume_url_for_log(prepared_resume_file.source_url), |
717 | 731 | exc, |
718 | 732 | ) |
719 | 733 | return {} |
|
0 commit comments