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)
 | |
| 
 |