generated from kgod/ai-review-template
64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
def strict_phone(value: str) -> bool:
|
|
return (
|
|
len(value) == 11
|
|
and value.isascii()
|
|
and value.isdigit()
|
|
and value[0] == "1"
|
|
and value[1] in "3456789"
|
|
)
|
|
|
|
|
|
def mask_phone(value: Any) -> str | None:
|
|
if not isinstance(value, str) or len(value) != 11:
|
|
return None
|
|
return f"{value[:3]}****{value[-4:]}"
|
|
|
|
|
|
def valid_month(value: Any) -> bool:
|
|
if not isinstance(value, str) or len(value) != 7 or value[4] != "-":
|
|
return False
|
|
year, month = value.split("-", 1)
|
|
return (
|
|
year.isdigit()
|
|
and month.isdigit()
|
|
and 1900 <= int(year) <= 2100
|
|
and 1 <= int(month) <= 12
|
|
)
|
|
|
|
|
|
def anchor_missing_fields(
|
|
profile: dict[str, Any], required: list[str]
|
|
) -> list[str]:
|
|
anchor = profile.get("anchor", {})
|
|
missing = [field for field in required if not _present(anchor.get(field))]
|
|
start = anchor.get("start_date")
|
|
end = anchor.get("end_date_or_present")
|
|
if start and not valid_month(start) and "start_date" not in missing:
|
|
missing.append("start_date")
|
|
if end and end != "present" and not valid_month(end) and "end_date_or_present" not in missing:
|
|
missing.append("end_date_or_present")
|
|
if valid_month(start) and valid_month(end) and end < start and "end_date_or_present" not in missing:
|
|
missing.append("end_date_or_present")
|
|
return missing
|
|
|
|
|
|
def can_create_resume(profile: dict[str, Any], missing: list[str]) -> bool:
|
|
return bool(
|
|
profile.get("privacy_accepted")
|
|
and strict_phone(str(profile.get("phone") or ""))
|
|
and str(profile.get("name") or "").strip()
|
|
and profile.get("job_type") in {"campus", "social", "other"}
|
|
and profile.get("anchor_type")
|
|
and profile.get("anchor_confirmed")
|
|
and not missing
|
|
)
|
|
|
|
|
|
def _present(value: Any) -> bool:
|
|
return bool(value.strip()) if isinstance(value, str) else value is not None
|