Update to 4.7

This commit is contained in:
C?dric Krier 2018-03-19 14:16:12 +01:00
parent 847625d6d3
commit 0583a43807
9 changed files with 149 additions and 41 deletions

View File

@ -1,9 +1,57 @@
image: python:all clone:
env: hg:
- POSTGRESQL_URI=postgresql://postgres@127.0.0.1:5432/ image: plugins/hg
- MYSQL_URI=mysql://root@127.0.0.1:3306/
script: pipeline:
- pip install tox tox:
- tox -e "{py27,py33,py34,py35}-{sqlite,postgresql}" --skip-missing-interpreters image: ${IMAGE}
environment:
- CFLAGS=-O0
- DB_CACHE=/cache
- TOX_TESTENV_PASSENV=CFLAGS DB_CACHE
- POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
commands:
- pip install tox
- tox -e "${TOXENV}-${DATABASE}"
notify:
image: drillster/drone-email
from: drone@localhost
host: smtp
port: 25
skip_verify: true
when:
status: [ changed, failure ]
services: services:
- postgres postgresql:
image: postgres
when:
matrix:
DATABASE: postgresql
matrix:
include:
- IMAGE: python:2.7
TOXENV: py27
DATABASE: sqlite
- IMAGE: python:2.7
TOXENV: py27
DATABASE: postgresql
- IMAGE: python:3.4
TOXENV: py34
DATABASE: sqlite
- IMAGE: python:3.4
TOXENV: py34
DATABASE: postgresql
- IMAGE: python:3.5
TOXENV: py35
DATABASE: sqlite
- IMAGE: python:3.5
TOXENV: py35
DATABASE: postgresql
- IMAGE: python:3.6
TOXENV: py36
DATABASE: sqlite
- IMAGE: python:3.6
TOXENV: py36
DATABASE: postgresql

View File

@ -3,13 +3,13 @@
# copyright notices and license terms. # copyright notices and license terms.
from trytond.pool import Pool from trytond.pool import Pool
from .shop import * from . import shop
from .product import * from . import product
def register(): def register():
Pool.register( Pool.register(
SaleShop, shop.SaleShop,
Template, product.Template,
Product, product.Product,
module='product_special_price', type_='model') module='product_special_price', type_='model')

View File

@ -1,11 +1,15 @@
# This file is part of product_special_price module for Tryton. # This file is part of product_special_price module for Tryton.
# The COPYRIGHT file at the top level of this repository contains the full # The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms. # copyright notices and license terms.
from trytond import backend
from trytond.pool import Pool, PoolMeta from trytond.pool import Pool, PoolMeta
from trytond.model import fields from trytond.model import ModelSQL, fields
from trytond.pyson import Eval from trytond.pyson import Eval
from trytond.transaction import Transaction from trytond.transaction import Transaction
from trytond.config import config as config_ from trytond.tools.multivalue import migrate_property
from trytond.modules.product.product import price_digits
from trytond.modules.company.model import CompanyValueMixin
__all__ = ['Template', 'Product'] __all__ = ['Template', 'Product']
@ -13,17 +17,52 @@ STATES = {
'readonly': ~Eval('active', True), 'readonly': ~Eval('active', True),
} }
DEPENDS = ['active'] DEPENDS = ['active']
DIGITS = config_.getint('product', 'price_decimal', default=4)
class Template: class Template:
__metaclass__ = PoolMeta __metaclass__ = PoolMeta
__name__ = 'product.template' __name__ = 'product.template'
special_price = fields.Property(fields.Numeric('Special Price', special_price = fields.MultiValue(fields.Numeric(
states=STATES, digits=(16, DIGITS), depends=DEPENDS)) "Special Price", digits=price_digits,
states=STATES, depends=DEPENDS))
special_price_from = fields.Date('Special Price From') special_price_from = fields.Date('Special Price From')
special_price_to = fields.Date('Special Price To') special_price_to = fields.Date('Special Price To')
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field == 'special_price':
return pool.get('product.special_price')
return super(Template, cls).multivalue_model(field)
class ProductSpecialPrice(ModelSQL, CompanyValueMixin):
"Product Special Price"
__name__ = 'product.special_price'
template = fields.Many2One(
'product.template', "Template", ondelete='CASCADE', select=True)
special_price = fields.Numeric("Special Price", digits=price_digits)
@classmethod
def __register__(cls, module_name):
TableHandler = backend.get('TableHandler')
exist = TableHandler.table_exist(cls._table)
super(ProductSpecialPrice, cls).__register__(module_name)
if not exist:
cls._migrate_property([], [], [])
@classmethod
def _migrate_property(cls, field_names, value_names, fields):
field_names.append('special_price')
value_names.append('special_price')
fields.append('company')
migrate_property(
'product.template', field_names, cls, value_names,
parent='template', fields=fields)
class Product: class Product:
__metaclass__ = PoolMeta __metaclass__ = PoolMeta
@ -65,7 +104,8 @@ class Product:
else: else:
special_price = product.special_price special_price = product.special_price
if special_price != 0.0 and special_price != None and \ if (special_price != 0.0
special_price < prices[product.id]: and special_price is not None
and special_price < prices[product.id]):
prices[product.id] = special_price prices[product.id] = special_price
return prices return prices

