Bladeren bron

[IMP] mejorado el sistema de preferencias del socket de impresión y llamadas remotas

Gogs 6 jaren geleden
bovenliggende
commit
b780a44140

+ 1 - 3
__openerp__.py

@@ -7,9 +7,7 @@
     'depends': ['base', 'web'],
     'data': [
         'templates.xml',
-        'views/print_engine_printer_view.xml',
-        'views/res_config_view.xml',
-        'security/printers_group.xml'
+        'views/res_user_form.xml'
     ],
     'qweb': [
         'static/src/xml/*.xml'

+ 6 - 46
controllers/main.py

@@ -2,61 +2,21 @@
 from openerp import http
 from openerp.http import request
 from openerp.report import render_report
-from werkzeug.wrappers import Response
-from werkzeug.datastructures import Headers
-from gzip import GzipFile
-from StringIO import StringIO as IO
-import json
-import logging
 import base64
 
-LOGGER = logging.getLogger(__name__)
-GZIP_COMPRESSION_LEVEL = 9
-
 class PrintEngineController(http.Controller):
 
-    '''
-    '''
-    def make_info_log(self, log):
-        LOGGER.info('[INFO] {}'.format(log))
-
-    '''
-        Make GZIP to JSON response
-    '''
-    def make_gzip_response(self, data=None, status=200):
-        gzip_buffer = IO()
-        with GzipFile(mode='wb', compresslevel=GZIP_COMPRESSION_LEVEL, fileobj=gzip_buffer) as gzip_file:
-            gzip_file.write(json.dumps(data))
-        
-        contents = gzip_buffer.getvalue()
-        gzip_buffer.close()
-
-        headers = Headers()
-        headers.add('Content-Encoding', 'gzip')
-        headers.add('Vary', 'Accept-Encoding')
-        headers.add('Content-Length', len(contents))
-
-        return Response(contents, status=status, headers=headers, content_type='application/json')
- 
-    '''
-    '''
-    @http.route('/print_engine/update_printers', auth='user', type='json', methods=['POST'], cors='*')
-    def printers_update(self, **kw):
-
-        import pdb; pdb.set_trace()
-        return True
-
     '''
     '''
     @http.route('/print_engine/socket_config', auth='user', type='json')
     def socket_config(self, **kw):
-        settings_obj = request.env['print.engine.settings']
-        settings = settings_obj.search([])
-        
+        res_user = request.env.user
+
         return {
-            'host': settings.host or None,
-            'port': settings.port or None,
-            'path': settings.path or None
+            '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
         }
 
     '''

+ 1 - 2
models/__init__.py

@@ -1,3 +1,2 @@
 # -*- coding: utf-8 -*-
-import print_engine_printer
-import res_config
+import res_users

+ 0 - 10
models/print_engine_printer.py

@@ -1,10 +0,0 @@
-#-*- coding: utf-8 -*-
-from openerp import api, models, fields
-
-class PrintEnginePrinter(models.Model):
-    _name = 'print.engine.printer'
-
-    name = fields.Char(string='Impresora', size=35, required=True)
-    is_default = fields.Boolean(string='Por defecto', default=False)
-    prints_success_count = fields.Integer(string='Impresiones con éxito', default=0)
-    prints_failed_count = fields.Integer(string='Impresiones fallidas', default=0)

+ 0 - 11
models/res_config.py

@@ -1,11 +0,0 @@
-# -*- coding: utf-8 -*-
-from openerp import api, models, fields
-
-class PrintEngineSettings(models.TransientModel):
-    _name = 'print.engine.settings'
-    _inherit = 'res.config.settings'
-
-    host = fields.Char(string='Dirección', default='localhost', required=True)
-    port = fields.Integer(string='Puerto', default=8070, required=True)
-    path = fields.Char(string='Recurso', default='/printers-tray', required=True)
-    show_printers = fields.Boolean(string='Preguntar al imprimir', default=True)

+ 10 - 0
models/res_users.py

@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields
+
+class ResUsers(models.Model):
+    _inherit = 'res.users'
+
+    tray_host = fields.Char(string='Dirección', default='localhost', required=True)
+    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)

+ 0 - 8
security/printers_group.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
-    <data noupdate="0">
-        <record id="print_engine.printers_group" model="res.groups">
-            <field name="name">Administrar preferencias de impresión</field>
-        </record>
-    </data>
-</openerp>

+ 46 - 1
static/src/css/main.css

@@ -17,4 +17,49 @@
 
 .printer-status-offline {
     background: #ef5350;
-}
+}
+
+.printer_selection_wrapper {
+    width: 500px;
+    height: 350px;
+    margin: auto;
+}
+
+.printer_selection_wrapper .printer_selection_list {
+    list-style: none;
+    padding: 15px;
+}
+
+.printer_selection_wrapper .printer_selection_list li {
+    margin-bottom: 25px;
+    padding-bottom: 20px;
+    border-bottom: 1px solid #e0e0e0;
+    animation-duration: 500ms;
+}
+
+.printer_selection_wrapper .printer_selection_list li:hover {
+    cursor: pointer;
+    border-left: 5px solid #e0e0e0;
+    padding-left: 15px;
+}
+
+.printer_selection_wrapper .printer_selection_list li i {
+    display: inline-block;
+    font-size: 24pt;
+}
+
+.printer_selection_wrapper .printer_selection_list li div {
+    margin: 0 25px;
+    display: inline-block;
+}
+
+.printer_selection_wrapper .printer_selection_list li div h2 {
+    margin: 0;
+    font-size: 12pt;
+}
+
+.printer_selection_wrapper .printer_selection_list li div p {
+    margin: 0;
+    font-size: 10pt;
+    color: #9e9e9e;
+}

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

@@ -10,19 +10,18 @@ openerp.print_engine = function (instance, local) {
         open_socket: function () {
             var self = this;
 
-            var set_socket = function (socket) {
+            var setup_socket = function (config) {
                 var protocol = window.location.protocol;
-                self.socket = io(protocol + '//' + socket.host + ':' + socket.port, {
-                    path: socket.path
+                self.socket = io(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('show-printers', self.handle_printers);
-                self.socket.on('print-error', self.handle_print_error);
-                self.socket.on('print-finished', self.handle_print_finished);
+                self.socket.on('show-print-status', self.handle_print_status);
             }
 
-            this.get_socket_config().then(set_socket);
+            this.get_socket_config().then(setup_socket);
         },
         handle_connect: function () {
             $('#printer-status').removeClass();
@@ -33,13 +32,29 @@ openerp.print_engine = function (instance, local) {
             $('#printer-status').addClass('printer-status-offline');
         },
         handle_printers: function (printers) {
-            console.log(printers);
-        },
-        handle_print_error: function () {
-            console.log('error');
+            instance.web.unblockUI();
+        
+            var widget = new local.PrinterSelectionWidget(printers);
+            widget.get_selection().then(function (printer) {
+                console.log(printer);
+            });
         },
-        handle_print_finished: function () {
-            console.log('finished');
+        handle_print_status: function (data) {
+            instance.web.unblockUI();
+
+            if (_.isEqual(data.status, 'printing')) {
+                instance.web.notification.do_notify('Impresión', 'La impresora ' + data.printer + ' está imprimiendo');
+                return;
+            }
+
+            if (_.isEqual(data.status, 'printed')) {
+                instance.web.notification.do_notify('Impresión', 'La impresora ' + data.printer + ' finalizó la impresión');
+                return;
+            }
+
+            if (_.isEqual(data.status, 'error')) {
+                instance.web.notification.do_notify('Impresión', 'Ocurrió un error al imprimir: ' + data.printer);
+            }
         },
         get_socket_config: function () {
             var url = '/print_engine/socket_config';
@@ -57,39 +72,79 @@ openerp.print_engine = function (instance, local) {
                 });
             });
         },
-        request_print: function (b64_data) {
+        request_print: function (data) {
             if (!this.socket || !this.socket.connected) {
                 instance.web.notification.do_warn('Impresión', 'La impresora no está preparada');
                 return;
             }
 
+            instance.web.blockUI();
+
             try {
                 this.socket.emit('request-print', {
-                    data: b64_data
+                    data: data
                 });
             } catch (e) {
+                instance.web.unblockUI();
                 instance.webclient.crashmanager.show_message(e);
             }
         }
     });
 
     local.PrinterTopWidget = instance.web.Widget.extend({
-        template: 'printEngine.PrinterTopWidget',
+        template: 'PrinterTopWidget',
         init: function (parent) {
-            this._super(parent)
+            this._super(parent);
         },
         start: function () {
             // this.$el.click(this, this.selectDefaultPrinter);
         }
     });
 
+    local.PrinterSelectionWidget = instance.web.Widget.extend({
+        template: 'PrinterSelectionWidget',
+        events: {
+            'click li': 'on_select'
+        },
+        printers: [],
+        init: function (printers) {
+            this.printers = printers;
+            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');
+        },
+        get_selection: function () {
+            return this.defer;
+        },
+        on_select: function (e) {
+            var $el = $(e.target).closest('li');
+            var name = $el.data('name');
+            this.selected_printer = name;
+            this.$el.modal('hide');
+        },
+        on_hide: function (e) {
+            var self = e.data;
+            self.defer.resolve(self.selected_printer);
+        }
+    });
+
     if (instance.web) {
         if (instance.web.UserMenu) {
             instance.web.UserMenu.include({
-                do_update: function(){
+                do_update: function () {
                     var printer = new local.PrinterTopWidget(this);
                     printer.appendTo($('.oe_systray'));
-                    local.socket = new local.SocketManager()
+                    local.socket = new local.SocketManager();
                     return this._super.apply(this, arguments);
                 }
             });
@@ -114,4 +169,4 @@ openerp.print_engine = function (instance, local) {
             });
         }
     }
-}
+}

+ 35 - 1
static/src/xml/main.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <templates xml:space="preserve">
-    <t t-name="printEngine.PrinterTopWidget">
+    <t t-name="PrinterTopWidget">
         <li t-att-title='_t("Printer Status")'>
             <a href="#">
                 <i class="fa fa-print" aria-hidden="true" />
@@ -8,4 +8,38 @@
             </a>
         </li>
     </t>
+    <t t-name="PrinterSelectionWidget">
+        <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">Seleccionar impresora</h3>
+                    </div>
+                    <div class="modal-body oe_act_window">
+                        <div class="printer_selection_wrapper">
+                            <ul class="printer_selection_list">
+                                <li t-foreach="widget.printers" t-as="p" t-att-data-name="p.name">
+                                    <i class="fa fa-print"></i>
+                                    <div>
+                                        <h2><t t-esc="p.name"/></h2>
+                                        <p t-if="p.isDefault">Predeterminado</p>
+                                    </div>
+                                </li>
+                                <!-- <li data-name="download">
+                                    <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">Cancelar</button>
+                    </div>
+                </div>                                                
+            </div>
+        </div>
+    </t>
 </templates>

+ 0 - 33
views/print_engine_printer_view.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<openerp>
-    <data>
-        <!-- Printers Tree  -->
-        <record id="print_engine.printer_tree" model="ir.ui.view">
-            <field name="name">print.engine.printer.tree</field>
-            <field name="model">print.engine.printer</field>
-            <field name="priority">2</field>
-            <field name="arch" type="xml">
-                <tree string="Impresoras">
-                    <field name="name" />
-                    <field name="is_default" string="Por defecto?" />
-                </tree>
-            </field>
-        </record>
-
-        <!-- Socket Print -->
-        <record id="print_engine.printer_form" model="ir.ui.view">
-            <field name="name">print.engine.printer.form</field>
-            <field name="model">print.engine.printer</field>
-            <field name="arch" type="xml">
-                <form string="Impresora">
-                    <sheet>
-                        <group>
-                            <field name="name" />
-                            <field name="is_default" />
-                        </group>
-                    </sheet>
-                </form>
-            </field>
-        </record>
-    </data>
-</openerp>

+ 0 - 36
views/res_config_view.xml

@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<openerp>
-    <data>
-        <record id="print_engine_settings_view" model="ir.ui.view">
-            <field name="name">print engine settings</field>
-            <field name="model">print.engine.settings</field>
-            <field name="arch" type="xml">
-                <form string="Impresiones">
-                    <header>
-                        <button string="Aplicar" type="object" name="execute" class="oe_highlight" />
-                        o
-                        <button string="Cancelar" type="object" name="cancel" class="oe_link" />
-                    </header>
-                    <group string="Preferencias">
-                        <field name="host" class="oe_inline" />
-                        <field name="port" class="oe_inline" />
-                        <field name="path" class="oe_inline" />
-                    </group>
-                    <group string="Impresoras">
-                        <field name="show_printers" class="oe_inline" />
-                    </group>
-                </form>
-            </field>
-        </record>
-
-        <record id="print_engine_settings_action" model="ir.actions.act_window">
-            <field name="name">Gestor de Impresión</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">print.engine.settings</field>
-            <field name="view_mode">form</field>
-            <field name="target">inline</field>
-        </record>
-
-        <menuitem id="menu_print_engine_settings" name="Gestor de Impresión" parent="base.menu_config" action="print_engine_settings_action" />
-    </data>
-</openerp>

+ 24 - 0
views/res_user_form.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <record id="res_users_inherit_view_form" model="ir.ui.view">
+            <field name="name">res.users.inherit.view.form</field>
+            <field name="model">res.users</field>
+            <field name="inherit_id" ref="base.view_users_form"/>
+            <field name="arch" type="xml">
+                <xpath expr="//notebook/page[last()]" position="after">
+                    <page string="Impresoras">
+                        <group>
+                            <group string="Servidor de impresión">
+                                <field name="tray_host" />
+                                <field name="tray_port" />
+                                <field name="tray_path" />
+                                <field name="tray_print_direcly" />
+                            </group>
+                        </group>
+                    </page>
+                </xpath>
+            </field>
+        </record>
+    </data>
+</openerp>