You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.9 KiB
107 lines
4.9 KiB
from nicegui import ui |
|
import signal |
|
import os |
|
from datetime import datetime, timedelta |
|
from montydb.database import MontyDatabase |
|
|
|
|
|
class Manager: |
|
def __init__(self,handler): |
|
self.handler = handler |
|
self.current_time = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(seconds=1) |
|
self.current_index = 0 |
|
|
|
def main(self, db: MontyDatabase, sede, livello): |
|
|
|
users = db.users |
|
lezioni = db.lezioni |
|
lezioniCursore = lezioni.find({"livello": livello,"sede": sede}).sort([("data", 1)]) |
|
lezioniArray = [datetime.strptime(l["data"],"%Y-%m-%d %H:%M:%S") for l in lezioniCursore] |
|
|
|
for i, l in enumerate(lezioniArray): |
|
if l > self.current_time: |
|
self.current_index = i |
|
self.current_time = l |
|
break |
|
|
|
|
|
def registra_presenza(id, flag): |
|
current_day = self.current_time.replace(hour=0, minute=0, second=0, microsecond=0).strftime('%Y-%m-%d %H:%M:%S') |
|
|
|
if flag: |
|
users.update_one( |
|
{"_id": id}, |
|
{"$push": {"presenze": current_day}} |
|
) |
|
else: |
|
users.update_one( |
|
{"_id": id}, |
|
{"$pull": {"presenze": current_day}} |
|
) |
|
#os.kill(os.getpid(), signal.SIGUSR1) |
|
self.handler.execute_callbacks('users_update') |
|
|
|
|
|
@ui.refreshable |
|
def time_selector(): |
|
def set_time(isNext): |
|
if isNext: |
|
self.current_index += 1 |
|
else: |
|
self.current_index -= 1 |
|
|
|
self.current_time = lezioniArray[self.current_index] |
|
|
|
time_selector.refresh() |
|
tabellaUtenti.refresh() |
|
|
|
with ui.row().classes("w-full items-center"): |
|
ui.column().classes("grow") |
|
with ui.column(): |
|
if self.current_index > 0: |
|
ui.icon("arrow_left",size="md").on("click", lambda: set_time(False)) |
|
date_label = self.current_time.strftime('%d %B, %Y') |
|
ui.label(date_label).style("margin:auto auto;font-weight:600").classes('text-md') |
|
with ui.column(): |
|
if self.current_index +1 in range(0,len(lezioniArray)): |
|
ui.icon("arrow_right",size="md").on("click", lambda: set_time(True)) |
|
ui.column().classes("grow") |
|
|
|
@ui.refreshable |
|
def tabellaUtenti(): |
|
rows = users.find({"sede": sede, "livello": livello}) |
|
current_day = self.current_time.replace(hour=0, minute=0, second=0, microsecond=0).strftime('%Y-%m-%d %H:%M:%S') |
|
current_month = self.current_time.replace(day=1, hour=0, minute=0, second=0, microsecond=0).strftime('%Y-%m-%d %H:%M:%S') |
|
|
|
for row in rows: |
|
with ui.row().classes("w-full"): |
|
with ui.column().classes("grow"): |
|
|
|
ui.label(f"{row['nome']} {row['cognome'][0].upper() if row['cognome'] else None}.").style('color:'+( |
|
"red" if not current_month in row['pagamenti'] and current_day in row['presenze'] else "black") |
|
).classes('text-md').on("click", lambda row_id=row['_id']: ui.open(f'/user/{row_id}')) |
|
with ui.column(): |
|
|
|
if current_day in row["presenze"]: |
|
ui.button(color="primary", text= "presente", on_click= lambda row_id=row['_id']: registra_presenza(row_id, False)) |
|
else: |
|
ui.button(color="secondary", text= "assente", on_click= lambda row_id=row['_id']: registra_presenza(row_id, True)).style("min-width:100px") |
|
|
|
ui.separator() |
|
|
|
self.handler.register_callback("users_update", tabellaUtenti.refresh) |
|
liv = db.livelli.find_one({"id":livello}) |
|
sed = db.sedi.find_one({"id":sede}) |
|
|
|
## FRONTEND |
|
with ui.row().classes("w-full"): |
|
ui.icon("chevron_left", size="lg").on("click", lambda: ui.open("/")) |
|
with ui.row().classes("w-full"): |
|
with ui.column().classes("grow"): |
|
ui.label(f"{str(liv['nome']).capitalize()} a {str(sed['nome']).capitalize()}").classes('text-xl').style("font-weight:700;margin-top: 10px") |
|
with ui.column(): |
|
ui.image('assets/logo.svg').style('width:70px;margin:auto auto') |
|
time_selector() |
|
tabellaUtenti() |
|
with ui.row().classes("w-full items-center content-center"): |
|
ui.button("AGGIUNGI ALLIEV*", icon="add", on_click=lambda: ui.open(f"/edit/new/{sede}/{livello}")).props('outline rounded').classes('shadow-lg').style("margin:auto;padding:10px 20px;font-weight:600")
|
|
|