fix: make employee detail page human-readable
This commit is contained in:
@@ -46,6 +46,25 @@ def employee_display_payload(employee: Employee) -> dict[str, Any]:
|
||||
}
|
||||
|
||||
|
||||
def employee_detail_payload(employee: Employee) -> dict[str, Any]:
|
||||
data = employee.current_data or {}
|
||||
contacts = data.get("contacts") or {}
|
||||
return {
|
||||
**employee_display_payload(employee),
|
||||
"profile_type": employee.profile_type or data.get("profile_type"),
|
||||
"profile_id": employee.profile_id or data.get("profile_id"),
|
||||
"parser_version": employee.parser_version or data.get("parser_version"),
|
||||
"contacts": {
|
||||
"emails": _clean_list(contacts.get("emails")),
|
||||
"phones": _clean_list(contacts.get("phones")),
|
||||
"address": contacts.get("address"),
|
||||
"items": _normalize_contact_items(contacts.get("items")),
|
||||
},
|
||||
"external_ids": _normalize_external_ids(data.get("external_ids")),
|
||||
"sections": [_normalize_section(section) for section in data.get("sections") or []],
|
||||
}
|
||||
|
||||
|
||||
def build_employee_query(
|
||||
*,
|
||||
status: str | None = None,
|
||||
@@ -157,3 +176,144 @@ def _count_section_items(sections: list[dict[str, Any]], section_type: str) -> i
|
||||
elif section_type == "courses_by_year":
|
||||
total += len(section.get("courses") or [])
|
||||
return total
|
||||
|
||||
|
||||
def _clean_list(values: Any) -> list[str]:
|
||||
if not isinstance(values, list):
|
||||
return []
|
||||
return [str(value).strip() for value in values if str(value or "").strip()]
|
||||
|
||||
|
||||
def _normalize_contact_items(items: Any) -> list[str]:
|
||||
normalized = []
|
||||
if not isinstance(items, list):
|
||||
return normalized
|
||||
for item in items:
|
||||
if isinstance(item, dict):
|
||||
value = item.get("raw") or item.get("value") or item.get("text")
|
||||
else:
|
||||
value = item
|
||||
value = str(value or "").strip()
|
||||
if value:
|
||||
normalized.append(value)
|
||||
return normalized
|
||||
|
||||
|
||||
def _normalize_external_ids(items: Any) -> list[dict[str, str | None]]:
|
||||
normalized = []
|
||||
if not isinstance(items, list):
|
||||
return normalized
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
system = str(item.get("system") or "").strip()
|
||||
value = str(item.get("value") or "").strip()
|
||||
url = str(item.get("url") or "").strip()
|
||||
if system or value or url:
|
||||
normalized.append({"system": system or "ID", "value": value or url, "url": url or None})
|
||||
return normalized
|
||||
|
||||
|
||||
def _normalize_section(section: Any) -> dict[str, Any]:
|
||||
if not isinstance(section, dict):
|
||||
return {"title": "Раздел", "type": "generic", "paragraphs": [str(section)], "items": [], "links": []}
|
||||
|
||||
section_type = section.get("type") or "generic"
|
||||
paragraphs = _clean_list(section.get("paragraphs"))
|
||||
items = _clean_list(section.get("items"))
|
||||
raw_text = str(section.get("raw_text") or "").strip()
|
||||
if not paragraphs and not items and raw_text:
|
||||
paragraphs = [raw_text]
|
||||
|
||||
return {
|
||||
"title": section.get("title") or "Раздел",
|
||||
"type": section_type,
|
||||
"raw_text": raw_text,
|
||||
"paragraphs": paragraphs,
|
||||
"items": items,
|
||||
"links": _normalize_links(section.get("links")),
|
||||
"year_entries": _normalize_year_entries(section.get("year_entries")),
|
||||
"publications": _normalize_publications(section.get("publications")),
|
||||
"publications_count": section.get("publications_count"),
|
||||
"academic_year": section.get("academic_year"),
|
||||
"courses": _normalize_courses(section.get("courses")),
|
||||
"table": _normalize_table(section.get("table")),
|
||||
}
|
||||
|
||||
|
||||
def _normalize_links(items: Any) -> list[dict[str, str | None]]:
|
||||
normalized = []
|
||||
if not isinstance(items, list):
|
||||
return normalized
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
text = str(item.get("text") or item.get("url") or "").strip()
|
||||
url = str(item.get("url") or "").strip()
|
||||
if text and url:
|
||||
normalized.append({"text": text, "url": url})
|
||||
return normalized
|
||||
|
||||
|
||||
def _normalize_year_entries(items: Any) -> list[dict[str, Any]]:
|
||||
normalized = []
|
||||
if not isinstance(items, list):
|
||||
return normalized
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
text = str(item.get("text") or "").strip()
|
||||
if text:
|
||||
normalized.append({"year": item.get("year"), "text": text, "links": _normalize_links(item.get("links"))})
|
||||
return normalized
|
||||
|
||||
|
||||
def _normalize_publications(items: Any) -> list[dict[str, str | None]]:
|
||||
normalized = []
|
||||
if not isinstance(items, list):
|
||||
return normalized
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
text = str(item or "").strip()
|
||||
if text:
|
||||
normalized.append({"title": text, "text": text, "url": None})
|
||||
continue
|
||||
title = str(item.get("title") or "").strip()
|
||||
text = str(item.get("text") or title).strip()
|
||||
url = str(item.get("url") or "").strip()
|
||||
if title or text:
|
||||
normalized.append({"title": title or text, "text": text or title, "url": url or None})
|
||||
return normalized
|
||||
|
||||
|
||||
def _normalize_courses(items: Any) -> list[dict[str, str | None]]:
|
||||
normalized = []
|
||||
if not isinstance(items, list):
|
||||
return normalized
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
title = str(item or "").strip()
|
||||
if title:
|
||||
normalized.append({"title": title, "url": None})
|
||||
continue
|
||||
title = str(item.get("title") or "").strip()
|
||||
url = str(item.get("url") or "").strip()
|
||||
if title or url:
|
||||
normalized.append({"title": title or url, "url": url or None})
|
||||
return normalized
|
||||
|
||||
|
||||
def _normalize_table(table: Any) -> dict[str, Any] | None:
|
||||
if not isinstance(table, dict):
|
||||
return None
|
||||
headers = _clean_list(table.get("headers"))
|
||||
rows = []
|
||||
for row in table.get("rows") or []:
|
||||
if not isinstance(row, dict):
|
||||
continue
|
||||
cells = _clean_list(row.get("cells"))
|
||||
if cells:
|
||||
rows.append({"cells": cells, "link_url": row.get("link_url")})
|
||||
if not headers and not rows:
|
||||
return None
|
||||
return {"headers": headers, "rows": rows}
|
||||
|
||||
Reference in New Issue
Block a user