|
20 | 20 |
|
21 | 21 | @dataclass(frozen=True) |
22 | 22 | class StrategyPluginGoogleVoiceSettings: |
23 | | - smtp_host: str | None = None |
24 | | - smtp_port: int = 587 |
25 | | - sender: str | None = None |
26 | | - recipients: tuple[str, ...] = () |
27 | | - username: str | None = None |
28 | | - password: str | None = field(default=None, repr=False) |
29 | | - use_starttls: bool = True |
30 | | - use_ssl: bool = False |
| 23 | + gateway_recipients: tuple[str, ...] = () |
| 24 | + gmail_user: str | None = None |
| 25 | + gmail_app_password: str | None = field(default=None, repr=False) |
| 26 | + smtp_host: str = "smtp.gmail.com" |
| 27 | + smtp_port: int = 465 |
| 28 | + use_starttls: bool = False |
| 29 | + use_ssl: bool = True |
31 | 30 | timeout: float = 10.0 |
32 | 31 |
|
33 | 32 | @classmethod |
34 | 33 | def from_object(cls, value: object) -> "StrategyPluginGoogleVoiceSettings": |
35 | 34 | if isinstance(value, cls): |
36 | 35 | return value |
37 | 36 | return cls( |
38 | | - smtp_host=_get_value(value, "crisis_alert_smtp_host"), |
39 | | - smtp_port=int(_get_value(value, "crisis_alert_smtp_port", 587) or 587), |
40 | | - sender=_first_non_empty(_get_value(value, "crisis_alert_smtp_from")), |
41 | | - recipients=tuple(parse_email_recipients(_get_value(value, "crisis_alert_google_voice_to", ()))), |
42 | | - username=_get_value(value, "crisis_alert_smtp_username"), |
43 | | - password=_get_value(value, "crisis_alert_smtp_password"), |
44 | | - use_starttls=_coerce_bool(_get_value(value, "crisis_alert_smtp_starttls", True), default=True), |
45 | | - use_ssl=_coerce_bool(_get_value(value, "crisis_alert_smtp_ssl", False), default=False), |
| 37 | + gateway_recipients=tuple( |
| 38 | + parse_email_recipients(_get_value(value, "crisis_alert_google_voice_gateway", ())) |
| 39 | + ), |
| 40 | + gmail_user=_first_non_empty(_get_value(value, "crisis_alert_google_voice_gmail_user")), |
| 41 | + gmail_app_password=_get_value(value, "crisis_alert_google_voice_gmail_app_password"), |
46 | 42 | ) |
47 | 43 |
|
48 | 44 | def missing_fields(self) -> tuple[str, ...]: |
49 | 45 | missing: list[str] = [] |
50 | | - if not str(self.smtp_host or "").strip(): |
51 | | - missing.append("CRISIS_ALERT_SMTP_HOST") |
52 | | - if not str(self.sender or "").strip(): |
53 | | - missing.append("CRISIS_ALERT_SMTP_FROM") |
54 | | - if not parse_email_recipients(self.recipients): |
55 | | - missing.append("CRISIS_ALERT_GOOGLE_VOICE_TO") |
| 46 | + if not parse_email_recipients(self.gateway_recipients): |
| 47 | + missing.append("CRISIS_ALERT_GOOGLE_VOICE_GATEWAY") |
| 48 | + if not str(self.gmail_user or "").strip(): |
| 49 | + missing.append("CRISIS_ALERT_GOOGLE_VOICE_GMAIL_USER") |
| 50 | + if not str(self.gmail_app_password or "").strip(): |
| 51 | + missing.append("CRISIS_ALERT_GOOGLE_VOICE_GMAIL_APP_PASSWORD") |
56 | 52 | return tuple(missing) |
57 | 53 |
|
58 | 54 | @property |
@@ -282,10 +278,10 @@ def _send_message( |
282 | 278 | body=message.body, |
283 | 279 | smtp_host=settings.smtp_host, |
284 | 280 | smtp_port=settings.smtp_port, |
285 | | - sender=settings.sender, |
286 | | - recipients=settings.recipients, |
287 | | - username=settings.username, |
288 | | - password=settings.password, |
| 281 | + sender=settings.gmail_user, |
| 282 | + recipients=settings.gateway_recipients, |
| 283 | + username=settings.gmail_user, |
| 284 | + password=settings.gmail_app_password, |
289 | 285 | use_starttls=settings.use_starttls, |
290 | 286 | use_ssl=settings.use_ssl, |
291 | 287 | timeout=settings.timeout, |
@@ -367,17 +363,6 @@ def _first_non_empty(*values: Any) -> str | None: |
367 | 363 | return None |
368 | 364 |
|
369 | 365 |
|
370 | | -def _coerce_bool(value: Any, *, default: bool) -> bool: |
371 | | - if value is None: |
372 | | - return default |
373 | | - if isinstance(value, bool): |
374 | | - return value |
375 | | - text = str(value).strip().lower() |
376 | | - if not text: |
377 | | - return default |
378 | | - return text in {"1", "true", "yes", "y", "on"} |
379 | | - |
380 | | - |
381 | 366 | def _fallback_alert_key(message: StrategyPluginAlertMessage) -> str: |
382 | 367 | return "strategy_plugin_google_voice_alert/" + _clean_relative_key(message.subject or "unknown") |
383 | 368 |
|
|
0 commit comments