From fe949b9f33fe3c799827448bdda96048fa738187 Mon Sep 17 00:00:00 2001 From: darta Date: Tue, 25 Jan 2022 22:54:54 +0100 Subject: [PATCH] feat(admin): added legal pages --- admin/src/admin/lib/legal.py | 82 ++++++++++++++++ admin/src/admin/static/js/legal.js | 89 +++++++++++++++++ .../static/templates/aux/text-editor.html | 98 +++++++++++++++++++ .../admin/static/templates/pages/legal.html | 81 +++++++++++++++ admin/src/admin/views/ApiViews.py | 29 ++++++ admin/src/admin/views/WebViews.py | 8 +- 6 files changed, 386 insertions(+), 1 deletion(-) create mode 100644 admin/src/admin/lib/legal.py create mode 100644 admin/src/admin/static/js/legal.js create mode 100644 admin/src/admin/static/templates/aux/text-editor.html create mode 100644 admin/src/admin/static/templates/pages/legal.html diff --git a/admin/src/admin/lib/legal.py b/admin/src/admin/lib/legal.py new file mode 100644 index 0000000..65caab3 --- /dev/null +++ b/admin/src/admin/lib/legal.py @@ -0,0 +1,82 @@ +import logging as log +import os +from pprint import pprint + +from minio import Minio +from minio.commonconfig import REPLACE, CopySource +from minio.deleteobjects import DeleteObject +from requests import get, post + +from admin import app + + +class Avatars: + def __init__(self): + self.mclient = Minio( + "isard-sso-avatars:9000", + access_key="AKIAIOSFODNN7EXAMPLE", + secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + secure=False, + ) + self.bucket = "master-avatars" + self._minio_set_realm() + # self.update_missing_avatars() + + def add_user_default_avatar(self, userid, role="unknown"): + self.mclient.fput_object( + self.bucket, + userid, + os.path.join(app.root_path, "../custom/avatars/" + role + ".jpg"), + content_type="image/jpeg ", + ) + log.warning( + " AVATARS: Updated avatar for user " + userid + " with role " + role + ) + + def delete_user_avatar(self, userid): + self.minio_delete_object(userid) + + def update_missing_avatars(self, users): + sys_roles = ["admin", "manager", "teacher", "student"] + for u in self.get_users_without_image(users): + try: + img = [r + ".jpg" for r in sys_roles if r in u["roles"]][0] + except: + img = "unknown.jpg" + + self.mclient.fput_object( + self.bucket, + u["id"], + os.path.join(app.root_path, "../custom/avatars/" + img), + content_type="image/jpeg ", + ) + log.warning( + " AVATARS: Updated avatar for user " + + u["username"] + + " with role " + + img.split(".")[0] + ) + + def _minio_set_realm(self): + if not self.mclient.bucket_exists(self.bucket): + self.mclient.make_bucket(self.bucket) + + def minio_get_objects(self): + return [o.object_name for o in self.mclient.list_objects(self.bucket)] + + def minio_delete_all_objects(self): + delete_object_list = map( + lambda x: DeleteObject(x.object_name), + self.mclient.list_objects(self.bucket), + ) + errors = self.mclient.remove_objects(self.bucket, delete_object_list) + for error in errors: + log.error(" AVATARS: Error occured when deleting avatar object: " + error) + + def minio_delete_object(self, oid): + errors = self.mclient.remove_objects(self.bucket, [DeleteObject(oid)]) + for error in errors: + log.error(" AVATARS: Error occured when deleting avatar object: " + error) + + def get_users_without_image(self, users): + return [u for u in users if u["id"] and u["id"] not in self.minio_get_objects()] diff --git a/admin/src/admin/static/js/legal.js b/admin/src/admin/static/js/legal.js new file mode 100644 index 0000000..f33c44b --- /dev/null +++ b/admin/src/admin/static/js/legal.js @@ -0,0 +1,89 @@ +$(document).ready(function () { + init_wysiwyg(); + + var lang = getCookie('KEYCLOAK_LOCALE') ? getCookie('KEYCLOAK_LOCALE') : 'ca' + $('#legal-lang').val(lang) + getLangLegal(lang) + // $('#privacy-lang').val(lang) + + // $.ajax({ + // type: "GET", + // url: "/api/legal/privacy", + // data: { + // lang: lang + // }, + // success: function (data) { + // $('#editor-privacy').html(data.html) + // } + // }) + + $("#save-legal").click(function () { + $.ajax({ + type: "POST", + url: "/api/legal/legal", + data: { + 'html': $('#editor-legal').cleanHtml(), + 'lang': $('#legal-lang').val() + }, + success: function () { + }, + }); + }); + + $('#legal-lang').on('change', function() { + getLangLegal(this.value) + }); + + // $("#save-privacy").click(function () { + // $.ajax({ + // type: "POST", + // url: "/api/legal/privacy", + // data: { + // 'html': $('#editor-privacy').cleanHtml(), + // 'lang': $('#legal-lang').val() + // }, + // success: function () { + // }, + // }); + // }); +}); + +function getLangLegal(lang) { + $.ajax({ + type: "GET", + url: "/api/legal/legal", + data: { + lang: lang + }, + success: function (data) { + $('#editor-legal').html(data.html) + } + }) +} + +function getCookie(cname) { + let name = cname + "="; + let decodedCookie = decodeURIComponent(document.cookie); + let ca = decodedCookie.split(';'); + for(let i = 0; i +
+
+ +
+ +
+ +
+   + +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + +
+
+ +
+ + + diff --git a/admin/src/admin/static/templates/pages/legal.html b/admin/src/admin/static/templates/pages/legal.html new file mode 100644 index 0000000..bb18b68 --- /dev/null +++ b/admin/src/admin/static/templates/pages/legal.html @@ -0,0 +1,81 @@ + +{% extends "base.html" %} {% block css %} + + + + + + + +{% endblock %} {% block content %} + + +
+ +
+
+
+

