43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
# retoor <retoor@molodetz.nl>
|
|
from fastapi import APIRouter, Request
|
|
|
|
from molodetz.database import get_user_by_username, post_counts_by_author, public_people, published_posts
|
|
from molodetz.responses import respond
|
|
from molodetz.schemas.people import PeopleOut, ProfileOut
|
|
from molodetz.seo import base_seo_context, profile_schema
|
|
from molodetz.seo_meta_text import description_for
|
|
from molodetz.utils.auth import not_found
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def _with_counts(people):
|
|
counts = post_counts_by_author([person["uid"] for person in people])
|
|
return [{**person, "post_count": counts.get(person["uid"], 0)} for person in people]
|
|
|
|
|
|
@router.get("")
|
|
async def people(request: Request):
|
|
persons = _with_counts(public_people())
|
|
seo = base_seo_context(request, "People", description_for("people"), breadcrumbs=[("Molodetz", "/"), ("People", "/people")])
|
|
return respond(request, "people.html", {"people": persons, "seo": seo}, model=PeopleOut)
|
|
|
|
|
|
@router.get("/{username}")
|
|
async def person(request: Request, username: str):
|
|
row = get_user_by_username(username)
|
|
if row is None:
|
|
not_found("Person not found")
|
|
person_row = _with_counts([row])[0]
|
|
own, _ = published_posts(limit=50, user_uid=row["uid"])
|
|
seo = base_seo_context(
|
|
request,
|
|
row["username"],
|
|
row.get("bio") or description_for("people"),
|
|
og_type="profile",
|
|
robots="index,follow" if person_row["post_count"] > 0 else "noindex,follow",
|
|
breadcrumbs=[("Molodetz", "/"), ("People", "/people"), (row["username"], f"/people/{row['username']}")],
|
|
schemas=[profile_schema(request, row)],
|
|
)
|
|
return respond(request, "person.html", {"person": person_row, "posts": own, "seo": seo}, model=ProfileOut)
|