2015-08-12 20 views
7

Ho un modello temporaneo che funge da finestra di dialogo. A mio avviso forma ho un pulsante mi piace questo:Odoo - impedisce al pulsante di chiudere la procedura guidata

<footer states="partnerId"> 
    <button name="check_tax_id" string="Tovább" type="object"/> 
</footer> 

Il tasto richiama questa funzione (posso confermare che richiama in realtà):

@api.one 
    def check_tax_id(self, context=None): 
     self.state = "partnerDetails" 

     return None; 

Il mio problema è che la finestra di dialogo viene chiusa immediatamente una volta Faccio clic su questo pulsante! Cosa sto sbagliando?

risposta

16

Soluzione 0

@api.multi 
def check_tax_id(self): 
    self.ensure_one() 
    self.name = "New name" 
    return { 
     "type": "ir.actions.do_nothing", 
    } 

Questa soluzione è stata fornita da here Tadeusz Karpinski.

Soluzione 1

è possibile restituire un nuovo modulo con lo stesso record id.

@api.multi 
def check_tax_id(self): 
    self.ensure_one() 
    self.name = "New name" 
    return { 
     'context': self.env.context, 
     'view_type': 'form', 
     'view_mode': 'form', 
     'res_model': 'model_name', 
     'res_id': self.id, 
     'view_id': False, 
     'type': 'ir.actions.act_window', 
     'target': 'new', 
    } 

Soluzione 2

È possibile creare un widget in jQuery. Questo aprirà la procedura guidata e potrai assegnare manualmente il comportamento che desideri ai pulsanti. È possibile utilizzare la funzione call per richiamare le funzioni python così:

[...] 

new instance.web.Dialog(this, { 
    title: _t("Title"), 
    width: '95%', 
    buttons: [ 
      { text: _t("First button"), click: function() { self.first_button(); }}, 
      { text: _t("Second button"), click: function() { self.second_button(); }}, 
      { text: _t("Close"), click: function() { dialog.close(); }},      
     ], 
}); 

[...] 

Soluzione 3

Naturalmente è possibile eseguire l'override del metodo create anche per evitare la creazione di record in alcuni casi

Soluzione 4

Un'ultima opzione. Creare un flusso di lavoro con un campo di stato. Crea pulsanti del flusso di lavoro per inviare segnali per cambiare lo stato. Puoi mostrare o nascondere il resto dei campi usando l'attributo attrs e il campo dello stato. Ma non so se questo si adatterebbe ai tuoi bisogni.

+0

Ho trovato informazioni importanti qui: https://github.com/odoo/odoo/issues/2270 –

+0

Attualmente la tua soluzione sembra l'unica che funzioni. –

+0

Il record è già stato creato all'avvio della procedura guidata, non verrà creato di nuovo se si passa id della procedura guidata corrente ma verrà creato se si passa False in res_id. – StackUP

0

Sì, hai ragione ... ma non abbiamo alcuna soluzione. Perché quando si fa clic su un pulsante qualsiasi della procedura guidata, la procedura guidata viene automaticamente distrutta.

Ma è possibile eseguire tale metodo utilizzando il metodo write onchange di qualsiasi campo.

0

sul vudù 7

def traszero(self ,cr ,uid ,ids ,context=None): 
     data_obj = self.pool.get('stock.return.picking.line') 
     ret_wizard = self.browse(cr, uid, ids, context=context) 
     if ret_wizard.product_return_moves: 
      line_ids = ret_wizard.product_return_moves.mapped('id') 
      data_obj.write(cr, uid, line_ids, {'quantity': 0}, context=context) 
     return {'name':"Return Shipment", 
      'res_model':"stock.return.picking", 
      'src_model':"stock.picking", 
      'view_mode':"form", 
      'target':"new", 
      'key2':"client_action_multi", 
      'multi':"True", 
      'res_id':ids[0], 
      'type': 'ir.actions.act_window', 
      } 
0

Che cosa si può fare è avere il pulsante Apri un altro mago passando contesto con tutti i valori inseriti nella prima procedura guidata. Questo ti permette di eseguire alcune funzioni, es. il tuo pulsante. E mantieni lo stato del tuo mago. Pertanto, il valore predefinito per i campi nella procedura guidata deve innanzitutto verificare il contesto e eseguire il fallback su qualcos'altro.

Ecco un esempio:

class MyWizard(models.TransientModel): 
    _name = 'myaddon.mywizard' 

    def _get_default_char(self): 
     return self._context.get('mychar',"") 

    mychar = fields.Char(string="My Char", default=_get_default_char) 

    @api.multi 
    def my_button(self): 
     # Execute Function Here 
     # reload wizard with context 

     return { 
      'view_type': 'form', 
      'view_mode': 'form', 
      'res_model': 'myaddon.mywizard', 
      'type': 'ir.actions.act_window', 
      'target': 'new', 
      'context': '{"mychar":'HELLO WORLD'}', 
     } 
+0

Grazie, ma penso che la risposta accettata sia molto più semplice ed efficiente mentre si raggiunge lo stesso obiettivo. –

5

Nel mio caso questo codice funziona.

@api.multi 
def test(self): 
    l = logging.getLogger() 
    l.warn("xD") 
    return { 
     "type": "ir.actions.do_nothing", 
    } 
2

Il più semplice questo per fare è:

@api.multi 
def null_action(self): 
    return { 
     "type": "set_scrollTop", 
    } 

Come il tipo viene utilizzato per chiamare qualsiasi metodo sul ActionManager classe (javascript)

E 'meglio di "tipo": "ir .actions.do_nothing "che genera un'eccezione (questo attributo non esiste)

2

ieri mi sono imbattuto in questo stesso problema. Avevo bisogno di mostrare un pulsante per fare qualcosa senza sottomettere l'intera wizaard. Ci ho lavorato attorno senza usare un pulsante. È abbastanza semplice ed efficace. Quello che vi serve:

  1. un flag booleano nel modello guidata
  2. un onchange attaccato alla bandiera (che sostituisce si sumbmit funzione)
  3. sostituire il pulsante nella vista w/bandiera w/invisible="1" e un'etichetta per essere in stile come un pulsante

Ecco il codice:

source_it = fields.Boolean(string='Source') 
[...] 
def action_source(self): 
    # do stuff 

@api.onchange('source_it') 
def onchange_source_it(self): 
    if self.env.context.get('sourcing_now') or not self.source_it: 
     return 
    self.action_source() 
[...] 
<label for="source_it" class="pull-left btn btn-success" /> 
<field name="source_it" invisible="1" /> 

il trucco w orks perché quando un'etichetta ha l'attributo for si comporta come la casella di controllo stessa, quindi se si fa clic sull'etichetta si sta effettivamente commutando la casella di controllo.