[MERGE] forward port branch 11.0 up to 39d9c362c5

This commit is contained in:
Christophe Simonis
2018-03-22 20:05:14 +01:00
23 changed files with 271 additions and 4392 deletions
+3 -3
View File
@@ -1,7 +1,7 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_expense
#
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
# Michael Yeung <michael@deluxe.hk>, 2017
@@ -13,10 +13,10 @@ msgstr ""
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Michael Yeung <michael@deluxe.hk>, 2017\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/odoo/teams/41243/zh_TW/)\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#. module: hr_expense
@@ -1800,7 +1800,7 @@ msgstr ""
#: code:addons/hr_expense/models/hr_expense.py:344
#, python-format
msgid "or send receipts by email to %s."
msgstr ""
msgstr "或者通過電子郵件向 %s 發送收據。"
#. module: hr_expense
#: model:ir.ui.view,arch_db:hr_expense.hr_expense_planner
@@ -22,7 +22,13 @@ class AccountAnalyticLine(models.Model):
@api.onchange('project_id')
def onchange_project_id(self):
# reset task when changing project
self.task_id = False
# force domain on task when project is set
if self.project_id:
return {'domain': {
'task_id': [('project_id', '=', self.project_id.id)]
}}
@api.onchange('employee_id')
def _onchange_employee_id(self):
+1
View File
@@ -50,6 +50,7 @@ function strip_html (node, transform_children) {
function inline (node, transform_children) {
if (node.nodeType === 3) return node.data;
if (node.nodeType === 8) return "";
if (node.tagName === "BR") return " ";
if (node.tagName.match(/^(A|P|DIV|PRE|BLOCKQUOTE)$/)) return transform_children();
node.innerHTML = transform_children();
File diff suppressed because it is too large Load Diff
+32 -41
View File
@@ -10,8 +10,7 @@ msgstr ""
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
"PO-Revision-Date: 2016-07-19 02:21+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: French (Canada) (http://www.transifex.com/odoo/odoo-9/"
"language/fr_CA/)\n"
"Language-Team: French (Canada) (http://www.transifex.com/odoo/odoo-9/language/fr_CA/)\n"
"Language: fr_CA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -226,10 +225,8 @@ msgstr ""
#: model:ir.actions.act_window,help:point_of_sale.action_pos_session
msgid ""
"A session is a period of time, usually one day, during which\n"
" you sell through the point of sale. The user has to check "
"the\n"
" currencies in your cash registers at the beginning and the "
"end\n"
" you sell through the point of sale. The user has to check the\n"
" currencies in your cash registers at the beginning and the end\n"
" of each session."
msgstr ""
@@ -672,15 +669,15 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,help:point_of_sale.field_account_journal_journal_user
msgid ""
"Check this box if this journal define a payment method that can be used in a "
"point of sale."
"Check this box if this journal define a payment method that can be used in a"
" point of sale."
msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,help:point_of_sale.field_pos_config_group_by
msgid ""
"Check this if you want to group the Journal Items by Product while closing a "
"Session"
"Check this if you want to group the Journal Items by Product while closing a"
" Session"
msgstr ""
#. module: point_of_sale
@@ -1130,8 +1127,7 @@ msgstr "Nom affiché"
#: model:ir.actions.act_window,help:point_of_sale.product_template_action
msgid ""
"Do not forget to set the price and the point of sale category\n"
" in which it should appear. If a product has no point of "
"sale\n"
" in which it should appear. If a product has no point of sale\n"
" category, you can not sell it through the point of sale\n"
" interface."
msgstr ""
@@ -1470,8 +1466,7 @@ msgstr ""
#: model:ir.actions.act_window,help:point_of_sale.product_pos_category_action
msgid ""
"If you put a photo on the category, the layout of the\n"
" touchscreen interface will automatically. We suggest not to "
"put\n"
" touchscreen interface will automatically. We suggest not to put\n"
" a photo on categories for small (1024x768) screens."
msgstr ""
@@ -2156,7 +2151,7 @@ msgstr ""
#: code:addons/point_of_sale/models/pos_config.py:180
#, fuzzy, python-format
msgid "POS Order %s"
msgstr "Commande"
msgstr "Commande %s"
#. module: point_of_sale
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_order_line_form
@@ -2270,10 +2265,8 @@ msgstr ""
#: model:ir.actions.act_window,help:point_of_sale.action_account_journal_form
msgid ""
"Payment methods are defined by accounting journals having the\n"
" field <i>PoS Payment Method</i> checked. In order to be "
"useable\n"
" from the touchscreen interface, you must set the payment "
"method\n"
" field <i>PoS Payment Method</i> checked. In order to be useable\n"
" from the touchscreen interface, you must set the payment method\n"
" on the <i>Point of Sale</i> configuration."
msgstr ""
@@ -2987,8 +2980,8 @@ msgstr ""
#: model:ir.model.fields,help:point_of_sale.field_pos_category_image_small
msgid ""
"Small-sized image of the category. It is automatically resized as a 64x64px "
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
"image, with aspect ratio preserved. Use this field anywhere a small image is"
" required."
msgstr ""
#. module: point_of_sale
@@ -3349,7 +3342,8 @@ msgstr ""
#. module: point_of_sale
#: code:addons/point_of_sale/models/pos_session.py:215
#, python-format
msgid "The type of the journal for your payment method should be bank or cash "
msgid ""
"The type of the journal for your payment method should be bank or cash "
msgstr ""
#. module: point_of_sale
@@ -3371,11 +3365,9 @@ msgstr ""
#: code:addons/point_of_sale/static/src/js/screens.js:1867
#, python-format
msgid ""
"There is no cash payment method available in this point of sale to handle "
"the change.\n"
"There is no cash payment method available in this point of sale to handle the change.\n"
"\n"
" Please pay the exact amount or add a cash payment method in the point of "
"sale configuration"
" Please pay the exact amount or add a cash payment method in the point of sale configuration"
msgstr ""
#. module: point_of_sale
@@ -3388,8 +3380,8 @@ msgstr ""
#: code:addons/point_of_sale/models/pos_order.py:607
#, python-format
msgid ""
"There is no receivable account defined to make payment for the partner: \"%s"
"\" (id:%d)."
"There is no receivable account defined to make payment for the partner: "
"\"%s\" (id:%d)."
msgstr ""
#. module: point_of_sale
@@ -3421,8 +3413,8 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,help:point_of_sale.field_account_journal_amount_authorized_diff
msgid ""
"This field depicts the maximum difference allowed between the ending balance "
"and the theoretical cash when closing a session, for non-POS managers. If "
"This field depicts the maximum difference allowed between the ending balance"
" and the theoretical cash when closing a session, for non-POS managers. If "
"this maximum is reached, the user will have an error message at the closing "
"of his session saying that he needs to contact his manager."
msgstr ""
@@ -3457,8 +3449,7 @@ msgid ""
"\n"
"- Bill Splitting: Allows you to split an order into different orders \n"
"\n"
"- Kitchen Order Printing: allows you to print orders updates to kitchen or "
"bar printers"
"- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers"
msgstr ""
#. module: point_of_sale
@@ -3476,8 +3467,8 @@ msgstr ""
#, python-format
msgid ""
"This operation will permanently destroy all unpaid orders from all sessions "
"that have been put in the local storage. You will lose all the data and exit "
"the point of sale. This operation cannot be undone."
"that have been put in the local storage. You will lose all the data and exit"
" the point of sale. This operation cannot be undone."
msgstr ""
#. module: point_of_sale
@@ -3827,11 +3818,11 @@ msgstr ""
#, python-format
msgid ""
"You have to define which payment method must be available in the point of "
"sale by reusing existing bank and cash through \"Accounting / "
"Configuration / Journals / Journals\". Select a journal and check the field "
"\"PoS Payment Method\" from the \"Point of Sale\" tab. You can also create "
"new payment methods directly from menu \"PoS Backend / Configuration / "
"Payment Methods\"."
"sale by reusing existing bank and cash through \"Accounting / Configuration "
"/ Journals / Journals\". Select a journal and check the field \"PoS Payment "
"Method\" from the \"Point of Sale\" tab. You can also create new payment "
"methods directly from menu \"PoS Backend / Configuration / Payment "
"Methods\"."
msgstr ""
#. module: point_of_sale
@@ -4093,8 +4084,8 @@ msgstr ""
#~ msgid "Allow the users to synchronize their calendar with Google Calendar"
#~ msgstr ""
#~ "Permet aux utilisateurs de synchroniser leur calendrier avec le "
#~ "\"Calendrier Google\""
#~ "Permet aux utilisateurs de synchroniser leur calendrier avec le \"Calendrier"
#~ " Google\""
#~ msgid "Attach Google documents to any record"
#~ msgstr "Joindre des documents Google à tout enregistrement"
+45 -54
View File
@@ -11,8 +11,7 @@ msgstr ""
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
"PO-Revision-Date: 2016-01-27 10:50+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Dutch (Belgium) (http://www.transifex.com/odoo/odoo-9/"
"language/nl_BE/)\n"
"Language-Team: Dutch (Belgium) (http://www.transifex.com/odoo/odoo-9/language/nl_BE/)\n"
"Language: nl_BE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -227,10 +226,8 @@ msgstr ""
#: model:ir.actions.act_window,help:point_of_sale.action_pos_session
msgid ""
"A session is a period of time, usually one day, during which\n"
" you sell through the point of sale. The user has to check "
"the\n"
" currencies in your cash registers at the beginning and the "
"end\n"
" you sell through the point of sale. The user has to check the\n"
" currencies in your cash registers at the beginning and the end\n"
" of each session."
msgstr ""
@@ -673,15 +670,15 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,help:point_of_sale.field_account_journal_journal_user
msgid ""
"Check this box if this journal define a payment method that can be used in a "
"point of sale."
"Check this box if this journal define a payment method that can be used in a"
" point of sale."
msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,help:point_of_sale.field_pos_config_group_by
msgid ""
"Check this if you want to group the Journal Items by Product while closing a "
"Session"
"Check this if you want to group the Journal Items by Product while closing a"
" Session"
msgstr ""
#. module: point_of_sale
@@ -1134,8 +1131,7 @@ msgstr "Naam weergeven"
#: model:ir.actions.act_window,help:point_of_sale.product_template_action
msgid ""
"Do not forget to set the price and the point of sale category\n"
" in which it should appear. If a product has no point of "
"sale\n"
" in which it should appear. If a product has no point of sale\n"
" category, you can not sell it through the point of sale\n"
" interface."
msgstr ""
@@ -1480,8 +1476,7 @@ msgstr ""
#: model:ir.actions.act_window,help:point_of_sale.product_pos_category_action
msgid ""
"If you put a photo on the category, the layout of the\n"
" touchscreen interface will automatically. We suggest not to "
"put\n"
" touchscreen interface will automatically. We suggest not to put\n"
" a photo on categories for small (1024x768) screens."
msgstr ""
@@ -1530,8 +1525,8 @@ msgstr "In behandeling"
#, python-format
msgid "In order to delete a sale, it must be new or cancelled."
msgstr ""
"Als u een verkoop wilt verwijderen, moet deze in status Nieuw of Geannuleerd "
"staan."
"Als u een verkoop wilt verwijderen, moet deze in status Nieuw of Geannuleerd"
" staan."
#. module: point_of_sale
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_config_search
@@ -2172,7 +2167,7 @@ msgstr "Verkoopanalyse"
#: code:addons/point_of_sale/models/pos_config.py:180
#, fuzzy, python-format
msgid "POS Order %s"
msgstr "Kassaverkooporders"
msgstr "Kassaverkooporders %s"
#. module: point_of_sale
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_order_line_form
@@ -2198,7 +2193,7 @@ msgstr "Kassaverkooporderlijnen"
#: code:addons/point_of_sale/models/pos_config.py:191
#, fuzzy, python-format
msgid "POS order line %s"
msgstr "Kassaverkooporderlijnen"
msgstr "Kassaverkooporderlijnen %s"
#. module: point_of_sale
#: model:ir.ui.view,arch_db:point_of_sale.view_report_pos_order_search
@@ -2286,10 +2281,8 @@ msgstr "Betaalterminal"
#: model:ir.actions.act_window,help:point_of_sale.action_account_journal_form
msgid ""
"Payment methods are defined by accounting journals having the\n"
" field <i>PoS Payment Method</i> checked. In order to be "
"useable\n"
" from the touchscreen interface, you must set the payment "
"method\n"
" field <i>PoS Payment Method</i> checked. In order to be useable\n"
" from the touchscreen interface, you must set the payment method\n"
" on the <i>Point of Sale</i> configuration."
msgstr ""
@@ -2317,8 +2310,8 @@ msgid ""
"Person who uses the cash register. It can be a reliever, a student or an "
"interim employee."
msgstr ""
"Persoon die de kassa gebruikt. Dit kan een kassa-ophaler, een student of een "
"interimarbeider zijn."
"Persoon die de kassa gebruikt. Dit kan een kassa-ophaler, een student of een"
" interimarbeider zijn."
#. module: point_of_sale
#. openerp-web
@@ -2365,8 +2358,8 @@ msgstr "Gelieve groot bedrag te bevestigen"
#, python-format
msgid "Please define income account for this product: \"%s\" (id:%d)."
msgstr ""
"Gelieve een opbrengstenrekening in te stellen voor dit product: \"%s\" (id:"
"%d)."
"Gelieve een opbrengstenrekening in te stellen voor dit product: \"%s\" "
"(id:%d)."
#. module: point_of_sale
#: code:addons/point_of_sale/models/pos_order.py:437
@@ -3008,8 +3001,8 @@ msgstr ""
#: model:ir.model.fields,help:point_of_sale.field_pos_category_image_small
msgid ""
"Small-sized image of the category. It is automatically resized as a 64x64px "
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
"image, with aspect ratio preserved. Use this field anywhere a small image is"
" required."
msgstr ""
#. module: point_of_sale
@@ -3376,7 +3369,8 @@ msgstr ""
#. module: point_of_sale
#: code:addons/point_of_sale/models/pos_session.py:215
#, python-format
msgid "The type of the journal for your payment method should be bank or cash "
msgid ""
"The type of the journal for your payment method should be bank or cash "
msgstr ""
#. module: point_of_sale
@@ -3392,19 +3386,17 @@ msgid ""
"There are pending operations that could not be saved into the database, are "
"you sure you want to exit?"
msgstr ""
"Er zijn hangende transacties die niet kunnen worden opgeslagen. Bent u zeker "
"dat u wilt afsluiten?"
"Er zijn hangende transacties die niet kunnen worden opgeslagen. Bent u zeker"
" dat u wilt afsluiten?"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/js/screens.js:1867
#, python-format
msgid ""
"There is no cash payment method available in this point of sale to handle "
"the change.\n"
"There is no cash payment method available in this point of sale to handle the change.\n"
"\n"
" Please pay the exact amount or add a cash payment method in the point of "
"sale configuration"
" Please pay the exact amount or add a cash payment method in the point of sale configuration"
msgstr ""
#. module: point_of_sale
@@ -3417,8 +3409,8 @@ msgstr ""
#: code:addons/point_of_sale/models/pos_order.py:607
#, python-format
msgid ""
"There is no receivable account defined to make payment for the partner: \"%s"
"\" (id:%d)."
"There is no receivable account defined to make payment for the partner: "
"\"%s\" (id:%d)."
msgstr ""
#. module: point_of_sale
@@ -3450,8 +3442,8 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,help:point_of_sale.field_account_journal_amount_authorized_diff
msgid ""
"This field depicts the maximum difference allowed between the ending balance "
"and the theoretical cash when closing a session, for non-POS managers. If "
"This field depicts the maximum difference allowed between the ending balance"
" and the theoretical cash when closing a session, for non-POS managers. If "
"this maximum is reached, the user will have an error message at the closing "
"of his session saying that he needs to contact his manager."
msgstr ""
@@ -3486,8 +3478,7 @@ msgid ""
"\n"
"- Bill Splitting: Allows you to split an order into different orders \n"
"\n"
"- Kitchen Order Printing: allows you to print orders updates to kitchen or "
"bar printers"
"- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers"
msgstr ""
#. module: point_of_sale
@@ -3505,8 +3496,8 @@ msgstr ""
#, python-format
msgid ""
"This operation will permanently destroy all unpaid orders from all sessions "
"that have been put in the local storage. You will lose all the data and exit "
"the point of sale. This operation cannot be undone."
"that have been put in the local storage. You will lose all the data and exit"
" the point of sale. This operation cannot be undone."
msgstr ""
#. module: point_of_sale
@@ -3857,11 +3848,11 @@ msgstr ""
#, python-format
msgid ""
"You have to define which payment method must be available in the point of "
"sale by reusing existing bank and cash through \"Accounting / "
"Configuration / Journals / Journals\". Select a journal and check the field "
"\"PoS Payment Method\" from the \"Point of Sale\" tab. You can also create "
"new payment methods directly from menu \"PoS Backend / Configuration / "
"Payment Methods\"."
"sale by reusing existing bank and cash through \"Accounting / Configuration "
"/ Journals / Journals\". Select a journal and check the field \"PoS Payment "
"Method\" from the \"Point of Sale\" tab. You can also create new payment "
"methods directly from menu \"PoS Backend / Configuration / Payment "
"Methods\"."
msgstr ""
#. module: point_of_sale
@@ -4324,8 +4315,8 @@ msgstr ""
#~ msgstr "Boekingen doen"
#~ msgid ""
#~ "Generate all sale journal entries for non invoiced orders linked to a "
#~ "closed cash register or statement."
#~ "Generate all sale journal entries for non invoiced orders linked to a closed"
#~ " cash register or statement."
#~ msgstr ""
#~ "Maak alle verkoopboekingen voor niet-gefactureerde orders in een gesloten "
#~ "kasboek of uittreksel."
@@ -4464,8 +4455,8 @@ msgstr ""
#~ msgid "This allows users to trigger a password reset from the Login page."
#~ msgstr ""
#~ "Dit stelt gebruikers in staat om een wachtwoord herinitialisatie te "
#~ "starten via de Aanmeldingspagina."
#~ "Dit stelt gebruikers in staat om een wachtwoord herinitialisatie te starten "
#~ "via de Aanmeldingspagina."
#~ msgid "Timmermans Kriek 37.5cl"
#~ msgstr "Timmermans Kriek 37.5cl"
@@ -4481,8 +4472,8 @@ msgstr ""
#~ "products, an ease the product management in the ecommerce for example"
#~ msgstr ""
#~ "Werken met productvarianten biedt u de mogelijkheid om varianten voor "
#~ "eenzelfde product te definiëren, en vergemakkelijkt het productbeheer "
#~ "voor bijv. e-Commerce"
#~ "eenzelfde product te definiëren, en vergemakkelijkt het productbeheer voor "
#~ "bijv. e-Commerce"
#~ msgid "transaction for the pos"
#~ msgstr "transactie voor kassaverkoop"
@@ -2,6 +2,7 @@ odoo.define('stock.stock_report_generic', function (require) {
'use strict';
var core = require('web.core');
var session = require('web.session');
var Widget = require('web.Widget');
var ControlPanelMixin = require('web.ControlPanelMixin');
var session = require('web.session');
@@ -15,7 +16,7 @@ var stock_report_generic = Widget.extend(ControlPanelMixin, {
// Stores all the parameters of the action.
init: function(parent, action) {
this.actionManager = parent;
this.given_context = {};
this.given_context = session.user_context;
this.controller_url = action.context.url;
if (action.context.context) {
this.given_context = action.context.context;
+2 -2
View File
@@ -257,8 +257,8 @@ class ProductProduct(models.Model):
@api.model
def _get_anglo_saxon_price_unit(self, uom=False):
price = self.standard_price
if not uom or self.uom_id.id == uom.id:
return price
if not self or not uom or self.uom_id.id == uom.id:
return price or 0.0
return self.uom_id._compute_price(price, uom)
-63
View File
@@ -1494,69 +1494,6 @@ class ExcelExport(ExportFormat, http.Controller):
fp.close()
return data
class Reports(http.Controller):
POLLING_DELAY = 0.25
TYPES_MAPPING = {
'doc': 'application/vnd.ms-word',
'html': 'text/html',
'odt': 'application/vnd.oasis.opendocument.text',
'pdf': 'application/pdf',
'sxw': 'application/vnd.sun.xml.writer',
'xls': 'application/vnd.ms-excel',
}
@http.route('/web/report', type='http', auth="user")
@serialize_exception
def index(self, action, token):
action = json.loads(action)
context = dict(request.context)
context.update(action["context"])
report_data = {}
report_ids = context.get("active_ids", None)
if 'report_type' in action:
report_data['report_type'] = action['report_type']
if 'datas' in action:
if 'ids' in action['datas']:
report_ids = action['datas'].pop('ids')
report_data.update(action['datas'])
report_id = dispatch_rpc('report', 'report', [
request.session.db, request.session.uid, request.session.password,
action["report_name"], report_ids, report_data, context])
report_struct = None
while True:
report_struct = dispatch_rpc('report', 'report_get', [
request.session.db, request.session.uid, request.session.password, report_id])
if report_struct["state"]:
break
time.sleep(self.POLLING_DELAY)
report = base64.b64decode(report_struct['result'])
if report_struct.get('code') == 'zlib':
report = zlib.decompress(report)
report_mimetype = self.TYPES_MAPPING.get(
report_struct['format'], 'octet-stream')
file_name = action.get('name', 'report')
if 'name' not in action:
reports = request.env['ir.actions.report']
reports = reports.search([('report_name', '=', action['report_name'])])
if reports:
file_name = reports[0].name
else:
file_name = action['report_name']
file_name = '%s.%s' % (file_name, report_struct['format'])
return request.make_response(report,
headers=[
('Content-Disposition', content_disposition(file_name)),
('Content-Type', report_mimetype),
('Content-Length', len(report))],
cookies={'fileToken': token})
class Apps(http.Controller):
@http.route('/apps/<app>', auth='user')
def get_app_url(self, req, app):
+19 -26
View File
@@ -10,8 +10,7 @@ msgstr ""
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2016-04-21 09:34+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/odoo/"
"odoo-9/language/en_GB/)\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/odoo/odoo-9/language/en_GB/)\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1054,8 +1053,7 @@ msgstr ""
#: code:addons/web/static/src/js/views/pivot_view.js:808
#, python-format
msgid ""
"For Excel compatibility, data cannot be exported if there is more than 256 "
"columns.\n"
"For Excel compatibility, data cannot be exported if there is more than 256 columns.\n"
"\n"
"Tip: try to flip axis, filter further or reduce the number of measures."
msgstr ""
@@ -1465,8 +1463,8 @@ msgstr ""
#: code:addons/web/static/src/js/views/graph_widget.js:95
#, python-format
msgid ""
"No data available for this chart. Try to add some records, or make sure that "
"there is no active filter in the search bar."
"No data available for this chart. Try to add some records, or make sure that"
" there is no active filter in the search bar."
msgstr ""
#. module: web
@@ -1474,10 +1472,8 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:691
#, python-format
msgid ""
"No data available for this pivot table. Try to add some records, or make "
"sure\n"
" that there is at least one measure and no active filter in "
"the search bar."
"No data available for this pivot table. Try to add some records, or make sure\n"
" that there is at least one measure and no active filter in the search bar."
msgstr ""
#. module: web
@@ -1527,7 +1523,7 @@ msgstr ""
#: code:addons/web/static/src/js/views/form_relational_widgets.js:329
#, fuzzy, python-format
msgid "No value found for the field %s for value %s"
msgstr "No value found for the field for value "
msgstr "No value found for the field for value %s"
#. module: web
#. openerp-web
@@ -2154,8 +2150,8 @@ msgstr "The following fields are invalid:"
#: code:addons/web/static/src/js/views/list_view_editable.js:124
#, python-format
msgid ""
"The line has been modified, your changes will be discarded. Are you sure you "
"want to discard the changes ?"
"The line has been modified, your changes will be discarded. Are you sure you"
" want to discard the changes ?"
msgstr ""
#. module: web
@@ -2207,11 +2203,11 @@ msgstr "The selected file exceed the maximum file size of %s."
#: code:addons/web/static/src/js/views/form_relational_widgets.js:1550
#, python-format
msgid ""
"The type of the field '%s' must be a many2many field with a relation to 'ir."
"attachment' model."
"The type of the field '%s' must be a many2many field with a relation to "
"'ir.attachment' model."
msgstr ""
"The type of the field '%s' must be a many2many field with a relation to 'ir."
"attachment' model."
"The type of the field '%s' must be a many2many field with a relation to "
"'ir.attachment' model."
#. module: web
#. openerp-web
@@ -2241,15 +2237,11 @@ msgstr "This resource is empty"
#: code:addons/web/static/src/xml/base.xml:1304
#, python-format
msgid ""
"This wizard will export all data that matches the current search criteria to "
"a CSV file.\n"
" You can export all data or only the fields that can be "
"reimported after modification."
"This wizard will export all data that matches the current search criteria to a CSV file.\n"
" You can export all data or only the fields that can be reimported after modification."
msgstr ""
"This wizard will export all data that matches the current search criteria to "
"a CSV file.\n"
" You can export all data or only the fields that can be "
"reimported after modification."
"This wizard will export all data that matches the current search criteria to a CSV file.\n"
" You can export all data or only the fields that can be reimported after modification."
#. module: web
#. openerp-web
@@ -2584,7 +2576,8 @@ msgstr ""
#. openerp-web
#: code:addons/web/static/src/js/framework/misc.js:17
#, python-format
msgid "You may not believe it,<br />but the application is actually loading..."
msgid ""
"You may not believe it,<br />but the application is actually loading..."
msgstr ""
"You may not believe it,<br />but the application is actually loading..."
+16 -22
View File
@@ -12,16 +12,13 @@ msgstr ""
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2016-02-22 05:01+0000\n"
"Last-Translator: Rick Hunter <rick_hunter_ec@yahoo.com>\n"
"Language-Team: Spanish (Ecuador) (http://www.transifex.com/odoo/odoo-9/"
"language/es_EC/)\n"
"Language-Team: Spanish (Ecuador) (http://www.transifex.com/odoo/odoo-9/language/es_EC/)\n"
"Language: es_EC\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"#-#-#-#-# es_EC.po (Odoo 9.0) #-#-#-#-#\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"#-#-#-#-# es_EC.po (Odoo 9.0) #-#-#-#-#\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: web
#. openerp-web
@@ -1472,8 +1469,8 @@ msgstr "Sin actualizar:"
#: code:addons/web/static/src/js/views/graph_widget.js:95
#, python-format
msgid ""
"No data available for this chart. Try to add some records, or make sure that "
"there is no active filter in the search bar."
"No data available for this chart. Try to add some records, or make sure that"
" there is no active filter in the search bar."
msgstr ""
"No existen datos disponibles para este gráfico. Trate de añadir algunos "
"récords, o asegúrese que no existan filtros activos en la barra de búsqueda."
@@ -1483,10 +1480,8 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:691
#, python-format
msgid ""
"No data available for this pivot table. Try to add some records, or make "
"sure\n"
" that there is at least one measure and no active filter in "
"the search bar."
"No data available for this pivot table. Try to add some records, or make sure\n"
" that there is at least one measure and no active filter in the search bar."
msgstr ""
"No existen datos disponibles para esta tabla dinámica. Trate de añadir "
"algunos registros, o asegúrese que exista por lo menos una medida y no "
@@ -1727,8 +1722,8 @@ msgid ""
"Pie chart cannot display all zero numbers.. Try to change your domain to "
"display positive results"
msgstr ""
"Los gráficos de pastel no pueden mostrar los números 0. Trate de cambiar sus "
"filtros para mostrar los resultados positivos."
"Los gráficos de pastel no pueden mostrar los números 0. Trate de cambiar sus"
" filtros para mostrar los resultados positivos."
#. module: web
#. openerp-web
@@ -2221,18 +2216,18 @@ msgstr ""
#: code:addons/web/static/src/js/views/form_widgets.js:1199
#, python-format
msgid "The selected file exceed the maximum file size of %s."
msgstr "El archivo seleccionado supera el tamaño máximo de% s."
msgstr "El archivo seleccionado supera el tamaño máximo de %s."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/form_relational_widgets.js:1550
#, python-format
msgid ""
"The type of the field '%s' must be a many2many field with a relation to 'ir."
"attachment' model."
"The type of the field '%s' must be a many2many field with a relation to "
"'ir.attachment' model."
msgstr ""
"El tipo de campo '%s' debe ser un campo many2many con una relación a 'ir."
"attachment' model."
"El tipo de campo '%s' debe ser un campo many2many con una relación a "
"'ir.attachment' model."
#. module: web
#. openerp-web
@@ -2261,10 +2256,8 @@ msgstr "El recurso esta vacío"
#: code:addons/web/static/src/xml/base.xml:1304
#, python-format
msgid ""
"This wizard will export all data that matches the current search criteria to "
"a CSV file.\n"
" You can export all data or only the fields that can be "
"reimported after modification."
"This wizard will export all data that matches the current search criteria to a CSV file.\n"
" You can export all data or only the fields that can be reimported after modification."
msgstr ""
"Este asistente exportará todos los datos que coincidan con el criterio de "
"búsqueda actual a un archivo CSV.\n"
@@ -2607,7 +2600,8 @@ msgstr ""
#. openerp-web
#: code:addons/web/static/src/js/framework/misc.js:17
#, python-format
msgid "You may not believe it,<br />but the application is actually loading..."
msgid ""
"You may not believe it,<br />but the application is actually loading..."
msgstr ""
"Usted no lo creerá,<br />pero la aplicación actualmente está cargando ..."
+3
View File
@@ -11,6 +11,9 @@ $.extend($.expr[':'], {
containsLike: function (element, index, matches){
return element.innerHTML.toUpperCase().indexOf(matches[3].toUpperCase()) >= 0;
},
containsTextLike: function (element, index, matches){
return element.innerText.toUpperCase().indexOf(matches[3].toUpperCase()) >= 0;
},
containsExact: function (element, index, matches){
return $.trim(element.innerHTML) === matches[3];
},
@@ -256,7 +256,7 @@ var BasicRenderer = AbstractRenderer.extend({
// If the view is in edit mode and that a widget have to switch
// its "readonly" state, we have to re-render it completely
if ('readonly' in modifiers && element.widget) {
var mode = modifiers.readonly ? 'readonly' : modifiersData.baseMode;
var mode = modifiers.readonly ? 'readonly' : modifiersData.baseModeByRecord[record.id];
if (mode !== element.widget.mode) {
self._rerenderFieldWidget(element.widget, record, {
keepBaseMode: true,
@@ -416,16 +416,17 @@ var BasicRenderer = AbstractRenderer.extend({
* @param {Object} [options.callback] the callback to call on registration
* and on modifiers updates
* @param {boolean} [options.keepBaseMode=false] this function registers the
* 'baseMode' of the node; this is a field widget specific settings which
* 'baseMode' of the node on a per record basis;
* this is a field widget specific settings which
* represents the generic mode of the widget, regardless of its modifiers
* (the interesting case is the list view: all widgets are supposed to be
* in the baseMode 'readonly', except the ones that are in the line that
* is currently being edited).
* With option 'keepBaseMode' set to true, the current baseMode of the
* With option 'keepBaseMode' set to true, the baseMode of the record's
* node isn't overridden (this is particularily useful when a field widget
* is re-rendered because its readonly modifier changed, as in this case,
* we don't want to change its base mode).
* @param {string} [options.mode] the 'baseMode' of the node is set to this
* @param {string} [options.mode] the 'baseMode' of the record's node is set to this
* value (if not given, it is set to this.mode, the mode of the renderer)
* @returns {Object} for code efficiency, returns the last evaluated
* modifiers for the given node and record.
@@ -443,15 +444,16 @@ var BasicRenderer = AbstractRenderer.extend({
modifiers: modifiers,
evaluatedModifiers: {},
elementsByRecord: {},
baseModeByRecord : {},
};
if (!_.isEmpty(modifiers)) { // Register only if modifiers might change (TODO condition might be improved here)
this.allModifiersData.push(modifiersData);
}
}
// Compute node's base mode if necessary
if (!options.keepBaseMode) {
modifiersData.baseMode = options.mode || this.mode;
// Compute the record's base mode
if (!modifiersData.baseModeByRecord[record.id] || !options.keepBaseMode) {
modifiersData.baseModeByRecord[record.id] = options.mode || this.mode;
}
// Evaluate if necessary
@@ -504,8 +504,8 @@ ListRenderer.include({
var $row = this._super.apply(this, arguments);
if (this.addTrashIcon) {
var $icon = this.isMany2Many ?
$('<i>', {class: 'fa fa-times', name: 'unlink'}) :
$('<i>', {class: 'fa fa-trash-o', name: 'delete'});
$('<button>', {class: 'fa fa-times o_list_record_remove', name: 'unlink', 'aria-label': _t('Unlink row ') + (index+1)}) :
$('<button>', {class: 'fa fa-trash-o o_list_record_remove', name: 'delete', 'aria-label': _t('Delete row ') + (index+1)});
var $td = $('<td>', {class: 'o_list_record_remove'}).append($icon);
$row.append($td);
}
@@ -70,6 +70,14 @@
width: 1px; // to prevent the column to expand
}
.o_list_record_delete_btn {
padding: 0px;
background-style: none;
border-style: none;
height: 0px;
display: table-cell;
}
// Decoration of the row
.text-bf {
font-weight: bold;
@@ -2261,6 +2261,65 @@ QUnit.module('relational_fields', {
QUnit.module('FieldOne2Many');
QUnit.test('one2many list editable with cell readonly modifier', function (assert) {
assert.expect(4);
this.data.partner.records[0].p = [2];
this.data.partner.records[1].turtles = [1,2];
var form = createView({
View: FormView,
model: 'partner',
data: this.data,
arch:'<form string="Partners">' +
'<field name="p">' +
'<tree editable="bottom">' +
'<field name="turtles" invisible="1"/>' +
'<field name="foo" attrs="{&quot;readonly&quot; : [(&quot;turtles&quot;, &quot;!=&quot;, [])] }"/>' +
'<field name="qux" attrs="{&quot;readonly&quot; : [(&quot;turtles&quot;, &quot;!=&quot;, [])] }"/>' +
'</tree>' +
'</field>' +
'</form>',
res_id: 1,
mockRPC: function (route, args) {
if (route === '/web/dataset/call_kw/partner/write') {
assert.deepEqual(args.args[1].p[1][2], {foo: 'ff', qux: 99},
'The right values should be written');
}
return this._super(route, args);
}
});
form.$buttons.find('.o_form_button_edit').click();
form.$('.o_field_x2many_list_row_add a').click();
var $targetInput = $('.o_selected_row .o_input[name=foo]');
assert.equal($targetInput[0], document.activeElement,
'The first input of the line should have the focus');
// Simulating hitting the 'f' key twice
$targetInput.val('f').trigger('input');
$targetInput.val($targetInput.val() + 'f').trigger('input');
assert.equal($targetInput[0], document.activeElement,
'The first input of the line should still have the focus');
// Simulating a TAB key
$targetInput.trigger($.Event('keydown', {which: 9, keyCode:9}));
var $secondTarget = $('.o_selected_row .o_input[name=qux]');
assert.equal($secondTarget[0], document.activeElement,
'The second input of the line should have the focus after the TAB press');
$secondTarget.val(9).trigger('input');
$secondTarget.val($secondTarget.val() + 9).trigger('input');
form.$buttons.find('.o_form_button_save').click();
form.destroy();
});
QUnit.test('one2many basic properties', function (assert) {
assert.expect(6);
@@ -3891,13 +3950,13 @@ QUnit.module('relational_fields', {
});
form.$buttons.find('.o_form_button_edit').click();
assert.strictEqual(form.$('td.o_list_record_remove i').length, 2,
assert.strictEqual(form.$('td.o_list_record_remove button').length, 2,
"should have 2 remove buttons");
assert.ok(form.$('td.o_list_record_remove i').first().hasClass('fa fa-times'),
assert.ok(form.$('td.o_list_record_remove button').first().hasClass('fa fa-times'),
"should have X icons to remove (unlink) records");
form.$('td.o_list_record_remove i').first().click();
form.$('td.o_list_record_remove button').first().click();
assert.strictEqual(form.$('td.o_list_record_remove i').length, 1,
"should have 1 remove button (a record is supposed to have been unlinked)");
@@ -3937,13 +3996,13 @@ QUnit.module('relational_fields', {
});
form.$buttons.find('.o_form_button_edit').click();
assert.strictEqual(form.$('td.o_list_record_remove i').length, 2,
assert.strictEqual(form.$('td.o_list_record_remove button').length, 2,
"should have 2 remove buttons");
assert.ok(form.$('td.o_list_record_remove i').first().hasClass('fa fa-trash-o'),
assert.ok(form.$('td.o_list_record_remove button').first().hasClass('fa fa-trash-o'),
"should have trash bin icons to remove (delete) records");
form.$('td.o_list_record_remove i').first().click();
form.$('td.o_list_record_remove button').first().click();
assert.strictEqual(form.$('td.o_list_record_remove i').length, 1,
"should have 1 remove button (a record is supposed to have been deleted)");
@@ -6689,8 +6748,8 @@ QUnit.module('relational_fields', {
form.$('input.o_field_integer[name="int_field"]').val('0').trigger('input');
// remove and start over
form.$('.o_list_record_remove:first i').click();
form.$('.o_list_record_remove:first i').click();
form.$('.o_list_record_remove:first button').click();
form.$('.o_list_record_remove:first button').click();
// enable the many2many onchange
form.$('input.o_field_integer[name="int_field"]').val('10').trigger('input');
@@ -8423,7 +8482,7 @@ QUnit.module('relational_fields', {
mode: 'edit',
},
});
form.$('.o_list_record_remove:first i').click();
form.$('.o_list_record_remove:first button').click();
assert.strictEqual(form.$('.o_data_row').text(), 'from onchange',
'onchange has been properly applied');
form.destroy();
@@ -8463,7 +8522,7 @@ QUnit.module('relational_fields', {
mode: 'edit',
},
});
form.$('.o_list_record_remove:first i').click();
form.$('.o_list_record_remove:first button').click();
assert.strictEqual(form.$('.o_data_row').text(), 'from onchange id2from onchange id3',
'onchange has been properly applied');
form.destroy();
@@ -1141,7 +1141,7 @@ body.editor_enable {
width: @o-switch-size - 0.2;
height: @o-switch-size - 0.2;
margin-top: 0.1ex;
margin-left: 0.3ex;
margin-left: 0.1ex;
border-radius: 100rem;
.transition(all 0.3s @o-we-md-ease);
box-shadow: 0 1px 1px darken(@o-switch-inactive-color,35%), inset 0 0 0 1px lighten(@o-switch-inactive-color,10%);
@@ -1157,6 +1157,14 @@ body.editor_enable {
}
}
}
&.o_switch_danger {
> input {
&:not(:checked) + span {
box-shadow: none;
.o-linear-gradient(0deg, lighten(@brand-danger, 5%), darken(@brand-danger, 5%));
}
}
}
}
.dropdown-menu label .o_switch {
@@ -242,6 +242,7 @@ var WebsiteRoot = BodyManager.extend({
})
.done(function (result) {
$data.toggleClass("css_unpublished css_published");
$(".ribbon-publish.ribbon-wrapper").toggleClass("css_unpublished css_published");
$data.find('input').prop("checked", result);
$data.parents("[data-publish]").attr("data-publish", +result ? 'on' : 'off');
})
@@ -534,3 +534,37 @@ body .modal {
color: @odoo-brand-optional;
}
}
// Unpublished page's ribbon
.ribbon-publish.ribbon-wrapper {
width: 200px;
height: 200px;
z-index: 5;
position: absolute;
right: 0;
overflow: hidden;
&.css_published {
display:none;
}
&.css_unpublished {
display:block;
}
}
.ribbon-publish .ribbon {
font: bold 15px Sans-Serif;
color: white;
text-align: center;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
position: relative;
padding: 7px 65px;
right: 27px;
top: 44px;
width: 300px;
cursor: default;
white-space: unset;
word-wrap:break-word;
}
@@ -5,6 +5,11 @@
<xpath expr="//t[@t-set='html_data']" position="after">
<t t-set="body_classname" t-value="'o_connected_user' if env['ir.ui.view'].user_has_groups('base.group_user') else None"/>
</xpath>
<xpath expr="//div[@id='wrapwrap']//header" position="after">
<div t-if="'website_published' in main_object.fields_get()" t-attf-class="ribbon-publish ribbon-wrapper #{main_object.website_published and 'css_published' or 'css_unpublished'}">
<div class="ribbon btn btn-danger">Unpublished</div>
</div>
</xpath>
<xpath expr="//div[@id='wrapwrap']" position="before">
<nav groups="base.group_user" t-if="website and menu_data" id="oe_main_menu_navbar" class="o_main_navbar">
<ul id="oe_applications">
@@ -61,7 +66,7 @@
<ul class="o_menu_systray hidden-xs" groups="website.group_website_publisher">
<li t-if="'website_published' in main_object.fields_get()" t-attf-class="js_publish_management #{main_object.website_published and 'css_published' or 'css_unpublished'}" t-att-data-id="main_object.id" t-att-data-object="main_object._name" t-att-data-controller="publish_controller">
<a>
<label class="o_switch js_publish_btn" for="id" >
<label class="o_switch o_switch_danger js_publish_btn" for="id" >
<input type="checkbox" t-att-checked="main_object.website_published" id="id"/>
<span/>
<span class="css_publish">Unpublished</span>
+2 -1
View File
@@ -5,7 +5,8 @@ import werkzeug
from odoo import exceptions, fields, http, _
from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal, get_records_pager
from odoo.addons.portal.controllers.portal import get_records_pager
from odoo.addons.sale.controllers.portal import CustomerPortal
from odoo.addons.portal.controllers.mail import _message_post_helper
@@ -277,7 +277,7 @@ var BaseSettingRenderer = FormRenderer.extend({
module.settingView.find('h2').addClass('o_hidden');
module.settingView.find('.settingSearchHeader').addClass('o_hidden');
module.settingView.find('.o_settings_container').removeClass('mt16');
var resultSetting = module.settingView.find("label:containsLike('" + self.searchText + "')");
var resultSetting = module.settingView.find("label:containsTextLike('" + self.searchText + "')");
if (resultSetting.length > 0) {
resultSetting.each(function () {
var settingBox = $(this).closest('.o_setting_box');
@@ -408,7 +408,7 @@ odoo.define('web.test.x2many', function (require) {
trigger: '.ui-autocomplete a:first',
}, { // remove record
content: "delete the last item in the editable list",
trigger: '.o_list_view .o_data_row td.o_list_record_remove i:visible:last',
trigger: '.o_list_view .o_data_row td.o_list_record_remove button:visible:last',
}, {
content: "test one2many onchange after delete",
trigger: '.o_content:not(:has(textarea[name="message_concat"]:propValueContains(Administrator:d)))',