Blog

Come duplicare un record

Tips&Tricks Come duplicare un record

Supponiamo di voler consentire all’utente del nostro applicativo di duplicare i record in modo semplice e veloce: potrebbe essere il caso di una tabella prodotto, dove ci sono prodotti simili che differiscono solo per la descrizione, o di una serie replicata di interventi, che vogliamo marcare con un numero di copia.

È possibile in questi casi utilizzare il parametro duplicate=True all’interno del metodo th_options della risorsa della nostra tabella, al fine di mostrare nella Form del record un’iconcina che consenta la duplicazione del record.

def th_options(self):
        return dict(dialog_height='400px', dialog_width='600px', duplicate=True)

Ipotizziamo però di voler effettuare non solo una duplicazione, ma copie multiple del record. Tenendo premuto Maiusc (Shift) e cliccando sull’icona della duplicazione verrà mostrata una finestra di dialogo dove è possibile inserire:

  • il numero di copie (es: “5”)
  • in alternativa, delle etichette testuali separate da virgola (es: “PP1,PP2,PP3”)

In entrambi i casi il record verrà copiato o per il numero di copie inserito (nel primo caso, 5) o in alternativa per il numero di etichette inserito (nel secondo caso, 3).

Il record verrà copiato integralmente, incluse le eventuali relazioni con altre tabelle, ad eccezione dei campi “unique” che saranno settati a None. È però possibile, all’interno del model della tabella, ridefinire il metodo onDuplicating_many al fine di personalizzare i record copiati a piacimento, per esempio aggiungendo il numero della copia o le etichette inseriti in precedenza.

def onDuplicating_many(self, record, copy_number=None, copy_label=None): 
         record['descrizione'] = '{descrizione} {label}'.format(descrizione=record['descrizione'], label=copy_label)

In questo modo per esempio andiamo ad aggiungere l’etichetta inserita nella Descrizione del prodotto.

def onDuplicating_many(self, record, copy_number=None, copy_label=None): 
       record['descrizione'] = '{descrizione} / Copia num. {number}'.format(descrizione=record['descrizione'], number=copy_number+1)

In questo modo invece andiamo ad aggiungere il numero della copia sempre nella Descrizione del prodotto.

E i record in relazione many?

Al momento della copia, di default vengono copiate anche le relazioni many solo se la onDelete è cascade. In questo caso infatti si suppone che la relazione sia molto forte e le copie vengono considerate come dei “figli” del prodotto di partenza. In questo caso, quindi, in caso di copia di un prodotto (maglietta) verranno ricopiati ricorsivamente anche tutti gli articoli (maglietta a maniche corte e maglietta a maniche lunghe) nonché tutte le varianti prodotto in relazione (taglia S,M,L e colori bianco, nero).

Se la onDelete non è ‘cascade‘, è possibile specificare sempre all’interno della relazione il parametro onDuplicate='recursive' per ottenere il medesimo effetto al momento della copia.

Se invece la relazione è di tipo ‘cascade‘ ma non vogliamo che le relazioni vengano copiate, è possibile specificare il parametro onDuplicate=None.

Nelle tabelle dei record in relazione potremo poi ridefinire i metodi onDuplicating (onDuplicating_many per copie multiple) e onDuplicated per personalizzare i record copia generati prima che questi vengano inseriti. Per un approfondimento si rimanda alla documentazione dedicata:


Vuoi vedere la copia multipla dei record all’opera? Aggiorna Genropy e provalo su Sandbox:


Ti stai avvicinando al mondo Genropy e desideri saperne di più? Seguici sui social per tenerti in contatto con le ultime novità che Genropy ha da offrire:

Genropy Seguici su Facebook
Pagina Facebook

 

Genropy Seguici Gruppo Facebook
Gruppo Facebook

 

Genropy Gruppo Telegram
Gruppo Telegram