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
Ricordati di inserire la versioni di Odoo per cui poni la domanda
  • Pagina:
  • 1
  • 2
  • 3

ARGOMENTO: [8.0] campo calcolato non appare nella ricerca avanzata

campo calcolato non appare nella ricerca avanzata 1 Anno 4 Mesi fa #29742

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
federico.ranieri ha scritto:
Di default I campi calcolati non vengono memorizzati nel DB. Di conseguenza non puoi effettuare una ricerca tramite filtri. Ci sono due soluzioni per fare quello che richiedi:

1) Impostare il campo calcolato come stored=True. Questa opzione salverà i dati nel DB, ma Attenzione! non vengono calcolati più in modo dinamico.

2) Implementare il metodo search in questo modo:
tuo_campo = field.Char(compute='_compute_tuo_campo', search='_search_tuo_campo')

def _search_tuo_campo(self, operator, value):
    if operator == 'like':
        operator = 'ilike'
    return [('name', operator, value)]


Super, Federico. Intanto il campo appare fra quelli che possono essere cercati, anche se la ricerca non funziona.
class ResPartner(models.Model):
    _inherit = 'res.partner'
    non_returning_customer=fields.Boolean(  string='Former remote customer', 
                                            compute="_compute_former", 
                                            search='_search_non_returning_customer')

    def _search_non_returning_customer(self, operator, value):
        if operator == 'like':
            operator = 'ilike'
        return [('name', operator, value)]

    @api.one
    def _compute_former(self):
        invoices = self.env['account.invoice'].search([('partner_id', '=', self.id)]) 
        today = datetime.datetime.now().date()
        if invoices:
            l = [i.date_invoice for i in invoices]
            invoice_date = datetime.datetime.strptime(max(l), "%Y-%m-%d").date()
            if ( today - invoice_date ).days > 70:
                self.non_returning_customer = True
Allegati:
Ultima modifica: 1 Anno 4 Mesi fa da ndrini.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

campo calcolato non appare nella ricerca avanzata 1 Anno 4 Mesi fa #29743

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Ti avevo detto mica di implementare la funzione search? :D :D

Cmq @federico è stato molto piu' chiaro e preciso di me.

Detto questo, devi implementare bene la funzione di ricerca :D :D
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

campo calcolato non appare nella ricerca avanzata 1 Anno 4 Mesi fa #29761

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
gigidn ha scritto:
Ti avevo detto mica di implementare la funzione search? :D :D

Cmq @federico è stato molto piu' chiaro e preciso di me.

Detto questo, devi implementare bene la funzione di ricerca :D :D

Certo.
E' che alle volte capisco quello che vuoi dire... altre....
rimane una suggestione.
E siccome odoo vuole codice :matrix:
non sempre riesco nella traduzione :-)


Comunque... sempre "tanto di cappello"
:metal:

Andrea
B)
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

campo calcolato non appare nella ricerca avanzata 1 Anno 4 Mesi fa #29762

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
gigidn ha scritto:
Detto questo, devi implementare bene la funzione di ricerca :D :D


L'unico esempio calzante che ho trovato, non restituisce un dominio
(a meno che versions.name_get() non sia un dominio...)
stackoverflow.com/questions/40819280/how...ertab=active#tab-top

bah

copierò più o meno il codice e vediamo che viene fuori...

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

campo calcolato non appare nella ricerca avanzata 1 Anno 4 Mesi fa #29765

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
ndrini ha scritto:
copierò più o meno il codice e vediamo che viene fuori...
:whistle:


Allora, in pratica non viene fuori nessuna ricerca, solo un simulacro di ricerca (cioè compare fra i campi ricercabili ma non filtra i record).

Vediamo se posso fare un po' di chiarezza:
poiché il campo di mio interesse è calcolato (e non conservato nel database (store = False) )
la mia funzione search deve ricacolare tutto
(tutto = tutti i valori del campo non_returning_customer)
e restituire il risultato (risultato = lista degli oggetti, cioè record, che soddisfano la condizione)


Peccato che la funzione search dovrebbe restituire (da documentazione) un dominio!!


Ho pensato a qualche cosa del tipo:
    def _search_non_returning_customer(self, operator, value):
        res = []
        for i in self.search([]):
            if i.non_returning_customer == value:
                res.append(i)
        return res.name_get()


Se fosse per me, lo scriverei solo così
    def _search_non_returning_customer(self, operator, value):
        return [('non_returning_customer', operator, value)]

e che si arrangi odoo a calcolarsi se è una condizione vera o falsa...
ma questa seconda semplicemente blocca odoo, senza dare nessun risultato (vedi allegato)
Ultima modifica: 1 Anno 4 Mesi fa da ndrini.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

campo calcolato non appare nella ricerca avanzata 1 Anno 4 Mesi fa #29768

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Il caso d'uso che vuoi modellare è complesso da qui la difficoltà.

Cosi' di primo acchito e con mezza attenzione alle prestazioni dovresti usare una query sql che estrae gli id di tutti i partner che rispettano, o non rispettano a seconda dei casi, la condizione. Ti consiglio SQL perchè valutare tutto con l'orm sarebbe estremamente gravoso in termini computazionali. Ottenuti gli id ritorni il domain con:
'id','in',[ids]

Ancora non ci siamo in termini di prestazioni visto che la lista di ids potrebbe essere molto lunga ma almeno è un punto di partenza.

La soluzione ottimale sarebbe vincolare l'aggiornamento del campo stored con un trigger (api.depend) e poi far una banalissima ricerca sul campo storicizzato.

Questo son solo spunti ... a te spetta trovare la soluzione migliore.
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: ndrini
  • Pagina:
  • 1
  • 2
  • 3
Tempo creazione pagina: 0.183 secondi

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

Protected by R Antispam