Gogs пре 6 година
родитељ
комит
32bfb4d492
5 измењених фајлова са 160 додато и 22 уклоњено
  1. 3 1
      controllers/main.py
  2. 3 1
      models/res_users.py
  3. 121 19
      static/src/js/main.js
  4. 28 0
      static/src/xml/main.xml
  5. 5 1
      views/res_user_form.xml

+ 3 - 1
controllers/main.py

@@ -16,7 +16,9 @@ class PrintEngineController(http.Controller):
             'host': res_user.tray_host or None,
             'port': res_user.tray_port or None,
             'path': res_user.tray_path or None,
-            'print_directly': res_user.tray_print_direcly or False
+            'print_directly': res_user.tray_print_direcly or False,
+            'action_download_pdf': res_user.action_download_pdf or False,
+            'action_preview_pdf': res_user.action_preview_pdf or False
         }
 
     '''

+ 3 - 1
models/res_users.py

@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from openerp import models, fields
+from openerp import models, fields, api
 
 class ResUsers(models.Model):
     _inherit = 'res.users'
@@ -8,3 +8,5 @@ class ResUsers(models.Model):
     tray_port = fields.Integer(string='Puerto', default=8070, required=True)
     tray_path = fields.Char(string='Recurso', default='/printers-tray', required=True)
     tray_print_direcly = fields.Boolean(string='Imprimir directamente', default=True)
+    action_download_pdf = fields.Boolean(string='Permitir descargar PDF', default=False)
+    action_preview_pdf = fields.Boolean(string='Previsualizar PDF', default=False)

+ 121 - 19
static/src/js/main.js

@@ -12,13 +12,17 @@ openerp.print_engine = function (instance, local) {
 
             var setup_socket = function (config) {
                 self.config = config;
-                self.socket = io(location.protocol + '//' + config.host + ':' + config.port, {
-                    path: config.path
-                });
-                self.socket.on('connect', self.handle_connect);
-                self.socket.on('connect_error', self.handle_connect_error);
-                self.socket.on('request_printer_name', self.handle_printer_selection);
-                self.socket.on('show_print_status', self.handle_print_status);
+                self.config.is_mobile = self.is_mobile_browser()
+
+                if (!self.config.is_mobile) {
+                    self.socket = io(location.protocol + '//' + config.host + ':' + config.port, {
+                        path: config.path
+                    });
+                    self.socket.on('connect', self.handle_connect);
+                    self.socket.on('connect_error', self.handle_connect_error);
+                    self.socket.on('request_printer_name', self.handle_printer_selection);
+                    self.socket.on('show_print_status', self.handle_print_status);
+                }
             }
 
             this.get_socket_config().then(setup_socket);
@@ -31,17 +35,38 @@ openerp.print_engine = function (instance, local) {
             $('#printer-status').removeClass();
             $('#printer-status').addClass('printer-status-offline');
         },
-        handle_printer_selection: function (printers) {
+        handle_printer_selection: function (data) {
             instance.web.unblockUI();
-        
-            var widget = new local.PrinterSelectionWidget(printers);
-            widget.get_selection().then(function (printer) {
-                console.log(printer);
+            var self = this;
+
+            if (data.printers && data.printer.length === 0) {
+                instance.web.notification.do_notify('Impresión', 'No hay impresoras instaladas');
+                return;
+            }
+
+            var widget = new local.PrinterSelectionWidget(data);
+            widget.get_selection().then(function (new_request) {
+                self.emit('request_print', new_request);
             });
         },
         handle_print_status: function (data) {
             instance.web.unblockUI();
 
+            if (_.isEqual(data.status, 'failed')) {
+                instance.web.notification.do_warn('Impresión', 'Ha fallado la cola de impresión');
+                return;
+            }
+
+            if (_.isEqual(data.status, 'canceled')) {
+                instance.web.notification.do_notify('Impresión', 'Se ha cancelado la impresión');
+                return;
+            }
+
+            if (_.isEqual(data.status, 'unknown')) {
+                instance.web.notification.do_warn('Impresión', 'Imposible imprimir un formato de datos desconocido');
+                return;
+            }
+
             if (_.isEqual(data.status, 'printing')) {
                 instance.web.notification.do_notify('Impresión', 'La impresora ' + data.printer + ' está imprimiendo');
                 return;
@@ -53,7 +78,7 @@ openerp.print_engine = function (instance, local) {
             }
 
             if (_.isEqual(data.status, 'error')) {
-                instance.web.notification.do_notify('Impresión', 'Ocurrió un error al imprimir: ' + data.printer);
+                instance.web.notification.do_warn('Impresión', 'Ocurrió un error al imprimir: ' + data.printer);
             }
         },
         get_socket_config: function () {
@@ -72,6 +97,10 @@ openerp.print_engine = function (instance, local) {
                 });
             });
         },
+        is_mobile_browser: function () {
+            var userAgent = navigator.userAgent;
+            return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4));
+        },
         request_print: function (data) {
             if (!this.socket || !this.socket.connected) {
                 instance.web.notification.do_warn('Impresión', 'La impresora no está preparada');
@@ -81,7 +110,7 @@ openerp.print_engine = function (instance, local) {
             instance.web.blockUI();
             try {
                 this.socket.emit('request_print', {
-                    print_direcly: this.config.print_direcly,
+                    print_directly: this.config.print_directly,
                     data: data
                 });
             } catch (e) {
@@ -98,14 +127,51 @@ openerp.print_engine = function (instance, local) {
         }
     });
 
+    local.PrinterUnavailableWidget = instance.web.Widget.extend({
+        template: 'PrinterUnavailableWidget',
+        events: {
+            'click li': 'on_download'
+        },
+        init: function (parent) {
+            this._super(parent);
+            this.start();
+        },
+        start: function () {
+            this.defer = $.Deferred();
+            this.render_widget();
+        },
+        render_widget: function () {
+            this.renderElement();
+            $('body').append(this.$el);
+            
+            this.$el.on('hidden.bs.modal', this, this.on_hide);
+
+            this.$el.modal('show');
+        },
+        on_download: function () {
+            this.download_pdf = true;
+            this.$el.modal('hide');
+        },
+        on_hide: function (e) {
+            var self = e.data;
+            self.defer.resolve(!!self.download_pdf);
+        },
+        can_download: function () {
+            return this.defer;
+        }
+    });
+
+
     local.PrinterSelectionWidget = instance.web.Widget.extend({
         template: 'PrinterSelectionWidget',
         events: {
             'click li': 'on_select'
         },
         printers: [],
-        init: function (printers) {
-            this.printers = printers;
+        init: function (data) {
+            this.id = data.id;
+            this.printers = data.printers;
+
             this.start();
         },
         start: function () {
@@ -131,7 +197,11 @@ openerp.print_engine = function (instance, local) {
         },
         on_hide: function (e) {
             var self = e.data;
-            self.defer.resolve(self.selected_printer);
+            self.defer.resolve({
+                id: self.id,
+                printer: self.selected_printer,
+                print_directly: true
+            });
         }
     });
 
@@ -141,7 +211,7 @@ openerp.print_engine = function (instance, local) {
                 do_update: function () {
                     var printer = new local.PrinterTopWidget(this);
                     printer.appendTo($('.oe_systray'));
-                    local.socket = new local.SocketManager();
+                    local.socket_manager = new local.SocketManager();
                     return this._super.apply(this, arguments);
                 }
             });
@@ -149,7 +219,39 @@ openerp.print_engine = function (instance, local) {
 
         if (instance.web.ActionManager) {
             instance.web.ActionManager.include({
+                trigger_preview_pdf: function (action) {
+                    console.log(action);
+                },
+                trigger_download_pdf: function (action) {
+                    console.log(action);
+                },
                 ir_actions_report_xml: function (action, options) {
+                    var self = this;
+                    var config = instance.print_engine.socket_manager.config.is_mobile;
+
+                    if (config.is_mobile) {
+                        this.trigger_preview_pdf(ctx)
+                        return;
+                    }
+
+                    if (instance.print_engine.socket_manager.socket.disconnected) {
+                        var widget = new local.PrinterUnavailableWidget(this);
+                        widget.can_download().then(function (can_download) {
+                            if (!can_download) {
+                                return;
+                            }
+
+                            if (config.action_preview_pdf) {
+                                self.trigger_preview_pdf(action);
+                                return;
+                            }
+
+                            self.trigger_download_pdf(action);
+                        });
+
+                        return;
+                    }
+
                     var url = '/print_engine/get_pdf';
                     var ctx = _.clone(action.context);
 
@@ -158,7 +260,7 @@ openerp.print_engine = function (instance, local) {
                     instance.web.jsonRpc(url, 'call', {
                         context: ctx
                     }).done(function (result) {
-                        instance.print_engine.socket.request_print(result.data);
+                        instance.print_engine.socket_manager.request_print(result.data);
                     }).fail(function (e) {
                         instance.webclient.crashmanager.show_message(e);
                     });

+ 28 - 0
static/src/xml/main.xml

@@ -8,6 +8,34 @@
             </a>
         </li>
     </t>
+    <t t-name="PrinterUnavailableWidget">
+        <div aria-hidden="false" class="modal fade" role="dialog" tabindex="-1">
+            <div class="modal-dialog">
+                <div class="modal-content openerp">
+                    <div class="modal-header">
+                        <button aria-hidden="true" class="close" data-dismiss="modal" type="button">×</button>
+                        <h3 class="modal-title">Impresión no disponible</h3>
+                    </div>
+                    <div class="modal-body oe_act_window">
+                        <p style="margin-left: 25px;">La impresión rápida no está disponible, sin embargo puede hacer lo siguiente:</p>
+                        <div class="printer_selection_wrapper" style="height: 120px;">
+                            <ul class="printer_selection_list">
+                                <li>
+                                    <i class="fa fa-file-pdf-o"></i>
+                                    <div>
+                                        <h2>Descargar PDF</h2>
+                                    </div>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <button class="oe_button oe_highlight" data-dismiss="modal" type="button">Cerrar</button>
+                    </div>
+                </div>                                                
+            </div>
+        </div>
+    </t>
     <t t-name="PrinterSelectionWidget">
         <div aria-hidden="false" class="modal fade" role="dialog" tabindex="-1">
             <div class="modal-dialog">

+ 5 - 1
views/res_user_form.xml

@@ -7,7 +7,7 @@
             <field name="inherit_id" ref="base.view_users_form"/>
             <field name="arch" type="xml">
                 <xpath expr="//notebook/page[last()]" position="after">
-                    <page string="Impresoras">
+                    <page string="Impresión">
                         <group>
                             <group string="Servidor de impresión">
                                 <field name="tray_host" />
@@ -15,6 +15,10 @@
                                 <field name="tray_path" />
                                 <field name="tray_print_direcly" />
                             </group>
+                            <group string="PDF">
+                                <field name="action_download_pdf" />
+                                <field name="action_preview_pdf" />
+                            </group>
                         </group>
                     </page>
                 </xpath>