Before this commit, the way mode was handled was not optimal. The end result was correct (the widget were properly created/displayed in edit/readonly as required), but useless work was done. In particular, if we have list/x2manys with widgets and modifiers, it could happen that widgets were created in edit mode, then destroyed and recreated in readonly mode. This could happen in some important views, for example, any view with a field many2many_tags with a readonly modifiers (pretty much all views handling taxes) In this commit, we add a 'editable' attribute to list renderer. This is necessary, because the list renderer is not actually editable when it is in a x2many in a form view which is in readonly mode. Also, we need to manage the distinction between the fact that a list view is editable, and the fact that some widgets are created in edit and other in readonly mode, depending on modifiers, and on which line is being edited. We also add a benchmark (courtesy of CHM) to be able to measure the performance impact of edit/readonly/onchange in a larger form view. Before this commit, running this form benchmark on my machine gave a number of 0.4 op/sec, and after, it increases to 1.26 op/sec, so a pretty large improvement.
723 lines
46 KiB
XML
723 lines
46 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<template id="web.less_helpers">
|
|
<link rel="stylesheet" type="text/less" href="/web/static/lib/bootstrap/less/variables.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/lib/bootstrap/less/mixins/vendor-prefixes.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/lib/bootstrap/less/mixins/buttons.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/lib/bootstrap/less/mixins/clearfix.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/lib/bootstrap/less/mixins/size.less"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/variables.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/utils.less"/>
|
|
</template>
|
|
|
|
<template id="web.assets_common" name="Common Assets (used in backend interface and website)">
|
|
<t t-call="web.less_helpers"/>
|
|
|
|
<link rel="stylesheet" type="text/css" href="/web/static/lib/jquery.ui/jquery-ui.css"/>
|
|
<link rel="stylesheet" type="text/css" href="/web/static/lib/fontawesome/css/font-awesome.css"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/lib/bootstrap-datetimepicker/src/less/_bootstrap-datetimepicker.less"/>
|
|
<link rel="stylesheet" type="text/css" href="/web/static/lib/select2/select2.css"/>
|
|
<link rel="stylesheet" type="text/css" href="/web/static/lib/select2-bootstrap-css/select2-bootstrap.css"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/fonts.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/navbar.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/mimetypes.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/modal.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/animation.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/rainbow.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/datepicker.less"/>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/es5-shim/es5-shim.min.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/underscore/underscore.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/underscore.string/lib/underscore.string.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/moment/moment.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/jquery/jquery.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.ui/jquery-ui.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery/jquery.browser.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.blockUI/jquery.blockUI.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.hotkeys/jquery.hotkeys.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.placeholder/jquery.placeholder.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.form/jquery.form.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.mjs.nestedSortable/jquery.mjs.nestedSortable.js"></script>
|
|
|
|
<script src="/web/static/lib/bootstrap/js/affix.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/alert.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/button.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/carousel.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/collapse.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/dropdown.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/modal.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/tooltip.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/popover.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/scrollspy.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/tab.js"></script>
|
|
<script src="/web/static/lib/bootstrap/js/transition.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/select2/select2.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/clipboard/clipboard.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/qweb/qweb2.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/boot.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/libs/autocomplete.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/libs/bootstrap.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/libs/jquery.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/config.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/abstract_service.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/class.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/collections.js"/>
|
|
<script type="text/javascript" src="/web/static/src/js/core/translation.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/ajax.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/ajax_service.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/time.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/mixins.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/rpc.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/widget.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/registry.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/session.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/dom.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/concurrency.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/utils.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/qweb.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/bus.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/core.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/dialog.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/local_storage.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/local_storage_service.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/rainbow_man.js"></script>
|
|
</template>
|
|
|
|
<template id="web.assets_backend" name="Backend Assets (used in backend interface)">
|
|
<t t-call="web.less_helpers"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/import_bootstrap.less"/>
|
|
|
|
<link rel="stylesheet" type="text/css" href="/base/static/src/css/modules.css"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/bootstrap_overridden.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/webclient_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/webclient_layout.less"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/webclient.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/domain_selector.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/model_field_selector.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/progress_bar.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/dropdown.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/dropdown_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/tooltip.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/debug_manager.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/control_panel.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/fields.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/fields_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/views.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/views_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/pivot_view.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/graph_view.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/form_view.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/form_view_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/list_view.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/list_view_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/kanban_dashboard.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/kanban_column_progressbar.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/kanban_view.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/kanban_view_mobile.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/web_calendar.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/search_view.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/search_view_extra.less"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/data_export.less"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/base_settings.less"/>
|
|
<script type="text/javascript" src="/base/static/src/js/res_config_settings.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/jquery.scrollTo/jquery.scrollTo.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/backbone/backbone.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/fuzzy-master/fuzzy.js"></script>
|
|
|
|
<script type="text/javascript" charset="utf-8">
|
|
odoo._modules = <t t-raw="get_modules_order()"/>;
|
|
</script>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/py.js/lib/py.js"></script>
|
|
<!-- Special case: core.js declares $.browser needed by ba-bbq -->
|
|
<script type="text/javascript" src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/src/js/core/domain.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/pyeval.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/action_manager.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/control_panel.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/view_manager.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/abstract_web_client.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/web_client.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/_deprecated/data.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/context.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/core/misc.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/crash_manager.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/data_manager.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/services/session.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/auto_complete.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/change_password.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/debug_manager.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/data_export.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/date_picker.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/domain_selector_dialog.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/domain_selector.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/iframe_widget.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/loading.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/model_field_selector.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/notification.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/sidebar.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/pager.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/systray_menu.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/widgets/switch_company_menu.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/user_menu.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/menu.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/search_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/search_filters.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/search_inputs.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/chrome/search_menus.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/apps.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/src/js/fields/abstract_field.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/fields/basic_fields.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/fields/field_registry.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/basic/widget_registry.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/fields/field_utils.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/fields/relational_fields.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/fields/special_fields.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/fields/upgrade_fields.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/src/js/views/abstract_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/abstract_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/abstract_model.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/abstract_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_model.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/field_manager_mixin.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/standalone_field_manager_mixin.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/view_registry.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/view_dialogs.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/form/form_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/form/form_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/form/form_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_model.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_column.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_quick_create.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_column_progressbar.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_model.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_record.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_renderer_mobile.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/list/list_editable_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/list/list_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/list/list_view.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/list/list_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_model.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_view.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_controller.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_model.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_quick_create.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_view.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/src/js/report/qwebactionmanager.js"/>
|
|
<script type="text/javascript" src="/web/static/src/js/report/utils.js"/>
|
|
<script type="text/javascript" src="/web/static/src/js/report/client_action.js"/>
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/report_backend.less"/>
|
|
</template>
|
|
|
|
<template id="web.assets_frontend" name="Website Assets">
|
|
<t t-call="web.less_helpers"/>
|
|
|
|
<link rel="stylesheet" type="text/less" href="/web/static/src/less/import_bootstrap.less"/>
|
|
|
|
<script type="text/javascript" src="/web/static/src/js/services/session.js"></script>
|
|
</template>
|
|
|
|
<template id="web.layout" name="Web layout"><!DOCTYPE html>
|
|
<html t-att="html_data or {}">
|
|
<head>
|
|
<meta charset="utf-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
|
|
|
|
<title t-esc="title or 'Odoo'"/>
|
|
<link type="image/x-icon" rel="shortcut icon" t-att-href="x_icon or '/web/static/src/img/favicon.ico'"/>
|
|
|
|
<script type="text/javascript">
|
|
var odoo = {
|
|
csrf_token: "<t t-esc="request.csrf_token(None)"/>",
|
|
};
|
|
</script>
|
|
|
|
<t t-raw="head or ''"/>
|
|
</head>
|
|
<body t-att-class="body_classname">
|
|
<t t-raw="0"/>
|
|
</body>
|
|
</html>
|
|
</template>
|
|
|
|
<template id="web.login_layout" name="Login Layout">
|
|
<t t-call="web.layout">
|
|
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
|
|
<t t-set="head">
|
|
<t t-call-assets="web.assets_common" t-js="false"/>
|
|
<t t-call-assets="web.assets_frontend" t-js="false"/>
|
|
<t t-call-assets="web.assets_common" t-css="false"/>
|
|
<t t-call-assets="web.assets_frontend" t-css="false"/>
|
|
</t>
|
|
<t t-set="body_classname" t-value="'container'"/>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6 col-md-offset-3 o_database_list">
|
|
<div class="text-center">
|
|
<img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}"/>
|
|
</div>
|
|
<t t-raw="0"/>
|
|
<div class="text-center" t-if="not disable_footer">
|
|
<t t-if="not disable_database_manager">
|
|
<a class="" href="/web/database/manager">Manage Databases</a> |
|
|
</t>
|
|
<a href="https://www.odoo.com" target="_blank">Powered by <span>Odoo</span></a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="web.login" name="Login">
|
|
<t t-call="web.login_layout">
|
|
<form class="oe_login_form" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post" onsubmit="this.action = this.action + location.hash">
|
|
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
|
|
|
|
<div class="form-group field-db" t-if="databases and len(databases) > 1">
|
|
<label for="db" class="control-label">Database</label>
|
|
<div class="input-group">
|
|
<input type="text" name="db" t-att-value="request.db" id="db" class="form-control" required="required" readonly="readonly"/>
|
|
<span class="input-group-btn">
|
|
<a href="/web/database/selector" class="btn btn-default">Select <i class="fa fa-database"></i></a>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group field-login">
|
|
<label for="login" class="control-label">Email</label>
|
|
<input type="text" name="login" t-att-value="login" id="login" class="form-control" required="required" autofocus="autofocus" autocapitalize="off"/>
|
|
</div>
|
|
|
|
<div class="form-group field-password">
|
|
<label for="password" class="control-label">Password</label>
|
|
<input type="password" name="password" id="password" class="form-control" required="required" autocomplete="current-password" t-att-autofocus="'autofocus' if login else None" maxlength="4096"/>
|
|
</div>
|
|
|
|
<p class="alert alert-danger" t-if="error">
|
|
<t t-esc="error"/>
|
|
</p>
|
|
<p class="alert alert-success" t-if="message">
|
|
<t t-esc="message"/>
|
|
</p>
|
|
|
|
<input type="hidden" name="redirect" t-att-value="redirect"/>
|
|
<div class="clearfix oe_login_buttons">
|
|
<button type="submit" class="btn btn-primary">Log in</button>
|
|
</div>
|
|
</form>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="web.menu">
|
|
<ul class="nav navbar-nav navbar-left oe_application_menu_placeholder" style="display: none;">
|
|
<li t-foreach="menu_data['children']" t-as="menu">
|
|
<t t-call="web.menu_link"/>
|
|
</li>
|
|
<li id="menu_more_container" class="dropdown" style="display: none;">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">More <b class="caret"></b></a>
|
|
<ul id="menu_more" class="dropdown-menu"></ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<ul class="nav navbar-nav navbar-right oe_user_menu_placeholder" style="display: none;"/>
|
|
<ul class="nav navbar-nav navbar-right oe_systray" style="display: none;"/>
|
|
</template>
|
|
<template id="web.menu_secondary">
|
|
<a class="o_sub_menu_logo" t-att-href="'/web/?debug' if debug else '/web'">
|
|
<span class="oe_logo_edit">Edit Company data</span>
|
|
<img src='/web/binary/company_logo'/>
|
|
</a>
|
|
<div class="o_sub_menu_content">
|
|
<t t-foreach="menu_data['children']" t-as="menu">
|
|
<div style="display: none" class="oe_secondary_menu" t-att-data-menu-parent="menu['id']">
|
|
<t t-foreach="menu['children']" t-as="menu">
|
|
<div class="oe_secondary_menu_section" t-att-data-menu-xmlid="menu.get('xmlid')">
|
|
<t t-if="menu['children']"><t t-esc="menu['name']"/></t>
|
|
<t t-if="not menu['children']"><t t-call="web.menu_link"/></t>
|
|
</div>
|
|
<t t-call="web.menu_secondary_submenu"/>
|
|
</t>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
<div class="o_sub_menu_footer">
|
|
Powered by <a href="http://www.odoo.com" target="_blank"><span>Odoo</span></a>
|
|
</div>
|
|
</template>
|
|
<template id="web.menu_secondary_submenu">
|
|
<ul t-if="menu['children']" class="oe_secondary_submenu nav nav-pills nav-stacked">
|
|
<li t-foreach="menu['children']" t-as="menu">
|
|
<t t-call="web.menu_link"/>
|
|
<t t-call="web.menu_secondary_submenu"/>
|
|
</li>
|
|
</ul>
|
|
</template>
|
|
<template id="web.menu_link">
|
|
<t t-set="debug_param" t-value="'?&debug=' if debug else ''"/>
|
|
<a t-att-href="'/web%s#menu_id=%s&action=%s' % (debug_param, menu['id'], menu['action'] and menu['action'].split(',')[1] or '')"
|
|
t-att-class="'oe_menu_toggler' if menu.get('children') else 'oe_menu_leaf'"
|
|
t-att-data-menu="menu['id']"
|
|
t-att-data-menu-xmlid="menu.get('xmlid')"
|
|
t-att-data-action-model="menu['action'] and menu['action'].split(',')[0] or None"
|
|
t-att-data-action-id="menu['action'] and menu['action'].split(',')[1] or None">
|
|
<span class="oe_menu_text">
|
|
<t t-esc="menu['name']"/>
|
|
</span>
|
|
</a>
|
|
</template>
|
|
|
|
<template id="web.js_tests_assets">
|
|
<link type="text/css" rel="stylesheet" href="/web/static/lib/qunit/qunit-2.2.1.css"/>
|
|
<script type="text/javascript" src="/web/static/lib/qunit/qunit-2.2.1.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/helpers/qunit_config.js"></script>
|
|
|
|
<t t-call-assets="web.assets_common" t-js="false"/>
|
|
<t t-call-assets="web.assets_backend" t-js="false"/>
|
|
<t t-call-assets="web.assets_common" t-css="false"/>
|
|
<t t-call-assets="web.assets_backend" t-css="false"/>
|
|
|
|
<!-- add lazy-loaded libs to make tests synchronous -->
|
|
<link rel="stylesheet" href="/web/static/lib/fullcalendar/css/fullcalendar.css"/>
|
|
<script type="text/javascript" src="/web/static/lib/fullcalendar/js/fullcalendar.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/web/static/lib/nvd3/nv.d3.css"/>
|
|
<script type="text/javascript" src="/web/static/lib/nvd3/d3.v3.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/nvd3/nv.d3.js"></script>
|
|
<script type="text/javascript" src="/web/static/src/js/libs/nvd3.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/ace/ace.odoo-custom.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/ace/mode-python.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/ace/mode-xml.js"></script>
|
|
|
|
<script type="text/javascript">
|
|
// define the 'web.web_client' module because some other modules require it
|
|
odoo.define('web.web_client', function (require) {
|
|
var WebClient = require('web.WebClient');
|
|
var web_client = new WebClient();
|
|
// override _call_service to prevent the web_client from doing RPCs
|
|
web_client._call_service = function () {};
|
|
return web_client;
|
|
});
|
|
</script>
|
|
|
|
<style>
|
|
body {
|
|
position: relative; // bootstrap-datepicker needs this
|
|
}
|
|
body:not(.debug) .modal-backdrop, body:not(.debug) .modal, body:not(.debug) .ui-autocomplete {
|
|
opacity: 0 !important;
|
|
}
|
|
#qunit-testrunner-toolbar label {
|
|
font-weight: inherit;
|
|
margin-bottom: inherit;
|
|
}
|
|
#qunit-testrunner-toolbar input[type=text] {
|
|
width: inherit;
|
|
display: inherit;
|
|
}
|
|
</style>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/helpers/test_utils.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/helpers/mock_server.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/boot_tests.js"></script>
|
|
</template>
|
|
|
|
<template id="web.qunit_suite">
|
|
<t t-call="web.layout">
|
|
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
|
|
<t t-set="title">Web Tests</t>
|
|
<t t-set="head">
|
|
<t t-call="web.js_tests_assets"/>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/fields/basic_fields_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/fields/field_utils_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/fields/relational_fields_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/fields/special_fields.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/fields/upgrade_fields_tests.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/views/abstract_view_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/form_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/graph_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/list_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/pivot_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/kanban_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/calendar_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/basic_model_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/kanban_model_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/view_dialogs_tests.js"></script>
|
|
<script type="text/javascript" src="/base/static/src/tests/base_setting_test.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/registry_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/pyeval_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/class_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/rpc_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/domain_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/mixins_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/time_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/concurrency_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/util_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/core/widget_tests.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/chrome/search_tests.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/chrome/pager_tests.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/widgets/data_export_tests.js"/>
|
|
<script type="text/javascript" src="/web/static/tests/widgets/domain_selector_tests.js"/>
|
|
<script type="text/javascript" src="/web/static/tests/widgets/model_field_selector_tests.js"/>
|
|
<script type="text/javascript" src="/web/static/tests/widgets/rainbow_man_tests.js"/>
|
|
</t>
|
|
|
|
<div id="qunit"/>
|
|
<div id="qunit-fixture"/>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="web.qunit_mobile_suite">
|
|
<t t-call="web.layout">
|
|
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
|
|
<t t-set="title">Web Mobile Tests</t>
|
|
<t t-set="head">
|
|
<script>
|
|
// force the config.device.isMobile key to be true so that
|
|
// mobile specific files aren't rejected
|
|
window.odoo = {};
|
|
var odooDefine;
|
|
Object.defineProperty(window.odoo, 'define', {
|
|
get: function () {
|
|
return odooDefine;
|
|
},
|
|
set: function (define) {
|
|
odooDefine = function () {
|
|
define.apply(this, arguments);
|
|
if (arguments[0] === 'web.config') {
|
|
define.call(this, 'web.config.patch', function (require) {
|
|
var config = require('web.config');
|
|
config.device.isMobile = true;
|
|
});
|
|
}
|
|
};
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<t t-call="web.js_tests_assets"/>
|
|
<script type="text/javascript" src="/web/static/lib/jquery.touchSwipe/jquery.touchSwipe.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/views/kanban_mobile_tests.js"></script>
|
|
</t>
|
|
|
|
<div id="qunit"/>
|
|
<div id="qunit-fixture"/>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="web.benchmark_suite">
|
|
<t t-call="web.layout">
|
|
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
|
|
<t t-set="title">Web Benchmarks</t>
|
|
<t t-set="head">
|
|
<link type="text/css" rel="stylesheet" href="/web/static/lib/qunit/qunit-2.2.1.css"/>
|
|
<script type="text/javascript" src="/web/static/lib/qunit/qunit-2.2.1.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/helpers/qunit_config.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/benchmarkjs/lodash.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/benchmarkjs/benchmark.js"></script>
|
|
|
|
<t t-call-assets="web.assets_common" t-js="false"/>
|
|
<t t-call-assets="web.assets_backend" t-js="false"/>
|
|
<t t-call-assets="web.assets_common" t-css="false"/>
|
|
<t t-call-assets="web.assets_backend" t-css="false"/>
|
|
|
|
<script type="text/javascript">
|
|
QUnit.config.hidepassed = false;
|
|
|
|
// define the 'web.web_client' module because some other modules require it
|
|
odoo.define('web.web_client', function (require) {
|
|
var WebClient = require('web.WebClient');
|
|
var web_client = new WebClient();
|
|
// override _call_service to prevent the web_client from doing RPCs
|
|
web_client._call_service = function () {};
|
|
return web_client;
|
|
});
|
|
</script>
|
|
|
|
<style>
|
|
body:not(.debug) .modal-backdrop, body:not(.debug) .modal, body:not(.debug) .ui-autocomplete {
|
|
opacity: 0 !important;
|
|
}
|
|
#qunit-testrunner-toolbar label {
|
|
font-weight: inherit;
|
|
margin-bottom: inherit;
|
|
}
|
|
#qunit-testrunner-toolbar input[type=text] {
|
|
width: inherit;
|
|
display: inherit;
|
|
}
|
|
</style>
|
|
<script type="text/javascript" src="/web/static/tests/helpers/test_utils.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/helpers/mock_server.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/tests/views/list_benchmarks.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/kanban_benchmarks.js"></script>
|
|
<script type="text/javascript" src="/web/static/tests/views/form_benchmarks.js"></script>
|
|
</t>
|
|
|
|
<div id="qunit"/>
|
|
<div id="qunit-fixture"/>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="web.webclient_bootstrap">
|
|
<t t-call="web.layout">
|
|
<t t-set="head_web">
|
|
<script type="text/javascript">
|
|
odoo.session_info = <t t-raw="session_info"/>;
|
|
</script>
|
|
|
|
<t t-call-assets="web.assets_common" t-js="false"/>
|
|
<t t-call-assets="web.assets_backend" t-js="false"/>
|
|
<t t-call-assets="web.assets_common" t-css="false"/>
|
|
<t t-call-assets="web.assets_backend" t-css="false"/>
|
|
|
|
<![CDATA[
|
|
<!--[if lt IE 10]>
|
|
<body class="ie9">
|
|
<![endif]-->
|
|
]]>
|
|
|
|
<script type="text/javascript">
|
|
odoo.define('web.web_client', function (require) {
|
|
var WebClient = require('web.WebClient');
|
|
var web_client = new WebClient();
|
|
$(function() {
|
|
web_client.setElement($(document.body));
|
|
web_client.start();
|
|
});
|
|
return web_client;
|
|
});
|
|
</script>
|
|
</t>
|
|
<t t-set="head" t-value="head_web + (head or '')"/>
|
|
<t t-set="body_classname" t-value="'o_web_client'"/>
|
|
|
|
<nav id="oe_main_menu_navbar" class="navbar navbar-inverse" groups="base.group_user,base.group_portal">
|
|
<div class="navbar-header">
|
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
</div>
|
|
<div class="navbar-collapse collapse">
|
|
<t t-call="web.menu"/>
|
|
</div>
|
|
</nav>
|
|
<div class="o_main">
|
|
<div class="o_sub_menu" groups="base.group_user,base.group_portal">
|
|
<t t-call="web.menu_secondary"/>
|
|
</div>
|
|
<div class="o_main_content"/>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
|
|
<!--
|
|
Optional Bundle for PDFJS lib
|
|
Since PDFJS is quite huge (40000 lines), please only load it when it is necessary.
|
|
For now, it is only use to display the PDF slide Viewer during an embed.
|
|
Bundlized, the size is reduced to 3000 lines.
|
|
-->
|
|
<template id="pdf_js_lib" name="PDF JS Library">
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/shared/util.js"></script>
|
|
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/api.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/metadata.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/canvas.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/webgl.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/pattern_helper.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/font_loader.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/annotation_helper.js"></script>
|
|
<!-- files normally dynamically loaded in worker_loader.js -->
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/network.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/chunked_stream.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/pdf_manager.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/core.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/obj.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/charsets.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/annotation.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/function.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/colorspace.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/crypto.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/pattern.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/evaluator.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/cmap.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/fonts.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/font_renderer.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/glyphlist.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/image.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/metrics.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/parser.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/ps_parser.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/stream.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/worker.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/arithmetic_decoder.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/jpg.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/jpx.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/jbig2.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/bidi.js"></script>
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/murmurhash3.js"></script>
|
|
<!--
|
|
NOTE JEM : PDFJS not-minified load its assets dynamically. Not minify, this lib is huge (4000 lines).
|
|
To load PDFJS using odoo bundle, we create a custom worker_loader, to avoid reloading all the assets (core/*.js) dynamically.
|
|
Loading all this assets in a bundle can be problematic in debug mode, since we don't wait all assets to be loaded to start using PDFJS. That's why, in debug mode, we use the native loader, otherwise our custom loader is used.
|
|
-->
|
|
<t t-if="not debug">
|
|
<script>
|
|
// Use Odoo PDFJS Loader, to avoid dynamic assets loading
|
|
PDFJS.workerSrc = '/web/static/lib/pdfjs/worker_loader_by_odoo.js';
|
|
PDFJS.disableWorker = true;
|
|
</script>
|
|
</t>
|
|
<t t-if="debug">
|
|
<script>
|
|
// Specify the main script used to create a new PDF.JS web worker.
|
|
// In production, leave this undefined or change it to point to the
|
|
// combined `pdf.worker.js` file.
|
|
PDFJS.workerSrc = '/web/static/lib/pdfjs/src/worker_loader.js';
|
|
</script>
|
|
</t>
|
|
<!--
|
|
If no loader defined, this file will try to load pdf.worker.js (in build/).
|
|
It will crash since we don't use the minified version of PDFJS
|
|
-->
|
|
<script type="text/javascript" src="/web/static/lib/pdfjs/src/pdf.js"></script>
|
|
</template>
|
|
</odoo>
|