IoTBox
diff --git a/addons/l10n_fr_fec/wizard/account_fr_fec.py b/addons/l10n_fr_fec/wizard/account_fr_fec.py
index d91f4858c88..0a6459a0953 100644
--- a/addons/l10n_fr_fec/wizard/account_fr_fec.py
+++ b/addons/l10n_fr_fec/wizard/account_fr_fec.py
@@ -8,7 +8,7 @@ import io
from odoo import api, fields, models, _
from odoo.exceptions import Warning
-from odoo.tools import pycompat
+from odoo.tools import float_is_zero, pycompat
class AccountFrFec(models.TransientModel):
@@ -182,14 +182,16 @@ class AccountFrFec(models.TransientModel):
sql_query += '''
GROUP BY aml.account_id, aat.type
- HAVING sum(aml.balance) != 0
+ HAVING round(sum(aml.balance), %s) != 0
AND aat.type not in ('receivable', 'payable')
'''
formatted_date_from = fields.Date.to_string(self.date_from).replace('-', '')
date_from = self.date_from
formatted_date_year = date_from.year
+ currency_digits = 2
+
self._cr.execute(
- sql_query, (formatted_date_year, formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id))
+ sql_query, (formatted_date_year, formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id, currency_digits))
for row in self._cr.fetchall():
listrow = list(row)
@@ -202,6 +204,8 @@ class AccountFrFec(models.TransientModel):
current_amount = float(listrow[11].replace(',', '.')) - float(listrow[12].replace(',', '.'))
unaffected_earnings_amount = float(unaffected_earnings_results[11].replace(',', '.')) - float(unaffected_earnings_results[12].replace(',', '.'))
listrow_amount = current_amount + unaffected_earnings_amount
+ if float_is_zero(listrow_amount, precision_digits=currency_digits):
+ continue
if listrow_amount > 0:
listrow[11] = str(listrow_amount).replace('.', ',')
listrow[12] = '0,00'
@@ -269,11 +273,11 @@ class AccountFrFec(models.TransientModel):
sql_query += '''
GROUP BY aml.account_id, aat.type, rp.ref, rp.id
- HAVING sum(aml.balance) != 0
+ HAVING round(sum(aml.balance), %s) != 0
AND aat.type in ('receivable', 'payable')
'''
self._cr.execute(
- sql_query, (formatted_date_year, formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id))
+ sql_query, (formatted_date_year, formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id, currency_digits))
for row in self._cr.fetchall():
listrow = list(row)
diff --git a/addons/l10n_mx/data/account_tax_data.xml b/addons/l10n_mx/data/account_tax_data.xml
index 13f78068494..12555ba9ed4 100644
--- a/addons/l10n_mx/data/account_tax_data.xml
+++ b/addons/l10n_mx/data/account_tax_data.xml
@@ -208,6 +208,7 @@
on_payment
+
@@ -223,6 +224,7 @@
on_payment
+
diff --git a/addons/link_tracker/models/link_tracker.py b/addons/link_tracker/models/link_tracker.py
index 645171c8279..2e565a06691 100644
--- a/addons/link_tracker/models/link_tracker.py
+++ b/addons/link_tracker/models/link_tracker.py
@@ -185,11 +185,11 @@ class LinkTracker(models.Model):
@api.model
def recent_links(self, filter, limit):
if filter == 'newest':
- return self.search_read([], order='create_date DESC', limit=limit)
+ return self.search_read([], order='create_date DESC, id DESC', limit=limit)
elif filter == 'most-clicked':
return self.search_read([('count', '!=', 0)], order='count DESC', limit=limit)
elif filter == 'recently-used':
- return self.search_read([('count', '!=', 0)], order='write_date DESC', limit=limit)
+ return self.search_read([('count', '!=', 0)], order='write_date DESC, id DESC', limit=limit)
else:
return {'Error': "This filter doesn't exist."}
diff --git a/addons/mail/models/ir_attachment.py b/addons/mail/models/ir_attachment.py
index acc14b2b6f9..4330059c495 100644
--- a/addons/mail/models/ir_attachment.py
+++ b/addons/mail/models/ir_attachment.py
@@ -23,5 +23,5 @@ class IrAttachment(models.Model):
related_record = self.env[self.res_model].browse(self.res_id)
# message_main_attachment_id field can be empty, that's why we compare to False;
# we are just checking that it exists on the model before writing it
- if hasattr(related_record, 'message_main_attachment_id'):
+ if related_record and hasattr(related_record, 'message_main_attachment_id'):
related_record.message_main_attachment_id = self
diff --git a/addons/mrp/models/mrp_abstract_workorder.py b/addons/mrp/models/mrp_abstract_workorder.py
index 9d4667cf542..50f4935375c 100644
--- a/addons/mrp/models/mrp_abstract_workorder.py
+++ b/addons/mrp/models/mrp_abstract_workorder.py
@@ -197,6 +197,7 @@ class MrpAbstractWorkorder(models.AbstractModel):
move_line.product_uom_qty += self.qty_producing
move_line.qty_done += self.qty_producing
else:
+ location_dest_id = production_move.location_dest_id.get_putaway_strategy(self.product_id).id or production_move.location_dest_id.id
move_line.create({
'move_id': production_move.id,
'product_id': production_move.product_id.id,
@@ -205,7 +206,7 @@ class MrpAbstractWorkorder(models.AbstractModel):
'product_uom_id': self.product_uom_id.id,
'qty_done': self.qty_producing,
'location_id': production_move.location_id.id,
- 'location_dest_id': production_move.location_dest_id.id,
+ 'location_dest_id': location_dest_id,
})
else:
rounding = production_move.product_uom.rounding
diff --git a/addons/mrp/tests/test_stock.py b/addons/mrp/tests/test_stock.py
index da3db148b68..a83855a8303 100644
--- a/addons/mrp/tests/test_stock.py
+++ b/addons/mrp/tests/test_stock.py
@@ -7,6 +7,52 @@ from odoo.tests import Form
class TestWarehouse(common.TestMrpCommon):
+ def setUp(self):
+ super(TestWarehouse, self).setUp()
+
+ self.stock_location = self.env.ref('stock.stock_location_stock')
+ self.depot_location = self.env['stock.location'].create({
+ 'name': 'Depot',
+ 'usage': 'internal',
+ 'location_id': self.stock_location.id,
+ })
+ putaway = self.env['product.putaway'].create({
+ 'name': 'putaway stock->depot',
+ 'fixed_location_ids': [(0, 0, {
+ 'category_id': self.env.ref('product.product_category_all').id,
+ 'fixed_location_id': self.depot_location.id,
+ })]
+ })
+ self.stock_location.write({
+ 'putaway_strategy_id': putaway.id,
+ })
+
+ self.laptop = self.env.ref("product.product_product_25")
+ graphics_card = self.env.ref("product.product_product_24")
+ unit = self.env.ref("uom.product_uom_unit")
+ mrp_routing = self.env.ref("mrp.mrp_routing_0")
+
+ self.bom_laptop = self.env['mrp.bom'].create({
+ 'product_tmpl_id': self.laptop.product_tmpl_id.id,
+ 'product_qty': 1,
+ 'product_uom_id': unit.id,
+ 'bom_line_ids': [(0, 0, {
+ 'product_id': graphics_card.id,
+ 'product_qty': 1,
+ 'product_uom_id': unit.id
+ })],
+ 'routing_id': mrp_routing.id
+ })
+
+ def new_mo_laptop(self):
+ form = Form(self.env['mrp.production'])
+ form.product_id = self.laptop
+ form.product_qty = 1
+ form.bom_id = self.bom_laptop
+ p = form.save()
+ p.action_confirm()
+ p.action_assign()
+ return p
def test_manufacturing_route(self):
warehouse_1_stock_manager = self.warehouse_1.sudo(self.user_stock_manager)
@@ -103,6 +149,71 @@ class TestWarehouse(common.TestMrpCommon):
# scrap_move = production_3.move_raw_ids.filtered(lambda x: x.product_id == self.product_2 and x.scrapped)
# self.assertTrue(scrap_move, "There are no any scrap move created for production order.")
+ def test_putaway_after_manufacturing_1(self):
+ """ This test checks a manufactured product without tracking will go to
+ location defined in putaway strategy.
+ """
+ mo_laptop = self.new_mo_laptop()
+
+ mo_laptop.button_plan()
+ workorder = mo_laptop.workorder_ids[0]
+
+ workorder.button_start()
+ workorder.record_production()
+ mo_laptop.button_mark_done()
+
+ # We check if the laptop go in the depot and not in the stock
+ move = mo_laptop.move_finished_ids
+ location_dest = move.move_line_ids.location_dest_id
+ self.assertEqual(location_dest.id, self.depot_location.id)
+ self.assertNotEqual(location_dest.id, self.stock_location.id)
+
+ def test_putaway_after_manufacturing_2(self):
+ """ This test checks a tracked manufactured product will go to location
+ defined in putaway strategy.
+ """
+ self.laptop.tracking = 'serial'
+ mo_laptop = self.new_mo_laptop()
+
+ mo_laptop.button_plan()
+ workorder = mo_laptop.workorder_ids[0]
+
+ workorder.button_start()
+ serial = self.env['stock.production.lot'].create({'product_id': self.laptop.id})
+ workorder.final_lot_id = serial
+ workorder.record_production()
+ mo_laptop.button_mark_done()
+
+ # We check if the laptop go in the depot and not in the stock
+ move = mo_laptop.move_finished_ids
+ location_dest = move.move_line_ids.location_dest_id
+ self.assertEqual(location_dest.id, self.depot_location.id)
+ self.assertNotEqual(location_dest.id, self.stock_location.id)
+
+ def test_putaway_after_manufacturing_3(self):
+ """ This test checks a tracked manufactured product will go to location
+ defined in putaway strategy when the production is recorded with
+ product.produce wizard.
+ """
+ self.laptop.tracking = 'serial'
+ mo_laptop = self.new_mo_laptop()
+ serial = self.env['stock.production.lot'].create({'product_id': self.laptop.id})
+
+ product_produce = self.env['mrp.product.produce'].with_context({
+ 'active_id': mo_laptop.id,
+ 'active_ids': [mo_laptop.id],
+ }).create({
+ 'product_qty': 1.0,
+ 'lot_id': serial.id,
+ })
+ product_produce.do_produce()
+ mo_laptop.button_mark_done()
+
+ # We check if the laptop go in the depot and not in the stock
+ move = mo_laptop.move_finished_ids
+ location_dest = move.move_line_ids.location_dest_id
+ self.assertEqual(location_dest.id, self.depot_location.id)
+ self.assertNotEqual(location_dest.id, self.stock_location.id)
class TestKitPicking(common.TestMrpCommon):
def setUp(self):
diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py
index 262273d76d1..0f2ce5d222a 100644
--- a/addons/payment/models/payment_acquirer.py
+++ b/addons/payment/models/payment_acquirer.py
@@ -355,6 +355,7 @@ class PaymentAcquirer(models.Model):
if values is None:
values = {}
+ values.setdefault('return_url', '/payment/process')
# reference and amount
values.setdefault('reference', reference)
amount = float_round(amount, 2)
@@ -446,7 +447,6 @@ class PaymentAcquirer(models.Model):
'context': self._context,
'type': values.get('type') or 'form',
})
- values.setdefault('return_url', False)
_logger.info('payment.acquirer.render: <%s> values rendered for form payment:\n%s', self.provider, pprint.pformat(values))
return self.view_template_id.render(values, engine='ir.qweb')
diff --git a/addons/payment/static/src/js/payment_processing.js b/addons/payment/static/src/js/payment_processing.js
index 3497297d665..4397bf134f1 100644
--- a/addons/payment/static/src/js/payment_processing.js
+++ b/addons/payment/static/src/js/payment_processing.js
@@ -81,14 +81,16 @@ odoo.define('payment.processing', function (require) {
'tx_cancel': [],
'tx_error': [],
};
+
+ if (transactions.length > 0 && transactions[0].acquirer_provider == 'transfer') {
+ window.location = transactions[0].return_url;
+ return;
+ }
+
// group the transaction according to their state
transactions.forEach(function (tx) {
var key = 'tx_' + tx.state;
if(key in render_values) {
- if (tx.acquirer_provider === 'transfer') {
- window.location = tx.return_url;
- return;
- }
render_values[key].push(tx);
}
});
diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py
index 1101c9137c1..548126af642 100644
--- a/addons/point_of_sale/models/pos_order.py
+++ b/addons/point_of_sale/models/pos_order.py
@@ -895,6 +895,7 @@ class PosOrder(models.Model):
for pack_lot in pack_lots:
lot_id, qty = pack_lot['lot_id'], pack_lot['qty']
self.env['stock.move.line'].create({
+ 'picking_id': move.picking_id.id,
'move_id': move.id,
'product_id': move.product_id.id,
'product_uom_id': move.product_uom.id,
diff --git a/addons/point_of_sale/static/src/css/customer_facing_display.css b/addons/point_of_sale/static/src/css/customer_facing_display.css
index e8e97cf4c7e..2d572060342 100644
--- a/addons/point_of_sale/static/src/css/customer_facing_display.css
+++ b/addons/point_of_sale/static/src/css/customer_facing_display.css
@@ -35,6 +35,7 @@ body .pos-customer_facing_display {
font-weight: 300;
width: 100%;
height: 100%;
+ padding: 0;
-webkit-display: flex;
-moz-display: flex;
-ms-display: flex;
diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css
index 8fefe02fa09..0e8fb74e92c 100644
--- a/addons/point_of_sale/static/src/css/pos.css
+++ b/addons/point_of_sale/static/src/css/pos.css
@@ -731,7 +731,7 @@ td {
border-top-right-radius: 4px;
}
.pos .numpad button {
- float: left;
+ float: left/*rtl:ignore*/; /* rtlcss forced to keep ltr */
height: 54px;
width: 54px;
font-weight: bold;
@@ -2321,6 +2321,7 @@ td {
margin-right: 3px;
}
.pos .popup-numpad {
+ direction: ltr/*rtl:ignore*/; /* rtlcss forced to keep ltr */
margin: 12px auto;
text-align: center;
width: 254px;
diff --git a/addons/point_of_sale/static/src/scss/customer_facing_display.scss b/addons/point_of_sale/static/src/scss/customer_facing_display.scss
index 766ac34cb1e..25e0a0bc324 100644
--- a/addons/point_of_sale/static/src/scss/customer_facing_display.scss
+++ b/addons/point_of_sale/static/src/scss/customer_facing_display.scss
@@ -95,6 +95,7 @@ body {
font-weight: 300;
width: 100%;
height: 100%;
+ padding: 0;
@include flex-display;
@include flex-direction(row);
diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py
index 2f17441f451..8ac87a59ee6 100644
--- a/addons/portal/wizard/portal_wizard.py
+++ b/addons/portal/wizard/portal_wizard.py
@@ -87,7 +87,7 @@ class PortalWizardUser(models.TransientModel):
partners_error_empty |= wizard_user.partner_id
elif email in emails:
partners_error_emails |= wizard_user.partner_id
- user = self.env['res.users'].sudo().with_context(active_test=False).search([('login', '=', email)])
+ user = self.env['res.users'].sudo().with_context(active_test=False).search([('login', '=ilike', email)])
if user:
partners_error_user |= wizard_user.partner_id
emails.append(email)
diff --git a/addons/product/models/product_pricelist.py b/addons/product/models/product_pricelist.py
index 5f40c360d23..de1fd231b8f 100644
--- a/addons/product/models/product_pricelist.py
+++ b/addons/product/models/product_pricelist.py
@@ -308,6 +308,7 @@ class Pricelist(models.Model):
return pricelist.get_products_price(
list(zip(**products_by_qty_by_partner)))
+ # DEPRECATED (Not used anymore, see d39d583b2) -> Remove me in master (saas12.3)
def _get_partner_pricelist(self, partner_id, company_id=None):
""" Retrieve the applicable pricelist for a given partner in a given company.
@@ -317,34 +318,53 @@ class Pricelist(models.Model):
res = self._get_partner_pricelist_multi([partner_id], company_id)
return res[partner_id].id
+ def _get_partner_pricelist_multi_search_domain_hook(self):
+ return []
+
+ def _get_partner_pricelist_multi_filter_hook(self):
+ return self
+
def _get_partner_pricelist_multi(self, partner_ids, company_id=None):
""" Retrieve the applicable pricelist for given partners in a given company.
+ It will return the first found pricelist in this order:
+ First, the pricelist of the specific property (res_id set), this one
+ is created when saving a pricelist on the partner form view.
+ Else, it will return the pricelist of the partner country group
+ Else, it will return the generic property (res_id not set), this one
+ is created on the company creation.
+ Else, it will return the first available pricelist
+
:param company_id: if passed, used for looking up properties,
instead of current user's company
:return: a dict {partner_id: pricelist}
"""
- Partner = self.env['res.partner']
+ # `partner_ids` might be ID from inactive uers. We should use active_test
+ # as we will do a search() later (real case for website public user).
+ Partner = self.env['res.partner'].with_context(active_test=False)
+
Property = self.env['ir.property'].with_context(force_company=company_id or self.env.user.company_id.id)
Pricelist = self.env['product.pricelist']
+ pl_domain = self._get_partner_pricelist_multi_search_domain_hook()
- # retrieve values of property
+ # if no specific property, try to find a fitting pricelist
result = Property.get_multi('property_product_pricelist', Partner._name, partner_ids)
- remaining_partner_ids = [pid for pid, val in result.items() if not val]
+ remaining_partner_ids = [pid for pid, val in result.items() if not val or
+ not val._get_partner_pricelist_multi_filter_hook()]
if remaining_partner_ids:
# get fallback pricelist when no pricelist for a given country
pl_fallback = (
- Pricelist.search([('country_group_ids', '=', False)], limit=1) or
+ Pricelist.search(pl_domain + [('country_group_ids', '=', False)], limit=1) or
Property.get('property_product_pricelist', 'res.partner') or
- Pricelist.search([], limit=1)
+ Pricelist.search(pl_domain, limit=1)
)
# group partners by country, and find a pricelist for each country
domain = [('id', 'in', remaining_partner_ids)]
groups = Partner.read_group(domain, ['country_id'], ['country_id'])
for group in groups:
country_id = group['country_id'] and group['country_id'][0]
- pl = Pricelist.search([('country_group_ids.country_ids', '=', country_id)], limit=1)
+ pl = Pricelist.search(pl_domain + [('country_group_ids.country_ids', '=', country_id)], limit=1)
pl = pl or pl_fallback
for pid in Partner.search(group['__domain']).ids:
result[pid] = pl
diff --git a/addons/project/views/project_portal_templates.xml b/addons/project/views/project_portal_templates.xml
index db82de63fe8..14498944913 100644
--- a/addons/project/views/project_portal_templates.xml
+++ b/addons/project/views/project_portal_templates.xml
@@ -238,7 +238,7 @@
-
+
diff --git a/addons/purchase/report/purchase_bill.py b/addons/purchase/report/purchase_bill.py
index a16ff44b60c..036309e8e29 100644
--- a/addons/purchase/report/purchase_bill.py
+++ b/addons/purchase/report/purchase_bill.py
@@ -30,7 +30,7 @@ class PurchaseBillUnion(models.Model):
id as vendor_bill_id, NULL as purchase_order_id
FROM account_invoice
WHERE
- type='in_invoice' and state in ('open','in_payment','paid','cancel')
+ type='in_invoice' and COALESCE(number, '') != ''
UNION
SELECT
-id, name, partner_ref, partner_id, date_order::date as date, amount_untaxed as amount, currency_id, company_id,
diff --git a/addons/sale_timesheet/models/sale_order.py b/addons/sale_timesheet/models/sale_order.py
index 75e7953e903..c76798bce10 100644
--- a/addons/sale_timesheet/models/sale_order.py
+++ b/addons/sale_timesheet/models/sale_order.py
@@ -51,7 +51,10 @@ class SaleOrder(models.Model):
def _action_confirm(self):
""" On SO confirmation, some lines should generate a task or a project. """
result = super(SaleOrder, self)._action_confirm()
- self.mapped('order_line').sudo().with_context(default_company_id=self.company_id.id)._timesheet_service_generation()
+ self.mapped('order_line').sudo().with_context(
+ default_company_id=self.company_id.id,
+ force_company=self.company_id.id,
+ )._timesheet_service_generation()
return result
@api.multi
diff --git a/addons/stock/models/stock_traceability.py b/addons/stock/models/stock_traceability.py
index 2a30571b539..b1345bed60f 100644
--- a/addons/stock/models/stock_traceability.py
+++ b/addons/stock/models/stock_traceability.py
@@ -81,10 +81,11 @@ class MrpStockReport(models.TransientModel):
res_model = ''
ref = ''
res_id = False
- if move_line.picking_id:
+ picking_id = move_line.picking_id or move_line.move_id.picking_id
+ if picking_id:
res_model = 'stock.picking'
- res_id = move_line.picking_id.id
- ref = move_line.picking_id.name
+ res_id = picking_id.id
+ ref = picking_id.name
elif move_line.move_id.inventory_id:
res_model = 'stock.inventory'
res_id = move_line.move_id.inventory_id.id
diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js
index 72e65f985a8..5126138bc36 100644
--- a/addons/web/static/lib/qweb/qweb2.js
+++ b/addons/web/static/lib/qweb/qweb2.js
@@ -173,7 +173,7 @@ var QWeb2 = {
new_dict[as_first] = index === 0;
new_dict[as_last] = index + 1 === size;
new_dict[as_parity] = (index % 2 == 1 ? 'odd' : 'even');
- if (cur.constructor === Object) {
+ if (cur && cur.constructor === Object) {
this.extend(new_dict, cur);
}
new_dict[as] = cur;
diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js
index ca26d7e90ad..a10e75f1944 100644
--- a/addons/web/static/src/js/views/form/form_renderer.js
+++ b/addons/web/static/src/js/views/form/form_renderer.js
@@ -370,7 +370,7 @@ var FormRenderer = BasicRenderer.extend({
var visible_buttons = buttons_partition[1];
// Get the unfolded buttons according to window size
- var nb_buttons = [2, 2, 4, 6][config.device.size_class] || 7;
+ var nb_buttons = this._renderButtonBoxNbButtons();
var unfolded_buttons = visible_buttons.slice(0, nb_buttons).concat(invisible_buttons);
// Get the folded buttons
@@ -410,6 +410,13 @@ var FormRenderer = BasicRenderer.extend({
this._registerModifiers(node, this.state, $result);
return $result;
},
+ /**
+ * @private
+ * @returns {integer}
+ */
+ _renderButtonBoxNbButtons: function () {
+ return [2, 2, 4, 6][config.device.size_class] || 7;
+ },
/**
* @private
* @param {Object} node
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 88d0aee83b8..5758b906421 100644
--- a/addons/web/static/src/js/views/pivot/pivot_model.js
+++ b/addons/web/static/src/js/views/pivot/pivot_model.js
@@ -440,12 +440,10 @@ var PivotModel = AbstractModel.extend({
// if we don't have the key 'groupBy' in params. In that case,
// we want to have the full open state for the groupbys.
self._updateTree(old_row.root, self.data.main_row.root);
- self._updateMainGroupBys(old_row, self.data.main_row);
}
if (!('pivot_column_groupby' in (params.context || {}))) {
self._updateTree(old_col.root, self.data.main_col.root);
- self._updateMainGroupBys(old_col, self.data.main_col);
}
});
},
@@ -986,7 +984,8 @@ var PivotModel = AbstractModel.extend({
});
var index = 0;
- var rowGroupBys = !_.isEmpty(this.data.groupedBy) ? this.data.groupedBy : this.initialRowGroupBys;
+ var rowGroupBys = !_.isEmpty(this.data.groupedBy) ? this.data.groupedBy : this.initialRowGroupBys.slice();
+ this.data.groupedBy = rowGroupBys;
var colGroupBys = this.data.colGroupBys;
var dataPoint, row, col, attrs, cell_value;
var main_row_header, main_col_header;
@@ -1118,19 +1117,6 @@ var PivotModel = AbstractModel.extend({
this._traverseTree(root.children[i], f, arg1, arg2, arg3);
}
},
- /**
- * Updates the groupBys that the main[row | col] holds
- *
- * @private
- * @param {Object} old: The main abstract header before reload
- * @param {Object} main: The main abstract header after reload
- *
- */
- _updateMainGroupBys: function (old, main) {
- var new_groupby_length = this._getHeaderDepth(main.root) - 1;
- var new_groupby_list = old.root.groupbys.slice(0, new_groupby_length);
- main.root.groupbys = new_groupby_list;
- },
/**
* @param {Object} old_tree
* @param {Object} new_tree
diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js
index ccbf24895dd..5dbc03e1a2b 100644
--- a/addons/web/static/tests/views/pivot_tests.js
+++ b/addons/web/static/tests/views/pivot_tests.js
@@ -1096,7 +1096,7 @@ QUnit.module('Views', {
pivot.destroy();
});
- QUnit.skip('Reload, group by columns, reload', function (assert) {
+ QUnit.test('Reload, group by columns, reload', function (assert) {
assert.expect(2);
var pivot = createView({
@@ -1118,7 +1118,7 @@ QUnit.module('Views', {
pivot_row_groupby: []};
// Check that column groupbys were not lost
- assert.deepEqual(pivot.getContext(), expectedContext,
+ assert.deepEqual(pivot.getOwnedQueryParams(), {context: expectedContext},
'Column groupby not lost after first reload');
// Set a column groupby
@@ -1132,12 +1132,44 @@ QUnit.module('Views', {
pivot_measures: ['__count'],
pivot_row_groupby: []};
- assert.deepEqual(pivot.getContext(), expectedContext,
+ assert.deepEqual(pivot.getOwnedQueryParams(), {context: expectedContext},
'Column groupby not lost after second reload');
pivot.destroy();
});
+ QUnit.test('Empty results keep groupbys', function (assert) {
+ assert.expect(2);
+
+ var pivot = createView({
+ View: PivotView,
+ model: "partner",
+ data: this.data,
+ arch: '',
+ });
+
+ // Set a column groupby
+ pivot.$('thead .o_pivot_header_cell_closed').click();
+ pivot.$('.o_field_selection .dropdown-item[data-field=customer]').click();
+
+ // Set a domain for empty results
+ pivot.update({domain: [['id', '=', false]]});
+
+ var expectedContext = {pivot_column_groupby: ['customer'],
+ pivot_measures: ['__count'],
+ pivot_row_groupby: []};
+ assert.deepEqual(pivot.getOwnedQueryParams(), {context: expectedContext},
+ 'Column groupby not lost after empty results');
+
+ // Set a domain for not empty results
+ pivot.update({domain: [['product_id', '=', 37]]});
+
+ assert.deepEqual(pivot.getOwnedQueryParams(), {context: expectedContext},
+ 'Column groupby not lost after reload after empty results');
+
+ pivot.destroy();
+ });
+
QUnit.test('correctly uses pivot_ keys from the context', function (assert) {
assert.expect(7);
diff --git a/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.options.js b/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.options.js
index 0d2bd5a6e79..2f009feb075 100644
--- a/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.options.js
+++ b/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.options.js
@@ -132,7 +132,7 @@ var SnippetOption = Widget.extend({
* @param {jQuery} $opt - the related DOMElement option
*/
selectClass: function (previewMode, value, $opt) {
- var $group = $opt && $opt.closest('.dropdown-submenu');
+ var $group = $opt && $opt.parents('.dropdown-submenu').last();
if (!$group || !$group.length) {
$group = this.$el;
}
@@ -295,13 +295,29 @@ var SnippetOption = Widget.extend({
})
.addClass('active');
- _processSelectClassElements(this.$el);
+ // Get submenus which are not inside submenus
+ var $submenus = this.$el.find('.dropdown-submenu')
+ .addBack('.dropdown-submenu')
+ .not('.dropdown-submenu .dropdown-submenu');
- function _processSelectClassElements($el) {
+ // Add unique active class for each submenu active item
+ _.each($submenus, function (submenu) {
+ var $elements = _getSelectClassElements($(submenu));
+ _processSelectClassElements($elements);
+ });
+
+ // Add unique active class for out-of-submenu active item
+ var $externalElements = _getSelectClassElements(this.$el)
+ .not('.dropdown-submenu *, .dropdown-submenu');
+ _processSelectClassElements($externalElements);
+
+ function _getSelectClassElements($el) {
+ return $el.find('[data-select-class]')
+ .addBack('[data-select-class]');
+ }
+ function _processSelectClassElements($elements) {
var maxNbClasses = -1;
- $el.find('[data-select-class]')
- .addBack('[data-select-class]')
- .removeClass('active')
+ $elements.removeClass('active')
.filter(function () {
var className = $(this).data('selectClass');
var nbClasses = className ? className.split(' ').length : 0;
diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py
index e7c805a60bd..b5809926cdc 100644
--- a/addons/website/models/ir_http.py
+++ b/addons/website/models/ir_http.py
@@ -42,6 +42,23 @@ def sitemap_qs2dom(qs, route, field='name'):
return dom
+def get_request_website():
+ """ Return the website set on `request` if called in a frontend context
+ (website=True on route).
+ This method can typically be used to check if we are in the frontend.
+
+ This method is easy to mock during python tests to simulate frontend
+ context, rather than mocking every method accessing request.website.
+
+ Don't import directly the method or it won't be mocked during tests, do:
+ ```
+ from odoo.addons.website.models import ir_http
+ my_var = ir_http.get_request_website()
+ ```
+ """
+ return request and getattr(request, 'website', False) or False
+
+
class Http(models.AbstractModel):
_inherit = 'ir.http'
diff --git a/addons/website/models/ir_rule.py b/addons/website/models/ir_rule.py
index ba5e07128ee..a11ddef1e53 100644
--- a/addons/website/models/ir_rule.py
+++ b/addons/website/models/ir_rule.py
@@ -1,5 +1,6 @@
# coding: utf-8
from odoo import api, models
+from odoo.addons.website.models import ir_http
class IrRule(models.Model):
@@ -8,7 +9,14 @@ class IrRule(models.Model):
@api.model
def _eval_context(self):
res = super(IrRule, self)._eval_context()
- res['website_id'] = self.env['website'].get_current_website().id
+
+ # We need is_frontend to avoid showing website's company items in backend
+ # (that could be different than current company). We can't use
+ # `get_current_website(falback=False)` as it could also return a website
+ # in backend (if domain set & match)..
+ is_frontend = ir_http.get_request_website()
+ Website = self.env['website']
+ res['website'] = is_frontend and Website.get_current_website() or Website
return res
def _compute_domain_keys(self):
diff --git a/addons/website/static/src/js/editor/snippets.options.js b/addons/website/static/src/js/editor/snippets.options.js
index f51dda964db..078bccc9f42 100644
--- a/addons/website/static/src/js/editor/snippets.options.js
+++ b/addons/website/static/src/js/editor/snippets.options.js
@@ -642,11 +642,11 @@ var FacebookPageDialog = weWidgets.Dialog.extend({
*/
_renderPreview: function () {
var self = this;
- var match = this.fbData.href.match(/^(?:https?:\/\/)?(?:www\.)?(?:fb|facebook)\.com\/(\w+)/);
+ var match = this.fbData.href.match(/^(?:https?:\/\/)?(?:www\.)?(?:fb|facebook)\.com\/(?:([\w.]+)|[^/?#]+-([0-9]{15,16}))(?:$|[\/?# ])/);
if (match) {
// Check if the page exists on Facebook or not
$.ajax({
- url: 'https://graph.facebook.com/' + match[1] + '/picture',
+ url: 'https://graph.facebook.com/' + (match[2] || match[1]) + '/picture',
statusCode: {
200: function () {
self._toggleWarning(true);
diff --git a/addons/website/views/website_views.xml b/addons/website/views/website_views.xml
index 5a067e59bcf..a8e69029094 100644
--- a/addons/website/views/website_views.xml
+++ b/addons/website/views/website_views.xml
@@ -13,6 +13,7 @@
ir.actions.act_window
ir.module.module
kanban,tree,form
+ ['!', ('name', '=like', 'theme_%')]
diff --git a/addons/website_blog/static/src/js/website_blog.js b/addons/website_blog/static/src/js/website_blog.js
index 9d2af1a3bbc..14a760525e7 100644
--- a/addons/website_blog/static/src/js/website_blog.js
+++ b/addons/website_blog/static/src/js/website_blog.js
@@ -98,7 +98,7 @@ sAnimations.registry.websiteBlog = sAnimations.Class.extend({
url = 'https://plus.google.com/share?url=' + window.location.href;
}
} else {
- var blogPost = $element.parents('[name="blogPost"]');
+ var blogPost = $element.parents('[name="blog_post"]');
var blogPostTitle = blogPost.find('.o_blog_post_title').html() || '';
var blogArticleLink = blogPost.find('.o_blog_post_title').parent('a').attr('href');
if ($element.hasClass('o_twitter')) {
diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml
index 8e92cab712e..8c5724945d7 100644
--- a/addons/website_blog/views/website_blog_templates.xml
+++ b/addons/website_blog/views/website_blog_templates.xml
@@ -207,7 +207,7 @@
-
+
diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py
index 1174f91d40e..0280dbd71c7 100644
--- a/addons/website_event/controllers/main.py
+++ b/addons/website_event/controllers/main.py
@@ -181,7 +181,10 @@ class WebsiteEventController(http.Controller):
def event_register(self, event, **post):
if not event.can_access_from_current_website():
raise werkzeug.exceptions.NotFound()
-
+ if not request.context.get('pricelist'):
+ pricelist = request.website.get_current_pricelist()
+ if pricelist:
+ event = event.with_context(pricelist=pricelist.id)
values = {
'event': event,
'main_object': event,
diff --git a/addons/website_links/static/src/js/test_ui_flow.js b/addons/website_links/static/src/js/test_ui_flow.js
index 4d8c7def0f9..584fc38c65d 100644
--- a/addons/website_links/static/src/js/test_ui_flow.js
+++ b/addons/website_links/static/src/js/test_ui_flow.js
@@ -52,9 +52,13 @@ tour.register('website_links_tour', {
},
},
// 3. Check that counter got incremented and charts are correctly displayed
+ {
+ content: "filter recently used links",
+ trigger: '#filter-recently-used-links',
+ },
{
content: "visit link stats page",
- trigger: '#o_website_links_recent_links a:containsExact("Stats"):first()',
+ trigger: '#o_website_links_recent_links a:containsExact("Stats"):first',
},
{
content: "check click number and ensure graphs are initialized",
diff --git a/addons/website_links/static/src/js/website_links_charts.js b/addons/website_links/static/src/js/website_links_charts.js
index bd2e3ba2747..64da6aa6388 100644
--- a/addons/website_links/static/src/js/website_links_charts.js
+++ b/addons/website_links/static/src/js/website_links_charts.js
@@ -183,6 +183,7 @@ sAnimations.registry.websiteLinksCharts = sAnimations.Class.extend({
$('#all_time_charts').prepend(_t("There is no data to show"));
$('#last_month_charts').prepend(_t("There is no data to show"));
$('#last_week_charts').prepend(_t("There is no data to show"));
+ return;
}
var formattedClicksByDay = {};
diff --git a/addons/website_links/tests/test_ui.py b/addons/website_links/tests/test_ui.py
index 58a697ef7a1..6a8e317eab1 100644
--- a/addons/website_links/tests/test_ui.py
+++ b/addons/website_links/tests/test_ui.py
@@ -1,13 +1,11 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import odoo.tests
-import unittest
@odoo.tests.common.tagged('post_install', '-at_install')
class TestUi(odoo.tests.HttpCase):
- @unittest.skip("Race condition on runbot or on local with Docker. Merging the test skipped for history purpose as the tour has been reviewed.")
def test_01_test_ui(self):
self.env['link.tracker'].create({
'campaign_id': 2,
diff --git a/addons/website_links/views/website_links_template.xml b/addons/website_links/views/website_links_template.xml
index aca362bc40c..626ec232e53 100644
--- a/addons/website_links/views/website_links_template.xml
+++ b/addons/website_links/views/website_links_template.xml
@@ -87,7 +87,7 @@
diff --git a/doc/reference/guidelines.rst b/doc/reference/guidelines.rst
index 5710bd36ff6..df8f0b5d4c2 100644
--- a/doc/reference/guidelines.rst
+++ b/doc/reference/guidelines.rst
@@ -32,7 +32,8 @@ Module structure
Directories
-----------
-A module is organised in important directories. Those contain the business logic; having a look at them should make you understand the purpose of the module.
+A module is organized in important directories. Those contain the business logic;
+having a look at them should make you understand the purpose of the module.
- *data/* : demo and data xml
- *models/* : models definition
@@ -49,108 +50,186 @@ Other optional directories compose the module.
File naming
-----------
-For *views* declarations, distinguish the backend views definition (list, form, kanban, ...), the templates (QWeb pages) and bundle (JS and CSS assets). Bundles are theorically QWeb templates, but should be in their own file :file:`assets.xml`.
-For *models*, split the business logic by sets of models, in each set
-select a main model, this model gives its name to the set. If there is
-only one model, its name is the same as the module name. For
-each set named
the following files may be created:
+File naming is important to quickly find information through all odoo addons.
+This section explains how to name files in a standard odoo module. As an
+example we use a plant nursery application. It holds two main models plant.nursery
+and plant.order.
-- :file:`models/{}.py`
-- :file:`models/{}.py`
-- :file:`views/{}_templates.xml`
-- :file:`views/{}_views.xml`
-
-For instance, *sale* module introduces ``sale_order`` and
-``sale_order_line`` where ``sale_order`` is dominant. So the
-```` files will be named :file:`models/sale_order.py` and
-:file:`views/sale_order_views.py`.
-
-For *data*, split them by purpose : demo or data. The filename will be
-the main_model name, suffixed by *_demo.xml* or *_data.xml*.
-
-For *controllers*, the only file should be named *.py*. If you need to inherit an existing controller from another module, its name will be *.py*. Unlike *models*, each controller class should be contained in a separated file. For instance, *purchase* module implements its part of the customer portal in :file:`controllers/portal.py` and its own typical routes on :file:`controllers/purchase.py`.
-
-For *static files*, since the resources can be used in different contexts (frontend, backend, both), they will be included in only one bundle. So, CSS/Less, JavaScript and XML files should be suffixed with the name of the bundle type. i.e.: *im_chat_common.css*, *im_chat_common.js* for 'assets_common' bundle, and *im_chat_backend.css*, *im_chat_backend.js* for 'assets_backend' bundle.
-If the module owns only one file, the convention will be *.ext* (i.e.: *project.js*).
-Don't link data (image, libraries) outside Odoo: do not use an
-URL to an image but copy it in our codebase instead.
-
-Regarding *data*, split them by purpose: data or demo. The filename will be
-the *main_model* name, suffixed by *_data.xml* or *_demo.xml*.
-
-Regarding *wizards*, naming convention is :
-
-- :file:`{}.py`
-- :file:`{}_views.xml`
-
-Where ** is the name of the dominant transient model, just like for *models*. .py can contains the models 'transient_model.action' and 'transient_model.action.line'.
-
-For *statistics reports*, their names should look like :
-
-- :file:`{}_report.py`
-- :file:`{}_report_views.py` (often pivot and graph views)
-
-For *printable reports*, you should have :
-
-- :file:`{}_reports.py` (report actions, paperformat definition, ...)
-- :file:`{}_templates.xml` (xml report templates)
-
-
-The complete tree should look like
+Concerning *models*, split the business logic by sets of models belonging to
+a same main model. Each set lies in a given file named based on its main model.
+If there is only one model, its name is the same as the module name. Each
+inherited model should be in its own file to help understanding of impacted
+models.
.. code-block:: text
- addons//
+ addons/plant_nursery/
+ |-- models/
+ | |-- plant_nursery.py (first main model)
+ | |-- plant_order.py (another main model)
+ | |-- res_partner.py (inherited Odoo model)
+
+Concerning *security* and access rights and rules two main files should be used.
+First one is the definition of access rights done in a ``ir.model.access.csv``
+file. User groups are defined in ``_groups.xml``. Access rules are
+defined in ``_security.xml``.
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- security/
+ | |-- ir.model.access.csv
+ | |-- plant_nusery_groups.xml
+ | |-- plant_nusery_security.xml
+ | |-- plant_order_security.xml
+
+Concerning *views*, backend views should be split like models and suffixed
+by ``_views.xml``. Backend views are list, form, kanban, activity, graph, pivot, ..
+views. To ease split by model in views main menus not linked to specific actions
+may be extracted into an optional ``_menus.xml`` file. Templates (QWeb
+pages used notably for portal / website display) and bundles (import of JS and
+CSS assets) are put in separate files. Those are respectively
+``_templates.xml`` and ``assets.xml`` files.
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- views/
+ | | -- assets.xml (import of JS / CSS)
+ | | -- plant_nursery_menus.xml (optional definition of main menus)
+ | | -- plant_nursery_views.xml (backend views)
+ | | -- plant_nursery_templates.xml (portal templates)
+ | | -- plant_order_views.xml
+ | | -- plant_order_templates.xml
+ | | -- res_partner_views.xml
+
+Concerning *data*, split them by purpose (demo or data) and main model. Filenames
+will be the main_model name suffixed by ``_demo.xml`` or ``_data.xml``. For instance
+for an application having demo and data for its main model as well as subtypes,
+activities and mail templates all related to mail module:
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- data/
+ | |-- plant_nursery_data.xml
+ | |-- plant_nursery_demo.xml
+ | |-- mail_data.xml
+
+Concerning *controllers*, generally all controllers belong to a single controller
+contained in a file named ``.py``. An old convention in Odoo is to
+name this file ``main.py`` but it is considered as outdated. If you need to inherit
+an existing controller from another module do it in ``.py``.
+For example adding portal controller in an application is done in ``portal.py``.
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- controllers/
+ | |-- plant_nursery.py
+ | |-- portal.py (inheriting portal/controllers/portal.py)
+ | |-- main.py (deprecated, replaced by plant_nursery.py)
+
+Concerning *static files*, Javascript files follow globally the same logic as
+python models. Each component should be in its own file with a meaningful name.
+For instance, the activity widgets are located in ``activity.js`` of mail module.
+Subdirectories can also be created to structure the 'package' (see web module
+for more details). The same logic should be applied for the templates of JS
+widgets (static XML files) and for their styles (scss files). Don't link
+data (image, libraries) outside Odoo: do not use an URL to an image but copy
+it in the codebase instead.
+
+Concerning *wizards*, naming convention is the same of for python models:
+``.py`` and ``_views.xml``. Both are put in the wizard
+directory. This naming comes from old odoo applications using the wizard
+keyword for transient models.
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- wizard/
+ | |-- make_plant_order.py
+ | |-- make_plant_order_views.xml
+
+Concerning *statistics reports* done with python / SQL views and classic views
+naming is the following :
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- report/
+ | |-- plant_order_report.py
+ | |-- plant_order_report_views.xml
+
+Concerning *printable reports* which contain mainly data preparation and Qweb
+templates naming is the following :
+
+.. code-block:: text
+
+ addons/plant_nursery/
+ |-- report/
+ | |-- plant_order_reports.xml (report actions, paperformat, ...)
+ | |-- plant_order_templates.xml (xml report templates)
+
+The complete tree of our Odoo module therefore looks like
+
+.. code-block:: text
+
+ addons/plant_nursery/
|-- __init__.py
|-- __manifest__.py
|-- controllers/
| |-- __init__.py
- | |-- .py
- | `-- .py
+ | |-- plant_nursery.py
+ | |-- portal.py
|-- data/
- | |-- _data.xml
- | `-- _demo.xml
+ | |-- plant_nursery_data.xml
+ | |-- plant_nursery_demo.xml
+ | |-- mail_data.xml
|-- models/
| |-- __init__.py
- | |-- .py
- | `-- .py
+ | |-- plant_nursery.py
+ | |-- plant_order.py
+ | |-- res_partner.py
|-- report/
| |-- __init__.py
- | |-- .py
- | |-- _views.xml
- | |-- _reports.xml
- | `-- _templates.xml
+ | |-- plant_order_report.py
+ | |-- plant_order_report_views.xml
+ | |-- plant_order_reports.xml (report actions, paperformat, ...)
+ | |-- plant_order_templates.xml (xml report templates)
|-- security/
| |-- ir.model.access.csv
- | `-- _security.xml
+ | |-- plant_nusery_groups.xml
+ | |-- plant_nusery_security.xml
+ | |-- plant_order_security.xml
|-- static/
| |-- img/
| | |-- my_little_kitten.png
- | | `-- troll.jpg
+ | | |-- troll.jpg
| |-- lib/
- | | `-- external_lib/
- | `-- src/
- | |-- js/
- | | |-- .js
- `-- .js
- | |-- css/
- | | `-- .css
- | |-- scss/
- | | `-- .scss
- | `-- xml/
- | |-- .xml
- `-- .xml
+ | | |-- external_lib/
+ | |-- src/
+ | | |-- js/
+ | | | |-- widget_a.js
+ | | | |-- widget_b.js
+ | | |-- scss/
+ | | | |-- widget_a.scss
+ | | | |-- widget_b.scss
+ | | |-- xml/
+ | | | |-- widget_a.xml
+ | | | |-- widget_a.xml
|-- views/
- | |-- _templates.xml
- | |-- _views.xml
- | |-- _templates.xml
- | `-- _views.xml
- `-- wizard/
- |-- .py
- |-- _views.xml
- |-- .py
- `-- _views.xml
+ | |-- assets.xml
+ | |-- plant_nursery_menus.xml
+ | |-- plant_nursery_views.xml
+ | |-- plant_nursery_templates.xml
+ | |-- plant_order_views.xml
+ | |-- plant_order_templates.xml
+ | |-- res_partner_views.xml
+ |-- wizard/
+ | |--make_plant_order.py
+ | |--make_plant_order_views.xml
.. note:: File names should only contain ``[a-z0-9_]`` (lowercase
alphanumerics and ``_``)
@@ -201,8 +280,8 @@ Odoo supports custom tags acting as syntactic sugar:
The 4 first tags are prefered over the *record* notation.
-Naming xml_id
--------------
+XML IDs and naming
+------------------
Security, View and Action
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -214,9 +293,10 @@ Use the following pattern :
``kanban``, ``form``, ``tree``, ``search``, ...
* For an action: the main action respects :samp:`{}_action`.
Others are suffixed with :samp:`_{}`, where *detail* is a
- lowercase string briefly explaining the action.
- This is used only if multiple actions are declared for the
- model.
+ lowercase string briefly explaining the action. This is used only if
+ multiple actions are declared for the model.
+* For window actions: suffix the action name by the specific view information
+ like :samp:`{}_action_view_{}_group_{}` where *group_name*
is the name of the group, generally 'user', 'manager', ...
* For a rule: :samp:`{}_rule_{}` where
@@ -224,17 +304,33 @@ Use the following pattern :
for the 'model_name_group_user', 'public' for public user, 'company'
for multi-company rules, ...).
+Name should be identical to xml id with dots replacing underscores. Actions
+should have a real naming as it is used as display name.
+
.. code-block:: xml
-
+
+ model.name.view.form
...
+ model.name.view.kanban
...
+
+
+ Model Main Action
+ ...
+
+
+
+ Model Access Childs
+
+
+
-
-
- ...
-
-
-
- ...
-
-
...
@@ -270,30 +357,31 @@ Use the following pattern :
...
+Inheriting XML
+~~~~~~~~~~~~~~
+Xml Ids of inheriting views should use the same ID as the original record.
+It helps finding all inheritance at a glance. As final Xml Ids are prefixed
+by the module that creates them there is no overlap.
-.. note:: View names use dot notation ``my.model.view_type`` or
- ``my.model.view_type.inherit`` instead of *"This is the form view of
- My Model"*.
-
-
-Inherited XML
-~~~~~~~~~~~~~
-
-The naming pattern of inherited view is
-
-#. Extension mode: Use the same xml id than the original view you are extending, and suffix it by :samp:`{_inherit}` . For instance, the view :samp:`project.project_view_form` can be extended by :samp:`project_forecast.project_view_form_inherit`.
-#. Primary mode: Keep the original xml id.
-
+Naming should contain an ``.inherit.{details}`` suffix to ease understanding
+the override purpose when looking at its name.
.. code-block:: xml
-
+
+ model.view.form.inherit.module2
...
+New primary views do not require the inherit suffix as those are new records
+based upon the first one.
+
+.. code-block:: xml
+
+ model.view.form.module2
primary
...
@@ -311,11 +399,6 @@ source code tries to respect Python standard, but some of them can be ignored.
- E501: line too long
- E301: expected 1 blank line, found 0
- E302: expected 2 blank lines, found 1
-- E126: continuation line over-indented for hanging indent
-- E123: closing bracket does not match indentation of opening bracket's line
-- E127: continuation line over-indented for visual indent
-- E128: continuation line under-indented for visual indent
-- E265: block comment should start with '# '
Imports
-------
@@ -843,7 +926,7 @@ Symbols and Conventions
- Variable name :
- use camelcase for model variable
- use underscore lowercase notation for common variable.
- - prefix your variable name with *_id* or *_ids* if it contains a record id or list of id. Don't use ``partner_id`` to contain a record of res.partner
+ - suffix your variable name with *_id* or *_ids* if it contains a record id or list of id. Don't use ``partner_id`` to contain a record of res.partner
.. code-block:: python
@@ -964,17 +1047,10 @@ Javascript coding guidelines
- Use a linter (jshint, ...)
- Never add minified Javascript Libraries
- Use camelcase for class declaration
-- Unless your code is supposed to run on every page, target specific pages
- using the ``if_dom_contains`` function of website module. Target an
- element which is specific to the pages your code needs to run on
- using JQuery.
-
-.. code-block:: javascript
-
- odoo.website.if_dom_contains('.jquery_class_selector', function () {
- /*your code here*/
- });
+More precise JS guidelines are detailed at https://github.com/odoo/odoo/wiki/Javascript-coding-guidelines.
+You may also have a look at existing API in Javascript by looking Javascript
+References.
CSS coding guidelines
---------------------
diff --git a/odoo/addons/base/i18n/es.po b/odoo/addons/base/i18n/es.po
index 7dca07110c0..336b8c346c3 100644
--- a/odoo/addons/base/i18n/es.po
+++ b/odoo/addons/base/i18n/es.po
@@ -29,7 +29,7 @@
# Pierre-Antoine Magnet , 2017
# AleEscandon , 2017
# Julián Andrés Osorio López , 2017
-# e2f_es_ t6 , 2017
+# b9b2db555321dc69d8faed263d46c5b6, 2017
# Andres Ruiz , 2017
# Raquel Iciarte , 2017
# Nacho Hermoso , 2017
@@ -38,7 +38,7 @@
# Gustavo Valverde, 2018
# JOSE ALEJANDRO ECHEVERRI VALENCIA , 2018
# e2f , 2018
-# e2f_EPV Translator , 2018
+# 966ff43e6966712895a590e7320ca288, 2018
# José Vicente , 2018
# Luis M. Ontalba , 2018
# RGB Consulting , 2018
@@ -46,7 +46,7 @@
# Martin Trigaux, 2018
# Galileo Sanchez , 2018
# Fernando San Martín Woerner , 2018
-# ES R1 , 2018
+# ced903afe967c2a46d1036224972db9d, 2018
# Cristian Salamea , 2018
# Pedro M. Baeza , 2018
# Christopher Ormaza , 2018
@@ -60,6 +60,7 @@
# Jesús Alan Ramos Rodríguez , 2018
# Rodrigo Aragon , 2018
# Gabriel Umana , 2019
+# Jesse Garza , 2019
#
msgid ""
msgstr ""
@@ -67,7 +68,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-02 10:02+0000\n"
"PO-Revision-Date: 2016-08-05 12:54+0000\n"
-"Last-Translator: Gabriel Umana , 2019\n"
+"Last-Translator: Jesse Garza , 2019\n"
"Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -8945,6 +8946,7 @@ msgstr "Cuenta bancaria"
msgid ""
"Bank account type: Normal or IBAN. Inferred from the bank account number."
msgstr ""
+"Tipo de cuenta bancaria: Normal o IBAN. Se infiere del número de cuenta."
#. module: base
#: model:ir.model.fields,help:base.field_res_company__bank_ids
diff --git a/odoo/addons/base/i18n/mn.po b/odoo/addons/base/i18n/mn.po
index 11d8608ae88..2f4d4158d4a 100644
--- a/odoo/addons/base/i18n/mn.po
+++ b/odoo/addons/base/i18n/mn.po
@@ -6459,7 +6459,7 @@ msgstr "Данс Эзэмшигч"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_partner_bank__acc_holder_name
msgid "Account Holder Name"
-msgstr ""
+msgstr "Данс эзэмшигчийн нэр"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_company__account_no
@@ -6479,7 +6479,7 @@ msgstr "Дансны дугаар давтагдах ёсгүй"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_taxcloud
msgid "Account TaxCloud"
-msgstr ""
+msgstr "TaxCloud"
#. module: base
#: model:ir.module.module,shortdesc:base.module_website_sale_account_taxcloud
@@ -6502,6 +6502,8 @@ msgid ""
"Account holder name, in case it is different than the name of the Account "
"Holder"
msgstr ""
+"Данс эзэмшигчийн нэр, Данс эзэмшигчийн бүртгэлтэй нэр нь Odoo дээрх нэрээс "
+"өөр байх тохиолдолд энэ талбарыг ашиглана"
#. module: base
#: model:ir.module.category,name:base.module_category_accounting
@@ -7513,6 +7515,7 @@ msgstr "Банкны данс"
msgid ""
"Bank account type: Normal or IBAN. Inferred from the bank account number."
msgstr ""
+"Банкны дансны төрөл: Энгийн эсвэл IBAN. Банкны дансны дугаараар ялгагддаг."
#. module: base
#: model:ir.model.fields,help:base.field_res_company__bank_ids
@@ -9014,7 +9017,7 @@ msgstr "Цэс үүсгэх"
#. module: base
#: model:ir.actions.act_window,help:base.action_res_partner_bank_account_form
msgid "Create a bank account"
-msgstr ""
+msgstr "Банкны данс үүсгэх"
#. module: base
#: model:ir.actions.act_window,help:base.action_ui_view_custom
@@ -17069,7 +17072,7 @@ msgstr "Толгой цэс"
#: model:ir.model.fields,field_description:base.field_ir_ui_menu__parent_path
#: model:ir.model.fields,field_description:base.field_res_partner_category__parent_path
msgid "Parent Path"
-msgstr ""
+msgstr "Эцэг зам"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_partner__parent_name
diff --git a/odoo/addons/base/i18n/nl.po b/odoo/addons/base/i18n/nl.po
index 994f575b77d..fff6f44c294 100644
--- a/odoo/addons/base/i18n/nl.po
+++ b/odoo/addons/base/i18n/nl.po
@@ -888,37 +888,6 @@ msgid ""
" try to use this method on an invoice for whose payment no mandate can be used.\n"
" "
msgstr ""
-"\n"
-" This module enables the generation of SEPA Direct Debit (SDD)-compliant XML files (consistent\n"
-" with pain.008.001.02 specification) to send to your bank in order to\n"
-" collect a set of payments.\n"
-"\n"
-" To be elligible for this payment method, a customer must have first\n"
-" returned a mandate to the company, giving his consent to use direct debit.\n"
-" This consent must have been encoded as a 'customer mandate' into Odoo.\n"
-"\n"
-" You also need to meet the following requirements in order to properly\n"
-" generate a SDD file:\n"
-" - Your company account must be set to a valid IBAN number\n"
-" - Your company account must be associated to a bank having a valid BIC\n"
-" - Your company must have been given a creditor identifier (this can be done in the 'settings' menu of the accounting module)\n"
-" - Your company must have defined a journal to receive SDD payments (again, in 'settings' of accounting module)\n"
-" - Every customer for which you generate a payment must have a valid IBAN account number in a bank associated with a correct BIC.\n"
-"\n"
-" Odoo will let you know if any of these requirements are not satisfied.\n"
-"\n"
-" Any invoice that gets validated for a customer with a mandate will be\n"
-" automatically set in 'paid' state, and a payment will be generated. An\n"
-" option in the dashboard will then allow you to view all the payments generated\n"
-" via SDD and to generate a XML collection file for them, grouping them as\n"
-" you see fit.\n"
-"\n"
-" A dedicated 'SEPA Direct Debit' payment method is also available for\n"
-" open invoices, when selecting a bank account in the 'register payment' wizard.\n"
-" Use it to generate a SDD payment for the invoices if you added a mandate\n"
-" for its owner after its validation. You will see an error message if you\n"
-" try to use this method on an invoice for whose payment no mandate can be used.\n"
-" "
#. module: base
#: model:ir.module.module,summary:base.module_account_online_sync
@@ -3105,22 +3074,6 @@ msgid ""
" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
" "
msgstr ""
-"\n"
-"Indian Payroll Salary Rules.\n"
-"============================\n"
-"\n"
-" -Configuration of hr_payroll for India localization\n"
-" -All main contributions rules for India payslip.\n"
-" * New payslip report\n"
-" * Employee Contracts\n"
-" * Allow to configure Basic / Gross / Net Salary\n"
-" * Employee PaySlip\n"
-" * Allowance / Deduction\n"
-" * Integrated with Leaves Management\n"
-" * Medical Allowance, Travel Allowance, Child Allowance, ...\n"
-" - Payroll Advice and Report\n"
-" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
-" "
#. module: base
#: model:ir.module.module,description:base.module_mail_github
@@ -3697,16 +3650,16 @@ msgid ""
"\n"
msgstr ""
"\n"
-"Module om betaalherinneringen te automatiseren voor onbetaalde facturen, op basis van meerdere aanmaan niveau's\n"
+"Module om betaalherinneringen te automatiseren voor onbetaalde facturen, op basis van meerdere aanmaningsniveau's\n"
"================================================== ======================= \n"
"\n"
-"U kunt uw meerdere niveaus van definiëren:.\n"
+"U kunt uw meerdere niveaus van aanmanen definiëren:.\n"
"-------------------------------------------------- ------------- \n"
-" Instellingen / Beheer / Betaalherinnering niveau's\n"
-" \n"
-"Zodra het is gedefinieerd, kunt u elke dag automatisch afdrukken herinneringen door simpelweg op het menu te klikken:.\n"
+"Instellingen / Beheer / Betaalherinnering niveau's\n"
+"\n"
+"Zodra het is gedefinieerd, kunt u elke dag automatisch herinneringen afdrukken door simpelweg op het menu te klikken:\n"
"-------------------------------------------------- -------------------------------------------------- --\n"
-" Klantoverzicht\n"
+"Klantoverzicht\n"
"\n"
"Het zal een PDF / e-mails versturen / handmatige acties genereren volgens de verschillende niveaus\n"
"van herinnering. U kunt verschillende instellingen maken voor voor verschillende bedrijven.\n"
@@ -4645,7 +4598,7 @@ msgstr ""
"==========================\n"
"\n"
"Maak een aantal producten waarvoor u de declaraties opnieuw kunt factureren.\n"
-"Met deze module kunt u de declaraties factureren aan klanten, dit door de verkooporder in te stellen op de declaratie..\n"
+"Met deze module kunt u de declaraties factureren aan klanten, dit door de verkooporder in te stellen op de declaratie.\n"
#. module: base
#: model:ir.module.module,description:base.module_fetchmail
@@ -5781,7 +5734,7 @@ msgstr ""
"Deze module voegt de vereiste basiscode toe voor een volledig geïntegreerd klantenportaal. Het bevat de basiscontrollerklasse en basissjablonen. Zakelijke add-ons\n"
"zullen hun specifieke sjablonen en controllers toevoegen om de klantportaal uit te breiden.\n"
"\n"
-"Deze module bevat voornamelijke code afkomstig van Odoo v10 website_portal. Doel\n"
+"Deze module bevat voornamelijk code afkomstig van Odoo v10 website_portal. Doel\n"
"van deze module is om de weergave van een klantportaal zonder \n"
"afhankelijkheid van de mogelijkheden van de website editie en aanpas mogelijkheden."
@@ -6452,10 +6405,10 @@ msgstr ""
"Deze module voegt een link toe aan het Transifex-project in de vertaalweergave.\n"
"Het doel van deze module is om vertalingen van de hoofdmodules te versnellen.\n"
"\n"
-"Om te laten werken gebruikt Odoo Transifex-configuratiebestanden `.txt / config` om de\n"
+"Om dit te laten werken gebruikt Odoo Transifex-configuratiebestanden `.txt / config` om de\n"
"projectbron te detecteren. Aangepaste modules worden niet vertaald (sinds deze niet gepubliceerd zijn op het belangrijkste Transifex-project).\n"
"\n"
-"De taal die de gebruiker probeert te vertalen moet op de Transifex geactiveerd zijn.\n"
+"De taal die de gebruiker probeert te vertalen moet op Transifex geactiveerd zijn.\n"
" "
#. module: base
@@ -6751,7 +6704,7 @@ msgstr ""
"Website Presentaties integratie voor de helpdesk module\n"
"================================================== \n"
"\n"
-" Voeg presentaties toe aan uw team, zodat klanten die hulp zoeken, deze kunnen zien voordat ze nieuwe tickets plaatsen"
+"Voeg presentaties toe aan uw team, zodat klanten die hulp zoeken, deze kunnen zien voordat ze nieuwe tickets plaatsen."
#. module: base
#: model:ir.module.module,description:base.module_website_membership
@@ -15708,45 +15661,6 @@ msgid ""
"allowing you to easily find for specific skills and build up a database of\n"
"profiles.\n"
msgstr ""
-"Manage Recruitment and Job applications\n"
-"---------------------------------------\n"
-"\n"
-"Publish, promote and organize your job offers with the Odoo\n"
-"Open Source Recruitment Application.\n"
-"\n"
-"Organize your job board, promote your job announces and keep track of\n"
-"application submissions easily. Follow every applicant and build up a database\n"
-"of skills and profiles with indexed documents.\n"
-"\n"
-"Post Your Jobs on Best Job Boards\n"
-"---------------------------------\n"
-"\n"
-"Connect automatically to most famous job board websites; linkedIn, Monster,\n"
-"Craigslist, ... Every job position has a new email address automatically\n"
-"assigned to route applications automatically to the right job position.\n"
-"\n"
-"Whether applicants contact you by email or using an online form, you get all\n"
-"the data indexed automatically (resumes, motivation letter) and you can answer\n"
-"in just a click, reusing templates of answers.\n"
-"\n"
-"Customize Your Recruitment Process\n"
-"----------------------------------\n"
-"\n"
-"Use the kanban view and customize the steps of your recruitments process;\n"
-"pre-qualification, first interview, second interview, negociaiton, ...\n"
-"\n"
-"Get accurate statistics on your recruitment pipeline. Get reports to compare\n"
-"the performance of your different investments on external job boards.\n"
-"\n"
-"Streamline Your Recruitment Process\n"
-"-----------------------------------\n"
-"\n"
-"Follow applicants in your recruitment process with the smart kanban view. Save\n"
-"time by automating some communications with email templates.\n"
-"\n"
-"Documents like resumes and motivation letters are indexed automatically,\n"
-"allowing you to easily find for specific skills and build up a database of\n"
-"profiles.\n"
#. module: base
#: model:ir.actions.act_window,help:base.grant_menu_access
@@ -17052,103 +16966,6 @@ msgid ""
"Compare revenues with forecasts and budgets in real time.\n"
"\n"
msgstr ""
-"Odoo CRM\n"
-"--------\n"
-"\n"
-"Boost sales productivity, improve win rates, grow revenue with the Odoo\n"
-"Open Source CRM.\n"
-"\n"
-"Manage your sales funnel with no effort. Attract leads, follow-up on phone\n"
-"calls and meetings. Analyse the quality of your leads to make informed\n"
-"decisions and save time by integrating emails directly into the application.\n"
-"\n"
-"Your Sales Funnel, The Way You Like It\n"
-"--------------------------------------\n"
-"\n"
-"Track your opportunities pipeline with the revolutionary kanban view. Work\n"
-"inside your sales funnel and get instant visual information about next actions,\n"
-"new messages, top opportunities and expected revenues.\n"
-"\n"
-"Lead Management Made Easy\n"
-"-------------------------\n"
-"\n"
-"Create leads automatically from incoming emails. Analyse leads efficiency and\n"
-"compare performance by campaigns, channels or sales channel.\n"
-"\n"
-"Find duplicates, merge leads and assign them to the right salesperson in one\n"
-"operation. Spend less time on administration and more time on qualifying leads.\n"
-"\n"
-"Organize Your Opportunities\n"
-"---------------------------\n"
-"\n"
-"Get your opportunities organized to stay focused on the best deals. Manage all\n"
-"your customer interactions from the opportunity like emails, phone calls,\n"
-"internal notes, meetings and quotations.\n"
-"\n"
-"Follow opportunities that interest you to get notified upon specific events:\n"
-"deal won or lost, stage changed, new customer demand, etc.\n"
-"\n"
-"Email Integration and Automation\n"
-"--------------------------------\n"
-"\n"
-"Work with the email applications you already use every day. Whether your\n"
-"company uses Microsoft Outlook or Gmail, no one needs to change the way they\n"
-"work, so everyone stays productive.\n"
-"\n"
-"Route, sort and filter incoming emails automatically. Odoo CRM handles incoming\n"
-"emails and route them to the right opportunities or sales channel. New leads are\n"
-"created on the fly and interested salespersons are notified automatically.\n"
-"\n"
-"Collaborative Agenda\n"
-"--------------------\n"
-"\n"
-"Schedule your meetings and phone calls using the integrated calendar. You can\n"
-"see your agenda and your colleagues' in one view. As a manager, it's easy to\n"
-"see what your team is busy with.\n"
-"\n"
-"Lead Automation and Marketing Campaigns\n"
-"---------------------------------------\n"
-"\n"
-"Drive performance by automating tasks with Odoo CRM.\n"
-"\n"
-"Use our marketing campaigns to automate lead acquisition, follow ups and\n"
-"promotions. Define automated actions (e.g. ask a salesperson to call, send an\n"
-"email, ...) based on triggers (no activity since 20 days, answered a\n"
-"promotional email, etc.)\n"
-"\n"
-"Optimize campaigns from lead to close, on every channel. Make smarter decisions\n"
-"about where to invest and show the impact of your marketing activities on your\n"
-"company's bottom line.\n"
-"\n"
-"Customize Your Sales Cycle\n"
-"--------------------------\n"
-"\n"
-"Customize your sales cycle by configuring sales stages that perfectly fit your\n"
-"sales approach. Control statistics to get accurate forecasts to improve your\n"
-"sales performance at every stage of your customer relationship.\n"
-"\n"
-"Drive Engagement with Gamification\n"
-"----------------------------------\n"
-"\n"
-"### Leverage your team's natural desire for competition\n"
-"\n"
-"Reinforce good habits and improve win rates with real-time recognition and\n"
-"rewards inspired by [game mechanics](http://en.wikipedia.org/wiki/Gamification).\n"
-"Align sales channels around clear business objectives with challenges, personal\n"
-"objectives and team leader boards.\n"
-"\n"
-"### Leaderboards\n"
-"\n"
-"Promote leaders and competition amongst sales channel with performance ratios.\n"
-"\n"
-"### Personal Objectives\n"
-"\n"
-"Assign clear goals to users to align them with the company objectives.\n"
-"\n"
-"### Team Targets\n"
-"\n"
-"Compare revenues with forecasts and budgets in real time.\n"
-"\n"
#. module: base
#: selection:ir.module.module,license:0
@@ -17213,60 +17030,6 @@ msgid ""
"for your own company. Follow people, share best practices, 'like' top ideas,\n"
"etc.\n"
msgstr ""
-"Odoo Enterprise Social Network\n"
-"------------------------------\n"
-"\n"
-"Connect with experts, follow what interests you, share documents and promote\n"
-"best practices with Odoo Enterprise Social Network. Get work done with\n"
-"effective collaboration across departments, geographies, documents and business\n"
-"applications. All of this while decreasing email overload.\n"
-"\n"
-"Connect with experts\n"
-"--------------------\n"
-"\n"
-"Next time you have a question for the marketing, sales, R&D or any other\n"
-"department, don't send an email blast-post the question to Odoo and get answers\n"
-"from the right persons.\n"
-"\n"
-"Follow what interests you\n"
-"-------------------------\n"
-"\n"
-"Want to get informed about new product features, hot deals, bottlenecks in\n"
-"projects or any other event? Just follow what interests you to get the\n"
-"information you need what you need; no more, no less.\n"
-"\n"
-"Get Things Done\n"
-"---------------\n"
-"\n"
-"You can process (not only read) the inbox and easily mark messages for future\n"
-"actions. Start feeling the pleasure of having an empty inbox every day; no more\n"
-"overload of information.\n"
-"\n"
-"Promote best practices\n"
-"----------------------\n"
-"\n"
-"Cut back on meetings and email chains by working together in groups of\n"
-"interests. Create a group to let people share files, discuss ideas, and vote to\n"
-"promote best practices.\n"
-"\n"
-"Improve Access to Information and Expertise\n"
-"-------------------------------------------\n"
-"\n"
-"Break down information silos. Search across your existing systems to find the\n"
-"answers and expertise you need to complete projects quickly.\n"
-"\n"
-"Collaborate securely\n"
-"--------------------\n"
-"\n"
-"Set the right security policy; public, private or on invitation only --\n"
-"according to the information sensitivity.\n"
-"\n"
-"A Twitter-like Network For My Company\n"
-"---------------------------------------\n"
-"\n"
-"Make every employee feel more connected and engaged with twitter-like features\n"
-"for your own company. Follow people, share best practices, 'like' top ideas,\n"
-"etc.\n"
#. module: base
#: model:ir.module.module,description:base.module_hr
@@ -17364,98 +17127,6 @@ msgid ""
"Compare revenues with forecasts and budgets in real time.\n"
"\n"
msgstr ""
-"Odoo Human Resources\n"
-"--------------------\n"
-"\n"
-"With Odoo Human Resources,\n"
-"manage the most important asset in your company: People\n"
-"\n"
-"Get all your HR operations managed easily: knowledge sharing, recruitments,\n"
-"appraisals, timesheets, contracts, attendances, payroll, etc.\n"
-"\n"
-"Each need is provided by a specific app that you activate on demand.\n"
-"\n"
-"Manage Your Employees\n"
-"---------------------\n"
-"\n"
-"Oversee all important information in your company address book. Some\n"
-"information are restricted to HR managers, others are public to easily look\n"
-"colleagues.\n"
-"\n"
-"Record employee contracts and get alerts when they have to be renewed.\n"
-"\n"
-"Streamline Your Recruitment Process\n"
-"-----------------------------------\n"
-"\n"
-"Index resumes, track applicants, search profiles with Odoo HR.\n"
-"\n"
-"Post job offers and keep track of each application received. Follow applicants\n"
-"in your recruitment process with the smart kanban view.\n"
-"\n"
-"Save time by automating some communications with email templates. Resumes are\n"
-"indexed automatically, allowing you to easily find for specific profiles.\n"
-"\n"
-"Enterprise Social Network\n"
-"-------------------------\n"
-"\n"
-"Break down information silos. Share knowledge and best practices amongst all\n"
-"employees. Follow specific people or documents and join groups of interests to\n"
-"share expertise and documents.\n"
-"\n"
-"Interact with your coworkers in real time with website live chat.\n"
-"\n"
-"Track time and attendances\n"
-"--------------------------\n"
-"\n"
-"Keep track of the time spent by project, client or task. It's easy to record\n"
-"timesheets or check attendances for each employee. Get your analytic accounting\n"
-"posted automatically based on time spent on your projects.\n"
-"\n"
-"Leaves Management\n"
-"-----------------\n"
-"\n"
-"Keep track of the vacation days accrued by each employee. Employees enter their\n"
-"requests (paid leaves, sick leaves, etc), for managers to approve and\n"
-"validate. It's all done in just a few clicks. The agenda of each employee is\n"
-"updated accordingly.\n"
-"\n"
-"Keep Track of Employee Expenses\n"
-"-------------------------------\n"
-"\n"
-"Get rid of the paper work and follow employee's expenses directly in Odoo.\n"
-"Don't loose time or money by controlling the full flow: expense validation,\n"
-"reimbursement of employees, posting in the accounting and re-invoicing to\n"
-"customers.\n"
-"\n"
-"Follow Periodic Appraisals\n"
-"--------------------------\n"
-"\n"
-"Set-up appraisals plans and/or surveys for your employees and watch their\n"
-"evolution. Define steps for interviews and Odoo will notify managers or\n"
-"subordinates automatically to prepare appraisals. Keep track of the progress of\n"
-"your staff periodically.\n"
-"\n"
-"Boost Engagement With Gamification\n"
-"----------------------------------\n"
-"\n"
-"### Define clear objective and provide real time feedback\n"
-"\n"
-"Inspire achievement with challenges, goals and rewards. Define clear objectives\n"
-"and provide real time feedback and tangible results. Showcase the top\n"
-"performers to the entire channel and publicly recognize a job well done.\n"
-"\n"
-"### Leaderboards\n"
-"\n"
-"Promote leaders and competition amongst sales channel with performance ratios.\n"
-"\n"
-"### Personal Objectives\n"
-"\n"
-"Assign clear goals to users to align them with the company objectives.\n"
-"\n"
-"### Team Targets\n"
-"\n"
-"Compare revenues with forecasts and budgets in real time.\n"
-"\n"
#. module: base
#: model:ir.module.module,description:base.module_mrp
@@ -17995,69 +17666,6 @@ msgid ""
"etc.\n"
"\n"
msgstr ""
-"Odoo Supply Chain\n"
-"-----------------\n"
-"\n"
-"Automate requisition-to-pay, control invoicing with the Odoo\n"
-"Open Source Supply Chain.\n"
-"\n"
-"Automate procurement propositions, launch request for quotations, track\n"
-"purchase orders, manage vendors' information, control products reception and\n"
-"check vendors' invoices.\n"
-"\n"
-"Automated Procurement Propositions\n"
-"----------------------------------\n"
-"\n"
-"Reduce inventory level with procurement rules. Get the right purchase\n"
-"proposition at the right time to reduce your inventory level. Improve your\n"
-"purchase and inventory performance with procurement rules depending on stock\n"
-"levels, logistic rules, sales orders, forecasted manufacturing orders, etc.\n"
-"\n"
-"Send requests for quotations or purchase orders to your vendor in one click.\n"
-"Get access to product receptions and invoices from your purchase order.\n"
-"\n"
-"Purchase Tenders\n"
-"----------------\n"
-"\n"
-"Launch purchase tenders, integrate vendor's answers in the process and\n"
-"compare propositions. Choose the best offer and send purchase orders easily.\n"
-"Use reporting to analyse the quality of your vendors afterwards.\n"
-"\n"
-"\n"
-"Email integrations\n"
-"------------------\n"
-"\n"
-"Integrate all vendor's communications on the purchase orders (or RfQs) to get\n"
-"a strong traceability on the negotiation or after sales service issues. Use the\n"
-"claim management module to track issues related to vendors.\n"
-"\n"
-"Standard Price, Average Price, FIFO\n"
-"-----------------------------------\n"
-"\n"
-"Use the costing method that reflects your business: standard price, average\n"
-"price, fifo or lifo. Get your accounting entries and the right inventory\n"
-"valuation in real-time; Odoo manages everything for you, transparently.\n"
-"\n"
-"Import Vendor Pricelists\n"
-"--------------------------\n"
-"\n"
-"Take smart purchase decisions using the best prices. Easily import vendor's\n"
-"pricelists to make smarter purchase decisions based on promotions, prices\n"
-"depending on quantities and special contract conditions. You can even base your\n"
-"sale price depending on your vendor's prices.\n"
-"\n"
-"Control Products and Invoices\n"
-"-----------------------------\n"
-"\n"
-"No product or order is left behind, the inventory control allows you to manage\n"
-"back orders, refunds, product reception and quality control. Choose the right\n"
-"control method according to your need.\n"
-"\n"
-"Control vendor bills with no effort. Choose the right method according to\n"
-"your need: pre-generate draft invoices based on purchase orders, on products\n"
-"receptions, create invoices manually and import lines from purchase orders,\n"
-"etc.\n"
-"\n"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_diagram
@@ -18185,123 +17793,6 @@ msgid ""
"\n"
"Schedule, organize, promote or sell events online; conferences, trainings, webinars, etc.\n"
msgstr ""
-"Odoo Website Builder\n"
-"--------------------\n"
-"\n"
-"Get an awesome and free website,\n"
-"easily customizable with the Odoo website builder.\n"
-"\n"
-"Create enterprise grade website with our super easy builder. Use finely\n"
-"designed building blocks and edit everything inline.\n"
-"\n"
-"Benefit from out-of-the-box business features; e-Commerce, events, blogs, jobs\n"
-"announces, customer references, call-to-actions, etc.\n"
-"\n"
-"Edit Anything Inline\n"
-"--------------------\n"
-"\n"
-"Create beautiful websites with no technical knowledge. Odoo's unique *'edit\n"
-"inline'* approach makes website creation surprisingly easy. No more complex\n"
-"backend; just click anywhere to change any content.\n"
-"\n"
-"\"Want to change the price of a product? or put it in bold? Want to change a\n"
-"blog title?\" Just click and change. What you see is what you get. Really.\n"
-"\n"
-"Awesome. Astonishingly Beautiful.\n"
-"---------------------------------\n"
-"\n"
-"Odoo's building blocks allow to design modern websites that are not possible\n"
-"with traditional WYSIWYG page editors.\n"
-"\n"
-"Whether it's for products descriptions, blogs or static pages, you don't need\n"
-"to be a professioanl designer to create clean contents. Just drag and drop and\n"
-"customize predefined building blocks.\n"
-"\n"
-"Enterprise-Ready, out-of-the-box\n"
-"--------------------------------\n"
-"\n"
-"Activate ready-to-use enterprise features in just a click; e-commerce,\n"
-"call-to-actions, jobs announces, events, customer references, blogs, etc.\n"
-"\n"
-"Traditional eCommerce and CMS have poorly designed backends as it's not their\n"
-"core focus. With the Odoo integration, you benefit from the best management\n"
-"software to follow-up on your orders, your jobs applicants, your leads, etc.\n"
-"\n"
-"A Great Mobile Experience\n"
-"-------------------------\n"
-"\n"
-"Get a mobile friendly website thanks to our responsive design based on\n"
-"bootstrap. All your pages adapt automatically to the screen size. (mobile\n"
-"phones, tablets, desktop) You don't have to worry about mobile contents, it\n"
-"works by default.\n"
-"\n"
-"SEO tools at your finger tips\n"
-"-----------------------------\n"
-"\n"
-"The *Promote* tool suggests keywords according to Google most searched terms.\n"
-"Search Engine Optimization tools are ready to use, with no configuration\n"
-"required.\n"
-"\n"
-"Google Analytics tracks your shopping cart events by default. Sitemap and\n"
-"structured content are created automatically for Google indexation.\n"
-"\n"
-"Multi-Languages Made Easy\n"
-"-------------------------\n"
-"\n"
-"Get your website translated in multiple languages with no effort. Odoo proposes\n"
-"and propagates translations automatically across pages, following what you edit\n"
-"on the master page.\n"
-"\n"
-"Benefit from professional translators to translate all your contents\n"
-"automatically with the [Gengo](http://gengo.com) integration. Update any part\n"
-"of your website and the translated versions are pushed automatically in a few\n"
-"hours.\n"
-"\n"
-"Designer-Friendly Templates\n"
-"---------------------------\n"
-"\n"
-"Templates are awesome and easy to design. You don't need to develop to create\n"
-"new pages, themes or building blocks. We use a clean HTML structure, a\n"
-"[bootstrap](http://getbootstrap.com/) CSS.\n"
-"\n"
-"Customize every page on the fly with the integrated template editor. Distribute\n"
-"your work easily as an Odoo module.\n"
-"\n"
-"Fluid Grid Layouting\n"
-"--------------------\n"
-"\n"
-"Design perfect pages by drag and dropping building blocks. Move and scale them\n"
-"to fit the layout you are looking for.\n"
-"\n"
-"Building blocks are based on a responsive, mobile friendly fluid grid system\n"
-"that appropriately scales up to 12 columns as the device or viewport size\n"
-"increases.\n"
-"\n"
-"Professional Themes\n"
-"-------------------\n"
-"\n"
-"Design a custom theme or reuse pre-defined themes to customize the look and\n"
-"feel of your website.\n"
-"\n"
-"Test new color scheme easily; you can change your theme at any time in just a\n"
-"click.\n"
-"\n"
-"Integrated With Odoo Apps\n"
-"-------------------------\n"
-"\n"
-"### e-Commerce\n"
-"\n"
-"Promote products, sell online, optimize visitors' shopping experience.\n"
-"\n"
-"\n"
-"### Blogs\n"
-"\n"
-"Write news, attract new visitors, build customer loyalty.\n"
-"\n"
-"\n"
-"### Online Events\n"
-"\n"
-"Schedule, organize, promote or sell events online; conferences, trainings, webinars, etc.\n"
#. module: base
#: model:ir.module.module,description:base.module_website_sale
@@ -18461,160 +17952,6 @@ msgid ""
"Schedule, organize, promote or sell events online; conferences, webinars, trainings, etc.\n"
"\n"
msgstr ""
-"Odoo e-Commerce\n"
-"---------------\n"
-"\n"
-"### Optimize sales with an awesome online store.\n"
-"\n"
-"Odoo is an Open Source eCommerce\n"
-"unlike anything you have ever seen before. Get an awesome catalog of products\n"
-"and great product description pages.\n"
-"\n"
-"It's full-featured, integrated with your management software, fully\n"
-"customizable and super easy.\n"
-"\n"
-"Create Awesome Product Pages\n"
-"----------------------------\n"
-"\n"
-"Odoo's unique *'edit inline'* and building blocks approach makes product pages\n"
-"creation surprisingly easy. \"Want to change the price of a product? or put it\n"
-"in bold? Want to add a banner for a specific product?\" just click and change.\n"
-"What you see is what you get. Really.\n"
-"\n"
-"Drag & Drop well designed *'Building Blocks'* to create beautifull product\n"
-"pages that your customer will love.\n"
-"\n"
-"Increase Your Revenue Per Order\n"
-"-------------------------------\n"
-"\n"
-"The built-in cross-selling feature helps you offer extra products related to\n"
-"what the shopper put in his cart. (e.g. accessories)\n"
-"\n"
-"Odoo's upselling algorythm allows you to show visitors similar but more\n"
-"expensive products than the one in view, with incentives.\n"
-"\n"
-"The inline editing feature allows you to easily change a price, launch a\n"
-"promotion or fine tune the description of a product, in a just a click.\n"
-"\n"
-"A Clean Google Analytics Integration\n"
-"------------------------------------\n"
-"\n"
-"Get a clear visibility of your sales funnel. Odoo's Google Analytics trackers\n"
-"are configured by default to track all kind of events related to shopping\n"
-"carts, call-to-actions, etc.\n"
-"\n"
-"As Odoo marketing tools (mass mailing, campaigns, etc) are also linked with\n"
-"Google Analytics, you get a complete view of your business.\n"
-"\n"
-"Target New Markets\n"
-"------------------\n"
-"\n"
-"Get your website translated in multiple languages with no effort. Odoo proposes\n"
-"and propagates translations automatically across pages.\n"
-"\n"
-"Our translation \"on demand\" features allows you to benefit from professional\n"
-"translators to translate all your changes automatically. Just change any part\n"
-"of your website (a new blog post, a page modification, product descriptions,\n"
-"...) and the translated versions are updated automatically in around 32 hours.\n"
-"\n"
-"Fine Tune Your Catalog\n"
-"----------------------\n"
-"\n"
-"Get a full control on how you display your products in the catalog page:\n"
-"promotional ribbons, related sized of products, discounts, variants, grid/list\n"
-"view, etc.\n"
-"\n"
-"Edit any product inline to make your website evolve with your customer need.\n"
-"\n"
-"Acquire New Customers\n"
-"---------------------\n"
-"\n"
-"SEO tools are ready to use, with no configuration required. Odoo suggests\n"
-"keywords according to Google most searched terms, Google Analytics tracks your\n"
-"shopping cart events, sitemap are created automatically for Google indexation,\n"
-"etc.\n"
-"\n"
-"We even do structured content automatically to promote your product and events\n"
-"efficiently in Google.\n"
-"\n"
-"Leverage Social Media\n"
-"---------------------\n"
-"\n"
-"Create new landing pages easily with the Odoo inline edition feature. Send\n"
-"visitors of your different marketing campaigns to specific landing pages to\n"
-"optimize conversions.\n"
-"\n"
-"Manage a Reseller Network\n"
-"-------------------------\n"
-"\n"
-"Manage a reseller network to target new market, have local presences or broaden\n"
-"your distribution. Give them access to your reseller portal for an efficient\n"
-"collaboration.\n"
-"\n"
-"Promote your resellers online, forward leads to resellers (with built-in\n"
-"geolocalisation feature), define specific pricelists, launch a loyalty program\n"
-"(offer specific discounts to your best customers or resellers), etc.\n"
-"\n"
-"Benefit from the power of Odoo, in your online store: a powerfull tax engine,\n"
-"flexible pricing structures, a real inventory management solution, a reseller\n"
-"interface, support for products with different behaviours; physical goods,\n"
-"events, services, variants and options, etc.\n"
-"\n"
-"You don't need to interface with your warehouse, sales or accounting software.\n"
-"Everything is integrated with Odoo. No pain, real time.\n"
-"\n"
-"A Clean Checkout Process\n"
-"------------------------\n"
-"\n"
-"Convert most visitor interests into real orders with a clean checkout process\n"
-"with a minimal number of steps and a great useability on every page.\n"
-"\n"
-"Customize your checkout process to fit your business needs: payment modes,\n"
-"delivery methods, cross-selling, special conditions, etc.\n"
-"\n"
-"And much more...\n"
-"----------------\n"
-"\n"
-"### Online Sales\n"
-"\n"
-"- Mobile Interface\n"
-"- Sell products, events or services\n"
-"- Flexible pricelists\n"
-"- Product multi-variants\n"
-"- Multiple stores\n"
-"- Great checkout process\n"
-"\n"
-"### Customer Service\n"
-"\n"
-"- Customer Portal to track orders\n"
-"- Assisted shopping with website live chats\n"
-"- Returns management\n"
-"- Advanced shipping rules\n"
-"- Coupons or gift certificates\n"
-"\n"
-"### Order Management\n"
-"\n"
-"- Advanced warehouse management features\n"
-"- Invoicing and accounting integration\n"
-"- Mass mailing and customer segmentations\n"
-"- Lead automation and marketing campaigns\n"
-"- Persistent shopping cart\n"
-"\n"
-"Fully Integrated With Other Apps\n"
-"--------------------------------\n"
-"\n"
-"### CMS\n"
-"\n"
-"Easily create awesome websites with no technical knowledge required.\n"
-"\n"
-"### Blogs\n"
-"\n"
-"Write news, attract new visitors, build customer loyalty.\n"
-"\n"
-"### Online Events\n"
-"\n"
-"Schedule, organize, promote or sell events online; conferences, webinars, trainings, etc.\n"
-"\n"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_customer_form
@@ -19978,75 +19315,6 @@ msgid ""
"accurate reports on your team's performance.\n"
"\n"
msgstr ""
-"Project Management\n"
-"------------------\n"
-"\n"
-"### Infinitely flexible. Incredibly easy to use.\n"
-"\n"
-"\n"
-"Odoo's collaborative and realtime open source project management\n"
-"helps your team get work done. Keep track of everything, from the big picture\n"
-"to the minute details, from the customer contract to the billing.\n"
-"\n"
-"Designed to fit your own process\n"
-"--------------------------------\n"
-"\n"
-"Organize projects around your own processes. Work on tasks and issues using the\n"
-"kanban view, schedule tasks using the gantt chart and control deadlines in the\n"
-"calendar view. Every project may have it's own stages allowing teams to\n"
-"optimize their job.\n"
-"\n"
-"Easy to use\n"
-"-----------\n"
-"\n"
-"Get organized as fast as you can think. The easy-to-use interface takes no time\n"
-"to learn, and every action is instantaneous, so there’s nothing standing\n"
-"between you and your sweet productive flow.\n"
-"\n"
-"Work Together\n"
-"-------------\n"
-"\n"
-"### Real time chats, document sharing, email integration\n"
-"\n"
-"Use open chatter to communicate with your team or customers and share comments\n"
-"and documents on tasks and issues. Integrate discussion fast with the email\n"
-"integration.\n"
-"\n"
-"Talk to others users or customers with the website live chat feature.\n"
-"\n"
-"Collaborative Writing\n"
-"---------------------\n"
-"\n"
-"### The power of etherpad, inside your tasks\n"
-"\n"
-"Collaboratively edit the same specifications or meeting minutes right inside\n"
-"the application. The incorporated etherpad feature allows several people to\n"
-"work on the same tasks, at the same time.\n"
-"\n"
-"This is very efficient for scrum meetings, meeting minutes or complex\n"
-"specifications. Every user has their own color and you can replay the whole\n"
-"creation of the content.\n"
-"\n"
-"Get Work Done\n"
-"-------------\n"
-"\n"
-"Get alerts on followed events to stay up to date with what interests you. Use\n"
-"instant green/red visual indicators to scan through what has been done and what\n"
-"requires your attention.\n"
-"\n"
-"Timesheets, Contracts & Invoicing\n"
-"---------------------------------\n"
-"\n"
-"Projects are automatically integrated with customer contracts allowing you to\n"
-"invoice based on time & materials and record timesheets easily.\n"
-"\n"
-"Track Issues\n"
-"------------\n"
-"\n"
-"Single out the issues that arise in a project in order to have a better focus\n"
-"on resolving them. Integrate customer interaction on every issue and get\n"
-"accurate reports on your team's performance.\n"
-"\n"
#. module: base
#: model:ir.module.module,summary:base.module_helpdesk_sale_timesheet
@@ -22830,8 +22098,8 @@ msgid ""
"tests independently to functional aspects of other models. "
msgstr ""
"Deze module bevat tests met betrekking tot e-mail. Die zijn\n"
-"opgenomen in een afzonderlijke module omdat het modellen bevat die alleen worden gebruikt om te presteren\n"
-"test onafhankelijk op functionele aspecten van andere modellen."
+"opgenomen in een afzonderlijke module omdat het modellen bevat die alleen worden gebruikt om\n"
+"test onafhankelijk uit te voeren op functionele aspecten van andere modellen."
#. module: base
#: model:ir.module.module,description:base.module_website_sale_taxcloud_delivery
diff --git a/odoo/addons/base/i18n/ro.po b/odoo/addons/base/i18n/ro.po
index 5f7f82fd352..8ceb9336c88 100644
--- a/odoo/addons/base/i18n/ro.po
+++ b/odoo/addons/base/i18n/ro.po
@@ -10595,7 +10595,7 @@ msgstr ""
#. module: base
#: model:ir.model.fields,field_description:base.field_res_lang__week_start
msgid "First Day of Week"
-msgstr ""
+msgstr "Prima zi a săptămânii"
#. module: base
#: model:ir.module.module,shortdesc:base.module_fleet
@@ -13908,7 +13908,7 @@ msgstr "Document(e) lipsă"
#: code:addons/models.py:5177
#, python-format
msgid "Missing required value for the field '%s' (%s)"
-msgstr ""
+msgstr "Lipsește valoarea necesară pentru câmp '%s' (%s)"
#. module: base
#: code:addons/base/models/ir_ui_view.py:386
@@ -17973,7 +17973,7 @@ msgstr "Caută Partener"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_actions_act_window__search_view
msgid "Search View"
-msgstr ""
+msgstr "Vizualizare Căutare"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_actions_act_window__search_view_id
@@ -18529,7 +18529,7 @@ msgstr "Termen Sursa"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_translation__source
msgid "Source term"
-msgstr ""
+msgstr "Termen Sursă"
#. module: base
#: model:res.country,name:base.za
diff --git a/odoo/addons/base/i18n/ru.po b/odoo/addons/base/i18n/ru.po
index 93ad4fd285b..c9706a52db7 100644
--- a/odoo/addons/base/i18n/ru.po
+++ b/odoo/addons/base/i18n/ru.po
@@ -32,6 +32,7 @@
# Viktor Pogrebniak , 2018
# Русский «kolobok2048» Ивашка , 2018
# Vasiliy Korobatov , 2019
+# Oleg Kuryan , 2019
#
msgid ""
msgstr ""
@@ -39,7 +40,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-02 10:02+0000\n"
"PO-Revision-Date: 2016-08-05 12:54+0000\n"
-"Last-Translator: Vasiliy Korobatov , 2019\n"
+"Last-Translator: Oleg Kuryan , 2019\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -12294,7 +12295,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.gf
msgid "French Guiana"
-msgstr ""
+msgstr "Французская Гвиана"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
@@ -12304,7 +12305,7 @@ msgstr "Французская Платежная ведомость"
#. module: base
#: model:res.country,name:base.pf
msgid "French Polynesia"
-msgstr ""
+msgstr "Французская Полинезия"
#. module: base
#: model:res.country,name:base.tf
@@ -12744,12 +12745,12 @@ msgstr "Группы (нет группы = все)"
#. module: base
#: model:res.country,name:base.gp
msgid "Guadeloupe"
-msgstr ""
+msgstr "Гваделупа"
#. module: base
#: model:res.country,name:base.gu
msgid "Guam"
-msgstr ""
+msgstr "Гуам"
#. module: base
#: model:res.country,name:base.gt
@@ -12774,7 +12775,7 @@ msgstr "Гвинея"
#. module: base
#: model:res.country,name:base.gw
msgid "Guinea-Bissau"
-msgstr ""
+msgstr "Гвинея-Бисау"
#. module: base
#: model:res.country,name:base.gy
@@ -12864,7 +12865,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.hm
msgid "Heard Island and McDonald Islands"
-msgstr ""
+msgstr "Остров Херд и острова Макдональд"
#. module: base
#: selection:ir.translation,type:0
@@ -14251,7 +14252,7 @@ msgstr "Кувейт"
#. module: base
#: model:res.country,name:base.kg
msgid "Kyrgyzstan"
-msgstr ""
+msgstr "Киргизия"
#. module: base
#: model:res.partner.industry,full_name:base.res_partner_industry_L
@@ -15222,7 +15223,7 @@ msgstr "Маршалловы Острова"
#. module: base
#: model:res.country,name:base.mq
msgid "Martinique"
-msgstr ""
+msgstr "Мартиника"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mass_mailing_themes
@@ -15690,7 +15691,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.md
msgid "Moldova"
-msgstr ""
+msgstr "Молдавия"
#. module: base
#: model:res.country,name:base.mc
@@ -15866,7 +15867,7 @@ msgstr "Нидерланды - Бухгалтерские отчёты"
#. module: base
#: model:res.country,name:base.nc
msgid "New Caledonia"
-msgstr ""
+msgstr "Новая Каледония"
#. module: base
#: code:addons/base/wizard/base_export_language.py:18
@@ -18194,7 +18195,7 @@ msgstr "Телефон:"
#. module: base
#: model:res.country,name:base.pn
msgid "Pitcairn Islands"
-msgstr ""
+msgstr "Острова Питкэрн"
#. module: base
#: selection:ir.actions.act_window.view,view_mode:0
@@ -19270,7 +19271,7 @@ msgstr "Руанда"
#. module: base
#: model:res.country,name:base.re
msgid "Réunion"
-msgstr ""
+msgstr "Реюньон"
#. module: base
#: model:res.partner.industry,full_name:base.res_partner_industry_S
@@ -19335,12 +19336,12 @@ msgstr "Святой Варфоломей"
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena, Ascension and Tristan da Cunha"
-msgstr ""
+msgstr "Острова Святой Елены, Вознесения и Тристан-да-Кунья"
#. module: base
#: model:res.country,name:base.kn
msgid "Saint Kitts and Nevis"
-msgstr ""
+msgstr "Сент-Китс и Невис"
#. module: base
#: model:res.country,name:base.lc
@@ -19360,7 +19361,7 @@ msgstr "Сен-Пьер и Микелон"
#. module: base
#: model:res.country,name:base.vc
msgid "Saint Vincent and the Grenadines"
-msgstr ""
+msgstr "Сент-Винсент и Гренадины"
#. module: base
#: model:ir.module.module,summary:base.module_hr_contract_salary
@@ -20251,7 +20252,7 @@ msgstr "Название Региона"
#. module: base
#: model:res.country,name:base.ps
msgid "State of Palestine"
-msgstr ""
+msgstr "Государство Палестина"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_country__state_ids
@@ -20432,7 +20433,7 @@ msgstr "Опросы"
#. module: base
#: model:res.country,name:base.sj
msgid "Svalbard and Jan Mayen"
-msgstr ""
+msgstr "Шпицберген и Ян-Майен"
#. module: base
#: model:res.country,name:base.sz
@@ -20500,7 +20501,7 @@ msgstr "Обновление Системы"
#. module: base
#: model:res.country,name:base.st
msgid "São Tomé and Príncipe"
-msgstr ""
+msgstr "Сан-Томе и Принсипи"
#. module: base
#: model:res.partner.industry,full_name:base.res_partner_industry_T
@@ -21425,7 +21426,7 @@ msgstr "Смещение часового пояса"
#. module: base
#: model:res.country,name:base.tl
msgid "Timor-Leste"
-msgstr ""
+msgstr "Восточный Тимор"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_partner__title
@@ -22557,7 +22558,7 @@ msgstr "Стоимость товара на складе WMS"
#. module: base
#: model:res.country,name:base.wf
msgid "Wallis and Futuna"
-msgstr ""
+msgstr "Уоллис и Футуна"
#. module: base
#: model:ir.module.category,name:base.module_category_warehouse
diff --git a/odoo/addons/base/i18n/uk.po b/odoo/addons/base/i18n/uk.po
index ccf16e3242c..10c4dbff116 100644
--- a/odoo/addons/base/i18n/uk.po
+++ b/odoo/addons/base/i18n/uk.po
@@ -4648,6 +4648,14 @@ msgid ""
"* Possibility to add a measure to the quality check with a min/max tolerance\n"
"* Define your stages for the quality alerts\n"
msgstr ""
+"\n"
+"База якості\n"
+"===============\n"
+"* Визначте пункти якості, які будуть генерувати перевірки якості на комплектуваннях,\n"
+" замовлення на виробництво або робочі замовлення (quality_mrp)\n"
+"* Сповіщення якості можуть створюватися незалежно або залежно від перевірок якості\n"
+"* Можливість додати міру до перевірки якості з мін/макс дозволом\n"
+"* Визначіть ваші етапи сповіщення якості\n"
#. module: base
#: model:ir.module.module,description:base.module_quality_control
@@ -4661,6 +4669,14 @@ msgid ""
"* Possibility to add a measure to the quality check with a min/max tolerance\n"
"* Define your stages for the quality alerts\n"
msgstr ""
+"\n"
+"Контроль якості\n"
+"===============\n"
+"* Визначте якісні показники, які будуть генерувати якість перевірок комплектування,\n"
+"замовлення на виробництво або робоче замовлення (quality_mrp)\n"
+"* Сповіщення про якість можуть бути створені незалежно або пов'язані з перевірками якості\n"
+"* Можливість додати міру до перевірки якості з мінімальною/максимальною толерантністю\n"
+"* Визначте свої етапи для попередження про якість\n"
#. module: base
#: model:ir.module.module,description:base.module_sale_expense
@@ -4893,6 +4909,16 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Сингапурський план ріхунків та локалізація.\n"
+"=======================================================\n"
+"\n"
+"Цей модуль включає, для обліку:\n"
+" - План рахунків Сингапуру\n"
+" - Поле UEN (Унікальний номер об'єкта) на компанії та партнері\n"
+" - Поле PermitNo і PermitNoDate на рахунку-фактурі\n"
+"\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_l10n_es
@@ -5320,6 +5346,10 @@ msgid ""
"========================================================================\n"
" "
msgstr ""
+"\n"
+"Це базовий модуль для управління одиницями вимірювання.\n"
+"========================================================================\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_product
@@ -6033,6 +6063,18 @@ msgid ""
"- Check on bottom: ADP standard\n"
" "
msgstr ""
+"\n"
+"Цей модуль дозволяє друкувати ваші платежі на попередньо друкованих чеках.\n"
+"Ви можете налаштувати вихід (компонування, заглушки, формат паперу тощо) у налаштуваннях компанії, а також керувати \n"
+"нумерацією чеків (якщо ви використовуєте попередньо надруковані чеки без номерів) у налаштуваннях журналу.\n"
+"За Канадською асоціацією платежів (https://www.payments.ca/sites/default/files/standard_006_complete_0.pdf)\n"
+"\n"
+"Підтримувані формати\n"
+"-----------------\n"
+"- Чек зверху : Quicken / QuickBooks standard\n"
+"- Чек посередині: Peachtree standard\n"
+"- Чек внизу: ADP standard\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_anonymization
@@ -6619,6 +6661,9 @@ msgid ""
"Use budgets to compare actual with expected revenues and costs\n"
"--------------------------------------------------------------\n"
msgstr ""
+"\n"
+"Використовуйте бюджети для порівняння фактичних і очікуваних доходів і витрат\n"
+"--------------------------------------------------------------\n"
#. module: base
#: model:ir.module.module,description:base.module_sales_team
@@ -6742,6 +6787,11 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Перегляньте статистику посилань трекера на інформаційній панелі електронної комерції\n"
+"=====================================================\n"
+"\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_stock_account
@@ -6957,6 +7007,7 @@ msgid ""
" This is the base module to manage chart of accounting and localization for "
"Hong Kong "
msgstr ""
+"Це базовий модуль для управління планом рахунків та локалізації для Гонконгу"
#. module: base
#: model:ir.ui.view,arch_db:base.res_lang_form
@@ -8841,7 +8892,7 @@ msgstr "Аналітичний бухоблік"
#. module: base
#: model:ir.module.module,shortdesc:base.module_analytic_enterprise
msgid "Analytic Accounting Enterprise"
-msgstr ""
+msgstr "Аналітичний бухоблік Enterprise"
#. module: base
#: model:ir.module.module,summary:base.module_mrp_account
@@ -9411,7 +9462,7 @@ msgstr "Базове поле"
#: code:addons/base/models/res_lang.py:240
#, python-format
msgid "Base Language 'en_US' can not be deleted."
-msgstr ""
+msgstr "Базову мову 'en_US' не можна видалити."
#. module: base
#: selection:ir.model,state:0
@@ -9465,12 +9516,12 @@ msgstr "Базовий перегляд 2D Grid для odoo"
#. module: base
#: model:ir.module.module,summary:base.module_web_cohort
msgid "Basic Cohort view for odoo"
-msgstr ""
+msgstr "Базовий перегляд когорти для odoo"
#. module: base
#: model:ir.module.module,summary:base.module_quality
msgid "Basic Feature for Quality"
-msgstr ""
+msgstr "Базова функція для якості"
#. module: base
#: model:ir.module.module,summary:base.module_iap
@@ -9848,7 +9899,7 @@ msgstr "Канада - Бухгалтерський облік"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ca_check_printing
msgid "Canadian Checks Layout"
-msgstr ""
+msgstr "Канадійський шаблон чеку"
#. module: base
#: model:ir.ui.view,arch_db:base.base_partner_merge_automatic_wizard_form
@@ -9892,13 +9943,14 @@ msgstr "Відмінити Оновлення"
#: code:addons/models.py:1981
#, python-format
msgid "Cannot aggregate field %r."
-msgstr ""
+msgstr "Неможливо агрегувати поле %r."
#. module: base
#: code:addons/base/models/res_lang.py:228
#, python-format
msgid "Cannot deactivate a language that is currently used by users."
msgstr ""
+"Не вдається деактивувати мову, яка наразі використовується користувачами."
#. module: base
#: code:addons/base/models/res_config.py:385
@@ -10452,7 +10504,7 @@ msgstr "Порівняйте табелі та прогноз для ваших
#. module: base
#: model:ir.module.module,summary:base.module_project_timesheet_forecast
msgid "Compare timesheets and forecasts"
-msgstr ""
+msgstr "Порівняйте графіки та прогнози"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_partner__contact_address
@@ -10715,7 +10767,7 @@ msgstr "Скопійовано"
#. module: base
#: model:ir.module.category,name:base.module_category_theme_corporate
msgid "Corporate"
-msgstr ""
+msgstr "Корпоративний"
#. module: base
#: model:res.country,name:base.cr
@@ -10855,7 +10907,7 @@ msgstr "Створіть банківський рахунок"
#. module: base
#: model:ir.actions.act_window,help:base.action_ui_view_custom
msgid "Create a customized view"
-msgstr ""
+msgstr "Створіть налаштований перегляд"
#. module: base
#: selection:ir.actions.server,state:0
@@ -10881,7 +10933,7 @@ msgstr "Створити новий тег для контактів"
#: model:ir.actions.act_window,help:base.action_partner_customer_form
#: model:ir.actions.act_window,help:base.action_partner_form
msgid "Create a new customer in your address book"
-msgstr ""
+msgstr "Створіть нового клієнта ваші адресній книзі"
#. module: base
#: model:ir.actions.act_window,help:base.action_attachment
@@ -10896,7 +10948,7 @@ msgstr "Створити нову індустрію"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_supplier_form
msgid "Create a new vendor in your address book"
-msgstr ""
+msgstr "Створіть нового постачальника у вашій адресній книзі"
#. module: base
#: model:ir.actions.act_window,help:base.action_res_company_form
@@ -12064,7 +12116,7 @@ msgstr "Легко створюйте та налаштовуйте ваші д
#. module: base
#: model:ir.module.module,shortdesc:base.module_delivery_easypost
msgid "Easypost Shipping"
-msgstr ""
+msgstr "Доставка Easypost"
#. module: base
#: model:res.country,name:base.ec
@@ -12099,6 +12151,9 @@ msgid ""
"partner is a customer without access or with a limited access created for "
"sharing data."
msgstr ""
+"Або клієнт (не користувач), або спільний користувач. Вказаний поточний "
+"партнер - клієнт без доступу або з обмеженим доступом, створеним для обміну "
+"даними."
#. module: base
#: model:res.country,name:base.sv
@@ -12282,6 +12337,10 @@ msgid ""
"* Traceability report\n"
"* Cost Structure report (mrp_account)"
msgstr ""
+"Розширення підприємства для MRP\n"
+"* Планування робочого замовлення. Перевірте планування по перегляду Гантта, згрупованих за виробничим замовленням/робочим центром\n"
+"* Звіт про відстеження\n"
+"* Звіт про структуру витрат (mrp_account)"
#. module: base
#: model:res.partner.industry,name:base.res_partner_industry_R
@@ -13651,7 +13710,7 @@ msgstr "Німеччина"
#. module: base
#: model:ir.module.module,summary:base.module_website_sale_dashboard
msgid "Get a new dashboard view in the Website App"
-msgstr ""
+msgstr "Отримайте новий перегляд панелі приладів у додатку Веб-сайт "
#. module: base
#: model:ir.module.module,summary:base.module_website_sale_dashboard_with_margin
@@ -13687,6 +13746,9 @@ msgid ""
" Group-specific rules grant additional permissions, but are constrained within the bounds of global ones.\n"
" The first group rules restrict further the global rules, but can be relaxed by additional group rules."
msgstr ""
+"Загальні правила (які не належать до групи) є обмеженнями, і їх не можна обійти.\n"
+" Правила, специфічні для групи, надають додаткові дозволи, але обмежені в загальних межах.\n"
+" Правила першої групи обмежують загальні правила, але можуть бути послаблені додатковими правилами групи."
#. module: base
#: model:ir.ui.view,arch_db:base.view_rule_form
@@ -13694,6 +13756,8 @@ msgid ""
"Global rules are combined together with a logical AND operator, and with the"
" result of the following steps"
msgstr ""
+"Загальні правила об'єднуються разом з логічним оператором AND і з "
+"результатом наступних кроків"
#. module: base
#: code:addons/base/models/res_config.py:734
@@ -13762,6 +13826,59 @@ msgid ""
"With this plugin, you can synchronize your Odoo calendar with Google Calendar.\n"
"\n"
msgstr ""
+"Google Календар\n"
+"---------------\n"
+"\n"
+"Отримуйте свої зустрічі, ваші відпустки... Отримайте свій календар у будь-якому\n"
+" місці і ніколи не забувайте про подію, повністю синхронізовану з Odoo CRM з відкритим кодом.\n"
+"\n"
+"Слідкуйте за своїми подіями\n"
+"--------------------------\n"
+"\n"
+"Легко бачите мету зустрічі, час початку, а також учасника(ів) ... \n"
+"Все це без натискання на що-небудь ...\n"
+"\n"
+"Подію створити так легко\n"
+"-------------------------\n"
+"\n"
+"В один клік можна створити подію ... Ви можете перетягнути подію, якщо\n"
+" ви хочете перенести її на інший час. Ви можете зменшити або\n"
+" продовжити подію, якщо потрібно змінити години початку або\n"
+" тривалість зустрічі.\n"
+"\n"
+"Створюйте повторювану подію\n"
+"----------------------\n"
+"\n"
+"Ви також можете створювати повторювані події тільки з однією подією.\n"
+" Вам потрібно створити подію кожного понеділка тижня? За допомогою\n"
+" лише одного можна вказати повторення, а якщо ця подія переміщена\n"
+" або вилучена, це не є проблемою, ви можете розв'язати подію від інших повторів.\n"
+"\n"
+"Переглядайте усі події, які ви хочете\n"
+"------------------------\n"
+"\n"
+"Дивіться у своєму календарі, подію від інших людей, де ваш учасник, а\n"
+" також їхні події, просто додавши вибраних колег. Кожен співробітник\n"
+" матиме свій колір у вашому календарі, і кожен учасник матиме свій\n"
+" аватар у події ...\n"
+"\n"
+"Отримуте електронну пошту\n"
+"------------\n"
+"\n"
+"You will receive an email at creation of an event where you are attendee, but\n"
+"also when this event is updated for some fields as date start, ...\n"
+"\n"
+"Be notified\n"
+"-----------\n"
+"\n"
+"You can ask to have a alarm of type 'notification' in your Odoo. You will have\n"
+"a notification in you Odoo which ever the page you are.\n"
+"\n"
+"Google Calendar\n"
+"---------------\n"
+"\n"
+"With this plugin, you can synchronize your Odoo calendar with Google Calendar.\n"
+"\n"
#. module: base
#: model:ir.module.module,shortdesc:base.module_google_drive
@@ -13871,6 +13988,7 @@ msgstr "Група контактів"
#: model:ir.ui.view,arch_db:base.view_rule_form
msgid "Group-specific rules are combined together with a logical OR operator"
msgstr ""
+"Правила, специфічні для групи, об'єднуються разом з логічним оператором АБО"
#. module: base
#: model:ir.actions.act_window,name:base.action_res_groups
@@ -14097,7 +14215,7 @@ msgstr "Допомагає вам керувати табелями."
#. module: base
#: model:ir.module.category,description:base.module_category_user_type
msgid "Helps you manage users."
-msgstr ""
+msgstr "Допомагає вам керувати користувачами."
#. module: base
#: model:ir.module.category,description:base.module_category_event_management
@@ -14112,7 +14230,7 @@ msgstr "Допомагає вам керувати вашими оцінками
#. module: base
#: model:ir.module.category,description:base.module_category_hr_contract
msgid "Helps you manage your contracts."
-msgstr ""
+msgstr "Допомагає вам керувати вашими контрактами."
#. module: base
#: model:ir.module.category,description:base.module_category_hr_expense
@@ -14187,7 +14305,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,description:base.module_category_website_sign
msgid "Helps you sign and complete your documents easily."
-msgstr ""
+msgstr "Допомагає вам підписувати та заповнювати ваші документи легко."
#. module: base
#: model:ir.ui.view,arch_db:base.wizard_lang_export
@@ -14237,7 +14355,7 @@ msgstr "Гонг Конг"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hk
msgid "Hong Kong - Accounting"
-msgstr ""
+msgstr "Гонг Конг - Бухоблік"
#. module: base
#: model:ir.model.fields,help:base.field_ir_mail_server__smtp_host
@@ -14591,6 +14709,8 @@ msgid ""
"If user belongs to several groups, the results from step 2 are combined with"
" logical OR operator"
msgstr ""
+"Якщо користувач належить до кількох груп, результати з кроку 2 поєднуються з"
+" логічним оператором OR"
#. module: base
#: model:ir.actions.act_window,help:base.action_country_state
@@ -14922,7 +15042,7 @@ msgstr "Встановити мову"
#. module: base
#: model:ir.actions.server,name:base.action_server_module_immediate_install
msgid "Install Modules"
-msgstr ""
+msgstr "Встановити модулі"
#. module: base
#: selection:ir.module.module,state:0
@@ -15085,7 +15205,7 @@ msgstr "Недійсний параметр \"групувати за\""
#: code:addons/models.py:1983
#, python-format
msgid "Invalid aggregation function %r."
-msgstr ""
+msgstr "Недійсна функція агрегації %r."
#. module: base
#: code:addons/base/models/ir_fields.py:324
@@ -15113,7 +15233,7 @@ msgstr "Недійсне поле %s.%s"
#: code:addons/models.py:1973
#, python-format
msgid "Invalid field specification %r."
-msgstr ""
+msgstr "Недійсна специфікація поля %r."
#. module: base
#: sql_constraint:ir.ui.view:0
@@ -15153,7 +15273,7 @@ msgstr "Недійсний критерій пошуку"
#: code:addons/base/models/ir_ui_view.py:582
#, python-format
msgid "Invalid specification for moved nodes: '%s'"
-msgstr ""
+msgstr "Недійсна специфікація для переміщених вузлів: '%s'"
#. module: base
#: code:addons/base/models/ir_property.py:69
@@ -16131,17 +16251,17 @@ msgstr "Невдача доставки листа"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mail_enterprise
msgid "Mail Enterprise"
-msgstr ""
+msgstr "Enterprise пошти"
#. module: base
#: model:ir.module.module,shortdesc:base.module_test_mail
msgid "Mail Tests"
-msgstr ""
+msgstr "Поштові тести"
#. module: base
#: model:ir.module.module,summary:base.module_test_mail
msgid "Mail Tests: performances and tests specific to mail"
-msgstr ""
+msgstr "Поштові тести: виступи та тести, характерні для пошти"
#. module: base
#: code:addons/base/models/ir_mail_server.py:486
@@ -16182,7 +16302,7 @@ msgstr "Обслуговування"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_maintenance
msgid "Maintenance - HR"
-msgstr ""
+msgstr "Обслуговування - HR"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp_maintenance
@@ -16422,7 +16542,7 @@ msgstr "Автоматичне відмічення"
#. module: base
#: model:ir.module.module,shortdesc:base.module_test_marketing_automation
msgid "Marketing Automation Tests"
-msgstr ""
+msgstr "Тести з автоматизації маркетингу"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ma
@@ -16748,7 +16868,7 @@ msgstr "Модель %s не існує!"
#: code:addons/base/models/ir_model.py:180
#, python-format
msgid "Model '%s' contains module data and cannot be removed."
-msgstr ""
+msgstr "Модель '%s' вміщує дані модуля та не може бути видалена. "
#. module: base
#: model:ir.actions.act_window,name:base.action_model_constraint
@@ -17234,7 +17354,7 @@ msgstr "К-сть переглядів"
#. module: base
#: model:ir.actions.act_window,help:base.open_module_tree
msgid "No website module found!"
-msgstr ""
+msgstr "Не знайдено модуля веб-сайт!"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_model_data__noupdate
@@ -17262,6 +17382,11 @@ msgid ""
"supposed to do\n"
" "
msgstr ""
+"Нетривіальні утиліти тестування можуть вимагати моделей і всього\n"
+" \n"
+"Цей модуль корисний для перевірки того, що вони роблять те, \n"
+"що вони повинні робити\n"
+" "
#. module: base
#: selection:ir.mail_server,smtp_encryption:0
@@ -17316,7 +17441,7 @@ msgstr "Не встановлений"
#: code:addons/base/models/ir_model.py:1395
#, python-format
msgid "Not enough access rights on the external ID:"
-msgstr ""
+msgstr "Недостатньо прав доступу для зовнішнього ID:"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_partner__comment
@@ -19378,12 +19503,13 @@ msgstr ""
#: model:ir.actions.act_window,help:base.action_partner_customer_form
#: model:ir.actions.act_window,help:base.action_partner_form
msgid "Odoo helps you easily track all activities related to a customer."
-msgstr ""
+msgstr "Odoo допоможе вам легко відстежувати всі дії, пов'язані з клієнтом."
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_supplier_form
msgid "Odoo helps you easily track all activities related to a vendor."
msgstr ""
+"Odoo допоможе вам легко відстежувати всі дії, пов'язані з постачальником."
#. module: base
#: model:ir.model.fields,help:base.field_ir_sequence__padding
@@ -19959,6 +20085,121 @@ msgid ""
"\n"
"Create a great \"About us\" page by presenting your team efficiently.\n"
msgstr ""
+"Організація заходів, тренінгів та веб-семінарів\n"
+"-------------------------------------\n"
+"\n"
+"### Планування, просування, продаж, організація\n"
+"\n"
+"Організація, просування та продаж подій онлайн. Незалежно від того, чи організовуєте ви зустрічі, конференції, тренінги або вебінари, Odoo надає вам усі необхідні функції для керування подіями.\n"
+"\n"
+"Створіть чудові сторінки подій\n"
+"--------------------------\n"
+"\n"
+"### Позбавтеся від старих редакторів WYSIWYG\n"
+"\n"
+"Створіть красиві сторінки подій за допомогою перетягування і розгортання добре створених *'Конструкторських блоків'*. Публікуйте фотографії подій, динаміки, розклад і т.д..\n"
+"\n"
+"Унікальний підхід Odoo до *\"вбудованого редагування\"* робить створення веб-сайту напрочуд легким. \"Хочете внести спікера? Змінити ціну квитка? Оновлювати банер? Сприяти спонсорам?\" просто натисніть і змініть.\n"
+"\n"
+"Продавайте квитки онлайн\n"
+"-------------------\n"
+"\n"
+"### Automate the registration and payment process\n"
+"\n"
+"Sell registrations to your event with the multi-ticketing feature. Events can be free or for a fee. Attendees can pay online with a credit card or on invoice, based on your configuration.\n"
+"\n"
+"Boost your sales with early-bird prices, special conditions for members, or extra services with multiple tickets.\n"
+"\n"
+"A Clean Google Analytics Integration\n"
+"------------------------------------\n"
+"\n"
+"### Control your sales funnel with Google Analytics\n"
+"\n"
+"Get a clear visibility of your sales funnel. Odoo's Google Analytics trackers are configured by default to track all kind of events related to shopping carts, call-to-actions, etc.\n"
+"\n"
+"As Odoo marketing tools (mass mailing, campaigns, etc) are also linked with Google Analytics, you get a full view of your business.\n"
+"\n"
+"Promote Events Efficiently\n"
+"--------------------------\n"
+"\n"
+"### Mass Mailing & Social Media\n"
+"\n"
+"Use the segmentation, the social network integration and mass mailing features to promote your events to the right audience. Setup automated emails to attendees to send them last minute details.\n"
+"\n"
+"Designer-Friendly Themes\n"
+"------------------------\n"
+"\n"
+"### Designers love working on Odoo\n"
+"\n"
+"Themes are awesome and easy to design. You don't need to develop to create new pages, themes or building blocks. We use a clean HTML structure, a [bootstrap](http://getbootstrap.com/) CSS and our modularity allows to distribute your themes easily.\n"
+"\n"
+"The building block approach allows the website to stay clean after the end-users start creating new contents.\n"
+"\n"
+"Make Your Event More Visible\n"
+"----------------------------\n"
+"\n"
+"### SEO tools at your finger tips\n"
+"\n"
+"SEO tools are ready to use, with no configuration required. Odoo suggests keywords according to Google most searched terms, Google Analytics tracks your shopping cart events and sitemap are created automatically.\n"
+"\n"
+"We even do structured content automatically to promote your events and products efficiently in Google.\n"
+"\n"
+"Leverage Social Media\n"
+"---------------------\n"
+"\n"
+"### Optimize: from Ads to Conversions\n"
+"\n"
+"Create new landing pages easily with the Odoo inline edition feature. Send visitors of your different marketing campaigns to event landing pages to optimize conversions.\n"
+"\n"
+"And Much More...\n"
+"----------------\n"
+"\n"
+"### Schedule\n"
+"\n"
+"- Calendar of Events\n"
+"- Publish related documents\n"
+"- Ressources allocation\n"
+"- Automate purchases (catering...)\n"
+"- Multiple locations and organizers\n"
+"- Mobile Interface\n"
+"\n"
+"### Sell\n"
+"\n"
+"- Online or offline sales\n"
+"- Automated invoicing\n"
+"- Cancellation policies\n"
+"- Specific prices for members\n"
+"- Dashboards and reporting\n"
+"\n"
+"### Organize\n"
+"\n"
+"- Advanced Planification\n"
+"- Print Badges\n"
+"- Automate Follow-up Emails\n"
+"- Min/Max capacities\n"
+"- Manage classes and ressources\n"
+"- Create group of attendees\n"
+"- Automate statisfaction surveys\n"
+"\n"
+"Fully Integrated With Others Apps\n"
+"---------------------------------\n"
+"\n"
+"### Get hundreds of open source apps for free\n"
+"\n"
+"\n"
+"### eCommerce\n"
+"\n"
+"Promote products, sell online, optimize visitors' shopping experiences.\n"
+"\n"
+"\n"
+"### Blogs\n"
+"\n"
+"Write news, attract new visitors, build customer loyalty.\n"
+"\n"
+"\n"
+"### Our Team\n"
+"\n"
+"Create a great \"About us\" page by presenting your team efficiently.\n"
#. module: base
#: model:ir.model.fields,field_description:base.field_report_paperformat__orientation
@@ -20036,7 +20277,7 @@ msgstr "DPI на виході"
#: code:addons/models.py:1995
#, python-format
msgid "Output name %r is used twice."
-msgstr ""
+msgstr "Назва виходу %r використовується двічі ."
#. module: base
#: model:ir.model.fields,field_description:base.field_base_language_import__overwrite
@@ -20424,6 +20665,9 @@ msgid ""
"Please configure an email on the current user to simulate sending an email "
"message via this outgoing server"
msgstr ""
+"Будь ласка, налаштуйте електронний лист на поточного користувача, щоб "
+"імітувати надсилання повідомлення електронної пошти через цей вихідний "
+"сервер"
#. module: base
#: code:addons/base/models/ir_model.py:1212
@@ -20584,7 +20828,7 @@ msgstr "Округлення ціни"
#. module: base
#: model:ir.module.module,summary:base.module_l10n_ca_check_printing
msgid "Print CA Checks"
-msgstr ""
+msgstr "Друк чеків CA "
#. module: base
#: model:ir.module.module,shortdesc:base.module_print
@@ -20686,7 +20930,7 @@ msgstr "Шаблон електронної пошти отвару"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp_bom_cost
msgid "Product Extension: Compute cost from BoM"
-msgstr ""
+msgstr "Розширення товару: обчислюйте витрати зі специфікації"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp_plm
@@ -20997,12 +21241,12 @@ msgstr "Замовлення на купівлю, надходження, рах
#. module: base
#: model:ir.module.module,summary:base.module_purchase_stock
msgid "Purchase Orders, Receipts, Vendor Bills for Stock"
-msgstr ""
+msgstr "Замовлення на купівлю, надходження, рахунки постачальника для складу"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase_stock
msgid "Purchase Stock"
-msgstr ""
+msgstr "Придбати запас"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase_mrp
@@ -21060,7 +21304,7 @@ msgstr "Попередження якості та контрольні пунк
#. module: base
#: model:ir.module.module,shortdesc:base.module_quality
msgid "Quality Base"
-msgstr ""
+msgstr "База якості"
#. module: base
#: model:ir.module.module,shortdesc:base.module_quality_control
@@ -21083,6 +21327,7 @@ msgstr "Питання щодо Подій"
#: model:ir.module.module,summary:base.module_web_settings_dashboard
msgid "Quick actions for installing new app, adding users, etc."
msgstr ""
+"Швидкі дії для встановлення нової програми, додавання користувачів тощо"
#. module: base
#: model:ir.module.module,summary:base.module_sale_expense
@@ -21262,7 +21507,7 @@ msgstr "Пов'язані дії сервера"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_model_fields__related_field_id
msgid "Related field"
-msgstr ""
+msgstr "Пов'язане поле"
#. module: base
#: code:addons/base/models/ir_model.py:425
@@ -22050,7 +22295,7 @@ msgstr "Надсилайте текстові повідомлення як на
#. module: base
#: model:ir.module.module,description:base.module_delivery_easypost
msgid "Send your parcels through Easypost and track them online"
-msgstr ""
+msgstr "Надсилайте свої посилки через Easypost і відстежуйте їх онлайн"
#. module: base
#: model:ir.module.module,description:base.module_delivery_dhl
@@ -22827,7 +23072,7 @@ msgstr "Архів TGZ"
#. module: base
#: model:ir.ui.view,arch_db:base.wizard_lang_export
msgid "TGZ format: bundles multiple PO(T) files as a single archive"
-msgstr ""
+msgstr "Формат TGZ: розшаровує декілька файлів PO(T) як єдиний архів"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_company__vat
@@ -22981,12 +23226,12 @@ msgstr "Тестування продуктивності"
#. module: base
#: model:ir.module.module,summary:base.module_test_marketing_automation
msgid "Test Suits for Automated Marketing Campaigns"
-msgstr ""
+msgstr "Тестові костюми для автоматизованих маркетингових кампаній"
#. module: base
#: model:ir.module.module,shortdesc:base.module_test_testing_utilities
msgid "Test testing utilities"
-msgstr ""
+msgstr "Утиліти тестового тестування"
#. module: base
#: model:ir.module.module,description:base.module_test_access_rights
diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py
index 9606a82e8bc..25c183670a4 100644
--- a/odoo/addons/base/models/res_partner.py
+++ b/odoo/addons/base/models/res_partner.py
@@ -438,7 +438,7 @@ class Partner(models.Model):
as if they were related fields """
commercial_partner = self.commercial_partner_id
if commercial_partner != self:
- sync_vals = commercial_partner._update_fields_values(self._commercial_fields())
+ sync_vals = commercial_partner.with_prefetch()._update_fields_values(self._commercial_fields())
self.write(sync_vals)
@api.multi
diff --git a/odoo/fields.py b/odoo/fields.py
index 542e37aee6b..16a13bedbe4 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -2472,7 +2472,7 @@ class One2many(_RelationalMulti):
to_relink = {} # lines to relink {line_id: record_id}
def unlink(line_ids):
- if comodel._fields[inverse].ondelete == 'cascade':
+ if getattr(comodel._fields[inverse], 'ondelete', False) == 'cascade':
to_delete.extend(line_ids)
else:
to_relink.update(dict.fromkeys(line_ids, False))