View File

@ -12,7 +12,11 @@ try:
except ImportError: except ImportError:
from ConfigParser import ConfigParser from ConfigParser import ConfigParser
MODULE2PREFIX = {} MODULE = 'product_special_price'
PREFIX = 'trytonzz'
MODULE2PREFIX = {
'sale_shop': 'trytonzz',
}
def read(fname): def read(fname):
@ -20,6 +24,7 @@ def read(fname):
os.path.join(os.path.dirname(__file__), fname), os.path.join(os.path.dirname(__file__), fname),
'r', encoding='utf-8').read() 'r', encoding='utf-8').read()
def get_require_version(name): def get_require_version(name):
if minor_version % 2: if minor_version % 2:
require = '%s >= %s.%s.dev0, < %s.%s' require = '%s >= %s.%s.dev0, < %s.%s'
@ -29,6 +34,7 @@ def get_require_version(name):
major_version, minor_version + 1) major_version, minor_version + 1)
return require return require
config = ConfigParser() config = ConfigParser()
config.readfp(open('tryton.cfg')) config.readfp(open('tryton.cfg'))
info = dict(config.items('tryton')) info = dict(config.items('tryton'))
@ -39,8 +45,6 @@ version = info.get('version', '0.0.1')
major_version, minor_version, _ = version.split('.', 2) major_version, minor_version, _ = version.split('.', 2)
major_version = int(major_version) major_version = int(major_version)
minor_version = int(minor_version) minor_version = int(minor_version)
name = 'trytonzz_product_special_price'
download_url = 'https://bitbucket.org/zikzakmedia/trytond-product_special_price'
requires = [] requires = []
for dep in info.get('depends', []): for dep in info.get('depends', []):
@ -50,27 +54,40 @@ for dep in info.get('depends', []):
requires.append(get_require_version('trytond')) requires.append(get_require_version('trytond'))
tests_require = [] tests_require = []
dependency_links = [] series = '%s.%s' % (major_version, minor_version)
if minor_version % 2:
branch = 'default'
else:
branch = series
dependency_links = [
('hg+https://bitbucket.org/zikzakmedia/'
'trytond-sale_shop@%(branch)s'
'#egg=trytonzz-sale_shop-%(series)s' % {
'branch': branch,
'series': series,
}),
]
if minor_version % 2: if minor_version % 2:
# Add development index for testing with proteus # Add development index for testing with proteus
dependency_links.append('https://trydevpi.tryton.org/') dependency_links.append('https://trydevpi.tryton.org/')
setup(name=name, setup(name='%s_%s' % (PREFIX, MODULE),
version=version, version=version,
description='Tryton Product Special Price Module', description='Tryton Product Special Price Module',
long_description=read('README'), long_description=read('README'),
author='Zikzakmedia SL', author='Zikzakmedia SL',
author_email='zikzak@zikzakmedia.com', author_email='zikzak@zikzakmedia.com',
url='https://bitbucket.org/zikzakmedia/', url='https://bitbucket.org/zikzakmedia/',
download_url=download_url, download_url='https://bitbucket.org/zikzakmedia/trytond-%s' % MODULE,
keywords='', keywords='',
package_dir={'trytond.modules.product_special_price': '.'}, package_dir={'trytond.modules.%s' % MODULE: '.'},
packages=[ packages=[
'trytond.modules.product_special_price', 'trytond.modules.%s' % MODULE,
'trytond.modules.product_special_price.tests', 'trytond.modules.%s.tests' % MODULE,
], ],
package_data={ package_data={
'trytond.modules.product_special_price': (info.get('xml', []) 'trytond.modules.%s' % MODULE: (info.get('xml', [])
+ ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.odt', + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.odt',
'icons/*.svg', 'tests/*.rst']), 'icons/*.svg', 'tests/*.rst']),
}, },
@ -97,9 +114,9 @@ setup(name=name,
'Natural Language :: Spanish', 'Natural Language :: Spanish',
'Operating System :: OS Independent', 'Operating System :: OS Independent',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy', 'Programming Language :: Python :: Implementation :: PyPy',
'Topic :: Office/Business', 'Topic :: Office/Business',
@ -110,8 +127,8 @@ setup(name=name,
zip_safe=False, zip_safe=False,
entry_points=""" entry_points="""
[trytond.modules] [trytond.modules]
product_special_price = trytond.modules.product_special_price %s = trytond.modules.%s
""", """ % (MODULE, MODULE),
test_suite='tests', test_suite='tests',
test_loader='trytond.test_loader:Loader', test_loader='trytond.test_loader:Loader',
tests_require=tests_require, tests_require=tests_require,

View File

@ -19,7 +19,7 @@ class SaleShop:
], 'Special Price', states={ ], 'Special Price', states={
'required': Eval('special_price', True), 'required': Eval('special_price', True),
}, depends=['special_price']) }, depends=['special_price'])
special_pricelist = fields.Many2One('product.price_list', special_pricelist = fields.Many2One('product.price_list',
'Special Pricelist', states={ 'Special Pricelist', states={
'required': Eval('type_special_price') == 'pricelist', 'required': Eval('type_special_price') == 'pricelist',
}, depends=['type_special_price']) }, depends=['type_special_price'])

