diff --git a/.nicegui/storage_user_14b0845c-53f0-4f59-8733-3e6e5a2a5dc8.json b/.nicegui/storage_user_14b0845c-53f0-4f59-8733-3e6e5a2a5dc8.json new file mode 100644 index 0000000..3edffa1 --- /dev/null +++ b/.nicegui/storage_user_14b0845c-53f0-4f59-8733-3e6e5a2a5dc8.json @@ -0,0 +1 @@ +{"username": "admin", "authenticated": true, "id": 0, "level": 0, "name": "Matteo Benedetto"} \ No newline at end of file diff --git a/README.md b/README.md index 2ae98dd..23852de 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,5 @@ - ~~retrdatare current_time al costruttore~~ - route backup - gestione account login (?) -- gestione eventi,sedi,livelli +- gestione gui eventi,sedi,livelli - refactor main.py \ No newline at end of file diff --git a/main.py b/main.py index 6b6a80a..dc5c6d0 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta from montydb import MontyClient from montydb.types.objectid import ObjectId import locale -from pages import manager, user +from pages import manager, user, useredit, index import signal import os import shutil @@ -15,128 +15,51 @@ passwords = {'admin': [0,'sw1ng3rs',0, "Matteo Benedetto"], 'user': [1,'pass',1, # 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') -############# +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 and collection +# 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: - #styling - ui.colors(primary='black', secondary="lightgray") - ui.query('body').style(f'font-family: sans-serif') - ############# - manage = manager.Manager() - manage.main(db, sede, livello) + 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 - 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').style("positon:absolute") - 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").style("positon:absolute"): - 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) + 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 - 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') - ############# - + login_check() + styling() 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") +def useredit_page(userid: str, sede: int, livello: int) -> None: + login_check() + styling() + useredit.main(db, userid, sede, livello) @ui.page('/backup/{password}') -def password(password: str) -> None: +def api_backup(password: str) -> None: if password != "1337swing": return {'msg':'password errata'} @@ -152,13 +75,8 @@ def password(password: str) -> None: @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 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]}) @@ -177,4 +95,4 @@ def login() -> None: # Run main loop -ui.run(host="0.0.0.0", storage_secret='THIS_NEEDS_TO_BE_CHANGED') +ui.run(host="0.0.0.0", storage_secret='5w1ng4ndn0th1ngm0r3') diff --git a/pages/__pycache__/index.cpython-311.pyc b/pages/__pycache__/index.cpython-311.pyc new file mode 100644 index 0000000..7f1a709 Binary files /dev/null and b/pages/__pycache__/index.cpython-311.pyc differ diff --git a/pages/__pycache__/useredit.cpython-311.pyc b/pages/__pycache__/useredit.cpython-311.pyc new file mode 100644 index 0000000..654a42f Binary files /dev/null and b/pages/__pycache__/useredit.cpython-311.pyc differ diff --git a/pages/index.py b/pages/index.py new file mode 100644 index 0000000..fe5ad1f --- /dev/null +++ b/pages/index.py @@ -0,0 +1,32 @@ +from nicegui import ui +from montydb import MontyClient + +def main(db: MontyClient): + 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').style("positon:absolute") + 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").style("positon:absolute"): + 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) \ No newline at end of file diff --git a/pages/useredit.py b/pages/useredit.py new file mode 100644 index 0000000..2a31054 --- /dev/null +++ b/pages/useredit.py @@ -0,0 +1,42 @@ +from nicegui import ui +from montydb import MontyClient +from montydb.types.objectid import ObjectId + +import signal +import os + +def main(db: MontyClient, userid: str, sede: int, livello: int) -> None: + + 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")