Questo sito utilizza cookie per le proprie funzionalità e per inviarti pubblicità e servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie.

Accedendo al link http://www.odoo-italia.org/index.php/home/cookie-policy puoi leggere in dettaglio le modalità di trattamento dei cookie da parte dell'Associazione Odoo Italia.

Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2

ARGOMENTO: Aggiornamento oggetti e vista compromessa

Aggiornamento oggetti e vista compromessa 8 Anni 5 Mesi fa #2819

  • dmassarenti
  • Avatar di dmassarenti
  • Offline
  • Fresh Boarder
  • Messaggi: 10
  • Karma: 0
Ciao, ho un problema con l'aggiornamento "incrociato" di oggetti. Potrebbe essere una disattenzione banale ma sono un neofita assoluto, quindi chiedo scusa in anticipo...

sono coinvolti due oggetti: 'documento' e 'palazzo'. Entrambi hanno un campo 'state'. L'idea è che quando modifico lo stato di 'documento' (con il pulsante 'button_submit_doc') venga modificato anche lo stato di 'palazzo'. Lo scopo è raggiunto, funziona (o per lo meno gli stati vengono aggiornati come vorrei). Peccato che se poi torno nella view tree di 'documento' venga generato un errore sconosciuto, definito dall'indice (su db) dell'oggetto 'documento' che ho appena creato/modificato. Se elimino da db il record la view torna a funzionare correttamente.
Riporto gli stralci di codice che potrebbero essere coinvolti:



documento.py
class documento(osv.osv):
    _columns = {
        ...
        'palazzo_id':fields.many2one('palazzo','Palazzo', required=True),
        'state': fields.selection([('draft', 'Bozza'),('submitted', 'In valutazione')], 'Stato documento', readonly=True)
        ...
    }

def button_submit_doc(self, cr, uid, ids, *args):
    if not len(ids):
        return False
    self.write(cr, uid, ids, {'state': 'submitted', })
    for doc in self.browse(cr,uid,ids):
        idpalazzo = doc.palazzo_id.id
        self.pool.get('palazzo').write(cr, uid, idpalazzo, {'state': 'confirmed',})
    return True


palazzo.py
class palazzo(osv.osv):
    _columns = {
        ....
        'state':fields.selection((('draft', 'Bozza'), ('confirmed', 'Confermato')), 'Stato palazzo',required=True),
        
    }


documento_view.xml

<record id="view_documento_form" model="ir.ui.view">
    <field name="name">documento.form</field>
    <field name="model">documento</field>
    <field name="type">form</field>
    <field eval="20" name="priority"/>
    <field name="arch" type="xml">
        <form string="Nuova Offerta">
            <group>
                ....
                <field name="palazzo_id"/>
                ....
                <button name="button_submit_doc" states="draft" string="Proponi" type="object"/>  
            </group>
        </form>
    </field>
</record>

<record id="view_documento_tree" model="ir.ui.view">
    <field name="name">documento.tree</field>
    <field name="model">documento</field>
    <field name="type">tree</field>
    <field name="arch" type="xml">
        <tree string="Elenco documenti">
            ....
            <field name="cliente_id"/>
            ...
        </tree>
    </field>
</record>

L'errore è questo (dalla console del server):

