import sqlite3 from flask import Flask, render_template_string, jsonify from datetime import datetime, date app = Flask(__name__) DB_FILE = "cleaning_logs.db" # Room definitions BUILDINGS = { "Haus A-C": [ list(range(101, 131)), list(range(201, 231)), list(range(301, 331)) ], "Haus D-F": [ list(range(131, 151)), list(range(231, 251)), list(range(331, 351)) ], "Haus O": [ list(range(401, 413)), list(range(420, 436)), list(range(440, 457)) ] } def get_all_defined_rooms(): """Get a set of all room numbers defined in buildings""" rooms = set() for floors in BUILDINGS.values(): for floor in floors: rooms.update(str(r) for r in floor) return rooms def get_room_statuses(): """Returns dict: {room_number: (last_cleaned_time, is_today)}""" today = date.today().strftime("%Y-%m-%d") with sqlite3.connect(DB_FILE) as conn: cursor = conn.execute(""" SELECT room_number, MAX(cleaned_at) as last_cleaned FROM cleaning_events GROUP BY room_number """) rows = cursor.fetchall() statuses = {} for room, last_cleaned in rows: is_today = last_cleaned.startswith(today) if last_cleaned else False statuses[room] = { "is_today": is_today, "last_cleaned": last_cleaned } return statuses def get_special_rooms(statuses): """Get rooms that aren't in any defined building""" defined_rooms = get_all_defined_rooms() special_rooms = [] for room_number in statuses.keys(): if room_number not in defined_rooms: special_rooms.append(room_number) return sorted(special_rooms) @app.route('/') def dashboard(): statuses = get_room_statuses() special_rooms = get_special_rooms(statuses) return render_template_string( TEMPLATE, buildings=BUILDINGS, statuses=statuses, special_rooms=special_rooms ) @app.route('/api/status') def api_status(): """API endpoint for live updates""" statuses = get_room_statuses() special_rooms = get_special_rooms(statuses) return jsonify({ "statuses": statuses, "special_rooms": special_rooms }) TEMPLATE = ''' Room Cleaning Dashboard

đŸ§¹ Room Cleaning Status

{% for building_name, floors in buildings.items() %}

{{ building_name }}

{% for floor in floors %}
Etage {{ loop.index }}
{% for room in floor %} {% set room_str = room|string %} {% set status = statuses.get(room_str, {"is_today": False, "last_cleaned": None}) %}
{{ room }} {% if status.last_cleaned %} {{ status.last_cleaned[5:10] }}
{{ status.last_cleaned[11:16] }} {% else %}Never{% endif %}
{% endfor %}
{% endfor %}
{% endfor %} {% if special_rooms %}

Sonderräume

{% for room in special_rooms %} {% set status = statuses.get(room, {"is_today": False, "last_cleaned": None}) %}
{{ room }} {% if status.last_cleaned %} {{ status.last_cleaned[5:10] }}
{{ status.last_cleaned[11:16] }} {% else %}Never{% endif %}
{% endfor %}
{% endif %} ''' if __name__ == '__main__': app.run(host='0.0.0.0', port=5001, debug=True)