From 45566f8aacd8f5db48a7ff575a9e0d82a6e06d7f Mon Sep 17 00:00:00 2001 From: enne2 Date: Tue, 19 Sep 2023 15:48:46 +0200 Subject: [PATCH] 1.1.1 --- ..._14b0845c-53f0-4f59-8733-3e6e5a2a5dc8.json | 1 + README.md | 2 +- main.py | 136 ++++-------------- pages/__pycache__/index.cpython-311.pyc | Bin 0 -> 4589 bytes pages/__pycache__/useredit.cpython-311.pyc | Bin 0 -> 5872 bytes pages/index.py | 32 +++++ pages/useredit.py | 42 ++++++ 7 files changed, 103 insertions(+), 110 deletions(-) create mode 100644 .nicegui/storage_user_14b0845c-53f0-4f59-8733-3e6e5a2a5dc8.json create mode 100644 pages/__pycache__/index.cpython-311.pyc create mode 100644 pages/__pycache__/useredit.cpython-311.pyc create mode 100644 pages/index.py create mode 100644 pages/useredit.py 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 0000000000000000000000000000000000000000..7f1a709db2f1686594c90a0ee3617b5e14ad0022 GIT binary patch literal 4589 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 ZAgHq2NHrfL)$Qj=b>{_A{U9M}=Dz|Z(&7LB literal 0 HcmV?d00001 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")