[2010-09-03 17:36:45,398] ERROR:web-services:[01]:
[2010-09-03 17:36:45,398] ERROR:web-services:[02]: Environment Information :
[2010-09-03 17:36:45,398] ERROR:web-services:[03]: System : Linux-2.6.32-25-generic-pae-i686-with-Ubuntu-10.04-lucid
[2010-09-03 17:36:45,398] ERROR:web-services:[04]: OS Name : posix
[2010-09-03 17:36:45,399] ERROR:web-services:[05]: Distributor ID: Ubuntu
[2010-09-03 17:36:45,399] ERROR:web-services:[06]: Description: Ubuntu 10.04.1 LTS
[2010-09-03 17:36:45,399] ERROR:web-services:[07]: Release: 10.04
[2010-09-03 17:36:45,399] ERROR:web-services:[08]: Codename: lucid
[2010-09-03 17:36:45,399] ERROR:web-services:[09]: Operating System Release : 2.6.32-25-generic-pae
[2010-09-03 17:36:45,399] ERROR:web-services:[10]: Operating System Version : #43-Ubuntu SMP Wed Sep 1 11:17:51 UTC 2010
[2010-09-03 17:36:45,399] ERROR:web-services:[11]: Operating System Architecture : 32bit
[2010-09-03 17:36:45,399] ERROR:web-services:[12]: Operating System Locale : it_IT.UTF8
[2010-09-03 17:36:45,399] ERROR:web-services:[13]: Python Version : 2.6.5
[2010-09-03 17:36:45,399] ERROR:web-services:[14]: OpenERP-Server Version : 5.0.12
[2010-09-03 17:36:45,399] ERROR:web-services:[15]: Last revision No. & ID :
[2010-09-03 17:36:45,399] ERROR:web-services:[16]: Traceback (most recent call last):
[2010-09-03 17:36:45,399] ERROR:web-services:[17]: File "/home/dario/openerp-server-5.0.12/bin/osv/osv.py", line 58, in wrapper
[2010-09-03 17:36:45,399] ERROR:web-services:[18]: return f(self, dbname, *args, **kwargs)
[2010-09-03 17:36:45,400] ERROR:web-services:[19]: File "/home/dario/openerp-server-5.0.12/bin/osv/osv.py", line 119, in execute
[2010-09-03 17:36:45,400] ERROR:web-services:[20]: res = pool.execute_cr(cr, uid, obj, method, *args, **kw)
[2010-09-03 17:36:45,400] ERROR:web-services:[21]: File "/home/dario/openerp-server-5.0.12/bin/osv/osv.py", line 111, in execute_cr
[2010-09-03 17:36:45,400] ERROR:web-services:[22]: return getattr(object, method)(cr, uid, *args, **kw)
[2010-09-03 17:36:45,400] ERROR:web-services:[23]: File "/home/dario/openerp-server-5.0.12/bin/osv/orm.py", line 2228, in read
[2010-09-03 17:36:45,400] ERROR:web-services:[24]: result = self._read_flat(cr, user, select, fields, context, load)
[2010-09-03 17:36:45,400] ERROR:web-services:[25]: File "/home/dario/openerp-server-5.0.12/bin/osv/orm.py", line 2362, in _read_flat
[2010-09-03 17:36:45,400] ERROR:web-services:[26]: record[f] = res2[record]
[2010-09-03 17:36:45,400] ERROR:web-services:[27]: KeyError: 27



Probabilmente faccio inconsapevolmente del casino quando lavoro con i metodi dell'orm, ma non riesco a capire dove! Se qualcuno ha un suggerimento è ben accetto!
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re:Aggiornamento oggetti e vista compromessa 8 Anni 5 Mesi fa #2820

  • enlightx
  • Avatar di enlightx
  • Online
  • Platinum Boarder
  • Messaggi: 6064
  • Ringraziamenti ricevuti 638
  • Karma: 85
Ciao,
fai una prova al volo per restringere il campo.

chiudi pagina o tab e riapri la vista e guarda se così funziona.
Davide Corio
Odoo Solution Architect
email: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
web: www.davidecorio.com
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re:Aggiornamento oggetti e vista compromessa 8 Anni 5 Mesi fa #2821

  • eLBati
  • Avatar di eLBati
  • Online
  • Platinum Boarder
  • Messaggi: 1766
  • Ringraziamenti ricevuti 186
  • Karma: 38
Ciao,

non mi sembra di vedere alcunché di sbagliato nel tuo codice (se non usi "button_submit_doc", la tree view di "documento" funziona, giusto?)

Potresti anche infilare pdb da qualche parte per vedere se ci sono delle variabili con valori che ti possano dare indizi sul motivo dell'errore.
Ad esempio, potresti sostituire la riga 2362 di orm.py con
try:
                            record[f] = res2[record['id']]
                        except Exception, e:
                            import pdb; pdb.set_trace()
                            raise e
Lorenzo Battistini
github.com/eLBati

TAKOBI
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re:Aggiornamento oggetti e vista compromessa 8 Anni 5 Mesi fa #2822

  • dmassarenti
  • Avatar di dmassarenti
  • Offline
  • Fresh Boarder
  • Messaggi: 10
  • Karma: 0
