diff --git a/api/directus.py b/api/directus.py index 13a45e0..1c9bd4d 100644 --- a/api/directus.py +++ b/api/directus.py @@ -4,8 +4,9 @@ import requests class DirectusAPI: - def __init__(self, config): - self.config = config + def __init__(self, base_url, access_token): + self.base_url = base_url + self.access_token = access_token def __get_raw(self, endpoint, params = None): if params is None: @@ -13,12 +14,12 @@ class DirectusAPI: for k in params.keys(): if type(params[k]) is dict: params[k] = json.dumps(params[k]) - url = self.config.base_url + endpoint + url = self.base_url + endpoint result = requests.get( url, params = params, headers = { - "Authorization": f"Bearer {self.config.access_token}", + "Authorization": f"Bearer {self.access_token}", "Cache-Control": "no-store" } ) diff --git a/build.py b/build.py index 435fa6c..f86c6e7 100644 --- a/build.py +++ b/build.py @@ -4,8 +4,9 @@ import src.config as config import src.download as download conf = config.Config() -api = directus.DirectusAPI(conf) -dl = download.Download(api, conf) +api = directus.DirectusAPI(conf.question_base_url, conf.question_access_token) +content_api = directus.DirectusAPI(conf.content_base_url, conf.content_access_token) +dl = download.Download(api, content_api, conf) bd = build.Build() # Download the text files: @@ -16,9 +17,10 @@ dl.download_question_metadata() dl.download_pictures() dl.download_photos() dl.download_includes() +dl.download_snippets() +dl.download_content() -# Build edition: +# Build Everything: +bd.build_website() bd.build_edition("N") - -# Build assets: bd.build_assets() diff --git a/config/config.json.example b/config/config.json.example index 4b9e98b..9392a7c 100644 --- a/config/config.json.example +++ b/config/config.json.example @@ -1,4 +1,7 @@ { - "directus_base_url" : "https://fragenkatalog.darc.de/", + "directus_question_base_url" : "https://fragenkatalog.darc.de/", + "directus_question_api_key" : "", + "directus_content_base_url" : "https://redaktion.50ohm.de/", + "directus_content_api_key" : "", "no_latex": true } diff --git a/src/build.py b/src/build.py index a6f8ebc..a4990ca 100644 --- a/src/build.py +++ b/src/build.py @@ -2,7 +2,6 @@ import json import os import shutil -from bs4 import BeautifulSoup from jinja2 import Environment, FileSystemLoader from joblib import Memory from mistletoe import Document @@ -22,7 +21,7 @@ class Build: self.__build_chapter = memory.cache(self.__build_chapter) self.__build_section = memory.cache(self.__build_section) self.__build_page = memory.cache(self.__build_page) - + def __parse_katalog(self): with open("data/fragenkatalog3b.json") as fragenkatalog_file: fragenkatalog = json.load(fragenkatalog_file) @@ -90,9 +89,13 @@ class Build: ) # cached - def __build_page(self, content) : + def __build_page(self, content, course_wrapper=False, sidebar=None) : page_template = self.env.get_template("page.html") - return page_template.render(content=content) + return page_template.render( + content=content, + course_wrapper=course_wrapper, + sidebar=sidebar + ) def __picture_handler(self, id): os.makedirs("build/pictures", exist_ok=True) @@ -124,8 +127,7 @@ class Build: title=next_chapter["title"], ) - result = self.__build_page(result) - result = BeautifulSoup(result, "html.parser").prettify() + result = self.__build_page(result, course_wrapper=True) file.write(result) def __include_handler(self, include): @@ -166,8 +168,7 @@ class Build: title=next_chapter["title"], ) - result = self.__build_page(result) - result = BeautifulSoup(result, "html.parser").prettify() + result = self.__build_page(result, course_wrapper=True) file.write(result) def __build_book_index(self, book): @@ -177,7 +178,6 @@ class Build: book=book, ) result = self.__build_page(result) - result = BeautifulSoup(result, "html.parser").prettify() file.write(result) def build_edition(self, edition): @@ -197,4 +197,57 @@ class Build: self.__build_section(edition, edition_name, section, chapter, next_section, next_chapter) def build_assets(self): - shutil.copytree("assets", "build/assets", dirs_exist_ok=True) \ No newline at end of file + shutil.copytree("assets", "build/assets", dirs_exist_ok=True) + + def __parse_snippets(self): + with open("data/snippets.json") as f: + snippets = json.load(f) + + with FiftyOhmHtmlRenderer(self.__build_question, self.__picture_handler, self.__photo_handler) as renderer: + for key, value in snippets.items(): + snippets[key] = renderer.render_inner(Document(value)) + # Remove leading
and trailing
: + snippets[key] = snippets[key][3:-4] + return snippets + + def __parse_contents(self): + with open("data/content.json") as f: + contents = json.load(f) + return contents + + def __build_index(self, snippets): + template = self.env.get_template("index.html") + result = template.render({"snippets": snippets}) + + with open("build/index.html", "w") as file: + result = self.__build_page(result) + + file.write(result) + + def __build_course_page(self, snippets, template, page): + template = self.env.get_template(f"{template}.html") + result=template.render({"snippets": snippets}) + + with open(f"build/{page}.html", "w") as file: + result = self.__build_page(result) + file.write(result) + + def __build_html_page(self, contents, page): + for content in contents: + if content["url_part"] == page: + with open(f"build/{page}.html", "w") as file: + result = self.__build_page( + content=content["content"], + sidebar=content["sidebar"] + ) + file.write(result) + + def build_website(self): + snippets = self.__parse_snippets() + contents = self.__parse_contents() + self.__build_index(snippets) + self.__build_course_page(snippets, "kurse-karte", "kurse_vor_ort_karte") + self.__build_course_page(snippets, "kurse-liste", "kurse_vor_ort_liste") + self.__build_course_page(snippets, "patenkarte", "patenkarte") + self.__build_html_page(contents, "pruefung") + self.__build_html_page(contents, "infos") \ No newline at end of file diff --git a/src/config.py b/src/config.py index ae69389..ef1f6c2 100644 --- a/src/config.py +++ b/src/config.py @@ -13,8 +13,10 @@ class Config: with open("config/config.json") as file: self.config = json.load(file) - self.access_token = self.get_config_value("directus_api_key") - self.base_url = self.get_config_value("directus_api_url", "https://fragenkatalog.darc.de/") + self.question_access_token = self.get_config_value("directus_question_api_key") + self.question_base_url = self.get_config_value("directus_question_base_url", "https://fragenkatalog.darc.de/") + self.content_access_token = self.get_config_value("directus_content_api_key") + self.content_base_url = self.get_config_value("directus_content_base_url", "https://redaktion.50ohm.de/") self.no_latex = self.get_config_value("no_latex", False) def get_config_value(self, key: str, default=None): diff --git a/src/download.py b/src/download.py index 521a3c2..9295825 100644 --- a/src/download.py +++ b/src/download.py @@ -8,9 +8,10 @@ from tqdm import tqdm class Download: - def __init__(self, api, config): + def __init__(self, api, content_api, config): self.api = api self.config = config + self.content_api = content_api def download_edition(self, edition): in_edition = self.api.get_one("items/edition", {"filter": {"ident": {"_eq": edition}}}) @@ -141,3 +142,24 @@ class Download: with open("data/includes.json", "w") as f: json.dump(result, f, indent=4) + + def download_snippets(self): + snippets = {} + for snippet in tqdm(self.content_api.get("items/snippet"), desc="Downloading snippets"): + snippets[snippet["ident"]] = snippet["content"] + with open("data/snippets.json", "w", encoding="utf-8") as file: + json.dump(snippets, file, ensure_ascii=False, indent=4) + + def download_content(self): + contents = [] + for content in self.content_api.get("items/content"): #tqdm(self.content_api.get("items/content"), desc="Downloading content"): + contents.append( + { + "url_part": content["url_part"], + "content": content["content"], + "sidebar": content["sidebar"], + } + ) + + with open("data/content.json", "w", encoding="utf-8") as file: + json.dump(contents, file, ensure_ascii=False, indent=4) diff --git a/templates/html/index.html b/templates/html/index.html new file mode 100644 index 0000000..1ded1eb --- /dev/null +++ b/templates/html/index.html @@ -0,0 +1,184 @@ ++ {{ snippets.index_teaser }} +
+ ++
Bringe dir das nötige Wissen für die Amateurfunkprüfung einfach selber bei. Unser Lernmaterial hilft dir auf deinem Weg! Es gibt die drei Klassen N, E und A, die aufeinander aufbauen.
+Diese Kurse richten sich an alle, die noch kein Amateurfunkzeugnis haben.
+ +Für alle, die schon über ein Amateurfunkzeugnis der Klasse N oder E verfügen, gibt es folgende Aufbaukurse:
+ +Tauchen beim Selbststudium Fragen auf? Unsere ehrenamtlichen Helfer bieten für DARC-Mitglieder eine Fragestunde auf dem DARC-Videokonferenzserver an.
+ +Der DARC e. V. betreibt eine eigene Matrix-Instanz. Dort gibt es Räume, in denen du deine Fragen stellen kannst (🌍 öffentlich, d. h. auch von anderen Matrix-Servern erreichbar, und 🔐 nur für Mitglieder):
+ +Der DARC e. V. unterstützt Dich auf deinem Weg zum Amateurfunkzeugnis und ist die größte Interessensvertretung der Funkamateure in Deutschland.
+ +In Zusammenarbeit mit DL2YMR ist ein Videokurs für die Klasse N entstanden, der auf seinem YouTube-Kanal abrufbar ist.
+
+
+ Die Lernhinhalte für die Klasse N gibt es auch als gedrucktes Buch. Es ist passend zum Online-Kurs ausgelegt.
+ +Einige unserer Ortsverbände bieten Präsenz- oder Onlinekurse mit erfahrenen Ausbildern an. Finde heraus, ob es einen für dich passenden Kurs bei dir in der Nähe gibt!
+ +Unsere Ausbildungspaten sind erfahrene Funkamateure, die dich gerne unterstützen. Sie können mit dir auch praktischen üben und nützliche Tipps für die Praxis geben.
+Den Fragenkatalog mit den amtlichen Prüfungsfragen gibt es digital bei der Bundesnetzagentur. Beim DARC-Verlag kann man auch eine gedruckte Version bestellen.
+ +Erfahrene Ausbilder halten – meist einmal in der Woche abends – Lektionen. Zwischen den Treffen solltest du selbständig den Lernstoff vertiefen und üben.
+ + + Online-Kurse + +
+ neu
+
+ läuft
+
+ auf Anfrage
+
+ neu
+
+ läuft
+ Erfahrene Ausbilder halten – meist einmal in der Woche abends – Lektionen. Zwischen den Treffen solltest du selbständig den Lernstoff vertiefen und üben.
+ + +Kartenansicht + +