Added wpa_supplicant.conf generator refactored web-ui to support dynamic additions of modules added support for module height by ratio (or percentage) Changed format of settings file slightly to support info section height
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("module"+str(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("module"+str(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('module'+str(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(module+'_'+key):
|
|
val = request.form.get('module'+str(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)
|
|
|