From 7dd719a67f2d9b55198b1f0e5261eb1bc7b7cf9e Mon Sep 17 00:00:00 2001 From: ChintAn Ambaliya Date: Fri, 13 Jul 2018 09:51:12 +0000 Subject: [PATCH] Master chintan hiren mayank 13072018 --- .../models/res_partner.py | 8 + .../views/res_company_view.xml | 2 +- addons/board/static/description/index.html | 6 +- addons/board/static/src/js/dashboard.js | 34 +- addons/board/static/src/js/favorite_menu.js | 5 +- addons/board/static/tests/dashboard_tests.js | 60 +- addons/http_routing/__init__.py | 1 + addons/http_routing/controllers/__init__.py | 4 + addons/http_routing/controllers/main.py | 23 + addons/http_routing/geoipresolver.py | 64 ++ addons/http_routing/models/ir_http.py | 26 +- .../data/pos_inalterability.xml | 1 + .../models/account_bank_statement.py | 4 +- addons/l10n_generic_coa/__init__.py | 6 + addons/l10n_generic_coa/__manifest__.py | 1 + addons/l10n_in/views/report_invoice.xml | 2 +- addons/note/static/description/index.html | 4 +- addons/note/views/note_views.xml | 2 +- addons/pad/models/pad.py | 5 +- .../plugin/ep_disable_init_focus/package.json | 2 +- addons/web/Gruntfile.js | 2 +- addons/web/controllers/main.py | 47 +- addons/web/models/ir_qweb.py | 25 +- .../lib/bootstrap/less/scaffolding.less | 2 +- .../web/static/lib/qweb/qweb-test-widgets.xml | 26 + .../src/js/chrome/abstract_web_client.js | 2 +- addons/web/static/src/js/chrome/loading.js | 6 +- addons/web/static/src/js/chrome/menu.js | 11 +- .../web/static/src/js/chrome/view_manager.js | 4 +- addons/web/static/src/js/chrome/web_client.js | 7 + addons/web/static/src/js/core/ajax.js | 67 +- addons/web/static/src/js/core/rpc.js | 14 +- addons/web/static/src/js/core/session.js | 50 +- .../web/static/src/js/fields/basic_fields.js | 42 +- .../static/src/js/fields/field_registry.js | 1 + .../static/src/js/fields/relational_fields.js | 48 +- .../static/src/js/fields/upgrade_fields.js | 9 +- .../static/src/js/services/crash_manager.js | 5 +- .../src/js/views/abstract_controller.js | 20 +- .../static/src/js/views/abstract_renderer.js | 8 + .../web/static/src/js/views/abstract_view.js | 8 + .../src/js/views/basic/basic_controller.js | 10 +- .../static/src/js/views/basic/basic_model.js | 241 ++++- .../src/js/views/basic/basic_renderer.js | 4 +- .../src/js/views/calendar/calendar_model.js | 22 +- .../src/js/views/calendar/calendar_view.js | 16 +- .../src/js/views/form/form_controller.js | 25 +- .../src/js/views/graph/graph_renderer.js | 64 +- .../src/js/views/kanban/kanban_controller.js | 66 +- .../src/js/views/kanban/kanban_model.js | 14 +- .../js/views/list/list_editable_renderer.js | 7 +- .../static/src/js/views/pivot/pivot_model.js | 9 +- .../web/static/src/js/views/view_dialogs.js | 2 +- .../web/static/src/js/widgets/date_picker.js | 11 +- .../static/src/js/widgets/debug_manager.js | 1 + .../static/src/less/bootstrap_overridden.less | 2 + addons/web/static/src/less/datepicker.less | 3 +- addons/web/static/src/less/fields.less | 13 +- addons/web/static/src/less/form_view.less | 4 + .../src/less/kanban_column_progressbar.less | 1 + .../web/static/src/less/kanban_dashboard.less | 1 + addons/web/static/src/less/list_view.less | 15 +- addons/web/static/src/less/pivot_view.less | 2 +- addons/web/static/src/less/web_calendar.less | 5 - addons/web/static/tests/boot_tests.js | 2 +- .../static/tests/fields/basic_fields_tests.js | 71 +- .../tests/fields/relational_fields_tests.js | 962 +++++++++++++++++- .../web/static/tests/helpers/mock_server.js | 10 +- .../web/static/tests/views/calendar_tests.js | 156 ++- addons/web/static/tests/views/form_tests.js | 61 ++ addons/web/static/tests/views/kanban_tests.js | 249 ++++- addons/web/static/tests/views/list_tests.js | 41 +- addons/web/static/tests/views/pivot_tests.js | 74 ++ addons/web/tests/test_js.py | 4 +- addons/web/views/report_templates.xml | 6 + addons/web/views/webclient_templates.xml | 4 +- addons/web_editor/controllers/main.py | 11 +- addons/web_editor/models/ir_http.py | 6 + addons/web_editor/models/ir_qweb.py | 1 + .../lib/summernote/src/js/EventHandler.js | 3 +- .../lib/summernote/src/js/module/Clipboard.js | 281 +---- .../lib/summernote/src/js/module/Editor.js | 4 +- .../static/src/js/backend/fields.js | 84 +- .../web_editor/static/src/js/editor/editor.js | 4 +- addons/web_editor/static/src/js/editor/rte.js | 18 +- .../static/src/js/editor/rte.summernote.js | 26 +- .../static/src/js/editor/summernote.js | 21 +- .../static/src/js/editor/transcoder.js | 114 ++- addons/web_editor/static/src/js/tours/rte.js | 2 +- .../static/src/js/widgets/widgets.js | 20 +- .../static/src/less/web_editor.backend.less | 8 +- addons/web_editor/static/src/xml/editor.xml | 7 +- .../static/tests/web_editor_tests.js | 4 +- .../static/src/js/web_planner_backend.js | 1 + .../static/src/js/web_planner_common.js | 34 - addons/web_settings_dashboard/__manifest__.py | 4 +- .../static/src/js/dashboard.js | 12 +- .../static/src/xml/dashboard.xml | 16 +- addons/website/controllers/main.py | 14 +- addons/website/data/website_demo.xml | 113 ++ addons/website/models/ir_http.py | 12 +- addons/website/models/ir_model.py | 4 +- addons/website/models/ir_qweb.py | 110 +- addons/website/models/website.py | 25 +- addons/website/static/src/img/flectra.jpg | Bin 196808 -> 93072 bytes .../static/src/js/backend/dashboard.js | 1 + .../website/static/src/js/menu/new_content.js | 10 + .../src/less/website.ui.components.less | 4 +- addons/website/tests/__init__.py | 1 + addons/website/tests/template_qweb_test.xml | 36 + addons/website/tests/test_qweb.py | 65 ++ .../views/res_config_settings_views.xml | 1 + addons/website/views/website_templates.xml | 2 +- addons/website_blog/models/website_blog.py | 5 +- .../static/src/js/website_blog.editor.js | 6 +- .../views/website_blog_templates.xml | 1 + .../controllers/website_form.py | 2 - addons/website_event_sale/controllers/main.py | 2 +- .../static/src/js/website.tour.event_sale.js | 1 + addons/website_event_sale/tests/test_ui.py | 2 +- .../views/event_track_templates.xml | 4 +- addons/website_form/controllers/main.py | 1 + .../static/src/js/website_form.js | 6 +- addons/website_livechat/controllers/main.py | 10 +- .../src/js/website_mail_channel.snippet.js | 4 + .../website_mass_mailing/controllers/main.py | 2 +- addons/website_quote/__init__.py | 9 + addons/website_quote/__manifest__.py | 4 + addons/website_quote/controllers/main.py | 9 +- .../views/website_quote_templates.xml | 2 +- addons/website_sale/controllers/main.py | 17 +- addons/website_sale/data/demo.xml | 2 +- addons/website_sale/models/product.py | 2 +- .../models/res_config_settings.py | 11 +- addons/website_sale/models/res_partner.py | 2 +- addons/website_sale/models/website.py | 7 +- .../static/src/js/website_sale_tour_buy.js | 3 +- .../tests/test_website_sale_pricelist.py | 30 +- addons/website_sale/views/product_views.xml | 2 +- addons/website_sale/views/templates.xml | 14 +- flectra/addons/base/ir/ir_actions.py | 1 + flectra/addons/base/ir/ir_actions_report.py | 32 +- flectra/addons/base/ir/ir_mail_server.py | 6 +- flectra/addons/base/ir/ir_model.py | 9 +- flectra/addons/base/ir/ir_model_view.xml | 2 +- .../addons/base/ir/ir_qweb/assetsbundle.py | 106 +- flectra/addons/base/ir/ir_qweb/fields.py | 16 +- flectra/addons/base/ir/ir_qweb/ir_qweb.py | 187 +++- flectra/addons/base/ir/ir_qweb/qweb.py | 154 +-- flectra/addons/base/ir/ir_ui_view.py | 2 +- flectra/addons/base/module/module.py | 2 +- flectra/addons/base/res/ir_property.py | 2 +- flectra/addons/base/res/res.country.state.csv | 3 +- flectra/addons/base/res/res_config.py | 14 +- .../base/res/res_config_settings_views.xml | 2 +- flectra/addons/base/res/res_country_data.xml | 9 +- flectra/addons/base/res/res_currency.py | 14 +- flectra/addons/base/res/res_currency_data.xml | 9 + flectra/addons/base/res/res_currency_demo.xml | 6 + flectra/addons/base/res/res_partner.py | 6 +- flectra/addons/base/res/res_partner_view.xml | 48 +- flectra/addons/base/res/res_users.py | 12 +- flectra/addons/base/res/res_users_view.xml | 2 +- flectra/addons/base/rng/common.rng | 8 + flectra/addons/base/rng/tree_view.rng | 2 + .../addons/base/security/base_security.xml | 35 + flectra/addons/base/tests/test_float.py | 9 + flectra/addons/base/tests/test_mail.py | 4 +- .../addons/base/tests/test_mail_examples.py | 4 +- flectra/addons/base/tests/test_orm.py | 19 + flectra/addons/base/tests/test_qweb.py | 21 + .../tests/test_assetsbundle.py | 50 +- .../addons/test_assetsbundle/views/views.xml | 29 + .../addons/test_impex/tests/test_export.py | 37 +- .../test_new_api/tests/test_new_fields.py | 13 + .../tests/test_performance.py | 21 +- .../addons/test_pylint/tests/test_pylint.py | 8 +- flectra/api.py | 8 + flectra/fields.py | 6 +- flectra/http.py | 31 +- flectra/models.py | 156 ++- flectra/modules/loading.py | 52 +- flectra/modules/registry.py | 6 +- flectra/netsvc.py | 7 + flectra/release.py | 2 +- flectra/service/db.py | 1 + flectra/service/security.py | 20 +- flectra/service/server.py | 22 +- flectra/service/wsgi_server.py | 2 +- flectra/tests/common.py | 2 +- flectra/tools/config.py | 3 +- flectra/tools/convert.py | 7 +- flectra/tools/mail.py | 18 +- flectra/tools/misc.py | 12 +- 194 files changed, 4249 insertions(+), 1091 deletions(-) create mode 100644 addons/http_routing/controllers/__init__.py create mode 100644 addons/http_routing/controllers/main.py create mode 100644 addons/http_routing/geoipresolver.py create mode 100644 addons/web/static/lib/qweb/qweb-test-widgets.xml create mode 100644 addons/website/tests/template_qweb_test.xml create mode 100644 addons/website/tests/test_qweb.py diff --git a/addons/base_vat_autocomplete/models/res_partner.py b/addons/base_vat_autocomplete/models/res_partner.py index 40bc80c1..a535514b 100644 --- a/addons/base_vat_autocomplete/models/res_partner.py +++ b/addons/base_vat_autocomplete/models/res_partner.py @@ -12,6 +12,9 @@ _logger = logging.getLogger(__name__) try: import stdnum.eu.vat as stdnum_vat + if not hasattr(stdnum_vat, "country_codes"): + # stdnum version >= 1.9 + stdnum_vat.country_codes = stdnum_vat._country_codes except ImportError: _logger.warning('Python `stdnum` library not found, unable to call VIES service to detect address based on VAT number.') stdnum_vat = None @@ -29,6 +32,11 @@ class ResPartner(models.Model): cp = lines.pop() city = lines.pop() return (cp, city) + elif country == 'SE': + result = re.match('([0-9]{3}\s?[0-9]{2})\s?([A-Z]+)', lines[-1]) + if result: + lines.pop() + return (result.group(1), result.group(2)) else: result = re.match('((?:L-|AT-)?[0-9\-]+[A-Z]{,2}) (.+)', lines[-1]) if result: diff --git a/addons/base_vat_autocomplete/views/res_company_view.xml b/addons/base_vat_autocomplete/views/res_company_view.xml index f4b66169..2e5ab411 100644 --- a/addons/base_vat_autocomplete/views/res_company_view.xml +++ b/addons/base_vat_autocomplete/views/res_company_view.xml @@ -11,7 +11,7 @@ - + diff --git a/addons/board/static/description/index.html b/addons/board/static/description/index.html index 0284e5b4..5647a4ef 100644 --- a/addons/board/static/description/index.html +++ b/addons/board/static/description/index.html @@ -18,7 +18,7 @@

Gather all your Flectra reports in one app

-After creating reports in each Odoo app, you can choose to make them as Favorite and adding those on your 'Dashboard'. Odoo Dashboard is the reporting module that gathers all your favorite graphs and tabs in one place. You company has no secret for you anymore, all your important figures are in front of you. +After creating reports in each Flectra app, you can choose to make them as Favorite and adding those on your 'Dashboard'. Flectra Dashboard is the reporting module that gathers all your favorite graphs and tabs in one place. You company has no secret for you anymore, all your important figures are in front of you.

@@ -40,7 +40,7 @@ After creating reports in each Odoo app, you can choose to make them as Favorite

-In each Odoo App, you can create detailed reports and graphs in any format you like without the need of an external program. Get statistics on any numbers in your company, from fuel costs in projects all the way to revenues in sales channels, and with inventory, and everything in between. +In each Flectra App, you can create detailed reports and graphs in any format you like without the need of an external program. Get statistics on any numbers in your company, from fuel costs in projects all the way to revenues in sales channels, and with inventory, and everything in between.

@@ -52,7 +52,7 @@ In each Odoo App, you can create detailed reports and graphs in any format you l

Filter all results to fit your field of research

-In each Odoo app, you'll need to create a report. In the reports you can filter and group each analysis using built-in filters, and create custom filters to gather only the information you are looking for. Save the filters you created in your favorites to access them anytime in just a click either from the concerned app, or in comparison with you other reports in the Odoo Dashboard app. +In each Flectra app, you'll need to create a report. In the reports you can filter and group each analysis using built-in filters, and create custom filters to gather only the information you are looking for. Save the filters you created in your favorites to access them anytime in just a click either from the concerned app, or in comparison with you other reports in the Flectra Dashboard app.

diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js index 56174375..855dc03d 100644 --- a/addons/board/static/src/js/dashboard.js +++ b/addons/board/static/src/js/dashboard.js @@ -20,7 +20,7 @@ FormView.include({ */ init: function (viewInfo) { this._super.apply(this, arguments); - this.controllerParams.viewID = viewInfo.view_id; + this.controllerParams.customViewID = viewInfo.custom_view_id; }, }); @@ -33,7 +33,7 @@ FormController.include({ }), init: function (parent, model, renderer, params) { this._super.apply(this, arguments); - this.viewID = params.viewID; + this.customViewID = params.customViewID; }, //-------------------------------------------------------------------------- @@ -63,9 +63,9 @@ FormController.include({ var board = this.renderer.getBoard(); var arch = QWeb.render('DashBoard.xml', _.extend({}, board)); return this._rpc({ - route: '/web/view/add_custom', + route: '/web/view/edit_custom', params: { - view_id: this.viewID, + custom_id: this.customViewID, arch: arch, } }).then(dataManager.invalidate.bind(dataManager)); @@ -139,6 +139,31 @@ FormRenderer.include({ this._super.apply(this, arguments); this.noContentHelp = params.noContentHelp; this.actionsDescr = {}; + this._boardSubcontrollers = []; // for board: controllers of subviews + }, + /** + * Call `on_attach_callback` for each subview + * + * @override + */ + on_attach_callback: function () { + _.each(this._boardSubcontrollers, function (controller) { + if ('on_attach_callback' in controller) { + controller.on_attach_callback(); + } + }); + }, + /** + * Call `on_detach_callback` for each subview + * + * @override + */ + on_detach_callback: function () { + _.each(this._boardSubcontrollers, function (controller) { + if ('on_detach_callback' in controller) { + controller.on_detach_callback(); + } + }); }, //-------------------------------------------------------------------------- @@ -241,6 +266,7 @@ FormRenderer.include({ hasSelectors: false, }); return view.getController(self).then(function (controller) { + self._boardSubcontrollers.push(controller); return controller.appendTo(params.$node); }); }); diff --git a/addons/board/static/src/js/favorite_menu.js b/addons/board/static/src/js/favorite_menu.js index 6e88c6fc..b7a035e6 100644 --- a/addons/board/static/src/js/favorite_menu.js +++ b/addons/board/static/src/js/favorite_menu.js @@ -94,7 +94,10 @@ FavoriteMenu.include({ }) .then(function (r) { if (r) { - self.do_notify(_.str.sprintf(_t("'%s' added to dashboard"), name), ''); + self.do_notify( + _.str.sprintf(_t("'%s' added to dashboard"), name), + _t('Please refresh your browser for the changes to take effect.') + ); } else { self.do_warn(_t("Could not add filter to dashboard")); } diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js index b6c994fd..5b9e05cc 100644 --- a/addons/board/static/tests/dashboard_tests.js +++ b/addons/board/static/tests/dashboard_tests.js @@ -3,6 +3,7 @@ flectra.define('board.dashboard_tests', function (require) { var testUtils = require('web.test_utils'); var FormView = require('web.FormView'); +var ListRenderer = require('web.ListRenderer'); var createView = testUtils.createView; @@ -123,8 +124,8 @@ QUnit.test('basic functionality, with one sub action', function (assert) { if (route === '/web/dataset/search_read') { assert.deepEqual(args.domain, [['foo', '!=', 'False']], "the domain should be passed"); } - if (route === '/web/view/add_custom') { - assert.step('add custom'); + if (route === '/web/view/edit_custom') { + assert.step('edit custom'); return $.when(true); } return this._super.apply(this, arguments); @@ -155,7 +156,7 @@ QUnit.test('basic functionality, with one sub action', function (assert) { form.$('.oe_fold').click(); assert.ok(form.$('.oe_content').is(':visible'), "content is visible again"); - assert.verifySteps(['load action', 'add custom', 'add custom']); + assert.verifySteps(['load action', 'edit custom', 'edit custom']); assert.strictEqual($('.modal').length, 0, "should have no modal open"); @@ -183,7 +184,7 @@ QUnit.test('basic functionality, with one sub action', function (assert) { assert.strictEqual($('.modal').length, 0, "should have no modal open"); assert.strictEqual(form.$('.oe_action').length, 0, "should have no displayed action"); - assert.verifySteps(['load action', 'add custom', 'add custom', 'add custom', 'add custom']); + assert.verifySteps(['load action', 'edit custom', 'edit custom', 'edit custom', 'edit custom']); form.destroy(); }); @@ -292,8 +293,8 @@ QUnit.test('can drag and drop a view', function (assert) { views: [[4, 'list']], }); } - if (route === '/web/view/add_custom') { - assert.step('add custom'); + if (route === '/web/view/edit_custom') { + assert.step('edit custom'); return $.when(true); } return this._super.apply(this, arguments); @@ -339,8 +340,8 @@ QUnit.test('twice the same action in a dashboard', function (assert) { views: [[4, 'list'],[5, 'kanban']], }); } - if (route === '/web/view/add_custom') { - assert.step('add custom'); + if (route === '/web/view/edit_custom') { + assert.step('edit custom'); return $.when(true); } return this._super.apply(this, arguments); @@ -454,5 +455,48 @@ QUnit.test('clicking on a kanban\'s button should trigger the action', function form.destroy(); }); +QUnit.test('subviews are aware of attach in or detach from the DOM', function (assert) { + assert.expect(2); + + // patch list renderer `on_attach_callback` for the test only + testUtils.patch(ListRenderer, { + on_attach_callback: function () { + assert.step('subview on_attach_callback'); + } + }); + + var form = createView({ + View: FormView, + model: 'board', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '
', + mockRPC: function (route) { + if (route === '/web/action/load') { + return $.when({ + res_model: 'partner', + views: [[4, 'list']], + }); + } + return this._super.apply(this, arguments); + }, + archs: { + 'partner,4,list': + '', + }, + }); + + assert.verifySteps(['subview on_attach_callback']); + + // restore on_attach_callback of ListRenderer + testUtils.unpatch(ListRenderer); + + form.destroy(); +}); }); diff --git a/addons/http_routing/__init__.py b/addons/http_routing/__init__.py index 013872cc..b8554620 100644 --- a/addons/http_routing/__init__.py +++ b/addons/http_routing/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. +from . import controllers from . import models diff --git a/addons/http_routing/controllers/__init__.py b/addons/http_routing/controllers/__init__.py new file mode 100644 index 00000000..d011bb1c --- /dev/null +++ b/addons/http_routing/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons/http_routing/controllers/main.py b/addons/http_routing/controllers/main.py new file mode 100644 index 00000000..fa2de823 --- /dev/null +++ b/addons/http_routing/controllers/main.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. + +import flectra + +from flectra import http +from flectra.http import request +from flectra.osv import expression +from flectra.addons.web.controllers.main import WebClient, Home + +class Routing(Home): + + @http.route('/website/translations', type='json', auth="public", website=True) + def get_website_translations(self, lang, mods=None): + Modules = request.env['ir.module.module'].sudo() + IrHttp = request.env['ir.http'].sudo() + domain = IrHttp._get_translation_frontend_modules_domain() + modules = Modules.search( + expression.AND([domain, [('state', '=', 'installed')]]) + ).mapped('name') + if mods: + modules += mods + return WebClient().translations(mods=modules, lang=lang) diff --git a/addons/http_routing/geoipresolver.py b/addons/http_routing/geoipresolver.py new file mode 100644 index 00000000..24bbe723 --- /dev/null +++ b/addons/http_routing/geoipresolver.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import os.path + +try: + import GeoIP # Legacy +except ImportError: + GeoIP = None + +try: + import geoip2 + import geoip2.database +except ImportError: + geoip2 = None + +class GeoIPResolver(object): + def __init__(self, fname): + self.fname = fname + try: + self._db = geoip2.database.Reader(fname) + self.version = 2 + except Exception: + try: + self._db = GeoIP.open(fname, GeoIP.GEOIP_STANDARD) + self.version = 1 + assert self._db.database_info is not None + except Exception: + raise ValueError('Invalid GeoIP database: %r' % fname) + + def __del__(self): + if self.version == 2: + self._db.close() + + @classmethod + def open(cls, fname): + if not GeoIP and not geoip2: + return None + if not os.path.exists(fname): + return None + return GeoIPResolver(fname) + + def resolve(self, ip): + if self.version == 1: + return self._db.record_by_addr(ip) or {} + elif self.version == 2: + try: + r = self._db.city(ip) + except (ValueError, geoip2.errors.AddressNotFoundError): + return {} + # Compatibility with Legacy database. + # Some ips cannot be located to a specific country. Legacy DB used to locate them in + # continent instead of country. Do the same to not change behavior of existing code. + country, attr = (r.country, 'iso_code') if r.country.geoname_id else (r.continent, 'code') + return { + 'city': r.city.name, + 'country_code': getattr(country, attr), + 'country_name': country.name, + 'region': r.subdivisions[0].iso_code if r.subdivisions else None, + 'time_zone': r.location.time_zone, + } + + # compat + def record_by_addr(self, addr): + return self.resolve(addr) diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index 1b058b8d..ebd80949 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -18,6 +18,8 @@ from flectra.addons.base.ir.ir_http import RequestUID, ModelConverter from flectra.http import request from flectra.tools import config, ustr, pycompat +from ..geoipresolver import GeoIPResolver + _logger = logging.getLogger(__name__) # global resolver (GeoIP API is thread-safe, for multithreaded workers) @@ -229,6 +231,13 @@ class IrHttp(models.AbstractModel): return request.env['res.lang'].search([('code', '=', lang_code)], limit=1) return request.env['res.lang'].search([], limit=1) + @classmethod + def _get_translation_frontend_modules_domain(cls): + """ Return a domain to list the domain adding web-translations and + dynamic resources that may be used frontend views + """ + return [] + bots = "bot|crawl|slurp|spider|curl|wget|facebookexternalhit".split("|") @classmethod @@ -258,25 +267,18 @@ class IrHttp(models.AbstractModel): # Lazy init of GeoIP resolver if flectra._geoip_resolver is not None: return + geofile = config.get('geoip_database') try: - import GeoIP - # updated database can be downloaded on MaxMind website - # http://dev.maxmind.com/geoip/legacy/install/city/ - geofile = config.get('geoip_database') - if os.path.exists(geofile): - flectra._geoip_resolver = GeoIP.open(geofile, GeoIP.GEOIP_STANDARD) - else: - flectra._geoip_resolver = False - _logger.warning('GeoIP database file %r does not exists, apt-get install geoip-database-contrib or download it from http://dev.maxmind.com/geoip/legacy/install/city/', geofile) - except ImportError: - flectra._geoip_resolver = False + flectra._geoip_resolver = GeoIPResolver.open(geofile) or False + except Exception as e: + _logger.warning('Cannot load GeoIP: %s', ustr(e)) @classmethod def _geoip_resolve(cls): if 'geoip' not in request.session: record = {} if flectra._geoip_resolver and request.httprequest.remote_addr: - record = flectra._geoip_resolver.record_by_addr(request.httprequest.remote_addr) or {} + record = flectra._geoip_resolver.resolve(request.httprequest.remote_addr) or {} request.session['geoip'] = record @classmethod diff --git a/addons/l10n_fr_pos_cert/data/pos_inalterability.xml b/addons/l10n_fr_pos_cert/data/pos_inalterability.xml index 98c78157..e71876ee 100644 --- a/addons/l10n_fr_pos_cert/data/pos_inalterability.xml +++ b/addons/l10n_fr_pos_cert/data/pos_inalterability.xml @@ -8,6 +8,7 @@ Pos Orders Inalterability Check ir.actions.server + code action = env['pos.order']._check_hash_integrity(env.user.company_id.id) diff --git a/addons/l10n_fr_pos_cert/models/account_bank_statement.py b/addons/l10n_fr_pos_cert/models/account_bank_statement.py index bc756bef..94ba807a 100644 --- a/addons/l10n_fr_pos_cert/models/account_bank_statement.py +++ b/addons/l10n_fr_pos_cert/models/account_bank_statement.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. -from flectra import models +from flectra import models, api from flectra.tools.translate import _ from flectra.exceptions import UserError @@ -8,6 +8,7 @@ from flectra.exceptions import UserError class AccountBankStatement(models.Model): _inherit = 'account.bank.statement' + @api.multi def unlink(self): for statement in self.filtered(lambda s: s.company_id._is_accounting_unalterable() and s.journal_id.journal_user): raise UserError(_('You cannot modify anything on a bank statement (name: %s) that was created by point of sale operations.') % (statement.name,)) @@ -17,6 +18,7 @@ class AccountBankStatement(models.Model): class AccountBankStatementLine(models.Model): _inherit = 'account.bank.statement.line' + @api.multi def unlink(self): for line in self.filtered(lambda s: s.company_id._is_accounting_unalterable() and s.journal_id.journal_user): raise UserError(_('You cannot modify anything on a bank statement line (name: %s) that was created by point of sale operations.') % (line.name,)) diff --git a/addons/l10n_generic_coa/__init__.py b/addons/l10n_generic_coa/__init__.py index 7eb13095..d6715ec4 100644 --- a/addons/l10n_generic_coa/__init__.py +++ b/addons/l10n_generic_coa/__init__.py @@ -1,2 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. + + +def uninstall_hook(cr, registry): + cr.execute( + "DELETE FROM ir_model_data WHERE module = 'l10n_generic_coa'" + ) diff --git a/addons/l10n_generic_coa/__manifest__.py b/addons/l10n_generic_coa/__manifest__.py index 408bd555..19a3f3a1 100644 --- a/addons/l10n_generic_coa/__manifest__.py +++ b/addons/l10n_generic_coa/__manifest__.py @@ -29,4 +29,5 @@ Install some generic chart of accounts. '../account/demo/account_invoice_demo.yml', ], 'website': 'https://flectrahq.com/page/accounting', + 'uninstall_hook': 'uninstall_hook', } diff --git a/addons/l10n_in/views/report_invoice.xml b/addons/l10n_in/views/report_invoice.xml index d41dccbc..028748cc 100644 --- a/addons/l10n_in/views/report_invoice.xml +++ b/addons/l10n_in/views/report_invoice.xml @@ -98,7 +98,7 @@ - + diff --git a/addons/note/static/description/index.html b/addons/note/static/description/index.html index 2e02de80..83dd28df 100644 --- a/addons/note/static/description/index.html +++ b/addons/note/static/description/index.html @@ -48,7 +48,7 @@

- Odoo Notes helps you stay organized and focused on your work with a structured and accessible system. Break down your tasks and projects into actionable work items and achieve your goals more efficiently + Flectra Notes helps you stay organized and focused on your work with a structured and accessible system. Break down your tasks and projects into actionable work items and achieve your goals more efficiently

@@ -78,7 +78,7 @@

Flectra Notes adapts to your needs and habits

- Odoo Notes' smart kanban view allows every user to customize their own steps in order to process their to-do lists and notes. Choose the default template or create your own steps/stages of the process. + Flectra Notes' smart kanban view allows every user to customize their own steps in order to process their to-do lists and notes. Choose the default template or create your own steps/stages of the process.

