Browse Source

Merge PR #75 into 12.0

Signed-off-by jbeficent
pull/79/head
OCA-git-bot 5 years ago
parent
commit
924b1ef40f
  1. 141
      barcode_action/README.rst
  2. 2
      barcode_action/__init__.py
  3. 25
      barcode_action/__manifest__.py
  4. 17
      barcode_action/demo/barcode_action_demo.xml
  5. 136
      barcode_action/i18n/barcode_action.pot
  6. 128
      barcode_action/i18n/es.po
  7. 1
      barcode_action/models/__init__.py
  8. 31
      barcode_action/models/res_partner.py
  9. 3
      barcode_action/readme/CONTRIBUTORS.rst
  10. 3
      barcode_action/readme/DESCRIPTION.rst
  11. 59
      barcode_action/readme/USAGE.rst
  12. BIN
      barcode_action/static/description/icon.png
  13. 482
      barcode_action/static/description/index.html
  14. 23
      barcode_action/static/src/js/action_barcode_form.js
  15. 24
      barcode_action/static/src/js/action_barcode_widget.js
  16. 1
      barcode_action/tests/__init__.py
  17. 24
      barcode_action/tests/test_partner_find.py
  18. 12
      barcode_action/views/barcode_templates.xml
  19. 1
      barcode_action/wizard/__init__.py
  20. 22
      barcode_action/wizard/barcode_action.py
  21. 50
      barcode_action/wizard/barcode_action_view.xml
  22. 2
      setup/_metapackage/VERSION.txt
  23. 1
      setup/_metapackage/setup.py
  24. 1
      setup/barcode_action/odoo/addons/barcode_action
  25. 6
      setup/barcode_action/setup.py

141
barcode_action/README.rst

