diff --git a/.drone.yml b/.drone.yml index e0bc2f7026..5da6083eb7 100644 --- a/.drone.yml +++ b/.drone.yml @@ -25,12 +25,6 @@ services: 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 diff --git a/CHANGELOG b/CHANGELOG index 58366b56de..fe06ef0079 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Remove support for Python 2.7 + Version 4.8.0 - 2018-04-23 * Bug fixes (see mercurial logs for details) * Check pending payment to erase party diff --git a/INSTALL b/INSTALL index 75892303aa..223fb79ab5 100644 --- a/INSTALL +++ b/INSTALL @@ -4,7 +4,7 @@ Installing trytond_account_payment Prerequisites ------------- - * Python 2.7 or later (http://www.python.org/) + * Python 3.4 or later (http://www.python.org/) * trytond (http://www.tryton.org/) * trytond_party (http://www.tryton.org/) * trytond_account (http://www.tryton.org/) diff --git a/account.py b/account.py index 09a43f3ed7..7729564d26 100644 --- a/account.py +++ b/account.py @@ -24,8 +24,7 @@ __all__ = ['MoveLine', 'PayLine', 'PayLineAskJournal', 'Invoice'] -class MoveLine: - __metaclass__ = PoolMeta +class MoveLine(metaclass=PoolMeta): __name__ = 'account.move.line' payment_amount = fields.Function(fields.Numeric('Payment Amount', digits=(16, @@ -63,7 +62,7 @@ class MoveLine: super(MoveLine, cls).__setup__() cls._buttons.update({ 'pay': { - 'invisible': ~Eval('payment_kind').in_(dict(KINDS).keys()), + 'invisible': ~Eval('payment_kind').in_(list(dict(KINDS).keys())), 'depends': ['payment_kind'], }, 'payment_block': { @@ -262,7 +261,7 @@ class PayLine(Wizard): values['journal'] = journal.id values['company'] = company.id values['currency'] = currency.id - values['journals'] = [j.id for j in self._get_journals().itervalues()] + values['journals'] = [j.id for j in self._get_journals().values()] return values def get_payment(self, line, journals): @@ -306,8 +305,7 @@ class PayLine(Wizard): } -class Configuration: - __metaclass__ = PoolMeta +class Configuration(metaclass=PoolMeta): __name__ = 'account.configuration' payment_group_sequence = fields.MultiValue(fields.Many2One( 'ir.sequence', 'Payment Group Sequence', required=True, @@ -364,8 +362,7 @@ class ConfigurationPaymentGroupSequence(ModelSQL, CompanyValueMixin): return None -class Invoice: - __metaclass__ = PoolMeta +class Invoice(metaclass=PoolMeta): __name__ = 'account.invoice' payment_direct_debit = fields.Boolean("Direct Debit", diff --git a/party.py b/party.py index f681e50ee0..20d36113a0 100644 --- a/party.py +++ b/party.py @@ -9,8 +9,7 @@ payment_direct_debit = fields.Boolean( "Direct Debit", help="Check if supplier does direct debit.") -class Party: - __metaclass__ = PoolMeta +class Party(metaclass=PoolMeta): __name__ = 'party.party' payment_direct_debit = fields.MultiValue(payment_direct_debit) @@ -30,8 +29,7 @@ class PartyPaymentDirectDebit(ModelSQL, CompanyValueMixin): payment_direct_debit = payment_direct_debit -class PartyReplace: - __metaclass__ = PoolMeta +class PartyReplace(metaclass=PoolMeta): __name__ = 'party.replace' @classmethod @@ -41,8 +39,7 @@ class PartyReplace: ] -class PartyErase: - __metaclass__ = PoolMeta +class PartyErase(metaclass=PoolMeta): __name__ = 'party.erase' @classmethod diff --git a/setup.py b/setup.py index 2e0203fd47..f0fd6b54df 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,12 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. -from setuptools import setup -import re -import os import io -try: - from configparser import ConfigParser -except ImportError: - from ConfigParser import ConfigParser +import os +import re +from configparser import ConfigParser +from setuptools import setup def read(fname): @@ -27,6 +24,7 @@ def get_require_version(name): major_version, minor_version + 1) return require + config = ConfigParser() config.readfp(open('tryton.cfg')) info = dict(config.items('tryton')) @@ -104,7 +102,6 @@ setup(name=name, 'Natural Language :: Slovenian', 'Natural Language :: Spanish', 'Operating System :: OS Independent', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', @@ -114,6 +111,7 @@ setup(name=name, 'Topic :: Office/Business :: Financial :: Accounting', ], license='GPL-3', + python_requires='>=3.4', install_requires=requires, dependency_links=dependency_links, zip_safe=False, @@ -124,6 +122,4 @@ setup(name=name, test_suite='tests', test_loader='trytond.test_loader:Loader', tests_require=tests_require, - use_2to3=True, - convert_2to3_doctests=['tests/scenario_account_payment.rst'], ) diff --git a/tests/scenario_account_payment.rst b/tests/scenario_account_payment.rst index 13bd22ccd8..3dcc3deade 100644 --- a/tests/scenario_account_payment.rst +++ b/tests/scenario_account_payment.rst @@ -76,12 +76,12 @@ Partially pay line:: >>> payment.amount = Decimal('20.00') >>> payment.click('approve') >>> payment.state - u'approved' + 'approved' >>> process_payment = Wizard('account.payment.process', [payment]) >>> process_payment.execute('process') >>> payment.reload() >>> payment.state - u'processing' + 'processing' >>> line.reload() >>> line.payment_amount Decimal('30.00') @@ -102,7 +102,7 @@ Partially fail to pay the remaining:: >>> payment.reload() >>> payment.click('fail') >>> payment.state - u'failed' + 'failed' >>> line.reload() >>> line.payment_amount Decimal('30.00') diff --git a/tests/scenario_account_payment_invoice.rst b/tests/scenario_account_payment_invoice.rst index 104d8e4b72..6d3cfa8141 100644 --- a/tests/scenario_account_payment_invoice.rst +++ b/tests/scenario_account_payment_invoice.rst @@ -65,7 +65,7 @@ Create invoice:: >>> line.unit_price = Decimal('100') >>> invoice.click('post') >>> invoice.state - u'posted' + 'posted' >>> invoice.amount_to_pay Decimal('100.00') >>> line_to_pay, = invoice.lines_to_pay @@ -145,7 +145,7 @@ Create invoice:: >>> line.unit_price = Decimal('50') >>> invoice.click('post') >>> invoice.state - u'posted' + 'posted' >>> line_to_pay, = invoice.lines_to_pay >>> bool(line_to_pay.payment_direct_debit) True diff --git a/tox.ini b/tox.ini index 2082ab4f4d..adbcbf8431 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,11 @@ [tox] -envlist = {py27,py34,py35,py36}-{sqlite,postgresql},pypy-{sqlite,postgresql} +envlist = {py34,py35,py36}-{sqlite,postgresql},pypy3-{sqlite,postgresql} [testenv] commands = {envpython} setup.py test deps = - {py27,py34,py35,py36}-postgresql: psycopg2 >= 2.5 - pypy-postgresql: psycopg2cffi >= 2.5 + {py34,py35,py36}-postgresql: psycopg2 >= 2.5 + pypy3-postgresql: psycopg2cffi >= 2.5 sqlite: sqlitebck setenv = sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}