from nicegui import ui, app from datetime import datetime, timedelta from montydb import MontyClient from montydb.types.objectid import ObjectId import locale from pages import manager, user, useredit, index import signal import os import shutil from fastapi.responses import RedirectResponse from fastapi.responses import FileResponse passwords = {'admin': [0,'sw1ng3rs',0, "Matteo Benedetto"], 'user': [1,'pass',1, "Pippo"]} # Set the locale to Italian locale.setlocale(locale.LC_ALL, 'it_IT.utf8') def styling(): ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif') def login_check(): if not app.storage.user.get('authenticated', False): return RedirectResponse('/login') # Create a connection conn = MontyClient("db") # Access your database db = conn.letsswing # Routes @ui.page('/manager/{sede}/{livello}', title="Let's Swing Admin", favicon="assets/favicon.ico") def manager_page(sede:int, livello:int) -> None: login_check() styling() manage = manager.Manager() manage.main(db, sede, livello) # Routes @ui.page('/', title="Let's Swing Admin", favicon="assets/favicon.ico") def index_page() -> None: login_check() styling() index.main(db) @ui.page('/user/{userid}', title="Let's Swing Admin", favicon="assets/favicon.ico") def user_page(userid: str) -> None: login_check() styling() user.main(userid, db) @ui.page('/edit/{userid}/{sede}/{livello}', title="Let's Swing Admin", favicon="assets/favicon.ico") def useredit_page(userid: str, sede: int, livello: int) -> None: login_check() styling() useredit.main(db, userid, sede, livello) @ui.page('/backup/{password}') def api_backup(password: str) -> None: if password != "1337swing": return {'msg':'password errata'} # Percorso completo del file zip filename = "backup_db_" +datetime.now().strftime('%Y%m%d%H%M%S') zip_path = os.path.join('backup', filename) # Crea il file zip shutil.make_archive(zip_path, 'zip', "db") return FileResponse(path=zip_path + '.zip', media_type='application/octet-stream', filename=filename+".zip") @ui.page('/login',title="Let's Swing Admin", favicon="assets/favicon.ico") def page_login() -> None: styling() def try_login() -> None: # local function to avoid passing username and password as arguments if passwords.get(username.value)[1] == password.value: app.storage.user.update({'username': username.value, 'authenticated': True, 'id' : passwords.get(username.value)[0], "level": passwords.get(username.value)[2], "name": passwords.get(username.value)[3]}) ui.open('/') else: ui.notify('username o password errata', color='negative') if app.storage.user.get('authenticated', False): return RedirectResponse('/') with ui.card().classes('absolute-center items-center'): ui.image('assets/logo.svg') ui.label('Let\'s Swing Admin').classes('text-2xl') username = ui.input('Username').on('keydown.enter', try_login).classes('w-full') password = ui.input('Password', password=True, password_toggle_button=True).on('keydown.enter', try_login) ui.button('Log in', on_click=try_login) # Run main loop ui.run(host="0.0.0.0", storage_secret='5w1ng4ndn0th1ngm0r3')