Come funziona Genropy
e cosa trovi già pronto.
Un framework Python per Single Page Applications gestionali. Qui vedi come si scrive un'applicazione e cosa ti dà il framework.
Come funziona
Python descrive.
JavaScript costruisce.
Scrivi l'applicazione in Python. Nel browser la monta un motore JavaScript che fa parte del framework.
- 01 / Python descrive
La pagina è una classe Python
Nel metodo
maindescrivi form, griglie e pannelli con il page builder. Il server non genera HTML: genera una descrizione della pagina.fb.textbox(value='^.name') - 02 / La Bag trasporta
Una struttura sola, dai due lati
La descrizione viaggia come Bag, un contenitore gerarchico di valori e attributi. La Bag esiste in Python e in JavaScript, con le stesse API.
bag['order.customer'] = 'Ada' - 03 / JavaScript costruisce
Il browser monta l'applicazione
Il motore crea i widget e li lega ai dati con i path
widgetbinding ^store^. La pagina non si ricarica più: da lì in poi viaggiano solo i dati.
Tutto Python, o quasi
Dove scrivi ancora JavaScript
Solo in poche righe: le formule di dataFormula e gli script di dataController sono espressioni JavaScript. HTML e CSS servono soltanto se vuoi cambiare l’aspetto.
root.dataFormula('.total', 'qty * price', qty='^.qty', price='^.price')Come si scrive
Il codice,
in tre esempi.
Ogni esempio porta al manuale dove approfondire.
L'interfaccia in Python
Il page builder crea i widget, il ^ li lega a un path dei dati. Cambi il dato e il widget si aggiorna, senza scrivere un evento.
class GnrCustomWebPage:
def main(self, root, **kwargs):
fb = root.formbuilder(cols=1)
fb.textbox(value='^.name', lbl='Nome')
fb.numberTextBox(value='^.qty', lbl='Quantità')
root.div('^.name')Il modello dei dati
Una tabella è una classe Python con colonne e relazioni. Nelle query segui le relazioni con il path @, senza scrivere join.
class Table(object):
def config_db(self, pkg):
tbl = pkg.table('invoice', pkey='id')
tbl.column('customer_id', size='22').relation('customer.id')
self.db.table('shop.invoice').query(
columns='$number,@customer_id.name',
where='@customer_id.city=:city', city='Milano').fetch()Il dialogo con il server
Un metodo marcato @public_method si chiama dal browser con dataRpc. Il risultato torna nel path indicato e aggiorna i widget legati.
root.dataRpc('.count', self.invoice_count,
customer_id='^.customer_id')
@public_method
def invoice_count(self, customer_id=None):
return self.db.table('shop.invoice').query(
where='$customer_id=:c', c=customer_id).count()Strumenti pronti
Il lavoro di contorno
è già fatto.
Funzioni che ogni gestionale chiede, già scritte nei package del framework.
Utenti e permessi
Login, gruppi e tag di autorizzazione.
Stampe
Template HTML e PDF sui record delle tue tabelle.
Account, invio in coda e ricezione.
Query e viste salvate
Chi usa l’applicazione le crea e le salva da interfaccia.
Campi custom
Campi aggiunti da interfaccia, senza toccare il modello.
Allegati
Una tabella di allegati collegata a ogni record.
Task periodici
Batch pianificati, con esecuzioni ed esiti.
Scopri i package
Li attivi aggiungendo il package all’istanza e aggiornando il database. Quando non servono, li togli.
Framework e AI
L'AI scrive il codice.
Il framework lo tiene in ordine.
Con un LLM scrivere codice è veloce. Mantenerlo è un'altra storia.
Solo LLM
- Ogni richiesta produce una soluzione diversa.
- Il codice cresce e la manutenzione si complica.
- Per cambiarlo serve di nuovo l’LLM.
LLM + Genropy
- L’LLM segue le convenzioni del framework.
- Scrive meno codice: form, griglie e permessi ci sono già.
- Il codice resta leggibile per chi conosce il framework.
Open source
Gratuito, aperto,
sui tuoi server.
Il framework non costa niente e il codice è pubblico.
- LGPL
Licenza aperta
Il codice è su GitHub con licenza LGPL. Lo installi con pip.
Leggi il codice su GitHub - Self-hosted
Sui tuoi server
Lo installi dove decidi tu e i dati restano da te. In produzione gira con Docker, gunicorn e nginx.
Guida all'installazione
Ti serve qualcosa in più? Contattaci per un pacchetto PRO.
