diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-11-16 19:30:20 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-11-16 19:30:20 +0100 |
| commit | 6faad524cf5e4db02855cb213277c40aee14c42a (patch) | |
| tree | 383c984dc1461a03481baa9fbdce8c156ca97e2e /odoo | |
| parent | 3657dc77c2ddb4275f07d1271b93e7f25e09913a (diff) | |
| parent | bc744a1da46efda6f1eb5c341f2fa5df30c9c7ad (diff) | |
[MERGE] forward port branch 12.0 up to bc744a1da46
Diffstat (limited to 'odoo')
| -rw-r--r-- | odoo/PKG-INFO | 18 | ||||
| -rw-r--r-- | odoo/addons/base/rng/calendar_view.rng | 2 | ||||
| -rw-r--r-- | odoo/addons/base/static/src/js/res_config_settings.js | 9 | ||||
| -rw-r--r-- | odoo/addons/base/static/tests/base_settings_tests.js | 4 | ||||
| -rw-r--r-- | odoo/addons/base/views/ir_module_views.xml | 4 | ||||
| -rw-r--r-- | odoo/addons/base/views/res_partner_views.xml | 10 | ||||
| -rw-r--r-- | odoo/addons/test_main_flows/static/src/js/tour.js | 2 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/ir.model.access.csv | 4 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/models.py | 35 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_new_fields.py | 20 | ||||
| -rw-r--r-- | odoo/cli/deploy.py | 39 | ||||
| -rw-r--r-- | odoo/fields.py | 14 | ||||
| -rw-r--r-- | odoo/tests/common.py | 2 |
13 files changed, 106 insertions, 57 deletions
diff --git a/odoo/PKG-INFO b/odoo/PKG-INFO deleted file mode 100644 index fba4a850f51..00000000000 --- a/odoo/PKG-INFO +++ /dev/null @@ -1,18 +0,0 @@ -Metadata-Version: 1.1 -Name: OpenERP -Version: 6.0.0 -Author: OpenERP S.A. -Author-email: fp at openerp com -Maintainer: OpenERP S.A. -Maintainer-email: fp at openerp com -Home-page: http://www.openerp.com -Download-url: http://www.openerp.com/downloads.html -Summary: OpenERP is an Enterprise Resource Management written entirely in python. -License: GPL-3 -Description: OpenERP is a complete ERP and CRM. The main features are accounting (analytic - and financial), stock management, sales and purchases management, tasks - automation, marketing campaigns, help desk, POS, etc. Technical features include - a distributed server, flexible workflows, an object database, a dynamic GUI, - customizable reports, and an XML-RPC interface. -Keywords: ERP, Accounting, Stock, CRM, Enterprise, Logistics, Management, Sales, Purchases -Platform: Linux, Win32 diff --git a/odoo/addons/base/rng/calendar_view.rng b/odoo/addons/base/rng/calendar_view.rng index 949c3f48318..500a61b3389 100644 --- a/odoo/addons/base/rng/calendar_view.rng +++ b/odoo/addons/base/rng/calendar_view.rng @@ -32,7 +32,7 @@ <rng:ref name="field"/> </rng:zeroOrMore> <rng:optional> - <rng:element name="template"> + <rng:element name="templates"> <rng:oneOrMore> <rng:ref name="any"/> </rng:oneOrMore> diff --git a/odoo/addons/base/static/src/js/res_config_settings.js b/odoo/addons/base/static/src/js/res_config_settings.js index 855b03452ae..9514d431141 100644 --- a/odoo/addons/base/static/src/js/res_config_settings.js +++ b/odoo/addons/base/static/src/js/res_config_settings.js @@ -354,6 +354,15 @@ var BaseSettingController = FormController.extend({ this.disableAutofocus = true; this.renderer.activeSettingTab = this.initialState.context.module; }, + /** + * Settings view should always be in edit mode, so we have to override + * default behaviour + * + * @override + */ + willRestore: function () { + this.mode = 'edit'; + }, }); var BaseSettingsModel = BasicModel.extend({ diff --git a/odoo/addons/base/static/tests/base_settings_tests.js b/odoo/addons/base/static/tests/base_settings_tests.js index e0ee5dd6380..eb9726b9fa6 100644 --- a/odoo/addons/base/static/tests/base_settings_tests.js +++ b/odoo/addons/base/static/tests/base_settings_tests.js @@ -87,7 +87,7 @@ QUnit.module('base_settings_tests', { }); QUnit.test('settings views does not read existing id when coming back in breadcrumbs', function (assert) { - assert.expect(7); + assert.expect(8); var actions = [{ id: 1, @@ -127,6 +127,8 @@ QUnit.module('base_settings_tests', { actionManager.doAction(1); actionManager.$('button[name="4"]').click(); $('.o_control_panel .breadcrumb-item a').click(); + assert.ok(actionManager.$('.o_form_view').hasClass('o_form_editable'), + 'settings view should still be in edit mode'); assert.verifySteps([ 'load_views', // initial setting action 'default_get', // this is a setting view => create new record diff --git a/odoo/addons/base/views/ir_module_views.xml b/odoo/addons/base/views/ir_module_views.xml index ebf6700ecea..7f1bb9727a9 100644 --- a/odoo/addons/base/views/ir_module_views.xml +++ b/odoo/addons/base/views/ir_module_views.xml @@ -37,8 +37,8 @@ <search string="Search modules"> <field name="name" filter_domain="['|', '|', ('summary', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Module"/> - <filter name="app" string="Apps" domain="[('application', '=', 1)]"/> - <filter name="extra" string="Extra" domain="[('application', '=', 0)]"/> + <filter name="app" string="Apps" domain="[('application', '=', True)]"/> + <filter name="extra" string="Extra" domain="[('application', '=', False)]"/> <separator/> <filter name="installed" string="Installed" domain="[('state', 'in', ['installed', 'to upgrade', 'to remove'])]"/> <filter name="not_installed" string="Not Installed" domain="[('state', 'in', ['uninstalled', 'uninstallable', 'to install'])]"/> diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index 9a86939782b..1880589a326 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -449,15 +449,15 @@ <search string="Search Partner"> <field name="name" filter_domain="['|','|',('display_name','ilike',self),('ref','=',self),('email','ilike',self)]"/> - <field name="parent_id" domain="[('is_company','=',1)]" operator="child_of"/> + <field name="parent_id" domain="[('is_company','=',True)]" operator="child_of"/> <filter name="filter_my_partners" help="My Contacts" domain="[('user_id','=',uid)]"/> <separator/> - <filter string="Individuals" name="type_person" domain="[('is_company','=',0)]"/> - <filter string="Companies" name="type_company" domain="[('is_company','=',1)]"/> + <filter string="Individuals" name="type_person" domain="[('is_company','=',False)]"/> + <filter string="Companies" name="type_company" domain="[('is_company','=',True)]"/> <separator/> - <filter string="Customers" name="customer" domain="[('customer','=',1), ('parent_id', '=', False)]"/> - <filter string="Vendors" name="supplier" domain="[('supplier','=',1), ('parent_id', '=', False)]"/> + <filter string="Customers" name="customer" domain="[('customer','=',True), ('parent_id', '=', False)]"/> + <filter string="Vendors" name="supplier" domain="[('supplier','=',True), ('parent_id', '=', False)]"/> <filter string="Archived" name="inactive" domain="[('active','=',False)]"/> <separator/> <field name="category_id" string="Tag" filter_domain="[('category_id','ilike', self)]"/> diff --git a/odoo/addons/test_main_flows/static/src/js/tour.js b/odoo/addons/test_main_flows/static/src/js/tour.js index 717c9d81884..d79036346b2 100644 --- a/odoo/addons/test_main_flows/static/src/js/tour.js +++ b/odoo/addons/test_main_flows/static/src/js/tour.js @@ -671,7 +671,7 @@ tour.register('main_flow_tour', { position: 'bottom', }, { edition: "enterprise", - trigger: '.o_app[data-menu-xmlid="account.menu_finance"]', + trigger: '.o_app[data-menu-xmlid="account_accountant.menu_accounting"]', content: _t('Go to Accounting'), position: 'bottom', }, { diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/ir.model.access.csv index c825fb51c59..77c881dcc4d 100644 --- a/odoo/addons/test_new_api/ir.model.access.csv +++ b/odoo/addons/test_new_api/ir.model.access.csv @@ -22,3 +22,7 @@ access_test_new_api_multi_compute_inverse,access_test_new_api_multi_compute_inve access_test_new_api_recursive,access_test_new_api_recursive,model_test_new_api_recursive,,1,1,1,1 access_test_new_api_cascade,access_test_new_api_cascade,model_test_new_api_cascade,,1,1,1,1 access_test_new_api_binary_svg,access_test_new_api_binary_svg,model_test_new_api_binary_svg,,1,1,1,1 +access_test_new_api_monetary_base,access_test_new_api_monetary_base,model_test_new_api_monetary_base,,1,1,1,1 +access_test_new_api_monetary_related,access_test_new_api_monetary_related,model_test_new_api_monetary_related,,1,1,1,1 +access_test_new_api_monetary_custom,access_test_new_api_monetary_custom,model_test_new_api_monetary_custom,,1,1,1,1 +access_test_new_api_monetary_inherits,access_test_new_api_monetary_inherits,model_test_new_api_monetary_inherits,,1,1,1,1 diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index 043ee8a0b7d..7d7ad777b44 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -468,3 +468,38 @@ class BinarySvg(models.Model): name = fields.Char(required=True) image_attachment = fields.Binary(attachment=True) image_wo_attachment = fields.Binary(attachment=False) + + +class MonetaryBase(models.Model): + _name = 'test_new_api.monetary_base' + _description = 'Monetary Base' + + base_currency_id = fields.Many2one('res.currency') + amount = fields.Monetary(currency_field='base_currency_id') + + +class MonetaryRelated(models.Model): + _name = 'test_new_api.monetary_related' + _description = 'Monetary Related' + + monetary_id = fields.Many2one('test_new_api.monetary_base') + currency_id = fields.Many2one('res.currency', related='monetary_id.base_currency_id') + amount = fields.Monetary(related='monetary_id.amount') + + +class MonetaryCustom(models.Model): + _name = 'test_new_api.monetary_custom' + _description = 'Monetary Related Custom' + + monetary_id = fields.Many2one('test_new_api.monetary_base') + x_currency_id = fields.Many2one('res.currency', related='monetary_id.base_currency_id') + x_amount = fields.Monetary(related='monetary_id.amount') + + +class MonetaryInherits(models.Model): + _name = 'test_new_api.monetary_inherits' + _description = 'Monetary Inherits' + _inherits = {'test_new_api.monetary_base': 'monetary_id'} + + monetary_id = fields.Many2one('test_new_api.monetary_base', required=True, ondelete='cascade') + currency_id = fields.Many2one('res.currency') diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index caa4eedf4bf..9b3da038c5c 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1054,6 +1054,26 @@ class TestFields(common.TransactionCase): ]) self.assertEqual(attachment.mimetype, 'text/plain') + def test_93_monetary_related(self): + """ Check the currency field on related monetary fields. """ + # check base field + field = self.env['test_new_api.monetary_base']._fields['amount'] + self.assertEqual(field.currency_field, 'base_currency_id') + + # related fields must use the field 'currency_id' or 'x_currency_id' + field = self.env['test_new_api.monetary_related']._fields['amount'] + self.assertEqual(field.related, ('monetary_id', 'amount')) + self.assertEqual(field.currency_field, 'currency_id') + + field = self.env['test_new_api.monetary_custom']._fields['x_amount'] + self.assertEqual(field.related, ('monetary_id', 'amount')) + self.assertEqual(field.currency_field, 'x_currency_id') + + # inherited field must use the same field as its parent field + field = self.env['test_new_api.monetary_inherits']._fields['amount'] + self.assertEqual(field.related, ('monetary_id', 'amount')) + self.assertEqual(field.currency_field, 'base_currency_id') + class TestX2many(common.TransactionCase): def test_search_many2many(self): diff --git a/odoo/cli/deploy.py b/odoo/cli/deploy.py index 6e76cea7d45..29b969135dd 100644 --- a/odoo/cli/deploy.py +++ b/odoo/cli/deploy.py @@ -18,40 +18,29 @@ class Deploy(Command): def deploy_module(self, module_path, url, login, password, db='', force=False): url = url.rstrip('/') - csrf_token = self.authenticate(url, login, password, db) module_file = self.zip_module(module_path) try: - return self.upload_module(url, module_file, force=force, csrf_token=csrf_token) + return self.login_upload_module(module_file, url, login, password, db, force=force) finally: os.remove(module_file) - def upload_module(self, server, module_file, force=False, csrf_token=None): + def login_upload_module(self, module_file, url, login, password, db, force=False): print("Uploading module file...") - url = server + '/base_import_module/upload' - - post_data = {'force': '1' if force else ''} - if csrf_token: post_data['csrf_token'] = csrf_token - + endpoint = url + '/base_import_module/login_upload' + post_data = { + 'login': login, + 'password': password, + 'db': db, + 'force': '1' if force else '', + } with open(module_file, 'rb') as f: - res = self.session.post(url, files={'mod_file': f}, data=post_data) - res.raise_for_status() - - return res.text + res = self.session.post(endpoint, files={'mod_file': f}, data=post_data) - def authenticate(self, server, login, password, db=''): - print("Authenticating on server '%s' ..." % server) - - # Fixate session with a given db if any - self.session.get(server + '/web/login', params=dict(db=db)) - - args = dict(login=login, password=password, db=db) - res = self.session.post(server + '/base_import_module/login', args) if res.status_code == 404: - raise Exception("The server '%s' does not have the 'base_import_module' installed." % server) - elif res.status_code != 200: - raise Exception(res.text) - - return res.headers.get('x-csrf-token') + raise Exception( + "The server '%s' does not have the 'base_import_module' installed or is not up-to-date." % url) + res.raise_for_status() + return res.text def zip_module(self, path): path = os.path.abspath(path) diff --git a/odoo/fields.py b/odoo/fields.py index 6d89f9355ec..d877cd71f87 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -1276,11 +1276,9 @@ class Monetary(Field): def __init__(self, string=Default, currency_field=Default, **kwargs): super(Monetary, self).__init__(string=string, currency_field=currency_field, **kwargs) - _related_currency_field = property(attrgetter('currency_field')) _description_currency_field = property(attrgetter('currency_field')) - def _setup_regular_full(self, model): - super(Monetary, self)._setup_regular_full(model) + def _setup_currency_field(self, model): if not self.currency_field: # pick a default, trying in order: 'currency_id', 'x_currency_id' if 'currency_id' in model._fields: @@ -1290,6 +1288,16 @@ class Monetary(Field): assert self.currency_field in model._fields, \ "Field %s with unknown currency_field %r" % (self, self.currency_field) + def _setup_regular_full(self, model): + super(Monetary, self)._setup_regular_full(model) + self._setup_currency_field(model) + + def _setup_related_full(self, model): + super(Monetary, self)._setup_related_full(model) + if self.inherited: + self.currency_field = self.related_field.currency_field + self._setup_currency_field(model) + def convert_to_column(self, value, record, values=None, validate=True): # retrieve currency from values or record if values and self.currency_field in values: diff --git a/odoo/tests/common.py b/odoo/tests/common.py index 782debfe74f..6c562acff79 100644 --- a/odoo/tests/common.py +++ b/odoo/tests/common.py @@ -314,7 +314,7 @@ class BaseCase(TreeCase, MetaCase('DummyCase', (object,), {})): field_type = record._fields[field_name].type if field_type == 'monetary': # Compare monetary field. - currency_field_name = record._fields[field_name]._related_currency_field + currency_field_name = record._fields[field_name].currency_field record_currency = record[currency_field_name] if record_currency.compare_amounts(candidate_value, record_value)\ if record_currency else candidate_value != record_value: |
