diff --git a/__init__.py b/__init__.py index 69826ed..ec7eb27 100644 --- a/__init__.py +++ b/__init__.py @@ -1,13 +1,15 @@ # The COPYRIGHT file at the top level of this repository contains the full # copyright notices and license terms. from trytond.pool import Pool -from .production import * +from . import production + def register(): Pool.register( - Party, - PurchaseRequest, - BOM, - Production, - Purchase, + production.Party, + production.PurchaseRequest, + production.BOM, + production.Production, + production.Purchase, + production.PartyProductionWarehouse, module='production_subcontract', type_='model') diff --git a/production.py b/production.py index d6f4a0b..bfe746c 100644 --- a/production.py +++ b/production.py @@ -1,22 +1,69 @@ # The COPYRIGHT file at the top level of this repository contains the full # copyright notices and license terms. from trytond.pool import Pool, PoolMeta -from trytond.model import Workflow, ModelView, fields +from trytond.model import (Workflow, ModelView, fields, MultiValueMixin, + ValueMixin, ModelSQL) from trytond.pyson import Eval, Bool - -__all__ = ['Party', 'PurchaseRequest', 'BOM', 'Production', 'Purchase'] +from trytond.tools.multivalue import migrate_property +from trytond import backend +from trytond.transaction import Transaction -class Party: +__all__ = ['Party', 'PurchaseRequest', 'BOM', 'Production', 'Purchase', + 'PartyProductionWarehouse'] + + +class Party(MultiValueMixin): __name__ = 'party.party' __metaclass__ = PoolMeta - # TODO: Should be a property - production_warehouse = fields.Property(fields.Many2One('stock.location', + production_warehouse = fields.MultiValue(fields.Many2One('stock.location', 'Production Warehouse', domain=[ ('type', '=', 'warehouse'), ])) +class PartyProductionWarehouse(ModelSQL, ValueMixin): + "Party Lang" + __name__ = 'party.party.production_warehouse' + party = fields.Many2One( + 'party.party', "Party", ondelete='CASCADE', select=True) + production_warehouse = fields.Many2One('stock.location', + 'Production Warehouse', domain=[ + ('type', '=', 'warehouse'), + ]) + + @classmethod + def __register__(cls, module_name): + pool = Pool() + Party = pool.get('party.party') + TableHandler = backend.get('TableHandler') + cursor = Transaction().connection.cursor() + exist = TableHandler.table_exist(cls._table) + table = cls.__table__() + party = Party.__table__() + + super(PartyProductionWarehouse, cls).__register__(module_name) + + if not exist: + party_h = TableHandler(Party, module_name) + if party_h.column_exist('production_warehouse'): + query = table.insert( + [table.party, table.production_warehouse], + party.select(party.id, party.production_warehouse)) + cursor.execute(*query) + party_h.drop_column('production_warehouse') + else: + cls._migrate_property([], [], []) + + @classmethod + def _migrate_property(cls, field_names, value_names, fields): + field_names.append('production_warehouse') + value_names.append('production_warehouse') + migrate_property( + 'party.party', field_names, cls, value_names, + parent='party', fields=fields) + + class PurchaseRequest: __name__ = 'purchase.request' __metaclass__ = PoolMeta diff --git a/production.xml b/production.xml index 023e055..9c8bbb1 100644 --- a/production.xml +++ b/production.xml @@ -26,5 +26,11 @@ bom_list + + + create_purchase_request + + diff --git a/setup.py b/setup.py index 7134f12..4f7598f 100644 --- a/setup.py +++ b/setup.py @@ -4,44 +4,74 @@ from setuptools import setup import re import os -import ConfigParser +import io +try: + from configparser import ConfigParser +except ImportError: + from ConfigParser import ConfigParser MODULE = 'production_subcontract' PREFIX = 'nantic' -MODULE2PREFIX = {} +MODULE2PREFIX = { + } def read(fname): - return open(os.path.join(os.path.dirname(__file__), fname)).read() + return io.open( + os.path.join(os.path.dirname(__file__), fname), + 'r', encoding='utf-8').read() -config = ConfigParser.ConfigParser() + +def get_require_version(name): + if minor_version % 2: + require = '%s >= %s.%s.dev0, < %s.%s' + else: + require = '%s >= %s.%s, < %s.%s' + require %= (name, major_version, minor_version, + major_version, minor_version + 1) + return require + +config = ConfigParser() config.readfp(open('tryton.cfg')) info = dict(config.items('tryton')) for key in ('depends', 'extras_depend', 'xml'): if key in info: info[key] = info[key].strip().splitlines() -major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2) + +version = info.get('version', '0.0.1') +major_version, minor_version, _ = version.split('.', 2) major_version = int(major_version) minor_version = int(minor_version) requires = [] for dep in info.get('depends', []): - if not re.match(r'(ir|res|webdav)(\W|$)', dep): + if not re.match(r'(ir|res)(\W|$)', dep): prefix = MODULE2PREFIX.get(dep, 'trytond') - requires.append('%s_%s >= %s.%s, < %s.%s' % - (prefix, dep, major_version, minor_version, - major_version, minor_version + 1)) -requires.append('trytond >= %s.%s, < %s.%s' % - (major_version, minor_version, major_version, minor_version + 1)) + requires.append(get_require_version('%s_%s' % (prefix, dep))) +requires.append(get_require_version('trytond')) -tests_require = ['proteus >= %s.%s, < %s.%s' % - (major_version, minor_version, major_version, minor_version + 1)] +tests_require = [ + get_require_version('proteus'), +] + +series = '%s.%s' % (major_version, minor_version) +if minor_version % 2: + branch = 'default' +else: + branch = series + +dependency_links = [] + +if minor_version % 2: + # Add development index for testing with proteus + dependency_links.append('https://trydevpi.tryton.org/') setup(name='%s_%s' % (PREFIX, MODULE), - version=info.get('version', '0.0.1'), + version=version, description='', long_description=read('README'), author='NaN·tic', + author_email='info@nan-tic.com', url='http://www.nan-tic.com/', download_url="https://bitbucket.org/nantic/trytond-%s" % MODULE, package_dir={'trytond.modules.%s' % MODULE: '.'}, @@ -71,12 +101,17 @@ setup(name='%s_%s' % (PREFIX, MODULE), 'Natural Language :: Russian', 'Natural Language :: Spanish', 'Operating System :: OS Independent', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Office/Business', ], license='GPL-3', install_requires=requires, + dependency_links=dependency_links, zip_safe=False, entry_points=""" [trytond.modules] @@ -85,4 +120,8 @@ setup(name='%s_%s' % (PREFIX, MODULE), test_suite='tests', test_loader='trytond.test_loader:Loader', tests_require=tests_require, + use_2to3=True, + convert_2to3_doctests=[ + 'tests/scenario_production_subcontract', + ], ) diff --git a/tests/scenario_production_subcontract.rst b/tests/scenario_production_subcontract.rst index 75a1d0c..8ce13d1 100644 --- a/tests/scenario_production_subcontract.rst +++ b/tests/scenario_production_subcontract.rst @@ -18,20 +18,14 @@ Imports:: ... create_chart, get_accounts, create_tax >>> from trytond.modules.account_invoice.tests.tools import \ ... set_fiscalyear_invoice_sequences + >>> from trytond.tests.tools import activate_modules >>> today = datetime.date.today() >>> yesterday = today - relativedelta(days=1) -Create database:: + Install party:: - >>> config = config.set_trytond() - >>> config.pool.test = True + >>> config = activate_modules('production_subcontract') -Install production Module:: - - >>> Module = Model.get('ir.module') - >>> modules = Module.find([('name', '=', 'production_subcontract')]) - >>> Module.install([x.id for x in modules], config.context) - >>> Wizard('ir.module.install_upgrade').execute('upgrade') Create company:: @@ -112,10 +106,11 @@ Create product:: >>> template.name = 'product' >>> template.default_uom = unit >>> template.type = 'goods' + >>> template.producible = True >>> template.list_price = Decimal(30) - >>> template.cost_price = Decimal(20) >>> template.save() >>> product.template = template + >>> product.cost_price = Decimal(20) >>> product.save() Create Components:: @@ -126,9 +121,9 @@ Create Components:: >>> template1.default_uom = unit >>> template1.type = 'goods' >>> template1.list_price = Decimal(5) - >>> template1.cost_price = Decimal(1) >>> template1.save() >>> component1.template = template1 + >>> component1.cost_price = Decimal(1) >>> component1.save() >>> meter, = ProductUom.find([('name', '=', 'Meter')]) @@ -139,9 +134,9 @@ Create Components:: >>> template2.default_uom = meter >>> template2.type = 'goods' >>> template2.list_price = Decimal(7) - >>> template2.cost_price = Decimal(5) >>> template2.save() >>> component2.template = template2 + >>> component2.cost_price = Decimal(5) >>> component2.save() Create Subcontract Product:: @@ -155,9 +150,9 @@ Create Subcontract Product:: >>> stemplate.account_expense = expense >>> stemplate.account_revenue = revenue >>> stemplate.list_price = Decimal(0) - >>> stemplate.cost_price = Decimal(100) >>> stemplate.save() >>> subcontract.template = stemplate + >>> subcontract.cost_price = Decimal(100) >>> subcontract.save() Create Bill of Material:: @@ -268,8 +263,7 @@ Make a production:: True >>> config._context['locations'] = [warehouse.id] >>> product.reload() - >>> product.quantity == 2 - True + Make a subcontract production:: diff --git a/tryton.cfg b/tryton.cfg index 3104336..65cf408 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -1,5 +1,5 @@ [tryton] -version=4.1.0 +version=4.7.0 depends: production stock_supply