@ -0,0 +1,141 @@
=======================
Barcode action launcher
=======================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github
:target: https://github.com/OCA/server-ux/tree/12.0/barcode_action
:alt: OCA/server-ux
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-ux-12-0/server-ux-12-0-barcode_action
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/250/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows to use barcodes as launchers of actions.
The action will launch a function that uses the barcode in order to return an action.
**Table of contents**
.. contents::
:local:
Usage
=====
Actions must be configured with the following data in the context:
* model: Model where we can find the method (required)
* method: Method to execute (required)
* res_id: Id as base (optional)
The method must return an action. Installing this module with demo data will
install a demo application that allows the system administrator to find a
partner by the external reference encoded in a barcode.
Go to *Settings / Find partners* and scan a barcode that contains the
internal reference of an existing partner. As soon as you read the barcode
the system will redirect you to that partner's form view.
Technical implementation of this example:
Action::
<act_window id="res_partner_find"
name="Find Partner"
res_model="barcode.action"
view_mode="form"
view_type="form"
context="{'default_model': 'res.partner', 'default_method': 'find_res_partner_by_ref_using_barcode'}"
target="new"/>
<menuitem id="menu_orders_customers" name="Find partners"
action="res_partner_find"
parent="base.menu_administration"/>
Python code::
import json
from odoo import api, models, _
from odoo.tools.safe_eval import safe_eval
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.multi
def find_res_partner_by_ref_using_barcode(self, barcode):
partner = self.search([('ref', '=', barcode)], limit=1)
if not partner:
action = self.env.ref('res_partner_find')
result = action.read()[0]
context = safe_eval(result['context'])
context.update({
'default_state': 'warning',
'default_status': _('Partner with Internal Reference '
'%s cannot be found') % barcode
})
result['context'] = json.dumps(context)
return result
action = self.env.ref('base.action_partner_form')
result = action.read()[0]
res = self.env.ref('base.view_partner_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = partner.id
return result
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-ux/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/server-ux/issues/new?body=module:%20barcode_action%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Creu Blanca
* Eficent
Contributors
~~~~~~~~~~~~
* Enric Tobella <etobella@creublanca.es>
* Jordi Ballester <jordi.ballester@eficent.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/server-ux <https://github.com/OCA/server-ux/tree/12.0/barcode_action>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

2
barcode_action/__init__.py

@ -0,0 +1,2 @@
from . import wizard
from . import models

25
barcode_action/__manifest__.py

@ -0,0 +1,25 @@
# Copyright 2017 Creu Blanca
# Copyright 2017 Eficent Business and IT Consulting Services, S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
{
'name': 'Barcode action launcher',
'version': '12.0.1.0.0',
'category': 'Extra Tools',
'website': 'https://github.com/OCA/server-ux',
'author': 'Creu Blanca, Eficent, Odoo Community Association (OCA)',
'license': 'AGPL-3',
'installable': True,
'application': False,
'summary': 'Allows to use barcodes as a launcher',
'depends': [
'barcodes',
],
'data': [
'views/barcode_templates.xml',
'wizard/barcode_action_view.xml',
],
'demo': [
'demo/barcode_action_demo.xml'
],
}

17
barcode_action/demo/barcode_action_demo.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<act_window id="res_partner_find"
name="Find Partner"
res_model="barcode.action"
view_mode="form"
view_type="form"
context="{'default_model': 'res.partner', 'default_method': 'find_res_partner_by_ref_using_barcode'}"
target="new"/>
<menuitem id="menu_orders_customers" name="Find partners"
action="res_partner_find"
parent="base.menu_administration"/>
</data>
</odoo>

136
barcode_action/i18n/barcode_action.pot

@ -0,0 +1,136 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * barcode_action
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: barcode_action
#: model:ir.actions.act_window,name:barcode_action.barcode_action_action
msgid "Barcode Launcher"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action___barcode_scanned
msgid "Barcode Scanned"
msgstr ""
#. module: barcode_action
#: model_terms:ir.ui.view,arch_db:barcode_action.barcode_action_form
msgid "Close"
msgstr ""
#. module: barcode_action
#: model:ir.model,name:barcode_action.model_res_partner
msgid "Contact"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__create_uid
msgid "Created by"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__create_date
msgid "Created on"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__display_name
msgid "Display Name"
msgstr ""
#. module: barcode_action
#: model_terms:ir.ui.view,arch_db:barcode_action.barcode_action_form
msgid "Find"
msgstr ""
#. module: barcode_action
#: model:ir.actions.act_window,name:barcode_action.res_partner_find
msgid "Find Partner"
msgstr ""
#. module: barcode_action
#: model:ir.ui.menu,name:barcode_action.menu_orders_customers
msgid "Find partners"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__id
msgid "ID"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action____last_update
msgid "Last Modified on"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__write_uid
msgid "Last Updated by"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__write_date
msgid "Last Updated on"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__method
msgid "Method"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__model
msgid "Model"
msgstr ""
#. module: barcode_action
#: code:addons/barcode_action/models/res_partner.py:21
#, python-format
msgid "Partner with Internal Reference %s cannot be found"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__res_id
msgid "Res"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__state
msgid "State"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action__status
msgid "Status"
msgstr ""
#. module: barcode_action
#: model:ir.model.fields,help:barcode_action.field_barcode_action___barcode_scanned
msgid "Value of the last barcode scanned."
msgstr ""
#. module: barcode_action
#: selection:barcode.action,state:0
msgid "Waiting"
msgstr ""
#. module: barcode_action
#: selection:barcode.action,state:0
msgid "Warning"
msgstr ""
#. module: barcode_action
#: model:ir.model,name:barcode_action.model_barcode_action
msgid "barcode.action"
msgstr ""

128
barcode_action/i18n/es.po

@ -0,0 +1,128 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * barcode_action
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-05-08 11:03+0000\n"
"Last-Translator: Enric Tobella <etobella@creublanca.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5.1\n"
#. module: barcode_action
#: model:ir.actions.act_window,name:barcode_action.barcode_action_action
msgid "Barcode Launcher"
msgstr "Buscador por código de barras"
#. module: barcode_action
#: model:ir.ui.view,arch_db:barcode_action.barcode_action_form
msgid "Close"
msgstr "Cerrar"
#. module: barcode_action
#: model:ir.model,name:barcode_action.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_create_uid
msgid "Created by"
msgstr "Creado por"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_create_date
msgid "Created on"
msgstr "Creado en"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: barcode_action
#: model:ir.ui.view,arch_db:barcode_action.barcode_action_form
msgid "Find"
msgstr "Buscar"
#. module: barcode_action
#: model:ir.actions.act_window,name:barcode_action.res_partner_find
msgid "Find Partner"
msgstr "Buscar Contacto"
#. module: barcode_action
#: model:ir.ui.menu,name:barcode_action.menu_orders_customers
msgid "Find partners"
msgstr "Buscar contactos"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_id
msgid "ID"
msgstr "ID"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action___last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_write_uid
msgid "Last Updated by"
msgstr "Última actualización de"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_method
msgid "Method"
msgstr "Método"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_model
msgid "Model"
msgstr "Modelo"
#. module: barcode_action
#: code:addons/barcode_action/models/res_partner.py:21
#, python-format
msgid "Partner with Internal Reference %s cannot be found"
msgstr "No se ha encontrado el contacto con referencia %s"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_res_id
msgid "Res"
msgstr "Res"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_state
msgid "State"
msgstr "Estado"
#. module: barcode_action
#: model:ir.model.fields,field_description:barcode_action.field_barcode_action_status
msgid "Status"
msgstr "Estado"
#. module: barcode_action
#: selection:barcode.action,state:0
msgid "Waiting"
msgstr "Esperando"
#. module: barcode_action
#: selection:barcode.action,state:0
msgid "Warning"
msgstr "Aviso"
#. module: barcode_action
#: model:ir.model,name:barcode_action.model_barcode_action
msgid "barcode.action"
msgstr "barcode.action"

1
barcode_action/models/__init__.py

@ -0,0 +1 @@
from . import res_partner

31
barcode_action/models/res_partner.py

@ -0,0 +1,31 @@
# Copyright 2018 Creu Blanca
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
import json
from odoo import api, models, _
from odoo.tools.safe_eval import safe_eval
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.multi
def find_res_partner_by_ref_using_barcode(self, barcode):
partner = self.search([('ref', '=', barcode)], limit=1)
if not partner:
action = self.env.ref('barcode_action.res_partner_find')
result = action.read()[0]
context = safe_eval(result['context'])
context.update({
'default_state': 'warning',
'default_status': _('Partner with Internal Reference '
'%s cannot be found') % barcode
})
result['context'] = json.dumps(context)
return result
action = self.env.ref('base.action_partner_form')
result = action.read()[0]
res = self.env.ref('base.view_partner_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = partner.id
return result

3
barcode_action/readme/CONTRIBUTORS.rst

@ -0,0 +1,3 @@
* Enric Tobella <etobella@creublanca.es>
* Jordi Ballester <jordi.ballester@eficent.com>

3
barcode_action/readme/DESCRIPTION.rst

@ -0,0 +1,3 @@
This module allows to use barcodes as launchers of actions.
The action will launch a function that uses the barcode in order to return an action.

59
barcode_action/readme/USAGE.rst

@ -0,0 +1,59 @@
Actions must be configured with the following data in the context:
* model: Model where we can find the method (required)
* method: Method to execute (required)
* res_id: Id as base (optional)
The method must return an action. Installing this module with demo data will
install a demo application that allows the system administrator to find a
partner by the external reference encoded in a barcode.
Go to *Settings / Find partners* and scan a barcode that contains the
internal reference of an existing partner. As soon as you read the barcode
the system will redirect you to that partner's form view.
Technical implementation of this example:
Action::
<act_window id="res_partner_find"
name="Find Partner"
res_model="barcode.action"
view_mode="form"
view_type="form"
context="{'default_model': 'res.partner', 'default_method': 'find_res_partner_by_ref_using_barcode'}"
target="new"/>
<menuitem id="menu_orders_customers" name="Find partners"
action="res_partner_find"
parent="base.menu_administration"/>
Python code::
import json
from odoo import api, models, _
from odoo.tools.safe_eval import safe_eval
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.multi
def find_res_partner_by_ref_using_barcode(self, barcode):
partner = self.search([('ref', '=', barcode)], limit=1)
if not partner:
action = self.env.ref('res_partner_find')
result = action.read()[0]
context = safe_eval(result['context'])
context.update({
'default_state': 'warning',
'default_status': _('Partner with Internal Reference '
'%s cannot be found') % barcode
})
result['context'] = json.dumps(context)
return result
action = self.env.ref('base.action_partner_form')
result = action.read()[0]
res = self.env.ref('base.view_partner_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = partner.id
return result

BIN
barcode_action/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

482
barcode_action/static/description/index.html

@ -0,0 +1,482 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
<title>Barcode action launcher</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="barcode-action-launcher">
<h1 class="title">Barcode action launcher</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-ux/tree/12.0/barcode_action"><img alt="OCA/server-ux" src="https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-ux-12-0/server-ux-12-0-barcode_action"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/250/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows to use barcodes as launchers of actions.</p>
<p>The action will launch a function that uses the barcode in order to return an action.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>Actions must be configured with the following data in the context:
* model: Model where we can find the method (required)
* method: Method to execute (required)
* res_id: Id as base (optional)</p>
<p>The method must return an action. Installing this module with demo data will
install a demo application that allows the system administrator to find a
partner by the external reference encoded in a barcode.</p>
<p>Go to <em>Settings / Find partners</em> and scan a barcode that contains the
internal reference of an existing partner. As soon as you read the barcode
the system will redirect you to that partner’s form view.</p>
<p>Technical implementation of this example:</p>
<p>Action:</p>
<pre class="literal-block">
&lt;act_window id=&quot;res_partner_find&quot;
name=&quot;Find Partner&quot;
res_model=&quot;barcode.action&quot;
view_mode=&quot;form&quot;
view_type=&quot;form&quot;
context=&quot;{'default_model': 'res.partner', 'default_method': 'find_res_partner_by_ref_using_barcode'}&quot;
target=&quot;new&quot;/&gt;
&lt;menuitem id=&quot;menu_orders_customers&quot; name=&quot;Find partners&quot;
action=&quot;res_partner_find&quot;
parent=&quot;base.menu_administration&quot;/&gt;
</pre>
<p>Python code:</p>
<pre class="literal-block">
import json
from odoo import api, models, _
from odoo.tools.safe_eval import safe_eval
class ResPartner(models.Model):
_inherit = 'res.partner'
&#64;api.multi
def find_res_partner_by_ref_using_barcode(self, barcode):
partner = self.search([('ref', '=', barcode)], limit=1)
if not partner:
action = self.env.ref('res_partner_find')
result = action.read()[0]
context = safe_eval(result['context'])
context.update({
'default_state': 'warning',
'default_status': _('Partner with Internal Reference '
'%s cannot be found') % barcode
})
result['context'] = json.dumps(context)
return result
action = self.env.ref('base.action_partner_form')
result = action.read()[0]
res = self.env.ref('base.view_partner_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = partner.id
return result
</pre>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-ux/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/server-ux/issues/new?body=module:%20barcode_action%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
<li>Eficent</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
<li>Jordi Ballester &lt;<a class="reference external" href="mailto:jordi.ballester&#64;eficent.com">jordi.ballester&#64;eficent.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-ux/tree/12.0/barcode_action">OCA/server-ux</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

23
barcode_action/static/src/js/action_barcode_form.js

@ -0,0 +1,23 @@
odoo.define('barcode_action.form', function (require) {
"use strict";
var FormController = require('web.FormController');
FormController.include({
_barcodeHandleAction: function (barcode, activeBarcode) {
var record = this.model.get(this.handle);
var self = this;
return self._rpc({
model: record.data.model,
method: record.data.method,
args: [[record.data.res_id], barcode],
}).done(function (action) {
if (action) {
self._barcodeStopListening();
self.do_action(action);
}
});
},
});
});

24
barcode_action/static/src/js/action_barcode_widget.js

@ -0,0 +1,24 @@
odoo.define('barcode_action.field', function (require) {
"use strict";
var AbstractField = require('web.AbstractField');
var field_registry = require('web.field_registry');
var ActionBarcodeField = AbstractField.extend({
init: function () {
this._super.apply(this, arguments);
this.trigger_up('activeBarcode', {
name: this.name,
commands: {
barcode: '_barcodeHandleAction',
},
});
},
});
field_registry.add('action_barcode_handler', ActionBarcodeField);
return {
ActionBarcodeField:ActionBarcodeField,
};
});

1
barcode_action/tests/__init__.py

@ -0,0 +1 @@
from . import test_partner_find

24
barcode_action/tests/test_partner_find.py

@ -0,0 +1,24 @@
# Copyright 2018 Creu Blanca
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo.tests.common import TransactionCase
class TestPartnerFind(TransactionCase):
def test_partner(self):
partner_obj = self.env['res.partner']
ref = 'testing_partner_internal_reference'
partner = partner_obj.create({
'name': 'Testing partner',
'ref': ref,
})
# We should find the partner when the ref is found
self.assertEqual(
partner.id,
partner_obj.find_res_partner_by_ref_using_barcode(ref).get(
'res_id', False))
# No partner is found, then there is no res_id on the result
self.assertFalse(
partner_obj.find_res_partner_by_ref_using_barcode(
'%s-%s' % (ref, ref)).get('res_id', False))

12
barcode_action/views/barcode_templates.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="assets_backend" name="pos_validation_barcode assets"
inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript"
src="/barcode_action/static/src/js/action_barcode_form.js"/>
<script type="text/javascript"
src="/barcode_action/static/src/js/action_barcode_widget.js"/>
</xpath>
</template>
</odoo>

1
barcode_action/wizard/__init__.py

@ -0,0 +1 @@
from . import barcode_action

22
barcode_action/wizard/barcode_action.py

@ -0,0 +1,22 @@
from odoo import fields, models
class BarcodeAction(models.TransientModel):
_name = 'barcode.action'
_inherit = "barcodes.barcode_events_mixin"
model = fields.Char(
required=True, readonly=True
)
res_id = fields.Integer()
method = fields.Char(
required=True, readonly=True
)
state = fields.Selection([
('waiting', 'Waiting'),
('warning', 'Warning')
], default='waiting', readonly=True, )
status = fields.Text(
readonly=True,
default="Start scanning",
)

50
barcode_action/wizard/barcode_action_view.xml

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017 Eficent Business and IT Consulting Services, S.L.
Copyright 2017 Creu Blanca
License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
-->
<odoo>
<record id="barcode_action_form" model="ir.ui.view">
<field name="name">barcode.action.form</field>
<field name="model">barcode.action</field>
<field name="arch" type="xml">
<form string="Find">
<div class="alert alert-success text-center o_form_header"
role="alert" style="margin-bottom:0px;"
attrs="{'invisible':[('state', '=', 'warning')]}">
<bold><field name="status"/></bold>
</div>
<div class="alert alert-danger alert-dismissable text-center"
role="alert" style="margin-bottom:0px;"
attrs="{'invisible':[('state', '=', 'waiting')]}">
<bold><field name="status"/></bold>
</div>
<field name="state" invisible="1"/>
<field name="res_id" invisible="1"/>
<field name="model" invisible="1"/>
<field name="method" invisible="1"/>
<field name="_barcode_scanned" widget="action_barcode_handler"/>
<footer>
<button
name="action_cancel"
string="Close"
class="oe_link"
special="cancel"
/>
</footer>
</form>
</field>
</record>
<act_window id="barcode_action_action"
name="Barcode Launcher"
res_model="barcode.action"
view_mode="form"
view_type="form"
target="new"/>
</odoo>

2
setup/_metapackage/VERSION.txt

@ -1 +1 @@
12.0.20190605.0
12.0.20190701.0

1
setup/_metapackage/setup.py

@ -8,6 +8,7 @@ setuptools.setup(
description="Meta package for oca-server-ux Odoo addons", description="Meta package for oca-server-ux Odoo addons",
version=version, version=version,
install_requires=[ install_requires=[
'odoo12-addon-barcode_action',
'odoo12-addon-base_export_manager', 'odoo12-addon-base_export_manager',
'odoo12-addon-base_technical_features', 'odoo12-addon-base_technical_features',
'odoo12-addon-base_tier_validation', 'odoo12-addon-base_tier_validation',

1
setup/barcode_action/odoo/addons/barcode_action

@ -0,0 +1 @@
../../../../barcode_action

6
setup/barcode_action/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
Loading…
Cancel
Save