Optional config would not get parsed correctly, if you were noticing this issue, please use the web-ui to generate a new settings file. Improved readability by using f-strings to parse module key values.
146 lines
6.4 KiB
Python
146 lines
6.4 KiB
Python
from flask import render_template, flash, redirect, request, Response
|
|
from app import app
|
|
from app.forms import LoginForm
|
|
import json
|
|
|
|
from inkycal import Display
|
|
|
|
from .config_loader import get_all_config
|
|
|
|
settings = get_all_config()
|
|
|
|
# Home
|
|
@app.route('/')
|
|
@app.route('/index')
|
|
def index():
|
|
return render_template('index.html', title='Home')
|
|
|
|
# Wifi-setup
|
|
@app.route('/setup_wifi')
|
|
def wifi_setup():
|
|
return render_template('wifi.html', title='Wifi-setup')
|
|
|
|
|
|
# Inkycal-setup
|
|
@app.route('/inkycal-config-v2-0-0', methods=['GET', 'POST'])
|
|
|
|
def inkycal_config():
|
|
form = LoginForm()
|
|
if form.validate_on_submit():
|
|
|
|
# General epaper settings
|
|
model = request.form.get('model')
|
|
update_interval = int(request.form.get('update_interval'))
|
|
calibration_hour_1 = int(request.form.get('calibration_hour_1'))
|
|
calibration_hour_2 = int(request.form.get('calibration_hour_2'))
|
|
calibration_hour_3 = int(request.form.get('calibration_hour_3'))
|
|
orientation: int(request.form.get('orientation'))
|
|
language = request.form.get('language')
|
|
info_section = True if (request.form.get('info_section') == "on") else False
|
|
|
|
info_height = int(request.form.get('info_section_height')) if info_section == True else None
|
|
|
|
# template for basic settings
|
|
template = {
|
|
"model": model,
|
|
"update_interval": update_interval,
|
|
"orientation": int(request.form.get('orientation')),
|
|
"info_section": info_section,
|
|
"info_section_height": info_height,
|
|
"calibration_hours": [calibration_hour_1, calibration_hour_2, calibration_hour_3],
|
|
"modules": [],
|
|
}
|
|
|
|
|
|
# common module config (shared by all modules)
|
|
padding_x = int(request.form.get('padding_x'))
|
|
padding_y = int(request.form.get('padding_y'))
|
|
fontsize = int(request.form.get('fontsize'))
|
|
language = request.form.get('language')
|
|
|
|
common_settings = {"padding_x":padding_x, "padding_y":padding_y, "fontsize":fontsize, "language":language}
|
|
|
|
# loop over the modules, add their config data based on user selection, merge the common_settings into each module's config
|
|
no_of_modules = int(request.form.get("module_counter"))
|
|
|
|
# display size ---- Since Inkycal works in vertical mode (only), the width and height have to be flipped here
|
|
display_size = Display.get_display_size(model) # returns width,height but flipping these for vertical mode
|
|
height, width = int(display_size[0]), int(display_size[1])
|
|
|
|
# If info section was active, substract the height of the info section from the display height
|
|
if info_section == True:
|
|
height = height-info_height
|
|
|
|
# get all module heights, calculate single part
|
|
module_sizes = [int(request.form.get(f"module{i}_height")) for i in range(1, no_of_modules+1)]
|
|
|
|
if sum(module_sizes) != 0:
|
|
single_part = height / sum(module_sizes)
|
|
|
|
for i in range(1, no_of_modules+1):
|
|
conf = {}
|
|
module = 'selected_module'+str(i)
|
|
|
|
if request.form.get(module) != "None":
|
|
conf = {"position":i , "name": request.form.get(module), "config":{}}
|
|
|
|
for modules in settings:
|
|
if modules['name'] == request.form.get(module):
|
|
|
|
module_height = int( request.form.get(f"module{i}_height") )
|
|
conf['config']['size'] = (width, int(single_part*module_height) )
|
|
|
|
# Add required fields to the config of the module in question
|
|
# True/False choices are converted to string for some reason, leading to incorrect values
|
|
# Convert "True" to True, "False" to False and empty input to None
|
|
if 'requires' in modules:
|
|
for key in modules['requires']:
|
|
val = request.form.get(f'module{i}_{key}').replace(" ", "")
|
|
if val == "True":
|
|
val = True
|
|
elif val == "False":
|
|
val = False
|
|
elif val == "":
|
|
val = None
|
|
conf['config'][key] = val
|
|
|
|
# For optional fields, check if user entered/selected something. If not, and a default value was given,
|
|
# use the default value, else set the value of that optional key as None
|
|
# True/False choices are converted to string for some reason, leading to incorrect values
|
|
# Convert "True" to True, "False" to False and empty input to None
|
|
if 'optional' in modules:
|
|
for key in modules['optional']:
|
|
if request.form.get(f'module{i}_{key}'):
|
|
val = request.form.get(f'module{i}_{key}').replace(" ", "")
|
|
if val == "True":
|
|
val = True
|
|
elif val == "False":
|
|
val = False
|
|
elif val == "":
|
|
val = None
|
|
conf['config'][key] = val
|
|
else:
|
|
if "default" in modules["optional"][key]:
|
|
conf['config'][key] = modules["optional"][key]["default"]
|
|
else:
|
|
conf['config'][key] = None
|
|
|
|
# update the config dictionary
|
|
conf["config"].update(common_settings)
|
|
template['modules'].append(conf)
|
|
|
|
# Send the data back to the server side in json dumps and convert the response to a downloadable settings.json file
|
|
try:
|
|
user_settings = json.dumps(template, indent=4).encode('utf-8')
|
|
response = Response(user_settings, mimetype="application/json", direct_passthrough=True)
|
|
response.headers['Content-Disposition'] = 'attachment; filename=settings.json'
|
|
|
|
return response
|
|
|
|
except Exception as e:
|
|
flash(str(e))
|
|
|
|
|
|
return render_template('inkycal-config-v2-0-0.html', title='Inkycal-Setup', conf=settings, form=form)
|
|
|