.. _tutor/architettura/menu: Menu ==== .. toctree:: :maxdepth: 1 :titlesonly: thpage webpage lookupBranch tableBranch packageBranch directoryBranch dashboardBranch menu_methods Oltre al file ``main.py``, ogni :ref:`package` presenta un file ``menu.py``, che permette di definire la struttura dei menu, ovvero le pagine dell'applicativo che verranno mostrate nell'apposito menu visibile in tutti gli applicativi Genropy. Ogni package avrà quindi un suo menu specifico, contenente *webpages*, *thpages*, ecc, interne al package o riferite a risorse contenute in altri package. Qualora nell' :ref:`istanza` (o nel *siteconfig*) sia stato identificato un ``mainpackage``, questo sarà responsabile di definire il menu principale del progetto:: .. Se non si volesse invece definire un file *menu* ad hoc, ma utilizzare i menu di alcuni package specificati nell'istanza, sarà possibile specificare i menu da utilizzare come attributo:: .. In questo caso, per esempio, verranno mostrati i rami dei package *fatt*, *adm*, e *sys*. Se viene indicato un solo package, invece, non verranno raccolte le voci all'interno di un ramo, bensì verranno mostrate direttamente le voci in esso contenute. .. hint:: Se non si indica un *mainpackage* o il *mainpackage* non ridefinisce dei menu specifici, è possibile visualizzare i menu di **tutti** i package specificando:: Si noti che visitando l'url ``http://localhost/nomedelpackage``, per ogni *package* sarà presentato il menu di default di quel *package*, **se è presente un file index.py** per quel *package*. .. hint:: Si tenga presente che, a prescindere da cosa viene indicato nel menu, ogni webpage sarà sempre raggiungibile dall’url http://localhost/nomedelpackage/nomedellawebpage Come definire un menu: Menu --------------------------- La classe Menu ~~~~~~~~~~~~~~ Per definire un menu in un package Genropy, si definisce una classe ``Menu``, all'interno della quale si specifica il contenuto in un metodo ``config``, che riceve *self* e *root*:: class Menu(object): def config(self,root): fatturazione = root.branch(u"Fatturazione") fatturazione.thpage(u"Fatture", table="fatt.fattura") fatturazione.webpage('Hello',filepath='hello_world') fatturazione.tableBranch('Ultime fatture',table='fatt.fattura', query_limit=5, query_order_by='$protocollo desc', cacheTime=5) fatturazione.packageBranch('Gestione utenti',pkg='adm', branchMethod='userSubmenu', branch_parametro=3) fatturazione.lookupBranch(u"Tabelle Ausiliarie", pkg="fatt") Come si può notare dall'esempio, ``Menu`` è quindi una tipica `Structure `_ di Genropy, all'interno della quale è possibile utilizzare diversi strumenti: - i ``branch``, ovvero dei rami per raccogliere una serie di voci - le :ref:`thpage` , ovvero il riferimento a delle risorse th - le :ref:`webpage` , ovvero delle pagine specifiche, identificate da un percorso - i :ref:`tableBranch` , ovvero rami di record di tabella generati automaticamente - i :ref:`packageBranch` , ovvero rami di tabelle di package generati automaticamente - i :ref:`lookups` , per raccogliere le tabelle di Lookup - dei :ref:`metodi` , usati per definire in tutto o in parte dei menu personalizzati Le classi ApplicationMenu e WebAppMenu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Si noti che la classe Menu è quella dove verrà definito il menu del package. Ma se il package è anche il :ref:`mainpackage` che abbiamo specificato nella configurazione dell'istanza, come indicare le altre voci di menu non direttamente di questo package che vogliamo visualizzare? In questo caso è possibile specificare nel file menu un'altra classe:: class ApplicationMenu(object): def config(self,root): root.packageBranch('Sistema', pkg='sys') root.packageBranch('Admin', pkg='adm') root.packageBranch('Fatturazione', pkg='fatt') In questo modo il menu dell'applicativo sarà questo ``ApplicationMenu`` costituito da tre rami, uno dei quali è quello definito nella classe Menu di *fatturazione*, definito sopra. Inoltre, è possibile definire un'altra classe ancora, riservata alle applicazioni mobile:: class WebAppMenu(object): def config(self,root): root.packageBranch('Fatturazione', pkg='fatt') root.packageBranch('Agenti', pkg='agt') Ogni qualvolta il sistema riconoscerà un dispositivo mobile offrirà questo menu invece del precedente. Menu differenziati per gruppi di utenza --------------------------------------- Oltre al metodo di default ``config`` è possibile specificare dei metodi personalizzati riferiti a specifici `gruppi di utenza `_, identificati dal decoratore *metadata*:: @metadata(group_code='AGT') def config_agenti(self,root): fatturazione = root.branch(u"Fatturazione") fatturazione.thpage(u"Fatture agenti", table="fatt.fattura") Ad ogni utente appartenente al gruppo specificato (in questo caso ``AGT``), quindi, verrà mostrato il **menu specificato al posto di quello standard**. Ciò permette di attribuire un notevole grado di personalizzazione all'applicativo. Definire il menu da interfaccia -------------------------------- Oltre alla modalità sopra descritta, si noti che è sempre possibile costruire un menu direttamente tramite interfaccia dalla sezione :ref:`Gruppo di Utenza` dell'applicativo. Qualora fossero previsti menu costruiti con entrambe le modalità, quella da interfaccia prevarrà sempre su quella costruita via codice. .. raw:: html
**Parametri:** +------------------------+------+--------------------------------------------------+ | Nome parametro | Tipo | Descrizione | +========================+======+==================================================+ |checkpref |T |Permette di mostrare la voce di menu o il branch | | | |solo se rispettata una determinata condizione | | | |espressa nelle preferenze, nella forma | | | |"pkg.nomepreferenza" (es: | | | |checkpref='adm.gestione_utenti_nel_menu') | +------------------------+------+--------------------------------------------------+ |checkenv |T |Permette di mostrare la voce di menu o il branch | | | |solo se rispettata una determinata condizione | | | |espressa nell'environment (es: | | | |checkenv='deposito_id') | +------------------------+------+--------------------------------------------------+ |newPanel |B |Se impostato a True la voce di menu si aprirà in | | | |un nuovo tab del browser | +------------------------+------+--------------------------------------------------+ |newWindow |B |Se impostato a True la voce di menu si aprirà in | | | |una nuova finestra del browser | +------------------------+------+--------------------------------------------------+ | *Common Parameters* | +------------------------+------+--------------------------------------------------+ |label |T |Solitamente implicito, si riferisce all'etichetta | | | |della voce di menu | +------------------------+------+--------------------------------------------------+ |tags |T |Permette di indicare i tag utente a cui le pagine | | | |sono riservate (es: tags='admin') | +------------------------+------+--------------------------------------------------+ .. sectionauthor:: Davide Paci