View File

@ -1,7 +1,9 @@
# This file is part of product_special_price module for Tryton. # This file is part of product_special_price module for Tryton.
# The COPYRIGHT file at the top level of this repository contains the full # The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms. # copyright notices and license terms.
try:
from .test_product_special_price import suite from trytond.modules.product_special_price.tests.test_product_special_price import suite
except ImportError:
from .test_product_special_price import suite
__all__ = ['suite'] __all__ = ['suite']

View File

@ -15,4 +15,4 @@ def suite():
suite = trytond.tests.test_tryton.suite() suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase( suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
ProductSpecialPriceTestCase)) ProductSpecialPriceTestCase))
return suite return suite

View File

@ -1,12 +1,13 @@
[tox] [tox]
envlist = {py27,py33,py34,py35}-{sqlite,postgresql,mysql},pypy-{sqlite,postgresql} envlist = {py27,py34,py35,py36}-{sqlite,postgresql,mysql},pypy-{sqlite,postgresql}
[testenv] [testenv]
commands = {envpython} setup.py test commands = {envpython} setup.py test
deps = deps =
{py27,py33,py34,py35}-postgresql: psycopg2 >= 2.5 {py27,py34,py35,py36}-postgresql: psycopg2 >= 2.5
pypy-postgresql: psycopg2cffi >= 2.5 pypy-postgresql: psycopg2cffi >= 2.5
mysql: MySQL-python mysql: MySQL-python
sqlite: sqlitebck
setenv = setenv =
sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://} sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://} postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
@ -14,4 +15,4 @@ setenv =
sqlite: DB_NAME={env:SQLITE_NAME::memory:} sqlite: DB_NAME={env:SQLITE_NAME::memory:}
postgresql: DB_NAME={env:POSTGRESQL_NAME:test} postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
mysql: DB_NAME={env:MYSQL_NAME:test} mysql: DB_NAME={env:MYSQL_NAME:test}
install_command = pip install --pre --find-links https://trydevpi.tryton.org/ {opts} {packages} install_command = pip install --pre --find-links https://trydevpi.tryton.org/ --process-dependency-links {opts} {packages}

View File

@ -1,5 +1,5 @@
[tryton] [tryton]
version=4.1.0 version=4.7.0
depends: depends:
product_price_list product_price_list
sale_shop sale_shop