first working version

This commit is contained in:
2026-10-08 11:33:52 +02:00
commit a47ea8c8ed
5 changed files with 240 additions and 0 deletions
+43
View File
@@ -0,0 +1,43 @@
import json
import markdown
from tinyhtml import h, raw, render
from stellenangebot import Stellenangebot
def render_html(data: tuple[Stellenangebot, float]) -> str:
job_data, score = data
description = job_data.get("stellenangebotsBeschreibung", "")
description_html = markdown.markdown(description, extensions=["nl2br"])
job_fields = []
for field_name, field_value in job_data.items():
if field_name in ("stellenangebotsTitel", "stellenangebotsBeschreibung"):
continue
if isinstance(field_value, (dict, list)):
field_value = json.dumps(field_value, ensure_ascii=False)
job_fields.append(h("p")(f"{field_name}: {field_value}"))
job_section = h("section")(
h("h1")(f"{job_data.get('stellenangebotsTitel', '')} - {score:.2f}"),
h("div")(raw(description_html)),
h("hr"),
*job_fields,
)
return render(job_section)
def write_html(html_parts: list[str]) -> None:
stylesheet_link = '<link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css">'
html_document = render(
h("html")(
h("head")(raw(stylesheet_link)),
h("body")(*[raw(html_part) for html_part in html_parts]),
)
)
with open("stellenangebote.html", mode="w", encoding="utf-8") as html_file:
html_file.write(html_document)
html_file.write("\n")
+62
View File
@@ -0,0 +1,62 @@
from typing import TypedDict
class Eintrittszeitraum(TypedDict, total=False):
von: str # Date string in format 'YYYY-MM-DD'
class Veroeffentlichungszeitraum(TypedDict):
von: str # Date string in format 'YYYY-MM-DD'
class Adresse(TypedDict):
plz: str
ort: str
region: str
land: str
class Stellenlokation(TypedDict):
adresse: Adresse
breite: float
laenge: float
class Stellenangebot(TypedDict, total=False):
stellenangebotsart: str
stellenangebotsTitel: str
quereinstiegGeeignet: bool
stellenangebotsBeschreibung: str
arbeitszeitSchichtNachtWochenende: bool
arbeitszeitTeilzeitAbend: bool
arbeitszeitTeilzeitNachmittag: bool
arbeitszeitTeilzeitVormittag: bool
arbeitszeitTeilzeitFlexibel: bool
arbeitszeitVollzeit: bool
eintrittszeitraum: Eintrittszeitraum
verguetungsangabe: str
vertragsdauer: str
istGeringfuegigeBeschaeftigung: bool
istBehinderungGefordert: bool
stellenlokationen: list[Stellenlokation]
homeofficemoeglich: bool
homeofficetyp: str
veroeffentlichungszeitraum: Veroeffentlichungszeitraum
datumErsteVeroeffentlichung: str # Date string in format 'YYYY-MM-DD'
aenderungsdatum: str # Datetime string in ISO format
istBetreut: bool
hauptberuf: str
alternativBeruf1: str
firma: str
arbeitgeberKundennummerHash: str
allianzpartnerUrl: str
allianzpartnerName: str
referenznummer: str
class JobSearchResult(TypedDict):
referenznummer: str
class JobSearchResponse(TypedDict):
ergebnisliste: list[JobSearchResult]