Compare commits
7 commits
3dffeeba00
...
663479e4a2
Author | SHA1 | Date | |
---|---|---|---|
663479e4a2 | |||
f9efd08ff5 | |||
5cd63e80ac | |||
a796e31f22 | |||
6e42b9c38c | |||
3b0d37a0ac | |||
3d189d87a1 |
18 changed files with 17 additions and 174 deletions
|
@ -2,7 +2,7 @@
|
||||||
'name': 'Product Create Stock Picking',
|
'name': 'Product Create Stock Picking',
|
||||||
'category': 'Warehouse',
|
'category': 'Warehouse',
|
||||||
'summary': 'Add an action to create a stock picking from a selection of products.',
|
'summary': 'Add an action to create a stock picking from a selection of products.',
|
||||||
'version': '12.0.0.0.1',
|
'version': "16.0.1.0.0",
|
||||||
'description': """
|
'description': """
|
||||||
|
|
||||||
Add an action to create a stock picking from a selection of products.
|
Add an action to create a stock picking from a selection of products.
|
||||||
|
|
|
@ -11,7 +11,6 @@ from odoo import tools, models, fields, api, _
|
||||||
class ProductTemplate(models.Model):
|
class ProductTemplate(models.Model):
|
||||||
_inherit = "product.template"
|
_inherit = "product.template"
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def create_stock_picking(self):
|
def create_stock_picking(self):
|
||||||
picking_vals = self.env['stock.picking'].default_get(self.env['stock.picking']._fields.keys())
|
picking_vals = self.env['stock.picking'].default_get(self.env['stock.picking']._fields.keys())
|
||||||
picking_vals.update({
|
picking_vals.update({
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
'name': 'Product Library',
|
'name': 'Product Library',
|
||||||
'category': 'Product',
|
'category': 'Product',
|
||||||
'summary': 'Add library related fields to product',
|
'summary': 'Add library related fields to product',
|
||||||
'version': '12.0.1.0.2',
|
'version': "16.0.1.0.0",
|
||||||
'description': """
|
'description': """
|
||||||
|
|
||||||
Addon mejora de Odoo para librerías y tiendas de discos
|
Addon mejora de Odoo para librerías y tiendas de discos
|
||||||
|
|
|
@ -10,7 +10,6 @@ from odoo import models, fields, api
|
||||||
class ProductProduct(models.Model):
|
class ProductProduct(models.Model):
|
||||||
_inherit = 'product.product'
|
_inherit = 'product.product'
|
||||||
|
|
||||||
@api.multi
|
|
||||||
@api.depends('image')
|
@api.depends('image')
|
||||||
def _compute_has_image(self):
|
def _compute_has_image(self):
|
||||||
for product in self:
|
for product in self:
|
||||||
|
|
|
@ -11,16 +11,16 @@ _logger = logging.getLogger(__name__)
|
||||||
class ProductTemplate(models.Model):
|
class ProductTemplate(models.Model):
|
||||||
_inherit = "product.template"
|
_inherit = "product.template"
|
||||||
|
|
||||||
subtitle = fields.Char('Subtítulo')
|
subtitle = fields.Char('Subtitulo')
|
||||||
editorial = fields.Char('Editorial')
|
editorial = fields.Char('Editorial')
|
||||||
formato = fields.Char('Formato')
|
formato = fields.Char('Formato')
|
||||||
pais_edicion = fields.Char('País de Edicion')
|
pais_edicion = fields.Char('Pais de edicion')
|
||||||
colacion = fields.Char('Colación')
|
colacion = fields.Char('Colacion')
|
||||||
autor = fields.Char('Autor')
|
autor = fields.Char('Autor')
|
||||||
isbn = fields.Char('ISBN')
|
isbn = fields.Char('ISBN')
|
||||||
coleccion = fields.Char('Colección')
|
coleccion = fields.Char('Coleccion')
|
||||||
subcoleccion = fields.Char('Subcolección')
|
subcoleccion = fields.Char('Subcoleccion')
|
||||||
idioma = fields.Char('Idioma')
|
idioma = fields.Char('Idioma')
|
||||||
fecha_entrada = fields.Char('Fecha de entrada')
|
fecha_entrada = fields.Char('Fecha de entrada')
|
||||||
fecha_edicion = fields.Char('Fecha de edición')
|
fecha_edicion = fields.Char('Fecha de edición')
|
||||||
genero = fields.Char('Género')
|
genero = fields.Char('Genero')
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<openerp>
|
<odoo>
|
||||||
<data>
|
|
||||||
<record model="ir.ui.view" id="product_library_form_config">
|
<record model="ir.ui.view" id="product_library_form_config">
|
||||||
<field name="name">product.template.library.form</field>
|
<field name="name">product.template.library.form</field>
|
||||||
<field name="model">product.template</field>
|
<field name="model">product.template</field>
|
||||||
|
@ -27,5 +26,4 @@
|
||||||
</field>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
</odoo>
|
||||||
</openerp>
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
'name': 'Product Retail',
|
'name': 'Product Retail',
|
||||||
'category': 'Product',
|
'category': 'Product',
|
||||||
'summary': 'Gestiona productos en distribución / Venta a minoristas',
|
'summary': 'Gestiona productos en distribución / Venta a minoristas',
|
||||||
'version': '12.0.1.0.0',
|
'version': "16.0.1.0.0",
|
||||||
'description': """
|
'description': """
|
||||||
|
|
||||||
Gestiona productos en distribución / Venta a minoristas
|
Gestiona productos en distribución / Venta a minoristas
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Product Sequence',
|
'name': 'Product Sequence',
|
||||||
'version': '12.0.2.0.2',
|
'version': "16.0.1.0.0",
|
||||||
'author': "Zikzakmedia SL,Sodexis,Odoo Community Association (OCA)",
|
'author': "Zikzakmedia SL,Sodexis,Odoo Community Association (OCA)",
|
||||||
'website': 'https://github.com/OCA/product-attribute',
|
'website': 'https://github.com/OCA/product-attribute',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
|
|
|
@ -36,7 +36,6 @@ class ProductCategory(models.Model):
|
||||||
}
|
}
|
||||||
return vals
|
return vals
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
prefix = vals.get("code_prefix")
|
prefix = vals.get("code_prefix")
|
||||||
if prefix:
|
if prefix:
|
||||||
|
|
|
@ -13,7 +13,7 @@ class ProductProduct(models.Model):
|
||||||
default_code = fields.Char(
|
default_code = fields.Char(
|
||||||
required=True,
|
required=True,
|
||||||
default='/',
|
default='/',
|
||||||
track_visibility='onchange',
|
tracking=True,
|
||||||
help="Set to '/' and save if you want a new internal reference "
|
help="Set to '/' and save if you want a new internal reference "
|
||||||
"to be proposed."
|
"to be proposed."
|
||||||
)
|
)
|
||||||
|
@ -35,7 +35,6 @@ class ProductProduct(models.Model):
|
||||||
vals['default_code'] = sequence.next_by_id()
|
vals['default_code'] = sequence.next_by_id()
|
||||||
return super().create(vals)
|
return super().create(vals)
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
"""To assign a new internal reference, just write '/' on the field.
|
"""To assign a new internal reference, just write '/' on the field.
|
||||||
Note this is up to the user, if the product category is changed,
|
Note this is up to the user, if the product category is changed,
|
||||||
|
@ -55,7 +54,6 @@ class ProductProduct(models.Model):
|
||||||
return True
|
return True
|
||||||
return super().write(vals)
|
return super().write(vals)
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def copy(self, default=None):
|
def copy(self, default=None):
|
||||||
if default is None:
|
if default is None:
|
||||||
default = {}
|
default = {}
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
from . import test_product_sequence
|
|
|
@ -1,140 +0,0 @@
|
||||||
# Copyright 2016 Sodexis
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo.tests.common import TransactionCase
|
|
||||||
from ..hooks import pre_init_hook
|
|
||||||
|
|
||||||
|
|
||||||
class TestProductSequence(TransactionCase):
|
|
||||||
"""Tests for creating product with and without Product Sequence"""
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestProductSequence, self).setUp()
|
|
||||||
self.product_product = self.env['product.product']
|
|
||||||
self.product_category = self.env['product.category']
|
|
||||||
self.product_template = self.env['product.template'].create({
|
|
||||||
'name': 'Demo Product',
|
|
||||||
})
|
|
||||||
|
|
||||||
def test_product_create_with_default_code(self):
|
|
||||||
product = self.product_product.create(dict(
|
|
||||||
name="Apple",
|
|
||||||
default_code='PROD01'
|
|
||||||
))
|
|
||||||
self.assertEqual(product.default_code, 'PROD01')
|
|
||||||
product_new = self.product_product.create(dict(
|
|
||||||
name="Demo Apple",
|
|
||||||
product_tmpl_id=self.product_template.id
|
|
||||||
))
|
|
||||||
self.assertTrue(product_new.default_code)
|
|
||||||
|
|
||||||
def test_product_create_without_default_code(self):
|
|
||||||
product_1 = self.product_product.create(dict(
|
|
||||||
name="Orange",
|
|
||||||
default_code='/'))
|
|
||||||
self.assertRegexpMatches(str(product_1.default_code), r'PR/*')
|
|
||||||
|
|
||||||
def test_product_copy(self):
|
|
||||||
product_2 = self.product_product.create(dict(
|
|
||||||
name="Apple",
|
|
||||||
default_code='PROD02'
|
|
||||||
))
|
|
||||||
copy_product_2 = product_2.copy()
|
|
||||||
self.assertEqual(copy_product_2.default_code, 'PROD02-copy')
|
|
||||||
|
|
||||||
def test_pre_init_hook(self):
|
|
||||||
product_3 = self.product_product.create(dict(
|
|
||||||
name="Apple",
|
|
||||||
default_code='PROD03'
|
|
||||||
))
|
|
||||||
sql = "update product_product set default_code='/' where id=%s"
|
|
||||||
self.cr.execute(sql, (product_3.id,))
|
|
||||||
product_3.invalidate_cache()
|
|
||||||
self.assertEqual(product_3.default_code, '/')
|
|
||||||
pre_init_hook(self.cr)
|
|
||||||
product_3.invalidate_cache()
|
|
||||||
self.assertEqual(product_3.default_code, '!!mig!!%s' % (product_3.id,))
|
|
||||||
|
|
||||||
def test_product_category_sequence(self):
|
|
||||||
categ_grocery = self.product_category.create(dict(
|
|
||||||
name="Grocery",
|
|
||||||
code_prefix="GRO",
|
|
||||||
))
|
|
||||||
self.assertTrue(categ_grocery.sequence_id)
|
|
||||||
self.assertEqual(categ_grocery.sequence_id.prefix, "GRO")
|
|
||||||
self.assertFalse(categ_grocery.sequence_id.company_id)
|
|
||||||
product_3 = self.product_product.create(dict(
|
|
||||||
name="Apple",
|
|
||||||
categ_id=categ_grocery.id,
|
|
||||||
))
|
|
||||||
self.assertEqual(product_3.default_code[:3], "GRO")
|
|
||||||
self.assertEqual(product_3.product_tmpl_id.default_code[:3], "GRO")
|
|
||||||
categ_electronics = self.product_category.create(dict(
|
|
||||||
name="Electronics",
|
|
||||||
code_prefix="ELE",
|
|
||||||
))
|
|
||||||
product_3.write({'default_code': '/',
|
|
||||||
'categ_id': categ_electronics.id})
|
|
||||||
self.assertEqual(product_3.default_code[:3], "ELE")
|
|
||||||
self.assertEqual(product_3.product_tmpl_id.default_code[:3], "ELE")
|
|
||||||
|
|
||||||
product_4 = self.product_product.create(dict(
|
|
||||||
name="Truck",
|
|
||||||
default_code='PROD04'
|
|
||||||
))
|
|
||||||
product_4.write({'default_code': '/'})
|
|
||||||
self.assertTrue(product_4.categ_id, 'Category is not set.')
|
|
||||||
|
|
||||||
categ_car = self.product_category.create(dict(
|
|
||||||
name="Car",
|
|
||||||
code_prefix="CAR",
|
|
||||||
))
|
|
||||||
product_3.product_tmpl_id.categ_id = categ_car
|
|
||||||
product_3.product_tmpl_id.default_code = '/'
|
|
||||||
product_3.refresh()
|
|
||||||
self.assertEqual(product_3.default_code[:3], "CAR")
|
|
||||||
self.assertEqual(product_3.product_tmpl_id.default_code[:3], "CAR")
|
|
||||||
categ_car.write(dict(
|
|
||||||
name="Bike",
|
|
||||||
code_prefix="BIK",
|
|
||||||
))
|
|
||||||
self.assertEqual(categ_car.sequence_id.prefix, "BIK")
|
|
||||||
categ_car.sequence_id = False
|
|
||||||
categ_car.write({'code_prefix': 'KIA'})
|
|
||||||
self.assertEqual(categ_car.sequence_id.prefix, "KIA")
|
|
||||||
|
|
||||||
def test_product_parent_category_sequence(self):
|
|
||||||
parent_categ = self.product_category.create(dict(
|
|
||||||
name="Parents",
|
|
||||||
code_prefix="PAR",
|
|
||||||
))
|
|
||||||
categ = self.product_category.create(dict(
|
|
||||||
name="Child",
|
|
||||||
parent_id=parent_categ.id,
|
|
||||||
))
|
|
||||||
|
|
||||||
product_anna = self.product_product.create(dict(
|
|
||||||
name="Anna",
|
|
||||||
categ_id=categ.id,
|
|
||||||
))
|
|
||||||
self.assertEqual(product_anna.default_code[:2], "PR")
|
|
||||||
self.assertEqual(product_anna.product_tmpl_id.default_code[:2], "PR")
|
|
||||||
|
|
||||||
self.env.user.company_id.use_parent_categories_to_determine_prefix = True
|
|
||||||
|
|
||||||
product_claudia = self.product_product.create(dict(
|
|
||||||
name="Claudia",
|
|
||||||
categ_id=categ.id,
|
|
||||||
))
|
|
||||||
self.assertEqual(product_claudia.default_code[:3], "PAR")
|
|
||||||
self.assertEqual(product_claudia.product_tmpl_id.default_code[:3], "PAR")
|
|
||||||
|
|
||||||
def test_product_copy_with_default_values(self):
|
|
||||||
product_2 = self.product_product.create(dict(
|
|
||||||
name="Apple",
|
|
||||||
default_code='PROD02'
|
|
||||||
))
|
|
||||||
copy_product_2 = product_2.copy({
|
|
||||||
'default_code': 'product test sequence',
|
|
||||||
})
|
|
||||||
self.assertEqual(copy_product_2.default_code, 'product test sequence')
|
|
|
@ -7,7 +7,7 @@
|
||||||
"author": "ACSONE SA/NV, Odoo Community Association (OCA)",
|
"author": "ACSONE SA/NV, Odoo Community Association (OCA)",
|
||||||
"website": "https://github.com/OCA/product-attribute",
|
"website": "https://github.com/OCA/product-attribute",
|
||||||
"category": "Product",
|
"category": "Product",
|
||||||
"version": "12.0.2.0.2",
|
"version": "16.0.1.0.0",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"depends": ["sale", "product"],
|
"depends": ["sale", "product"],
|
||||||
"data": [
|
"data": [
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
# Copyright 2020 Tecnativa - Pedro M. Baeza
|
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
|
||||||
from odoo.addons.product_state.hooks import post_init_hook
|
|
||||||
|
|
||||||
|
|
||||||
def migrate(cr, version):
|
|
||||||
post_init_hook(cr, False)
|
|
|
@ -129,7 +129,6 @@
|
||||||
<record model="ir.actions.act_window" id="action_product_state">
|
<record model="ir.actions.act_window" id="action_product_state">
|
||||||
<field name="name">State</field>
|
<field name="name">State</field>
|
||||||
<field name="res_model">product.state</field>
|
<field name="res_model">product.state</field>
|
||||||
<field name="view_type">form</field>
|
|
||||||
<field name="view_mode">kanban,form,tree</field>
|
<field name="view_mode">kanban,form,tree</field>
|
||||||
</record>
|
</record>
|
||||||
<menuitem
|
<menuitem
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
{
|
{
|
||||||
"name": "Stock Picking Depósito",
|
"name": "Stock Picking Depósito",
|
||||||
"summary": "Permite la gestión de depósitos en el almacén y su facturación.",
|
"summary": "Permite la gestión de depósitos en el almacén y su facturación.",
|
||||||
"version": "12.0.1.0.1",
|
"version": "16.0.1.0.0",
|
||||||
"development_status": "Alpha",
|
"development_status": "Alpha",
|
||||||
"category": "Warehouse Management",
|
"category": "Warehouse Management",
|
||||||
"website": "https://criptomart.net",
|
"website": "https://criptomart.net",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<odoo>
|
<odoo>
|
||||||
<data noupdate="0">
|
<data>
|
||||||
|
|
||||||
<record id="wh_deposits" model="stock.warehouse">
|
<record id="wh_deposits" model="stock.warehouse">
|
||||||
<field name="name">Depósito Salidas</field>
|
<field name="name">Depósito Salidas</field>
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
</function>
|
</function>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
<data noupdate="0">
|
<data>
|
||||||
|
|
||||||
<record id="location_deposit_buy" model="stock.location">
|
<record id="location_deposit_buy" model="stock.location">
|
||||||
<field name="name">Depósitos Entradas</field>
|
<field name="name">Depósitos Entradas</field>
|
||||||
|
|
|
@ -55,7 +55,6 @@ class ResPartner(models.Model):
|
||||||
}).id
|
}).id
|
||||||
return super().create(vals)
|
return super().create(vals)
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
if ( vals.get('deposit_sale_accept', False) == True ) and not self.deposit_sale_location_id:
|
if ( vals.get('deposit_sale_accept', False) == True ) and not self.deposit_sale_location_id:
|
||||||
vals['deposit_sale_location_id'] = self.env['stock.location'].create({
|
vals['deposit_sale_location_id'] = self.env['stock.location'].create({
|
||||||
|
|
Loading…
Add table
Reference in a new issue