diff --git a/addons/note/views/note_views.xml b/addons/note/views/note_views.xml index 6503f20b..c18d94e8 100644 --- a/addons/note/views/note_views.xml +++ b/addons/note/views/note_views.xml @@ -114,7 +114,7 @@
-
+
diff --git a/addons/pad/models/pad.py b/addons/pad/models/pad.py index 07758fe8..9d264850 100644 --- a/addons/pad/models/pad.py +++ b/addons/pad/models/pad.py @@ -10,7 +10,6 @@ import requests from flectra import api, models, _ from flectra.exceptions import UserError -from flectra.tools import html2plaintext from ..py_etherpad import EtherpadLiteClient @@ -76,7 +75,7 @@ class PadCommon(models.AbstractModel): @api.model def pad_get_content(self, url): company = self.env.user.sudo().company_id - myPad = EtherpadLiteClient(company.pad_key, company.pad_server + '/api') + myPad = EtherpadLiteClient(company.pad_key, (company.pad_server or '') + '/api') content = '' if url: split_url = url.split('/p/') @@ -133,7 +132,7 @@ class PadCommon(models.AbstractModel): for k, field in self._fields.items(): if hasattr(field, 'pad_content_field') and vals.get(field.pad_content_field) and self[k]: company = self.env.user.sudo().company_id - myPad = EtherpadLiteClient(company.pad_key, company.pad_server + '/api') + myPad = EtherpadLiteClient(company.pad_key, (company.pad_server or '') + '/api') path = self[k].split('/p/')[1] myPad.setHtmlFallbackText(path, vals[field.pad_content_field]) diff --git a/addons/pad/static/plugin/ep_disable_init_focus/package.json b/addons/pad/static/plugin/ep_disable_init_focus/package.json index c54612a9..e6f307d1 100644 --- a/addons/pad/static/plugin/ep_disable_init_focus/package.json +++ b/addons/pad/static/plugin/ep_disable_init_focus/package.json @@ -9,7 +9,7 @@ "node":"*" }, "author":{ - "name":"Flectra S.A. - Hitesh Trivedi", + "name":"Odoo S.A. - Hitesh Trivedi", "email":"thiteshm155@gmail.com" } } diff --git a/addons/web/Gruntfile.js b/addons/web/Gruntfile.js index a4dc4034..43b58c3b 100644 --- a/addons/web/Gruntfile.js +++ b/addons/web/Gruntfile.js @@ -17,4 +17,4 @@ module.exports = function(grunt) { grunt.registerTask('default', ['jshint']); -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 4c547f44..720e2692 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -28,6 +28,7 @@ import werkzeug.wsgi from collections import OrderedDict from werkzeug.urls import url_decode, iri_to_uri from xml.etree import ElementTree +import unicodedata import flectra @@ -1007,14 +1008,17 @@ class DataSet(http.Controller): class View(http.Controller): - @http.route('/web/view/add_custom', type='json', auth="user") - def add_custom(self, view_id, arch): - CustomView = request.env['ir.ui.view.custom'] - CustomView.create({ - 'user_id': request.session.uid, - 'ref_id': view_id, - 'arch': arch - }) + @http.route('/web/view/edit_custom', type='json', auth="user") + def edit_custom(self, custom_id, arch): + """ + Edit a custom view + + :param int custom_id: the id of the edited custom view + :param str arch: the edited arch of the custom view + :returns: dict with acknowledged operation (result set to True) + """ + custom_view = request.env['ir.ui.view.custom'].browse(custom_id) + custom_view.write({ 'arch': arch }) return {'result': True} class Binary(http.Controller): @@ -1039,7 +1043,7 @@ class Binary(http.Controller): '/web/content////'], type='http', auth="public") def content_common(self, xmlid=None, model='ir.attachment', id=None, field='datas', filename=None, filename_field='datas_fname', unique=None, mimetype=None, - download=None, data=None, token=None, access_token=None): + download=None, data=None, token=None, access_token=None, **kw): status, headers, content = binary_content( xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, filename_field=filename_field, download=download, mimetype=mimetype, @@ -1089,8 +1093,12 @@ class Binary(http.Controller): elif status != 200 and download: return request.not_found() - height = int(height or 0) - width = int(width or 0) + if headers and dict(headers).get('Content-Type', '') == 'image/svg+xml': # we shan't resize svg images + height = 0 + width = 0 + else: + height = int(height or 0) + width = int(width or 0) if crop and (width or height): content = crop_image(content, type='center', size=(width, height), ratio=(1, 1)) @@ -1153,20 +1161,27 @@ class Binary(http.Controller): """ args = [] for ufile in files: + + filename = ufile.filename + if request.httprequest.user_agent.browser == 'safari': + # Safari sends NFD UTF-8 (where é is composed by 'e' and [accent]) + # we need to send it the same stuff, otherwise it'll fail + filename = unicodedata.normalize('NFD', ufile.filename) + try: attachment = Model.create({ - 'name': ufile.filename, + 'name': filename, 'datas': base64.encodestring(ufile.read()), - 'datas_fname': ufile.filename, + 'datas_fname': filename, 'res_model': model, 'res_id': int(id) }) except Exception: - args = args.append({'error': _("Something horrible happened")}) + args.append({'error': _("Something horrible happened")}) _logger.exception("Fail to upload attachment %s" % ufile.filename) else: args.append({ - 'filename': ufile.filename, + 'filename': filename, 'mimetype': ufile.content_type, 'id': attachment.id }) @@ -1428,7 +1443,7 @@ class ExportFormat(object): model, fields, ids, domain, import_compat = \ operator.itemgetter('model', 'fields', 'ids', 'domain', 'import_compat')(params) - Model = request.env[model].with_context(**params.get('context', {})) + Model = request.env[model].with_context(import_compat=import_compat, **params.get('context', {})) records = Model.browse(ids) or Model.search(domain, offset=0, limit=False, order=False) if not Model._is_an_ordinary_table(): diff --git a/addons/web/models/ir_qweb.py b/addons/web/models/ir_qweb.py index a7a5a11f..a3c89258 100644 --- a/addons/web/models/ir_qweb.py +++ b/addons/web/models/ir_qweb.py @@ -2,6 +2,7 @@ # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. import hashlib +from collections import OrderedDict from flectra import api, models from flectra.tools import pycompat @@ -56,6 +57,24 @@ class Image(models.AbstractModel): elif options.get('zoom'): src_zoom = options['zoom'] - img = '' % \ - (classes, src, options.get('style', ''), ' alt="%s"' % alt if alt else '', ' data-zoom="1" data-zoom-image="%s"' % src_zoom if src_zoom else '') - return pycompat.to_text(img) + atts = OrderedDict() + atts["src"] = src + atts["class"] = classes + atts["style"] = options.get('style') + atts["alt"] = alt + atts["data-zoom"] = src_zoom and u'1' or None + atts["data-zoom-image"] = src_zoom + + atts = self.env['ir.qweb']._post_processing_att('img', atts, options.get('template_options')) + + img = ['') + + return u''.join(img) diff --git a/addons/web/static/lib/bootstrap/less/scaffolding.less b/addons/web/static/lib/bootstrap/less/scaffolding.less index d8f90cd6..2360561e 100644 --- a/addons/web/static/lib/bootstrap/less/scaffolding.less +++ b/addons/web/static/lib/bootstrap/less/scaffolding.less @@ -170,4 +170,4 @@ hr { [role="button"] { cursor: pointer; -} \ No newline at end of file +} \ No newline at end of file diff --git a/addons/web/static/lib/qweb/qweb-test-widgets.xml b/addons/web/static/lib/qweb/qweb-test-widgets.xml new file mode 100644 index 00000000..503880bc --- /dev/null +++ b/addons/web/static/lib/qweb/qweb-test-widgets.xml @@ -0,0 +1,26 @@ + + + {"value": "1988-09-16"} + 1988-09-16 + + + {"value": "1988-09-16 14:00:00"} + 1988-09-16 14:00:00 + + + {"value": "1988-09-16 14:00:00"} + 09/16/1988 16:00:00 + + + {"value": "1988-09-16 14:00:00"} + 09/16/1988 + + + {"value": "1988-09-16 01:00:00"} + 09/16/1988 + + + {"value": "1988-09-16 23:00:00"} + 09/17/1988 + + diff --git a/addons/web/static/src/js/chrome/abstract_web_client.js b/addons/web/static/src/js/chrome/abstract_web_client.js index 3cbfea51..82643172 100644 --- a/addons/web/static/src/js/chrome/abstract_web_client.js +++ b/addons/web/static/src/js/chrome/abstract_web_client.js @@ -165,7 +165,7 @@ var AbstractWebClient = Widget.extend(mixins.ServiceProvider, { core.bus.on('connection_restored', this, this.on_connection_restored); // crash manager integration - session.on('error', crash_manager, crash_manager.rpc_error); + core.bus.on('rpc_error', crash_manager, crash_manager.rpc_error); window.onerror = function (message, file, line, col, error) { // Scripts injected in DOM (eg: google API's js files) won't return a clean error on window.onerror. // The browser will just give you a 'Script error.' as message and nothing else for security issue. diff --git a/addons/web/static/src/js/chrome/loading.js b/addons/web/static/src/js/chrome/loading.js index 3351651d..5418168b 100644 --- a/addons/web/static/src/js/chrome/loading.js +++ b/addons/web/static/src/js/chrome/loading.js @@ -26,9 +26,9 @@ var Loading = Widget.extend({ this._super(parent); this.count = 0; this.blocked_ui = false; - session.on("request", this, this.request_call); - session.on("response", this, this.response_call); - session.on("response_failed", this, this.response_call); + core.bus.on('rpc_request', this, this.request_call); + core.bus.on("rpc_response", this, this.response_call); + core.bus.on("rpc_response_failed", this, this.response_call); }, destroy: function() { this.on_rpc_event(-this.count); diff --git a/addons/web/static/src/js/chrome/menu.js b/addons/web/static/src/js/chrome/menu.js index 2e1f34b7..6f31f54d 100644 --- a/addons/web/static/src/js/chrome/menu.js +++ b/addons/web/static/src/js/chrome/menu.js @@ -267,11 +267,14 @@ var Menu = Widget.extend({ * @param {Number} id the action_id to match * @param {Number} [menuID] a menu ID that may match with provided action */ - open_action: function (id) { + open_action: function (id, menuID) { var $menu = this.$el.add(this.$secondary_menus).find('a[data-action-id="' + id + '"]'); - var menu_id = $menu.data('menu'); - if (menu_id) { - this.open_menu(menu_id); + if (!(menuID && $menu.filter("[data-menu='" + menuID + "']").length)) { + // menuID doesn't match action, so pick first menu_item + menuID = $menu.data('menu'); + } + if (menuID) { + this.open_menu(menuID); } }, /** diff --git a/addons/web/static/src/js/chrome/view_manager.js b/addons/web/static/src/js/chrome/view_manager.js index 7f0cb2a8..e35226a7 100644 --- a/addons/web/static/src/js/chrome/view_manager.js +++ b/addons/web/static/src/js/chrome/view_manager.js @@ -263,7 +263,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, { self.active_view = view; - if (!view.loaded) { + if (!view.loaded || view.loaded.state() === 'rejected') { view_options = _.extend({}, view.options, view_options, self.env); view.loaded = $.Deferred(); self.create_view(view, view_options).then(function(controller) { @@ -638,7 +638,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, { * active controller. * * @private - * @param {OdooEvent} ev + * @param {FlectraEvent} ev * @param {function} ev.data.callback used to send the requested context */ _onGetControllerContext: function (ev) { diff --git a/addons/web/static/src/js/chrome/web_client.js b/addons/web/static/src/js/chrome/web_client.js index c4b5931e..22514ed7 100644 --- a/addons/web/static/src/js/chrome/web_client.js +++ b/addons/web/static/src/js/chrome/web_client.js @@ -103,6 +103,10 @@ return AbstractWebClient.extend({ bind_hashchange: function() { var self = this; $(window).bind('hashchange', this.on_hashchange); + var didHashChanged = false; + $(window).one('hashchange', function () { + didHashChanged = true; + }); var state = $.bbq.getState(true); if (_.isEmpty(state) || state.action === "login") { @@ -113,6 +117,9 @@ return AbstractWebClient.extend({ args: [[session.uid], ['action_id']], }) .done(function(result) { + if (didHashChanged) { + return; + } var data = result[0]; if(data.action_id) { self.action_manager.do_action(data.action_id[0]); diff --git a/addons/web/static/src/js/core/ajax.js b/addons/web/static/src/js/core/ajax.js index 9facc3a5..4442320c 100644 --- a/addons/web/static/src/js/core/ajax.js +++ b/addons/web/static/src/js/core/ajax.js @@ -5,7 +5,12 @@ var core = require('web.core'); var utils = require('web.utils'); var time = require('web.time'); -function genericJsonRpc (fct_name, params, fct) { +function genericJsonRpc (fct_name, params, settings, fct) { + var shadow = settings.shadow || false; + delete settings.shadow; + if (! shadow) + core.bus.trigger('rpc_request'); + var data = { jsonrpc: "2.0", method: fct_name, @@ -30,11 +35,49 @@ function genericJsonRpc (fct_name, params, fct) { }); // FIXME: jsonp? result.abort = function () { if (xhr.abort) xhr.abort(); }; - return result; + + var p = result.then(function (result) { + if (!shadow) { + core.bus.trigger('rpc_response'); + } + return result; + }, function (type, error, textStatus, errorThrown) { + if (type === "server") { + if (!shadow) { + core.bus.trigger('rpc_response'); + } + if (error.code === 100) { + core.bus.trigger('invalidate_session'); + } + return $.Deferred().reject(error, $.Event()); + } else { + if (!shadow) { + core.bus.trigger('rpc_response_failed'); + } + var nerror = { + code: -32098, + message: "XmlHttpRequestError " + errorThrown, + data: { + type: "xhr"+textStatus, + debug: error.responseText, + objects: [error, errorThrown] + }, + }; + return $.Deferred().reject(nerror, $.Event()); + } + }); + return p.fail(function () { // Allow deferred user to disable rpc_error call in fail + p.fail(function (error, event) { + if (!event.isDefaultPrevented()) { + core.bus.trigger('rpc_error', error, event); + } + }); + }); } function jsonRpc(url, fct_name, params, settings) { - return genericJsonRpc(fct_name, params, function(data) { + settings = settings || {}; + return genericJsonRpc(fct_name, params, settings, function(data) { return $.ajax(url, _.extend({}, settings, { url: url, dataType: 'json', @@ -47,7 +90,7 @@ function jsonRpc(url, fct_name, params, settings) { function jsonpRpc(url, fct_name, params, settings) { settings = settings || {}; - return genericJsonRpc(fct_name, params, function(data) { + return genericJsonRpc(fct_name, params, settings, function(data) { var payload_str = JSON.stringify(data, time.date_to_utc); var payload_url = $.param({r:payload_str}); var force2step = settings.force2step || false; @@ -260,8 +303,20 @@ function get_file(options) { if (options.error) { var body = this.contentDocument.body; var nodes = body.children.length === 0 ? body.childNodes : body.children; - var node = nodes[1] || nodes[0]; - options.error(JSON.parse(node.textContent)); + var errorParams = {}; + + try { // Case of a serialized Flectra Exception: It is Json Parsable + var node = nodes[1] || nodes[0]; + errorParams = JSON.parse(node.textContent); + } catch (e) { // Arbitrary uncaught python side exception + errorParams = { + message: nodes.length > 1 ? nodes[1].textContent : '', + data: { + title: nodes.length > 0 ? nodes[0].textContent : '', + } + } + } + options.error(errorParams); } } finally { complete(); diff --git a/addons/web/static/src/js/core/rpc.js b/addons/web/static/src/js/core/rpc.js index 55a4c17d..706c9343 100644 --- a/addons/web/static/src/js/core/rpc.js +++ b/addons/web/static/src/js/core/rpc.js @@ -52,19 +52,19 @@ return { if (options.method === 'read_group') { if (!(params.args && params.args[0] !== undefined)) { - params.kwargs.domain = options.domain || params.domain || params.kwargs.domain || []; + params.kwargs.domain = options.domain || params.domain || params.kwargs.domain || []; } if (!(params.args && params.args[1] !== undefined)) { - params.kwargs.fields = options.fields || params.fields || params.kwargs.fields || []; + params.kwargs.fields = options.fields || params.fields || params.kwargs.fields || []; } if (!(params.args && params.args[2] !== undefined)) { - params.kwargs.groupby = options.groupBy || params.groupBy || params.kwargs.groupby || []; + params.kwargs.groupby = options.groupBy || params.groupBy || params.kwargs.groupby || []; } - params.kwargs.offset = options.offset || params.offset || params.kwargs.offset; - params.kwargs.limit = options.limit || params.limit || params.kwargs.limit; + params.kwargs.offset = options.offset || params.offset || params.kwargs.offset; + params.kwargs.limit = options.limit || params.limit || params.kwargs.limit; // In kwargs, we look for "orderby" rather than "orderBy" (note the absence of capital B), // since the Python argument to the actual function is "orderby". - var orderBy = options.orderBy || params.orderBy || params.kwargs.orderby; + var orderBy = options.orderBy || params.orderBy || params.kwargs.orderby; params.kwargs.orderby = orderBy ? this._serializeSort(orderBy) : orderBy; params.kwargs.lazy = 'lazy' in options ? options.lazy : params.lazy; } @@ -72,7 +72,7 @@ return { if (options.method === 'search_read') { // call the model method params.kwargs.domain = options.domain || params.domain || params.kwargs.domain; - params.kwargs.fields = options.fields || params.fields || params.kwargs.fields; + params.kwargs.fields = options.fields || params.fields || params.kwargs.fields; params.kwargs.offset = options.offset || params.offset || params.kwargs.offset; params.kwargs.limit = options.limit || params.limit || params.kwargs.limit; // In kwargs, we look for "order" rather than "orderBy" since the Python diff --git a/addons/web/static/src/js/core/session.js b/addons/web/static/src/js/core/session.js index dae2fc50..9ef37dc9 100644 --- a/addons/web/static/src/js/core/session.js +++ b/addons/web/static/src/js/core/session.js @@ -49,6 +49,7 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, { this.qweb_mutex = new concurrency.Mutex(); this.currencies = {}; this._groups_def = {}; + core.bus.on('invalidate_session', this, this._onInvalidateSession); }, setup: function (origin, options) { // must be able to customize server @@ -327,23 +328,17 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, { rpc: function (url, params, options) { var self = this; options = _.clone(options || {}); - var shadow = options.shadow || false; options.headers = _.extend({}, options.headers); if (flectra.debug) { options.headers["X-Debug-Mode"] = $.deparam($.param.querystring()).debug; } - delete options.shadow; - return self.check_session_id().then(function () { // TODO: remove if (! _.isString(url)) { _.extend(options, url); url = url.url; } - // TODO correct handling of timeouts - if (! shadow) - self.trigger('request'); var fct; if (self.origin_server) { fct = ajax.jsonRpc; @@ -362,37 +357,7 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, { url = self.url(url, null); options.session_id = self.session_id || ''; } - var p = fct(url, "call", params, options); - p = p.then(function (result) { - if (! shadow) - self.trigger('response'); - return result; - }, function (type, error, textStatus, errorThrown) { - if (type === "server") { - if (! shadow) - self.trigger('response'); - if (error.code === 100) { - self.uid = false; - } - return $.Deferred().reject(error, $.Event()); - } else { - if (! shadow) - self.trigger('response_failed'); - var nerror = { - code: -32098, - message: "XmlHttpRequestError " + errorThrown, - data: {type: "xhr"+textStatus, debug: error.responseText, objects: [error, errorThrown] } - }; - return $.Deferred().reject(nerror, $.Event()); - } - }); - return p.fail(function () { // Allow deferred user to disable rpc_error call in fail - p.fail(function (error, event) { - if (!event.isDefaultPrevented()) { - self.trigger('error', error, event); - } - }); - }); + return fct(url, "call", params, options); }); }, url: function (path, params) { @@ -418,6 +383,17 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, { getTZOffset: function (date) { return -new Date(date).getTimezoneOffset(); }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + */ + _onInvalidateSession: function () { + this.uid = false; + }, }); return Session; diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 3ae69e3d..09aec6f0 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -468,7 +468,13 @@ var FieldDate = InputField.extend({ * @private */ _makeDatePicker: function () { - return new datepicker.DateWidget(this, {defaultDate: this.value}); + return new datepicker.DateWidget( + this, + _.defaults( + this.nodeOptions.datepicker || {}, + {defaultDate: this.value} + ) + ); }, /** @@ -1013,6 +1019,20 @@ var FieldPhone = FieldEmail.extend({ this.$el.removeClass('o_text_overflow'); }, + /** + * Remove possibly present ­ characters when saving number + * + * @override + * @private + */ + _setValue: function (value, options) { + if (value) { + // remove possibly pasted ­ characters + value = value.replace(/\u00AD/g, ''); + } + return this._super(value, options); + }, + /** * Phone fields are clickable in readonly on small screens ~= on phones. * This can be overriden by call-capable modules to display a clickable @@ -1068,6 +1088,7 @@ var UrlWidget = InputField.extend({ _renderReadonly: function () { this.$el.text(this.attrs.text || this.value) .addClass('o_form_uri o_text_overflow') + .attr('target', '_blank') .attr('href', this.value); } }); @@ -1211,9 +1232,6 @@ var FieldBinaryImage = AbstractFieldBinary.extend({ self.do_warn(_t("Image"), _t("Could not display the selected image.")); }); }, - isSet: function () { - return true; - }, }); var FieldBinaryFile = AbstractFieldBinary.extend({ @@ -2412,6 +2430,21 @@ var AceEditor = DebouncedField.extend({ // Private //-------------------------------------------------------------------------- + /** + * Format value + * + * Note: We have to overwrite this method to always return a string. + * AceEditor works with string and not boolean value. + * + * @override + * @private + * @param {boolean|string} value + * @returns {string} + */ + _formatValue: function (value) { + return this._super.apply(this, arguments) || ''; + }, + /** * @override * @private @@ -2434,6 +2467,7 @@ var AceEditor = DebouncedField.extend({ this.aceSession.setValue(newValue); } }, + /** * Starts the ace library on the given DOM element. This initializes the * ace editor option according to the edit/readonly mode and binds ace diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js index 8e710048..a9c42937 100644 --- a/addons/web/static/src/js/fields/field_registry.js +++ b/addons/web/static/src/js/fields/field_registry.js @@ -26,6 +26,7 @@ registry .add('datetime', basic_fields.FieldDateTime) .add('domain', basic_fields.FieldDomain) .add('text', basic_fields.FieldText) + .add('html', basic_fields.FieldText) .add('float', basic_fields.FieldFloat) .add('char', basic_fields.FieldChar) .add('link_button', basic_fields.LinkButton) diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index 6bdfcccf..33c7c4ad 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -340,8 +340,8 @@ var FieldMany2One = AbstractField.extend({ _renderReadonly: function () { var value = _.escape((this.m2o_value || "").trim()).split("\n").join("
"); this.$el.html(value); - if (!this.nodeOptions.no_open) { - this.$el.attr('href', '#'); + if (!this.nodeOptions.no_open && this.value) { + this.$el.attr('href', _.str.sprintf('#id=%s&model=%s', this.value.res_id, this.field.relation)); this.$el.addClass('o_form_uri'); } }, @@ -1029,7 +1029,7 @@ var FieldX2Many = AbstractField.extend({ */ _onEditLine: function (ev) { ev.stopPropagation(); - this.trigger_up('freeze_order', {id: this.value.id}); + this.trigger_up('edited_list', { id: this.value.id }); var editedRecord = this.value.data[ev.data.index]; this.renderer.setRowMode(editedRecord.id, 'edit') .done(ev.data.onSuccess); @@ -1117,7 +1117,7 @@ var FieldX2Many = AbstractField.extend({ _onResequence: function (event) { event.stopPropagation(); var self = this; - this.trigger_up('freeze_order', {id: this.value.id}); + this.trigger_up('edited_list', { id: this.value.id }); var rowIDs = event.data.rowIDs.slice(); var rowID = rowIDs.pop(); var defs = _.map(rowIDs, function (rowID, index) { @@ -1261,7 +1261,7 @@ var FieldOne2Many = FieldX2Many.extend({ } } else if (!this.creatingRecord) { this.creatingRecord = true; - this.trigger_up('freeze_order', {id: this.value.id}); + this.trigger_up('edited_list', { id: this.value.id }); this._setValue({ operation: 'CREATE', position: this.editable, @@ -1291,12 +1291,24 @@ var FieldOne2Many = FieldX2Many.extend({ // we don't want interference with the components upstream. ev.stopPropagation(); + var self = this; var id = ev.data.id; - // trigger an empty 'UPDATE' operation when the user clicks on 'Save' in - // the dialog, to notify the main record that a subrecord of this - // relational field has changed (those changes will be already stored on - // that subrecord, thanks to the 'Save'). - var onSaved = this._setValue.bind(this, { operation: 'UPDATE', id: id }, {}); + var onSaved = function (record) { + if (_.some(self.value.data, {id: record.id})) { + // the record already exists in the relation, so trigger an + // empty 'UPDATE' operation when the user clicks on 'Save' in + // the dialog, to notify the main record that a subrecord of + // this relational field has changed (those changes will be + // already stored on that subrecord, thanks to the 'Save'). + self._setValue({ operation: 'UPDATE', id: record.id }); + } else { + // the record isn't in the relation yet, so add it ; this can + // happen if the user clicks on 'Save & New' in the dialog (the + // opened record will be updated, and other records will be + // created) + self._setValue({ operation: 'ADD', id: record.id }); + } + }; this._openFormDialog({ id: id, on_saved: onSaved, @@ -1551,6 +1563,7 @@ var FieldMany2ManyBinaryMultiFiles = AbstractField.extend({ this.$('form.o_form_binary_form').submit(); this.$('.oe_fileupload').hide(); + ev.target.value = ""; }, /** * @private @@ -2265,6 +2278,21 @@ var FieldReference = FieldMany2One.extend({ return this._super.apply(this, arguments); }, + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + * @returns {jQuery} + */ + getFocusableElement: function () { + if (this.mode === 'edit' && !this.field.relation) { + return this.$('select'); + } + return this._super.apply(this, arguments); + }, + //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- diff --git a/addons/web/static/src/js/fields/upgrade_fields.js b/addons/web/static/src/js/fields/upgrade_fields.js index 827047e9..2fdda595 100644 --- a/addons/web/static/src/js/fields/upgrade_fields.js +++ b/addons/web/static/src/js/fields/upgrade_fields.js @@ -92,10 +92,11 @@ var AbstractFieldUpgrade = { */ _render: function () { this._super.apply(this, arguments); - this._insertEnterpriseLabel($("", { - text: "Enterprise", - 'class': "label label-primary oe_inline o_enterprise_label" - })); + // disable enterprise tags + // this._insertEnterpriseLabel($("", { + // text: "Enterprise", + // 'class': "label label-primary oe_inline o_enterprise_label" + // })); }, /** * This function is meant to be overriden to reset the $el to its initial diff --git a/addons/web/static/src/js/services/crash_manager.js b/addons/web/static/src/js/services/crash_manager.js index 8215697d..5f1d8757 100644 --- a/addons/web/static/src/js/services/crash_manager.js +++ b/addons/web/static/src/js/services/crash_manager.js @@ -41,7 +41,8 @@ var CrashManager = core.Class.extend({ core.bus.trigger('connection_lost'); this.connection_lost = true; var timeinterval = setInterval(function() { - ajax.jsonRpc('/web/webclient/version_info').then(function() { + var options = {shadow: true}; + ajax.jsonRpc('/web/webclient/version_info', 'call', {}, options).then(function () { clearInterval(timeinterval); core.bus.trigger('connection_restored'); self.connection_lost = false; @@ -103,7 +104,7 @@ var CrashManager = core.Class.extend({ if (!this.active) { return; } - new Dialog(this, { + return new Dialog(this, { size: 'medium', title: _.str.capitalize(error.type || error.message) || _t("Flectra Warning"), subtitle: error.data.title, diff --git a/addons/web/static/src/js/views/abstract_controller.js b/addons/web/static/src/js/views/abstract_controller.js index 13e97939..71072ce1 100644 --- a/addons/web/static/src/js/views/abstract_controller.js +++ b/addons/web/static/src/js/views/abstract_controller.js @@ -12,6 +12,7 @@ flectra.define('web.AbstractController', function (require) { * reading localstorage, ...) has to go through the controller. */ +var concurrency = require('web.concurrency'); var Widget = require('web.Widget'); @@ -41,6 +42,9 @@ var AbstractController = Widget.extend({ this.handle = params.handle; this.activeActions = params.activeActions; this.initialState = params.initialState; + + // use a DropPrevious to correctly handle concurrent updates + this.dp = new concurrency.DropPrevious(); }, /** * Simply renders and updates the url. @@ -62,6 +66,18 @@ var AbstractController = Widget.extend({ } return this._super.apply(this, arguments); }, + /** + * Called each time the controller is attached into the DOM. + */ + on_attach_callback: function () { + this.renderer.on_attach_callback(); + }, + /** + * Called each time the controller is detached from the DOM. + */ + on_detach_callback: function () { + this.renderer.on_detach_callback(); + }, //-------------------------------------------------------------------------- // Public @@ -194,11 +210,11 @@ var AbstractController = Widget.extend({ var self = this; var shouldReload = (options && 'reload' in options) ? options.reload : true; var def = shouldReload ? this.model.reload(this.handle, params) : $.when(); - return def.then(function (handle) { + return this.dp.add(def).then(function (handle) { self.handle = handle || self.handle; // update handle if we reloaded var state = self.model.get(self.handle); var localState = self.renderer.getLocalState(); - return self.renderer.updateState(state, params).then(function () { + return self.dp.add(self.renderer.updateState(state, params)).then(function () { self.renderer.setLocalState(localState); self._update(state); }); diff --git a/addons/web/static/src/js/views/abstract_renderer.js b/addons/web/static/src/js/views/abstract_renderer.js index 25f97b1e..19d1ee85 100644 --- a/addons/web/static/src/js/views/abstract_renderer.js +++ b/addons/web/static/src/js/views/abstract_renderer.js @@ -36,6 +36,14 @@ return Widget.extend({ this.$el.addClass(this.arch.attrs.class); return $.when(this._render(), this._super()); }, + /** + * Called each time the renderer is attached into the DOM. + */ + on_attach_callback: function () {}, + /** + * Called each time the renderer is detached from the DOM. + */ + on_detach_callback: function () {}, //-------------------------------------------------------------------------- // Public diff --git a/addons/web/static/src/js/views/abstract_view.js b/addons/web/static/src/js/views/abstract_view.js index 7f4aae7e..9a46a731 100644 --- a/addons/web/static/src/js/views/abstract_view.js +++ b/addons/web/static/src/js/views/abstract_view.js @@ -224,6 +224,14 @@ var AbstractView = Class.extend({ _.each(this.loadParams.fieldsInfo.form, function (attrs, fieldName) { var field = fields[fieldName]; + if (!field) { + // when a one2many record is opened in a form view, the fields + // of the main one2many view (list or kanban) are added to the + // fieldsInfo of its form view, but those fields aren't in the + // loadParams.fields, as they are not displayed in the view, so + // we can ignore them. + return; + } if (field.type !== 'one2many' && field.type !== 'many2many') { return; } diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js index a13187aa..763aed14 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -306,7 +306,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { * * @private */ - _disableButtons: function () { + _disableButtons: function () { if (this.$buttons) { this.$buttons.find('button').attr('disabled', true); } @@ -338,10 +338,8 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { return; } self.model.discardChanges(recordID); - if (self.model.isNew(recordID)) { - if (self.model.canBeAbandoned(recordID)) { - self._abandonRecord(recordID); - } + if (self.model.canBeAbandoned(recordID)) { + self._abandonRecord(recordID); return; } return self._confirmSave(recordID); @@ -352,7 +350,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { * * @private */ - _enableButtons: function () { + _enableButtons: function () { if (this.$buttons) { this.$buttons.find('button').removeAttr('disabled'); } diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 25d67b45..52c2f783 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -347,6 +347,7 @@ var BasicModel = AbstractModel.extend({ var element = this.localData[id]; var isNew = this.isNew(id); var rollback = 'rollback' in options ? options.rollback : isNew; + var initialOffset = element.offset; this._visitChildren(element, function (elem) { if (rollback && elem._savePoint) { if (elem._savePoint instanceof Array) { @@ -365,6 +366,7 @@ var BasicModel = AbstractModel.extend({ delete elem.tempLimitIncrement; } }); + element.offset = initialOffset; }, /** * Duplicate a record (by calling the 'copy' route) @@ -375,11 +377,12 @@ var BasicModel = AbstractModel.extend({ duplicateRecord: function (recordID) { var self = this; var record = this.localData[recordID]; + var context = this._getContext(record); return this._rpc({ model: record.model, method: 'copy', args: [record.data.id], - context: this._getContext(record), + context: context, }) .then(function (res_id) { var index = record.res_ids.indexOf(record.res_id); @@ -391,6 +394,7 @@ var BasicModel = AbstractModel.extend({ res_id: res_id, res_ids: record.res_ids.slice(0), viewType: record.viewType, + context: context, }); }); }, @@ -567,10 +571,18 @@ var BasicModel = AbstractModel.extend({ return _t("New"); }, /** - * Returns true if a record can be abandoned from a list datapoint. + * Returns true if a record can be abandoned. * - * A record cannot be abandonned if it has been registered as "added" - * in the parent's savepoint, otherwise it can be abandonned. + * Case for not abandoning the record: + * + * 1. flagged as 'no abandon' (i.e. during a `default_get`, including any + * `onchange` from a `default_get`) + * 2. registered in a list on addition + * 2.1. registered as non-new addition + * 2.2. registered as new additon on update + * 3. record is not new + * + * Otherwise, the record can be abandoned. * * This is useful when discarding changes on this record, as it means that * we must keep the record even if some fields are invalids (e.g. required @@ -580,15 +592,29 @@ var BasicModel = AbstractModel.extend({ * @returns {boolean} */ canBeAbandoned: function (id) { - var data = this.localData[id]; - var parent = this.localData[data.parentID]; - var abandonable = true; - if (parent) { - abandonable = !_.some(parent._savePoint, function (entry) { - return entry.operation === 'ADD' && entry.id === id; - }); + // 1. no drop if flagged + if (this.localData[id]._noAbandon) { + return false; } - return abandonable; + // 2. no drop in a list on "ADD in some cases + var record = this.localData[id]; + var parent = this.localData[record.parentID]; + if (parent) { + var entry = _.findWhere(parent._savePoint, {operation: 'ADD', id: id}); + if (entry) { + // 2.1. no drop on non-new addition in list + if (!entry.isNew) { + return false; + } + // 2.2. no drop on new addition on "UPDATE" + var lastEntry = _.last(parent._savePoint); + if (lastEntry.operation === 'UPDATE' && lastEntry.id === id) { + return false; + } + } + } + // 3. drop new records + return this.isNew(id); }, /** * Returns true if a record is dirty. A record is considered dirty if it has @@ -874,6 +900,15 @@ var BasicModel = AbstractModel.extend({ // x2Many case: the new record has been stored in _changes, as a // command so we remove the command(s) related to that record parent._changes = _.filter(parent._changes, function (change) { + if (change.id === elementID && + change.operation === 'ADD' && // For now, only an ADD command increases limits + parent.tempLimitIncrement) { + // The record will be deleted from the _changes. + // So we won't be passing into the logic of _applyX2ManyOperations anymore + // implying that we have to cancel out the effects of an ADD command here + parent.tempLimitIncrement--; + parent.limit--; + } return change.id !== elementID; }); } else { @@ -949,11 +984,11 @@ var BasicModel = AbstractModel.extend({ * @returns {Deferred} * Resolved with the list of field names (whose value has been modified) */ - save: function (record_id, options) { + save: function (recordID, options) { var self = this; return this.mutex.exec(function () { options = options || {}; - var record = self.localData[record_id]; + var record = self.localData[recordID]; if (options.savePoint) { self._visitChildren(record, function (rec) { var newValue = rec._changes || rec.data; @@ -971,7 +1006,7 @@ var BasicModel = AbstractModel.extend({ }); } var shouldReload = 'reload' in options ? options.reload : true; - var method = self.isNew(record_id) ? 'create' : 'write'; + var method = self.isNew(recordID) ? 'create' : 'write'; if (record._changes) { // id never changes, and should not be written delete record._changes.id; @@ -1053,7 +1088,13 @@ var BasicModel = AbstractModel.extend({ addFieldsInfo: function (recordID, viewInfo) { var record = this.localData[recordID]; record.fields = _.extend({}, record.fields, viewInfo.fields); - record.fieldsInfo = _.extend({}, record.fieldsInfo, viewInfo.fieldsInfo); + // complete the given fieldsInfo with the fields of the main view, so + // that those field will be reloaded if a reload is triggered by the + // secondary view + var fieldsInfo = _.mapObject(viewInfo.fieldsInfo, function (fieldsInfo) { + return _.defaults({}, fieldsInfo, record.fieldsInfo[record.viewType]); + }); + record.fieldsInfo = _.extend({}, record.fieldsInfo, fieldsInfo); }, /** * For list resources, this freezes the current records order. @@ -1535,7 +1576,10 @@ var BasicModel = AbstractModel.extend({ rec = self._makeDataPoint(params); list._cache[rec.res_id] = rec.id; } - + // Do not abandon the record if it has been created + // from `default_get`. The list has a savepoint only + // after having fully executed `default_get`. + rec._noAbandon = !list._savePoint; list._changes.push({operation: 'ADD', id: rec.id}); if (command[0] === 1) { list._changes.push({operation: 'UPDATE', id: rec.id}); @@ -1953,6 +1997,7 @@ var BasicModel = AbstractModel.extend({ var records = []; var ids = []; list = this._applyX2ManyOperations(list); + _.each(list.data, function (localId) { var record = self.localData[localId]; var data = record._changes || record.data; @@ -1963,16 +2008,22 @@ var BasicModel = AbstractModel.extend({ ids.push(many2oneRecord.res_id); model = many2oneRecord.model; }); + if (!ids.length) { + return $.when(); + } return this._rpc({ model: model, method: 'name_get', - args: [ids], + args: [_.uniq(ids)], context: list.context, }) .then(function (name_gets) { - for (var i = 0; i < name_gets.length; i++) { - records[i].data.display_name = name_gets[i][1]; - } + _.each(records, function (record) { + var nameGet = _.find(name_gets, function (nameGet) { + return nameGet[0] === record.data.id; + }); + record.data.display_name = nameGet[1]; + }); }); }, /** @@ -1990,7 +2041,8 @@ var BasicModel = AbstractModel.extend({ */ _fetchRecord: function (record, options) { var self = this; - var fieldNames = options && options.fieldNames || record.getFieldNames(); + options = options || {}; + var fieldNames = options.fieldNames || record.getFieldNames(options); fieldNames = _.uniq(fieldNames.concat(['display_name'])); return this._rpc({ model: record.model, @@ -2457,7 +2509,16 @@ var BasicModel = AbstractModel.extend({ var self = this; var def; if (list.static) { - def = this._readUngroupedList(list); + def = this._readUngroupedList(list).then(function () { + if (list.parentID && self.isNew(list.parentID)) { + // list from a default_get, so fetch display_name for many2one fields + var many2ones = self._getMany2OneFieldNames(list); + var defs = _.map(many2ones, function (name) { + return self._fetchNameGets(list, name); + }); + return $.when.apply($, defs); + } + }); } else { def = this._searchReadUngroupedList(list); } @@ -2490,8 +2551,9 @@ var BasicModel = AbstractModel.extend({ _fetchX2Manys: function (record, options) { var self = this; var defs = []; - var fieldNames = options && options.fieldNames || record.getFieldNames(); - var viewType = options && options.viewType || record.viewType; + options = options || {}; + var fieldNames = options.fieldNames || record.getFieldNames(options); + var viewType = options.viewType || record.viewType; _.each(fieldNames, function (fieldName) { var field = record.fields[fieldName]; if (field.type === 'one2many' || field.type === 'many2many') { @@ -2516,6 +2578,11 @@ var BasicModel = AbstractModel.extend({ relationField: field.relation_field, viewType: view ? view.type : fieldInfo.viewType, }); + // set existing changes to the list + if (record._changes && record._changes[fieldName]) { + list._changes = self.localData[record._changes[fieldName]]._changes; + record._changes[fieldName] = list.id; + } record.data[fieldName] = list.id; if (!fieldInfo.__no_fetch) { var def = self._readUngroupedList(list).then(function () { @@ -3014,11 +3081,32 @@ var BasicModel = AbstractModel.extend({ * default view type. * * @param {Object} element an element from the localData + * @param {Object} [options] + * @param {Object} [options.viewType] current viewType. If not set, we will + * assume main viewType from the record * @returns {string[]} the list of field names */ - _getFieldNames: function (element) { + _getFieldNames: function (element, options) { var fieldsInfo = element.fieldsInfo; - return Object.keys(fieldsInfo && fieldsInfo[element.viewType] || {}); + var viewType = options && options.viewType || element.viewType; + return Object.keys(fieldsInfo && fieldsInfo[viewType] || {}); + }, + /** + * Get many2one fields names in a datapoint. This is useful in order to + * fetch their names in the case of a default_get. + * + * @private + * @param {Object} datapoint a valid resource object + * @returns {string[]} list of field names that are many2one + */ + _getMany2OneFieldNames: function (datapoint) { + var many2ones = []; + _.each(datapoint.fields, function (field, name) { + if (field.type === 'many2one') { + many2ones.push(name); + } + }); + return many2ones; }, /** * Evaluate the record evaluation context. This method is supposed to be @@ -3072,6 +3160,15 @@ var BasicModel = AbstractModel.extend({ // when sent to the server, the x2manys values must be a list // of commands in a context, but the list of ids in a domain ids.toJSON = _generateX2ManyCommands.bind(null, fieldName); + } else if (field.type === 'one2many') { // Ids are evaluated as a list of ids + /* Filtering out virtual ids from the ids list + * The server will crash if there are virtual ids in there + * The webClient doesn't do literal id list comparison like ids == list + * Only relevant in o2m: m2m does create actual records in db + */ + ids = _.filter(ids, function (id) { + return typeof id !== 'string'; + }); } context[fieldName] = ids; } @@ -3166,6 +3263,9 @@ var BasicModel = AbstractModel.extend({ * @param {Object} [options] * @param {string[]} [options.fieldNames] the fields to fetch for a record * @param {boolean} [options.onlyGroups=false] + * @param {boolean} [options.keepEmptyGroups=false] if set, the groups not + * present in the read_group anymore (empty groups) will stay in the + * datapoint (used to mimic the kanban renderer behaviour for example) * @returns {Deferred} */ _load: function (dataPoint, options) { @@ -3318,9 +3418,29 @@ var BasicModel = AbstractModel.extend({ */ _makeDefaultRecord: function (modelName, params) { var self = this; + + var determineExtraFields = function() { + // Fields that are present in the originating view, that need to be initialized + // Hence preventing their value to crash when getting back to the originating view + var parentRecord = self.localData[params.parentID]; + + var originView = parentRecord && parentRecord.fieldsInfo; + if (!originView || !originView[parentRecord.viewType]) + return []; + + var fieldsFromOrigin = _.filter(Object.keys(originView[parentRecord.viewType]), + function(fieldname) { + return params.fields[fieldname] !== undefined; + }); + + return fieldsFromOrigin; + } + var fieldNames = Object.keys(params.fieldsInfo[params.viewType]); var fields_key = _.without(fieldNames, '__last_update'); + var extraFields = determineExtraFields(); + return this._rpc({ model: modelName, method: 'default_get', @@ -3338,7 +3458,7 @@ var BasicModel = AbstractModel.extend({ viewType: params.viewType, }); - return self.applyDefaultValues(record.id, result) + return self.applyDefaultValues(record.id, result, {fieldNames: _.union(fieldNames, extraFields)}) .then(function () { var def = $.Deferred(); self._performOnChange(record, fields_key).always(function () { @@ -3475,13 +3595,16 @@ var BasicModel = AbstractModel.extend({ * @see _fetchRecord @see _makeDefaultRecord * * @param {Object} record - * @param {Object} record + * @param {Object} [options] + * @param {Object} [options.viewType] current viewType. If not set, we will + * assume main viewType from the record * @returns {Deferred} resolves to the finished resource */ _postprocess: function (record, options) { var self = this; var defs = []; - _.each(record.getFieldNames(), function (name) { + + _.each(record.getFieldNames(options), function (name) { var field = record.fields[name]; var fieldInfo = record.fieldsInfo[record.viewType][name] || {}; var options = fieldInfo.options || {}; @@ -3572,6 +3695,7 @@ var BasicModel = AbstractModel.extend({ parentID: x2manyList.id, viewType: viewType, }); + r._noAbandon = true; x2manyList._changes.push({operation: 'ADD', id: r.id}); x2manyList._cache[r.res_id] = r.id; @@ -3589,8 +3713,9 @@ var BasicModel = AbstractModel.extend({ if (isFieldInView) { var field = r.fields[fieldName]; var fieldType = field.type; + var rec; if (fieldType === 'many2one') { - var rec = self._makeDataPoint({ + rec = self._makeDataPoint({ context: r.context, modelName: field.relation, data: {id: r._changes[fieldName]}, @@ -3598,9 +3723,21 @@ var BasicModel = AbstractModel.extend({ }); r._changes[fieldName] = rec.id; many2ones[fieldName] = true; + } else if (fieldType === 'reference') { + var reference = r._changes[fieldName].split(','); + rec = self._makeDataPoint({ + context: r.context, + modelName: reference[0], + data: {id: parseInt(reference[1])}, + parentID: r.id, + }); + r._changes[fieldName] = rec.id; + many2ones[fieldName] = true; } else if (_.contains(['one2many', 'many2many'], fieldType)) { - var x2mCommands = commands[0][2][fieldName]; + var x2mCommands = value[2][fieldName]; defs.push(self._processX2ManyCommands(r, fieldName, x2mCommands)); + } else { + r._changes[fieldName] = self._parseServerValue(field, r._changes[fieldName]); } } } @@ -3795,12 +3932,28 @@ var BasicModel = AbstractModel.extend({ defs.push(self._load(newGroup, options)); } }); + if (options && options.keepEmptyGroups) { + // Find the groups that were available in a previous + // readGroup but are not there anymore. + // Note that these groups are put after existing groups so + // the order is not conserved. A sort *might* be useful. + var emptyGroupsIDs = _.difference(_.pluck(previousGroups, 'id'), list.data); + _.each(emptyGroupsIDs, function (groupID) { + list.data.push(groupID); + var emptyGroup = self.localData[groupID]; + // this attribute hasn't been updated in the previous + // loop for empty groups + emptyGroup.aggregateValues = {}; + }); + } return $.when.apply($, defs).then(function () { - // generate the res_ids of the main list, being the concatenation - // of the fetched res_ids in each group - list.res_ids = _.flatten(_.map(arguments, function (group) { - return group ? group.res_ids : []; - })); + if (!options || !options.onlyGroups) { + // generate the res_ids of the main list, being the concatenation + // of the fetched res_ids in each group + list.res_ids = _.flatten(_.map(arguments, function (group) { + return group ? group.res_ids : []; + })); + } return list; }); }); @@ -4030,10 +4183,20 @@ var BasicModel = AbstractModel.extend({ var r2 = self.localData[record2ID]; var data1 = _.extend({}, r1.data, r1._changes); var data2 = _.extend({}, r2.data, r2._changes); - if (data1[order.name] < data2[order.name]) { + + // Default value to sort against: the value of the field + var orderData1 = data1[order.name]; + var orderData2 = data2[order.name]; + + // If the field is a relation, sort on the display_name of those records + if (list.fields[order.name].type === 'many2one') { + orderData1 = orderData1 ? self.localData[orderData1].data.display_name : ""; + orderData2 = orderData2 ? self.localData[orderData2].data.display_name : ""; + } + if (orderData1 < orderData2) { return order.asc ? -1 : 1; } - if (data1[order.name] > data2[order.name]) { + if (orderData1 > orderData2) { return order.asc ? 1 : -1; } return compareRecords(record1ID, record2ID, level + 1); diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index eae7fa80..b58df7ce 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -704,11 +704,11 @@ var BasicRenderer = AbstractRenderer.extend({ /** * When someone presses the TAB/UP/DOWN/... key in a widget, it is nice to * be able to navigate in the view (default browser behaviors are disabled - * by Odoo). + * by Flectra). * * @abstract * @private - * @param {OdooEvent} ev + * @param {FlectraEvent} ev */ _onNavigationMove: function (ev) {}, }); diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js index adbaa007..180d3030 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -253,7 +253,10 @@ return AbstractModel.extend({ * @param {Moment} start */ setDate: function (start) { - this.data.start_date = this.data.end_date = this.data.target_date = this.data.highlight_date = start; + // keep highlight/target_date in localtime + this.data.highlight_date = this.data.target_date = start.clone(); + // set dates in UTC with timezone applied manually + this.data.start_date = this.data.end_date = start; this.data.start_date.utc().add(this.getSession().getTZOffset(this.data.start_date), 'minutes'); switch (this.data.scale) { @@ -386,7 +389,7 @@ return AbstractModel.extend({ monthNamesShort: moment.monthsShort(), dayNames: moment.weekdays(), dayNamesShort: moment.weekdaysShort(), - firstDay: moment().startOf('week').isoWeekday(), + firstDay: moment()._locale._week.dow, }; }, /** @@ -539,6 +542,7 @@ return AbstractModel.extend({ }); var fs = []; + var undefined_fs = []; _.each(events, function (event) { var data = event.record[fieldName]; if (!_.contains(['many2many', 'one2many'], field.type)) { @@ -548,15 +552,18 @@ return AbstractModel.extend({ } _.each(data, function (_value) { var value = _.isArray(_value) ? _value[0] : _value; - fs.push({ + var f = { 'color_index': self.model_color === (field.relation || element.model) ? value : false, 'value': value, - 'label': fieldUtils.format[field.type](_value, field), + 'label': fieldUtils.format[field.type](_value, field) || _t("Undefined"), 'avatar_model': field.relation || element.model, - }); + }; + // if field used as color does not have value then push filter in undefined_fs, + // such filters should come last in filter list with Undefined string, later merge it with fs + value ? fs.push(f) : undefined_fs.push(f); }); }); - _.each(fs, function (f) { + _.each(_.union(fs, undefined_fs), function (f) { var f1 = _.findWhere(filter.filters, f); if (f1) { f1.display = true; @@ -611,7 +618,8 @@ return AbstractModel.extend({ var date_start; var date_stop; var date_delay = evt[this.mapping.date_delay] || 1.0, - all_day = this.mapping.all_day ? evt[this.mapping.all_day] : false, + all_day = this.fields[this.mapping.date_start].type === 'date' || + this.mapping.all_day && evt[this.mapping.all_day] || false, the_title = '', attendees = []; diff --git a/addons/web/static/src/js/views/calendar/calendar_view.js b/addons/web/static/src/js/views/calendar/calendar_view.js index a25bca29..efa90554 100644 --- a/addons/web/static/src/js/views/calendar/calendar_view.js +++ b/addons/web/static/src/js/views/calendar/calendar_view.js @@ -112,8 +112,20 @@ var CalendarView = AbstractView.extend({ //if quick_add = is NOT False and IS specified in view, we this one for widgets.QuickCreate' this.controllerParams.quickAddPop = (!('quick_add' in attrs) || utils.toBoolElse(attrs.quick_add+'', true)); this.controllerParams.disableQuickCreate = params.disable_quick_create || !this.controllerParams.quickAddPop; - // If this field is set ot true, we don't open the event in form view, but in a popup with the view_id passed by this parameter - this.controllerParams.formViewId = !attrs.form_view_id || !utils.toBoolElse(attrs.form_view_id, true) ? false : attrs.form_view_id; + + // If form_view_id is set, then the calendar view will open a form view + // with this id, when it needs to edit or create an event. + this.controllerParams.formViewId = + attrs.form_view_id ? parseInt(attrs.form_view_id, 10) : false; + if (!this.controllerParams.formViewId && params.action) { + var formViewDescr = _.find(params.action.views, function (v) { + return v[1] === 'form'; + }); + if (formViewDescr) { + this.controllerParams.formViewId = formViewDescr[0]; + } + } + this.controllerParams.readonlyFormViewId = !attrs.readonly_form_view_id || !utils.toBoolElse(attrs.readonly_form_view_id, true) ? false : attrs.readonly_form_view_id; this.controllerParams.eventOpenPopup = utils.toBoolElse(attrs.event_open_popup || '', false); this.controllerParams.mapping = mapping; diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index 1aa62e37..7f487a21 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -14,7 +14,7 @@ var FormController = BasicController.extend({ custom_events: _.extend({}, BasicController.prototype.custom_events, { bounce_edit: '_onBounceEdit', button_clicked: '_onButtonClicked', - freeze_order: '_onFreezeOrder', + edited_list: '_onEditedList', open_one2many_record: '_onOpenOne2ManyRecord', open_record: '_onOpenRecord', toggle_column_order: '_onToggleColumnOrder', @@ -100,6 +100,7 @@ var FormController = BasicController.extend({ * @todo convert to new style */ on_attach_callback: function () { + this._super.apply(this, arguments); this.autofocus(); }, /** @@ -213,6 +214,16 @@ var FormController = BasicController.extend({ return changedFields; }); }, + /** + * Overrides to force the viewType to 'form', so that we ensure that the + * correct fields are reloaded (this is only useful for one2many form views). + * + * @override + */ + update: function (params, options) { + params = _.extend({viewType: 'form'}, params); + return this._super(params, options); + }, //-------------------------------------------------------------------------- // Private @@ -467,11 +478,15 @@ var FormController = BasicController.extend({ * in a x2many list view * * @private - * @param {FlectraEvent} event + * @param {FlectraEvent} ev + * @param {integer} ev.id of the list to freeze while editing a line */ - _onFreezeOrder: function (event) { - event.stopPropagation(); - this.model.freezeOrder(event.data.id); + _onEditedList: function (ev) { + ev.stopPropagation(); + if (ev.data.id) { + this.model.save(ev.data.id, {savePoint: true}); + } + this.model.freezeOrder(ev.data.id); }, /** * Opens a one2many record (potentially new) in a dialog. This handler is diff --git a/addons/web/static/src/js/views/graph/graph_renderer.js b/addons/web/static/src/js/views/graph/graph_renderer.js index 29735f0f..95230b08 100644 --- a/addons/web/static/src/js/views/graph/graph_renderer.js +++ b/addons/web/static/src/js/views/graph/graph_renderer.js @@ -43,6 +43,30 @@ return AbstractRenderer.extend({ nv.utils.offWindowResize(this.to_remove); this._super(); }, + /** + * The graph view uses the nv(d3) lib to render the graph. This lib requires + * that the rendering is done directly into the DOM (so that it can correctly + * compute positions). However, the views are always rendered in fragments, + * and appended to the DOM once ready (to prevent them from flickering). We + * here use the on_attach_callback hook, called when the widget is attached + * to the DOM, to perform the rendering. This ensures that the rendering is + * always done in the DOM. + * + * @override + */ + on_attach_callback: function () { + this._super.apply(this, arguments); + this.isInDOM = true; + this._renderGraph(); + }, + /** + * @override + */ + on_detach_callback: function () { + this._super.apply(this, arguments); + this.isInDOM = false; + }, + //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- @@ -51,10 +75,9 @@ return AbstractRenderer.extend({ * Render the chart. * * Note that This method is synchronous, but the actual rendering is done - * asynchronously (in a setTimeout). The reason for that is that nvd3/d3 - * needs to be in the DOM to correctly render itself. So, we trick Flectra by - * returning immediately, then wait a tiny interval before actually - * displaying the data. + * asynchronously. The reason for that is that nvd3/d3 needs to be in the + * DOM to correctly render itself. So, we trick Flectra by returning + * immediately, then we render the chart when the widget is in the DOM. * * @returns {Deferred} The _super deferred is actually resolved immediately */ @@ -76,21 +99,15 @@ return AbstractRenderer.extend({ "Try to add some records, or make sure that " + "there is no active filter in the search bar."), })); - } else { - var self = this; - setTimeout(function () { - self.$el.empty(); - var chart = self['_render' + _.str.capitalize(self.state.mode) + 'Chart'](); - if (chart && chart.tooltip.chartContainer) { - self.to_remove = chart.update; - nv.utils.onWindowResize(chart.update); - chart.tooltip.chartContainer(self.el); - } - }, 0); + } else if (this.isInDOM) { + // only render the graph if the widget is already in the DOM (this + // happens typically after an update), otherwise, it will be + // rendered when the widget will be attached to the DOM (see + // 'on_attach_callback') + this._renderGraph(); } return this._super.apply(this, arguments); }, - /** * Helper function to set up data properly for the multiBarChart model in * nvd3. @@ -327,6 +344,21 @@ return AbstractRenderer.extend({ chart(svg); return chart; }, + /** + * Renders the graph according to its type. This function must be called + * when the renderer is in the DOM (for nvd3 to render the graph correctly). + * + * @private + */ + _renderGraph: function () { + this.$el.empty(); + var chart = this['_render' + _.str.capitalize(this.state.mode) + 'Chart'](); + if (chart && chart.tooltip.chartContainer) { + this.to_remove = chart.update; + nv.utils.onWindowResize(chart.update); + chart.tooltip.chartContainer(this.el); + } + }, }); }); diff --git a/addons/web/static/src/js/views/kanban/kanban_controller.js b/addons/web/static/src/js/views/kanban/kanban_controller.js index a86ebfcb..c40a7f0b 100644 --- a/addons/web/static/src/js/views/kanban/kanban_controller.js +++ b/addons/web/static/src/js/views/kanban/kanban_controller.js @@ -10,6 +10,7 @@ flectra.define('web.KanbanController', function (require) { var BasicController = require('web.BasicController'); var Context = require('web.Context'); var core = require('web.core'); +var Domain = require('web.Domain'); var view_dialogs = require('web.view_dialogs'); var _t = core._t; @@ -106,6 +107,16 @@ var KanbanController = BasicController.extend({ var groupedByM2o = groupByField && (groupByField.type === 'many2one'); return groupedByM2o; }, + /** + * @param {number[]} ids + * @private + * @returns {Deferred} + */ + _resequenceColumns: function (ids) { + var state = this.model.get(this.handle, {raw: true}); + var model = state.fields[state.groupedBy[0]].relation; + return this.model.resequence(model, ids, this.handle); + }, /** * This method calls the server to ask for a resequence. Note that this * does not rerender the user interface, because in most case, the @@ -155,6 +166,10 @@ var KanbanController = BasicController.extend({ _onAddColumn: function (event) { var self = this; this.model.createGroup(event.data.value, this.handle).then(function () { + var state = self.model.get(self.handle, {raw: true}); + var ids = _.pluck(state.data, 'res_id').filter(_.isNumber); + return self._resequenceColumns(ids); + }).then(function () { return self.update({}, {reload: false}); }).then(function () { self._updateButtons(); @@ -228,10 +243,57 @@ var KanbanController = BasicController.extend({ resIDs: record.res_ids, }, on_closed: function () { + var recordModel = self.model.localData[record.id]; + var group = self.model.localData[recordModel.parentID]; + var parent = self.model.localData[group.parentID]; + self.model.reload(record.id).then(function (db_id) { var data = self.model.get(db_id); var kanban_record = event.target; kanban_record.update(data); + + // Check if we still need to display the record. Some fields of the domain are + // not guaranteed to be in data. This is for example the case if the action + // contains a domain on a field which is not in the Kanban view. Therefore, + // we need to handle multiple cases based on 3 variables: + // domInData: all domain fields are in the data + // activeInDomain: 'active' is already in the domain + // activeInData: 'active' is available in the data + + var domain = (parent ? parent.domain : group.domain) || []; + var domInData = _.every(domain, function (d) { + return d[0] in data.data; + }); + var activeInDomain = _.pluck(domain, 0).indexOf('active') !== -1; + var activeInData = 'active' in data.data; + + // Case # | domInData | activeInDomain | activeInData + // 1 | true | true | true => no domain change + // 2 | true | true | false => not possible + // 3 | true | false | true => add active in domain + // 4 | true | false | false => no domain change + // 5 | false | true | true => no evaluation + // 6 | false | true | false => no evaluation + // 7 | false | false | true => replace domain + // 8 | false | false | false => no evaluation + + // There are 3 cases which cannot be evaluated since we don't have all the + // necessary information. The complete solution would be to perform a RPC in + // these cases, but this is out of scope. A simpler one is to do a try / catch. + + if (domInData && !activeInDomain && activeInData) { + domain = domain.concat([['active', '=', true]]); + } else if (!domInData && !activeInDomain && activeInData) { + domain = [['active', '=', true]]; + } + try { + var visible = new Domain(domain).compute(data.evalContext); + } catch (e) { + return; + } + if (!visible) { + kanban_record.destroy(); + } }); }, }); @@ -380,9 +442,7 @@ var KanbanController = BasicController.extend({ */ _onResequenceColumn: function (event) { var self = this; - var state = this.model.get(this.handle, {raw: true}); - var model = state.fields[state.groupedBy[0]].relation; - this.model.resequence(model, event.data.ids, this.handle).then(function () { + this._resequenceColumns(event.data.ids).then(function () { self._updateEnv(); }); }, diff --git a/addons/web/static/src/js/views/kanban/kanban_model.js b/addons/web/static/src/js/views/kanban/kanban_model.js index 22c9751f..4f822cb8 100644 --- a/addons/web/static/src/js/views/kanban/kanban_model.js +++ b/addons/web/static/src/js/views/kanban/kanban_model.js @@ -348,9 +348,8 @@ var KanbanModel = BasicModel.extend({ return $.when(); }, /** - * Reloads all progressbar data if the given id is a record's one. This is - * done after given deferred and insures that the given deferred's result is - * not lost. + * Reloads all progressbar data. This is done after given deferred and + * insures that the given deferred's result is not lost. * * @private * @param {string} recordID @@ -359,7 +358,9 @@ var KanbanModel = BasicModel.extend({ */ _reloadProgressBarGroupFromRecord: function (recordID, def) { var element = this.localData[recordID]; - if (element.type !== 'record') { + if (element.type === 'list' && !element.parentID) { + // we are reloading the whole view, so there is no need to manually + // reload the progressbars return def; } @@ -369,7 +370,10 @@ var KanbanModel = BasicModel.extend({ while (element) { if (element.progressBar) { return def.then(function (data) { - return self._load(element, {onlyGroups: true}).then(function () { + return self._load(element, { + keepEmptyGroups: true, + onlyGroups: true, + }).then(function () { return data; }); }); diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js index 339d695e..7288ef48 100644 --- a/addons/web/static/src/js/views/list/list_editable_renderer.js +++ b/addons/web/static/src/js/views/list/list_editable_renderer.js @@ -531,8 +531,13 @@ ListRenderer.include({ * @returns {Deferred} this deferred is resolved immediately */ _renderView: function () { + var self = this; this.currentRow = null; - return this._super.apply(this, arguments); + return this._super.apply(this, arguments).then(function () { + if (self._isEditable()) { + self.$('table').addClass('o_editable_list'); + } + }); }, /** * Force the resequencing of the items in the list. diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js index 393e7542..ce79b955 100644 --- a/addons/web/static/src/js/views/pivot/pivot_model.js +++ b/addons/web/static/src/js/views/pivot/pivot_model.js @@ -17,6 +17,7 @@ flectra.define('web.PivotModel', function (require) { */ var AbstractModel = require('web.AbstractModel'); +var concurrency = require('web.concurrency'); var core = require('web.core'); var session = require('web.session'); var utils = require('web.utils'); @@ -32,6 +33,7 @@ var PivotModel = AbstractModel.extend({ this._super.apply(this, arguments); this.numbering = {}; this.data = null; + this._loadDataDropPrevious = new concurrency.DropPrevious(); }, //-------------------------------------------------------------------------- @@ -250,6 +252,7 @@ var PivotModel = AbstractModel.extend({ this.data.colGroupBys = params.context.pivot_column_groupby || this.data.colGroupBys; this.data.groupedBy = params.context.pivot_row_groupby || this.data.groupedBy; this.data.measures = this._processMeasures(params.context.pivot_measures) || this.data.measures; + this.defaultGroupedBy = this.data.groupedBy.length ? this.data.groupedBy : this.defaultGroupedBy; } if ('domain' in params) { this.data.domain = params.domain; @@ -278,7 +281,7 @@ var PivotModel = AbstractModel.extend({ self._updateTree(old_col_root, self.data.main_col.root); new_groupby_length = self._getHeaderDepth(self.data.main_col.root) - 1; - self.data.main_row.groupbys = old_col_root.groupbys.slice(0, new_groupby_length); + self.data.main_row.groupbys = old_row_root.groupbys.slice(0, new_groupby_length); }); }, /** @@ -531,7 +534,7 @@ var PivotModel = AbstractModel.extend({ } } - return $.when.apply(null, groupBys.map(function (groupBy) { + return this._loadDataDropPrevious.add($.when.apply(null, groupBys.map(function (groupBy) { return self._rpc({ model: self.modelName, method: 'read_group', @@ -541,7 +544,7 @@ var PivotModel = AbstractModel.extend({ groupBy: groupBy, lazy: false, }); - })).then(function () { + }))).then(function () { var data = Array.prototype.slice.call(arguments); if (data[0][0].__count === 0) { self.data.has_data = false; diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js index 97d37154..77d9b143 100644 --- a/addons/web/static/src/js/views/view_dialogs.js +++ b/addons/web/static/src/js/views/view_dialogs.js @@ -430,7 +430,7 @@ var SelectCreateDialog = ViewDialog.extend({ * list controller. * * @private - * @param {OdooEvent} ev + * @param {FlectraEvent} ev * @param {function} ev.data.callback used to send the requested context */ _onGetControllerContext: function (ev) { diff --git a/addons/web/static/src/js/widgets/date_picker.js b/addons/web/static/src/js/widgets/date_picker.js index c6907357..8c09b3dc 100644 --- a/addons/web/static/src/js/widgets/date_picker.js +++ b/addons/web/static/src/js/widgets/date_picker.js @@ -79,8 +79,15 @@ var DateWidget = Widget.extend({ var oldValue = this.getValue(); this._setValueFromUi(); var newValue = this.getValue(); - - if (!oldValue !== !newValue || oldValue && newValue && !oldValue.isSame(newValue)) { + var hasChanged = !oldValue !== !newValue; + if (oldValue && newValue) { + var formattedOldValue = oldValue.format(time.getLangDatetimeFormat()); + var formattedNewValue = newValue.format(time.getLangDatetimeFormat()) + if (formattedNewValue !== formattedOldValue) { + hasChanged = true; + } + } + if (hasChanged) { // The condition is strangely written; this is because the // values can be false/undefined this.trigger("datetime_changed"); diff --git a/addons/web/static/src/js/widgets/debug_manager.js b/addons/web/static/src/js/widgets/debug_manager.js index e5660997..6e3d10ee 100644 --- a/addons/web/static/src/js/widgets/debug_manager.js +++ b/addons/web/static/src/js/widgets/debug_manager.js @@ -178,6 +178,7 @@ var DebugManager = Widget.extend({ }) .then(function (views) { var view = views[0]; + view.type = view.type === 'tree' ? 'list' : view.type; // ignore tree view self.do_action({ type: 'ir.actions.act_window', name: view.name, diff --git a/addons/web/static/src/less/bootstrap_overridden.less b/addons/web/static/src/less/bootstrap_overridden.less index e07f767b..d4a8197e 100644 --- a/addons/web/static/src/less/bootstrap_overridden.less +++ b/addons/web/static/src/less/bootstrap_overridden.less @@ -176,6 +176,8 @@ } } +@icon-font-path: "/web/static/lib/bootstrap/fonts/"; + @btn-default-color: #fff; @btn-default-bg: @gray-light; @btn-default-border: transparent; diff --git a/addons/web/static/src/less/datepicker.less b/addons/web/static/src/less/datepicker.less index 03211ea5..83535c3c 100644 --- a/addons/web/static/src/less/datepicker.less +++ b/addons/web/static/src/less/datepicker.less @@ -17,11 +17,12 @@ .o_datepicker_input { width: 100%; + cursor: pointer; } .o_datepicker_button { .o-position-absolute(2px, 4px); - cursor: pointer; + pointer-events: none; // let click events go through the underlying input &:after { .o-caret-down; } diff --git a/addons/web/static/src/less/fields.less b/addons/web/static/src/less/fields.less index cb27a204..8c815ab2 100644 --- a/addons/web/static/src/less/fields.less +++ b/addons/web/static/src/less/fields.less @@ -39,9 +39,7 @@ // Flex fields (inline) &.o_field_many2one, &.o_field_radio, &.o_field_many2manytags, &.o_field_percent_pie, &.o_field_monetary, &.o_field_binary_file { - @media (min-width: @screen-sm-min) { - .o-inline-flex-display(); - } + .o-inline-flex-display(); > span, > button { .o-flex(0, 0, auto); } @@ -135,7 +133,7 @@ display: inline-block; padding: 0; margin: 0; - vertical-align: middle; + vertical-align: baseline; > .o_priority_star { display: inline-block; font-size: 1.35em; @@ -185,6 +183,9 @@ // Radio buttons &.o_field_radio { + @media (max-width: @screen-xs-max) { + display: inline-block; + } .o_radio_input { outline: none; } @@ -309,6 +310,10 @@ &:hover .o_form_image_controls { opacity: 0.8; } + + &.o_field_invalid > img { + border: 1px solid @brand-danger; + } } // Input loading/file diff --git a/addons/web/static/src/less/form_view.less b/addons/web/static/src/less/form_view.less index 7b8a47ff..c34b6b9f 100644 --- a/addons/web/static/src/less/form_view.less +++ b/addons/web/static/src/less/form_view.less @@ -248,6 +248,10 @@ border-left-color: @gray-lighter; } } + + .caret { + margin-top: -2px; + } } .o-status-more { diff --git a/addons/web/static/src/less/kanban_column_progressbar.less b/addons/web/static/src/less/kanban_column_progressbar.less index 41f12bf1..a68e8bcc 100644 --- a/addons/web/static/src/less/kanban_column_progressbar.less +++ b/addons/web/static/src/less/kanban_column_progressbar.less @@ -91,6 +91,7 @@ margin-left: 3%; color: @headings-color; text-align: right; + white-space: nowrap; .o-transform-origin(right, center); &.o_kanban_grow { diff --git a/addons/web/static/src/less/kanban_dashboard.less b/addons/web/static/src/less/kanban_dashboard.less index df73c2a6..acf76fbc 100644 --- a/addons/web/static/src/less/kanban_dashboard.less +++ b/addons/web/static/src/less/kanban_dashboard.less @@ -223,6 +223,7 @@ } .o_favorite { + top: 3px; left: 0; right: auto; } diff --git a/addons/web/static/src/less/list_view.less b/addons/web/static/src/less/list_view.less index 8f3b0d56..b35e916b 100644 --- a/addons/web/static/src/less/list_view.less +++ b/addons/web/static/src/less/list_view.less @@ -6,6 +6,14 @@ background-color: @flectra-view-background-color; margin-bottom: 0px; + // Checkbox in editable list + // should be clickable and activate the row + &.o_editable_list .o_data_row:not(.o_selected_row) .o_data_cell { + .o_checkbox:not(.o_readonly_modifier) { + pointer-events: none; + } + } + &.table { td, th { vertical-align: middle; @@ -37,12 +45,14 @@ .user-select(none); // Prevent unwanted selection while sorting &::after { - margin-left: 6px; - position: absolute; font-family: FontAwesome; content: "\f0d7"; opacity: 0; } + &:not(:empty)::after { + margin-left: 6px; + position: absolute; + } &.o-sort-up { cursor: n-resize; &::after { @@ -74,7 +84,6 @@ padding: 0px; background-style: none; border-style: none; - height: 0px; display: table-cell; } diff --git a/addons/web/static/src/less/pivot_view.less b/addons/web/static/src/less/pivot_view.less index 0d70d26f..d1c684e1 100644 --- a/addons/web/static/src/less/pivot_view.less +++ b/addons/web/static/src/less/pivot_view.less @@ -76,4 +76,4 @@ // ------------------------------------------------------------------ .o_pivot_measures_list { .o-selected-li; -} \ No newline at end of file +} \ No newline at end of file diff --git a/addons/web/static/src/less/web_calendar.less b/addons/web/static/src/less/web_calendar.less index d6e1f1b9..16f7ee82 100644 --- a/addons/web/static/src/less/web_calendar.less +++ b/addons/web/static/src/less/web_calendar.less @@ -71,11 +71,6 @@ } } } - - .o_target_date:not(.fc-today) { - background-color: @flectra-brand-primary; - opacity: 0.1; - } } .o_calendar_sidebar_container { diff --git a/addons/web/static/tests/boot_tests.js b/addons/web/static/tests/boot_tests.js index 83d7c549..af320359 100644 --- a/addons/web/static/tests/boot_tests.js +++ b/addons/web/static/tests/boot_tests.js @@ -18,4 +18,4 @@ flectra.__DEBUG__.didLogInfo.then(function() { }); -})(); \ No newline at end of file +})(); \ No newline at end of file diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index 1ddde029..78aafe52 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -1698,7 +1698,6 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('div[name="document"] > img').attr('width'), "90", "the image should correctly set its attributes"); form.destroy(); - }); QUnit.test('image fields in subviews are loaded correctly', function (assert) { @@ -1750,6 +1749,34 @@ QUnit.module('basic_fields', { form.destroy(); }); + QUnit.test('image fields with required attribute', function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '', + mockRPC: function (route, args) { + if (args.method === 'create') { + throw new Error("Should not do a create RPC with unset required image field"); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_save').click(); + + assert.ok(form.$('.o_form_view').hasClass('o_form_editable'), + "form view should still be editable"); + assert.ok(form.$('.o_field_widget').hasClass('o_field_invalid'), + "image field should be displayed as invalid"); + + form.destroy(); + }); + QUnit.module('JournalDashboardGraph', { beforeEach: function () { _.extend(this.data.partner.fields, { @@ -2262,6 +2289,38 @@ QUnit.module('basic_fields', { form.destroy(); }); + QUnit.test('datetime field in form view', function (assert) { + assert.expect(1); + + this.data.partner.fields.datetime.default = "2017-08-02 12:00:05"; + this.data.partner.fields.datetime.required = true; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
', + res_id: 1, + translateParameters: { // Avoid issues due to localization formats + date_format: '%m/%d/%Y', + time_format: '%H:%M', + }, + }); + testUtils.patch(basicFields.FieldDate, { + _setValue: function () { + throw "The time format of the language must be taken into account." + return this._super.apply(this, arguments); + }, + }); + form.$buttons.find('.o_form_button_create').click(); + var expectedDateString = "08/02/2017 12:00"; // 10:00:00 without timezone + assert.strictEqual(form.$('.o_field_date input').val(), expectedDateString, + 'the datetime should be correctly displayed in readonly'); + + testUtils.unpatch(basicFields.FieldDate); + form.destroy(); + }); + QUnit.test('datetime field in editable list view', function (assert) { assert.expect(8); @@ -3010,7 +3069,7 @@ QUnit.module('basic_fields', { QUnit.module('PhoneWidget'); QUnit.test('phone field in form view on extra small screens', function (assert) { - assert.expect(7); + assert.expect(8); var form = createView({ View: FormView, @@ -3058,6 +3117,14 @@ QUnit.module('basic_fields', { assert.strictEqual($phoneLink.attr('href'), 'tel:new', "should still have proper tel prefix"); + // save phone with ­ and verify it is removed + form.$buttons.find('.o_form_button_edit').click(); + form.$('input[type="text"].o_field_widget').val('h\u00ADi').trigger('input'); + form.$buttons.find('.o_form_button_save').click(); + $phoneLink = form.$('a.o_form_uri.o_field_widget'); + assert.strictEqual($phoneLink.attr('href'), 'tel:hi', + "U+00AD should have been removed"); + form.destroy(); }); diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 2744c54d..6dca123a 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -143,10 +143,12 @@ QUnit.module('relational_fields', { user: { fields: { name: {string: "Name", type: "char"}, + partner_ids: {string: "one2many partners field", type: "one2many", relation: 'partner', relation_field: 'user_id'}, }, records: [{ id: 17, name: "Aline", + partner_ids: [1, 2], }, { id: 19, name: "Christine", @@ -599,6 +601,35 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('many2one in non edit mode', function (assert) { + assert.expect(3); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '', + res_id: 1, + }); + + assert.strictEqual(form.$('a.o_form_uri').length, 1, + "should display 1 m2o link in form"); + assert.strictEqual(form.$('a.o_form_uri').attr('href'), "#id=4&model=partner", + "href should contain id and model"); + + // Remove value from many2one and then save, there should not have href with id and model on m2o anchor + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_field_many2one input').val('').trigger('keyup').trigger('focusout'); + form.$buttons.find('.o_form_button_save').click(); + + assert.strictEqual(form.$('a.o_form_uri').attr('href'), "#", + "href should have #"); + + form.destroy(); + }); + QUnit.test('many2one searches with correct value', function (assert) { var done = assert.async(); assert.expect(6); @@ -1150,12 +1181,12 @@ QUnit.module('relational_fields', { form.destroy(); }); - QUnit.test('list in form: discard newly added element with empty required field', function (assert) { + QUnit.test('item not dropped on discard with empty required field (default_get)', function (assert) { // This test simulates discarding a record that has been created with // one of its required field that is empty. When we discard the changes // on this empty field, it should not assume that this record should be // abandonned, since it has been added (even though it is a new record). - assert.expect(6); + assert.expect(8); var form = createView({ View: FormView, @@ -1173,7 +1204,7 @@ QUnit.module('relational_fields', { '', mockRPC: function (route, args) { if (args.method === 'default_get') { - return $.when({p: [[0, 0, {display_name: 'new record', trululu: false}]]}); + return $.when({ p: [[0, 0, { display_name: 'new record', trululu: false }]] }); } return this._super.apply(this, arguments); }, @@ -1181,6 +1212,8 @@ QUnit.module('relational_fields', { assert.strictEqual($('tr.o_data_row').length, 1, "should have created the new record in the o2m"); + assert.strictEqual($('td.o_data_cell').first().text(), "new record", + "should have the correct displayed name"); var requiredElement = $('td.o_data_cell.o_required_modifier'); assert.strictEqual(requiredElement.length, 1, @@ -1194,6 +1227,8 @@ QUnit.module('relational_fields', { assert.strictEqual($('tr.o_data_row').length, 1, "should still have the record in the o2m"); + assert.strictEqual($('td.o_data_cell').first().text(), "new record", + "should still have the correct displayed name"); // update selector of required field element requiredElement = $('td.o_data_cell.o_required_modifier'); @@ -1204,6 +1239,345 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('list in form: name_get with unique ids (default_get)', function (assert) { + assert.expect(2); + + this.data.partner.records[0].display_name = "MyTrululu"; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + p: [ + [0, 0, { trululu: 1 }], + [0, 0, { trululu: 1 }] + ] + }); + } + if (args.method === 'name_get') { + assert.deepEqual(args.args[0], _.uniq(args.args[0]), + "should not have duplicates in name_get rpc"); + } + return this._super.apply(this, arguments); + }, + }); + + assert.strictEqual(form.$('td.o_data_cell').text(), "MyTrululuMyTrululu", + "both records should have the correct display_name for trululu field"); + + form.destroy(); + }); + + QUnit.test('list in form: show name of many2one fields in multi-page (default_get)', function (assert) { + assert.expect(4); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + p: [ + [0, 0, { display_name: 'record1', trululu: 1 }], + [0, 0, { display_name: 'record2', trululu: 2 }] + ] + }); + } + return this._super.apply(this, arguments); + }, + }); + + assert.strictEqual(form.$('td.o_data_cell').first().text(), + "record1", "should show display_name of 1st record"); + assert.strictEqual(form.$('td.o_data_cell').first().next().text(), + "first record", "should show display_name of trululu of 1st record"); + + form.$('button.o_pager_next').click(); + + assert.strictEqual(form.$('td.o_data_cell').first().text(), + "record2", "should show display_name of 2nd record"); + assert.strictEqual(form.$('td.o_data_cell').first().next().text(), + "second record", "should show display_name of trululu of 2nd record"); + + form.destroy(); + }); + + QUnit.test('list in form: item not dropped on discard with empty required field (onchange in default_get)', function (assert) { + // variant of the test "list in form: discard newly added element with + // empty required field (default_get)", in which the `default_get` + // performs an `onchange` at the same time. This `onchange` may create + // some records, which should not be abandoned on discard, similarly + // to records created directly by `default_get` + assert.expect(7); + + var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; + + this.data.partner.onchanges = { + product_id: function (obj) { + if (obj.product_id === 37) { + obj.p = [[0, 0, { display_name: "entry", trululu: false }]]; + } + }, + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + product_id: 37, + }); + } + return this._super.apply(this, arguments); + }, + }); + + // check that there is a record in the editable list with empty string as required field + assert.strictEqual(form.$('.o_data_row').length, 1, + "should have a row in the editable list"); + assert.strictEqual($('td.o_data_cell').first().text(), "entry", + "should have the correct displayed name"); + var requiredField = $('td.o_data_cell.o_required_modifier'); + assert.strictEqual(requiredField.length, 1, + "should have a required field on this record"); + assert.strictEqual(requiredField.text(), "", + "should have empty string in the required field on this record"); + + // click on empty required field in editable list record + requiredField.click(); + // click off so that the required field still stay empty + $('body').click(); + + // record should not be dropped + assert.strictEqual(form.$('.o_data_row').length, 1, + "should not have dropped record in the editable list"); + assert.strictEqual($('td.o_data_cell').first().text(), "entry", + "should still have the correct displayed name"); + assert.strictEqual($('td.o_data_cell.o_required_modifier').text(), "", + "should still have empty string in the required field"); + + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + }); + + QUnit.test('list in form: item not dropped on discard with empty required field (onchange on list after default_get)', function (assert) { + // discarding a record from an `onchange` in a `default_get` should not + // abandon the record. This should not be the case for following + // `onchange`, except if an onchange make some changes on the list: + // in particular, if an onchange make changes on the list such that + // a record is added, this record should not be dropped on discard + assert.expect(8); + + var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; + + this.data.partner.onchanges = { + product_id: function (obj) { + if (obj.product_id === 37) { + obj.p = [[0, 0, { display_name: "entry", trululu: false }]]; + } + }, + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + }); + + // check no record in list + assert.strictEqual(form.$('.o_data_row').length, 0, + "should have no row in the editable list"); + + // select product_id to force on_change in editable list + form.$('.o_field_widget[name="product_id"] .o_input').click(); + $('.ui-menu-item').first().click(); + + // check that there is a record in the editable list with empty string as required field + assert.strictEqual(form.$('.o_data_row').length, 1, + "should have a row in the editable list"); + assert.strictEqual($('td.o_data_cell').first().text(), "entry", + "should have the correct displayed name"); + var requiredField = $('td.o_data_cell.o_required_modifier'); + assert.strictEqual(requiredField.length, 1, + "should have a required field on this record"); + assert.strictEqual(requiredField.text(), "", + "should have empty string in the required field on this record"); + + // click on empty required field in editable list record + requiredField.click(); + // click off so that the required field still stay empty + $('body').click(); + + // record should not be dropped + assert.strictEqual(form.$('.o_data_row').length, 1, + "should not have dropped record in the editable list"); + assert.strictEqual($('td.o_data_cell').first().text(), "entry", + "should still have the correct displayed name"); + assert.strictEqual($('td.o_data_cell.o_required_modifier').text(), "", + "should still have empty string in the required field"); + + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + }); + + QUnit.test('item dropped on discard with empty required field with "Add an item" (invalid on "ADD")', function (assert) { + // when a record in a list is added with "Add an item", it should + // always be dropped on discard if some required field are empty + // at the record creation. + assert.expect(6); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + }); + + // Click on "Add an item" + form.$('.o_field_x2many_list_row_add a').click(); + var charField = form.$('.o_field_widget.o_field_char[name="display_name"]'); + var requiredField = form.$('.o_field_widget.o_required_modifier[name="trululu"]'); + charField.val("some text"); + assert.strictEqual(charField.length, 1, + "should have a char field 'display_name' on this record"); + assert.notOk(charField.hasClass('o_required_modifier'), + "the char field should not be required on this record"); + assert.strictEqual(charField.val(), "some text", + "should have entered text in the char field on this record"); + assert.strictEqual(requiredField.length, 1, + "should have a required field 'trululu' on this record"); + assert.strictEqual(requiredField.val().trim(), "", + "should have empty string in the required field on this record"); + + // click on empty required field in editable list record + requiredField.click(); + // click off so that the required field still stay empty + $('body').click(); + + // record should be dropped + assert.strictEqual(form.$('.o_data_row').length, 0, + "should have dropped record in the editable list"); + + form.destroy(); + }); + + QUnit.test('item not dropped on discard with empty required field with "Add an item" (invalid on "UPDATE")', function (assert) { + // when a record in a list is added with "Add an item", it should + // be temporarily added to the list when it is valid (e.g. required + // fields are non-empty). If the record is updated so that the required + // field is empty, and it is discarded, then the record should not be + // dropped. + assert.expect(8); + + var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + }); + + assert.strictEqual(form.$('.o_data_row').length, 0, + "should initially not have any record in the list"); + + // Click on "Add an item" + form.$('.o_field_x2many_list_row_add a').click(); + assert.strictEqual(form.$('.o_data_row').length, 1, + "should have a temporary record in the list"); + + var $inputEditMode = form.$('.o_field_widget.o_required_modifier[name="trululu"] input'); + assert.strictEqual($inputEditMode.length, 1, + "should have a required field 'trululu' on this record"); + assert.strictEqual($inputEditMode.val(), "", + "should have empty string in the required field on this record"); + + // add something to required field and leave edit mode of the record + $inputEditMode.click(); + $('li.ui-menu-item').first().click(); + $('body').click(); // leave edit mode on the line + + var $inputReadonlyMode = form.$('.o_data_cell.o_required_modifier'); + assert.strictEqual(form.$('.o_data_row').length, 1, + "should not have dropped valid record when leaving edit mode"); + assert.strictEqual($inputReadonlyMode.text(), "first record", + "should have put some content in the required field on this record"); + + // remove the required field and leave edit mode of the record + $('.o_data_row').click(); // enter edit mode on the line + $inputEditMode.click(); + $inputEditMode.val(""); + $('body').click(); + + assert.strictEqual(form.$('.o_data_row').length, 1, + "should not have dropped record in the list on discard (invalid on UPDATE)"); + assert.strictEqual($inputReadonlyMode.text(), "first record", + "should keep previous valid required field content on this record"); + + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + }); + QUnit.test('list in form: default_get with x2many create', function (assert) { assert.expect(5); @@ -2172,6 +2546,43 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('x2many list sorted by many2one', function (assert) { + assert.expect(3); + + this.data.partner.records[0].p = [1, 2, 4]; + this.data.partner.fields.trululu.sortable = true; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + res_id: 1, + }); + + assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '124', + "should have correct order initially"); + + form.$('.o_list_view thead th:nth(1)').click(); + + assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '412', + "should have correct order (ASC)"); + + form.$('.o_list_view thead th:nth(1)').click(); + + assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '214', + "should have correct order (DESC)"); + + form.destroy(); + }); + QUnit.test('many2many list add *many* records, remove, re-add', function (assert) { assert.expect(5); @@ -2250,7 +2661,7 @@ QUnit.module('relational_fields', { $modal.find('thead input[type=checkbox]').click(); $modal.find('.btn.btn-sm.btn-primary.o_select_button').click(); - + pager_limit = form.$('.o_field_many2many.o_field_widget.o_field_x2many.o_field_x2many_list .o_pager_limit'); assert.equal(pager_limit.text(), '51', 'We should have 51 records in the m2m field'); @@ -2260,6 +2671,169 @@ QUnit.module('relational_fields', { QUnit.module('FieldOne2Many'); + QUnit.test('New record with a o2m also with 2 new records, ordered, and resequenced', function (assert) { + assert.expect(3); + + // Needed to have two new records in a single stroke + this.data.partner.onchanges = { + foo: function(obj) { + obj.p = [ + [5], + [0, 0, {trululu: false}], + [0, 0, {trululu: false}], + ] + } + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + viewOptions: { + mode: 'create', + }, + mockRPC: function (route, args) { + assert.step(args.method + ' ' + args.model) + return this._super(route, args); + }, + }); + + // change the int_field through drag and drop + // that way, we'll trigger the sorting and the name_get + // of the lines of "p" + testUtils.dragAndDrop( + form.$('.ui-sortable-handle').eq(1), + form.$('tbody tr').first(), + {position: 'top'} + ); + + // Only those two should have been called + // name_get on trululu would trigger an traceback + assert.verifySteps(['default_get partner', 'onchange partner']); + + form.destroy(); + }); + + QUnit.test('O2M List with pager, decoration and default_order: add and cancel adding', function (assert) { + assert.expect(3); + + // The decoration on the list implies that its condition will be evaluated + // against the data of the field (actual records *displayed*) + // If one data is wrongly formed, it will crash + // This test adds then cancels a record in a paged, ordered, and decorated list + // That implies prefetching of records for sorting + // and evaluation of the decoration against *visible records* + + this.data.partner.records[0].p = [2,4]; + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + form.$('.o_field_x2many_list .o_field_x2many_list_row_add a').click(); + + var $dataRows = form.$('.o_field_x2many_list .o_data_row'); + assert.equal($dataRows.length, 2, + 'There should be 2 rows'); + + var $expectedSelectedRow = $dataRows.eq(1); + var $actualSelectedRow = form.$('.o_selected_row'); + assert.equal($actualSelectedRow[0], $expectedSelectedRow[0], + 'The selected row should be the new one'); + + // Cancel Creation + var escapeKey = $.ui.keyCode.ESCAPE; + $actualSelectedRow.find('input').trigger( + $.Event('keydown', {which: escapeKey, keyCode: escapeKey})); + + $dataRows = form.$('.o_field_x2many_list .o_data_row'); + assert.equal($dataRows.length, 1, + 'There should be 1 row'); + + form.destroy(); + }); + + QUnit.test('O2M with parented m2o and domain on parent.m2o', function (assert) { + assert.expect(3); + + /* records in an o2m can have a m2o pointing to themselves + * in that case, a domain evaluation on that field followed by name_search + * shouldn't send virtual_ids to the server + */ + + this.data.turtle.fields.parent_id = {string: "Parent", type: "many2one", relation: 'turtle'}; + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
' + + '' + + '' + + '' + + '' + + '' + + '
', + archs: { + 'turtle,false,form': '
', + }, + + mockRPC: function(route, args) { + if (route === '/web/dataset/call_kw/turtle/name_search') { + // We are going to pass twice here + // First time, we really have nothing + // Second time, a virtual_id has been created + assert.deepEqual(args.kwargs.args, [['id', 'in', []]]); + } + return this._super(route, args); + } + }); + + form.$('.o_field_x2many_list[name=turtles] .o_field_x2many_list_row_add a').click(); + var $modal = $('.modal-content'); + + var $turtleParent = $modal.find('.o_field_many2one input'); + var $dropdown = $turtleParent.autocomplete('widget'); + + $turtleParent.click(); + + $dropdown.find('li.o_m2o_dropdown_option:contains(Create)').first().mouseenter().click(); + + $modal = $('.modal-content'); + + $modal.eq(1).find('.modal-footer .btn-primary').eq(0).click(); // Confirm new Record + $modal.eq(0).find('.modal-footer .btn-primary').eq(1).click(); // Save & New + + assert.equal(form.$('.o_data_row').length, 1, + 'The main record should have the new record in its o2m'); + + $modal = $('.modal-content'); + $modal.find('.o_field_many2one input').click(); + + form.destroy(); + }); + QUnit.test('one2many list editable with cell readonly modifier', function (assert) { assert.expect(4); @@ -4169,7 +4743,6 @@ QUnit.module('relational_fields', { form.destroy(); }); - QUnit.test('one2many list (non editable): edition', function (assert) { assert.expect(12); @@ -5038,6 +5611,32 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('one2many and default_get (with date)', function (assert) { + assert.expect(1); + + this.data.partner.fields.p.default = [ + [0, false, {date: '2017-10-08'}], + ]; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
' + + '' + + '' + + '' + + '' + + '' + + '
', + }); + + assert.strictEqual(form.$('.o_data_cell').text(), '10/08/2017', + "should correctly display the date"); + + form.destroy(); + }); + QUnit.test('one2many and onchange (with integer)', function (assert) { assert.expect(4); @@ -5597,7 +6196,7 @@ QUnit.module('relational_fields', { rpcCount++; if (args.method === 'write') { assert.deepEqual(args.args[1].p, [[0, args.args[1].p[0][1], { - int_field: 123, product_id: 41 + foo: false, int_field: 123, product_id: 41, }]]); } return this._super(route, args); @@ -6975,7 +7574,7 @@ QUnit.module('relational_fields', { }); QUnit.test('nested x2many default values', function (assert) { - assert.expect(2); + assert.expect(3); var form = createView({ View: FormView, @@ -6990,18 +7589,23 @@ QUnit.module('relational_fields', { '', mockRPC: function (route, args) { if (args.model === 'partner' && args.method === 'default_get') { - return $.when({turtles: [[0, 0, { - partner_ids: [[6, 0, [4]]], - }]]}); + return $.when({ + turtles: [ + [0, 0, {partner_ids: [[6, 0, [4]]]}], + [0, 0, {partner_ids: [[6, 0, [1]]]}], + ], + }); } return this._super.apply(this, arguments); }, }); - assert.strictEqual(form.$('.o_list_view .o_field_many2manytags[name="partner_ids"] .badge').length, 1, - "m2mtags should contain one tag"); + assert.strictEqual(form.$('.o_list_view .o_data_row').length, 2, + "one2many list should contain 2 rows"); + assert.strictEqual(form.$('.o_list_view .o_field_many2manytags[name="partner_ids"] .badge').length, 2, + "m2mtags should contain two tags"); assert.strictEqual(form.$('.o_list_view .o_field_many2manytags[name="partner_ids"] .o_badge_text').text(), - 'aaa', "tag name should have been correctly loaded"); + 'aaafirst record', "tag names should have been correctly loaded"); form.destroy(); }); @@ -8666,6 +9270,208 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('add a line, edit it and "Save & New"', function (assert) { + assert.expect(5); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '', + }); + + assert.strictEqual(form.$('.o_data_row').length, 0, + "there should be no record in the relation"); + + // add a new record + form.$('.o_field_x2many_list_row_add a').click(); + $('.modal .o_field_widget').val('new record').trigger('input'); + $('.modal .modal-footer .btn-primary:first').click(); // Save & Close + + assert.strictEqual(form.$('.o_data_row .o_data_cell').text(), 'new record', + "should display the new record"); + + // reopen freshly added record and edit it + form.$('.o_data_row .o_data_cell').click(); + $('.modal .o_field_widget').val('new record edited').trigger('input'); + + // save it, and choose to directly create another record + $('.modal .modal-footer .btn-primary:nth(1)').click(); // Save & New + + assert.strictEqual($('.modal').length, 1, + "the model should still be open"); + assert.strictEqual($('.modal .o_field_widget').text(), '', + "should have cleared the input"); + + $('.modal .o_field_widget').val('another new record').trigger('input'); + $('.modal .modal-footer .btn-primary:first').click(); // Save & Close + + assert.strictEqual(form.$('.o_data_row .o_data_cell').text(), + 'new record editedanother new record', "should display the two records"); + + form.destroy(); + }); + + QUnit.test('one2many form view with action button', function (assert) { + // once the action button is clicked, the record is reloaded (via the + // on_close handler, executed because the python method does not return + // any action, or an ir.action.act_window_close) ; this test ensures that + // it reloads the fields of the opened view (i.e. the form in this case). + assert.expect(7); + + var data = this.data; + data.partner.records[0].p = [2]; + + var form = createView({ + View: FormView, + model: 'partner', + data: data, + res_id: 1, + arch: '
' + + '' + + '' + + '' + + ' @@ -147,8 +147,9 @@
- -
+ + +
diff --git a/addons/web_editor/static/tests/web_editor_tests.js b/addons/web_editor/static/tests/web_editor_tests.js index 3a0b0344..06dd0989 100644 --- a/addons/web_editor/static/tests/web_editor_tests.js +++ b/addons/web_editor/static/tests/web_editor_tests.js @@ -211,7 +211,7 @@ QUnit.test('html_frame does not crash when saving in readonly', function (assert if (_.str.startsWith(route, '/logo')) { // manually call the callback to simulate that the iframe has // been loaded (note: just the content, not the editor) - window.odoo[$.deparam(route).callback + '_content'].call(); + window.flectra[$.deparam(route).callback + '_content'].call(); return $.when(); } return this._super.apply(this, arguments); @@ -248,7 +248,7 @@ QUnit.test('html_frame does not crash when saving in edit mode (editor not loade if (_.str.startsWith(route, '/logo')) { // manually call the callback to simulate that the iframe has // been partially loaded (just the content, not the editor) - window.odoo[$.deparam(route).callback + '_content'](); + window.flectra[$.deparam(route).callback + '_content'](); return $.when(); } return this._super.apply(this, arguments); diff --git a/addons/web_planner/static/src/js/web_planner_backend.js b/addons/web_planner/static/src/js/web_planner_backend.js index 7b2d24c0..5eb4acca 100644 --- a/addons/web_planner/static/src/js/web_planner_backend.js +++ b/addons/web_planner/static/src/js/web_planner_backend.js @@ -16,6 +16,7 @@ var PlannerLauncher = planner.PlannerLauncher.extend({ return this._rpc({ model: 'web.planner', method: 'search_read', + kwargs: {context: session.user_context}, }) .then(function (records) { _.each(records, function (planner) { diff --git a/addons/web_planner/static/src/js/web_planner_common.js b/addons/web_planner/static/src/js/web_planner_common.js index 5be077ef..c7ff92e3 100644 --- a/addons/web_planner/static/src/js/web_planner_common.js +++ b/addons/web_planner/static/src/js/web_planner_common.js @@ -43,10 +43,6 @@ var PlannerDialog = Dialog.extend({ e.preventDefault(); this._display_page($(e.currentTarget).attr("href").replace("#", "")); }, - "click a[href^=\"#show_enterprise\"]": function (e) { - e.preventDefault(); - this.show_enterprise(); - }, }, init: function (parent, options, planner) { this._super.apply(this, arguments); @@ -363,36 +359,6 @@ var PlannerDialog = Dialog.extend({ args: [this.planner.id, {'data': JSON.stringify(this.planner.data), 'progress': this.planner.progress}], }); }, - show_enterprise: function () { - var buttons = [{ - text: _t("Upgrade now"), - classes: 'btn-primary', - close: true, - click: function () { - rpc.query({ - model: "res.users", - method: "search_count", - args: [[["share", "=", false]]], - }) - .then(function (data) { - window.location = "https://www.flectra.com/flectra-enterprise/upgrade?utm_medium=community_upgrade&num_users=" + data; - }); - }, - }, { - text: _t("Cancel"), - close: true, - }]; - var dialog = new Dialog(this, { - size: 'medium', - buttons: buttons, - $content: $('
', { - html: QWeb.render('EnterpriseUpgrade'), - }), - title: _t("Flectra Enterprise"), - }).open(); - - return dialog; - }, }); var PlannerLauncher = Widget.extend({ diff --git a/addons/web_settings_dashboard/__manifest__.py b/addons/web_settings_dashboard/__manifest__.py index 8b6c84bb..80f91c2a 100644 --- a/addons/web_settings_dashboard/__manifest__.py +++ b/addons/web_settings_dashboard/__manifest__.py @@ -2,14 +2,14 @@ # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. { - 'name': 'Odoo Settings Dashboard', + 'name': 'Flectra Settings Dashboard', 'author': 'Odoo S.A.', 'version': '1.0', 'summary': 'Quick actions for installing new app, adding users, completing planners, etc.', 'category': 'Extra Tools', 'description': """ -Odoo dashboard +Flectra dashboard ============== * Quick access to install apps * Quick users add diff --git a/addons/web_settings_dashboard/static/src/js/dashboard.js b/addons/web_settings_dashboard/static/src/js/dashboard.js index 791b9396..f412d53e 100644 --- a/addons/web_settings_dashboard/static/src/js/dashboard.js +++ b/addons/web_settings_dashboard/static/src/js/dashboard.js @@ -231,7 +231,6 @@ var DashboardApps = Widget.extend({ events: { 'click .o_browse_apps': 'on_new_apps', - 'click .o_confirm_upgrade': 'confirm_upgrade', }, init: function(parent, data){ @@ -242,18 +241,11 @@ var DashboardApps = Widget.extend({ start: function() { this._super.apply(this, arguments); - if (flectra.db_info && _.last(flectra.db_info.server_version_info) !== 'e') { - $(QWeb.render("DashboardEnterprise")).appendTo(this.$el); - } }, on_new_apps: function(){ this.do_action('base.open_module_tree'); }, - - confirm_upgrade: function() { - framework.redirect("https://www.flectra.com/flectra-enterprise/upgrade?num_users=" + (this.data.enterprise_users || 1)); - }, }); var DashboardShare = Widget.extend({ @@ -268,7 +260,7 @@ var DashboardShare = Widget.extend({ init: function(parent, data){ this.data = data; this.parent = parent; - this.share_url = 'https://www.flectra.com'; + this.share_url = 'https://www.flectrahq.com'; this.share_text = encodeURIComponent("I am using #Flectra - Awesome open source business apps."); }, @@ -283,7 +275,7 @@ var DashboardShare = Widget.extend({ }, share_linkedin: function(){ - var popup_url = _.str.sprintf('http://www.linkedin.com/shareArticle?mini=true&url=%s&title=I am using flectra&summary=%s&source=www.flectra.com', encodeURIComponent(this.share_url), this.share_text); + var popup_url = _.str.sprintf('http://www.linkedin.com/shareArticle?mini=true&url=%s&title=I am using flectra&summary=%s&source=www.flectrahq.com', encodeURIComponent(this.share_url), this.share_text); this.sharer(popup_url); }, diff --git a/addons/web_settings_dashboard/static/src/xml/dashboard.xml b/addons/web_settings_dashboard/static/src/xml/dashboard.xml index 2351ab90..c158cfc1 100644 --- a/addons/web_settings_dashboard/static/src/xml/dashboard.xml +++ b/addons/web_settings_dashboard/static/src/xml/dashboard.xml @@ -105,7 +105,7 @@
- Need more help? Browse the documentation. + Need more help? Browse the documentation.
@@ -179,20 +179,6 @@
- -
-
- -
-
-
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 8fc8d1b3..ae31fec9 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -18,8 +18,9 @@ from flectra import http, models, fields, _ from flectra.http import request from flectra.tools import pycompat, OrderedSet from flectra.addons.http_routing.models.ir_http import slug, _guess_mimetype -from flectra.addons.web.controllers.main import WebClient, Binary, Home +from flectra.addons.web.controllers.main import WebClient, Binary from flectra.addons.portal.controllers.portal import pager as portal_pager +from flectra.addons.portal.controllers.web import Home logger = logging.getLogger(__name__) @@ -306,17 +307,6 @@ class Website(Home): modules.button_immediate_upgrade() return request.redirect(redirect) - @http.route('/website/translations', type='json', auth="public", website=True) - def get_website_translations(self, lang, mods=None): - Modules = request.env['ir.module.module'].sudo() - modules = Modules.search([ - '|', ('name', 'ilike', 'website'), ('name', '=', 'web_editor'), - ('state', '=', 'installed') - ]).mapped('name') - if mods: - modules += mods - return WebClient().translations(mods=modules, lang=lang) - @http.route(['/website/publish'], type='json', auth="public", website=True) def publish(self, id, object): Model = request.env[object] diff --git a/addons/website/data/website_demo.xml b/addons/website/data/website_demo.xml index 5b189e75..7d3c68ce 100644 --- a/addons/website/data/website_demo.xml +++ b/addons/website/data/website_demo.xml @@ -130,5 +130,118 @@ response = request.render("website.template_partner_comment", { Website 0.0.0.0 0.0.0.0 + + + Home + qweb + website2.homepage + + + +
+ +
+
+
+
+
+ + True + / + + + + + + Contact Us + qweb + website2.contactus + + + +
+
+
+

Contact us

+
+
+
+
+

Contact us about anything related to our company or services.

+

We'll do our best to get back to you as soon as possible.

+
+
+ +
+
+ +
+
+
+
+
+ + + + + + True + /contactus + + + + + + + + + + Top Menu + + + + Home + / + + 10 + + + + + Contact us + /contactus + + 60 + + + diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index be0a3ebd..000aaaa4 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -6,6 +6,7 @@ import traceback import os import unittest +import pytz import werkzeug import werkzeug.routing import werkzeug.utils @@ -17,7 +18,7 @@ from flectra.http import request from flectra.tools import config from flectra.exceptions import QWebException from flectra.tools.safe_eval import safe_eval -from flectra.osv.expression import FALSE_DOMAIN +from flectra.osv.expression import FALSE_DOMAIN, OR from flectra.addons.http_routing.models.ir_http import ModelConverter, _guess_mimetype from flectra.addons.portal.controllers.portal import _build_url_w_params @@ -74,6 +75,10 @@ class Http(models.AbstractModel): context = {} if not request.context.get('tz'): context['tz'] = request.session.get('geoip', {}).get('time_zone') + try: + pytz.timezone(context['tz'] or '') + except pytz.UnknownTimeZoneError: + context.pop('tz') request.website = request.env['website'].get_current_website() # can use `request.env` since auth methods are called context['website_id'] = request.website.id @@ -104,6 +109,11 @@ class Http(models.AbstractModel): return request.website.default_lang_id return super(Http, cls)._get_default_lang() + @classmethod + def _get_translation_frontend_modules_domain(cls): + domain = super(Http, cls)._get_translation_frontend_modules_domain() + return OR([domain, [('name', 'ilike', 'website')]]) + @classmethod def _serve_page(cls): req_page = request.httprequest.path diff --git a/addons/website/models/ir_model.py b/addons/website/models/ir_model.py index c1f32040..0dadd9bf 100644 --- a/addons/website/models/ir_model.py +++ b/addons/website/models/ir_model.py @@ -13,8 +13,8 @@ class IrModel(models.Model): @api.multi def unlink(self): - self.env.cr.execute( - "DELETE FROM ir_model_fields WHERE name='website_id'") + self.env.cr.execute("DELETE FROM ir_model_fields WHERE name='website_id'") + self.env.cr.execute("DELETE FROM res_config_settings WHERE website_id IS NOT NULL") return super(IrModel, self).unlink() diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index c6f3b7dc..ef98b608 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -1,93 +1,51 @@ # -*- coding: utf-8 -*- # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. - -import ast +import re +from collections import OrderedDict from flectra import models from flectra.http import request +re_background_image = re.compile(r"(background-image\s*:\s*url\(\s*['\"]?\s*)([^)'\"]+)") + + class QWeb(models.AbstractModel): """ QWeb object for rendering stuff in the website context """ _inherit = 'ir.qweb' URL_ATTRS = { - 'form': 'action', - 'a': 'href', + 'form': 'action', + 'a': 'href', + 'link': 'href', + 'script': 'src', + 'img': 'src', } - CDN_TRIGGERS = { - 'link': 'href', - 'script': 'src', - 'img': 'src', - } - - def _get_asset(self, xmlid, options, css=True, js=True, debug=False, async=False, values=None): - website = getattr(request, 'website', None) if request else None - if website and website.cdn_activated: - values = dict(values or {}, url_for=website.get_cdn_url) - return super(QWeb, self)._get_asset(xmlid, options, css, js, debug, async, values) - - def _website_build_attribute(self, tagName, name, value, options, values): - """ Compute the value of an attribute while rendering the template. """ - if name == self.URL_ATTRS.get(tagName) and values.get('url_for'): - return values.get('url_for')(value or '') - elif request and getattr(request, 'website', None) and request.website.cdn_activated and (name == self.URL_ATTRS.get(tagName) or name == self.CDN_TRIGGERS.get(tagName)): - return request.website.get_cdn_url(value or '') - return value - - def _wrap_build_attributes(self, el, items, options): - """ Map items corresponding to URL and CDN attributes to an ast expression. """ - if options.get('rendering_bundle'): - return items - - url_att = self.URL_ATTRS.get(el.tag) - cdn_att = self.CDN_TRIGGERS.get(el.tag) - - def process(item): - if isinstance(item, tuple) and (item[0] in (url_att, cdn_att)): - return (item[0], ast.Call( - func=ast.Attribute( - value=ast.Name(id='self', ctx=ast.Load()), - attr='_website_build_attribute', - ctx=ast.Load() - ), - args=[ - ast.Str(el.tag), - ast.Str(item[0]), - item[1], - ast.Name(id='options', ctx=ast.Load()), - ast.Name(id='values', ctx=ast.Load()), - ], keywords=[], - starargs=None, kwargs=None - )) - else: - return item - - return [process(it) for it in items] - - def _compile_static_attributes(self, el, options): - items = super(QWeb, self)._compile_static_attributes(el, options) - return self._wrap_build_attributes(el, items, options) - - def _compile_dynamic_attributes(self, el, options): - items = super(QWeb, self)._compile_dynamic_attributes(el, options) - return self._wrap_build_attributes(el, items, options) - - # method called by computing code - - def _get_dynamic_att(self, tagName, atts, options, values): - atts = super(QWeb, self)._get_dynamic_att(tagName, atts, options, values) - if options.get('rendering_bundle'): + def _post_processing_att(self, tagName, atts, options): + if atts.get('data-no-post-process'): return atts - for name, value in atts.items(): - atts[name] = self._website_build_attribute(tagName, name, value, options, values) - return atts - def _is_static_node(self, el): - url_att = self.URL_ATTRS.get(el.tag) - cdn_att = self.CDN_TRIGGERS.get(el.tag) - return super(QWeb, self)._is_static_node(el) and \ - (not url_att or not el.get(url_att)) and \ - (not cdn_att or not el.get(cdn_att)) + atts = super(QWeb, self)._post_processing_att(tagName, atts, options) + + if options.get('inherit_branding') or options.get('rendering_bundle') or \ + options.get('edit_translations') or options.get('debug') or (request and request.debug): + return atts + + website = request and getattr(request, 'website', None) + if not website and options.get('website_id'): + website = self.env['website'].browse(options['website_id']) + + if not website or not website.cdn_activated: + return atts + + name = self.URL_ATTRS.get(tagName) + if name and name in atts: + atts = OrderedDict(atts) + atts[name] = website.get_cdn_url(atts[name]) + if isinstance(atts.get('style'), str) and 'background-image' in atts['style']: + atts = OrderedDict(atts) + atts['style'] = re_background_image.sub(lambda m: '%s%s' % (m.group(1), website.get_cdn_url(m.group(2))), atts['style']) + + return atts diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 1bb4a949..db2237e5 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -102,6 +102,10 @@ class Website(models.Model): @api.multi def write(self, values): self._get_languages.clear_cache(self) + result = super(Website, self).write(values) + if 'cdn_activated' in values or 'cdn_url' in values or 'cdn_filters' in values: + # invalidate the caches from static node at compile time + self.env['ir.qweb'].clear_caches() if values.get('website_code') or \ (values.get('is_default_website') and self != self.env.ref('website.default_website')): @@ -112,7 +116,7 @@ class Website(models.Model): '- If above action is not properly done ' 'then it will break your current ' 'multi website feature.')) - return super(Website, self).write(values) + return result @api.model def create(self, values): @@ -660,15 +664,15 @@ class Website(models.Model): size = '' if size is None else '/%s' % size return '/web/image/%s/%s/%s%s?unique=%s' % (record._name, record.id, field, size, sha) - @api.model def get_cdn_url(self, uri): - # Currently only usable in a website_enable request context - if request and request.website and not request.debug and request.website.user_id.id == request.uid: - cdn_url = request.website.cdn_url - cdn_filters = (request.website.cdn_filters or '').splitlines() - for flt in cdn_filters: - if flt and re.match(flt, uri): - return urls.url_join(cdn_url, uri) + self.ensure_one() + if not uri: + return '' + cdn_url = self.cdn_url + cdn_filters = (self.cdn_filters or '').splitlines() + for flt in cdn_filters: + if flt and re.match(flt, uri): + return urls.url_join(cdn_url, uri) return uri @api.model @@ -989,9 +993,10 @@ class Menu(models.Model): for menu in data['data']: menu_id = self.browse(menu['id']) # if the url match a website.page, set the m2o relation - page = self.env['website.page'].search([('url', '=', menu['url'])], limit=1) + page = self.env['website.page'].search(['|', ('url', '=', menu['url']), ('url', '=', '/' + menu['url'])], limit=1) if page: menu['page_id'] = page.id + menu['url'] = page.url elif menu_id.page_id: menu_id.page_id.write({'url': menu['url']}) if 'is_homepage' in menu: diff --git a/addons/website/static/src/img/flectra.jpg b/addons/website/static/src/img/flectra.jpg index e9c5ac231b11c17dd26dc96bffe82a90031cb46b..0b7c74fe029c78db576815f0e91f192226b5482c 100644 GIT binary patch literal 93072 zcmeFa2Ut|gvM{;;B`85aR1g6PqLOoF$Uy`oCjns?G7K<83F8(8Q6vij0wN$m0g)&m zqgy2h$w7kToMs3P48y+$)a^d!+;i^#?s@Ni-#fc;tyNuJU0q$PyH{6r_qac>KTge{ z>hEL^0NUEXWdH!k0ZJkOAORtwBZM2#Axx|Q!o&wKAuXMV^bijagLt~{Fqn~u;X4dc z5itQr2`s=Xo9OIM_$ATBU-AkOH~=i*RYoLy0G|Zmu5c&dpm-3T16iW3o`S-{LQlWfZ+{;Eo)Z5k^9b;iM?VX6~_;D&~suR@ICr(mR zQ=cT5kO4xBk=^-)`&=mj}RXvBPBmdLMZ|!(vloGPbYL#QO|~+-SanL z(vz{7B}yEe4EpbFMMS-BcPf){#Tl%PuR{@Hr=GnIy`U0rXs7ynmbdunE~5z;y7bP6 zZl6hv8h1kW-Lgj?d!{yW%0Kl^ZyMYCh9y3)sPCKEl2A8s@C#4Mt!(I@-KGVIi9u

CoPL}pXF~RW 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%0DKB*orgG&{{64`RB_J@!Uu`f)buDp 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 TT|G0_~e!6~b^Yji!U!k!Y;w0{c4 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 LXsfVIy$}D{(F=1! diff --git a/addons/website/static/src/js/backend/dashboard.js b/addons/website/static/src/js/backend/dashboard.js index a3f8b3e3..9ebbcd9e 100644 --- a/addons/website/static/src/js/backend/dashboard.js +++ b/addons/website/static/src/js/backend/dashboard.js @@ -293,6 +293,7 @@ var Dashboard = Widget.extend(ControlPanelMixin, { self.handle_analytics_auth($analytics_components); gapi.analytics.auth.on('signIn', function() { + delete window.onOriginError; self.handle_analytics_auth($analytics_components); }); diff --git a/addons/website/static/src/js/menu/new_content.js b/addons/website/static/src/js/menu/new_content.js index d3576407..a2ac21f6 100644 --- a/addons/website/static/src/js/menu/new_content.js +++ b/addons/website/static/src/js/menu/new_content.js @@ -15,6 +15,7 @@ var NewContentMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }), events: _.extend({}, websiteNavbarData.WebsiteNavbarActionWidget.prototype.events || {}, { 'click > a': '_onMenuToggleClick', + 'click > #o_new_content_menu_choices': '_onBackgroundClick', }), /** @@ -73,6 +74,15 @@ var NewContentMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ ev.preventDefault(); this.$newContentMenuChoices.toggleClass('o_hidden'); }, + /** + * Called when a click outside the menu's options occurs -> Closes the menu + * + * @private + * @param {Event} ev + */ + _onBackgroundClick: function (ev) { + this.$newContentMenuChoices.addClass('o_hidden'); + }, }); websiteNavbarData.websiteNavbarRegistry.add(NewContentMenu, '.o_new_content_menu'); diff --git a/addons/website/static/src/less/website.ui.components.less b/addons/website/static/src/less/website.ui.components.less index a9053eee..ed3a4217 100644 --- a/addons/website/static/src/less/website.ui.components.less +++ b/addons/website/static/src/less/website.ui.components.less @@ -44,7 +44,7 @@ body .modal { .o-w-preserve-modals(); .o-w-preserve-tabs(); - button.close { + &:not(.oe_mobile_preview) button.close { .o-w-close-icon(12px); margin-right: -2px; } @@ -481,4 +481,4 @@ body .modal { opacity: 0.5; } } -} \ No newline at end of file +} diff --git a/addons/website/tests/__init__.py b/addons/website/tests/__init__.py index f4befaea..b2472c38 100644 --- a/addons/website/tests/__init__.py +++ b/addons/website/tests/__init__.py @@ -2,6 +2,7 @@ # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. from . import test_converter +from . import test_qweb from . import test_crawl from . import test_ui from . import test_views diff --git a/addons/website/tests/template_qweb_test.xml b/addons/website/tests/template_qweb_test.xml new file mode 100644 index 00000000..be1d02b7 --- /dev/null +++ b/addons/website/tests/template_qweb_test.xml @@ -0,0 +1,36 @@ + + + + + + + \ No newline at end of file diff --git a/addons/website/tests/test_qweb.py b/addons/website/tests/test_qweb.py new file mode 100644 index 00000000..dc33c619 --- /dev/null +++ b/addons/website/tests/test_qweb.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import re + +from flectra import tools +from flectra.modules.module import get_module_resource +from flectra.tests.common import TransactionCase + + +class TestQweb(TransactionCase): + def _load(self, module, *args): + tools.convert_file(self.cr, 'website', + get_module_resource(module, *args), + {}, 'init', False, 'test', self.registry._assertion_report) + + def test_qweb_cdn(self): + self._load('website', 'tests', 'template_qweb_test.xml') + + website = self.env['website'].browse(1) + website.write({ + "cdn_activated": True, + "cdn_url": "http://test.cdn" + }) + + demo = self.env['res.users'].search([('login', '=', 'demo')])[0] + demo.write({"signature": ''' + span + '''}) + + demo_env = self.env(user=demo) + + html = demo_env['ir.qweb'].render('website.test_template', {"user": demo}, website_id= website.id) + html = html.strip().decode('utf8') + html = re.sub(r'\?unique=[^"]+', '', html).encode('utf8') + + attachments = demo_env['ir.attachment'].search([('url', '=like', '/web/content/%-%/website.test_bundle.%')]) + self.assertEqual(len(attachments), 2) + self.assertEqual(html, (""" + + + + + + + + + + + + + + x + x + xxx +

+ span +
+
+ +""" % { + "js": attachments[0].url, + "css": attachments[1].url, + "user_id": demo.id, + }).encode('utf8')) diff --git a/addons/website/views/res_config_settings_views.xml b/addons/website/views/res_config_settings_views.xml index 8edf707a..03beb024 100644 --- a/addons/website/views/res_config_settings_views.xml +++ b/addons/website/views/res_config_settings_views.xml @@ -10,6 +10,7 @@
+

Website

diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 90aa9c54..65a87ab9 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -74,7 +74,7 @@ -
  • diff --git a/addons/website_blog/models/website_blog.py b/addons/website_blog/models/website_blog.py index 786ca6d2..3eb74fd9 100644 --- a/addons/website_blog/models/website_blog.py +++ b/addons/website_blog/models/website_blog.py @@ -172,10 +172,7 @@ class BlogPost(models.Model): blog_post.teaser = blog_post.teaser_manual else: content = html2plaintext(blog_post.content).replace('\n', ' ') - blog_post.teaser = ' '.join(itertools.islice( - (c for c in content.split(' ') if c), - 50 - )) + '...' + blog_post.teaser = content[:150] + '...' @api.multi def _set_teaser(self): diff --git a/addons/website_blog/static/src/js/website_blog.editor.js b/addons/website_blog/static/src/js/website_blog.editor.js index 9d05962d..54c2098d 100644 --- a/addons/website_blog/static/src/js/website_blog.editor.js +++ b/addons/website_blog/static/src/js/website_blog.editor.js @@ -132,7 +132,11 @@ options.registry.blog_cover = options.Class.extend({ this.$image.css("background-image", ""); }, change: function (previewMode, value, $li) { - var $image = $("", {src: this.$image.css("background-image")}); + var $image = $(""); + var background = this.$image.css("background-image"); + if (background && background !== "none") { + $image.attr('src', background.match(/^url\(["']?(.+?)["']?\)$/)[1]); + } var editor = new widget.MediaDialog(this, {only_images: true}, $image, $image[0]).open(); editor.on("save", this, function (event, img) { diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml index 3d617341..94790ae8 100644 --- a/addons/website_blog/views/website_blog_templates.xml +++ b/addons/website_blog/views/website_blog_templates.xml @@ -101,6 +101,7 @@ +
    diff --git a/addons/website_crm_phone_validation/controllers/website_form.py b/addons/website_crm_phone_validation/controllers/website_form.py index c614f235..7c8d57f4 100644 --- a/addons/website_crm_phone_validation/controllers/website_form.py +++ b/addons/website_crm_phone_validation/controllers/website_form.py @@ -4,8 +4,6 @@ from flectra.addons.website_form.controllers.main import WebsiteForm from flectra.http import request, route -import json - class WebsiteForm(WebsiteForm): diff --git a/addons/website_event_sale/controllers/main.py b/addons/website_event_sale/controllers/main.py index 2915685a..1bafb357 100644 --- a/addons/website_event_sale/controllers/main.py +++ b/addons/website_event_sale/controllers/main.py @@ -39,7 +39,7 @@ class WebsiteEventSaleController(WebsiteEventController): # free tickets -> order with amount = 0: auto-confirm, no checkout if not order.amount_total: order.action_confirm() # tde notsure: email sending ? - attendees = request.env['event.registration'].browse(list(attendee_ids)) + attendees = request.env['event.registration'].browse(list(attendee_ids)).sudo() # clean context and session, then redirect to the confirmation page request.website.sale_reset() return request.render("website_event.registration_complete", { diff --git a/addons/website_event_sale/static/src/js/website.tour.event_sale.js b/addons/website_event_sale/static/src/js/website.tour.event_sale.js index 16091d10..be44dc57 100644 --- a/addons/website_event_sale/static/src/js/website.tour.event_sale.js +++ b/addons/website_event_sale/static/src/js/website.tour.event_sale.js @@ -92,6 +92,7 @@ tour.register('event_buy_tickets', { { content: "Last step", trigger: '.oe_website_sale:contains("Thank you for your order")', + timeout: 30000, } ] ); diff --git a/addons/website_event_sale/tests/test_ui.py b/addons/website_event_sale/tests/test_ui.py index 87bf7de4..30213c07 100644 --- a/addons/website_event_sale/tests/test_ui.py +++ b/addons/website_event_sale/tests/test_ui.py @@ -12,7 +12,7 @@ class TestUi(flectra.tests.HttpCase): # - that main demo company is gelocated in US # - that this test awaits for hardcoded USDs amount # we have to force company currency as USDs only for this test - self.env.ref('base.main_company').write({'currency_id': self.env.ref('base.USD').id}) + self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [self.env.ref('base.USD').id, self.env.ref('base.main_company').id]) self.phantom_js("/", "flectra.__DEBUG__.services['web_tour.tour'].run('event_buy_tickets')", "flectra.__DEBUG__.services['web_tour.tour'].tours.event_buy_tickets.ready", login="admin") def test_demo(self): diff --git a/addons/website_event_track/views/event_track_templates.xml b/addons/website_event_track/views/event_track_templates.xml index 69d293f1..dfa41b83 100644 --- a/addons/website_event_track/views/event_track_templates.xml +++ b/addons/website_event_track/views/event_track_templates.xml @@ -50,8 +50,8 @@
    - - + +
    diff --git a/addons/website_form/controllers/main.py b/addons/website_form/controllers/main.py index 43d8ec0c..bff88d26 100644 --- a/addons/website_form/controllers/main.py +++ b/addons/website_form/controllers/main.py @@ -112,6 +112,7 @@ class WebsiteForm(http.Controller): 'record': {}, # Values to create record 'attachments': [], # Attached files 'custom': '', # Custom fields values + 'meta': '', # Add metadata if enabled } authorized_fields = model.sudo()._get_form_writable_fields() diff --git a/addons/website_form/static/src/js/website_form.js b/addons/website_form/static/src/js/website_form.js index 7aa3303f..1f358742 100644 --- a/addons/website_form/static/src/js/website_form.js +++ b/addons/website_form/static/src/js/website_form.js @@ -20,7 +20,11 @@ flectra.define('website_form.animation', function (require) { return $.when(this._super.apply(this, arguments), def); }, - start: function () { + start: function (editable_mode) { + if (editable_mode) { + this.stop(); + return; + } var self = this; this.templates_loaded = ajax.loadXML('/website_form/static/src/xml/website_form.xml', qweb); this.$target.find('.o_website_form_send').on('click',function (e) {self.send(e);}); diff --git a/addons/website_livechat/controllers/main.py b/addons/website_livechat/controllers/main.py index 70e1107e..158d6d07 100644 --- a/addons/website_livechat/controllers/main.py +++ b/addons/website_livechat/controllers/main.py @@ -20,13 +20,17 @@ class WebsiteLivechat(http.Controller): @http.route('/livechat/channel/', type='http', auth='public', website=True) def channel_rating(self, channel, **kw): # get the last 100 ratings and the repartition per grade - ratings = request.env['rating.rating'].search([('res_model', '=', 'mail.channel'), ('res_id', 'in', channel.sudo().channel_ids.ids)], order='create_date desc', limit=100) - repartition = channel.sudo().channel_ids.rating_get_grades() + domain = [ + ('res_model', '=', 'mail.channel'), ('res_id', 'in', channel.sudo().channel_ids.ids), + ('consumed', '=', True), ('rating', '>=', 1), + ] + ratings = request.env['rating.rating'].search(domain, order='create_date desc', limit=100) + repartition = channel.sudo().channel_ids.rating_get_grades(domain=domain) # compute percentage percentage = dict.fromkeys(['great', 'okay', 'bad'], 0) for grade in repartition: - percentage[grade] = repartition[grade] * 100 / sum(repartition.values()) if sum(repartition.values()) else 0 + percentage[grade] = round(repartition[grade] * 100.0 / sum(repartition.values()), 1) if sum(repartition.values()) else 0 # the value dict to render the template values = { diff --git a/addons/website_mail_channel/static/src/js/website_mail_channel.snippet.js b/addons/website_mail_channel/static/src/js/website_mail_channel.snippet.js index d61d1975..151ca0f8 100644 --- a/addons/website_mail_channel/static/src/js/website_mail_channel.snippet.js +++ b/addons/website_mail_channel/static/src/js/website_mail_channel.snippet.js @@ -8,6 +8,7 @@ sAnimation.registry.follow_alias = sAnimation.Class.extend({ start: function () { var self = this; this.is_user = false; + var unsubscribePage = window.location.search.slice(1).split('&').indexOf("unsubscribe") >= 0; this._rpc({ route: '/groups/is_member', params: { @@ -19,6 +20,9 @@ sAnimation.registry.follow_alias = sAnimation.Class.extend({ self.is_user = data.is_user; self.email = data.email; self.$target.find('.js_mg_link').attr('href', '/groups/' + self.$target.data('id')); + if (unsubscribePage && self.is_user) { + self.$target.find(".js_mg_follow_form").remove(); + } self.toggle_subscription(data.is_member ? 'on' : 'off', data.email); self.$target.removeClass("hidden"); }); diff --git a/addons/website_mass_mailing/controllers/main.py b/addons/website_mass_mailing/controllers/main.py index 80ae4304..a711f746 100644 --- a/addons/website_mass_mailing/controllers/main.py +++ b/addons/website_mass_mailing/controllers/main.py @@ -11,7 +11,7 @@ class MassMailController(MassMailController): def mailing(self, mailing_id, email=None, res_id=None, **post): mailing = request.env['mail.mass_mailing'].sudo().browse(mailing_id) if mailing.exists(): - if mailing.mailing_model_name == 'mail.mass_mailing.contact': + if mailing.mailing_model_real == 'mail.mass_mailing.contact': contacts = request.env['mail.mass_mailing.contact'].sudo().search([('email', '=', email)]) return request.render('website_mass_mailing.page_unsubscribe', { 'contacts': contacts, diff --git a/addons/website_quote/__init__.py b/addons/website_quote/__init__.py index b8554620..96e094d9 100644 --- a/addons/website_quote/__init__.py +++ b/addons/website_quote/__init__.py @@ -3,3 +3,12 @@ from . import controllers from . import models + +from flectra.api import Environment, SUPERUSER_ID + +def _install_sale_payment(cr, registry): + env = Environment(cr, SUPERUSER_ID, {}) + env['ir.module.module'].search([ + ('name', '=', 'sale_payment'), + ('state', '=', 'uninstalled'), + ]).button_install() diff --git a/addons/website_quote/__manifest__.py b/addons/website_quote/__manifest__.py index 4b5d0961..cca3834a 100644 --- a/addons/website_quote/__manifest__.py +++ b/addons/website_quote/__manifest__.py @@ -25,4 +25,8 @@ ], 'qweb': ['static/src/xml/*.xml'], 'installable': True, + + # needed because dependencies can't be changed in a stable version + # TODO in master: add sale_payment to depends and remove this + 'post_init_hook': '_install_sale_payment', } diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py index b23b186c..ed6a0771 100644 --- a/addons/website_quote/controllers/main.py +++ b/addons/website_quote/controllers/main.py @@ -8,6 +8,7 @@ from flectra.http import request from flectra.addons.portal.controllers.portal import get_records_pager from flectra.addons.sale.controllers.portal import CustomerPortal from flectra.addons.portal.controllers.mail import _message_post_helper +from flectra.osv import expression class CustomerPortal(CustomerPortal): @@ -49,7 +50,7 @@ class sale_quote(http.Controller): if Order and request.session.get('view_quote_%s' % Order.id) != now and request.env.user.share: request.session['view_quote_%s' % Order.id] = now body = _('Quotation viewed by customer') - _message_post_helper(res_model='sale.order', res_id=Order.id, message=body, token=token, message_type='notification', subtype="mail.mt_note", partner_ids=Order.user_id.sudo().partner_id.ids) + _message_post_helper(res_model='sale.order', res_id=Order.id, message=body, token=Order.access_token, message_type='notification', subtype="mail.mt_note", partner_ids=Order.user_id.sudo().partner_id.ids) if not Order: return request.render('website.404') @@ -89,7 +90,11 @@ class sale_quote(http.Controller): } if order_sudo.require_payment or values['need_payment']: - acquirers = request.env['payment.acquirer'].sudo().search([('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)]) + domain = expression.AND([ + ['&', ('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)], + ['|', ('specific_countries', '=', False), ('country_ids', 'in', [order_sudo.partner_id.country_id.id])] + ]) + acquirers = request.env['payment.acquirer'].sudo().search(domain) values['form_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 'form' and acq.view_template_id] values['s2s_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 's2s' and acq.registration_view_template_id] diff --git a/addons/website_quote/views/website_quote_templates.xml b/addons/website_quote/views/website_quote_templates.xml index 01215fcb..46536fd8 100644 --- a/addons/website_quote/views/website_quote_templates.xml +++ b/addons/website_quote/views/website_quote_templates.xml @@ -662,7 +662,7 @@