Ho provato sia a chiudere/riaprire il client, sia a riavviare il server, ma fa sempre lo stesso gioco.
Quando creo il nuovo documento le sue view funzionano. Quando uso il pulsante button_submit_doc non mi viene restituito nessun errore, e la form view di documento - in cui resto - continua a funzionare, ma appena passo alla tree view... bum! Key error. Sembra che nel momento in cui cambio lo stato a documento io vada a fare qualche danno a livello di relazioni tra oggetti. Ho guardato con PGAdmin ma gli indici sembrano a posto...
Sinceramente mi aspettavo di essere bacchettato sul contenuto del metodo button_submit_doc, ma se mi dite che non ci sono errori eclatanti, sono ancora più disorientato di prima...
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re:Aggiornamento oggetti e vista compromessa 8 Anni 5 Mesi fa #2823

  • angedras
  • Avatar di angedras
  • Offline
  • Platinum Boarder
  • Messaggi: 330
  • Ringraziamenti ricevuti 4
  • Karma: 10
Ciao,
l'unica cosa che mi sembra di notare è che il metodo button_submit_doc non è indentato con la definizione di classe dell'oggetto documento; sinceramente credo non sia questa la causa dell'errore.
Il problema andrebbe analizzato più in profondità

Roberto
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re:Aggiornamento oggetti e vista compromessa 8 Anni 5 Mesi fa #2843

  • dmassarenti
  • Avatar di dmassarenti
  • Offline
  • Fresh Boarder
  • Messaggi: 10
  • Karma: 0
Ho (pensato di aver) risolto il problema facendo pulizia sul db. Ora la questione si è ripresentata, e mi sono reso conto che non ha niente a che fare con il button di cui avevo parlato inizialmente.
Ho seguito il suggerimento di eLBati e mi sono piazzato su orm.py per vedere cosa succede. Lo scenario è questo: ho un oggetto 'pippo' che contiene un campo calcolato 'altezza'. Ne istanzio uno, tutto ok, tree e form visualizzati senza problemi. Ne creo un secondo, il salvataggio fila liscio ma se provo a passare alla tree arriva la crepa. Sul db i dati sono tutti presenti e corretti. Allora mi viene un'illuminazione: forse il campo 'altezza' dà fastidio alla vista tree. Lo tolgo dalla vista e magicamente questa riprende a funzionare. Però... se adesso provo ad aprire la vista form di uno dei due oggetti creati mi viene riproposto lo stesso errore di prima! KeyError.
Mi concentro su orm.py (faccio riferimento allo stralcio di codice seguente)
# Compute POST fields
    todo = {}
    for f in fields_post:
        todo.setdefault(self._columns[f]._multi, [])
        todo[self._columns[f]._multi].append(f)
    for key,val in todo.items():
        if key:
            res2 = self._columns[val[0]].get(cr, self, ids, val, user, context=context, values=res)
            for pos in val:
                for record in res:
                    record[pos] = res2[record['id']][pos]
        else:
            for f in val:
                res2 = self._columns[f].get(cr, self, ids, f, user, context=context, values=res)
                for record in res:
                    try:
                        record[f] = res2[record['id']]
                    except Exception, e:
                        import pdb; pdb.set_trace()
                        raise e

L'istruzione che provoca errore è record[f] = res2[record]
dove:
f è il campo 'altezza'
record vale 71
res contiene i dizionari relativi alle istanze di 'pippo' aventi id 70 e 71
res2 è un dizionario contenente solo l'accoppiata {70: 183}, ovverlo l'altezza dell'istanza con id 70
Quindi in res2 manca l'elemento con indice 71. Se a runtime cerco di popolare res2 invertendo l'ordine degli 'ids':
self._columns[f].get(cr, self, [71, 70], f, user, context=context, values=res)
mi viene restituito
{71: 180}
quindi sempre solo un dizionario con un elemento. E' qui il problema? o mi sto confondendo ancora una volta?...

Grazie a chi ha avuto la pazienza di leggere fin qui :)
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Tempo creazione pagina: 0.150 secondi

Odoo Italia Associazione - C.F: 94200470485 - Sede: Viale dei Cadorna, 83 - Firenze - Italy

Protected by R Antispam