Brukersider: /brukere/ og /brukere/<brukernavn>/ med beskrivelse

Alle brukere kan skrive en valgfri beskrivelse (Markdown, uten rå HTML)
under Profil. /brukere/ lister hovedbruker øverst og gjester alfabetisk
etter visningsnavn; brukersiden viser navn, beskrivelse, e-post og
innlegg. Signaturen under innlegg lenker til brukersiden. «brukere» er
reservert. Siden bygges nå også når brukere opprettes/slettes.
Retter også ugyldig pattern-regex for brukernavn i admin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
This commit is contained in:
Ole-Morten Duesund 2026-08-26 15:48:15 +02:00
commit 5263d3011d
13 changed files with 191 additions and 20 deletions

View file

@ -323,7 +323,9 @@ def test_signature_from_profile(client, cfg):
f"/admin/edit/{post_id}",
data={"csrf": token, "title": "Sign", "body": "x", "action": "publish"},
)
assert " Ole" in client.get("/sign/").text # visningsnavn fra brukertabellen
assert re.search(
r" <a[^>]*>Ole</a>", client.get("/sign/").text
) # visningsnavn fra brukertabellen
assert (cfg.content_dir / "posts/sign/index.md").read_text().count('author: "eier"') == 1
r = client.post(
@ -331,7 +333,7 @@ def test_signature_from_profile(client, cfg):
)
assert r.status_code == 302
html = client.get("/sign/").text
assert " Ole M." in html and 'href="mailto:ole@example.no"' in html
assert ">Ole M.</a>" in html and 'href="mailto:ole@example.no"' in html
assert "<dc:creator>Ole M.</dc:creator>" in client.get("/feed.xml").text
assert (
client.post(
@ -362,7 +364,12 @@ def test_tags(client, cfg):
assert 'href="../tag/friluftsliv/"' in client.get("/en/").text
page = client.get("/tag/friluftsliv/").text
assert "tagg: friluftsliv" in page.lower() and ">En<" in page and ">To<" in page and ">Tre<" not in page
assert (
"tagg: friluftsliv" in page.lower()
and ">En<" in page
and ">To<" in page
and ">Tre<" not in page
)
assert client.get("/tag/skog/").status_code == 200
assert client.get("/tag/").status_code == 200 and "(2)" in client.get("/tag/").text
assert "<category>skog</category>" in client.get("/feed.xml").text
@ -370,3 +377,54 @@ def test_tags(client, cfg):
# "tag" er reservert som slug
publish("tag", "")
assert not (cfg.content_dir / "posts/tag").exists()
def test_user_pages(client, cfg):
login(client)
token = csrf(client)
client.post(
"/admin/profile",
data={
"csrf": token,
"display_name": "Ole",
"email": "",
"bio": "Skriver om **skog**.\n\n<b>x</b>",
},
)
r = client.post("/admin/new", data={"csrf": token})
pid = r.headers["Location"].split("/admin/edit/")[1]
client.post(
f"/admin/edit/{pid}",
data={"csrf": token, "title": "Mitt", "body": "x", "action": "publish"},
)
client.post(
"/admin/users",
data={
"csrf": token,
"action": "create",
"username": "aa",
"display_name": "Åse",
"password": "passord123",
},
)
lst = client.get("/brukere/").text
order = [n for n in ("Ole", "Gjest En", "Åse") if n in lst]
assert [lst.index(n) for n in order] == sorted(
lst.index(n) for n in order
) # eier, så Gjest En, Åse
assert lst.index("Ole") < lst.index("Gjest En") < lst.index("Åse")
page = client.get("/brukere/eier/").text
assert "<strong>skog</strong>" in page and "&lt;b&gt;" in page # markdown, ikke rå HTML
assert ">Mitt<" in page and "Hovedbruker" in page
assert "Ingen innlegg ennå" in client.get("/brukere/gjest1/").text
assert 'href="../brukere/eier/"' in client.get("/mitt/").text # signatur lenker til brukersiden
assert "https://blog.example.no/brukere/eier/" in client.get("/sitemap.xml").text
# "brukere" er reservert som slug
r = client.post("/admin/new", data={"csrf": token})
pid = r.headers["Location"].split("/admin/edit/")[1]
client.post(
f"/admin/edit/{pid}",
data={"csrf": token, "title": "brukere", "body": "x", "action": "publish"},
)
assert not (cfg.content_dir / "posts/brukere").exists()