LegalCompany/School

+
+
+
+ {% with type = 'legal' %} + {% include 'aux/text-editor.html' %} + {% endwith %} +
+ +
+
+
+
+
+ + + {% endblock %} {% block pagescript %} + + + + + + {% endblock %} + diff --git a/admin/src/admin/views/ApiViews.py b/admin/src/admin/views/ApiViews.py index 2d9de31..0f4821a 100644 --- a/admin/src/admin/views/ApiViews.py +++ b/admin/src/admin/views/ApiViews.py @@ -509,3 +509,32 @@ def dashboard_put(item): 500, {"Content-Type": "application/json"}, ) + +@app.route("/api/legal/", methods=["GET", "POST"]) +# @login_required +def legal_put(item): + if request.method == "GET": + if item == "legal": + lang = request.args.get("lang") + return json.dumps({ "html": "Legal
This works! in lang: "+lang}), 200, {'Content-Type': 'application/json'} + # if item == "privacy": + # return json.dumps({ "html": "Privacy policy
This works!"}), 200, {'Content-Type': 'application/json'} + if request.method == "POST": + if item == "legal": + data = None + try: + data = request.json + html = data["html"] + lang = data["lang"] + except: + log.error(traceback.format_exc()) + return json.dumps(data), 200, {'Content-Type': 'application/json'} + # if item == "privacy": + # data = None + # try: + # data = request.json + # html = data["html"] + # lang = data["lang"] + # except: + # log.error(traceback.format_exc()) + # return json.dumps(data), 200, {'Content-Type': 'application/json'} diff --git a/admin/src/admin/views/WebViews.py b/admin/src/admin/views/WebViews.py index 55be5c5..37c62f7 100644 --- a/admin/src/admin/views/WebViews.py +++ b/admin/src/admin/views/WebViews.py @@ -86,13 +86,19 @@ def avatar(userid): @app.route("/dashboard") -# @login_required +@login_required def dashboard(provider=False): data = json.loads(requests.get("http://isard-sso-api/json").text) return render_template( "pages/dashboard.html", title="Customization", nav="Customization", data=data ) +@app.route("/legal") +@login_required +def legal(): + # data = json.loads(requests.get("http://isard-sso-api/json").text) + return render_template("pages/legal.html", title="Legal", nav="Legal", data={}) + ### SYS ADMIN