Definire un package

Un package è un insieme di table di database che servono a implementare un’area funzionale dell’applicativo. Ogni funzionalità che vogliamo attribuire all’applicativo verrà quindi raccolta e implementata da un package dedicato (es: «fatt», per tutta l’area funzionale legata alla fatturazione, o semplicemente «base» per le funzionalità di base).

Ogni package è quindi costituito dalle seguenti cartelle:

  • model e resources, che conterranno rispettivamente i modelli dei dati e le risorse delle tabelle
  • lib, che conterrà le librerie da importare
  • webpage, che conterrà le differenti pagine specifiche che andremo a creare

All’interno del model andremo a Definire le singole table che faranno parte del package.

Com’è strutturato un package

Ogni package conterrà necessariamente un file main.py con le informazioni sulla struttura del package, ed eventualmente un menu.

Il file main del package fatt di Sandbox, per esempio, è così strutturato:

class Package(GnrDboPackage):

    def config_attributes(self):
        return dict(comment='Package demo fatturazione',sqlschema='fatt',language='it',
                  name_short='Fatturazione', name_long='Fatturazione', name_full='Fatturazione')

    def config_db(self, pkg):
        pass

    def custom_type_money(self):
        return dict(dtype='N',format='#,###.00')

    def custom_type_percent(self):
        return dict(dtype='N',format='##.00')


class Table(GnrDboTable):
    pass

La prima parte viene solitamente compilata automaticamente dal compilatore del package. È poi possibile ridefinire dei metodi e delle classi.

Nell’esempio ridefiniamo i due metodi custom_type_money e custom_type_percent, che andranno quindi ad aggiungere un dtype particolare che verrà usato all’interno del package.

In alternativa nel main è possibile anche ridefinire delle classi, per esempio avremmo potuto ridefinire la classe Table come segue:

class Table(GnrDboTable):
    def whoAmI(self):
        return self.fullname

Il metodo whoAmI, che semplicemente ci restituisce il nostro nome completo, sarà disponibile per ogni tabella del package.

Infine è possibile fare un mix-in di un metodo di pagina come segue:

class WebPage(GnrDboTable):
    def sandboxDiv(self,pane):
        return div('Questa è una pagina di Sandbox')

Nel file menu.py è poi contenuto invece il menu del package che verrà mostrato nella parte laterale sinistra dell’applicativo e che è poi personalizzabile sulla base per ogni Gruppo di Utenza

Il file menu di Sandbox è così costruito:

def config(root,application=None):
  fatturazione = root.branch(u"Fatturazione")
  fatturazione.thpage(u"Clienti", table="fatt.cliente")
  fatturazione.thpage(u"Tipi Prodotto", table="fatt.prodotto_tipo")
  fatturazione.thpage(u"Prodotti", table="fatt.prodotto")
  fatturazione.thpage(u"Fatture", table="fatt.fattura")
  fatturazione.thpage(u"Righe vendita", table="fatt.fattura_riga")
  fatturazione.lookups(u"Tabelle Ausiliarie", lookup_manager="fatt")

È quindi possibile definire un branch (in questo caso «fatturazione») che racchiuderà al suo interno le pagine, le singole thpage da definire, o una pagina di «raccolta» delle varie tabelle di lookup.

Suggerimento

Si tenga presente che, a prescindere da cosa viene indicato nel menu, ogni webpage sarà sempre raggiungibile dall’url http://localhost/nomedelpackage/nomedellawebpage

Come si crea un package

Un package può essere costruito in modo automatizzato partendo da un database legacy, da un file Excel, oppure totalmente da zero utilizzando il Package Editor. Il Package Editor permette di definire e modificare da interfaccia grafica il model dei dati, ovvero la definizione di tabelle e colonne. In questo modo il file main appena descritto verrà compilato in automatico.

In caso contrario è possibile creare un package manualmente compilando il main con una classe Package che eredita da GnrDboPackage come sopra descritto. Non sarà obbligatorio inserire tabelle, in quanto un package può essere utilizzato anche solo per ospitare batch e personalizzazioni di vario tipo che personalizzino altri package già esistenti.

Una volta creato sarà sufficiente importare il package come descritto di seguito.

Come si personalizza un package

È possibile personalizzare parte di un package che si trova in una posizione precedente secondo l’ordine di importazione. Per personalizzare la tabella group del package ADM, per esempio, sarà possibile inserire un nuovo model group.py all’interno del package AGT, replicando la struttura di ADM sotto una nuova cartella _packages come segue:

../_images/packages_struttura.png

Il nuovo model di group del package AGT del progetto Sandbox non conterrà copia integrale del group originale, ma solo la nuova parte che andrà a sovrascrivere (o integrare) quello di partenza, in questo caso:

class Table(object):

  @metadata(mandatory=True)
  def sysRecord_AGT(self):
      return self.newrecord(description='Agenti',
                            code='AGT')

Autore della sezione: Davide Paci