Forum

Benvenuto!

Questo è il forum ufficiale dell'Associazione Odoo Italia. Dopo esserti registrato potrai partecipare ponendo domande o rispondendo a quelle esistenti. Non scordarti di compilare il tuo profilo e consultare le linee guida prima di iniziare a scrivere.

1

[CE12][risolto] datetime.now

Avatar
Walter Tosolini

Ciao, mi trovo con una cosa quanto meno curiosa... ho fatto un banale campo Datetime in cui precompilo data e ora con il momento in cui viene aperta la form.

session_date = fields.Datetime(default=datetime.now() )

all'apertura della form in edit in effetti compila il campo con la data e ora, solo che sono quelle relative ai primi worker, o almeno credo che lo siano, perché chiudendo e riaprendo una nuova form mi ripresenta sempre le stesse date (più o meno in una sorta di ciclo) come se fossero congelate in un dato momento. Cioè rimangono sempre quelle finché non faccio un riavvio del service di Odoo.

Ho pensato di aver problemi con python, ma da CLI il comando funziona alla perfezione... il datetime mi tira su la data di qualche cache in Odoo? e se fosse così come diavolo lo risolvo?

Avatar
Abbandona
3 Risposte
1
Avatar
Luigi Di Naro
Migliore risposta

il problema non e' del datetime (stavo per risponderti ma ti sei risposto da solo) ma di tutti i default .... vengono valutati una solo volta allo strartup del server ... se il default e' una funzione questa viene eseguita quindi il valore cambia.

Ti stavo per rispondere, stai per caso usando dei default, la risposta non e' piu' necessaria ... aggiungo solo che tale comportamento e' esteso a tutti i default non solo datetime ...

Avatar
Abbandona
0
Avatar
Walter Tosolini
Migliore risposta

Grazie

Avatar
Abbandona
0
Avatar
Walter Tosolini
Migliore risposta

Niente mi autorispondo... da altrove fonte:

You have to use lambda function to get the current time. Otherwise it will take the latest server restart time.

_defaults = {
'date_action': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
}


Non sapevo di questa cosa del restart server time


Avatar
Abbandona
1
Avatar
Walter Tosolini
Migliore risposta

Mi ri-rispondo da solo, la soluzione sopra funziona ma non è elegante.
Molto meglio questa:

default=lambda self: fields.datetime.now()
Avatar
Abbandona
2
Avatar
Lorenzo Battistini
Migliore risposta

Oppure

default=datetime.now

Avatar
Abbandona
0
Avatar
Walter Tosolini
Migliore risposta

ehm a meno che datetime.now non sia differente da datetime.now() è proprio quello che avevo fatto inizialmente.

Avatar
Abbandona
1
Avatar
Lorenzo Battistini
Migliore risposta

Infatti è differente, datetime.now() ritorna una data, datetime.now un metodo

Avatar
Abbandona
0
Avatar
Walter Tosolini
Migliore risposta

Ok... ma questa cosa è specifica di Odoo? perché dalla documentazione non ci sarei mai arrivato. Anzi io deduco che le parentesi siano obbligatorie.

https://docs.python.org/3/library/datetime.html#datetime.datetime.now


Avatar
Abbandona
0
Avatar
Lorenzo Battistini
Migliore risposta

No, è python

>>> datetime.now
<built-in method now of type object at 0xa33e60>
>>> datetime.now()
datetime.datetime(2020, 11, 19, 14, 52, 18, 415698)
Avatar
Abbandona