Ross Mountjoy 83c19616cc more v0.5 features
- users can now override global settings
- added update message
2020-03-21 12:18:07 -04:00

136 lines
4.0 KiB
Python
Executable File

import os
import importlib
from shutil import copyfile
from PIL import Image
from markdown2 import markdown
from dashmachine.paths import (
dashmachine_folder,
images_folder,
root_folder,
user_data_folder,
)
from dashmachine.main.models import Groups
from dashmachine.main.read_config import read_config
from dashmachine.version import version as dashmachine_version
from dashmachine import db
def row2dict(row):
d = {}
for column in row.__table__.columns:
d[column.name] = str(getattr(row, column.name))
return d
# establishes routes decorated w/ @public_route as accessible while not signed
# in. See login and register routes for usage
def public_route(decorated_function):
decorated_function.is_public = True
return decorated_function
def dashmachine_init():
resize_template_app_images()
db.create_all()
db.session.commit()
user_data_folder = os.path.join(dashmachine_folder, "user_data")
# create the user_data subdirectories, link them to static
user_backgrounds_folder = os.path.join(user_data_folder, "backgrounds")
backgrounds_folder = os.path.join(images_folder, "backgrounds")
if not os.path.isdir(user_backgrounds_folder):
os.mkdir(user_backgrounds_folder)
if not os.path.isdir(backgrounds_folder):
os.symlink(user_backgrounds_folder, backgrounds_folder)
user_icons_folder = os.path.join(user_data_folder, "icons")
icons_folder = os.path.join(images_folder, "icons")
if not os.path.isdir(user_icons_folder):
os.mkdir(user_icons_folder)
if not os.path.isdir(icons_folder):
os.symlink(user_icons_folder, icons_folder)
config_file = os.path.join(user_data_folder, "config.ini")
if not os.path.exists(config_file):
copyfile("default_config.ini", config_file)
read_config()
def check_groups(groups, current_user):
if current_user.is_anonymous:
current_user.role = "public_user"
if groups:
groups_list = groups.split(",")
roles_list = []
for group in groups_list:
group = Groups.query.filter_by(name=group.strip()).first()
for group_role in group.roles.split(","):
roles_list.append(group_role.strip())
if current_user.role in roles_list:
return True
else:
return False
else:
if current_user.role == "admin":
return True
else:
return False
def get_data_source(data_source):
data_source_args = {}
for arg in data_source.args:
arg = row2dict(arg)
data_source_args[arg.get("key")] = arg.get("value")
data_source = row2dict(data_source)
module = importlib.import_module(
f"dashmachine.platform.{data_source['platform']}", "."
)
platform = module.Platform(data_source, **data_source_args)
return platform.process()
def resize_template_app_images():
folder = os.path.join(images_folder, "apps")
for file in os.listdir(folder):
fp = os.path.join(folder, file)
image = Image.open(fp)
image.thumbnail((64, 64))
image.save(fp)
def get_update_message_html():
try:
with open(os.path.join(user_data_folder, ".has_read_update"), "r") as has_read:
has_read_version = has_read.read()
except FileNotFoundError:
has_read_version = None
if not has_read_version or has_read_version.strip() != dashmachine_version:
with open(
os.path.join(root_folder, "update_message.md"), "r"
) as update_message:
md = update_message.read()
config_html = markdown(
md,
extras=[
"tables",
"fenced-code-blocks",
"break-on-newline",
"header-ids",
"code-friendly",
],
)
return config_html
else:
return ""
def mark_update_message_read():
with open(os.path.join(user_data_folder, ".has_read_update"), "w") as has_read:
has_read.write(dashmachine_version)