diff --git a/.drone.yml b/.drone.yml index d9de81b..58d5ea5 100644 --- a/.drone.yml +++ b/.drone.yml @@ -16,4 +16,17 @@ steps: from_secret: REGISTRY_PASSWORD registry: harbor.voidcorp.nl repo: library/galerie - tags: latest \ No newline at end of file + tags: latest +- name: kaniko + image: ghcr.io/finitum/drone-kaniko:0.7.0 + when: + branch: [test] + settings: + cache: true + username: + from_secret: REGISTRY_USER + password: + from_secret: REGISTRY_PASSWORD + registry: harbor.voidcorp.nl + repo: library/galerie + tags: test \ No newline at end of file diff --git a/.gitignore b/.gitignore index d186de5..3562f45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,226 +1,2 @@ - -# Created by https://www.gitignore.io/api/python,pycharm+all -# Edit at https://www.gitignore.io/?templates=python,pycharm+all - -### PyCharm+all ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/modules.xml -# .idea/*.iml -# .idea/modules - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### PyCharm+all Patch ### -# Ignores the whole .idea folder and all .iml files -# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 - -.idea/ - -# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 - -*.iml -modules.xml -.idea/misc.xml -*.ipr - -### Python ### -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ +.vscode/ dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -### Python Patch ### -.venv/ - -# End of https://www.gitignore.io/api/python,pycharm+all - - -# Created by https://www.gitignore.io/api/visualstudiocode -# Edit at https://www.gitignore.io/?templates=visualstudiocode - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history - -# End of https://www.gitignore.io/api/visualstudiocode - -.pw -venv*/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index fc0ed46..3c2d800 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8-alpine +FROM python:3.8-alpine as build WORKDIR /app @@ -6,13 +6,14 @@ COPY Pipfile* /app/ RUN pip install pipenv && pipenv install --system -COPY . /app +COPY app.py /app/app.py +COPY templates/ /app/templates +COPY data/ /app/data +RUN python ./app.py -RUN date +%d-%m-%Y > /app/date +FROM nginx:1.19-alpine -WORKDIR /app +COPY nginx.conf /etc/nginx/conf.d/default.conf -EXPOSE 8000 - -CMD ["gunicorn", "-w 1", "-b 0.0.0.0", "app:app"] \ No newline at end of file +COPY --from=build /app/dist/ /usr/share/nginx/html/ diff --git a/Pipfile b/Pipfile index 83094fa..1d6852d 100644 --- a/Pipfile +++ b/Pipfile @@ -6,9 +6,8 @@ verify_ssl = true [dev-packages] [packages] -flask = "*" markdown2 = "*" -gunicorn = "*" +jinja2 = "*" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index d0c0afa..a158737 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9ecf6795e5fa6da82ef3858427f44b9ea7a966714a8da293c0bb16584c7e8a54" + "sha256": "1e15c77e0335394662f026bdcdeb19c891f9075651a00d0c890152608725a758" }, "pipfile-spec": 6, "requires": { @@ -16,44 +16,12 @@ ] }, "default": { - "click": { - "hashes": [ - "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", - "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==7.1.2" - }, - "flask": { - "hashes": [ - "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", - "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" - ], - "index": "pypi", - "version": "==1.1.2" - }, - "gunicorn": { - "hashes": [ - "sha256:1904bb2b8a43658807108d59c3f3d56c2b6121a701161de0ddf9ad140073c626", - "sha256:cd4a810dd51bf497552cf3f863b575dabd73d6ad6a91075b65936b151cbf4f9c" - ], - "index": "pypi", - "version": "==20.0.4" - }, - "itsdangerous": { - "hashes": [ - "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", - "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.1.0" - }, "jinja2": { "hashes": [ "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "index": "pypi", "version": "==2.11.2" }, "markdown2": { @@ -102,14 +70,6 @@ ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.1.1" - }, - "werkzeug": { - "hashes": [ - "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", - "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.0.1" } }, "develop": {} diff --git a/app.py b/app.py index aeb96b9..ad599a2 100644 --- a/app.py +++ b/app.py @@ -1,110 +1,136 @@ # -*- coding: UTF-8 -*- -from datetime import datetime from os.path import exists, splitext +import os +from datetime import date -from flask import Flask, render_template, Markup, redirect, send_file, send_from_directory from markdown2 import markdown -app = Flask(__name__, static_url_path="", static_folder="static") +import shutil + +from jinja2 import Environment, FileSystemLoader +env = Environment( + loader=FileSystemLoader("./templates") +) + +def render(filename): + return markdown( + "".join(open("data/" + filename, encoding="UTF-8").readlines()), + use_file_vars=True, + extras=["use-file-vars", "tables"]) + file_exts = [".html", ".md", ".txt", ".pdf", ""] -update = open("date", encoding="UTF-8").readline() -tijden = Markup( - markdown("".join(open("data/tijden.md", encoding="UTF-8").readlines()), - use_file_vars=True, - extras=["use-file-vars", "tables"])) -nieuws = Markup( - markdown("".join(open("data/nieuws.md", encoding="UTF-8").readlines()), - use_file_vars=True, - extras=["use-file-vars", "tables"])) -renders = dict() +update = date.today() +tijden = render("tijden.md") +nieuws = render("nieuws.md") -@app.context_processor -def inject_now(): - return {'now': datetime.utcnow().year, +inject_now = {'now': date.today().year, 'tijden': tijden, 'nieuws': nieuws, 'update': update} -def render(filename): - return Markup(markdown( - "".join(open("data/" + filename, encoding="UTF-8").readlines()), - use_file_vars=True, - extras=["use-file-vars", "tables"])) - # if filename in renders: - # return renders[filename] - # else: - # ren = "" - # renders[filename] = ren - # return ren -@app.route('/') -def index(): - return render_template("index.html", content=render("content.md")) +# @app.route('/') +# def index(): +# return render_template("index.html", content=render("content.md")) -@app.route("/") -def site(url: str): - # error handling - if url.startswith("hoofdexpo") or url.startswith("fotos"): - return redirect("/schilderijen", 301) - if url.startswith("boek&foto"): - return redirect("/boekenmeer", 301) - if url.endswith(".html"): - return redirect(url.rstrip(".html"), 301) +# @app.route("/") +# def site(url: str): +# # error handling +# if url.startswith("hoofdexpo") or url.startswith("fotos"): +# return redirect("/schilderijen", 301) +# if url.startswith("boek&foto"): +# return redirect("/boekenmeer", 301) +# if url.endswith(".html"): +# return redirect(url.rstrip(".html"), 301) - if url.endswith(".ico"): - return send_from_directory("static", url) +# if url.endswith(".ico"): +# return send_from_directory("static", url) - # actual code - if url == "content": - return redirect("/", 301) - if exists("data/" + url.lstrip("/") + ".md"): - filename = url.lstrip("/") + ".md" - else: - filename = "404.md" +# # actual code +# if url == "content": +# return redirect("/", 301) +# if exists("data/" + url.lstrip("/") + ".md"): +# filename = url.lstrip("/") + ".md" +# else: +# filename = "404.md" - return render_template("index.html", - content=render(filename)) +# return render_template("index.html", +# content=render(filename)) -@app.route("/archief/") -def archief(url: str): - if url == "content": - return redirect("/") - filename = "" - ex = "" - url, _ = splitext(url) - print(url) - - for ext in file_exts: - print("data/archief/" + url + ext) - if exists("data/archief/" + url + ext): - filename = "data/archief/" + url + ext - ex = ext - break - if filename == "": - filename = "data/404.md" - ex = ".md" - if ex == ".html": - return Markup("".join(open("data/archief/" + url + ".html", encoding="utf-8").readlines())) - elif ex == ".md": - return render_template("index.html", - content=Markup(markdown("".join(open(filename, encoding="UTF-8").readlines()), - use_file_vars=True, - extras=["use-file-vars"]))) - elif ex == ".txt": - return render_template("index.html", content="".join(open(filename, encoding="UTF-8").readlines())) - elif ex == ".pdf": - return send_file("data/archief/" + url + ".pdf", mimetype="application/pdf") - else: - return render_template("index.html", content="".join(open(filename, encoding="UTF-8").readlines())) +# @app.route("/archief/") +# def archief(url: str): +# if url == "content": +# return redirect("/") +# filename = "" +# ex = "" +# url, _ = splitext(url) +# print(url) +# for ext in file_exts: +# print("data/archief/" + url + ext) +# if exists("data/archief/" + url + ext): +# filename = "data/archief/" + url + ext +# ex = ext +# break +# if filename == "": +# filename = "data/404.md" +# ex = ".md" +# if ex == ".html": +# return Markup("".join(open("data/archief/" + url + ".html", encoding="utf-8").readlines())) +# elif ex == ".md": +# return render_template("index.html", +# content=Markup(markdown("".join(open(filename, encoding="UTF-8").readlines()), +# use_file_vars=True, +# extras=["use-file-vars"]))) +# elif ex == ".txt": +# return render_template("index.html", content="".join(open(filename, encoding="UTF-8").readlines())) +# elif ex == ".pdf": +# return send_file("data/archief/" + url + ".pdf", mimetype="application/pdf") +# else: +# return render_template("index.html", content="".join(open(filename, encoding="UTF-8").readlines())) if __name__ == '__main__': - app.run(host="0.0.0.0", port=5667) + # app.run(host="0.0.0.0", port=5667) + t = env.get_template("index.html") + if exists("./dist"): + shutil.rmtree("./dist") + os.makedirs("./dist") + for d in os.listdir("./data/"): + d = d.replace(".md", "") + if d == "content": + f = open(f"./dist/index.html", "w", encoding="utf-8") + r = t.render(content=render(f"{d}.md"), request={'path': f"/"}, **inject_now) + f.write(r) + f.close() + else: + f = open(f"./dist/{d}.html", "w", encoding="utf-8") + r = t.render( content=render(f"{d}.md"), request={'path': f"/{d}"}, **inject_now) + f.write(r) + f.close() + os.makedirs("./dist/archief") + for d in os.listdir("./data/archief"): + name,ext = splitext(d) + if ext in [".html", ".pdf"]: + shutil.copyfile(f"./data/archief/{d}", f"./dist/archief/{d}") + elif ext == ".txt": + d = d.replace(".txt", "") + # print(d) + r = t.render( content=render(f"archief/{d}.txt"), request={'url': f"/{d}"}, **inject_now) + f = open(f"./dist/archief/{d}.html", "w", encoding="utf-8") + f.write(r) + f.close() + elif ext == ".md": + d = d.replace(".md", "") + # print(d) + r = t.render( content=render(f"archief/{d}.md"), request={'url': f"/{d}"}, **inject_now) + f = open(f"./dist/archief/{d}.html", "w", encoding="utf-8") + f.write(r) + f.close() \ No newline at end of file diff --git a/data.json b/data.json deleted file mode 100644 index 42ad91d..0000000 --- a/data.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "default": "content.md", - "list": { - - }, - "comment": "USE UTC!!!!!! instead of CE(S)T" -} \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..c841c5b --- /dev/null +++ b/nginx.conf @@ -0,0 +1,28 @@ +server { + listen 80; + server_name localhost; + + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + try_files $uri.html $uri $uri/index.html + index index.html index.htm; + } + + # location /archief/ { + # root /usr/share/nginx/html/archief; + # try_files $uri.html $uri $uri/ + # index index.html index.htm; + # } + + error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + # error_page 500 502 503 504 /50x.html; + # location = /50x.html { + # root /usr/share/nginx/html; + # } +} \ No newline at end of file diff --git a/req.txt b/req.txt deleted file mode 100644 index fb22c49..0000000 Binary files a/req.txt and /dev/null differ