mostly working templating for landing page

This commit is contained in:
2025-11-24 22:53:13 +01:00
parent 50c0f46207
commit 144d8aa844
11 changed files with 299 additions and 32 deletions

63
web.py
View File

@@ -1,35 +1,71 @@
from db_connect import DatabaseConnect
from flask import Flask, abort, session
from jinja2 import Template
from jinja2 import FileSystemLoader, Template
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import logging
from os import sep
import datetime
import templating
app = Flask(__name__)
db = DatabaseConnect()
Flask.jinja_options["loader"] = FileSystemLoader("web")
env = app.create_jinja_environment()
DISPLAYEDTYPES = 2
TDLATE = datetime.timedelta(hours=8)
# before and after
TYPEUNITS = [
"°C",
"%"
]
@app.route("/")
def index():
avail_rooms = db.view_valid_rooms(1)
outtext = "<h1>Available rooms</h1><ul>"
if len(avail_rooms) == 0:
outtext += "<li>You have no rooms you can view</li>"
else:
for room in avail_rooms:
outtext += f"<li><a href=/room/{room[1]}>{room[0]}</li>"
outtext += "</ul>"
return outtext
# no user handling yet so we get user of ID 1 (not logged in)
active_user = 1
#populate userinfo
user_info = templating.UserInfo(id=active_user, name=db.username_from_id(active_user)[0])
rooms_info = []
for room in db.view_valid_rooms(active_user):
sensor_info = []
sensors_avail = db.get_sensors_in_room_id(room[2])
for i in range(DISPLAYEDTYPES):
sensors_with_type = [x for x in sensors_avail if x[1] == i]
# TODO: handle more than one sensor in one room
if sensors_with_type:
reading = db.get_sensorsinfo_by_sensorid(sensors_with_type[0][0])
if reading is None:
sensor_info.append(templating.SensorInfo(2,None, None, ""))
continue
reading = templating.SensorInfo(1 if reading.timestamp + TDLATE < datetime.datetime.now() else 0,
reading.type,
reading.timestamp,
f"{reading.reading}{TYPEUNITS[i]}")
sensor_info.append(reading)
else:
sensor_info.append(templating.SensorInfo(2,None, None, ""))
rooms_info.append(templating.RoomInfo(room[0], room[1], sensor_info))
out_html = templating.LandingPage(env, user_info,rooms_info)
return out_html.render()
@app.route('/room/<room_name>')
def room_page(room_name=None):
if not db.user_has_room_perms(1,room_name):
abort(403)
sensor_list = db.get_sensors_in_room(room_name)
sensor_list = db.get_sensors_in_room_shortname(room_name)
fig = make_subplots(rows=1, cols=len(sensor_list))
for idx, sensorID in enumerate(sensor_list):
lst = [x for x in db.get_sensor_data(sensorID)]
@@ -47,4 +83,7 @@ def room_page(room_name=None):
px_jinja_data = {"fig":fig.to_html(full_html=False)}
with open(template_path,'r') as template_file:
j2_template = Template(template_file.read())
return j2_template.render(px_jinja_data)
return j2_template.render(px_jinja_data)
if __name__ == "__main__":
app.run(debug=True)