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.

0

Warning o popup in Controller

Avatar
Giuseppe Stoduto

Buongiorno.

Mi trovo a cercare una soluzione per un mio problema che è poco documentato.

In pratica vorrei far vedere un messaggio di errore tipo raise warnining() nella funzione del controller.

in pratica vorrei fare una cosa del genere:

from openerp.http import Controller, route, request

from openerp.exceptions import Warning

class FrontPanelWeb(Controller):

    @http.route('/web/print_labels', type='http', auth="public")
    def download_document(self, model, id, **kw):
        raise Warning('Mio messaggio')


Ovviamente questa cosa non funzione era solo per farvi capire le mie intenzioni.

C'è un'api per fare questo?

Grazie

Avatar
Abbandona
3 Risposte
0
Avatar
Giuseppe Stoduto
Migliore risposta

Ho risolto modificando il codice javascript del pulsante che mi innesca la chiamata al controller.

Ricapitolando velocemente ho creato un pulsante:

<button name="start_edit" string="Edit" type="object" class="oe_highlight oe_inline" custom="warning" />

questo mi chiama una funzione che apparentemente non fa nulla:

    @api.multi
    def start_edit(self, data):
        """ L'url viene chiamato in javascript """
        return True

Quello che segue è il codice javascript che fa funzionare il tutto:


(function () {
    'use strict';
    var instance = openerp;
    var _t = instance.web._t,
        _lt = instance.web._lt;
    var QWeb = instance.web.qweb;

    instance.web.form.WidgetButton.include({

        custom_alert: function(message, title) {
            if( !title)
            title = 'Alert';

            if( !message)
            message = 'No Message to Display.';

            $('<div></div>').html(message).dialog({
                title: title,
                resizable: false,
                modal: true,
                show: { effect: "puff", duration: 300 },
                hide: { effect: "puff", duration: 300 },
                buttons: {
                    'Ok': function () {
                        $(this).dialog('close');
                    }
                }
            });
        },

        on_click: function () {
            console.log('this',this);
            if (this.node.attrs.custom === "warning") {
                var self = this;
                var model = this.view.model;
                var id = this.view.datarecord.id;
                instance.jsonRpc('/web/print_labels', 'call', { 'model': model, 'id': id }).then(function (result) {
                    // Your JS code here for checking backend validator result
                    if (result.message) {
                        self.custom_alert(result.message, result.title);
                        // alert(result.data);
                    }
                })
            }
            this._super();
        },

    });

})();

In pratica il pulsante ha un attributo "custom" che se uguale a "warning" mi fa partire un controller che mi ritorna l'errore che voglio che mi serve.

Questo è il controller:

from openerp.http import Controller, route, request
from openerp import http, _


class FrontPanelWeb(Controller):

    @http.route(['/web/print_labels'], type='json', auth="public")
    def download_document(self, model, id, **kw):
        url = request.httprequest.url
        # url_root = request.httprequest.url_root
        if 'localhost' not in url:
            return {
                'message': _('Editing of this field is only possible on the local server.'),
                'title': _('Server Error')
            }

Probabilmente  l'errore si potrebbe anche mostrare con "respose" ma non l'ho provato.

Questo codice fa parte di una soluzione ad un altro post. Insomma cono due post collegati.

https://www.odoo-italia.org/forum/forum-1/question/stato-pulsante-locale-o-remoto-921

Volendo migliorare il codice javascript si potrebbe mettere anche un altro attributo per lanciare in automatico uno specifico controller. Tipo "controller='/mio/controller/'" in modo da avere un modo più generale per far partire un controller a scelta premendo un pulsante.

Ma questa è un altra storia.....

Avatar
Abbandona
0
Avatar
Giuseppe Stoduto
Migliore risposta

Grazie per la risposta.

La versione di odoo è la 8 e dovrebbe avere la libreria bootstrap.

Mi potresti indicare un qualche esempio su come utilizzare tale libreria?

Avatar
Abbandona
0
Avatar
Walter Tosolini
Migliore risposta

Bella domanda... in effetti avrei utilizzato anche io l'approccio ai Raise. La parte web però dovrebbe utilizzare bootstrap, per cui se non hai un odoo troppo vecchio (e vedendo che usi openerp mi sa di si) dovresti poter usare la funzione "toast" di Bootstrap.

Avatar
Abbandona