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 import signal import os from fastapi.responses import RedirectResponse 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') #styling ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif') ############# # Create a connection conn = MontyClient("db") # Access your database and collection 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: #styling ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif') ############# 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 if not app.storage.user.get('authenticated', False): return RedirectResponse('/login') #styling ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif') ############# def choose(sede, livello): if int(livello) < 0: page.refresh(sede) else: ui.open(f"/manager/{sede}/{livello}") @ui.refreshable def page(sede): if int(sede) <0: results = db.sedi.find() ui.button(on_click=lambda: (app.storage.user.clear(), ui.open('/login')), icon='logout').props('outline round') ui.row().classes("w-full") with ui.column().classes("w-full h-screen place-items-center items-center").style(""): ui.row().classes("grow") for result in results: ui.button(text=str(result['nome']).capitalize(),on_click=lambda id=result['id']:choose(id, -1)) ui.row().classes("grow") else: results = db.livelli.find() with ui.row().classes("w-full"): ui.icon("chevron_left", size="lg").on("click", lambda: page.refresh(-1)) with ui.column().classes("w-full h-screen place-items-center items-center"): ui.row().classes("grow") for result in results: ui.button(text=str(result['nome']).capitalize(),on_click=lambda id=result['id']:choose(sede, id)) ui.row().classes("grow") ## FRONTEND page(-1) @ui.page('/user/{userid}', title="Let's Swing Admin", favicon="assets/favicon.ico") def user_page(userid: str) -> None: ## LOGIN CHECK if not app.storage.user.get('authenticated', False): return RedirectResponse('/login') #styling ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif') ############# user.main(userid, db) @ui.page('/edit/{userid}/{sede}/{livello}', title="Let's Swing Admin", favicon="assets/favicon.ico") def edit_page(userid: str, sede: int, livello: int) -> None: ## LOGIN CHECK if not app.storage.user.get('authenticated', False): return RedirectResponse('/login') #styling ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif') ############# if userid!= "new": result = db.users.find_one({"_id":ObjectId(userid)}) async def save(): data_submit = {k: v.value for k, v in data.items()} if userid == "new": data_submit['pagamenti']=[] data_submit['presenze']=[] db.users.insert_one(data_submit) else: print(data_submit) db.users.update_one( {"_id": ObjectId(userid)}, {"$set": data_submit} ) os.kill(os.getpid(), signal.SIGUSR1) await ui.run_javascript('history.back()', respond=False) ui.icon("chevron_left", size="lg").on("click", lambda: ui.run_javascript('history.back()', respond=False)) with ui.column().classes("w-full h-screen place-items-center items-center").style(""): data = {} ui.row().classes("grow") data['nome'] = ui.input(value=str(result['nome']).capitalize() if userid != "new" else None, placeholder="Nome").props('outline').classes('w-full') data['cognome'] = ui.input(value=str(result['cognome']).capitalize() if userid != "new" else None, placeholder="Cognome").props('outline').classes('w-full') data['telefono'] = ui.input(value=str(result['telefono']).capitalize() if userid != "new" else None, placeholder="Telefono").props('outline').classes('w-full') data['email'] = ui.input(value=str(result['email']).capitalize() if userid != "new" else None, placeholder="email").props('outline').classes('w-full') options = {o['id']: str(o['nome']).capitalize() for o in db.sedi.find()} data['sede'] = ui.select(options, value=result['sede'] if userid != "new" else sede).props('outline').classes('w-full') options = {o['id']: str(o['nome']).capitalize() for o in db.livelli.find()} data['livello'] = ui.select(options, value=result['livello'] if userid != "new" else livello).props('outline').classes('w-full') ui.button(text="Salva", on_click=save) ui.row().classes("grow") @ui.page('/login',title="Let's Swing Admin", favicon="assets/favicon.ico") def login() -> None: #styling ui.colors(primary='black', secondary="lightgray") ui.query('body').style(f'font-family: sans-serif;background-color:black') ############# 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='THIS_NEEDS_TO_BE_CHANGED')