From f537a58f4892bd003c44b16165063c171b602fa9 Mon Sep 17 00:00:00 2001
From: "Ravi Gohil (OpenERP)"
Date: Wed, 10 Apr 2013 22:31:03 +0530
Subject: [PATCH 01/53] [FIX] l10n_multilang: Translated terms for 'Account
Tax' names were created with wrong 'Record ID' value. (Maintenance Case:
589913)
bzr revid: rgo@tinyerp.com-20130410170103-bptugu705353akyf
---
addons/l10n_multilang/l10n_multilang.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/l10n_multilang/l10n_multilang.py b/addons/l10n_multilang/l10n_multilang.py
index 9596b292ff3..615bad8cb68 100644
--- a/addons/l10n_multilang/l10n_multilang.py
+++ b/addons/l10n_multilang/l10n_multilang.py
@@ -139,7 +139,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
def _process_taxes_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None):
obj_tax_template = self.pool.get('account.tax.template')
obj_tax = self.pool.get('account.tax')
- in_ids = sorted([x.id for x in obj_multi.chart_template_id.tax_template_ids])
+ in_ids = [x.id for x in obj_multi.chart_template_id.tax_template_ids]
out_ids = obj_tax.search(cr, uid, [('company_id', '=', company_id)], order='id')
return self.process_translations(cr, uid, langs, obj_tax_template, field, in_ids, obj_tax, out_ids, force_write=False, context=context)
From b8946be24e067d45eda14320fb1a3d0b640cecca Mon Sep 17 00:00:00 2001
From: "Ravish (Open ERP)"
Date: Mon, 29 Apr 2013 16:28:59 +0530
Subject: [PATCH 02/53] division by Zero error on product_margin
bzr revid: rmu@tinyerp.com-20130429105859-ud19ak4j6df8hdct
---
addons/product_margin/product_margin.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/product_margin/product_margin.py b/addons/product_margin/product_margin.py
index f9187647f35..fe6f133b3e2 100644
--- a/addons/product_margin/product_margin.py
+++ b/addons/product_margin/product_margin.py
@@ -53,9 +53,9 @@ class product_product(osv.osv):
states = ('draft', 'open', 'paid')
sqlstr="""select
- sum(l.price_unit * l.quantity)/sum(l.quantity) as avg_unit_price,
+ sum(l.price_unit * l.quantity)/sum(nullif(l.quantity,0)) as avg_unit_price,
sum(l.quantity) as num_qty,
- sum(l.quantity * (l.price_subtotal/l.quantity)) as total,
+ sum(l.quantity * (l.price_subtotal/(nullif(l.quantity,0)))) as total,
sum(l.quantity * pt.list_price) as sale_expected,
sum(l.quantity * pt.standard_price) as normal_cost
from account_invoice_line l
From 5db1c8333de2daa1f57cf0ea08ba067a9e45ec7a Mon Sep 17 00:00:00 2001
From: "Dhruti Shastri (OpenERP)"
Date: Thu, 2 May 2013 17:32:07 +0530
Subject: [PATCH 03/53] [sale]:Invoice/Deliever Address are not fileterd based
on selected Customer(partner) (Case:592166)
bzr revid: dhs@tinyerp.com-20130502120207-a7he9qqty54h1xaz
---
addons/sale/sale.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 2518a801eb2..cf75591be9a 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -207,8 +207,8 @@ class sale_order(osv.osv):
'date_confirm': fields.date('Confirmation Date', readonly=True, select=True, help="Date on which sales order is confirmed."),
'user_id': fields.many2one('res.users', 'Salesperson', states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True, track_visibility='onchange'),
'partner_id': fields.many2one('res.partner', 'Customer', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, required=True, change_default=True, select=True, track_visibility='always'),
- 'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."),
- 'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."),
+ 'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', domain="[('parent_id','=',partner_id)]", readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."),
+ 'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', domain="[('parent_id','=',partner_id)]", readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."),
'order_policy': fields.selection([
('manual', 'On Demand'),
], 'Create Invoice', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
From 7a9ca47e214d662360e8e5f3a00bb21a10e375d2 Mon Sep 17 00:00:00 2001
From: Mohammed Shekha
Date: Tue, 18 Jun 2013 17:31:54 +0530
Subject: [PATCH 04/53] [FIX]Fixed the issue of save selected fields list in
export.
bzr revid: msh@openerp.com-20130618120154-o0cj17snpn00mh38
---
addons/web/static/src/js/data_export.js | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js
index fb5e391effd..31a750e787e 100644
--- a/addons/web/static/src/js/data_export.js
+++ b/addons/web/static/src/js/data_export.js
@@ -101,6 +101,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
if (select_exp.val()) {
self.exports.unlink([parseInt(select_exp.val(), 10)]);
select_exp.remove();
+ self.$el.find("#fields_list option").remove();
if (self.$el.find('#saved_export_list option').length <= 1) {
self.$el.find('#ExistsExportList').hide();
}
@@ -148,18 +149,17 @@ instance.web.DataExport = instance.web.Dialog.extend({
export_fields: _(fields).map(function (field) {
return [0, 0, {name: field}];
})
- }, function (export_list_id) {
- if (!export_list_id.result) {
+ }).then(function (export_list_id) {
+ if (!export_list_id) {
return;
}
- self.$el.find("#saved_export_list").append(
- new Option(value, export_list_id.result));
- if (self.$el.find("#saved_export_list").is(":hidden")) {
+ if (!self.$el.find("#saved_export_list").length || self.$el.find("#saved_export_list").is(":hidden")) {
self.show_exports_list();
}
+ self.$el.find("#saved_export_list").append(
+ new Option(value, export_list_id));
});
this.on_show_save_list();
- this.$el.find("#fields_list option").remove();
},
on_click: function(id, record) {
var self = this;
From 20a57cc0734e2c56e56b5168624f294e1d912076 Mon Sep 17 00:00:00 2001
From: "Foram Katharotiya (OpenERP)"
Date: Wed, 9 Oct 2013 16:31:08 +0530
Subject: [PATCH 05/53] [FIX] the tracebck when create recurrent event from
Sales > Configuration > Calendar > Events menu.
bzr revid: fka@tinyerp.com-20131009110108-7htob9yoj5hlao75
---
addons/base_calendar/base_calendar_view.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
index 92ffad4be9a..74c60194aba 100644
--- a/addons/base_calendar/base_calendar_view.xml
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -162,7 +162,7 @@
+ attrs="{'required': [('recurrency','==',True)]}"/>
From 88cff57e9576bff0c064611f713168e3a1d6f4a1 Mon Sep 17 00:00:00 2001
From: "Foram Katharotiya (OpenERP)"
Date: Thu, 10 Oct 2013 12:07:40 +0530
Subject: [PATCH 06/53] [IMP] assign 'rel_date' variable in
_set_recurrency_end_date()
bzr revid: fka@tinyerp.com-20131010063740-vngt52ivsu3fc3sh
---
addons/base_calendar/base_calendar.py | 5 ++++-
addons/base_calendar/base_calendar_view.xml | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 5db1662b70c..4433495f791 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -1588,6 +1588,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
def _set_recurrency_end_date(self, data, context=None):
end_date = data.get('end_date')
+ rel_date = False
if data.get('recurrency') and data.get('end_type') in ('count', unicode('count')):
data_date_deadline = datetime.strptime(data.get('date_deadline'), '%Y-%m-%d %H:%M:%S')
if data.get('rrule_type') in ('daily', unicode('count')):
@@ -1598,7 +1599,9 @@ rule or repeating pattern of time to exclude from the recurring rule."),
rel_date = relativedelta(months=data.get('count')+1)
elif data.get('rrule_type') in ('yearly', unicode('yearly')):
rel_date = relativedelta(years=data.get('count')+1)
- end_date = data_date_deadline + rel_date
+ end_date = data_date_deadline
+ if rel_date:
+ end_date += rel_date
return end_date
def create(self, cr, uid, vals, context=None):
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
index 74c60194aba..98bf9edb09c 100644
--- a/addons/base_calendar/base_calendar_view.xml
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -162,7 +162,7 @@
+ attrs="{'readonly': [('recurrency','=',True)]}"/>
From 19a334c1d7db9b9fb6c96d76be8af8236eb3f9aa Mon Sep 17 00:00:00 2001
From: "Chandni Machchhar (OpenERP)"
Date: Mon, 16 Dec 2013 12:53:28 +0530
Subject: [PATCH 07/53] [IMP] [membership] : Membership End Date in demo data.
bzr revid: cac@openerp.com-20131216072328-q6fobmqf9xqpj5ps
---
addons/membership/membership_demo.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/addons/membership/membership_demo.xml b/addons/membership/membership_demo.xml
index 49863bb1f4c..063c9c47dc6 100644
--- a/addons/membership/membership_demo.xml
+++ b/addons/membership/membership_demo.xml
@@ -6,7 +6,7 @@
True
-
+
Golden Membership
180
@@ -16,7 +16,7 @@
True
-
+
Silver Membership
80
@@ -26,7 +26,7 @@
True
-
+
Basic Membership
40
From bc33f2f609a3c530486f4a451a0d90db5add3c1e Mon Sep 17 00:00:00 2001
From: "Chandni Machchhar (OpenERP)"
Date: Mon, 16 Dec 2013 13:09:41 +0530
Subject: [PATCH 08/53] [IMP] [membership] : Membership End Date in demo data.
bzr revid: cac@openerp.com-20131216073941-klkxlxm5adtk2uo9
---
addons/membership/membership_demo.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/membership/membership_demo.xml b/addons/membership/membership_demo.xml
index 063c9c47dc6..8d82f12ffd6 100644
--- a/addons/membership/membership_demo.xml
+++ b/addons/membership/membership_demo.xml
@@ -26,7 +26,7 @@
True
-
+
Basic Membership
40
From 99400fe122a84cd348d7f0dc3ea11579ebbba16d Mon Sep 17 00:00:00 2001
From: "Foram Katharotiya (OpenERP)"
Date: Tue, 31 Dec 2013 15:17:40 +0530
Subject: [PATCH 09/53] [IMP] remove % sign showing when creating a payment
term based on percent
bzr revid: fka@tinyerp.com-20131231094740-eoiszcwmtfw45sab
---
addons/account/account_view.xml | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 16ba8f4a8dd..4fb219df67b 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -1588,7 +1588,6 @@
-
From 004e98349716c4f4419ee35b770685ef365ce132 Mon Sep 17 00:00:00 2001
From: "Amit Dodiya (OpenERP)"
Date: Mon, 10 Feb 2014 18:45:14 +0530
Subject: [PATCH 10/53] [FIX] hr_expense: journal entries should set posted
state if journal has Skip Draft State for Manual Entries is checked
bzr revid: ado@tinyerp.com-20140210131514-480wqb4m34getdp9
---
addons/hr_expense/hr_expense.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 380b5e85696..f2f12b06b23 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -261,6 +261,10 @@ class hr_expense_expense(osv.osv):
#convert eml into an osv-valid format
lines = map(lambda x:(0,0,self.line_get_convert(cr, uid, x, exp.employee_id.address_home_id, exp.date_confirm, context=context)), eml)
+ journal_id = move_obj.browse(cr, uid, move_id, context).journal_id
+ # post the journal entry if 'Skip 'Draft' State for Manual Entries' is checked
+ if journal_id.entry_posted:
+ move_obj.button_validate(cr, uid, [move_id], context)
move_obj.write(cr, uid, [move_id], {'line_id': lines}, context=context)
self.write(cr, uid, ids, {'account_move_id': move_id, 'state': 'done'}, context=context)
return True
From b8235d37865d26b15762d75b11c9cba97addc9b3 Mon Sep 17 00:00:00 2001
From: "Amit Dodiya (OpenERP)"
Date: Tue, 11 Feb 2014 16:21:03 +0530
Subject: [PATCH 11/53] [FIX] invitation wizard: subject on invitation wizard
is not translatable
bzr revid: ado@tinyerp.com-20140211105103-1acfgp8htr1nb1uj
---
addons/mail/wizard/invite.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/mail/wizard/invite.py b/addons/mail/wizard/invite.py
index f5b8896ea86..0079177a27a 100644
--- a/addons/mail/wizard/invite.py
+++ b/addons/mail/wizard/invite.py
@@ -73,7 +73,7 @@ class invite_wizard(osv.osv_memory):
mail_id = mail_mail.create(cr, uid, {
'model': wizard.res_model,
'res_id': wizard.res_id,
- 'subject': 'Invitation to follow %s' % document.name_get()[0][1],
+ 'subject': _('Invitation to follow %s') % document.name_get()[0][1],
'body_html': '%s' % wizard.message,
'auto_delete': True,
}, context=context)
From 244896e718f5dc0d0aafd541597facf87d9b941e Mon Sep 17 00:00:00 2001
From: "alexis.delattre@akretion.com" <>
Date: Wed, 19 Feb 2014 09:10:01 +0100
Subject: [PATCH 12/53] mrp_repair: missing invalidation on fees
lp bug: https://launchpad.net/bugs/1281687 fixed
bzr revid: alexandre.fayolle@camptocamp.com-20140219081001-scgz10wdr9qp0rwp
---
addons/mrp_repair/mrp_repair.py | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py
index 9c0ab0e2c18..fb7fd4ab71b 100644
--- a/addons/mrp_repair/mrp_repair.py
+++ b/addons/mrp_repair/mrp_repair.py
@@ -109,10 +109,12 @@ class mrp_repair(osv.osv):
return res
def _get_lines(self, cr, uid, ids, context=None):
- result = {}
- for line in self.pool.get('mrp.repair.line').browse(cr, uid, ids, context=context):
- result[line.repair_id.id] = True
- return result.keys()
+ return self.pool['mrp.repair'].search(
+ cr, uid, [('operations', 'in', ids)], context=context)
+
+ def _get_fee_lines(self, cr, uid, ids, context=None):
+ return self.pool['mrp.repair'].search(
+ cr, uid, [('fees_lines', 'in', ids)], context=context)
_columns = {
'name': fields.char('Repair Reference',size=24, required=True, states={'confirmed':[('readonly',True)]}),
@@ -163,16 +165,19 @@ class mrp_repair(osv.osv):
store={
'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
+ 'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}),
'amount_tax': fields.function(_amount_tax, string='Taxes',
store={
'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
+ 'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}),
'amount_total': fields.function(_amount_total, string='Total',
store={
'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
+ 'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}),
}
From 62e252c5f36d5614ef2240beb9539fb11fba0d5a Mon Sep 17 00:00:00 2001
From: "alexandre.fayolle@camptocamp.com" <>
Date: Wed, 19 Feb 2014 09:51:41 +0100
Subject: [PATCH 13/53] added unit test for lp:1281687
bzr revid: alexandre.fayolle@camptocamp.com-20140219085141-s5wu6wqhzhbb53tk
---
addons/mrp_repair/__openerp__.py | 3 ++-
.../mrp_repair/test/test_mrp_repair_fee.yml | 23 +++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 addons/mrp_repair/test/test_mrp_repair_fee.yml
diff --git a/addons/mrp_repair/__openerp__.py b/addons/mrp_repair/__openerp__.py
index 26480e975ce..6f324c43f7a 100644
--- a/addons/mrp_repair/__openerp__.py
+++ b/addons/mrp_repair/__openerp__.py
@@ -56,7 +56,8 @@ The following topics should be covered by this module:
'test/test_mrp_repair_b4inv.yml',
'test/test_mrp_repair_afterinv.yml',
'test/test_mrp_repair_cancel.yml',
- 'test/mrp_repair_report.yml'
+ 'test/mrp_repair_report.yml',
+ 'test/test_mrp_repair_fee.yml',
],
'installable': True,
'auto_install': False,
diff --git a/addons/mrp_repair/test/test_mrp_repair_fee.yml b/addons/mrp_repair/test/test_mrp_repair_fee.yml
new file mode 100644
index 00000000000..6aac605d0d9
--- /dev/null
+++ b/addons/mrp_repair/test/test_mrp_repair_fee.yml
@@ -0,0 +1,23 @@
+-
+ Testing total amount update function
+-
+ I check the total amount of mrp_repair_rmrp1 is 100
+-
+ !assert {model: mrp.repair, id: mrp_repair_rmrp1, string=amount_total should be 100}:
+ - amount_total == 100
+-
+ I add a new fee line
+-
+ !record {model: mrp.repair, id: mrp_repair_rmrp1}:
+ fees_lines:
+ - name: 'Assembly Service Cost'
+ product_id: product.product_assembly
+ product_uom_qty: 1.0
+ product_uom: product.product_uom_hour
+ price_unit: 12.0
+ to_invoice: True
+-
+ I check the total amount of mrp_repair_rmrp1 is now 112
+-
+ !assert {model: mrp.repair, id: mrp_repair_rmrp1, string=amount_total should be 112}:
+ - amount_total == 112
From 5d2e59e5e4a6e25a992a2b4244e9cfa1619a0abb Mon Sep 17 00:00:00 2001
From: Rifakat
Date: Tue, 4 Mar 2014 17:01:17 +0530
Subject: [PATCH 14/53] [FIX] hr_payroll_account: used float_compare() instead
of direct comparing between two floats to avoid python rounding
bzr revid: rha@tinyerp.com-20140304113117-smy5gb9e92lcuji8
---
addons/hr_payroll_account/hr_payroll_account.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py
index 43f984fadd2..9e892682e96 100644
--- a/addons/hr_payroll_account/hr_payroll_account.py
+++ b/addons/hr_payroll_account/hr_payroll_account.py
@@ -24,7 +24,7 @@ from openerp import netsvc
from datetime import date, datetime, timedelta
from openerp.osv import fields, osv
-from openerp.tools import config
+from openerp.tools import config, float_compare
from openerp.tools.translate import _
class hr_payslip(osv.osv):
@@ -87,6 +87,7 @@ class hr_payslip(osv.osv):
def process_sheet(self, cr, uid, ids, context=None):
move_pool = self.pool.get('account.move')
period_pool = self.pool.get('account.period')
+ precision = self.pool.get('decimal.precision').precision_get(cr, uid, 'Payroll')
timenow = time.strftime('%Y-%m-%d')
for slip in self.browse(cr, uid, ids, context=context):
@@ -151,7 +152,7 @@ class hr_payslip(osv.osv):
line_ids.append(credit_line)
credit_sum += credit_line[2]['credit'] - credit_line[2]['debit']
- if debit_sum > credit_sum:
+ if float_compare(credit_sum, debit_sum, precision_digits=precision) == -1:
acc_id = slip.journal_id.default_credit_account_id.id
if not acc_id:
raise osv.except_osv(_('Configuration Error!'),_('The Expense Journal "%s" has not properly configured the Credit Account!')%(slip.journal_id.name))
@@ -167,7 +168,7 @@ class hr_payslip(osv.osv):
})
line_ids.append(adjust_credit)
- elif debit_sum < credit_sum:
+ elif float_compare(debit_sum, credit_sum, precision_digits=precision) == -1:
acc_id = slip.journal_id.default_debit_account_id.id
if not acc_id:
raise osv.except_osv(_('Configuration Error!'),_('The Expense Journal "%s" has not properly configured the Debit Account!')%(slip.journal_id.name))
From 5db57a21a25e2c621326d365effc69da8ea0573f Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Tue, 4 Mar 2014 12:34:07 +0100
Subject: [PATCH 15/53] [FIX]stock: in fill inventory wizard, set
raise-exception to False in context to avoid having error saying that the
product uom category is different: this button is just a tool to help filling
the inventory. Anyway, If it should pop the error, it should be on the
validation, not in the button to auto-fill the inventory.
bzr revid: dle@openerp.com-20140304113407-b2kku1xolvkceqcg
---
addons/base_import/models.py | 3 +++
addons/stock/wizard/stock_fill_inventory.py | 7 ++++---
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/addons/base_import/models.py b/addons/base_import/models.py
index 996dbf7964d..1c03a641ca7 100644
--- a/addons/base_import/models.py
+++ b/addons/base_import/models.py
@@ -114,6 +114,9 @@ class ir_import(orm.TransientModel):
elif field['type'] == 'one2many' and depth:
f['fields'] = self.get_fields(
cr, uid, field['relation'], context=context, depth=depth-1)
+ f['fields'].append(dict(fields=[], required=False, id='id', name='.id', string=_("Database ID")))
+ import pudb
+ pudb.set_trace()
fields.append(f)
diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py
index 7f55adbab4c..0dc6b3739f5 100644
--- a/addons/stock/wizard/stock_fill_inventory.py
+++ b/addons/stock/wizard/stock_fill_inventory.py
@@ -104,15 +104,16 @@ class stock_fill_inventory(osv.osv_memory):
datas = {}
res[location] = {}
move_ids = move_obj.search(cr, uid, ['|',('location_dest_id','=',location),('location_id','=',location),('state','=','done')], context=context)
-
+ local_context = dict(context)
+ local_context['raise-exception'] = False
for move in move_obj.browse(cr, uid, move_ids, context=context):
lot_id = move.prodlot_id.id
prod_id = move.product_id.id
if move.location_dest_id.id != move.location_id.id:
if move.location_dest_id.id == location:
- qty = uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
+ qty = uom_obj._compute_qty_obj(cr, uid, move.product_uom,move.product_qty, move.product_id.uom_id, context=local_context)
else:
- qty = -uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
+ qty = -uom_obj._compute_qty_obj(cr, uid, move.product_uom,move.product_qty, move.product_id.uom_id, context=local_context)
if datas.get((prod_id, lot_id)):
From 179de3702c7092af731b27dc2ba9cd1bfcd4b940 Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Tue, 4 Mar 2014 12:54:13 +0100
Subject: [PATCH 16/53] [REVERT] partial revert
dle@openerp.com-20140304113407-b2kku1xolvkceqcg, distraction error, left pudb
bzr revid: dle@openerp.com-20140304115413-tjwpni7ssqpl7yis
---
addons/base_import/models.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/addons/base_import/models.py b/addons/base_import/models.py
index 1c03a641ca7..996dbf7964d 100644
--- a/addons/base_import/models.py
+++ b/addons/base_import/models.py
@@ -114,9 +114,6 @@ class ir_import(orm.TransientModel):
elif field['type'] == 'one2many' and depth:
f['fields'] = self.get_fields(
cr, uid, field['relation'], context=context, depth=depth-1)
- f['fields'].append(dict(fields=[], required=False, id='id', name='.id', string=_("Database ID")))
- import pudb
- pudb.set_trace()
fields.append(f)
From 7bb95a44689ed58e187772f0daf4e52d06dd8684 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Tue, 4 Mar 2014 13:55:28 +0100
Subject: [PATCH 17/53] Update undescore.js to version 1.6 and
underscore.string.js to version 2.3
bzr revid: mat@openerp.com-20140304125528-97w5kbv3ry028kn9
---
.../static/lib/underscore/underscore-min.js | 37 +-
.../web/static/lib/underscore/underscore.js | 1049 +++++++++++------
.../lib/underscore/underscore.string.js | 582 +++++----
.../lib/underscore/underscore.string.min.js | 15 +-
4 files changed, 1061 insertions(+), 622 deletions(-)
diff --git a/addons/web/static/lib/underscore/underscore-min.js b/addons/web/static/lib/underscore/underscore-min.js
index 5b55f32beac..3434d6c5902 100644
--- a/addons/web/static/lib/underscore/underscore-min.js
+++ b/addons/web/static/lib/underscore/underscore-min.js
@@ -1,31 +1,6 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
-h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
-b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a==
-null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
-function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
-e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
-c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};
-b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
-b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
-b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e /g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a),
-function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
-u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
-function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
-true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
+// Underscore.js 1.6.0
+// http://underscorejs.org
+// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this);
+//# sourceMappingURL=underscore-min.map
\ No newline at end of file
diff --git a/addons/web/static/lib/underscore/underscore.js b/addons/web/static/lib/underscore/underscore.js
index 208d4cd890c..ca61fdc3a4b 100644
--- a/addons/web/static/lib/underscore/underscore.js
+++ b/addons/web/static/lib/underscore/underscore.js
@@ -1,17 +1,14 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
+// Underscore.js 1.6.0
+// http://underscorejs.org
+// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
(function() {
// Baseline setup
// --------------
- // Establish the root object, `window` in the browser, or `global` on the server.
+ // Establish the root object, `window` in the browser, or `exports` on the server.
var root = this;
// Save the previous value of the `_` variable.
@@ -24,10 +21,12 @@
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
- var slice = ArrayProto.slice,
- unshift = ArrayProto.unshift,
- toString = ObjProto.toString,
- hasOwnProperty = ObjProto.hasOwnProperty;
+ var
+ push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ concat = ArrayProto.concat,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
@@ -46,7 +45,11 @@
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
- var _ = function(obj) { return new wrapper(obj); };
+ var _ = function(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+ };
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
@@ -58,11 +61,11 @@
}
exports._ = _;
} else {
- root['_'] = _;
+ root._ = _;
}
// Current version.
- _.VERSION = '1.3.1';
+ _.VERSION = '1.6.0';
// Collection Functions
// --------------------
@@ -71,20 +74,20 @@
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
- if (obj == null) return;
+ if (obj == null) return obj;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
- for (var i = 0, l = obj.length; i < l; i++) {
- if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
+ for (var i = 0, length = obj.length; i < length; i++) {
+ if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
- for (var key in obj) {
- if (_.has(obj, key)) {
- if (iterator.call(context, obj[key], key, obj) === breaker) return;
- }
+ var keys = _.keys(obj);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
}
}
+ return obj;
};
// Return the results of applying the iterator to each element.
@@ -94,12 +97,13 @@
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
- results[results.length] = iterator.call(context, value, index, list);
+ results.push(iterator.call(context, value, index, list));
});
- if (obj.length === +obj.length) results.length = obj.length;
return results;
};
+ var reduceError = 'Reduce of empty array with no initial value';
+
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
@@ -117,7 +121,7 @@
memo = iterator.call(context, memo, value, index, list);
}
});
- if (!initial) throw new TypeError('Reduce of empty array with no initial value');
+ if (!initial) throw new TypeError(reduceError);
return memo;
};
@@ -130,16 +134,29 @@
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
- var reversed = _.toArray(obj).reverse();
- if (context && !initial) iterator = _.bind(iterator, context);
- return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
+ var length = obj.length;
+ if (length !== +length) {
+ var keys = _.keys(obj);
+ length = keys.length;
+ }
+ each(obj, function(value, index, list) {
+ index = keys ? keys[--length] : --length;
+ if (!initial) {
+ memo = obj[index];
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, obj[index], index, list);
+ }
+ });
+ if (!initial) throw new TypeError(reduceError);
+ return memo;
};
// Return the first value which passes a truth test. Aliased as `detect`.
- _.find = _.detect = function(obj, iterator, context) {
+ _.find = _.detect = function(obj, predicate, context) {
var result;
any(obj, function(value, index, list) {
- if (iterator.call(context, value, index, list)) {
+ if (predicate.call(context, value, index, list)) {
result = value;
return true;
}
@@ -150,179 +167,246 @@
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
- _.filter = _.select = function(obj, iterator, context) {
+ _.filter = _.select = function(obj, predicate, context) {
var results = [];
if (obj == null) return results;
- if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+ if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
each(obj, function(value, index, list) {
- if (iterator.call(context, value, index, list)) results[results.length] = value;
+ if (predicate.call(context, value, index, list)) results.push(value);
});
return results;
};
// Return all the elements for which a truth test fails.
- _.reject = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- each(obj, function(value, index, list) {
- if (!iterator.call(context, value, index, list)) results[results.length] = value;
- });
- return results;
+ _.reject = function(obj, predicate, context) {
+ return _.filter(obj, function(value, index, list) {
+ return !predicate.call(context, value, index, list);
+ }, context);
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
- _.every = _.all = function(obj, iterator, context) {
+ _.every = _.all = function(obj, predicate, context) {
+ predicate || (predicate = _.identity);
var result = true;
if (obj == null) return result;
- if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+ if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
each(obj, function(value, index, list) {
- if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+ if (!(result = result && predicate.call(context, value, index, list))) return breaker;
});
- return result;
+ return !!result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
- var any = _.some = _.any = function(obj, iterator, context) {
- iterator || (iterator = _.identity);
+ var any = _.some = _.any = function(obj, predicate, context) {
+ predicate || (predicate = _.identity);
var result = false;
if (obj == null) return result;
- if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+ if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
each(obj, function(value, index, list) {
- if (result || (result = iterator.call(context, value, index, list))) return breaker;
+ if (result || (result = predicate.call(context, value, index, list))) return breaker;
});
return !!result;
};
- // Determine if a given value is included in the array or object using `===`.
- // Aliased as `contains`.
- _.include = _.contains = function(obj, target) {
- var found = false;
- if (obj == null) return found;
+ // Determine if the array or object contains a given value (using `===`).
+ // Aliased as `include`.
+ _.contains = _.include = function(obj, target) {
+ if (obj == null) return false;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
- found = any(obj, function(value) {
+ return any(obj, function(value) {
return value === target;
});
- return found;
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
+ var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
- return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
+ return (isFunc ? method : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
- return _.map(obj, function(value){ return value[key]; });
+ return _.map(obj, _.property(key));
+ };
+
+ // Convenience version of a common use case of `filter`: selecting only objects
+ // containing specific `key:value` pairs.
+ _.where = function(obj, attrs) {
+ return _.filter(obj, _.matches(attrs));
+ };
+
+ // Convenience version of a common use case of `find`: getting the first object
+ // containing specific `key:value` pairs.
+ _.findWhere = function(obj, attrs) {
+ return _.find(obj, _.matches(attrs));
};
// Return the maximum element or (element-based computation).
+ // Can't optimize arrays of integers longer than 65,535 elements.
+ // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
_.max = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
- if (!iterator && _.isEmpty(obj)) return -Infinity;
- var result = {computed : -Infinity};
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.max.apply(Math, obj);
+ }
+ var result = -Infinity, lastComputed = -Infinity;
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
- computed >= result.computed && (result = {value : value, computed : computed});
- });
- return result.value;
- };
-
- // Return the minimum element (or element-based computation).
- _.min = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
- if (!iterator && _.isEmpty(obj)) return Infinity;
- var result = {computed : Infinity};
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- computed < result.computed && (result = {value : value, computed : computed});
- });
- return result.value;
- };
-
- // Shuffle an array.
- _.shuffle = function(obj) {
- var shuffled = [], rand;
- each(obj, function(value, index, list) {
- if (index == 0) {
- shuffled[0] = value;
- } else {
- rand = Math.floor(Math.random() * (index + 1));
- shuffled[index] = shuffled[rand];
- shuffled[rand] = value;
+ if (computed > lastComputed) {
+ result = value;
+ lastComputed = computed;
}
});
- return shuffled;
- };
-
- // Sort the object's values by a criterion produced by an iterator.
- _.sortBy = function(obj, iterator, context) {
- return _.pluck(_.map(obj, function(value, index, list) {
- return {
- value : value,
- criteria : iterator.call(context, value, index, list)
- };
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }), 'value');
- };
-
- // Groups the object's values by a criterion. Pass either a string attribute
- // to group by, or a function that returns the criterion.
- _.groupBy = function(obj, val) {
- var result = {};
- var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
- each(obj, function(value, index) {
- var key = iterator(value, index);
- (result[key] || (result[key] = [])).push(value);
- });
return result;
};
- // Use a comparator function to figure out at what index an object should
- // be inserted so as to maintain order. Uses binary search.
- _.sortedIndex = function(array, obj, iterator) {
- iterator || (iterator = _.identity);
+ // Return the minimum element (or element-based computation).
+ _.min = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.min.apply(Math, obj);
+ }
+ var result = Infinity, lastComputed = Infinity;
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ if (computed < lastComputed) {
+ result = value;
+ lastComputed = computed;
+ }
+ });
+ return result;
+ };
+
+ // Shuffle an array, using the modern version of the
+ // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+ _.shuffle = function(obj) {
+ var rand;
+ var index = 0;
+ var shuffled = [];
+ each(obj, function(value) {
+ rand = _.random(index++);
+ shuffled[index - 1] = shuffled[rand];
+ shuffled[rand] = value;
+ });
+ return shuffled;
+ };
+
+ // Sample **n** random values from a collection.
+ // If **n** is not specified, returns a single random element.
+ // The internal `guard` argument allows it to work with `map`.
+ _.sample = function(obj, n, guard) {
+ if (n == null || guard) {
+ if (obj.length !== +obj.length) obj = _.values(obj);
+ return obj[_.random(obj.length - 1)];
+ }
+ return _.shuffle(obj).slice(0, Math.max(0, n));
+ };
+
+ // An internal function to generate lookup iterators.
+ var lookupIterator = function(value) {
+ if (value == null) return _.identity;
+ if (_.isFunction(value)) return value;
+ return _.property(value);
+ };
+
+ // Sort the object's values by a criterion produced by an iterator.
+ _.sortBy = function(obj, iterator, context) {
+ iterator = lookupIterator(iterator);
+ return _.pluck(_.map(obj, function(value, index, list) {
+ return {
+ value: value,
+ index: index,
+ criteria: iterator.call(context, value, index, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+ };
+
+ // An internal function used for aggregate "group by" operations.
+ var group = function(behavior) {
+ return function(obj, iterator, context) {
+ var result = {};
+ iterator = lookupIterator(iterator);
+ each(obj, function(value, index) {
+ var key = iterator.call(context, value, index, obj);
+ behavior(result, key, value);
+ });
+ return result;
+ };
+ };
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ _.groupBy = group(function(result, key, value) {
+ _.has(result, key) ? result[key].push(value) : result[key] = [value];
+ });
+
+ // Indexes the object's values by a criterion, similar to `groupBy`, but for
+ // when you know that your index values will be unique.
+ _.indexBy = group(function(result, key, value) {
+ result[key] = value;
+ });
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ _.countBy = group(function(result, key) {
+ _.has(result, key) ? result[key]++ : result[key] = 1;
+ });
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = function(array, obj, iterator, context) {
+ iterator = lookupIterator(iterator);
+ var value = iterator.call(context, obj);
var low = 0, high = array.length;
while (low < high) {
- var mid = (low + high) >> 1;
- iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
+ var mid = (low + high) >>> 1;
+ iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
}
return low;
};
- // Safely convert anything iterable into a real, live array.
- _.toArray = function(iterable) {
- if (!iterable) return [];
- if (iterable.toArray) return iterable.toArray();
- if (_.isArray(iterable)) return slice.call(iterable);
- if (_.isArguments(iterable)) return slice.call(iterable);
- return _.values(iterable);
+ // Safely create a real, live array from anything iterable.
+ _.toArray = function(obj) {
+ if (!obj) return [];
+ if (_.isArray(obj)) return slice.call(obj);
+ if (obj.length === +obj.length) return _.map(obj, _.identity);
+ return _.values(obj);
};
// Return the number of elements in an object.
_.size = function(obj) {
- return _.toArray(obj).length;
+ if (obj == null) return 0;
+ return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
- // values in the array. Aliased as `head`. The **guard** check allows it to work
- // with `_.map`.
- _.first = _.head = function(array, n, guard) {
- return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+ // values in the array. Aliased as `head` and `take`. The **guard** check
+ // allows it to work with `_.map`.
+ _.first = _.head = _.take = function(array, n, guard) {
+ if (array == null) return void 0;
+ if ((n == null) || guard) return array[0];
+ if (n < 0) return [];
+ return slice.call(array, 0, n);
};
- // Returns everything but the last entry of the array. Especcialy useful on
+ // Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
@@ -333,33 +417,42 @@
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
- if ((n != null) && !guard) {
- return slice.call(array, Math.max(array.length - n, 0));
- } else {
- return array[array.length - 1];
- }
+ if (array == null) return void 0;
+ if ((n == null) || guard) return array[array.length - 1];
+ return slice.call(array, Math.max(array.length - n, 0));
};
- // Returns everything but the first entry of the array. Aliased as `tail`.
- // Especially useful on the arguments object. Passing an **index** will return
- // the rest of the values in the array from that index onward. The **guard**
+ // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+ // Especially useful on the arguments object. Passing an **n** will return
+ // the rest N values in the array. The **guard**
// check allows it to work with `_.map`.
- _.rest = _.tail = function(array, index, guard) {
- return slice.call(array, (index == null) || guard ? 1 : index);
+ _.rest = _.tail = _.drop = function(array, n, guard) {
+ return slice.call(array, (n == null) || guard ? 1 : n);
};
// Trim out all falsy values from an array.
_.compact = function(array) {
- return _.filter(array, function(value){ return !!value; });
+ return _.filter(array, _.identity);
};
- // Return a completely flattened version of an array.
+ // Internal implementation of a recursive `flatten` function.
+ var flatten = function(input, shallow, output) {
+ if (shallow && _.every(input, _.isArray)) {
+ return concat.apply(output, input);
+ }
+ each(input, function(value) {
+ if (_.isArray(value) || _.isArguments(value)) {
+ shallow ? push.apply(output, value) : flatten(value, shallow, output);
+ } else {
+ output.push(value);
+ }
+ });
+ return output;
+ };
+
+ // Flatten out an array, either recursively (by default), or just one level.
_.flatten = function(array, shallow) {
- return _.reduce(array, function(memo, value) {
- if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
- memo[memo.length] = value;
- return memo;
- }, []);
+ return flatten(array, shallow, []);
};
// Return a version of the array that does not contain the specified value(s).
@@ -367,20 +460,36 @@
return _.difference(array, slice.call(arguments, 1));
};
+ // Split an array into two arrays: one whose elements all satisfy the given
+ // predicate, and one whose elements all do not satisfy the predicate.
+ _.partition = function(array, predicate, context) {
+ predicate = lookupIterator(predicate);
+ var pass = [], fail = [];
+ each(array, function(elem) {
+ (predicate.call(context, elem) ? pass : fail).push(elem);
+ });
+ return [pass, fail];
+ };
+
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
- _.uniq = _.unique = function(array, isSorted, iterator) {
- var initial = iterator ? _.map(array, iterator) : array;
- var result = [];
- _.reduce(initial, function(memo, el, i) {
- if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
- memo[memo.length] = el;
- result[result.length] = array[i];
+ _.uniq = _.unique = function(array, isSorted, iterator, context) {
+ if (_.isFunction(isSorted)) {
+ context = iterator;
+ iterator = isSorted;
+ isSorted = false;
+ }
+ var initial = iterator ? _.map(array, iterator, context) : array;
+ var results = [];
+ var seen = [];
+ each(initial, function(value, index) {
+ if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
+ seen.push(value);
+ results.push(array[index]);
}
- return memo;
- }, []);
- return result;
+ });
+ return results;
};
// Produce an array that contains the union: each distinct element from all of
@@ -390,12 +499,12 @@
};
// Produce an array that contains every item shared between all the
- // passed-in arrays. (Aliased as "intersect" for back-compat.)
- _.intersection = _.intersect = function(array) {
+ // passed-in arrays.
+ _.intersection = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
- return _.indexOf(other, item) >= 0;
+ return _.contains(other, item);
});
});
};
@@ -403,20 +512,37 @@
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
- var rest = _.flatten(slice.call(arguments, 1));
- return _.filter(array, function(value){ return !_.include(rest, value); });
+ var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
+ return _.filter(array, function(value){ return !_.contains(rest, value); });
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
- var args = slice.call(arguments);
- var length = _.max(_.pluck(args, 'length'));
+ var length = _.max(_.pluck(arguments, 'length').concat(0));
var results = new Array(length);
- for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
+ for (var i = 0; i < length; i++) {
+ results[i] = _.pluck(arguments, '' + i);
+ }
return results;
};
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values.
+ _.object = function(list, values) {
+ if (list == null) return {};
+ var result = {};
+ for (var i = 0, length = list.length; i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ };
+
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
@@ -425,22 +551,29 @@
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
- var i, l;
+ var i = 0, length = array.length;
if (isSorted) {
- i = _.sortedIndex(array, item);
- return array[i] === item ? i : -1;
+ if (typeof isSorted == 'number') {
+ i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
+ } else {
+ i = _.sortedIndex(array, item);
+ return array[i] === item ? i : -1;
+ }
}
- if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
- for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
+ for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
- _.lastIndexOf = function(array, item) {
+ _.lastIndexOf = function(array, item, from) {
if (array == null) return -1;
- if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
- var i = array.length;
- while (i--) if (i in array && array[i] === item) return i;
+ var hasIndex = from != null;
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
+ return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+ }
+ var i = (hasIndex ? from : array.length);
+ while (i--) if (array[i] === item) return i;
return -1;
};
@@ -454,11 +587,11 @@
}
step = arguments[2] || 1;
- var len = Math.max(Math.ceil((stop - start) / step), 0);
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
- var range = new Array(len);
+ var range = new Array(length);
- while(idx < len) {
+ while(idx < length) {
range[idx++] = start;
start += step;
}
@@ -473,29 +606,46 @@
var ctor = function(){};
// Create a function bound to a given object (assigning `this`, and arguments,
- // optionally). Binding with arguments is also known as `curry`.
- // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
- // We check for `func.bind` first, to fail fast when `func` is undefined.
- _.bind = function bind(func, context) {
- var bound, args;
- if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+ // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
+ // available.
+ _.bind = function(func, context) {
+ var args, bound;
+ if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError;
args = slice.call(arguments, 2);
return bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
ctor.prototype = func.prototype;
var self = new ctor;
+ ctor.prototype = null;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (Object(result) === result) return result;
return self;
};
};
- // Bind all of an object's methods to that object. Useful for ensuring that
- // all callbacks defined on an object belong to it.
+ // Partially apply a function by creating a version that has had some of its
+ // arguments pre-filled, without changing its dynamic `this` context. _ acts
+ // as a placeholder, allowing any combination of arguments to be pre-filled.
+ _.partial = function(func) {
+ var boundArgs = slice.call(arguments, 1);
+ return function() {
+ var position = 0;
+ var args = boundArgs.slice();
+ for (var i = 0, length = args.length; i < length; i++) {
+ if (args[i] === _) args[i] = arguments[position++];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return func.apply(this, args);
+ };
+ };
+
+ // Bind a number of an object's methods to that object. Remaining arguments
+ // are the method names to be bound. Useful for ensuring that all callbacks
+ // defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
- if (funcs.length == 0) funcs = _.functions(obj);
+ if (funcs.length === 0) throw new Error('bindAll must be passed function names');
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
@@ -514,7 +664,7 @@
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
- return setTimeout(function(){ return func.apply(func, args); }, wait);
+ return setTimeout(function(){ return func.apply(null, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
@@ -524,41 +674,74 @@
};
// Returns a function, that, when invoked, will only be triggered at most once
- // during a given window of time.
- _.throttle = function(func, wait) {
- var context, args, timeout, throttling, more;
- var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
+ // during a given window of time. Normally, the throttled function will run
+ // as much as it can, without ever going more than once per `wait` duration;
+ // but if you'd like to disable the execution on the leading edge, pass
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
+ _.throttle = function(func, wait, options) {
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ options || (options = {});
+ var later = function() {
+ previous = options.leading === false ? 0 : _.now();
+ timeout = null;
+ result = func.apply(context, args);
+ context = args = null;
+ };
return function() {
- context = this; args = arguments;
- var later = function() {
+ var now = _.now();
+ if (!previous && options.leading === false) previous = now;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
timeout = null;
- if (more) func.apply(context, args);
- whenDone();
- };
- if (!timeout) timeout = setTimeout(later, wait);
- if (throttling) {
- more = true;
- } else {
- func.apply(context, args);
+ previous = now;
+ result = func.apply(context, args);
+ context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
}
- whenDone();
- throttling = true;
+ return result;
};
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
- // N milliseconds.
- _.debounce = function(func, wait) {
- var timeout;
- return function() {
- var context = this, args = arguments;
- var later = function() {
+ // N milliseconds. If `immediate` is passed, trigger the function on the
+ // leading edge, instead of the trailing.
+ _.debounce = function(func, wait, immediate) {
+ var timeout, args, context, timestamp, result;
+
+ var later = function() {
+ var last = _.now() - timestamp;
+ if (last < wait) {
+ timeout = setTimeout(later, wait - last);
+ } else {
timeout = null;
- func.apply(context, args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
+ if (!immediate) {
+ result = func.apply(context, args);
+ context = args = null;
+ }
+ }
+ };
+
+ return function() {
+ context = this;
+ args = arguments;
+ timestamp = _.now();
+ var callNow = immediate && !timeout;
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ }
+ if (callNow) {
+ result = func.apply(context, args);
+ context = args = null;
+ }
+
+ return result;
};
};
@@ -569,7 +752,9 @@
return function() {
if (ran) return memo;
ran = true;
- return memo = func.apply(this, arguments);
+ memo = func.apply(this, arguments);
+ func = null;
+ return memo;
};
};
@@ -577,10 +762,7 @@
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
- return function() {
- var args = [func].concat(slice.call(arguments, 0));
- return wrapper.apply(this, args);
- };
+ return _.partial(wrapper, func);
};
// Returns a function that is the composition of a list of functions, each
@@ -598,9 +780,10 @@
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
- if (times <= 0) return func();
return function() {
- if (--times < 1) { return func.apply(this, arguments); }
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
};
};
@@ -609,16 +792,44 @@
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
- _.keys = nativeKeys || function(obj) {
- if (obj !== Object(obj)) throw new TypeError('Invalid object');
+ _.keys = function(obj) {
+ if (!_.isObject(obj)) return [];
+ if (nativeKeys) return nativeKeys(obj);
var keys = [];
- for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
+ for (var key in obj) if (_.has(obj, key)) keys.push(key);
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
- return _.map(obj, _.identity);
+ var keys = _.keys(obj);
+ var length = keys.length;
+ var values = new Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[keys[i]];
+ }
+ return values;
+ };
+
+ // Convert an object into a list of `[key, value]` pairs.
+ _.pairs = function(obj) {
+ var keys = _.keys(obj);
+ var length = keys.length;
+ var pairs = new Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [keys[i], obj[keys[i]]];
+ }
+ return pairs;
+ };
+
+ // Invert the keys and values of an object. The values must be serializable.
+ _.invert = function(obj) {
+ var result = {};
+ var keys = _.keys(obj);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ result[obj[keys[i]]] = keys[i];
+ }
+ return result;
};
// Return a sorted list of the function names available on the object.
@@ -634,18 +845,42 @@
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
- for (var prop in source) {
- obj[prop] = source[prop];
+ if (source) {
+ for (var prop in source) {
+ obj[prop] = source[prop];
+ }
}
});
return obj;
};
+ // Return a copy of the object only containing the whitelisted properties.
+ _.pick = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ each(keys, function(key) {
+ if (key in obj) copy[key] = obj[key];
+ });
+ return copy;
+ };
+
+ // Return a copy of the object without the blacklisted properties.
+ _.omit = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ for (var key in obj) {
+ if (!_.contains(keys, key)) copy[key] = obj[key];
+ }
+ return copy;
+ };
+
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
- for (var prop in source) {
- if (obj[prop] == null) obj[prop] = source[prop];
+ if (source) {
+ for (var prop in source) {
+ if (obj[prop] === void 0) obj[prop] = source[prop];
+ }
}
});
return obj;
@@ -665,19 +900,16 @@
return obj;
};
- // Internal recursive comparison function.
- function eq(a, b, stack) {
+ // Internal recursive comparison function for `isEqual`.
+ var eq = function(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
- // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
+ // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
if (a === b) return a !== 0 || 1 / a == 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
- if (a._chain) a = a._wrapped;
- if (b._chain) b = b._wrapped;
- // Invoke a custom `isEqual` method if one is provided.
- if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
- if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className != toString.call(b)) return false;
@@ -707,14 +939,23 @@
if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
- var length = stack.length;
+ var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
- if (stack[length] == a) return true;
+ if (aStack[length] == a) return bStack[length] == b;
+ }
+ // Objects with different constructors are not equivalent, but `Object`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
+ _.isFunction(bCtor) && (bCtor instanceof bCtor))
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
}
// Add the first object to the stack of traversed objects.
- stack.push(a);
+ aStack.push(a);
+ bStack.push(b);
var size = 0, result = true;
// Recursively compare objects and arrays.
if (className == '[object Array]') {
@@ -724,20 +965,17 @@
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
- // Ensure commutative equality for sparse arrays.
- if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
+ if (!(result = eq(a[size], b[size], aStack, bStack))) break;
}
}
} else {
- // Objects with different constructors are not equivalent.
- if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
// Deep compare objects.
for (var key in a) {
if (_.has(a, key)) {
// Count the expected number of properties.
size++;
// Deep compare each member.
- if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
+ if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
}
}
// Ensure that both objects contain the same number of properties.
@@ -749,18 +987,20 @@
}
}
// Remove the first object from the stack of traversed objects.
- stack.pop();
+ aStack.pop();
+ bStack.pop();
return result;
- }
+ };
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
- return eq(a, b, []);
+ return eq(a, b, [], []);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
+ if (obj == null) return true;
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
@@ -768,7 +1008,7 @@
// Is a given value a DOM element?
_.isElement = function(obj) {
- return !!(obj && obj.nodeType == 1);
+ return !!(obj && obj.nodeType === 1);
};
// Is a given value an array?
@@ -782,35 +1022,36 @@
return obj === Object(obj);
};
- // Is a given variable an arguments object?
- _.isArguments = function(obj) {
- return toString.call(obj) == '[object Arguments]';
- };
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
+ each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+ _['is' + name] = function(obj) {
+ return toString.call(obj) == '[object ' + name + ']';
+ };
+ });
+
+ // Define a fallback version of the method in browsers (ahem, IE), where
+ // there isn't any inspectable "Arguments" type.
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return !!(obj && _.has(obj, 'callee'));
};
}
- // Is a given value a function?
- _.isFunction = function(obj) {
- return toString.call(obj) == '[object Function]';
+ // Optimize `isFunction` if appropriate.
+ if (typeof (/./) !== 'function') {
+ _.isFunction = function(obj) {
+ return typeof obj === 'function';
+ };
+ }
+
+ // Is a given object a finite number?
+ _.isFinite = function(obj) {
+ return isFinite(obj) && !isNaN(parseFloat(obj));
};
- // Is a given value a string?
- _.isString = function(obj) {
- return toString.call(obj) == '[object String]';
- };
-
- // Is a given value a number?
- _.isNumber = function(obj) {
- return toString.call(obj) == '[object Number]';
- };
-
- // Is the given value `NaN`?
+ // Is the given value `NaN`? (NaN is the only number which does not equal itself).
_.isNaN = function(obj) {
- // `NaN` is the only value for which `===` is not reflexive.
- return obj !== obj;
+ return _.isNumber(obj) && obj != +obj;
};
// Is a given value a boolean?
@@ -818,16 +1059,6 @@
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};
- // Is a given value a date?
- _.isDate = function(obj) {
- return toString.call(obj) == '[object Date]';
- };
-
- // Is the given value a regular expression?
- _.isRegExp = function(obj) {
- return toString.call(obj) == '[object RegExp]';
- };
-
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
@@ -838,7 +1069,8 @@
return obj === void 0;
};
- // Has own property?
+ // Shortcut function for checking if an object has a given property directly
+ // on itself (in other words, not on a prototype).
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
@@ -858,21 +1090,94 @@
return value;
};
+ _.constant = function(value) {
+ return function () {
+ return value;
+ };
+ };
+
+ _.property = function(key) {
+ return function(obj) {
+ return obj[key];
+ };
+ };
+
+ // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
+ _.matches = function(attrs) {
+ return function(obj) {
+ if (obj === attrs) return true; //avoid comparing an object to itself.
+ for (var key in attrs) {
+ if (attrs[key] !== obj[key])
+ return false;
+ }
+ return true;
+ }
+ };
+
// Run a function **n** times.
- _.times = function (n, iterator, context) {
- for (var i = 0; i < n; i++) iterator.call(context, i);
+ _.times = function(n, iterator, context) {
+ var accum = Array(Math.max(0, n));
+ for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+ return accum;
};
- // Escape a string for HTML interpolation.
- _.escape = function(string) {
- return (''+string).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/');
+ // Return a random integer between min and max (inclusive).
+ _.random = function(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
};
- // Add your own custom functions to the Underscore object, ensuring that
- // they're correctly added to the OOP wrapper as well.
+ // A (possibly faster) way to get the current timestamp as an integer.
+ _.now = Date.now || function() { return new Date().getTime(); };
+
+ // List of HTML entities for escaping.
+ var entityMap = {
+ escape: {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+ }
+ };
+ entityMap.unescape = _.invert(entityMap.escape);
+
+ // Regexes containing the keys and values listed immediately above.
+ var entityRegexes = {
+ escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
+ unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+ };
+
+ // Functions for escaping and unescaping strings to/from HTML interpolation.
+ _.each(['escape', 'unescape'], function(method) {
+ _[method] = function(string) {
+ if (string == null) return '';
+ return ('' + string).replace(entityRegexes[method], function(match) {
+ return entityMap[method][match];
+ });
+ };
+ });
+
+ // If the value of the named `property` is a function then invoke it with the
+ // `object` as context; otherwise, return it.
+ _.result = function(object, property) {
+ if (object == null) return void 0;
+ var value = object[property];
+ return _.isFunction(value) ? value.call(object) : value;
+ };
+
+ // Add your own custom functions to the Underscore object.
_.mixin = function(obj) {
- each(_.functions(obj), function(name){
- addToWrapper(name, _[name] = obj[name]);
+ each(_.functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return result.call(this, func.apply(_, args));
+ };
});
};
@@ -880,7 +1185,7 @@
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
- var id = idCounter++;
+ var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
@@ -895,41 +1200,80 @@
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
- var noMatch = /.^/;
+ var noMatch = /(.)^/;
- // Within an interpolation, evaluation, or escaping, remove HTML escaping
- // that had been previously added.
- var unescape = function(code) {
- return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\t': 't',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
};
+ var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
- _.template = function(str, data) {
- var c = _.templateSettings;
- var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
- 'with(obj||{}){__p.push(\'' +
- str.replace(/\\/g, '\\\\')
- .replace(/'/g, "\\'")
- .replace(c.escape || noMatch, function(match, code) {
- return "',_.escape(" + unescape(code) + "),'";
- })
- .replace(c.interpolate || noMatch, function(match, code) {
- return "'," + unescape(code) + ",'";
- })
- .replace(c.evaluate || noMatch, function(match, code) {
- return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
- })
- .replace(/\r/g, '\\r')
- .replace(/\n/g, '\\n')
- .replace(/\t/g, '\\t')
- + "');}return __p.join('');";
- var func = new Function('obj', '_', tmpl);
- if (data) return func(data, _);
- return function(data) {
- return func.call(this, data, _);
+ _.template = function(text, data, settings) {
+ var render;
+ settings = _.defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = new RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset)
+ .replace(escaper, function(match) { return '\\' + escapes[match]; });
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ }
+ if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ }
+ if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+ index = offset + match.length;
+ return match;
+ });
+ source += "';\n";
+
+ // If a variable is not specified, place data values in local scope.
+ if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + "return __p;\n";
+
+ try {
+ render = new Function(settings.variable || 'obj', '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ if (data) return render(data, _);
+ var template = function(data) {
+ return render.call(this, data, _);
};
+
+ // Provide the compiled function source as a convenience for precompilation.
+ template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+
+ return template;
};
// Add a "chain" function, which will delegate to the wrapper.
@@ -937,29 +1281,15 @@
return _(obj).chain();
};
- // The OOP Wrapper
+ // OOP
// ---------------
-
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
- var wrapper = function(obj) { this._wrapped = obj; };
-
- // Expose `wrapper.prototype` as `_.prototype`
- _.prototype = wrapper.prototype;
// Helper function to continue chaining intermediate results.
- var result = function(obj, chain) {
- return chain ? _(obj).chain() : obj;
- };
-
- // A method to easily add functions to the OOP wrapper.
- var addToWrapper = function(name, func) {
- wrapper.prototype[name] = function() {
- var args = slice.call(arguments);
- unshift.call(args, this._wrapped);
- return result(func.apply(_, args), this._chain);
- };
+ var result = function(obj) {
+ return this._chain ? _(obj).chain() : obj;
};
// Add all of the Underscore functions to the wrapper object.
@@ -968,32 +1298,47 @@
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
- wrapper.prototype[name] = function() {
- var wrapped = this._wrapped;
- method.apply(wrapped, arguments);
- var length = wrapped.length;
- if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
- return result(wrapped, this._chain);
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ method.apply(obj, arguments);
+ if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
+ return result.call(this, obj);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
- wrapper.prototype[name] = function() {
- return result(method.apply(this._wrapped, arguments), this._chain);
+ _.prototype[name] = function() {
+ return result.call(this, method.apply(this._wrapped, arguments));
};
});
- // Start chaining a wrapped Underscore object.
- wrapper.prototype.chain = function() {
- this._chain = true;
- return this;
- };
+ _.extend(_.prototype, {
- // Extracts the result from a wrapped and chained object.
- wrapper.prototype.value = function() {
- return this._wrapped;
- };
+ // Start chaining a wrapped Underscore object.
+ chain: function() {
+ this._chain = true;
+ return this;
+ },
+ // Extracts the result from a wrapped and chained object.
+ value: function() {
+ return this._wrapped;
+ }
+
+ });
+
+ // AMD registration happens at the end for compatibility with AMD loaders
+ // that may not enforce next-turn semantics on modules. Even though general
+ // practice for AMD registration is to be anonymous, underscore registers
+ // as a named module because, like jQuery, it is a base library that is
+ // popular enough to be bundled in a third party lib, but not be part of
+ // an AMD load request. Those cases could generate an error when an
+ // anonymous define() is called outside of a loader request.
+ if (typeof define === 'function' && define.amd) {
+ define('underscore', [], function() {
+ return _;
+ });
+ }
}).call(this);
diff --git a/addons/web/static/lib/underscore/underscore.string.js b/addons/web/static/lib/underscore/underscore.string.js
index d0b6ff1ffb3..01226d91513 100644
--- a/addons/web/static/lib/underscore/underscore.string.js
+++ b/addons/web/static/lib/underscore/underscore.string.js
@@ -1,45 +1,53 @@
-// Underscore.string
-// (c) 2010 Esa-Matti Suuronen
-// Underscore.strings is freely distributable under the terms of the MIT license.
-// Documentation: https://github.com/epeli/underscore.string
-// Some code is borrowed from MooTools and Alexandru Marasteanu.
+// Underscore.string
+// (c) 2010 Esa-Matti Suuronen
+// Underscore.string is freely distributable under the terms of the MIT license.
+// Documentation: https://github.com/epeli/underscore.string
+// Some code is borrowed from MooTools and Alexandru Marasteanu.
+// Version '2.3.0'
-// Version 1.2.0
-
-(function(root){
+!function(root, String){
'use strict';
// Defining helper functions.
var nativeTrim = String.prototype.trim;
+ var nativeTrimRight = String.prototype.trimRight;
+ var nativeTrimLeft = String.prototype.trimLeft;
var parseNumber = function(source) { return source * 1 || 0; };
- var strRepeat = function(i, m) {
- for (var o = []; m > 0; o[--m] = i) {}
- return o.join('');
- };
-
- var slice = function(a){
- return Array.prototype.slice.call(a);
- };
-
- var defaultToWhiteSpace = function(characters){
- if (characters) {
- return _s.escapeRegExp(characters);
+ var strRepeat = function(str, qty){
+ if (qty < 1) return '';
+ var result = '';
+ while (qty > 0) {
+ if (qty & 1) result += str;
+ qty >>= 1, str += str;
}
- return '\\s';
+ return result;
};
- var sArgs = function(method){
- return function(){
- var args = slice(arguments);
- for(var i=0; i',
+ quot: '"',
+ apos: "'",
+ amp: '&'
+ };
+
+ var reversedEscapeChars = {};
+ for(var key in escapeChars){ reversedEscapeChars[escapeChars[key]] = key; }
+
// sprintf() for JavaScript 0.7-beta1
// http://www.diveintojavascript.com/projects/javascript-sprintf
//
@@ -168,213 +176,238 @@
var _s = {
- VERSION: '1.2.0',
+ VERSION: '2.3.0',
- isBlank: sArgs(function(str){
+ isBlank: function(str){
+ if (str == null) str = '';
return (/^\s*$/).test(str);
- }),
+ },
- stripTags: sArgs(function(str){
- return str.replace(/<\/?[^>]+>/ig, '');
- }),
+ stripTags: function(str){
+ if (str == null) return '';
+ return String(str).replace(/<\/?[^>]+>/g, '');
+ },
- capitalize : sArgs(function(str) {
- return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
- }),
+ capitalize : function(str){
+ str = str == null ? '' : String(str);
+ return str.charAt(0).toUpperCase() + str.slice(1);
+ },
- chop: sArgs(function(str, step){
- step = parseNumber(step) || str.length;
- var arr = [];
- for (var i = 0; i < str.length;) {
- arr.push(str.slice(i,i + step));
- i = i + step;
- }
- return arr;
- }),
+ chop: function(str, step){
+ if (str == null) return [];
+ str = String(str);
+ step = ~~step;
+ return step > 0 ? str.match(new RegExp('.{1,' + step + '}', 'g')) : [str];
+ },
- clean: sArgs(function(str){
- return _s.strip(str.replace(/\s+/g, ' '));
- }),
+ clean: function(str){
+ return _s.strip(str).replace(/\s+/g, ' ');
+ },
- count: sArgs(function(str, substr){
- var count = 0, index;
- for (var i=0; i < str.length;) {
- index = str.indexOf(substr, i);
- index >= 0 && count++;
- i = i + (index >= 0 ? index : 0) + substr.length;
- }
- return count;
- }),
+ count: function(str, substr){
+ if (str == null || substr == null) return 0;
+ return String(str).split(substr).length - 1;
+ },
- chars: sArgs(function(str) {
- return str.split('');
- }),
+ chars: function(str) {
+ if (str == null) return [];
+ return String(str).split('');
+ },
- escapeHTML: sArgs(function(str) {
- return str.replace(/&/g,'&').replace(//g,'>')
- .replace(/"/g, '"').replace(/'/g, "'");
- }),
-
- unescapeHTML: sArgs(function(str) {
- return str.replace(/</g, '<').replace(/>/g, '>')
- .replace(/"/g, '"').replace(/'/g, "'").replace(/&/g, '&');
- }),
-
- escapeRegExp: sArgs(function(str){
- // From MooTools core 1.2.4
- return str.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
- }),
-
- insert: sArgs(function(str, i, substr){
- var arr = str.split('');
- arr.splice(parseNumber(i), 0, substr);
- return arr.join('');
- }),
-
- include: sArgs(function(str, needle){
- return str.indexOf(needle) !== -1;
- }),
-
- join: sArgs(function(sep) {
- var args = slice(arguments);
- return args.join(args.shift());
- }),
-
- lines: sArgs(function(str) {
- return str.split("\n");
- }),
-
- reverse: sArgs(function(str){
- return Array.prototype.reverse.apply(String(str).split('')).join('');
- }),
-
- splice: sArgs(function(str, i, howmany, substr){
- var arr = str.split('');
- arr.splice(parseNumber(i), parseNumber(howmany), substr);
- return arr.join('');
- }),
-
- startsWith: sArgs(function(str, starts){
- return str.length >= starts.length && str.substring(0, starts.length) === starts;
- }),
-
- endsWith: sArgs(function(str, ends){
- return str.length >= ends.length && str.substring(str.length - ends.length) === ends;
- }),
-
- succ: sArgs(function(str){
- var arr = str.split('');
- arr.splice(str.length-1, 1, String.fromCharCode(str.charCodeAt(str.length-1) + 1));
- return arr.join('');
- }),
-
- titleize: sArgs(function(str){
- var arr = str.split(' '),
- word;
- for (var i=0; i < arr.length; i++) {
- word = arr[i].split('');
- if(typeof word[0] !== 'undefined') word[0] = word[0].toUpperCase();
- i+1 === arr.length ? arr[i] = word.join('') : arr[i] = word.join('') + ' ';
- }
- return arr.join('');
- }),
-
- camelize: sArgs(function(str){
- return _s.trim(str).replace(/(\-|_|\s)+(.)?/g, function(match, separator, chr) {
- return chr ? chr.toUpperCase() : '';
+ swapCase: function(str) {
+ if (str == null) return '';
+ return String(str).replace(/\S/g, function(c){
+ return c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase();
});
- }),
+ },
+
+ escapeHTML: function(str) {
+ if (str == null) return '';
+ return String(str).replace(/[&<>"']/g, function(m){ return '&' + reversedEscapeChars[m] + ';'; });
+ },
+
+ unescapeHTML: function(str) {
+ if (str == null) return '';
+ return String(str).replace(/\&([^;]+);/g, function(entity, entityCode){
+ var match;
+
+ if (entityCode in escapeChars) {
+ return escapeChars[entityCode];
+ } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
+ return String.fromCharCode(parseInt(match[1], 16));
+ } else if (match = entityCode.match(/^#(\d+)$/)) {
+ return String.fromCharCode(~~match[1]);
+ } else {
+ return entity;
+ }
+ });
+ },
+
+ escapeRegExp: function(str){
+ if (str == null) return '';
+ return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+ },
+
+ splice: function(str, i, howmany, substr){
+ var arr = _s.chars(str);
+ arr.splice(~~i, ~~howmany, substr);
+ return arr.join('');
+ },
+
+ insert: function(str, i, substr){
+ return _s.splice(str, i, 0, substr);
+ },
+
+ include: function(str, needle){
+ if (needle === '') return true;
+ if (str == null) return false;
+ return String(str).indexOf(needle) !== -1;
+ },
+
+ join: function() {
+ var args = slice.call(arguments),
+ separator = args.shift();
+
+ if (separator == null) separator = '';
+
+ return args.join(separator);
+ },
+
+ lines: function(str) {
+ if (str == null) return [];
+ return String(str).split("\n");
+ },
+
+ reverse: function(str){
+ return _s.chars(str).reverse().join('');
+ },
+
+ startsWith: function(str, starts){
+ if (starts === '') return true;
+ if (str == null || starts == null) return false;
+ str = String(str); starts = String(starts);
+ return str.length >= starts.length && str.slice(0, starts.length) === starts;
+ },
+
+ endsWith: function(str, ends){
+ if (ends === '') return true;
+ if (str == null || ends == null) return false;
+ str = String(str); ends = String(ends);
+ return str.length >= ends.length && str.slice(str.length - ends.length) === ends;
+ },
+
+ succ: function(str){
+ if (str == null) return '';
+ str = String(str);
+ return str.slice(0, -1) + String.fromCharCode(str.charCodeAt(str.length-1) + 1);
+ },
+
+ titleize: function(str){
+ if (str == null) return '';
+ return String(str).replace(/(?:^|\s)\S/g, function(c){ return c.toUpperCase(); });
+ },
+
+ camelize: function(str){
+ return _s.trim(str).replace(/[-_\s]+(.)?/g, function(match, c){ return c.toUpperCase(); });
+ },
underscored: function(str){
- return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/\-|\s+/g, '_').toLowerCase();
+ return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/[-\s]+/g, '_').toLowerCase();
},
dasherize: function(str){
- return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1-$2').replace(/^([A-Z]+)/, '-$1').replace(/\_|\s+/g, '-').toLowerCase();
+ return _s.trim(str).replace(/([A-Z])/g, '-$1').replace(/[-_\s]+/g, '-').toLowerCase();
+ },
+
+ classify: function(str){
+ return _s.titleize(String(str).replace(/_/g, ' ')).replace(/\s/g, '');
},
humanize: function(str){
- return _s.capitalize(this.underscored(str).replace(/_id$/,'').replace(/_/g, ' '));
+ return _s.capitalize(_s.underscored(str).replace(/_id$/,'').replace(/_/g, ' '));
},
- trim: sArgs(function(str, characters){
- if (!characters && nativeTrim) {
- return nativeTrim.call(str);
- }
+ trim: function(str, characters){
+ if (str == null) return '';
+ if (!characters && nativeTrim) return nativeTrim.call(str);
characters = defaultToWhiteSpace(characters);
- return str.replace(new RegExp('\^[' + characters + ']+|[' + characters + ']+$', 'g'), '');
- }),
+ return String(str).replace(new RegExp('\^' + characters + '+|' + characters + '+$', 'g'), '');
+ },
- ltrim: sArgs(function(str, characters){
+ ltrim: function(str, characters){
+ if (str == null) return '';
+ if (!characters && nativeTrimLeft) return nativeTrimLeft.call(str);
characters = defaultToWhiteSpace(characters);
- return str.replace(new RegExp('\^[' + characters + ']+', 'g'), '');
- }),
+ return String(str).replace(new RegExp('^' + characters + '+'), '');
+ },
- rtrim: sArgs(function(str, characters){
+ rtrim: function(str, characters){
+ if (str == null) return '';
+ if (!characters && nativeTrimRight) return nativeTrimRight.call(str);
characters = defaultToWhiteSpace(characters);
- return str.replace(new RegExp('[' + characters + ']+$', 'g'), '');
- }),
+ return String(str).replace(new RegExp(characters + '+$'), '');
+ },
- truncate: sArgs(function(str, length, truncateStr){
- truncateStr = truncateStr || '...';
- length = parseNumber(length);
- return str.length > length ? str.slice(0,length) + truncateStr : str;
- }),
+ truncate: function(str, length, truncateStr){
+ if (str == null) return '';
+ str = String(str); truncateStr = truncateStr || '...';
+ length = ~~length;
+ return str.length > length ? str.slice(0, length) + truncateStr : str;
+ },
/**
* _s.prune: a more elegant version of truncate
* prune extra chars, never leaving a half-chopped word.
- * @author github.com/sergiokas
+ * @author github.com/rwz
*/
- prune: sArgs(function(str, length, pruneStr){
- pruneStr = pruneStr || '...';
- length = parseNumber(length);
- var pruned = '';
+ prune: function(str, length, pruneStr){
+ if (str == null) return '';
- // Check if we're in the middle of a word
- if( str.substring(length-1, length+1).search(/^\w\w$/) === 0 )
- pruned = _s.rtrim(str.slice(0,length).replace(/([\W][\w]*)$/,''));
+ str = String(str); length = ~~length;
+ pruneStr = pruneStr != null ? String(pruneStr) : '...';
+
+ if (str.length <= length) return str;
+
+ var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
+ template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
+
+ if (template.slice(template.length-2).match(/\w\w/))
+ template = template.replace(/\s*\S+$/, '');
else
- pruned = _s.rtrim(str.slice(0,length));
+ template = _s.rtrim(template.slice(0, template.length-1));
- pruned = pruned.replace(/\W+$/,'');
-
- return (pruned.length+pruneStr.length>str.length) ? str : pruned + pruneStr;
- }),
-
- words: function(str, delimiter) {
- return String(str).split(delimiter || " ");
+ return (template+pruneStr).length > str.length ? str : str.slice(0, template.length)+pruneStr;
},
- pad: sArgs(function(str, length, padStr, type) {
- var padding = '',
- padlen = 0;
+ words: function(str, delimiter) {
+ if (_s.isBlank(str)) return [];
+ return _s.trim(str, delimiter).split(delimiter || /\s+/);
+ },
- length = parseNumber(length);
+ pad: function(str, length, padStr, type) {
+ str = str == null ? '' : String(str);
+ length = ~~length;
+
+ var padlen = 0;
+
+ if (!padStr)
+ padStr = ' ';
+ else if (padStr.length > 1)
+ padStr = padStr.charAt(0);
- if (!padStr) { padStr = ' '; }
- else if (padStr.length > 1) { padStr = padStr.charAt(0); }
switch(type) {
case 'right':
- padlen = (length - str.length);
- padding = strRepeat(padStr, padlen);
- str = str+padding;
- break;
+ padlen = length - str.length;
+ return str + strRepeat(padStr, padlen);
case 'both':
- padlen = (length - str.length);
- padding = {
- 'left' : strRepeat(padStr, Math.ceil(padlen/2)),
- 'right': strRepeat(padStr, Math.floor(padlen/2))
- };
- str = padding.left+str+padding.right;
- break;
+ padlen = length - str.length;
+ return strRepeat(padStr, Math.ceil(padlen/2)) + str
+ + strRepeat(padStr, Math.floor(padlen/2));
default: // 'left'
- padlen = (length - str.length);
- padding = strRepeat(padStr, padlen);;
- str = padding+str;
+ padlen = length - str.length;
+ return strRepeat(padStr, padlen) + str;
}
- return str;
- }),
+ },
lpad: function(str, length, padStr) {
return _s.pad(str, length, padStr);
@@ -396,41 +429,140 @@
},
toNumber: function(str, decimals) {
- var num = parseNumber(parseNumber(str).toFixed(parseNumber(decimals)));
- return (!(num === 0 && (str !== "0" && str !== 0))) ? num : Number.NaN;
+ if (str == null || str == '') return 0;
+ str = String(str);
+ var num = parseNumber(parseNumber(str).toFixed(~~decimals));
+ return num === 0 && !str.match(/^0+$/) ? Number.NaN : num;
},
- strRight: sArgs(function(sourceStr, sep){
- var pos = (!sep) ? -1 : sourceStr.indexOf(sep);
- return (pos != -1) ? sourceStr.slice(pos+sep.length, sourceStr.length) : sourceStr;
- }),
+ numberFormat : function(number, dec, dsep, tsep) {
+ if (isNaN(number) || number == null) return '';
- strRightBack: sArgs(function(sourceStr, sep){
- var pos = (!sep) ? -1 : sourceStr.lastIndexOf(sep);
- return (pos != -1) ? sourceStr.slice(pos+sep.length, sourceStr.length) : sourceStr;
- }),
+ number = number.toFixed(~~dec);
+ tsep = tsep || ',';
- strLeft: sArgs(function(sourceStr, sep){
- var pos = (!sep) ? -1 : sourceStr.indexOf(sep);
- return (pos != -1) ? sourceStr.slice(0, pos) : sourceStr;
- }),
+ var parts = number.split('.'), fnums = parts[0],
+ decimals = parts[1] ? (dsep || '.') + parts[1] : '';
- strLeftBack: sArgs(function(sourceStr, sep){
- var pos = sourceStr.lastIndexOf(sep);
- return (pos != -1) ? sourceStr.slice(0, pos) : sourceStr;
- }),
+ return fnums.replace(/(\d)(?=(?:\d{3})+$)/g, '$1' + tsep) + decimals;
+ },
+
+ strRight: function(str, sep){
+ if (str == null) return '';
+ str = String(str); sep = sep != null ? String(sep) : sep;
+ var pos = !sep ? -1 : str.indexOf(sep);
+ return ~pos ? str.slice(pos+sep.length, str.length) : str;
+ },
+
+ strRightBack: function(str, sep){
+ if (str == null) return '';
+ str = String(str); sep = sep != null ? String(sep) : sep;
+ var pos = !sep ? -1 : str.lastIndexOf(sep);
+ return ~pos ? str.slice(pos+sep.length, str.length) : str;
+ },
+
+ strLeft: function(str, sep){
+ if (str == null) return '';
+ str = String(str); sep = sep != null ? String(sep) : sep;
+ var pos = !sep ? -1 : str.indexOf(sep);
+ return ~pos ? str.slice(0, pos) : str;
+ },
+
+ strLeftBack: function(str, sep){
+ if (str == null) return '';
+ str += ''; sep = sep != null ? ''+sep : sep;
+ var pos = str.lastIndexOf(sep);
+ return ~pos ? str.slice(0, pos) : str;
+ },
+
+ toSentence: function(array, separator, lastSeparator, serial) {
+ separator = separator || ', '
+ lastSeparator = lastSeparator || ' and '
+ var a = array.slice(), lastMember = a.pop();
+
+ if (array.length > 2 && serial) lastSeparator = _s.rtrim(separator) + lastSeparator;
+
+ return a.length ? a.join(separator) + lastSeparator + lastMember : lastMember;
+ },
+
+ toSentenceSerial: function() {
+ var args = slice.call(arguments);
+ args[3] = true;
+ return _s.toSentence.apply(_s, args);
+ },
+
+ slugify: function(str) {
+ if (str == null) return '';
+
+ var from = "ąàáäâãåæćęèéëêìíïîłńòóöôõøùúüûñçżź",
+ to = "aaaaaaaaceeeeeiiiilnoooooouuuunczz",
+ regex = new RegExp(defaultToWhiteSpace(from), 'g');
+
+ str = String(str).toLowerCase().replace(regex, function(c){
+ var index = from.indexOf(c);
+ return to.charAt(index) || '-';
+ });
+
+ return _s.dasherize(str.replace(/[^\w\s-]/g, ''));
+ },
+
+ surround: function(str, wrapper) {
+ return [wrapper, str, wrapper].join('');
+ },
+
+ quote: function(str) {
+ return _s.surround(str, '"');
+ },
exports: function() {
var result = {};
for (var prop in this) {
- if (!this.hasOwnProperty(prop) || prop == 'include' || prop == 'contains' || prop == 'reverse') continue;
+ if (!this.hasOwnProperty(prop) || prop.match(/^(?:include|contains|reverse)$/)) continue;
result[prop] = this[prop];
}
return result;
- }
+ },
+ repeat: function(str, qty, separator){
+ if (str == null) return '';
+
+ qty = ~~qty;
+
+ // using faster implementation if separator is not needed;
+ if (separator == null) return strRepeat(String(str), qty);
+
+ // this one is about 300x slower in Google Chrome
+ for (var repeat = []; qty > 0; repeat[--qty] = str) {}
+ return repeat.join(separator);
+ },
+
+ levenshtein: function(str1, str2) {
+ if (str1 == null && str2 == null) return 0;
+ if (str1 == null) return String(str2).length;
+ if (str2 == null) return String(str1).length;
+
+ str1 = String(str1); str2 = String(str2);
+
+ var current = [], prev, value;
+
+ for (var i = 0; i <= str2.length; i++)
+ for (var j = 0; j <= str1.length; j++) {
+ if (i && j)
+ if (str1.charAt(j - 1) === str2.charAt(i - 1))
+ value = prev;
+ else
+ value = Math.min(current[j], current[j - 1], prev) + 1;
+ else
+ value = i + j;
+
+ prev = current[j];
+ current[j] = value;
+ }
+
+ return current.pop();
+ }
};
// Aliases
@@ -439,9 +571,10 @@
_s.lstrip = _s.ltrim;
_s.rstrip = _s.rtrim;
_s.center = _s.lrpad;
- _s.ljust = _s.lpad;
- _s.rjust = _s.rpad;
+ _s.rjust = _s.lpad;
+ _s.ljust = _s.rpad;
_s.contains = _s.include;
+ _s.q = _s.quote;
// CommonJS module is defined
if (typeof exports !== 'undefined') {
@@ -451,18 +584,17 @@
}
exports._s = _s;
- // Integrate with Underscore.js
- } else if (typeof root._ !== 'undefined') {
- // root._.mixin(_s);
- root._.string = _s;
- root._.str = root._.string;
+ } else if (typeof define === 'function' && define.amd) {
+ // Register as a named module with AMD.
+ define('underscore.string', [], function() {
+ return _s;
+ });
- // Or define it
} else {
- root._ = {
- string: _s,
- str: _s
- };
+ // Integrate with Underscore.js if defined
+ // or create our own underscore object.
+ root._ = root._ || {};
+ root._.string = root._.str = _s;
}
-}(this || window));
+}(this, String);
\ No newline at end of file
diff --git a/addons/web/static/lib/underscore/underscore.string.min.js b/addons/web/static/lib/underscore/underscore.string.min.js
index dfc1b46b082..5248a6ecd21 100644
--- a/addons/web/static/lib/underscore/underscore.string.min.js
+++ b/addons/web/static/lib/underscore/underscore.string.min.js
@@ -1,14 +1 @@
-(function(k){var o=String.prototype.trim,l=function(a,b){for(var c=[];b>0;c[--b]=a);return c.join("")},d=function(a){return function(){for(var b=Array.prototype.slice.call(arguments),c=0;c=0?"+"+f:f;i=g[4]?g[4]=="0"?"0":g[4].charAt(1):" ";k=g[6]-String(f).length;i=g[6]?l(i,k):"";j.push(g[5]?f+i:i+f)}return j.join("")};b.cache=
-{};b.parse=function(a){for(var b=[],e=[],d=0;a;){if((b=/^[^\x25]+/.exec(a))!==null)e.push(b[0]);else if((b=/^\x25{2}/.exec(a))!==null)e.push("%");else if((b=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(a))!==null){if(b[2]){d|=1;var f=[],j=b[2],h=[];if((h=/^([a-z_][a-z_\d]*)/i.exec(j))!==null)for(f.push(h[1]);(j=j.substring(h[0].length))!=="";)if((h=/^\.([a-z_][a-z_\d]*)/i.exec(j))!==null)f.push(h[1]);else if((h=/^\[(\d+)\]/.exec(j))!==null)f.push(h[1]);
-else throw"[_.sprintf] huh?";else throw"[_.sprintf] huh?";b[2]=f}else d|=2;if(d===3)throw"[_.sprintf] mixing positional and named placeholders is not (yet) supported";e.push(b)}else throw"[_.sprintf] huh?";a=a.substring(b[0].length)}return e};return b}(),e={VERSION:"1.2.0",isBlank:d(function(a){return/^\s*$/.test(a)}),stripTags:d(function(a){return a.replace(/<\/?[^>]+>/ig,"")}),capitalize:d(function(a){return a.charAt(0).toUpperCase()+a.substring(1).toLowerCase()}),chop:d(function(a,b){for(var b=
-b*1||0||a.length,c=[],e=0;e=0&&c++,d=d+(e>=0?e:0)+b.length;return c}),chars:d(function(a){return a.split("")}),escapeHTML:d(function(a){return a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),unescapeHTML:d(function(a){return a.replace(/</g,"<").replace(/>/g,
-">").replace(/"/g,'"').replace(/'/g,"'").replace(/&/g,"&")}),escapeRegExp:d(function(a){return a.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")}),insert:d(function(a,b,c){a=a.split("");a.splice(b*1||0,0,c);return a.join("")}),include:d(function(a,b){return a.indexOf(b)!==-1}),join:d(function(a){var b=Array.prototype.slice.call(arguments);return b.join(b.shift())}),lines:d(function(a){return a.split("\n")}),reverse:d(function(a){return Array.prototype.reverse.apply(String(a).split("")).join("")}),
-splice:d(function(a,b,c,e){a=a.split("");a.splice(b*1||0,c*1||0,e);return a.join("")}),startsWith:d(function(a,b){return a.length>=b.length&&a.substring(0,b.length)===b}),endsWith:d(function(a,b){return a.length>=b.length&&a.substring(a.length-b.length)===b}),succ:d(function(a){var b=a.split("");b.splice(a.length-1,1,String.fromCharCode(a.charCodeAt(a.length-1)+1));return b.join("")}),titleize:d(function(a){for(var a=a.split(" "),b,c=0;cb?a.slice(0,b)+(c||"..."):a}),prune:d(function(a,b,c){var c=c||"...",b=b*1||0,d="",d=a.substring(b-
-1,b+1).search(/^\w\w$/)===0?e.rtrim(a.slice(0,b).replace(/([\W][\w]*)$/,"")):e.rtrim(a.slice(0,b)),d=d.replace(/\W+$/,"");return d.length+c.length>a.length?a:d+c}),words:function(a,b){return String(a).split(b||" ")},pad:d(function(a,b,c,e){var d="",d=0,b=b*1||0;c?c.length>1&&(c=c.charAt(0)):c=" ";switch(e){case "right":d=b-a.length;d=l(c,d);a+=d;break;case "both":d=b-a.length;d={left:l(c,Math.ceil(d/2)),right:l(c,Math.floor(d/2))};a=d.left+a+d.right;break;default:d=b-a.length,d=l(c,d),a=d+a}return a}),
-lpad:function(a,b,c){return e.pad(a,b,c)},rpad:function(a,b,c){return e.pad(a,b,c,"right")},lrpad:function(a,b,c){return e.pad(a,b,c,"both")},sprintf:m,vsprintf:function(a,b){b.unshift(a);return m.apply(null,b)},toNumber:function(a,b){var c;c=(a*1||0).toFixed(b*1||0)*1||0;return!(c===0&&a!=="0"&&a!==0)?c:Number.NaN},strRight:d(function(a,b){var c=!b?-1:a.indexOf(b);return c!=-1?a.slice(c+b.length,a.length):a}),strRightBack:d(function(a,b){var c=!b?-1:a.lastIndexOf(b);return c!=-1?a.slice(c+b.length,
-a.length):a}),strLeft:d(function(a,b){var c=!b?-1:a.indexOf(b);return c!=-1?a.slice(0,c):a}),strLeftBack:d(function(a,b){var c=a.lastIndexOf(b);return c!=-1?a.slice(0,c):a}),exports:function(){var a={},b;for(b in this)if(this.hasOwnProperty(b)&&!(b=="include"||b=="contains"||b=="reverse"))a[b]=this[b];return a}};e.strip=e.trim;e.lstrip=e.ltrim;e.rstrip=e.rtrim;e.center=e.lrpad;e.ljust=e.lpad;e.rjust=e.rpad;e.contains=e.include;if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)module.exports=
-e;exports._s=e}else typeof k._!=="undefined"?(k._.string=e,k._.str=k._.string):k._={string:e,str:e}})(this||window);
+!function(e,t){"use strict";var n=t.prototype.trim,r=t.prototype.trimRight,i=t.prototype.trimLeft,s=function(e){return e*1||0},o=function(e,t){if(t<1)return"";var n="";while(t>0)t&1&&(n+=e),t>>=1,e+=e;return n},u=[].slice,a=function(e){return e==null?"\\s":e.source?e.source:"["+p.escapeRegExp(e)+"]"},f={lt:"<",gt:">",quot:'"',apos:"'",amp:"&"},l={};for(var c in f)l[f[c]]=c;var h=function(){function e(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}var n=o,r=function(){return r.cache.hasOwnProperty(arguments[0])||(r.cache[arguments[0]]=r.parse(arguments[0])),r.format.call(null,r.cache[arguments[0]],arguments)};return r.format=function(r,i){var s=1,o=r.length,u="",a,f=[],l,c,p,d,v,m;for(l=0;l=0?"+"+a:a,v=p[4]?p[4]=="0"?"0":p[4].charAt(1):" ",m=p[6]-t(a).length,d=p[6]?n(v,m):"",f.push(p[5]?a+d:d+a)}}return f.join("")},r.cache={},r.parse=function(e){var t=e,n=[],r=[],i=0;while(t){if((n=/^[^\x25]+/.exec(t))!==null)r.push(n[0]);else if((n=/^\x25{2}/.exec(t))!==null)r.push("%");else{if((n=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(t))===null)throw new Error("[_.sprintf] huh?");if(n[2]){i|=1;var s=[],o=n[2],u=[];if((u=/^([a-z_][a-z_\d]*)/i.exec(o))===null)throw new Error("[_.sprintf] huh?");s.push(u[1]);while((o=o.substring(u[0].length))!=="")if((u=/^\.([a-z_][a-z_\d]*)/i.exec(o))!==null)s.push(u[1]);else{if((u=/^\[(\d+)\]/.exec(o))===null)throw new Error("[_.sprintf] huh?");s.push(u[1])}n[2]=s}else i|=2;if(i===3)throw new Error("[_.sprintf] mixing positional and named placeholders is not (yet) supported");r.push(n)}t=t.substring(n[0].length)}return r},r}(),p={VERSION:"2.3.0",isBlank:function(e){return e==null&&(e=""),/^\s*$/.test(e)},stripTags:function(e){return e==null?"":t(e).replace(/<\/?[^>]+>/g,"")},capitalize:function(e){return e=e==null?"":t(e),e.charAt(0).toUpperCase()+e.slice(1)},chop:function(e,n){return e==null?[]:(e=t(e),n=~~n,n>0?e.match(new RegExp(".{1,"+n+"}","g")):[e])},clean:function(e){return p.strip(e).replace(/\s+/g," ")},count:function(e,n){return e==null||n==null?0:t(e).split(n).length-1},chars:function(e){return e==null?[]:t(e).split("")},swapCase:function(e){return e==null?"":t(e).replace(/\S/g,function(e){return e===e.toUpperCase()?e.toLowerCase():e.toUpperCase()})},escapeHTML:function(e){return e==null?"":t(e).replace(/[&<>"']/g,function(e){return"&"+l[e]+";"})},unescapeHTML:function(e){return e==null?"":t(e).replace(/\&([^;]+);/g,function(e,n){var r;return n in f?f[n]:(r=n.match(/^#x([\da-fA-F]+)$/))?t.fromCharCode(parseInt(r[1],16)):(r=n.match(/^#(\d+)$/))?t.fromCharCode(~~r[1]):e})},escapeRegExp:function(e){return e==null?"":t(e).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")},splice:function(e,t,n,r){var i=p.chars(e);return i.splice(~~t,~~n,r),i.join("")},insert:function(e,t,n){return p.splice(e,t,0,n)},include:function(e,n){return n===""?!0:e==null?!1:t(e).indexOf(n)!==-1},join:function(){var e=u.call(arguments),t=e.shift();return t==null&&(t=""),e.join(t)},lines:function(e){return e==null?[]:t(e).split("\n")},reverse:function(e){return p.chars(e).reverse().join("")},startsWith:function(e,n){return n===""?!0:e==null||n==null?!1:(e=t(e),n=t(n),e.length>=n.length&&e.slice(0,n.length)===n)},endsWith:function(e,n){return n===""?!0:e==null||n==null?!1:(e=t(e),n=t(n),e.length>=n.length&&e.slice(e.length-n.length)===n)},succ:function(e){return e==null?"":(e=t(e),e.slice(0,-1)+t.fromCharCode(e.charCodeAt(e.length-1)+1))},titleize:function(e){return e==null?"":t(e).replace(/(?:^|\s)\S/g,function(e){return e.toUpperCase()})},camelize:function(e){return p.trim(e).replace(/[-_\s]+(.)?/g,function(e,t){return t.toUpperCase()})},underscored:function(e){return p.trim(e).replace(/([a-z\d])([A-Z]+)/g,"$1_$2").replace(/[-\s]+/g,"_").toLowerCase()},dasherize:function(e){return p.trim(e).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},classify:function(e){return p.titleize(t(e).replace(/_/g," ")).replace(/\s/g,"")},humanize:function(e){return p.capitalize(p.underscored(e).replace(/_id$/,"").replace(/_/g," "))},trim:function(e,r){return e==null?"":!r&&n?n.call(e):(r=a(r),t(e).replace(new RegExp("^"+r+"+|"+r+"+$","g"),""))},ltrim:function(e,n){return e==null?"":!n&&i?i.call(e):(n=a(n),t(e).replace(new RegExp("^"+n+"+"),""))},rtrim:function(e,n){return e==null?"":!n&&r?r.call(e):(n=a(n),t(e).replace(new RegExp(n+"+$"),""))},truncate:function(e,n,r){return e==null?"":(e=t(e),r=r||"...",n=~~n,e.length>n?e.slice(0,n)+r:e)},prune:function(e,n,r){if(e==null)return"";e=t(e),n=~~n,r=r!=null?t(r):"...";if(e.length<=n)return e;var i=function(e){return e.toUpperCase()!==e.toLowerCase()?"A":" "},s=e.slice(0,n+1).replace(/.(?=\W*\w*$)/g,i);return s.slice(s.length-2).match(/\w\w/)?s=s.replace(/\s*\S+$/,""):s=p.rtrim(s.slice(0,s.length-1)),(s+r).length>e.length?e:e.slice(0,s.length)+r},words:function(e,t){return p.isBlank(e)?[]:p.trim(e,t).split(t||/\s+/)},pad:function(e,n,r,i){e=e==null?"":t(e),n=~~n;var s=0;r?r.length>1&&(r=r.charAt(0)):r=" ";switch(i){case"right":return s=n-e.length,e+o(r,s);case"both":return s=n-e.length,o(r,Math.ceil(s/2))+e+o(r,Math.floor(s/2));default:return s=n-e.length,o(r,s)+e}},lpad:function(e,t,n){return p.pad(e,t,n)},rpad:function(e,t,n){return p.pad(e,t,n,"right")},lrpad:function(e,t,n){return p.pad(e,t,n,"both")},sprintf:h,vsprintf:function(e,t){return t.unshift(e),h.apply(null,t)},toNumber:function(e,n){if(e==null||e=="")return 0;e=t(e);var r=s(s(e).toFixed(~~n));return r===0&&!e.match(/^0+$/)?Number.NaN:r},numberFormat:function(e,t,n,r){if(isNaN(e)||e==null)return"";e=e.toFixed(~~t),r=r||",";var i=e.split("."),s=i[0],o=i[1]?(n||".")+i[1]:"";return s.replace(/(\d)(?=(?:\d{3})+$)/g,"$1"+r)+o},strRight:function(e,n){if(e==null)return"";e=t(e),n=n!=null?t(n):n;var r=n?e.indexOf(n):-1;return~r?e.slice(r+n.length,e.length):e},strRightBack:function(e,n){if(e==null)return"";e=t(e),n=n!=null?t(n):n;var r=n?e.lastIndexOf(n):-1;return~r?e.slice(r+n.length,e.length):e},strLeft:function(e,n){if(e==null)return"";e=t(e),n=n!=null?t(n):n;var r=n?e.indexOf(n):-1;return~r?e.slice(0,r):e},strLeftBack:function(e,t){if(e==null)return"";e+="",t=t!=null?""+t:t;var n=e.lastIndexOf(t);return~n?e.slice(0,n):e},toSentence:function(e,t,n,r){t=t||", ",n=n||" and ";var i=e.slice(),s=i.pop();return e.length>2&&r&&(n=p.rtrim(t)+n),i.length?i.join(t)+n+s:s},toSentenceSerial:function(){var e=u.call(arguments);return e[3]=!0,p.toSentence.apply(p,e)},slugify:function(e){if(e==null)return"";var n="ąàáäâãåæćęèéëêìíïîłńòóöôõøùúüûñçżź",r="aaaaaaaaceeeeeiiiilnoooooouuuunczz",i=new RegExp(a(n),"g");return e=t(e).toLowerCase().replace(i,function(e){var t=n.indexOf(e);return r.charAt(t)||"-"}),p.dasherize(e.replace(/[^\w\s-]/g,""))},surround:function(e,t){return[t,e,t].join("")},quote:function(e){return p.surround(e,'"')},exports:function(){var e={};for(var t in this){if(!this.hasOwnProperty(t)||t.match(/^(?:include|contains|reverse)$/))continue;e[t]=this[t]}return e},repeat:function(e,n,r){if(e==null)return"";n=~~n;if(r==null)return o(t(e),n);for(var i=[];n>0;i[--n]=e);return i.join(r)},levenshtein:function(e,n){if(e==null&&n==null)return 0;if(e==null)return t(n).length;if(n==null)return t(e).length;e=t(e),n=t(n);var r=[],i,s;for(var o=0;o<=n.length;o++)for(var u=0;u<=e.length;u++)o&&u?e.charAt(u-1)===n.charAt(o-1)?s=i:s=Math.min(r[u],r[u-1],i)+1:s=o+u,i=r[u],r[u]=s;return r.pop()}};p.strip=p.trim,p.lstrip=p.ltrim,p.rstrip=p.rtrim,p.center=p.lrpad,p.rjust=p.lpad,p.ljust=p.rpad,p.contains=p.include,p.q=p.quote,typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(module.exports=p),exports._s=p):typeof define=="function"&&define.amd?define("underscore.string",[],function(){return p}):(e._=e._||{},e._.string=e._.str=p)}(this,String);
\ No newline at end of file
From b79a33aefc3e7164baedca343a3b6041df294ae7 Mon Sep 17 00:00:00 2001
From: Olivier Dony
Date: Tue, 4 Mar 2014 16:29:27 +0100
Subject: [PATCH 18/53] [FIX] orm.read_group: improve test coverage and corner
case handling:
- allow leading spaces in orderby spec for m2o columns
- extra test for read_group on multiple columns
- proper handling of groupby on numeric column with default order
bzr revid: odo@openerp.com-20140304152927-havybom9x1jgdzae
---
openerp/addons/base/tests/test_base.py | 33 +++++++++++++++++++++++---
openerp/osv/orm.py | 11 +++++----
2 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py
index ebdb406e1ed..42ba21a1228 100644
--- a/openerp/addons/base/tests/test_base.py
+++ b/openerp/addons/base/tests/test_base.py
@@ -299,7 +299,16 @@ class test_base(common.TransactionCase):
ids = [self.res_users.create(cr, uid, u) for u in test_users]
domain = [('id', 'in', ids)]
- # group on local char field, aggregate on int field (second groupby ignored on purpose)
+ # group on local char field without domain and without active_test (-> empty WHERE clause)
+ groups_data = self.res_users.read_group(cr, uid, [], fields=['login'], groupby=['login'], orderby='login DESC', context={'active_test': False})
+ self.assertGreater(len(groups_data), 6, "Incorrect number of results when grouping on a field")
+
+ # group on local char field with limit
+ groups_data = self.res_users.read_group(cr, uid, domain, fields=['login'], groupby=['login'], orderby='login DESC', limit=3, offset=3)
+ self.assertEqual(len(groups_data), 3, "Incorrect number of results when grouping on a field with limit")
+ self.assertEqual(['bob', 'alice2', 'alice'], [g['login'] for g in groups_data], 'Result mismatch')
+
+ # group on inherited char field, aggregate on int field (second groupby ignored on purpose)
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color', 'function'], groupby=['function', 'login'])
self.assertEqual(len(groups_data), 3, "Incorrect number of results when grouping on a field")
self.assertEqual(['5$ Wrench', 'Eavesdropper', 'Friend'], [g['function'] for g in groups_data], 'incorrect read_group order')
@@ -307,11 +316,20 @@ class test_base(common.TransactionCase):
self.assertIn('color', group_data, "Aggregated data for the column 'color' is not present in read_group return values")
self.assertEqual(group_data['color'], 3, "Incorrect sum for aggregated data for the column 'color'")
- # group on local char field, reverse order
+ # group on inherited char field, reverse order
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color'], groupby='name', orderby='name DESC')
self.assertEqual(['Nab', 'Eve', 'Bob', 'Alice'], [g['name'] for g in groups_data], 'Incorrect ordering of the list')
- # group on local char field, multiple orders with directions
+ # group on int field, default ordering
+ groups_data = self.res_users.read_group(cr, uid, domain, fields=['color'], groupby='color')
+ self.assertEqual([-3, 0, 1, 2, 3, 6], [g['color'] for g in groups_data], 'Incorrect ordering of the list')
+
+ # multi group, second level is int field, should still be summed in first level grouping
+ groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color'], groupby=['name', 'color'], orderby='name DESC')
+ self.assertEqual(['Nab', 'Eve', 'Bob', 'Alice'], [g['name'] for g in groups_data], 'Incorrect ordering of the list')
+ self.assertEqual([3, 3, 2, 1], [g['color'] for g in groups_data], 'Incorrect ordering of the list')
+
+ # group on inherited char field, multiple orders with directions
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color'], groupby='name', orderby='color DESC, name')
self.assertEqual(len(groups_data), 4, "Incorrect number of results when grouping on a field")
self.assertEqual(['Eve', 'Nab', 'Bob', 'Alice'], [g['name'] for g in groups_data], 'Incorrect ordering of the list')
@@ -345,6 +363,14 @@ class test_base(common.TransactionCase):
self.assertEqual([2, 4], [g['title_count'] for g in groups_data], 'Incorrect number of results')
self.assertEqual([-1, 10], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
+ # group on inherited many2one (res_partner.title), multiple orders with m2o in second position
+ groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'title'], groupby=['title'], orderby="color desc, title desc")
+ self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
+ # m2o is returned as a (id, label) pair
+ self.assertEqual([(title_lady, 'Lady'), (title_sir, 'Sir')], [g['title'] for g in groups_data], 'Incorrect ordering of the result')
+ self.assertEqual([4, 2], [g['title_count'] for g in groups_data], 'Incorrect number of results')
+ self.assertEqual([10, -1], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
+
# group on inherited many2one (res_partner.title), ordered by other inherited field (color)
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'title'], groupby=['title'], orderby='color')
self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
@@ -353,6 +379,7 @@ class test_base(common.TransactionCase):
self.assertEqual([2, 4], [g['title_count'] for g in groups_data], 'Incorrect number of results')
self.assertEqual([-1, 10], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
+
class test_partner_recursion(common.TransactionCase):
def setUp(self):
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index a033e3f2250..f9cfbe1522d 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -76,7 +76,7 @@ _schema = logging.getLogger(__name__ + '.schema')
# List of etree._Element subclasses that we choose to ignore when parsing XML.
from openerp.tools import SKIPPED_ELEMENT_TYPES
-regex_order = re.compile('^(([a-z0-9_]+|"[a-z0-9_]+")( *desc| *asc)?( *, *|))+$', re.I)
+regex_order = re.compile('^( *([a-z0-9_]+|"[a-z0-9_]+")( *desc| *asc)?( *, *|))+$', re.I)
regex_object_name = re.compile(r'^[a-z0-9_.]+$')
# TODO for trunk, raise the value to 1000
@@ -2698,7 +2698,7 @@ class BaseModel(object):
aggregated_fields = [
f for f in fields
- if f not in ('id', 'sequence')
+ if f not in ('id', 'sequence', groupby)
if fget[f]['type'] in ('integer', 'float')
if (f in self._all_columns and getattr(self._all_columns[f].column, '_classic_write'))]
for f in aggregated_fields:
@@ -2716,6 +2716,7 @@ class BaseModel(object):
count_field = groupby
prefix_terms = lambda prefix, terms: (prefix + " " + ",".join(terms)) if terms else ''
+ prefix_term = lambda prefix, term: ('%s %s' % (prefix, term)) if term else ''
query = """
SELECT min(%(table)s.id) AS id, count(%(table)s.id) AS %(count_field)s_count
@@ -2731,11 +2732,11 @@ class BaseModel(object):
'count_field': count_field,
'extra_fields': prefix_terms(',', select_terms),
'from': from_clause,
- 'where': prefix_terms('WHERE', [where_clause]),
+ 'where': prefix_term('WHERE', where_clause),
'groupby': prefix_terms('GROUP BY', groupby_terms),
'orderby': prefix_terms('ORDER BY', orderby_terms),
- 'limit': prefix_terms('LIMIT', [str(int(limit))] if limit else []),
- 'offset': prefix_terms('OFFSET', [str(int(offset))] if offset else []),
+ 'limit': prefix_term('LIMIT', int(limit) if limit else None),
+ 'offset': prefix_term('OFFSET', int(offset) if limit else None),
}
cr.execute(query, where_clause_params)
alldata = {}
From a6e9d3edcca2d942900ddc8fe5be9da22094f960 Mon Sep 17 00:00:00 2001
From: Olivier Dony
Date: Tue, 4 Mar 2014 19:27:24 +0100
Subject: [PATCH 19/53] [FIX] product: avoid reading image_small field which is
bandwidth intensive and un-necessary
bzr revid: odo@openerp.com-20140304182724-kplzfik56ebp2boe
---
addons/product/product_view.xml | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index d20f91b217f..a33678e6a32 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -182,7 +182,6 @@
-
From 016a1ed37b5ccf2ce3d0098d3a7b83b58e862443 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Wed, 5 Mar 2014 15:05:14 +0100
Subject: [PATCH 20/53] [FIX] orm: create a foreign key for the function fields
of type many2one and store value
bzr revid: mat@openerp.com-20140305140514-2sksy3lwqm07wvjh
---
openerp/osv/orm.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index f9cfbe1522d..4645ec6bdb9 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -3212,7 +3212,7 @@ class BaseModel(object):
msg = "Table '%s': dropping index for column '%s' of type '%s' as it is not required anymore"
_schema.debug(msg, self._table, k, f._type)
- if isinstance(f, fields.many2one):
+ if isinstance(f, fields.many2one) or isinstance(f, fields.function) and f._type == 'many2one' and f.store:
dest_model = self.pool.get(f._obj)
if dest_model._table != 'ir_actions':
self._m2o_fix_foreign_key(cr, self._table, k, dest_model, f.ondelete)
@@ -3247,7 +3247,7 @@ class BaseModel(object):
todo_end.append((order, self._update_store, (f, k)))
# and add constraints if needed
- if isinstance(f, fields.many2one):
+ if isinstance(f, fields.many2one) or isinstance(f, fields.function) and f._type == 'many2one' and f.store:
if not self.pool.get(f._obj):
raise except_orm('Programming Error', 'There is no reference available for %s' % (f._obj,))
dest_model = self.pool.get(f._obj)
From 63763dcc552d82f24386b4751183c244a2ed4ea2 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Wed, 5 Mar 2014 15:30:50 +0100
Subject: [PATCH 21/53] [IMP] readability
bzr revid: mat@openerp.com-20140305143050-zddqtyh7qg6lcx3q
---
openerp/osv/orm.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index 4645ec6bdb9..0a7849896fc 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -3212,7 +3212,7 @@ class BaseModel(object):
msg = "Table '%s': dropping index for column '%s' of type '%s' as it is not required anymore"
_schema.debug(msg, self._table, k, f._type)
- if isinstance(f, fields.many2one) or isinstance(f, fields.function) and f._type == 'many2one' and f.store:
+ if isinstance(f, fields.many2one) or (isinstance(f, fields.function) and f._type == 'many2one' and f.store):
dest_model = self.pool.get(f._obj)
if dest_model._table != 'ir_actions':
self._m2o_fix_foreign_key(cr, self._table, k, dest_model, f.ondelete)
@@ -3247,7 +3247,7 @@ class BaseModel(object):
todo_end.append((order, self._update_store, (f, k)))
# and add constraints if needed
- if isinstance(f, fields.many2one) or isinstance(f, fields.function) and f._type == 'many2one' and f.store:
+ if isinstance(f, fields.many2one) or (isinstance(f, fields.function) and f._type == 'many2one' and f.store):
if not self.pool.get(f._obj):
raise except_orm('Programming Error', 'There is no reference available for %s' % (f._obj,))
dest_model = self.pool.get(f._obj)
From 1967b6ce190a0def51249f252c99d36331bb21e2 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Wed, 5 Mar 2014 18:14:56 +0100
Subject: [PATCH 22/53] [FIX] product: when converting unit of mesures, round
above instead of mathematical rounding
bzr revid: mat@openerp.com-20140305171456-goo7on3ncfihu0wu
---
addons/product/_common.py | 20 ++++++++++++++------
addons/product/pricelist.py | 4 ++--
addons/product/product.py | 4 ++--
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/addons/product/_common.py b/addons/product/_common.py
index f5f53fe8689..def09e975af 100644
--- a/addons/product/_common.py
+++ b/addons/product/_common.py
@@ -18,12 +18,20 @@
# along with this program. If not, see .
#
##############################################################################
+from openerp import tools
+
+import math
+import logging
+_logger = logging.getLogger(__name__)
+
+
def rounding(f, r):
+ # TODO for trunk: log deprecation warning
+ # _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.")
+ return tools.float_round(f, precision_rounding=r)
+
+# TODO for trunk: add rounding method parameter to tools.float_round and remove this method
+def ceiling(f, r):
if not r:
return f
- return round(f / r) * r
-
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
+ return math.ceil(f / r) * r
diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py
index 426931f9a27..86480c60059 100644
--- a/addons/product/pricelist.py
+++ b/addons/product/pricelist.py
@@ -21,7 +21,7 @@
import time
-from _common import rounding
+from _common import ceiling
from openerp.osv import fields, osv
from openerp.tools.translate import _
@@ -296,7 +296,7 @@ class product_pricelist(osv.osv):
if price is not False:
price_limit = price
price = price * (1.0+(res['price_discount'] or 0.0))
- price = rounding(price, res['price_round']) #TOFIX: rounding with tools.float_rouding
+ price = ceiling(price, res['price_round'])
price += (res['price_surcharge'] or 0.0)
if res['price_min_margin']:
price = max(price, price_limit+res['price_min_margin'])
diff --git a/addons/product/product.py b/addons/product/product.py
index d9419fc4d68..34503b5136e 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -22,7 +22,7 @@
import math
import re
-from _common import rounding
+from _common import ceiling
from openerp import tools
from openerp.osv import osv, fields
@@ -178,7 +178,7 @@ class product_uom(osv.osv):
return qty
amount = qty / from_unit.factor
if to_unit:
- amount = rounding(amount * to_unit.factor, to_unit.rounding)
+ amount = ceiling(amount * to_unit.factor, to_unit.rounding)
return amount
def _compute_price(self, cr, uid, from_uom_id, price, to_uom_id=False):
From e231045095bd5bbe62f225dc6f72d1217e3e6692 Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Thu, 6 Mar 2014 06:15:19 +0000
Subject: [PATCH 23/53] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20140306061409-nvr56r44q6smklxz
bzr revid: launchpad_translations_on_behalf_of_openerp-20140305055718-w3c9kzsncncpu12w
bzr revid: launchpad_translations_on_behalf_of_openerp-20140306061519-n2qbjt3fe7l104aw
---
addons/account/i18n/mn.po | 14 +++---
addons/account/i18n/tr.po | 40 +++++++--------
addons/account/i18n/zh_CN.po | 89 +++++++++++++++++++---------------
addons/crm/i18n/ja.po | 6 ++-
addons/product/i18n/hr.po | 10 ++--
addons/project/i18n/tr.po | 52 ++++++++++----------
addons/purchase/i18n/mn.po | 11 +++--
addons/purchase/i18n/tr.po | 14 +++---
addons/purchase/i18n/zh_CN.po | 87 ++++++++++++++++++++++++++++++---
addons/sale/i18n/tr.po | 46 +++++++++---------
addons/stock/i18n/hr.po | 20 ++++----
addons/stock/i18n/nl.po | 20 ++++----
addons/stock/i18n/tr.po | 53 ++++++++++----------
openerp/addons/base/i18n/ja.po | 48 +++++++++---------
14 files changed, 299 insertions(+), 211 deletions(-)
diff --git a/addons/account/i18n/mn.po b/addons/account/i18n/mn.po
index 76a32502ce0..981466836d5 100644
--- a/addons/account/i18n/mn.po
+++ b/addons/account/i18n/mn.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-02-18 03:11+0000\n"
+"PO-Revision-Date: 2014-03-05 06:18+0000\n"
"Last-Translator: Jacara \n"
"Language-Team: Mongolian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-19 05:39+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -3562,7 +3562,7 @@ msgstr "Нэхэмжлэлийн валют"
#: field:accounting.report,account_report_id:0
#: model:ir.ui.menu,name:account.menu_account_financial_reports_tree
msgid "Account Reports"
-msgstr "Тайлагнах Дансд"
+msgstr "Санхүүгийн тайлан"
#. module: account
#: field:account.payment.term,line_ids:0
@@ -7233,7 +7233,7 @@ msgstr "Тулгалт: Дараагийн харилцагч руу очих"
#: model:ir.actions.act_window,name:account.action_account_analytic_invert_balance
#: model:ir.actions.report.xml,name:account.account_analytic_account_inverted_balance
msgid "Inverted Analytic Balance"
-msgstr "Урвуу шинжилгээний баланс"
+msgstr "Урвуу аналитик баланс"
#. module: account
#: field:account.tax.template,applicable_type:0
@@ -7651,7 +7651,7 @@ msgstr "Санхүүгийн Тайлангийн Стиль"
#. module: account
#: selection:account.financial.report,sign:0
msgid "Preserve balance sign"
-msgstr "Нөөц тайлангийн тэмдэг"
+msgstr "Балансын тэмдэгийг хэвээр нь"
#. module: account
#: view:account.vat.declaration:0
@@ -11345,7 +11345,7 @@ msgstr "Авлагын данс"
#. module: account
#: report:account.analytic.account.inverted.balance:0
msgid "Inverted Analytic Balance -"
-msgstr "Урвуу шинжилгээний баланс -"
+msgstr "Урвуу аналитик баланс -"
#. module: account
#: field:temp.range,name:0
diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po
index bfeb3531332..62bd07d9325 100644
--- a/addons/account/i18n/tr.po
+++ b/addons/account/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2013-11-30 13:59+0000\n"
+"PO-Revision-Date: 2014-03-06 05:07+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: OpenERP Türkiye Yerelleştirmesi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-12-01 05:45+0000\n"
-"X-Generator: Launchpad (build 16856)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
#. module: account
@@ -477,7 +477,7 @@ msgstr ""
" Bu, account_asset modülünü sisteme kurar. Eğer bu kutuyu "
"işaretlemezseniz, fatura kesip ödeme kabul etme gibi,\n"
" işlemleri yapabilirsiniz ama gelişmiş muhasebe kayıtlarını "
-"(Günlükleri, Hesap planları, ...) tutamazsınız."
+"(Yevmiyeleri, Hesap planları, ...) tutamazsınız."
#. module: account
#: help:account.bank.statement.line,name:0
@@ -2365,7 +2365,7 @@ msgstr "Analitik hesap"
#: code:addons/account/account_bank_statement.py:406
#, python-format
msgid "Please verify that an account is defined in the journal."
-msgstr "Lütfen bu günlükte bir hesabın tanımlandığını doğrulayın."
+msgstr "Lütfen bu yevmiyede bir hesabın tanımlandığını doğrulayın."
#. module: account
#: selection:account.entries.report,move_line_state:0
@@ -2500,7 +2500,7 @@ msgstr ""
#. module: account
#: view:account.analytic.line:0
msgid "Analytic Journal Items related to a sale journal."
-msgstr "Bir satış günlüğüne bağlı Analitik Yevmiye Maddeleri."
+msgstr "Bir satış yevmiyesine bağlı Analitik Yevmiye Maddeleri."
#. module: account
#: selection:account.financial.report,style_overwrite:0
@@ -4719,7 +4719,7 @@ msgid ""
"debit/credit accounts, of type 'situation' and with a centralized "
"counterpart."
msgstr ""
-"Burada en iyi yöntem, her mali yılın açılış girişleri için ayrı günlükleri "
+"Burada en iyi yöntem, her mali yılın açılış girişleri için ayrı yevmiyeleri "
"kullanmaktır. Bu yevmiyeyi tanımlarken öntanımlı borç/alacak hesaplarını, "
"hesap tipi olarak 'situation' ve bir merkezileştirmiş karşılık hesabıyla "
"seçin."
@@ -6105,7 +6105,7 @@ msgstr "Matrah Tutarına Dahil et"
#. module: account
#: field:account.invoice,supplier_invoice_number:0
msgid "Supplier Invoice Number"
-msgstr "Tedarikçi Faturası Numarası"
+msgstr "Tedarikçi Fatura Numarası"
#. module: account
#: help:account.payment.term.line,days:0
@@ -6653,7 +6653,7 @@ msgstr ""
#: field:report.account.sales,period_id:0
#: field:report.account_type.sales,period_id:0
msgid "Force Period"
-msgstr "Dönemi Zorla"
+msgstr "Döneme Zorla"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_form
@@ -7180,7 +7180,7 @@ msgstr "Kullanılmayan bir yevmiye kodu oluşturulamaz."
#. module: account
#: view:account.invoice:0
msgid "force period"
-msgstr "dönemi zorla"
+msgstr "döneme zorla"
#. module: account
#: view:project.account.analytic.line:0
@@ -8095,7 +8095,7 @@ msgstr "Kasa Kalemlerini Kapatma"
#: field:account.move.line,statement_id:0
#: model:process.process,name:account.process_process_statementprocess0
msgid "Statement"
-msgstr "Hesap özeti"
+msgstr "Hesap Özeti"
#. module: account
#: help:account.journal,default_debit_account_id:0
@@ -9759,7 +9759,7 @@ msgstr "Vergi Şablonu"
#. module: account
#: field:account.invoice.refund,period:0
msgid "Force period"
-msgstr "Dönemi zorla"
+msgstr "Döneme zorla"
#. module: account
#: model:ir.model,name:account.model_account_partner_balance
@@ -10847,7 +10847,7 @@ msgstr "Kur Oranı"
#. module: account
#: view:account.config.settings:0
msgid "e.g. sales@openerp.com"
-msgstr "örn. sales@openerp.com"
+msgstr "örn. satis@openerp.com"
#. module: account
#: field:account.account,tax_ids:0
@@ -10879,7 +10879,7 @@ msgstr "Uzlaştırma için Aç"
#. module: account
#: field:account.account,parent_left:0
msgid "Parent Left"
-msgstr "Sol Ana"
+msgstr "Sol Üst"
#. module: account
#: selection:account.financial.report,style_overwrite:0
@@ -11026,7 +11026,7 @@ msgstr "Ayrıntı yok"
#: model:ir.actions.act_window,name:account.action_account_gain_loss
#: model:ir.ui.menu,name:account.menu_unrealized_gains_losses
msgid "Unrealized Gain or Loss"
-msgstr "Gerçekleşmemiş Kazanç ya da Zarar"
+msgstr "Gerçekleşmemiş Kazanç veya Zarar"
#. module: account
#: view:account.move:0
@@ -11189,7 +11189,7 @@ msgstr ""
#. module: account
#: field:account.analytic.balance,empty_acc:0
msgid "Empty Accounts ? "
-msgstr "Hesaplar Boşaltınsın ? "
+msgstr "Boş Hesaplar ? "
#. module: account
#: view:account.unreconcile.reconcile:0
@@ -11643,7 +11643,7 @@ msgstr "Elle Vergi Girilen Fatura"
#: code:addons/account/account_invoice.py:573
#, python-format
msgid "The payment term of supplier does not have a payment term line."
-msgstr "Tedarikçi ödeme koşulunda ödeme koşulu kalemi yok!"
+msgstr "Tedarikçi ödeme koşulunda ödeme koşul kalemi yok."
#. module: account
#: field:account.account,parent_right:0
@@ -11767,7 +11767,7 @@ msgstr "Yevmiye Maddelerini Ara"
#: help:account.tax.template,ref_tax_sign:0
#: help:account.tax.template,tax_sign:0
msgid "Usually 1 or -1."
-msgstr "Genelde 1 veya -1"
+msgstr "Genelde 1 veya -1."
#. module: account
#: model:ir.model,name:account.model_account_fiscal_position_account_template
@@ -11804,8 +11804,8 @@ msgid ""
"The residual amount on a receivable or payable of a journal entry expressed "
"in its currency (maybe different of the company currency)."
msgstr ""
-"Alacak ya da borç hesabına ait bir günlükte bakiye tutarı, kendi para birimi "
-"ile belirtilir (şirket para biriminden farklı olabilir)."
+"Alacak ya da borç hesabına ait bir yevmiyede bakiye tutarı, kendi para "
+"birimi ile belirtilir (şirket para biriminden farklı olabilir)."
#~ msgid "VAT :"
#~ msgstr "KDV :"
diff --git a/addons/account/i18n/zh_CN.po b/addons/account/i18n/zh_CN.po
index f9bfd2dc676..cb47d465615 100644
--- a/addons/account/i18n/zh_CN.po
+++ b/addons/account/i18n/zh_CN.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-01-23 04:15+0000\n"
-"Last-Translator: mrshelly \n"
+"PO-Revision-Date: 2014-03-05 09:26+0000\n"
+"Last-Translator: 盈通 ccdos \n"
"Language-Team: Chinese (Simplified) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-01-24 06:24+0000\n"
-"X-Generator: Launchpad (build 16914)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -312,9 +312,9 @@ msgstr ""
"\n"
" 点击创建一个客户退款. \n"
"
\n"
-" 退款是全部或部分借记销售传票的证明。\n"
+" 退款是全部或部分借记销售发票的证明。\n"
"
\n"
-" 可以直接从与客户相关联的传票直接生成退款,以代替手工创建客户退款。.\n"
+" 可以直接从与客户相关联的发票直接生成退款,以代替手工创建客户退款。.\n"
"
\n"
" "
@@ -838,7 +838,7 @@ msgstr "打印发票"
msgid ""
"Cannot %s invoice which is already reconciled, invoice should be "
"unreconciled first. You can only refund this invoice."
-msgstr "不能 %s 已经核销的发票, 发票必须被首先反核销.。只能退还这张发票。"
+msgstr "不能 %s 已经核销的发票, 发票必须被首先反核销。只能退还这张发票。"
#. module: account
#: view:account.account:0
@@ -1461,7 +1461,7 @@ msgstr "级别"
#: code:addons/account/wizard/account_change_currency.py:38
#, python-format
msgid "You can only change currency for Draft Invoice."
-msgstr "您只能修改发票草稿的货币。"
+msgstr "您只能修改发票草稿的币种。"
#. module: account
#: report:account.invoice:0
@@ -1669,12 +1669,12 @@ msgstr "未执行。"
#. module: account
#: view:account.invoice.refund:0
msgid "Credit Note"
-msgstr "冲销传票"
+msgstr "冲销发票"
#. module: account
#: view:account.config.settings:0
msgid "eInvoicing & Payments"
-msgstr "电子传票和支付"
+msgstr "电子发票和支付"
#. module: account
#: view:account.analytic.cost.ledger.journal.report:0
@@ -1702,7 +1702,7 @@ msgstr "用于仪表盘视图的临时表"
#: model:ir.actions.act_window,name:account.action_invoice_tree4
#: model:ir.ui.menu,name:account.menu_action_invoice_tree4
msgid "Supplier Refunds"
-msgstr "供应商红字传票"
+msgstr "供应商红字发票"
#. module: account
#: report:account.invoice:0
@@ -1911,7 +1911,7 @@ msgstr "15 天"
#. module: account
#: model:ir.ui.menu,name:account.periodical_processing_invoicing
msgid "Invoicing"
-msgstr "开传票"
+msgstr "开发票"
#. module: account
#: code:addons/account/report/account_partner_balance.py:115
@@ -2204,6 +2204,11 @@ msgid ""
"
\n"
" "
msgstr ""
+"点击登记银行对账单\n"
+"银行对账单是一个银行帐户在一定会计期间所发生的全部交易往来的汇总。你可以从银行周期性获得。\n"
+"
\n"
+"OpenERP允许对账单行直接和相关的销售或采购发票进行核销。\n"
+" "
#. module: account
#: field:account.config.settings,currency_id:0
@@ -2485,7 +2490,7 @@ msgstr "检查供应商发票合计"
#: selection:account.invoice.report,state:0
#: selection:report.invoice.created,state:0
msgid "Pro-forma"
-msgstr "形式传票"
+msgstr "形式发票"
#. module: account
#: help:account.account.template,type:0
@@ -2641,7 +2646,7 @@ msgstr "当账目记录有数据时,您将不能把它由关闭状态改变到
#. module: account
#: field:account.invoice.report,account_line_id:0
msgid "Account Line"
-msgstr "传票明细"
+msgstr "发票明细"
#. module: account
#: view:account.addtmpl.wizard:0
@@ -2657,8 +2662,8 @@ msgid ""
"amount greater than the total invoiced amount. In order to avoid rounding "
"issues, the latest line of your payment term must be of type 'balance'."
msgstr ""
-"无法创建传票。\n"
-"相关的支付记录可能未确认核实,因为合计的总额大于传票的开票总额。为避免统计错误,请您确认最新的支付记录都在平衡状态。"
+"无法创建发票。\n"
+"相关的支付记录可能未确认核实,因为合计的总额大于发票的开票总额。为避免统计错误,请您确认最新的支付记录都在平衡状态。"
#. module: account
#: view:account.move:0
@@ -3369,7 +3374,7 @@ msgstr "搜寻会计周期"
#. module: account
#: view:account.change.currency:0
msgid "Invoice Currency"
-msgstr "发票币别"
+msgstr "发票币种"
#. module: account
#: field:accounting.report,account_report_id:0
@@ -4040,7 +4045,7 @@ msgstr "如果您不选择会计期间,它将取所有开启的会计期间"
#. module: account
#: model:ir.model,name:account.model_account_journal_cashbox_line
msgid "account.journal.cashbox.line"
-msgstr ""
+msgstr "account.journal.cashbox.line"
#. module: account
#: model:ir.model,name:account.model_account_partner_reconcile_process
@@ -4215,7 +4220,7 @@ msgstr "应付账"
#: code:addons/account/wizard/account_fiscalyear_close.py:88
#, python-format
msgid "The periods to generate opening entries cannot be found."
-msgstr ""
+msgstr "要生成分录的 会计区间没有找到。"
#. module: account
#: model:process.node,name:account.process_node_supplierpaymentorder0
@@ -4262,7 +4267,7 @@ msgstr "完全税收套账"
#. module: account
#: field:res.partner,last_reconciliation_date:0
msgid "Latest Full Reconciliation Date"
-msgstr ""
+msgstr "最后的完整核销日期"
#. module: account
#: field:account.account,name:0
@@ -4285,7 +4290,7 @@ msgstr "还没有配置好公司"
#. module: account
#: field:res.company,expects_chart_of_accounts:0
msgid "Expects a Chart of Accounts"
-msgstr ""
+msgstr "预计一个会计科目表"
#. module: account
#: field:account.move.line,date:0
@@ -4506,7 +4511,7 @@ msgstr "辅助核算余额"
msgid ""
"This payment term will be used instead of the default one for sale orders "
"and customer invoices"
-msgstr ""
+msgstr "该付款方式将代替销售记录和客户发票的默认值。"
#. module: account
#: view:account.config.settings:0
@@ -4530,7 +4535,7 @@ msgstr "已记账分录明细"
#. module: account
#: field:account.move.line,blocked:0
msgid "No Follow-up"
-msgstr ""
+msgstr "未跟进"
#. module: account
#: view:account.tax.template:0
@@ -4617,6 +4622,8 @@ msgid ""
"Error!\n"
"You cannot create recursive Tax Codes."
msgstr ""
+"错误!\n"
+"你不能循环创建税代码"
#. module: account
#: constraint:account.period:0
@@ -4624,6 +4631,8 @@ msgid ""
"Error!\n"
"The duration of the Period(s) is/are invalid."
msgstr ""
+"错误!\n"
+"这个会计期间的持续时间不合法。"
#. module: account
#: field:account.entries.report,month:0
@@ -4640,7 +4649,7 @@ msgstr "月份"
#: code:addons/account/account.py:668
#, python-format
msgid "You cannot change the code of account which contains journal items!"
-msgstr ""
+msgstr "你不能改变已经包含了账簿项目的 科目代码!"
#. module: account
#: field:account.config.settings,purchase_sequence_prefix:0
@@ -4661,7 +4670,7 @@ msgstr ""
#: view:analytic.entries.report:0
#: field:analytic.entries.report,product_uom_id:0
msgid "Product Unit of Measure"
-msgstr ""
+msgstr "产品计量单位"
#. module: account
#: field:res.company,paypal_account:0
@@ -4716,7 +4725,7 @@ msgstr "税基编码"
#, python-format
msgid ""
"You have to provide an account for the write off/exchange difference entry."
-msgstr ""
+msgstr "你必须提供一个科目来勾销/兑换凭证差异。"
#. module: account
#: help:res.company,paypal_account:0
@@ -4769,7 +4778,7 @@ msgstr "会计年度结账分录"
#. module: account
#: selection:account.move.line,state:0
msgid "Balanced"
-msgstr ""
+msgstr "已平衡"
#. module: account
#: model:process.node,note:account.process_node_importinvoice0
@@ -4782,13 +4791,13 @@ msgstr "发票或付款清单"
msgid ""
"There is currently no company without chart of account. The wizard will "
"therefore not be executed."
-msgstr ""
+msgstr "目前还没有公司缺少科目表。因此,该向导不会被执行。"
#. module: account
#: view:account.move:0
#: view:account.move.line:0
msgid "Add an internal note..."
-msgstr ""
+msgstr "添加一个内部备注"
#. module: account
#: model:ir.actions.act_window,name:account.action_wizard_multi_chart
@@ -4803,7 +4812,7 @@ msgstr "科目一览表"
#. module: account
#: field:account.invoice,reference_type:0
msgid "Payment Reference"
-msgstr ""
+msgstr "付款参考"
#. module: account
#: selection:account.financial.report,style_overwrite:0
@@ -4872,7 +4881,7 @@ msgstr "欠款单据"
#: view:account.move.line:0
#: model:ir.actions.act_window,name:account.action_account_manual_reconcile
msgid "Journal Items to Reconcile"
-msgstr ""
+msgstr "待调整日记账"
#. module: account
#: model:ir.model,name:account.model_account_tax_template
@@ -5816,7 +5825,7 @@ msgstr "税编码"
#: selection:account.invoice.report,type:0
#: selection:report.invoice.created,type:0
msgid "Customer Refund"
-msgstr "客户红字传票"
+msgstr "客户红字发票"
#. module: account
#: field:account.tax,ref_tax_sign:0
@@ -6370,7 +6379,7 @@ msgstr "无"
#: model:ir.actions.act_window,name:account.action_invoice_tree3
#: model:ir.ui.menu,name:account.menu_action_invoice_tree3
msgid "Customer Refunds"
-msgstr "客户红字传票"
+msgstr "客户红字发票"
#. module: account
#: field:account.account,foreign_balance:0
@@ -6876,7 +6885,7 @@ msgstr "你不能修改已经存在凭证的公司帐户。"
#: selection:report.invoice.created,type:0
#, python-format
msgid "Supplier Refund"
-msgstr "供应商红字传票"
+msgstr "供应商红字发票"
#. module: account
#: field:account.bank.statement,move_line_ids:0
@@ -7447,7 +7456,7 @@ msgstr ""
#. module: account
#: model:process.transition,note:account.process_transition_invoicemanually0
msgid "A statement with manual entries becomes a draft statement."
-msgstr "手工输入的传票是草稿状态"
+msgstr "手工输入的发票是草稿状态"
#. module: account
#: view:account.aged.trial.balance:0
@@ -7841,7 +7850,7 @@ msgstr "OPEJ"
#: report:account.invoice:0
#: view:account.invoice:0
msgid "PRO-FORMA"
-msgstr "形式传票"
+msgstr "形式发票"
#. module: account
#: selection:account.entries.report,move_line_state:0
@@ -8464,7 +8473,7 @@ msgstr "如果在计算未来的税前这税额必须包含在税基金额里,
#: code:addons/account/account.py:3196
#, python-format
msgid "Purchase Refund Journal"
-msgstr "采购红字传票账簿"
+msgstr "采购红字发票账簿"
#. module: account
#: code:addons/account/account.py:1333
@@ -8775,7 +8784,7 @@ msgstr "关闭一个会计年度"
#. module: account
#: field:account.invoice.refund,journal_id:0
msgid "Refund Journal"
-msgstr "红字传票账簿"
+msgstr "红字发票账簿"
#. module: account
#: report:account.account.balance:0
@@ -9019,7 +9028,7 @@ msgstr ""
#. module: account
#: model:res.groups,name:account.group_account_invoice
msgid "Invoicing & Payments"
-msgstr "传票与付款"
+msgstr "发票与付款"
#. module: account
#: help:account.invoice,internal_number:0
@@ -9264,7 +9273,7 @@ msgstr ""
#: code:addons/account/account.py:3195
#, python-format
msgid "Sales Refund Journal"
-msgstr "销售红字传票账簿"
+msgstr "销售红字发票账簿"
#. module: account
#: view:account.move:0
diff --git a/addons/crm/i18n/ja.po b/addons/crm/i18n/ja.po
index d1f2589cb21..629e5b211fc 100644
--- a/addons/crm/i18n/ja.po
+++ b/addons/crm/i18n/ja.po
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-01-07 16:56+0000\n"
-"PO-Revision-Date: 2014-03-04 04:18+0000\n"
+"PO-Revision-Date: 2014-03-05 21:13+0000\n"
"Last-Translator: hiro TAKADA \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-04 08:26+0000\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: crm
@@ -1594,6 +1594,8 @@ msgid ""
"stage. For example, if a stage is related to the status 'Close', when your "
"document reaches this stage, it is automatically closed."
msgstr ""
+"選択されたステージに関する文書のステータスは自動で変更されます。例えば、ステージが「閉じる」に関連する場合、このステージに到達すると文書は自動で閉じられま"
+"す。"
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
diff --git a/addons/product/i18n/hr.po b/addons/product/i18n/hr.po
index 460262c9a91..bef6ae8b744 100644
--- a/addons/product/i18n/hr.po
+++ b/addons/product/i18n/hr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2014-02-20 11:43+0000\n"
-"Last-Translator: Mihael Murkovic \n"
+"PO-Revision-Date: 2014-03-05 10:27+0000\n"
+"Last-Translator: Marko Carevic \n"
"Language-Team: Croatian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-21 06:38+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: product
#: field:product.packaging,rows:0
@@ -735,7 +735,7 @@ msgstr ""
#. module: product
#: field:product.product,qty_available:0
msgid "Quantity On Hand"
-msgstr "Količina na raspolaganju"
+msgstr "Fizička zaliha"
#. module: product
#: field:product.price.type,name:0
diff --git a/addons/project/i18n/tr.po b/addons/project/i18n/tr.po
index b870b882b68..86516d2b90b 100644
--- a/addons/project/i18n/tr.po
+++ b/addons/project/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-28 21:53+0000\n"
+"PO-Revision-Date: 2014-03-05 10:43+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-29 05:30+0000\n"
-"X-Generator: Launchpad (build 16847)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: project
#: view:project.project:0
@@ -46,12 +46,12 @@ msgstr "Yetkiye göre görev"
#. module: project
#: view:project.project:0
msgid "Parent"
-msgstr "Ana"
+msgstr "Üst"
#. module: project
#: model:ir.actions.act_window,name:project.dblc_proj
msgid "Project's tasks"
-msgstr "Projedeki görevler"
+msgstr "Proje görevleri"
#. module: project
#: field:project.task.type,name:0
@@ -77,7 +77,7 @@ msgstr "Gün"
#. module: project
#: model:project.task.type,name:project.project_tt_merge
msgid "Merge"
-msgstr "Birleştir"
+msgstr "Birleştirme"
#. module: project
#: view:res.partner:0
@@ -114,7 +114,7 @@ msgstr "Yanlış"
#. module: project
#: model:project.task.type,name:project.project_tt_testing
msgid "Testing"
-msgstr "Deneniyor"
+msgstr "Test"
#. module: project
#: model:ir.model,name:project.model_account_analytic_account
@@ -146,12 +146,12 @@ msgstr "Uyarı!"
#. module: project
#: model:ir.model,name:project.model_res_partner
msgid "Partner"
-msgstr "Partner"
+msgstr "İş Ortağı"
#. module: project
#: field:project.config.settings,group_manage_delegation_task:0
msgid "Allow task delegation"
-msgstr "Görev delegasyonu izinverme"
+msgstr "Görev delegasyonu izin verme"
#. module: project
#: field:project.task.delegate,planned_hours:0
@@ -277,7 +277,7 @@ msgstr "Proje Yönetimi"
#: model:ir.actions.act_window,name:project.action_project_task_delegate
#: view:project.task.delegate:0
msgid "Project Task Delegate"
-msgstr "Prtoje Görevi Yetkilndirme"
+msgstr "Proje Görevi Yetkilndirme"
#. module: project
#: model:mail.message.subtype,name:project.mt_project_task_started
@@ -398,7 +398,7 @@ msgstr ""
#: view:project.task:0
#: view:project.task.history.cumulative:0
msgid "In Progress Tasks"
-msgstr "DevamEden Görevler"
+msgstr "Devam Eden Görevler"
#. module: project
#: help:res.company,project_time_mode_id:0
@@ -438,7 +438,7 @@ msgstr "Proje Yöneticisi"
#: selection:project.task.type,state:0
#: selection:report.project.task.user,state:0
msgid "In Progress"
-msgstr "DevamEden"
+msgstr "Devam Eden"
#. module: project
#: view:project.task:0
@@ -479,7 +479,7 @@ msgstr "Mesai saatlerinizi giriniz."
#. module: project
#: field:project.project,alias_id:0
msgid "Alias"
-msgstr "TakmaAd"
+msgstr "Rumuz"
#. module: project
#: view:project.task:0
@@ -651,7 +651,7 @@ msgstr "Şablon Görev Değil"
#. module: project
#: field:project.task,planned_hours:0
msgid "Initially Planned Hours"
-msgstr "Başlangıçta Planlanan Saat"
+msgstr "İlk Planlanan Saatler"
#. module: project
#: model:process.transition,note:project.process_transition_delegate0
@@ -708,7 +708,7 @@ msgstr "Planlama"
#: field:project.task,date_deadline:0
#: field:report.project.task.user,date_deadline:0
msgid "Deadline"
-msgstr "ZamanSınırı"
+msgstr "Zaman Sınırı"
#. module: project
#: view:project.task.history.cumulative:0
@@ -736,7 +736,7 @@ msgstr "Son Tarih"
#. module: project
#: model:project.task.type,name:project.project_tt_specification
msgid "Specification"
-msgstr "Özellikler"
+msgstr "Tanımlama"
#. module: project
#: model:process.transition,note:project.process_transition_draftopentask0
@@ -757,7 +757,7 @@ msgstr "Yeni Görev Tanımı"
#. module: project
#: field:report.project.task.user,delay_endings_days:0
msgid "Overpassed Deadline"
-msgstr "ZamanSınırını Aşan"
+msgstr "Zaman Sınırını Aşan"
#. module: project
#: view:report.project.task.user:0
@@ -827,7 +827,7 @@ msgstr "Sil"
#. module: project
#: view:report.project.task.user:0
msgid "In progress"
-msgstr "DevamEden"
+msgstr "Devam Eden"
#. module: project
#: selection:report.project.task.user,month:0
@@ -896,7 +896,7 @@ msgstr "Bir İzleyicidir"
#. module: project
#: field:project.task,work_ids:0
msgid "Work done"
-msgstr "Biten iş"
+msgstr "Biten çalışma"
#. module: project
#: view:report.project.task.user:0
@@ -1114,7 +1114,7 @@ msgstr "Onay Durumu"
#. module: project
#: field:project.task.work,name:0
msgid "Work summary"
-msgstr "İş Özeti"
+msgstr "Çlaışma Özeti"
#. module: project
#: view:project.project:0
@@ -1427,7 +1427,7 @@ msgstr "Düşük"
#. module: project
#: selection:project.project,state:0
msgid "Closed"
-msgstr "Kapandı"
+msgstr "Kapanan"
#. module: project
#: view:project.project:0
@@ -1523,7 +1523,7 @@ msgstr ""
#: code:addons/project/project.py:230
#, python-format
msgid "Attachments"
-msgstr "Ekkler"
+msgstr "Ekler"
#. module: project
#: view:project.category:0
@@ -1545,7 +1545,7 @@ msgstr ""
#: model:process.transition.action,name:project.process_transition_action_draftopentask0
#: view:project.project:0
msgid "Open"
-msgstr "Aç"
+msgstr "Açık"
#. module: project
#: field:project.project,privacy_visibility:0
@@ -1700,7 +1700,7 @@ msgstr ""
#. module: project
#: view:project.task:0
msgid "Deadlines"
-msgstr "ZamanSınırı"
+msgstr "Zaman Sınırı"
#. module: project
#: code:addons/project/wizard/project_task_delegate.py:69
@@ -2029,7 +2029,7 @@ msgstr ""
#. module: project
#: model:project.category,name:project.project_category_03
msgid "Experiment"
-msgstr "Deneyi"
+msgstr "Deneme"
#. module: project
#: model:process.transition.action,name:project.process_transition_action_opendrafttask0
@@ -2235,7 +2235,7 @@ msgstr "Sıralama"
#: view:project.task:0
#: view:project.task.work:0
msgid "Task Work"
-msgstr "Görev İşi"
+msgstr "Görev Çalışma"
#. module: project
#: help:project.task.delegate,planned_hours_me:0
diff --git a/addons/purchase/i18n/mn.po b/addons/purchase/i18n/mn.po
index 39e791f1446..8e0bb3ef3e9 100644
--- a/addons/purchase/i18n/mn.po
+++ b/addons/purchase/i18n/mn.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-02-01 12:16+0000\n"
-"Last-Translator: gobi \n"
+"PO-Revision-Date: 2014-03-05 06:20+0000\n"
+"Last-Translator: Jacara \n"
"Language-Team: Mongolian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-02 06:00+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: purchase
#: model:res.groups,name:purchase.group_analytic_accounting
@@ -613,7 +613,8 @@ msgstr "Нийлүүлэгч"
#: code:addons/purchase/purchase.py:527
#, python-format
msgid "Define expense account for this company: \"%s\" (id:%d)."
-msgstr "Энэ компанийн дансны зардлыг тодоройлох: \"%s\" (id:%d)"
+msgstr ""
+"Энэ компанид бараа материалын данс тодорхойлогдоогүй байна: \"%s\" (id:%d)"
#. module: purchase
#: model:process.transition,name:purchase.process_transition_packinginvoice0
diff --git a/addons/purchase/i18n/tr.po b/addons/purchase/i18n/tr.po
index f21e83d14dc..672866e64e8 100644
--- a/addons/purchase/i18n/tr.po
+++ b/addons/purchase/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-24 13:48+0000\n"
+"PO-Revision-Date: 2014-03-05 10:43+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-25 06:01+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: purchase
#: model:res.groups,name:purchase.group_analytic_accounting
@@ -489,7 +489,7 @@ msgstr "Para Birimi"
#. module: purchase
#: field:purchase.order,journal_id:0
msgid "Journal"
-msgstr "Günlük"
+msgstr "Yevmiye"
#. module: purchase
#: view:board.board:0
@@ -909,7 +909,7 @@ msgstr "Bir İzleyicidir"
#: model:ir.actions.act_window,name:purchase.action_purchase_order_report_graph
#: view:purchase.report:0
msgid "Total Qty and Amount by month"
-msgstr "Aylık Toplam Mik ve Tutar"
+msgstr "Aylık Toplam Miktar ve Tutar"
#. module: purchase
#: view:purchase.report:0
@@ -965,7 +965,7 @@ msgstr "Satınalma"
#: view:purchase.report:0
#: field:purchase.report,delay:0
msgid "Days to Validate"
-msgstr "Doğrulanacak Günler"
+msgstr "Doğrulama Günler"
#. module: purchase
#: view:purchase.config.settings:0
@@ -1485,7 +1485,7 @@ msgstr "Satınalma Sipariş Kalemlerinden"
#. module: purchase
#: report:purchase.quotation:0
msgid "TVA:"
-msgstr "TVA:"
+msgstr "KDV:"
#. module: purchase
#: help:purchase.order,picking_ids:0
diff --git a/addons/purchase/i18n/zh_CN.po b/addons/purchase/i18n/zh_CN.po
index a8fbb2196ab..9cc7c18b45d 100644
--- a/addons/purchase/i18n/zh_CN.po
+++ b/addons/purchase/i18n/zh_CN.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-07 02:09+0000\n"
-"Last-Translator: 盈通 ccdos \n"
+"PO-Revision-Date: 2014-03-05 09:15+0000\n"
+"Last-Translator: mrshelly \n"
"Language-Team: Chinese (Simplified) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 06:31+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:15+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: purchase
#: model:res.groups,name:purchase.group_analytic_accounting
@@ -1291,7 +1291,7 @@ msgstr "3月"
#. module: purchase
#: view:purchase.order:0
msgid "Receive Invoice"
-msgstr "接收传票"
+msgstr "接收发票"
#. module: purchase
#: view:purchase.order:0
@@ -1599,7 +1599,7 @@ msgstr ""
#. module: purchase
#: field:purchase.order,invoiced:0
msgid "Invoice Received"
-msgstr "已收传票"
+msgstr "已收发票"
#. module: purchase
#: field:purchase.order,invoice_method:0
@@ -2176,6 +2176,81 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"\n"
+"\n"
+"
敬启 ${object.partner_id.name} :
\n"
+" \n"
+"
您有一张 ${object.company_id.name} 公司的采购单 ${object.state in ('draft', "
+"'sent') and '需询价' or '需确认'} :
\n"
+" \n"
+"
\n"
+" 相关单据数据 \n"
+" 采购单号: ${object.name} \n"
+" 总金额: ${object.amount_total} "
+"${object.pricelist_id.currency_id.name} \n"
+" 采购日期: ${object.date_order} \n"
+" % if object.origin:\n"
+" 单据参考: ${object.origin} \n"
+" % endif\n"
+" % if object.partner_ref:\n"
+" 贵司参考: ${object.partner_ref} \n"
+" % endif\n"
+" % if object.validator:\n"
+" 贵司相关人员: ${object.validator.name} \n"
+" % endif\n"
+"
\n"
+"\n"
+"
\n"
+"
如还有其他疑问,请及时联系我们。
\n"
+"
谢谢
\n"
+"
\n"
+"
\n"
+"
\n"
+"
\n"
+" ${object.company_id.name} \n"
+" \n"
+"
\n"
+"
\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street} \n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2} \n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city} \n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''} \n"
+" % endif\n"
+" \n"
+" % if object.company_id.phone:\n"
+"
\n"
+" TEL: ${object.company_id.phone}\n"
+"
\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+"
\n"
+" %endif\n"
+"
\n"
+"
\n"
+"
\n"
+" "
#. module: purchase
#: selection:purchase.report,month:0
diff --git a/addons/sale/i18n/tr.po b/addons/sale/i18n/tr.po
index 1214426685e..814cea821c9 100644
--- a/addons/sale/i18n/tr.po
+++ b/addons/sale/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-28 21:02+0000\n"
+"PO-Revision-Date: 2014-03-05 10:43+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-29 05:30+0000\n"
-"X-Generator: Launchpad (build 16847)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:15+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: sale
#: model:ir.model,name:sale.model_account_config_settings
@@ -501,8 +501,8 @@ msgid ""
"The salesman confirms the quotation. The state of the sales order becomes "
"'In progress' or 'Manual in progress'."
msgstr ""
-"Satış temsilcisi teklifi onaylıyor. Satış Siparişinin durumu \"Sürüyor\" ya "
-"da \"Elle işlem sürüyor\" olur."
+"Satış temsilcisi teklifi onaylıyor. Satış Siparişinin durumu 'Sürüyor' ya da "
+"'Elle işlem sürüyor' olur."
#. module: sale
#: view:sale.order.line:0
@@ -692,7 +692,7 @@ msgstr "Sipariş N°"
#: view:sale.order:0
#: field:sale.order,order_line:0
msgid "Order Lines"
-msgstr "Sipariş Kalemleri"
+msgstr "Sipariş Satırları"
#. module: sale
#: field:account.config.settings,module_sale_analytic_plans:0
@@ -707,9 +707,9 @@ msgid ""
" and perform batch operations on journals.\n"
" This installs the module sale_journal."
msgstr ""
-"Satışlarınızı ve teslimatlarınızı (toplama listeleri) değişik günlükler "
+"Satışlarınızı ve teslimatlarınızı (seçim listeleri) değişik yevmiyeler "
"arasında sınıflandırmanızı sağlar,\n"
-" günlükler üzerin toplu işlemler yürütür.\n"
+" yevmiyeler üzerin toplu işlemler yürütür.\n"
" Bu, sale_journal modülünü kurar."
#. module: sale
@@ -1013,7 +1013,7 @@ msgstr "Mik"
#. module: sale
#: view:sale.order.line:0
msgid "My Sales Order Lines"
-msgstr "Satış Siparişi Kalemlerim"
+msgstr "Satış Siparişi Satırları"
#. module: sale
#: model:process.transition.action,name:sale.process_transition_action_cancel0
@@ -1070,8 +1070,8 @@ msgid ""
"${object.company_id.name} ${object.state in ('draft', 'sent') and "
"'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })"
msgstr ""
-"${object.company_id.name} ${object.state in ('draft', 'sent') and "
-"'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })"
+"${object.company_id.name} ${object.state in ('draft', 'sent') and 'Teklif' "
+"or 'Sipariş'} (Ref ${object.name or 'n/a' })"
#. module: sale
#: report:sale.order:0
@@ -1147,7 +1147,7 @@ msgstr "Teklifin Yeni Kopyası"
#. module: sale
#: field:res.partner,sale_order_count:0
msgid "# of Sales Order"
-msgstr "Satış Siparişi sayısı"
+msgstr "# Satış Siparişi"
#. module: sale
#: code:addons/sale/sale.py:983
@@ -1202,7 +1202,7 @@ msgstr "Faturalanacak Sipariş Kalemleri"
#: view:sale.order.line:0
#: view:sale.report:0
msgid "Group By..."
-msgstr "Gruplandır..."
+msgstr "Gruplandır İle..."
#. module: sale
#: view:sale.config.settings:0
@@ -1417,7 +1417,7 @@ msgstr "Tedarik ve faturalamayı yürütür"
#. module: sale
#: field:sale.order,invoiced:0
msgid "Paid"
-msgstr "Ödenmiş"
+msgstr "Ödenmdi"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_report_all
@@ -1533,7 +1533,7 @@ msgstr "Yapılacaklar"
#. module: sale
#: view:sale.advance.payment.inv:0
msgid "Invoice Sales Order"
-msgstr "Satış Siparişi faturala"
+msgstr "Satış Siparişi Faturala"
#. module: sale
#: help:sale.order,amount_untaxed:0
@@ -1640,7 +1640,7 @@ msgstr ""
" Sayın ${object.partner_id.name},
\n"
" \n"
" Firmamız ${object.company_id.name}nden istemiş olduğunuz "
-"${object.state in ('draft', 'sent') and 'teklif' or 'Sipariş doğrulama'} "
+"${object.state in ('draft', 'sent') and 'Teklif' or 'Sipariş doğrulama'} "
"aşağıdadır:
\n"
"\n"
" \n"
@@ -1855,7 +1855,7 @@ msgstr "Satış Paneli"
#. module: sale
#: view:sale.order.line:0
msgid "Sales Order Lines that are in 'done' state"
-msgstr "'tamamlandı' durumunda Satış Siparişi Kalemleri"
+msgstr "'biten' durumunda Satış Siparişi Kalemleri"
#. module: sale
#: help:sale.config.settings,module_account_analytic_analysis:0
@@ -2024,7 +2024,7 @@ msgstr "Onay Tarihi"
#: code:addons/sale/sale.py:364
#, python-format
msgid "Please define sales journal for this company: \"%s\" (id:%d)."
-msgstr "Bu şirket için lütfen satış günlüğü oluşturun: \"%s\" (id:%d)."
+msgstr "Bu şirket için lütfen satış yevmiyesi oluşturun: \"%s\" (id:%d)."
#. module: sale
#: view:sale.config.settings:0
@@ -2080,14 +2080,14 @@ msgstr "İzleyiciler"
#. module: sale
#: field:sale.order.line,invoice_lines:0
msgid "Invoice Lines"
-msgstr "Fatura Kalemleri"
+msgstr "Fatura Satırları"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_line_product_tree
#: view:sale.order:0
#: view:sale.order.line:0
msgid "Sales Order Lines"
-msgstr "Satış Siparişi Kalemleri"
+msgstr "Satış Siparişi Satırları"
#. module: sale
#: view:sale.config.settings:0
@@ -2228,7 +2228,7 @@ msgid ""
"yet been invoiced"
msgstr ""
"Onaylı, yapıldı ya da istisna durumundaki ve henüz faturalanmamış Satış "
-"Siparişi Kalemleri"
+"Siparişi Satırları"
#. module: sale
#: selection:sale.report,month:0
@@ -2279,7 +2279,7 @@ msgstr "Sipariş Durumu"
#. module: sale
#: view:sale.advance.payment.inv:0
msgid "Show Lines to Invoice"
-msgstr "Faturalanacak Kalemleri Göster"
+msgstr "Faturalanacak Satırları Göster"
#. module: sale
#: field:sale.report,date:0
@@ -2433,7 +2433,7 @@ msgstr "Teklif N°"
#. module: sale
#: view:sale.report:0
msgid "Picked"
-msgstr "Toplanmış"
+msgstr "Seçilmiş"
#. module: sale
#: view:sale.report:0
diff --git a/addons/stock/i18n/hr.po b/addons/stock/i18n/hr.po
index 9c3847cb5cd..7e484eca201 100644
--- a/addons/stock/i18n/hr.po
+++ b/addons/stock/i18n/hr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2013-11-09 12:14+0000\n"
-"Last-Translator: Dejan Radočaj \n"
+"PO-Revision-Date: 2014-03-05 10:52+0000\n"
+"Last-Translator: Marko Carevic \n"
"Language-Team: Croatian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-07 07:12+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:15+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -778,7 +778,7 @@ msgstr "Additional Reference"
#. module: stock
#: view:stock.partial.picking.line:0
msgid "Stock Picking Line"
-msgstr "Stavka primke"
+msgstr "Stavka skladišnog dokumenta"
#. module: stock
#: field:stock.location,complete_name:0
@@ -1063,7 +1063,7 @@ msgstr "Budući P&L"
#: model:ir.ui.menu,name:stock.menu_action_picking_tree4
#: view:stock.picking.in:0
msgid "Incoming Shipments"
-msgstr "Primke"
+msgstr "Pošiljke u dolasku"
#. module: stock
#: help:stock.picking,date:0
@@ -3322,10 +3322,10 @@ msgid ""
" "
msgstr ""
"\n"
-" Pritisnite za kreiranje primke ovog proizvoda. \n"
+" Pritisnite za kreiranje prijema ovog proizvoda. \n"
"
\n"
-" Ovjde možete pronaći povijest svih primki povezanih sa\n"
-" ovim proizvodom, kao i sve buduće primke koje očekujete\n"
+" Ovjde možete pronaći povijest svih prijema povezanih sa\n"
+" ovim proizvodom, kao i sve buduće prijeme koje očekujete\n"
" od Vaših dobavljača.\n"
"
\n"
" "
@@ -3954,7 +3954,7 @@ msgstr "Datumi inventura"
#: model:ir.actions.act_window,name:stock.action_receive_move
#: view:product.product:0
msgid "Receptions"
-msgstr "Primke"
+msgstr "Prijemi"
#. module: stock
#: view:report.stock.move:0
diff --git a/addons/stock/i18n/nl.po b/addons/stock/i18n/nl.po
index dd1fd985b06..f68f714f3a6 100644
--- a/addons/stock/i18n/nl.po
+++ b/addons/stock/i18n/nl.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2014-02-25 17:48+0000\n"
+"PO-Revision-Date: 2014-03-04 13:05+0000\n"
"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n"
"Language-Team: Dutch \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-26 07:31+0000\n"
-"X-Generator: Launchpad (build 16935)\n"
+"X-Launchpad-Export-Date: 2014-03-05 05:57+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -92,7 +92,7 @@ msgstr "Terug traceren"
#: field:stock.picking.in,date_done:0
#: field:stock.picking.out,date_done:0
msgid "Date of Transfer"
-msgstr "Datum van verzending"
+msgstr "Datum van verplaatsing"
#. module: stock
#: field:product.product,track_outgoing:0
@@ -1122,7 +1122,7 @@ msgstr "Details"
#. module: stock
#: selection:stock.picking,state:0
msgid "Ready to Transfer"
-msgstr "Beschikbaar"
+msgstr "Gereed voor verplaatsing"
#. module: stock
#: report:lot.stock.overview:0
@@ -2113,7 +2113,7 @@ msgstr "Geleverd aantal"
#. module: stock
#: view:stock.partial.picking:0
msgid "Transfer Products"
-msgstr "Verzend producten"
+msgstr "Verplaats producten"
#. module: stock
#: help:product.template,property_stock_account_output:0
@@ -2166,8 +2166,8 @@ msgstr ""
" * Wachten op beschikbaarheid: Nog wachtend op de beschikbaarheid "
"van de producten\n"
"\n"
-" * Gereed voor leveren: Producten zijn gereserveerd, wachtend op "
-"bevestiging\n"
+" * Gereed voor verplaatsing: Producten zijn gereserveerd, "
+"wachtend op bevestiging\n"
"\n"
" * Verwerkt: Is verwerkt, kan niet meer worden aangepast of "
"worden geannuleerd \n"
@@ -2729,7 +2729,7 @@ msgstr "Partijen"
#. module: stock
#: view:stock.partial.picking:0
msgid "_Transfer"
-msgstr "_Doorverbinden"
+msgstr "_Verplaatsen"
#. module: stock
#: selection:report.stock.move,type:0
@@ -3064,7 +3064,7 @@ msgstr "Voorraad rapport per partijnummer"
#. module: stock
#: view:stock.picking:0
msgid "Cancel Transfer"
-msgstr "Transfer annuleren"
+msgstr "Verplaatsing annuleren"
#. module: stock
#: selection:report.stock.inventory,month:0
diff --git a/addons/stock/i18n/tr.po b/addons/stock/i18n/tr.po
index d2de2024929..ac0bbd6899f 100644
--- a/addons/stock/i18n/tr.po
+++ b/addons/stock/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2013-11-30 14:39+0000\n"
+"PO-Revision-Date: 2014-03-05 10:43+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-07 07:12+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:15+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -40,7 +40,7 @@ msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_move_split_lines
msgid "Stock move Split lines"
-msgstr "Stok hareketi Bölünmüş satırları"
+msgstr "Stok hareketi Bölünmüş Satırları"
#. module: stock
#: help:product.category,property_stock_account_input_categ:0
@@ -52,7 +52,7 @@ msgid ""
"product"
msgstr ""
"Gerçek-zamanlı envanter değerlendirmesi yaparken, gelen tüm stokların "
-"hareketlerine karşılık gelen ait öğe günlükleri bu hesaba işlenecektir, "
+"hareketlerine karşılık gelen ait öğe yevmiyeleri bu hesaba işlenecektir, "
"kaynak konumda özel bir değerlendirme hesabı yoksa. Bu kategorideki ürünler "
"için bu varsayılan değerdir. Her ürüne doğrudan da ayarlanabilir."
@@ -169,7 +169,7 @@ msgstr "Seçim listesi"
#. module: stock
#: view:stock.inventory:0
msgid "e.g. Annual inventory"
-msgstr "Yıllık Sayım"
+msgstr "örn. Yıllık Sayım"
#. module: stock
#: report:lot.stock.overview:0
@@ -387,7 +387,7 @@ msgstr "Uyarı!"
#. module: stock
#: field:stock.invoice.onshipping,group:0
msgid "Group by partner"
-msgstr "Grupla partner ile"
+msgstr "Grupla iş ortağı ile"
#. module: stock
#: help:stock.picking,move_type:0
@@ -407,7 +407,7 @@ msgstr "Aynı anda kısmen veya tüm teslim edilecek malların belirtir"
#: field:stock.picking.in,partner_id:0
#: field:stock.picking.out,partner_id:0
msgid "Partner"
-msgstr "Partner"
+msgstr "İş Ortağı"
#. module: stock
#: field:stock.config.settings,module_claim_from_delivery:0
@@ -800,7 +800,7 @@ msgstr "İşlenmiş Envanterler"
#. module: stock
#: field:stock.move.split.lines,wizard_exist_id:0
msgid "Parent Wizard (for existing lines)"
-msgstr "Ana Sihirbaz (varolan satırlar için="
+msgstr "Ana Sihirbaz (varolan satırlar için)"
#. module: stock
#: view:report.stock.move:0
@@ -893,7 +893,7 @@ msgstr "Tedarik Konumu"
#. module: stock
#: view:stock.picking:0
msgid "e.g. PO0032"
-msgstr "e.g. PO0032"
+msgstr "örn. PO0032"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_location_tree
@@ -1177,7 +1177,7 @@ msgstr "Kabule Hazır"
#. module: stock
#: field:report.stock.move,day_diff:0
msgid "Execution Lead Time (Days)"
-msgstr "İcra Tamamlama Süresi (Gün)"
+msgstr "Uygulama Tamamlama Süresi (Gün)"
#. module: stock
#: model:ir.model,name:stock.model_stock_partial_move
@@ -1397,7 +1397,7 @@ msgid ""
"In order to cancel this inventory, you must first unpost related journal "
"entries."
msgstr ""
-"Bu envanteri silmek için önce ilişkili günlük girişlerinin işlenmesini "
+"Bu envanteri silmek için önce ilişkili yevmiye girişlerinin işlenmesini "
"kaldırmalısınız."
#. module: stock
@@ -1534,11 +1534,11 @@ msgid ""
" "
msgstr ""
"\n"
-" Yeni bir günlük oluşturmak için tıklayın. \n"
+" Yeni bir yevmiye oluşturmak için tıklayın. \n"
"
\n"
-" Stok günlük sistemi her stok hareketini, yürütülecek \n"
+" Stok yevmiye sistemi her stok hareketini, yürütülecek \n"
" işlemin ya da bu işlemi yürütecek işçi/takım türüne \n"
-" göre belirli bir günlüğe atar. Stok günlüğü örnekleri \n"
+" göre belirli bir yevmiyeye atar. Stok yevmiyesi örnekleri \n"
" şunlar olabilir: kalite kontrol, toplama listeleri,\n"
" paketleme, vb..\n"
"\n"
@@ -1983,7 +1983,7 @@ msgstr "Stok Değerleme Hesabı (Çıkan)"
#: code:addons/stock/stock.py:1805
#, python-format
msgid "Operation Forbidden!"
-msgstr ""
+msgstr "Operasyon Yasak!"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_move_form2
@@ -2355,7 +2355,7 @@ msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for goods you receive from the current partner"
msgstr ""
-"Mevcut ortaktan aldığınız malların kaynak lkonumu olarak varsayılan yerine "
+"Mevcut iş ortaktan aldığınız malların kaynak konumu olarak varsayılan yerine "
"bu stok konumu kullanılacaktır"
#. module: stock
@@ -2792,7 +2792,7 @@ msgid ""
"Cannot create Journal Entry, Output Account of this product and Valuation "
"account on category of this product are same."
msgstr ""
-"Günlük Kaydı oluşturulamıyor, Bu ürünün Çıkış Hesabı ve bu ürünün "
+"Yevmiye Kaydı oluşturulamıyor, Bu ürünün Çıkış Hesabı ve bu ürünün "
"kategorisindeki Değerleme hesabı aynıdır."
#. module: stock
@@ -2976,8 +2976,8 @@ msgid ""
"Cannot create Journal Entry, Input Account of this product and Valuation "
"account on category of this product are same."
msgstr ""
-"Günlük Kaydı oluşturulamıyor, Bu ürünün Giriş Hesabı ve bu ürünün "
-"kategorisindeki Değerleme hesabı aynıdır."
+"Yevmiye Kaydı oluşturulamıyor, Bu ürünün Giriş Hesabı ve bu ürünün "
+"kategorisindeki değerleme hesabı aynıdır."
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_unit_measure_stock
@@ -3895,6 +3895,9 @@ msgid ""
"would let a quantity of \"%s %s\" to ship and only rounding of \"%s %s\" is "
"accepted by the uom."
msgstr ""
+"İlk UOM ve yuvarlama size sevk izin vermez \"%s %s\", olarakbir miktar bir "
+"izin istiyorsanız \"%s %s\" sevk ve sadece yuvarlama için \"%s %s\" olarak "
+"UOM tarafından kabuledilir."
#. module: stock
#: model:stock.location,name:stock.stock_location_intermediatelocation0
@@ -4140,7 +4143,7 @@ msgid ""
"on each product"
msgstr ""
"Gerçek-zamanlı envanter değerlemesi yaparken, hedef konuma özel bir "
-"değerleme hesabı ayarlanmadıkça, çıkan tüm stok hareketlerinin günlük "
+"değerleme hesabı ayarlanmadıkça, çıkan tüm stok hareketlerinin yevmiye "
"öğeleri bu hesaba işlenecektir. Bu, bu kategorideki tüm ürünler için "
"varsayılan değerdir. Aynı zamanda her ürünü de doğrudan ayarlanabilir."
@@ -4218,7 +4221,7 @@ msgstr "Onaylanmış Teslimat Siparişleri"
#: field:stock.partial.move,picking_id:0
#: field:stock.partial.picking,picking_id:0
msgid "Picking"
-msgstr "SeçimListesi"
+msgstr "Seçim Listesi"
#. module: stock
#: code:addons/stock/wizard/stock_invoice_onshipping.py:96
@@ -4292,7 +4295,7 @@ msgstr "Seri Numarası Revizyonları"
#: code:addons/stock/stock.py:1134
#, python-format
msgid "Error, no partner!"
-msgstr ""
+msgstr "Hata, hiç iş ortağı yok!"
#. module: stock
#: view:stock.picking:0
@@ -4937,7 +4940,7 @@ msgstr "Önek"
#: view:stock.move:0
#: view:stock.move.split:0
msgid "Split in Serial Numbers"
-msgstr "Seri Numaralarına Göre ayır"
+msgstr "Seri Numaralarına Göre Ayır"
#. module: stock
#: help:product.template,property_stock_account_input:0
@@ -4948,7 +4951,7 @@ msgid ""
"product, the one from the product category is used."
msgstr ""
"Gerçek zamanlı envanter değerlemesi yaparken, gelen bütün stok "
-"hareketlerinin karşıt günlük maddeleri, kaynak konumda özel bir değerleme "
+"hareketlerinin karşıt yevmiye maddeleri, kaynak konumda özel bir değerleme "
"hesabı tanımlanıncaya kadar bu hesaba işlenecektir. Ürüne tanımlanmamışsa, "
"ürün kategorisinden bir tane kullanılır."
diff --git a/openerp/addons/base/i18n/ja.po b/openerp/addons/base/i18n/ja.po
index 1200d4268b9..9d276888ff4 100644
--- a/openerp/addons/base/i18n/ja.po
+++ b/openerp/addons/base/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:35+0000\n"
-"PO-Revision-Date: 2014-02-25 09:21+0000\n"
+"PO-Revision-Date: 2014-03-06 05:23+0000\n"
"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-26 07:30+0000\n"
-"X-Generator: Launchpad (build 16935)\n"
+"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -458,7 +458,7 @@ msgstr ""
#: field:ir.model.data,date_update:0
#: field:ir.model.relation,date_update:0
msgid "Update Date"
-msgstr "日付の更新"
+msgstr "更新日"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_action_rule
@@ -4705,7 +4705,7 @@ msgstr "スペイン語(ホンジュラス)/ Español (HN)"
#. module: base
#: view:ir.sequence.type:0
msgid "Sequence Type"
-msgstr "順序タイプ"
+msgstr "付番タイプ"
#. module: base
#: view:base.language.export:0
@@ -5277,7 +5277,7 @@ msgstr "銀行口座タイプ"
#. module: base
#: help:ir.sequence,suffix:0
msgid "Suffix value of the record for the sequence"
-msgstr "順序のためのレコードのサフィックス値"
+msgstr "この付番定義でレコードに適用するサフィックス値"
#. module: base
#: help:ir.mail_server,smtp_user:0
@@ -6276,7 +6276,7 @@ msgstr "ショートカット"
#. module: base
#: field:ir.model.data,date_init:0
msgid "Init Date"
-msgstr "整数データ"
+msgstr "作成日"
#. module: base
#: selection:base.language.install,lang:0
@@ -7796,7 +7796,7 @@ msgstr ""
#. module: base
#: help:ir.sequence,number_next:0
msgid "Next number of this sequence"
-msgstr "この順序の次の番号"
+msgstr "この付番定義の次の番号"
#. module: base
#: view:res.partner:0
@@ -10399,7 +10399,7 @@ msgstr "発注分析計画"
#: model:ir.actions.act_window,name:base.ir_sequence_type
#: model:ir.ui.menu,name:base.menu_ir_sequence_type
msgid "Sequence Codes"
-msgstr "順序コード"
+msgstr "付番コード"
#. module: base
#: selection:base.language.install,lang:0
@@ -11071,7 +11071,7 @@ msgstr "国の状態"
#. module: base
#: model:ir.ui.menu,name:base.next_id_5
msgid "Sequences & Identifiers"
-msgstr "順序と識別子"
+msgstr "付番定義とID"
#. module: base
#: model:ir.module.module,description:base.module_l10n_th
@@ -11206,7 +11206,7 @@ msgstr "連絡先が会社の場合はチェックしてください。チェッ
#. module: base
#: view:ir.sequence.type:0
msgid "Sequences Type"
-msgstr "順序タイプ"
+msgstr "付番タイプ"
#. module: base
#: view:res.partner:0
@@ -11542,7 +11542,7 @@ msgstr ""
#: view:ir.sequence:0
#: model:ir.ui.menu,name:base.menu_ir_sequence_form
msgid "Sequences"
-msgstr "順序"
+msgstr "付番"
#. module: base
#: help:res.lang,code:0
@@ -11927,7 +11927,7 @@ msgstr "アップデート"
#: field:multi_company.default,sequence:0
#: field:res.partner.bank,sequence:0
msgid "Sequence"
-msgstr "順序"
+msgstr "付番"
#. module: base
#: model:res.country,name:base.tn
@@ -12380,7 +12380,7 @@ msgstr "ハード島とマクドナルド諸島"
msgid ""
"External Key/Identifier that can be used for data integration with third-"
"party systems"
-msgstr "サードパーティのシステムとのデータ統合のために利用する外部キー / 識別子"
+msgstr "サードパーティシステムとのデータ統合のために利用する外部キー / ID"
#. module: base
#: field:ir.actions.act_window,view_id:0
@@ -12690,7 +12690,7 @@ msgstr "CRMポータル"
#. module: base
#: model:ir.ui.menu,name:base.next_id_4
msgid "Low Level Objects"
-msgstr "低レベルのオブジェクト"
+msgstr "低レベルオブジェクト"
#. module: base
#: help:ir.values,model:0
@@ -12772,7 +12772,7 @@ msgstr ""
#: view:ir.model.data:0
#: model:ir.ui.menu,name:base.ir_model_data_menu
msgid "External Identifiers"
-msgstr "外部識別子"
+msgstr "外部ID"
#. module: base
#. openerp-web
@@ -13822,7 +13822,7 @@ msgstr ""
#: view:ir.model.data:0
#: field:ir.model.data,name:0
msgid "External Identifier"
-msgstr "外部識別子"
+msgstr "外部ID"
#. module: base
#: model:ir.module.module,description:base.module_audittrail
@@ -14251,9 +14251,7 @@ msgid ""
"Two sequence object implementations are offered: Standard and 'No gap'. The "
"later is slower than the former but forbids any gap in the sequence (while "
"they are possible in the former)."
-msgstr ""
-"2つのシーケンスオブジェクトの実装が提供されます:標準と\"ギャップなし\"です。後者は前者よりも遅いですが、どんな順序のギャップを禁じます(前者は可能で"
-"す)。"
+msgstr "「標準」と「ギャップなし」の2種類の付番定義が可能です。後者の場合、付番ごとにギャップを設けることができません。"
#. module: base
#: model:res.country,name:base.gn
@@ -14457,7 +14455,7 @@ msgstr "かつ"
#: help:ir.values,res_id:0
msgid ""
"Database identifier of the record to which this applies. 0 = for all records"
-msgstr "これを適用するためのレコードのデータベース識別子。0 = 全てのレコードのため"
+msgstr ""
#. module: base
#: field:ir.model.fields,relation:0
@@ -15123,7 +15121,7 @@ msgstr "クック諸島"
#. module: base
#: field:ir.model.data,noupdate:0
msgid "Non Updatable"
-msgstr "更新可能でない"
+msgstr "更新不可"
#. module: base
#: selection:base.language.install,lang:0
@@ -15536,7 +15534,7 @@ msgstr ""
#. module: base
#: help:ir.sequence,prefix:0
msgid "Prefix value of the record for the sequence"
-msgstr "順序のためのレコードのプレフィックス値"
+msgstr "この付番定義でレコードに適用するプレフィックス値"
#. module: base
#: model:res.country,name:base.sc
@@ -15584,7 +15582,7 @@ msgstr ""
#. module: base
#: field:ir.model.data,complete_name:0
msgid "Complete ID"
-msgstr "完了ID"
+msgstr "完全ID"
#. module: base
#: model:ir.module.module,description:base.module_stock
@@ -15678,7 +15676,7 @@ msgstr "製造プロセスを管理し、それらのプロセスのレポート
#. module: base
#: help:ir.sequence,number_increment:0
msgid "The next number of the sequence will be incremented by this number"
-msgstr "順序の次の番号はこの数値だけ増加します。"
+msgstr "付番毎にこの数値分だけ番号が増加します。"
#. module: base
#: selection:workflow.activity,kind:0
From 5db649549c98056304181a0302821e897b50ab7a Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 10:45:04 +0100
Subject: [PATCH 24/53] [IMP] mrp: use also the ceiling method from product
bzr revid: mat@openerp.com-20140306094504-37r691hxcemp0ual
---
addons/mrp/mrp.py | 5 ++++-
addons/product/_common.py | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index dfe45e927bc..2b5d68177f1 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -30,6 +30,7 @@ from openerp.tools.translate import _
from openerp import netsvc
from openerp import tools
from openerp import SUPERUSER_ID
+from openerp.addons.product import _common
#----------------------------------------------------------
# Work Centers
@@ -324,7 +325,7 @@ class mrp_bom(osv.osv):
"""
routing_obj = self.pool.get('mrp.routing')
factor = factor / (bom.product_efficiency or 1.0)
- factor = rounding(factor, bom.product_rounding)
+ factor = _common.ceiling(factor, bom.product_rounding)
if factor < bom.product_rounding:
factor = bom.product_rounding
result = []
@@ -380,6 +381,8 @@ class mrp_bom(osv.osv):
def rounding(f, r):
+ # TODO for trunk: log deprecation warning
+ # _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.")
import math
if not r:
return f
diff --git a/addons/product/_common.py b/addons/product/_common.py
index def09e975af..2d6fe8bec32 100644
--- a/addons/product/_common.py
+++ b/addons/product/_common.py
@@ -30,7 +30,7 @@ def rounding(f, r):
# _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.")
return tools.float_round(f, precision_rounding=r)
-# TODO for trunk: add rounding method parameter to tools.float_round and remove this method
+# TODO for trunk: add rounding method parameter to tools.float_round and use this method as hook
def ceiling(f, r):
if not r:
return f
From 3c65ffc29fae91af73e5341fbcc247824320a5d1 Mon Sep 17 00:00:00 2001
From: "Richard Mathot (OpenERP)"
Date: Thu, 6 Mar 2014 12:03:56 +0100
Subject: [PATCH 25/53] [FIX] Test for ir_sequence:
This test was depending on the error string returned by postgresql.
As these strings are localized, the test was failing on systems
where posgresql locale was not set to 'en_US'.
In this new version, we now check the error code returned by postgresql
(which is, obviously, platform independent)
bzr revid: rim@openerp.com-20140306110356-72mgz3korkq3rkde
---
openerp/tests/test_ir_sequence.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/openerp/tests/test_ir_sequence.py b/openerp/tests/test_ir_sequence.py
index cbb1a347038..280eb9f8773 100644
--- a/openerp/tests/test_ir_sequence.py
+++ b/openerp/tests/test_ir_sequence.py
@@ -8,6 +8,7 @@
# OPENERP_DATABASE=yy PYTHONPATH=../:. unit2 test_ir_sequence
# This assume an existing database.
import psycopg2
+import psycopg2.errorcodes
import unittest2
import openerp
@@ -111,11 +112,11 @@ class test_ir_sequence_no_gap(unittest2.TestCase):
cr0 = cursor()
cr1 = cursor()
cr1._default_log_exceptions = False # Prevent logging a traceback
- msg_re = '^could not obtain lock on row in relation "ir_sequence"$'
- with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re):
+ with self.assertRaises(psycopg2.OperationalError) as e:
n0 = registry('ir.sequence').next_by_code(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
assert n0
n1 = registry('ir.sequence').next_by_code(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
+ assert e.exception.pgcode == psycopg2.errorcodes.LOCK_NOT_AVAILABLE
cr0.close()
cr1.close()
From 6f99891b82696f4d3eb059d3df8b17077011bab7 Mon Sep 17 00:00:00 2001
From: "Richard Mathot (OpenERP)"
Date: Thu, 6 Mar 2014 12:20:53 +0100
Subject: [PATCH 26/53] [REF] Use assertEqual method instead of assert
instruction
bzr revid: rim@openerp.com-20140306112053-e0znv1g2378ghs46
---
openerp/tests/test_ir_sequence.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/openerp/tests/test_ir_sequence.py b/openerp/tests/test_ir_sequence.py
index 280eb9f8773..0b47560f3a4 100644
--- a/openerp/tests/test_ir_sequence.py
+++ b/openerp/tests/test_ir_sequence.py
@@ -116,7 +116,7 @@ class test_ir_sequence_no_gap(unittest2.TestCase):
n0 = registry('ir.sequence').next_by_code(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
assert n0
n1 = registry('ir.sequence').next_by_code(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
- assert e.exception.pgcode == psycopg2.errorcodes.LOCK_NOT_AVAILABLE
+ self.assertEqual(e.exception.pgcode, psycopg2.errorcodes.LOCK_NOT_AVAILABLE, msg="postgresql returned an incorrect errcode")
cr0.close()
cr1.close()
From f80d24279113223635fb018128e6f416dbcf7489 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 13:24:32 +0100
Subject: [PATCH 27/53] [IMP] base_import: update select2 lib to revision 3.4.5
bzr revid: mat@openerp.com-20140306122432-7x5kkwy36zo7f6fy
---
addons/base_import/__openerp__.py | 2 +
addons/base_import/static/lib/select2/LICENSE | 18 +-
.../base_import/static/lib/select2/README.md | 69 +-
.../base_import/static/lib/select2/release.sh | 40 +-
.../static/lib/select2/select2-bootstrap.css | 87 +
.../{spinner.gif => select2-spinner.gif} | Bin
.../static/lib/select2/select2.css | 661 ++---
.../static/lib/select2/select2.jquery.json | 36 +
.../base_import/static/lib/select2/select2.js | 2168 ++++++++++++-----
9 files changed, 2081 insertions(+), 1000 deletions(-)
create mode 100644 addons/base_import/static/lib/select2/select2-bootstrap.css
rename addons/base_import/static/lib/select2/{spinner.gif => select2-spinner.gif} (100%)
create mode 100644 addons/base_import/static/lib/select2/select2.jquery.json
diff --git a/addons/base_import/__openerp__.py b/addons/base_import/__openerp__.py
index e044930a242..d7f0714e439 100644
--- a/addons/base_import/__openerp__.py
+++ b/addons/base_import/__openerp__.py
@@ -32,6 +32,8 @@ Re-implement openerp's file import system:
],
'css': [
'static/lib/select2/select2.css',
+ # TODO for trunk: use bootstrap version
+ # 'static/lib/select2/select2-bootstrap.css',
'static/src/css/import.css',
],
'js': [
diff --git a/addons/base_import/static/lib/select2/LICENSE b/addons/base_import/static/lib/select2/LICENSE
index 627fddef413..3c98f3df42a 100644
--- a/addons/base_import/static/lib/select2/LICENSE
+++ b/addons/base_import/static/lib/select2/LICENSE
@@ -1,12 +1,18 @@
Copyright 2012 Igor Vaynberg
-
+
Version: @@ver@@ Timestamp: @@timestamp@@
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
-compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License at:
http://www.apache.org/licenses/LICENSE-2.0
+http://www.gnu.org/licenses/gpl-2.0.html
-Unless required by applicable law or agreed to in writing, software distributed under the License is
-distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and limitations under the License.
\ No newline at end of file
+Unless required by applicable law or agreed to in writing, software distributed under the Apache License
+or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+either express or implied. See the Apache License and the GPL License for the specific language governing
+permissions and limitations under the Apache License and the GPL License.
\ No newline at end of file
diff --git a/addons/base_import/static/lib/select2/README.md b/addons/base_import/static/lib/select2/README.md
index 3a6dcaf1ba4..cb0be3c6eaa 100644
--- a/addons/base_import/static/lib/select2/README.md
+++ b/addons/base_import/static/lib/select2/README.md
@@ -1,39 +1,49 @@
Select2
-=================
+=======
-Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. Look and feel of Select2 is based on the excellent [Chosen](http://harvesthq.github.com/chosen/) library.
+Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
-To get started -- checkout http://ivaynberg.github.com/select2!
+To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
-What Does Select2 Support That Chosen Does Not?
--------------------------------------------------
+Use cases
+---------
-* Working with large datasets: Chosen requires the entire dataset to be loaded as `option` tags in the DOM, which limits
-it to working with small-ish datasets. Select2 uses a function to find results on-the-fly, which allows it to partially
-load results.
-* Paging of results: Since Select2 works with large datasets and only loads a small amount of matching results at a time
-it has to support paging. Select2 will call the search function when the user scrolls to the bottom of currently loaded
-result set allowing for the 'infinite scrolling' of results.
-* Custom markup for results: Chosen only supports rendering text results because that is the only markup supported by
-`option` tags. Select2 provides an extension point which can be used to produce any kind of markup to represent results.
-* Ability to add results on the fly: Select2 provides the ability to add results from the search term entered by the user, which allows it to be used for
-tagging.
+* Enhancing native selects with search.
+* Enhancing native selects with a better multi-select interface.
+* Loading data from JavaScript: easily load items via ajax and have them searchable.
+* Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
+* Tagging: ability to add new items on the fly.
+* Working with large, remote datasets: ability to partially load a dataset based on the search term.
+* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
+* Templating: support for custom rendering of results and selections.
-Browser Compatibility
---------------------
-* IE 8+ (7 mostly works except for [issue with z-index](https://github.com/ivaynberg/select2/issues/37))
+Browser compatibility
+---------------------
+* IE 8+
* Chrome 8+
-* Firefox 3.5+
+* Firefox 10+
* Safari 3+
* Opera 10.6+
Integrations
------------
-* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / Apache Wicket)
+* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
* [Django](https://github.com/applegrew/django-select2)
+* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
+* [Bootstrap](https://github.com/t0m/select2-bootstrap-css) (CSS skin)
+* [Yii](https://github.com/tonybolzan/yii-select2)
+
+Internationalization (i18n)
+---------------------------
+
+Select2 supports multiple languages by simply including the right
+language JS file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.).
+
+Missing a language? Just copy `select2_locale_en.js.template`, translate
+it, and make a pull request back to Select2 here on GitHub.
Bug tracker
-----------
@@ -42,7 +52,6 @@ Have a bug? Please create an issue here on GitHub!
https://github.com/ivaynberg/select2/issues
-
Mailing list
------------
@@ -53,16 +62,22 @@ select2@googlegroups.com
https://groups.google.com/d/forum/select2
-Copyright and License
+Copyright and license
---------------------
Copyright 2012 Igor Vaynberg
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
-compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
http://www.apache.org/licenses/LICENSE-2.0
+http://www.gnu.org/licenses/gpl-2.0.html
-Unless required by applicable law or agreed to in writing, software distributed under the License is
-distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and limitations under the License.
\ No newline at end of file
+Unless required by applicable law or agreed to in writing, software distributed under the Apache License
+or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+either express or implied. See the Apache License and the GPL License for the specific language governing
+permissions and limitations under the Apache License and the GPL License.
diff --git a/addons/base_import/static/lib/select2/release.sh b/addons/base_import/static/lib/select2/release.sh
index 79eaabd621d..92fe0e959fa 100755
--- a/addons/base_import/static/lib/select2/release.sh
+++ b/addons/base_import/static/lib/select2/release.sh
@@ -15,21 +15,33 @@ js="$name.js"
mini="$name.min.js"
css="$name.css"
release="$name-$ver"
-releasedir="/tmp/$release"
-tag="release-$ver"
+tag="$ver"
branch="build-$ver"
curbranch=`git branch | grep "*" | sed "s/* //"`
timestamp=$(date)
tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
remote="github"
+echo "Pulling from origin"
+
+git pull
+
+echo "Updating Version Identifiers"
+
+sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i "" bower.json select2.jquery.json
+git add bower.json
+git add select2.jquery.json
+git commit -m "modified version identifiers in descriptors for release $ver"
+git push
+
git branch "$branch"
git checkout "$branch"
echo "Tokenizing..."
-find . -name "$js" | xargs sed -i -e "$tokens"
-find . -name "$css" | xargs sed -i -e "$tokens"
+find . -name "$js" | xargs -I{} sed -e "$tokens" -i "" {}
+find . -name "$css" | xargs -I{} sed -e "$tokens" -i "" {}
+sed -e "s/latest/$ver/g" -i "" bower.json
git add "$js"
git add "$css"
@@ -41,11 +53,8 @@ cat LICENSE | sed "$tokens" >> "$mini"
echo "*/" >> "$mini"
curl -s \
- -d compilation_level=SIMPLE_OPTIMIZATIONS \
- -d output_format=text \
- -d output_info=compiled_code \
--data-urlencode "js_code@$js" \
- http://closure-compiler.appspot.com/compile \
+ http://marijnhaverbeke.nl/uglifyjs \
>> "$mini"
git add "$mini"
@@ -53,25 +62,12 @@ git add "$mini"
git commit -m "release $ver"
echo "Tagging..."
-
git tag -a "$tag" -m "tagged version $ver"
git push "$remote" --tags
-echo "Archiving..."
-
-rm -rf "$releasedir"
-mkdir "$releasedir"
-
-cp $name.* "$releasedir"
-cp spinner.gif "$releasedir"
-cp README.* "$releasedir"
-
-zip -r "$releasedir.zip" "$releasedir"
-rm -rf "$releasedir"
-
echo "Cleaning Up..."
git checkout "$curbranch"
git branch -D "$branch"
-echo "Done. Release archive created: $releasedir.zip"
+echo "Done"
diff --git a/addons/base_import/static/lib/select2/select2-bootstrap.css b/addons/base_import/static/lib/select2/select2-bootstrap.css
new file mode 100644
index 00000000000..909971074c9
--- /dev/null
+++ b/addons/base_import/static/lib/select2/select2-bootstrap.css
@@ -0,0 +1,87 @@
+.form-control .select2-choice {
+ border: 0;
+ border-radius: 2px;
+}
+
+.form-control .select2-choice .select2-arrow {
+ border-radius: 0 2px 2px 0;
+}
+
+.form-control.select2-container {
+ height: auto !important;
+ padding: 0px;
+}
+
+.form-control.select2-container.select2-dropdown-open {
+ border-color: #5897FB;
+ border-radius: 3px 3px 0 0;
+}
+
+.form-control .select2-container.select2-dropdown-open .select2-choices {
+ border-radius: 3px 3px 0 0;
+}
+
+.form-control.select2-container .select2-choices {
+ border: 0 !important;
+ border-radius: 3px;
+}
+
+.control-group.warning .select2-container .select2-choice,
+.control-group.warning .select2-container .select2-choices,
+.control-group.warning .select2-container-active .select2-choice,
+.control-group.warning .select2-container-active .select2-choices,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #C09853 !important;
+}
+
+.control-group.warning .select2-container .select2-choice div {
+ border-left: 1px solid #C09853 !important;
+ background: #FCF8E3 !important;
+}
+
+.control-group.error .select2-container .select2-choice,
+.control-group.error .select2-container .select2-choices,
+.control-group.error .select2-container-active .select2-choice,
+.control-group.error .select2-container-active .select2-choices,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.error .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #B94A48 !important;
+}
+
+.control-group.error .select2-container .select2-choice div {
+ border-left: 1px solid #B94A48 !important;
+ background: #F2DEDE !important;
+}
+
+.control-group.info .select2-container .select2-choice,
+.control-group.info .select2-container .select2-choices,
+.control-group.info .select2-container-active .select2-choice,
+.control-group.info .select2-container-active .select2-choices,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.info .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #3A87AD !important;
+}
+
+.control-group.info .select2-container .select2-choice div {
+ border-left: 1px solid #3A87AD !important;
+ background: #D9EDF7 !important;
+}
+
+.control-group.success .select2-container .select2-choice,
+.control-group.success .select2-container .select2-choices,
+.control-group.success .select2-container-active .select2-choice,
+.control-group.success .select2-container-active .select2-choices,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.success .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #468847 !important;
+}
+
+.control-group.success .select2-container .select2-choice div {
+ border-left: 1px solid #468847 !important;
+ background: #DFF0D8 !important;
+}
diff --git a/addons/base_import/static/lib/select2/spinner.gif b/addons/base_import/static/lib/select2/select2-spinner.gif
similarity index 100%
rename from addons/base_import/static/lib/select2/spinner.gif
rename to addons/base_import/static/lib/select2/select2-spinner.gif
diff --git a/addons/base_import/static/lib/select2/select2.css b/addons/base_import/static/lib/select2/select2.css
index f0bdfb82f04..2b32ed6f280 100644
--- a/addons/base_import/static/lib/select2/select2.css
+++ b/addons/base_import/static/lib/select2/select2.css
@@ -1,279 +1,317 @@
/*
-Version: @@ver@@ Timestamp: @@timestamp@@
+Version: 3.4.5 Timestamp: Mon Nov 4 08:22:42 PST 2013
*/
.select2-container {
+ margin: 0;
position: relative;
display: inline-block;
/* inline-block for ie7 */
zoom: 1;
*display: inline;
- vertical-align: top;
+ vertical-align: middle;
}
.select2-container,
.select2-drop,
.select2-search,
-.select2-search input{
+.select2-search input {
/*
Force border-box so that % widths fit the parent
container without overlap because of margin/padding.
More Info : http://www.quirksmode.org/css/box.html
*/
- -moz-box-sizing: border-box; /* firefox */
- -ms-box-sizing: border-box; /* ie */
-webkit-box-sizing: border-box; /* webkit */
- -khtml-box-sizing: border-box; /* konqueror */
- box-sizing: border-box; /* css3 */
+ -moz-box-sizing: border-box; /* firefox */
+ box-sizing: border-box; /* css3 */
}
.select2-container .select2-choice {
- background-color: #fff;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
- background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
- background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
- background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%);
- background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#ffffff', GradientType = 0);
- background-image: linear-gradient(top, #eeeeee 0%, #ffffff 50%);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -moz-background-clip: padding;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
- border: 1px solid #aaa;
display: block;
- overflow: hidden;
- white-space: nowrap;
- position: relative;
height: 26px;
- line-height: 26px;
padding: 0 0 0 8px;
+ overflow: hidden;
+ position: relative;
+
+ border: 1px solid #aaa;
+ white-space: nowrap;
+ line-height: 26px;
color: #444;
text-decoration: none;
+
+ border-radius: 4px;
+
+ background-clip: padding-box;
+
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ background-color: #fff;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
+ background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
+ background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
+ background-image: linear-gradient(top, #fff 0%, #eee 50%);
}
-.select2-container.select2-drop-above .select2-choice
-{
+.select2-container.select2-drop-above .select2-choice {
border-bottom-color: #aaa;
- -webkit-border-radius:0px 0px 4px 4px;
- -moz-border-radius:0px 0px 4px 4px;
- border-radius:0px 0px 4px 4px;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white));
- background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%);
- background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%);
- background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%);
- background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 90%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
- background-image: linear-gradient(top, #eeeeee 0%,#ffffff 90%);
+
+ border-radius: 0 0 4px 4px;
+
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
+ background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
+ background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
+ background-image: linear-gradient(top, #eee 0%, #fff 90%);
}
-.select2-container .select2-choice span {
+.select2-container.select2-allowclear .select2-choice .select2-chosen {
+ margin-right: 42px;
+}
+
+.select2-container .select2-choice > .select2-chosen {
margin-right: 26px;
display: block;
overflow: hidden;
+
white-space: nowrap;
- -o-text-overflow: ellipsis;
- -ms-text-overflow: ellipsis;
+
text-overflow: ellipsis;
}
.select2-container .select2-choice abbr {
- display: block;
- position: absolute;
- right: 26px;
- top: 8px;
- width: 12px;
- height: 12px;
- font-size: 1px;
- background: url('select2.png') right top no-repeat;
- cursor: pointer;
- text-decoration: none;
- border:0;
- outline: 0;
+ display: none;
+ width: 12px;
+ height: 12px;
+ position: absolute;
+ right: 24px;
+ top: 8px;
+
+ font-size: 1px;
+ text-decoration: none;
+
+ border: 0;
+ background: url('select2.png') right top no-repeat;
+ cursor: pointer;
+ outline: 0;
}
+
+.select2-container.select2-allowclear .select2-choice abbr {
+ display: inline-block;
+}
+
.select2-container .select2-choice abbr:hover {
- background-position: right -11px;
- cursor: pointer;
+ background-position: right -11px;
+ cursor: pointer;
+}
+
+.select2-drop-mask {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ position: fixed;
+ left: 0;
+ top: 0;
+ min-height: 100%;
+ min-width: 100%;
+ height: auto;
+ width: auto;
+ opacity: 0;
+ z-index: 9998;
+ /* styles required for IE to work */
+ background-color: #fff;
+ filter: alpha(opacity=0);
}
.select2-drop {
+ width: 100%;
+ margin-top: -1px;
+ position: absolute;
+ z-index: 9999;
+ top: 100%;
+
background: #fff;
color: #000;
border: 1px solid #aaa;
border-top: 0;
- position: absolute;
- top: 100%;
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
- -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
- -o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
- z-index: 9999;
- width:100%;
- margin-top:-1px;
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+
+ -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+ box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+}
+
+.select2-drop-auto-width {
+ border-top: 1px solid #aaa;
+ width: auto;
+}
+
+.select2-drop-auto-width .select2-search {
+ padding-top: 4px;
}
.select2-drop.select2-drop-above {
- -webkit-border-radius: 4px 4px 0px 0px;
- -moz-border-radius: 4px 4px 0px 0px;
- border-radius: 4px 4px 0px 0px;
- margin-top:1px;
+ margin-top: 1px;
border-top: 1px solid #aaa;
border-bottom: 0;
+ border-radius: 4px 4px 0 0;
+
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
- -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
- -o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+ box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
}
-.select2-container .select2-choice div {
- -webkit-border-radius: 0 4px 4px 0;
- -moz-border-radius: 0 4px 4px 0;
+.select2-drop-active {
+ border: 1px solid #5897fb;
+ border-top: none;
+}
+
+.select2-drop.select2-drop-above.select2-drop-active {
+ border-top: 1px solid #5897fb;
+}
+
+.select2-container .select2-choice .select2-arrow {
+ display: inline-block;
+ width: 18px;
+ height: 100%;
+ position: absolute;
+ right: 0;
+ top: 0;
+
+ border-left: 1px solid #aaa;
border-radius: 0 4px 4px 0;
- -moz-background-clip: padding;
- -webkit-background-clip: padding-box;
+
background-clip: padding-box;
+
background: #ccc;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
- background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
- background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#cccccc', endColorstr = '#eeeeee', GradientType = 0);
- background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%);
- border-left: 1px solid #aaa;
- position: absolute;
- right: 0;
- top: 0;
- display: block;
- height: 100%;
- width: 18px;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
+ background-image: linear-gradient(top, #ccc 0%, #eee 60%);
}
-.select2-container .select2-choice div b {
- background: url('select2.png') no-repeat 0 1px;
+.select2-container .select2-choice .select2-arrow b {
display: block;
width: 100%;
height: 100%;
+ background: url('select2.png') no-repeat 0 1px;
}
.select2-search {
- display: inline-block;
- white-space: nowrap;
- z-index: 10000;
- min-height: 26px;
- width: 100%;
- margin: 0;
- padding-left: 4px;
- padding-right: 4px;
-}
+ display: inline-block;
+ width: 100%;
+ min-height: 26px;
+ margin: 0;
+ padding-left: 4px;
+ padding-right: 4px;
-.select2-search-hidden {
- display: block;
- position: absolute;
- left: -10000px;
+ position: relative;
+ z-index: 10000;
+
+ white-space: nowrap;
}
.select2-search input {
- background: #fff url('select2.png') no-repeat 100% -22px;
- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
+ width: 100%;
+ height: auto !important;
+ min-height: 26px;
padding: 4px 20px 4px 5px;
+ margin: 0;
+
outline: 0;
- border: 1px solid #aaa;
font-family: sans-serif;
font-size: 1em;
- width:100%;
- margin:0;
- height:auto !important;
- min-height: 26px;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
+
+ border: 1px solid #aaa;
border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
+
+ -webkit-box-shadow: none;
+ box-shadow: none;
+
+ background: #fff url('select2.png') no-repeat 100% -22px;
+ background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+ background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #fff 85%, #eee 99%);
}
-.select2-drop.select2-drop-above .select2-search input
-{
- margin-top:4px;
+.select2-drop.select2-drop-above .select2-search input {
+ margin-top: 4px;
}
.select2-search input.select2-active {
- background: #fff url('spinner.gif') no-repeat 100%;
- background: url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background: url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- background: url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
- background: url('spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
+ background: #fff url('select2-spinner.gif') no-repeat 100%;
+ background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+ background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(top, #fff 85%, #eee 99%);
}
-
.select2-container-active .select2-choice,
.select2-container-active .select2-choices {
- -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
- -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
- -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
- box-shadow : 0 0 5px rgba(0,0,0,.3);
border: 1px solid #5897fb;
outline: none;
+
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+ box-shadow: 0 0 5px rgba(0, 0, 0, .3);
}
.select2-dropdown-open .select2-choice {
- border: 1px solid #aaa;
- border-bottom-color: transparent;
- -webkit-box-shadow: 0 1px 0 #fff inset;
- -moz-box-shadow : 0 1px 0 #fff inset;
- -o-box-shadow : 0 1px 0 #fff inset;
- box-shadow : 0 1px 0 #fff inset;
- background-color: #eee;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
- background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
- background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
- background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
- background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
- background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
- -webkit-border-bottom-left-radius : 0;
- -webkit-border-bottom-right-radius: 0;
- -moz-border-radius-bottomleft : 0;
- -moz-border-radius-bottomright: 0;
- border-bottom-left-radius : 0;
- border-bottom-right-radius: 0;
+ border-bottom-color: transparent;
+ -webkit-box-shadow: 0 1px 0 #fff inset;
+ box-shadow: 0 1px 0 #fff inset;
+
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+
+ background-color: #eee;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
+ background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
+ background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+ background-image: linear-gradient(top, #fff 0%, #eee 50%);
}
-.select2-dropdown-open .select2-choice div {
- background: transparent;
- border-left: none;
+.select2-dropdown-open.select2-drop-above .select2-choice,
+.select2-dropdown-open.select2-drop-above .select2-choices {
+ border: 1px solid #5897fb;
+ border-top-color: transparent;
+
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
+ background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
+ background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+ background-image: linear-gradient(bottom, #fff 0%, #eee 50%);
}
-.select2-dropdown-open .select2-choice div b {
- background-position: -18px 1px;
+
+.select2-dropdown-open .select2-choice .select2-arrow {
+ background: transparent;
+ border-left: none;
+ filter: none;
+}
+.select2-dropdown-open .select2-choice .select2-arrow b {
+ background-position: -18px 1px;
}
/* results */
.select2-results {
- margin: 4px 4px 4px 0;
- padding: 0 0 0 4px;
- position: relative;
- overflow-x: hidden;
- overflow-y: auto;
- max-height: 200px;
+ max-height: 200px;
+ padding: 0 0 0 4px;
+ margin: 4px 4px 4px 0;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.select2-results ul.select2-result-sub {
- margin: 0 0 0 0;
+ margin: 0;
+ padding-left: 0;
}
.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
@@ -285,40 +323,59 @@ Version: @@ver@@ Timestamp: @@timestamp@@
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
.select2-results li {
- list-style: none;
- display: list-item;
+ list-style: none;
+ display: list-item;
+ background-image: none;
}
.select2-results li.select2-result-with-children > .select2-result-label {
- font-weight: bold;
+ font-weight: bold;
}
.select2-results .select2-result-label {
- padding: 3px 7px 4px;
- margin: 0;
- cursor: pointer;
+ padding: 3px 7px 4px;
+ margin: 0;
+ cursor: pointer;
+
+ min-height: 1em;
+
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
.select2-results .select2-highlighted {
- background: #3875d7;
- color: #fff;
+ background: #3875d7;
+ color: #fff;
}
+
.select2-results li em {
- background: #feffde;
- font-style: normal;
+ background: #feffde;
+ font-style: normal;
}
+
.select2-results .select2-highlighted em {
- background: transparent;
+ background: transparent;
}
+
+.select2-results .select2-highlighted ul {
+ background: #fff;
+ color: #000;
+}
+
+
.select2-results .select2-no-results,
.select2-results .select2-searching,
.select2-results .select2-selection-limit {
- background: #f4f4f4;
- display: list-item;
+ background: #f4f4f4;
+ display: list-item;
}
/*
-disabled look for already selected choices in the results dropdown
+disabled look for disabled choices in the results dropdown
+*/
.select2-results .select2-disabled.select2-highlighted {
color: #666;
background: #f4f4f4;
@@ -330,18 +387,18 @@ disabled look for already selected choices in the results dropdown
display: list-item;
cursor: default;
}
-*/
-.select2-results .select2-disabled {
+
+.select2-results .select2-selected {
display: none;
}
.select2-more-results.select2-active {
- background: #f4f4f4 url('spinner.gif') no-repeat 100%;
+ background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
}
.select2-more-results {
- background: #f4f4f4;
- display: list-item;
+ background: #f4f4f4;
+ display: list-item;
}
/* disabled styles */
@@ -353,31 +410,39 @@ disabled look for already selected choices in the results dropdown
cursor: default;
}
-.select2-container.select2-container-disabled .select2-choice div {
+.select2-container.select2-container-disabled .select2-choice .select2-arrow {
background-color: #f4f4f4;
background-image: none;
border-left: 0;
}
+.select2-container.select2-container-disabled .select2-choice abbr {
+ display: none;
+}
+
/* multiselect */
.select2-container-multi .select2-choices {
+ height: auto !important;
+ height: 1%;
+ margin: 0;
+ padding: 0;
+ position: relative;
+
+ border: 1px solid #aaa;
+ cursor: text;
+ overflow: hidden;
+
background-color: #fff;
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
- background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- border: 1px solid #aaa;
- margin: 0;
- padding: 0;
- cursor: text;
- overflow: hidden;
- height: auto !important;
- height: 1%;
- position: relative;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
+ background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
+ background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
+ background-image: linear-gradient(top, #eee 1%, #fff 15%);
+}
+
+.select2-locked {
+ padding: 3px 5px 3px 5px !important;
}
.select2-container-multi .select2-choices {
@@ -385,107 +450,107 @@ disabled look for already selected choices in the results dropdown
}
.select2-container-multi.select2-container-active .select2-choices {
- -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
- -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
- -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
- box-shadow : 0 0 5px rgba(0,0,0,.3);
border: 1px solid #5897fb;
outline: none;
+
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+ box-shadow: 0 0 5px rgba(0, 0, 0, .3);
}
.select2-container-multi .select2-choices li {
- float: left;
- list-style: none;
+ float: left;
+ list-style: none;
}
.select2-container-multi .select2-choices .select2-search-field {
- white-space: nowrap;
- margin: 0;
- padding: 0;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
}
.select2-container-multi .select2-choices .select2-search-field input {
- color: #666;
- background: transparent !important;
- font-family: sans-serif;
- font-size: 100%;
- height: 15px;
- padding: 5px;
- margin: 1px 0;
- outline: 0;
- border: 0;
- -webkit-box-shadow: none;
- -moz-box-shadow : none;
- -o-box-shadow : none;
- box-shadow : none;
+ padding: 5px;
+ margin: 1px 0;
+
+ font-family: sans-serif;
+ font-size: 100%;
+ color: #666;
+ outline: 0;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ background: transparent !important;
}
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
- background: #fff url('spinner.gif') no-repeat 100% !important;
+ background: #fff url('select2-spinner.gif') no-repeat 100% !important;
}
.select2-default {
- color: #999 !important;
+ color: #999 !important;
}
.select2-container-multi .select2-choices .select2-search-choice {
- -webkit-border-radius: 3px;
- -moz-border-radius : 3px;
- border-radius : 3px;
- -moz-background-clip : padding;
- -webkit-background-clip: padding-box;
- background-clip : padding-box;
- background-color: #e4e4e4;
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
- -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
- box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
- color: #333;
- border: 1px solid #aaaaaa;
- line-height: 13px;
- padding: 3px 5px 3px 18px;
- margin: 3px 0 3px 5px;
- position: relative;
- cursor: default;
+ padding: 3px 5px 3px 18px;
+ margin: 3px 0 3px 5px;
+ position: relative;
+
+ line-height: 13px;
+ color: #333;
+ cursor: default;
+ border: 1px solid #aaaaaa;
+
+ border-radius: 3px;
+
+ -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+ box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+
+ background-clip: padding-box;
+
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ background-color: #e4e4e4;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+ background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
}
-.select2-container-multi .select2-choices .select2-search-choice span {
- cursor: default;
+.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
+ cursor: default;
}
.select2-container-multi .select2-choices .select2-search-choice-focus {
- background: #d4d4d4;
+ background: #d4d4d4;
}
.select2-search-choice-close {
- display: block;
- position: absolute;
- right: 3px;
- top: 4px;
- width: 12px;
- height: 13px;
- font-size: 1px;
- background: url('select2.png') right top no-repeat;
- outline: none;
+ display: block;
+ width: 12px;
+ height: 13px;
+ position: absolute;
+ right: 3px;
+ top: 4px;
+
+ font-size: 1px;
+ outline: none;
+ background: url('select2.png') right top no-repeat;
}
.select2-container-multi .select2-search-choice-close {
- left: 3px;
+ left: 3px;
}
-
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
background-position: right -11px;
}
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
- background-position: right -11px;
+ background-position: right -11px;
}
/* disabled styles */
-
-.select2-container-multi.select2-container-disabled .select2-choices{
+.select2-container-multi.select2-container-disabled .select2-choices {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
@@ -493,32 +558,58 @@ disabled look for already selected choices in the results dropdown
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
+ padding: 3px 5px 3px 5px;
+ border: 1px solid #ddd;
background-image: none;
background-color: #f4f4f4;
- border: 1px solid #ddd;
- padding: 3px 5px 3px 5px;
}
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {
- display: none;
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
+ background: none;
}
/* end multiselect */
+
.select2-result-selectable .select2-match,
-.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; }
-.select2-result-unselectable .select2-match { text-decoration: none; }
+.select2-result-unselectable .select2-match {
+ text-decoration: underline;
+}
-.select2-offscreen { position: absolute; left: -10000px; }
+.select2-offscreen, .select2-offscreen:focus {
+ clip: rect(0 0 0 0) !important;
+ width: 1px !important;
+ height: 1px !important;
+ border: 0 !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ overflow: hidden !important;
+ position: absolute !important;
+ outline: 0 !important;
+ left: 0px !important;
+ top: 0px !important;
+}
+.select2-display-none {
+ display: none;
+}
+
+.select2-measure-scrollbar {
+ position: absolute;
+ top: -10000px;
+ left: -10000px;
+ width: 100px;
+ height: 100px;
+ overflow: scroll;
+}
/* Retina-ize icons */
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
- .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b {
- background-image: url(select2x2.png) !important;
- background-repeat: no-repeat !important;
- background-size: 60px 40px !important;
- }
- .select2-search input {
- background-position: 100% -21px !important;
- }
-}
\ No newline at end of file
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi) {
+ .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice .select2-arrow b {
+ background-image: url('select2x2.png') !important;
+ background-repeat: no-repeat !important;
+ background-size: 60px 40px !important;
+ }
+ .select2-search input {
+ background-position: 100% -21px !important;
+ }
+}
diff --git a/addons/base_import/static/lib/select2/select2.jquery.json b/addons/base_import/static/lib/select2/select2.jquery.json
new file mode 100644
index 00000000000..b426c705802
--- /dev/null
+++ b/addons/base_import/static/lib/select2/select2.jquery.json
@@ -0,0 +1,36 @@
+{
+ "name": "select2",
+ "title": "Select2",
+ "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+ "keywords": [
+ "select",
+ "autocomplete",
+ "typeahead",
+ "dropdown",
+ "multiselect",
+ "tag",
+ "tagging"
+ ],
+ "version": "3.4.5",
+ "author": {
+ "name": "Igor Vaynberg",
+ "url": "https://github.com/ivaynberg"
+ },
+ "licenses": [
+ {
+ "type": "Apache",
+ "url": "http://www.apache.org/licenses/LICENSE-2.0"
+ },
+ {
+ "type": "GPL v2",
+ "url": "http://www.gnu.org/licenses/gpl-2.0.html"
+ }
+ ],
+ "bugs": "https://github.com/ivaynberg/select2/issues",
+ "homepage": "http://ivaynberg.github.com/select2",
+ "docs": "http://ivaynberg.github.com/select2/",
+ "download": "https://github.com/ivaynberg/select2/tags",
+ "dependencies": {
+ "jquery": ">=1.7.1"
+ }
+}
diff --git a/addons/base_import/static/lib/select2/select2.js b/addons/base_import/static/lib/select2/select2.js
index 42ce0a928b8..3b5e8e280cc 100644
--- a/addons/base_import/static/lib/select2/select2.js
+++ b/addons/base_import/static/lib/select2/select2.js
@@ -1,35 +1,41 @@
/*
- Copyright 2012 Igor Vaynberg
+Copyright 2012 Igor Vaynberg
- Version: @@ver@@ Timestamp: @@timestamp@@
+Version: 3.4.5 Timestamp: Mon Nov 4 08:22:42 PST 2013
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
- compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
- http://www.apache.org/licenses/LICENSE-2.0
+You may obtain a copy of the Apache License and the GPL License at:
- Unless required by applicable law or agreed to in writing, software distributed under the License is
- distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and limitations under the License.
- */
- (function ($) {
- if(typeof $.fn.each2 == "undefined"){
- $.fn.extend({
- /*
- * 4-10 times faster .each replacement
- * use it carefully, as it overrides jQuery context of element on each iteration
- */
- each2 : function (c) {
- var j = $([0]), i = -1, l = this.length;
- while (
- ++i < l
- && (j.context = j[0] = this[i])
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
- );
- return this;
- }
- });
- }
+ http://www.apache.org/licenses/LICENSE-2.0
+ http://www.gnu.org/licenses/gpl-2.0.html
+
+Unless required by applicable law or agreed to in writing, software distributed under the
+Apache License or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
+the specific language governing permissions and limitations under the Apache License and the GPL License.
+*/
+(function ($) {
+ if(typeof $.fn.each2 == "undefined") {
+ $.extend($.fn, {
+ /*
+ * 4-10 times faster .each replacement
+ * use it carefully, as it overrides jQuery context of element on each iteration
+ */
+ each2 : function (c) {
+ var j = $([0]), i = -1, l = this.length;
+ while (
+ ++i < l
+ && (j.context = j[0] = this[i])
+ && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
+ );
+ return this;
+ }
+ });
+ }
})(jQuery);
(function ($, undefined) {
@@ -40,7 +46,8 @@
return;
}
- var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer;
+ var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
+ lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
KEY = {
TAB: 9,
@@ -88,34 +95,52 @@
k = k.which ? k.which : k;
return k >= 112 && k <= 123;
}
- };
+ },
+ MEASURE_SCROLLBAR_TEMPLATE = "
",
+
+ DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z"};
+
+ $document = $(document);
nextUid=(function() { var counter=1; return function() { return counter++; }; }());
- function indexOf(value, array) {
- var i = 0, l = array.length, v;
- if (typeof value === "undefined") {
- return -1;
+ function stripDiacritics(str) {
+ var ret, i, l, c;
+
+ if (!str || str.length < 1) return str;
+
+ ret = "";
+ for (i = 0, l = str.length; i < l; i++) {
+ c = str.charAt(i);
+ ret += DIACRITICS[c] || c;
}
+ return ret;
+ }
- if (value.constructor === String) {
- for (; i < l; i = i + 1) if (value.localeCompare(array[i]) === 0) return i;
- } else {
- for (; i < l; i = i + 1) {
- v = array[i];
- if (v.constructor === String) {
- if (v.localeCompare(value) === 0) return i;
- } else {
- if (v === value) return i;
- }
- }
+ function indexOf(value, array) {
+ var i = 0, l = array.length;
+ for (; i < l; i = i + 1) {
+ if (equal(value, array[i])) return i;
}
return -1;
}
+ function measureScrollbar () {
+ var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
+ $template.appendTo('body');
+
+ var dim = {
+ width: $template.width() - $template[0].clientWidth,
+ height: $template.height() - $template[0].clientHeight
+ };
+ $template.remove();
+
+ return dim;
+ }
+
/**
- * Compares equality of a and b taking into account that a and b may be strings, in which case localeCompare is used
+ * Compares equality of a and b
* @param a
* @param b
*/
@@ -123,8 +148,10 @@
if (a === b) return true;
if (a === undefined || b === undefined) return false;
if (a === null || b === null) return false;
- if (a.constructor === String) return a.localeCompare(b) === 0;
- if (b.constructor === String) return b.localeCompare(a) === 0;
+ // Check whether 'a' or 'b' is a string (primitive or object).
+ // The concatenation of an empty string (+'') converts its argument to a string's primitive.
+ if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
+ if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
return false;
}
@@ -143,17 +170,17 @@
}
function getSideBorderPadding(element) {
- return element.outerWidth() - element.width();
+ return element.outerWidth(false) - element.width();
}
function installKeyUpChangeEvent(element) {
var key="keyup-change-value";
- element.bind("keydown", function () {
+ element.on("keydown", function () {
if ($.data(element, key) === undefined) {
$.data(element, key, element.val());
}
});
- element.bind("keyup", function () {
+ element.on("keyup", function () {
var val= $.data(element, key);
if (val !== undefined && element.val() !== val) {
$.removeData(element, key);
@@ -162,8 +189,9 @@
});
}
- $(document).delegate("*", "mousemove", function (e) {
- $.data(document, "select2-lastpos", {x: e.pageX, y: e.pageY});
+ $document.on("mousemove", function (e) {
+ lastMousePosition.x = e.pageX;
+ lastMousePosition.y = e.pageY;
});
/**
@@ -173,8 +201,8 @@
* the elements under the pointer are scrolled.
*/
function installFilteredMouseMove(element) {
- element.bind("mousemove", function (e) {
- var lastpos = $.data(document, "select2-lastpos");
+ element.on("mousemove", function (e) {
+ var lastpos = lastMousePosition;
if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
$(e.target).trigger("mousemove-filtered", e);
}
@@ -218,63 +246,159 @@
function installDebouncedScroll(threshold, element) {
var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
- element.bind("scroll", function (e) {
+ element.on("scroll", function (e) {
if (indexOf(e.target, element.get()) >= 0) notify(e);
});
}
+ function focus($el) {
+ if ($el[0] === document.activeElement) return;
+
+ /* set the focus in a 0 timeout - that way the focus is set after the processing
+ of the current event has finished - which seems like the only reliable way
+ to set focus */
+ window.setTimeout(function() {
+ var el=$el[0], pos=$el.val().length, range;
+
+ $el.focus();
+
+ /* make sure el received focus so we do not error out when trying to manipulate the caret.
+ sometimes modals or others listeners may steal it after its set */
+ if ($el.is(":visible") && el === document.activeElement) {
+
+ /* after the focus is set move the caret to the end, necessary when we val()
+ just before setting focus */
+ if(el.setSelectionRange)
+ {
+ el.setSelectionRange(pos, pos);
+ }
+ else if (el.createTextRange) {
+ range = el.createTextRange();
+ range.collapse(false);
+ range.select();
+ }
+ }
+ }, 0);
+ }
+
+ function getCursorInfo(el) {
+ el = $(el)[0];
+ var offset = 0;
+ var length = 0;
+ if ('selectionStart' in el) {
+ offset = el.selectionStart;
+ length = el.selectionEnd - offset;
+ } else if ('selection' in document) {
+ el.focus();
+ var sel = document.selection.createRange();
+ length = document.selection.createRange().text.length;
+ sel.moveStart('character', -el.value.length);
+ offset = sel.text.length - length;
+ }
+ return { offset: offset, length: length };
+ }
+
function killEvent(event) {
event.preventDefault();
event.stopPropagation();
}
+ function killEventImmediately(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
function measureTextWidth(e) {
if (!sizer){
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
- sizer = $("
").css({
- position: "absolute",
- left: "-10000px",
- top: "-10000px",
- display: "none",
- fontSize: style.fontSize,
- fontFamily: style.fontFamily,
- fontStyle: style.fontStyle,
- fontWeight: style.fontWeight,
- letterSpacing: style.letterSpacing,
- textTransform: style.textTransform,
- whiteSpace: "nowrap"
- });
- $("body").append(sizer);
+ var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
+ sizer = $(document.createElement("div")).css({
+ position: "absolute",
+ left: "-10000px",
+ top: "-10000px",
+ display: "none",
+ fontSize: style.fontSize,
+ fontFamily: style.fontFamily,
+ fontStyle: style.fontStyle,
+ fontWeight: style.fontWeight,
+ letterSpacing: style.letterSpacing,
+ textTransform: style.textTransform,
+ whiteSpace: "nowrap"
+ });
+ sizer.attr("class","select2-sizer");
+ $("body").append(sizer);
}
sizer.text(e.val());
return sizer.width();
}
- function markMatch(text, term, markup) {
- var match=text.toUpperCase().indexOf(term.toUpperCase()),
+ function syncCssClasses(dest, src, adapter) {
+ var classes, replacements = [], adapted;
+
+ classes = dest.attr("class");
+ if (classes) {
+ classes = '' + classes; // for IE which returns object
+ $(classes.split(" ")).each2(function() {
+ if (this.indexOf("select2-") === 0) {
+ replacements.push(this);
+ }
+ });
+ }
+ classes = src.attr("class");
+ if (classes) {
+ classes = '' + classes; // for IE which returns object
+ $(classes.split(" ")).each2(function() {
+ if (this.indexOf("select2-") !== 0) {
+ adapted = adapter(this);
+ if (adapted) {
+ replacements.push(adapted);
+ }
+ }
+ });
+ }
+ dest.attr("class", replacements.join(" "));
+ }
+
+
+ function markMatch(text, term, markup, escapeMarkup) {
+ var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
tl=term.length;
if (match<0) {
- markup.push(text);
+ markup.push(escapeMarkup(text));
return;
}
- markup.push(text.substring(0, match));
+ markup.push(escapeMarkup(text.substring(0, match)));
markup.push("");
- markup.push(text.substring(match, match + tl));
+ markup.push(escapeMarkup(text.substring(match, match + tl)));
markup.push(" ");
- markup.push(text.substring(match + tl, text.length));
+ markup.push(escapeMarkup(text.substring(match + tl, text.length)));
+ }
+
+ function defaultEscapeMarkup(markup) {
+ var replace_map = {
+ '\\': '\',
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ "/": '/'
+ };
+
+ return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
+ return replace_map[match];
+ });
}
/**
* Produces an ajax-based query function
*
* @param options object containing configuration paramters
+ * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
* @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
* @param options.url url for the data
* @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
* @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
- * @param options.traditional a boolean flag that should be true if you wish to use the traditional style of param serialization for the ajax request
* @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
* @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
* The expected format is an object containing the following keys:
@@ -284,39 +408,50 @@
*/
function ajax(options) {
var timeout, // current scheduled but not yet executed request
- requestSequence = 0, // sequence used to drop out-of-order responses
handler = null,
- quietMillis = options.quietMillis || 100;
+ quietMillis = options.quietMillis || 100,
+ ajaxUrl = options.url,
+ self = this;
return function (query) {
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
- requestSequence += 1; // increment the sequence
- var requestNumber = requestSequence, // this request's sequence number
- data = options.data, // ajax data function
- transport = options.transport || $.ajax,
- traditional = options.traditional || false,
- type = options.type || 'GET'; // set type of request (GET or POST)
+ var data = options.data, // ajax data function
+ url = ajaxUrl, // ajax url string or function
+ transport = options.transport || $.fn.select2.ajaxDefaults.transport,
+ // deprecated - to be removed in 4.0 - use params instead
+ deprecated = {
+ type: options.type || 'GET', // set type of request (GET or POST)
+ cache: options.cache || false,
+ jsonpCallback: options.jsonpCallback||undefined,
+ dataType: options.dataType||"json"
+ },
+ params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
- data = data.call(this, query.term, query.page, query.context);
+ data = data ? data.call(self, query.term, query.page, query.context) : null;
+ url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
- if( null !== handler) { handler.abort(); }
+ if (handler) { handler.abort(); }
- handler = transport.call(null, {
- url: options.url,
+ if (options.params) {
+ if ($.isFunction(options.params)) {
+ $.extend(params, options.params.call(self));
+ } else {
+ $.extend(params, options.params);
+ }
+ }
+
+ $.extend(params, {
+ url: url,
dataType: options.dataType,
data: data,
- type: type,
- traditional: traditional,
success: function (data) {
- if (requestNumber < requestSequence) {
- return;
- }
- // TODO 3.0 - replace query.page with query so users have access to term, page, etc.
+ // TODO - replace query.page with query so users have access to term, page, etc.
var results = options.results(data, query.page);
query.callback(results);
}
});
+ handler = transport.call(self, params);
}, quietMillis);
};
}
@@ -338,22 +473,33 @@
function local(options) {
var data = options, // data elements
dataText,
+ tmp,
text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
- if (!$.isArray(data)) {
- text = data.text;
+ if ($.isArray(data)) {
+ tmp = data;
+ data = { results: tmp };
+ }
+
+ if ($.isFunction(data) === false) {
+ tmp = data;
+ data = function() { return tmp; };
+ }
+
+ var dataItem = data();
+ if (dataItem.text) {
+ text = dataItem.text;
// if text is not a function we assume it to be a key name
if (!$.isFunction(text)) {
- dataText = data.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
- text = function (item) { return item[dataText]; };
+ dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
+ text = function (item) { return item[dataText]; };
}
- data = data.results;
}
return function (query) {
var t = query.term, filtered = { results: [] }, process;
if (t === "") {
- query.callback({results: data});
+ query.callback(data());
return;
}
@@ -367,34 +513,27 @@
}
group.children=[];
$(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
- if (group.children.length) {
+ if (group.children.length || query.matcher(t, text(group), datum)) {
collection.push(group);
}
} else {
- if (query.matcher(t, text(datum))) {
+ if (query.matcher(t, text(datum), datum)) {
collection.push(datum);
}
}
};
- $(data).each2(function(i, datum) { process(datum, filtered.results); });
+ $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
query.callback(filtered);
};
}
// TODO javadoc
function tags(data) {
- // TODO even for a function we should probably return a wrapper that does the same object/string check as
- // the function for arrays. otherwise only functions that return objects are supported.
- if ($.isFunction(data)) {
- return data;
- }
-
- // if not a function we assume it to be an array
-
+ var isFunc = $.isFunction(data);
return function (query) {
var t = query.term, filtered = {results: []};
- $(data).each(function () {
+ $(isFunc ? data() : data).each(function () {
var isObject = this.text !== undefined,
text = isObject ? this.text : this;
if (t === "" || query.matcher(t, text)) {
@@ -416,7 +555,7 @@
function checkFormatter(formatter, formatterName) {
if ($.isFunction(formatter)) return true;
if (!formatter) return false;
- throw new Error("formatterName must be a function or a falsy value");
+ throw new Error(formatterName +" must be a function or a falsy value");
}
function evaluate(val) {
@@ -471,7 +610,7 @@
input = input.substring(index + separator.length);
if (token.length > 0) {
- token = opts.createSearchChoice(token, selection);
+ token = opts.createSearchChoice.call(this, token, selection);
if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
dupe = false;
for (i = 0, l = selection.length; i < l; i++) {
@@ -485,38 +624,9 @@
}
}
- if (original.localeCompare(input) != 0) return input;
+ if (original!==input) return input;
}
- /**
- * blurs any Select2 container that has focus when an element outside them was clicked or received focus
- *
- * also takes care of clicks on label tags that point to the source element
- */
- $(document).ready(function () {
- $(document).delegate("*", "mousedown touchend", function (e) {
- var target = $(e.target).closest("div.select2-container").get(0), attr;
- if (target) {
- $(document).find("div.select2-container-active").each(function () {
- if (this !== target) $(this).data("select2").blur();
- });
- } else {
- target = $(e.target).closest("div.select2-drop").get(0);
- $(document).find("div.select2-drop-active").each(function () {
- if (this !== target) $(this).data("select2").blur();
- });
- }
-
- target=$(e.target);
- attr = target.attr("for");
- if ("LABEL" === e.target.tagName && attr && attr.length > 0) {
- target = $("#"+attr);
- target = target.data("select2");
- if (target !== undefined) { target.focus(); e.preventDefault();}
- }
- });
- });
-
/**
* Creates a new class
*
@@ -554,10 +664,9 @@
// destroy if called on an existing component
if (opts.element.data("select2") !== undefined &&
opts.element.data("select2") !== null) {
- this.destroy();
+ opts.element.data("select2").destroy();
}
- this.enabled=true;
this.container = this.createContainer();
this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
@@ -567,46 +676,57 @@
// cache the body so future lookups are cheap
this.body = thunk(function() { return opts.element.closest("body"); });
- if (opts.element.attr("class") !== undefined) {
- this.container.addClass(opts.element.attr("class").replace(/validate\[[\S ]+] ?/, ''));
- }
+ syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
+ this.container.attr("style", opts.element.attr("style"));
this.container.css(evaluate(opts.containerCss));
this.container.addClass(evaluate(opts.containerCssClass));
+ this.elementTabIndex = this.opts.element.attr("tabindex");
+
// swap container for the element
this.opts.element
.data("select2", this)
- .hide()
- .before(this.container);
+ .attr("tabindex", "-1")
+ .before(this.container)
+ .on("click.select2", killEvent); // do not leak click events
+
this.container.data("select2", this);
this.dropdown = this.container.find(".select2-drop");
+
+ syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
+
this.dropdown.addClass(evaluate(opts.dropdownCssClass));
this.dropdown.data("select2", this);
+ this.dropdown.on("click", killEvent);
this.results = results = this.container.find(resultsSelector);
this.search = search = this.container.find("input.select2-input");
- search.attr("tabIndex", this.opts.element.attr("tabIndex"));
-
+ this.queryCount = 0;
this.resultsPage = 0;
this.context = null;
// initialize the container
this.initContainer();
- this.initContainerWidth();
+
+ this.container.on("click", killEvent);
installFilteredMouseMove(this.results);
- this.dropdown.delegate(resultsSelector, "mousemove-filtered", this.bind(this.highlightUnderEvent));
+ this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent));
installDebouncedScroll(80, this.results);
- this.dropdown.delegate(resultsSelector, "scroll-debounced", this.bind(this.loadMoreIfNeeded));
+ this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
+
+ // do not propagate change event from the search field out of the component
+ $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
+ $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
// if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
if ($.fn.mousewheel) {
results.mousewheel(function (e, delta, deltaX, deltaY) {
- var top = results.scrollTop(), height;
+ var top = results.scrollTop();
if (deltaY > 0 && top - deltaY <= 0) {
results.scrollTop(0);
killEvent(e);
@@ -618,24 +738,21 @@
}
installKeyUpChangeEvent(search);
- search.bind("keyup-change", this.bind(this.updateResults));
- search.bind("focus", function () { search.addClass("select2-focused"); if (search.val() === " ") search.val(""); });
- search.bind("blur", function () { search.removeClass("select2-focused");});
+ search.on("keyup-change input paste", this.bind(this.updateResults));
+ search.on("focus", function () { search.addClass("select2-focused"); });
+ search.on("blur", function () { search.removeClass("select2-focused");});
- this.dropdown.delegate(resultsSelector, "mouseup", this.bind(function (e) {
- if ($(e.target).closest(".select2-result-selectable:not(.select2-disabled)").length > 0) {
+ this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
+ if ($(e.target).closest(".select2-result-selectable").length > 0) {
this.highlightUnderEvent(e);
this.selectHighlighted(e);
- } else {
- this.focusSearch();
}
- killEvent(e);
}));
// trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
// for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
// dom it will trigger the popup close, which is not what we want
- this.dropdown.bind("click mouseup mousedown", function (e) { e.stopPropagation(); });
+ this.dropdown.on("click mouseup mousedown", function (e) { e.stopPropagation(); });
if ($.isFunction(this.opts.initSelection)) {
// initialize selection based on the current value of the source element
@@ -646,25 +763,77 @@
this.monitorSource();
}
- if (opts.element.is(":disabled") || opts.element.is("[readonly='readonly']")) this.disable();
+ if (opts.maximumInputLength !== null) {
+ this.search.attr("maxlength", opts.maximumInputLength);
+ }
+
+ var disabled = opts.element.prop("disabled");
+ if (disabled === undefined) disabled = false;
+ this.enable(!disabled);
+
+ var readonly = opts.element.prop("readonly");
+ if (readonly === undefined) readonly = false;
+ this.readonly(readonly);
+
+ // Calculate size of scrollbar
+ scrollBarDimensions = scrollBarDimensions || measureScrollbar();
+
+ this.autofocus = opts.element.prop("autofocus");
+ opts.element.prop("autofocus", false);
+ if (this.autofocus) this.focus();
+
+ this.nextSearchTerm = undefined;
},
// abstract
destroy: function () {
- var select2 = this.opts.element.data("select2");
+ var element=this.opts.element, select2 = element.data("select2");
+
+ this.close();
+
+ if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
+
if (select2 !== undefined) {
select2.container.remove();
select2.dropdown.remove();
- select2.opts.element
+ element
+ .removeClass("select2-offscreen")
.removeData("select2")
- .unbind(".select2")
- .show();
+ .off(".select2")
+ .prop("autofocus", this.autofocus || false);
+ if (this.elementTabIndex) {
+ element.attr({tabindex: this.elementTabIndex});
+ } else {
+ element.removeAttr("tabindex");
+ }
+ element.show();
+ }
+ },
+
+ // abstract
+ optionToData: function(element) {
+ if (element.is("option")) {
+ return {
+ id:element.prop("value"),
+ text:element.text(),
+ element: element.get(),
+ css: element.attr("class"),
+ disabled: element.prop("disabled"),
+ locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
+ };
+ } else if (element.is("optgroup")) {
+ return {
+ text:element.attr("label"),
+ children:[],
+ element: element.get(),
+ css: element.attr("class")
+ };
}
},
// abstract
prepareOpts: function (opts) {
- var element, select, idKey, ajaxUrl;
+ var element, select, idKey, ajaxUrl, self = this;
element = opts.element;
@@ -683,30 +852,37 @@
opts = $.extend({}, {
populateResults: function(container, results, query) {
- var populate, data, result, children, id=this.opts.id, self=this;
+ var populate, id=this.opts.id;
populate=function(results, container, depth) {
- var i, l, result, selectable, compound, node, label, innerContainer, formatted;
+ var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
+
+ results = opts.sortResults(results, container, query);
+
for (i = 0, l = results.length; i < l; i = i + 1) {
result=results[i];
- selectable=id(result) !== undefined;
- compound=("children" in result) && result.children.length > 0;
+
+ disabled = (result.disabled === true);
+ selectable = (!disabled) && (id(result) !== undefined);
+
+ compound=result.children && result.children.length > 0;
node=$(" ");
node.addClass("select2-results-dept-"+depth);
node.addClass("select2-result");
node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
+ if (disabled) { node.addClass("select2-disabled"); }
if (compound) { node.addClass("select2-result-with-children"); }
node.addClass(self.opts.formatResultCssClass(result));
- label=$("
");
+ label=$(document.createElement("div"));
label.addClass("select2-result-label");
- formatted=opts.formatResult(result, label, query);
+ formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
if (formatted!==undefined) {
- label.html(self.opts.escapeMarkup(formatted));
+ label.html(formatted);
}
node.append(label);
@@ -733,20 +909,27 @@
opts.id = function (e) { return e[idKey]; };
}
+ if ($.isArray(opts.element.data("select2Tags"))) {
+ if ("tags" in opts) {
+ throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
+ }
+ opts.tags=opts.element.data("select2Tags");
+ }
+
if (select) {
opts.query = this.bind(function (query) {
var data = { results: [], more: false },
term = query.term,
- children, firstChild, process;
+ children, placeholderOption, process;
process=function(element, collection) {
var group;
if (element.is("option")) {
if (query.matcher(term, element.text(), element)) {
- collection.push({id:element.attr("value"), text:element.text(), element: element.get(), css: element.attr("class")});
+ collection.push(self.optionToData(element));
}
} else if (element.is("optgroup")) {
- group={text:element.attr("label"), children:[], element: element.get(), css: element.attr("class")};
+ group=self.optionToData(element);
element.children().each2(function(i, elm) { process(elm, group.children); });
if (group.children.length>0) {
collection.push(group);
@@ -758,9 +941,9 @@
// ignore the placeholder option if there is one
if (this.getPlaceholder() !== undefined && children.length > 0) {
- firstChild = children[0];
- if ($(firstChild).text() === "") {
- children=children.not(firstChild);
+ placeholderOption = this.getPlaceholderOption();
+ if (placeholderOption) {
+ children=children.not(placeholderOption);
}
}
@@ -770,31 +953,37 @@
});
// this is needed because inside val() we construct choices from options and there id is hardcoded
opts.id=function(e) { return e.id; };
- opts.formatResultCssClass = function(data) { return data.css; }
+ opts.formatResultCssClass = function(data) { return data.css; };
} else {
if (!("query" in opts)) {
+
if ("ajax" in opts) {
ajaxUrl = opts.element.data("ajax-url");
if (ajaxUrl && ajaxUrl.length > 0) {
opts.ajax.url = ajaxUrl;
}
- opts.query = ajax(opts.ajax);
+ opts.query = ajax.call(opts.element, opts.ajax);
} else if ("data" in opts) {
opts.query = local(opts.data);
} else if ("tags" in opts) {
opts.query = tags(opts.tags);
- opts.createSearchChoice = function (term) { return {id: term, text: term}; };
- opts.initSelection = function (element, callback) {
- var data = [];
- $(splitVal(element.val(), opts.separator)).each(function () {
- var id = this, text = this, tags=opts.tags;
- if ($.isFunction(tags)) tags=tags();
- $(tags).each(function() { if (equal(this.id, id)) { text = this.text; return false; } });
- data.push({id: id, text: text});
- });
+ if (opts.createSearchChoice === undefined) {
+ opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
+ }
+ if (opts.initSelection === undefined) {
+ opts.initSelection = function (element, callback) {
+ var data = [];
+ $(splitVal(element.val(), opts.separator)).each(function () {
+ var obj = { id: this, text: this },
+ tags = opts.tags;
+ if ($.isFunction(tags)) tags=tags();
+ $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
+ data.push(obj);
+ });
- callback(data);
- };
+ callback(data);
+ };
+ }
}
}
}
@@ -810,11 +999,57 @@
*/
// abstract
monitorSource: function () {
- this.opts.element.bind("change.select2", this.bind(function (e) {
+ var el = this.opts.element, sync, observer;
+
+ el.on("change.select2", this.bind(function (e) {
if (this.opts.element.data("select2-change-triggered") !== true) {
this.initSelection();
}
}));
+
+ sync = this.bind(function () {
+
+ // sync enabled state
+ var disabled = el.prop("disabled");
+ if (disabled === undefined) disabled = false;
+ this.enable(!disabled);
+
+ var readonly = el.prop("readonly");
+ if (readonly === undefined) readonly = false;
+ this.readonly(readonly);
+
+ syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
+ this.container.addClass(evaluate(this.opts.containerCssClass));
+
+ syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
+ this.dropdown.addClass(evaluate(this.opts.dropdownCssClass));
+
+ });
+
+ // IE8-10
+ el.on("propertychange.select2", sync);
+
+ // hold onto a reference of the callback to work around a chromium bug
+ if (this.mutationCallback === undefined) {
+ this.mutationCallback = function (mutations) {
+ mutations.forEach(sync);
+ }
+ }
+
+ // safari, chrome, firefox, IE11
+ observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
+ if (observer !== undefined) {
+ if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
+ this.propertyObserver = new observer(this.mutationCallback);
+ this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
+ }
+ },
+
+ // abstract
+ triggerSelect: function(data) {
+ var evt = $.Event("select2-selecting", { val: this.id(data), object: data });
+ this.opts.element.trigger(evt);
+ return !evt.isDefaultPrevented();
},
/**
@@ -840,23 +1075,50 @@
this.opts.element.blur();
},
+ //abstract
+ isInterfaceEnabled: function()
+ {
+ return this.enabledInterface === true;
+ },
// abstract
- enable: function() {
- if (this.enabled) return;
+ enableInterface: function() {
+ var enabled = this._enabled && !this._readonly,
+ disabled = !enabled;
- this.enabled=true;
- this.container.removeClass("select2-container-disabled");
+ if (enabled === this.enabledInterface) return false;
+
+ this.container.toggleClass("select2-container-disabled", disabled);
+ this.close();
+ this.enabledInterface = enabled;
+
+ return true;
+ },
+
+ // abstract
+ enable: function(enabled) {
+ if (enabled === undefined) enabled = true;
+ if (this._enabled === enabled) return;
+ this._enabled = enabled;
+
+ this.opts.element.prop("disabled", !enabled);
+ this.enableInterface();
},
// abstract
disable: function() {
- if (!this.enabled) return;
+ this.enable(false);
+ },
- this.close();
+ // abstract
+ readonly: function(enabled) {
+ if (enabled === undefined) enabled = false;
+ if (this._readonly === enabled) return false;
+ this._readonly = enabled;
- this.enabled=false;
- this.container.addClass("select2-container-disabled");
+ this.opts.element.prop("readonly", enabled);
+ this.enableInterface();
+ return true;
},
// abstract
@@ -866,58 +1128,107 @@
// abstract
positionDropdown: function() {
- var offset = this.container.offset(),
- height = this.container.outerHeight(),
- width = this.container.outerWidth(),
- dropHeight = this.dropdown.outerHeight(),
- viewportBottom = $(window).scrollTop() + document.documentElement.clientHeight,
+ var $dropdown = this.dropdown,
+ offset = this.container.offset(),
+ height = this.container.outerHeight(false),
+ width = this.container.outerWidth(false),
+ dropHeight = $dropdown.outerHeight(false),
+ $window = $(window),
+ windowWidth = $window.width(),
+ windowHeight = $window.height(),
+ viewPortRight = $window.scrollLeft() + windowWidth,
+ viewportBottom = $window.scrollTop() + windowHeight,
dropTop = offset.top + height,
dropLeft = offset.left,
enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
enoughRoomAbove = (offset.top - dropHeight) >= this.body().scrollTop(),
- aboveNow = this.dropdown.hasClass("select2-drop-above"),
+ dropWidth = $dropdown.outerWidth(false),
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
+ aboveNow = $dropdown.hasClass("select2-drop-above"),
bodyOffset,
above,
- css;
+ changeDirection,
+ css,
+ resultsListNode;
- // console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
- // console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);
+ // always prefer the current above/below alignment, unless there is not enough room
+ if (aboveNow) {
+ above = true;
+ if (!enoughRoomAbove && enoughRoomBelow) {
+ changeDirection = true;
+ above = false;
+ }
+ } else {
+ above = false;
+ if (!enoughRoomBelow && enoughRoomAbove) {
+ changeDirection = true;
+ above = true;
+ }
+ }
+
+ //if we are changing direction we need to get positions when dropdown is hidden;
+ if (changeDirection) {
+ $dropdown.hide();
+ offset = this.container.offset();
+ height = this.container.outerHeight(false);
+ width = this.container.outerWidth(false);
+ dropHeight = $dropdown.outerHeight(false);
+ viewPortRight = $window.scrollLeft() + windowWidth;
+ viewportBottom = $window.scrollTop() + windowHeight;
+ dropTop = offset.top + height;
+ dropLeft = offset.left;
+ dropWidth = $dropdown.outerWidth(false);
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
+ $dropdown.show();
+ }
+
+ if (this.opts.dropdownAutoWidth) {
+ resultsListNode = $('.select2-results', $dropdown)[0];
+ $dropdown.addClass('select2-drop-auto-width');
+ $dropdown.css('width', '');
+ // Add scrollbar width to dropdown if vertical scrollbar is present
+ dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
+ dropWidth > width ? width = dropWidth : dropWidth = width;
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
+ }
+ else {
+ this.container.removeClass('select2-drop-auto-width');
+ }
+
+ //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
+ //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);
// fix positioning when body has an offset and is not position: static
-
if (this.body().css('position') !== 'static') {
bodyOffset = this.body().offset();
dropTop -= bodyOffset.top;
dropLeft -= bodyOffset.left;
}
- // always prefer the current above/below alignment, unless there is not enough room
-
- if (aboveNow) {
- above = true;
- if (!enoughRoomAbove && enoughRoomBelow) above = false;
- } else {
- above = false;
- if (!enoughRoomBelow && enoughRoomAbove) above = true;
+ if (!enoughRoomOnRight) {
+ dropLeft = offset.left + width - dropWidth;
}
- if (above) {
- dropTop = offset.top - dropHeight;
- this.container.addClass("select2-drop-above");
- this.dropdown.addClass("select2-drop-above");
- }
- else {
- this.container.removeClass("select2-drop-above");
- this.dropdown.removeClass("select2-drop-above");
- }
-
- css = $.extend({
- top: dropTop,
+ css = {
left: dropLeft,
width: width
- }, evaluate(this.opts.dropdownCss));
+ };
- this.dropdown.css(css);
+ if (above) {
+ css.bottom = windowHeight - offset.top;
+ css.top = 'auto';
+ this.container.addClass("select2-drop-above");
+ $dropdown.addClass("select2-drop-above");
+ }
+ else {
+ css.top = dropTop;
+ css.bottom = 'auto';
+ this.container.removeClass("select2-drop-above");
+ $dropdown.removeClass("select2-drop-above");
+ }
+ css = $.extend(css, evaluate(this.opts.dropdownCss));
+
+ $dropdown.css(css);
},
// abstract
@@ -926,7 +1237,9 @@
if (this.opened()) return false;
- event = jQuery.Event("open");
+ if (this._enabled === false || this._readonly === true) return false;
+
+ event = $.Event("select2-opening");
this.opts.element.trigger(event);
return !event.isDefaultPrevented();
},
@@ -949,7 +1262,7 @@
if (!this.shouldOpen()) return false;
- window.setTimeout(this.bind(this.opening), 1);
+ this.opening();
return true;
},
@@ -959,68 +1272,105 @@
*/
// abstract
opening: function() {
- var cid = this.containerId, selector = this.containerSelector,
- scroll = "scroll." + cid, resize = "resize." + cid;
-
- this.container.parents().each(function() {
- $(this).bind(scroll, function() {
- var s2 = $(selector);
- if (s2.length == 0) {
- $(this).unbind(scroll);
- }
- s2.select2("close");
- });
- });
-
- $(window).bind(resize, function() {
- var s2 = $(selector);
- if (s2.length == 0) {
- $(window).unbind(resize);
- }
- s2.select2("close");
- });
-
- this.clearDropdownAlignmentPreference();
-
- if (this.search.val() === " ") { this.search.val(""); }
+ var cid = this.containerId,
+ scroll = "scroll." + cid,
+ resize = "resize."+cid,
+ orient = "orientationchange."+cid,
+ mask;
this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
- this.updateResults(true);
+ this.clearDropdownAlignmentPreference();
if(this.dropdown[0] !== this.body().children().last()[0]) {
this.dropdown.detach().appendTo(this.body());
}
- this.dropdown.show();
+ // create the dropdown mask if doesnt already exist
+ mask = $("#select2-drop-mask");
+ if (mask.length == 0) {
+ mask = $(document.createElement("div"));
+ mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
+ mask.hide();
+ mask.appendTo(this.body());
+ mask.on("mousedown touchstart click", function (e) {
+ var dropdown = $("#select2-drop"), self;
+ if (dropdown.length > 0) {
+ self=dropdown.data("select2");
+ if (self.opts.selectOnBlur) {
+ self.selectHighlighted({noFocus: true});
+ }
+ self.close({focus:true});
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+ }
+
+ // ensure the mask is always right before the dropdown
+ if (this.dropdown.prev()[0] !== mask[0]) {
+ this.dropdown.before(mask);
+ }
+
+ // move the global id to the correct dropdown
+ $("#select2-drop").removeAttr("id");
+ this.dropdown.attr("id", "select2-drop");
+
+ // show the elements
+ mask.show();
this.positionDropdown();
+ this.dropdown.show();
+ this.positionDropdown();
+
this.dropdown.addClass("select2-drop-active");
- this.ensureHighlightVisible();
+ // attach listeners to events that can change the position of the container and thus require
+ // the position of the dropdown to be updated as well so it does not come unglued from the container
+ var that = this;
+ this.container.parents().add(window).each(function () {
+ $(this).on(resize+" "+scroll+" "+orient, function (e) {
+ that.positionDropdown();
+ });
+ });
+
- this.focusSearch();
},
// abstract
close: function () {
if (!this.opened()) return;
- var self = this;
+ var cid = this.containerId,
+ scroll = "scroll." + cid,
+ resize = "resize."+cid,
+ orient = "orientationchange."+cid;
- this.container.parents().each(function() {
- $(this).unbind("scroll." + self.containerId);
- });
- $(window).unbind("resize." + this.containerId);
+ // unbind event listeners
+ this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
this.clearDropdownAlignmentPreference();
+ $("#select2-drop-mask").hide();
+ this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
this.dropdown.hide();
this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
this.results.empty();
- this.clearSearch();
- this.opts.element.trigger(jQuery.Event("close"));
+
+ this.clearSearch();
+ this.search.removeClass("select2-active");
+ this.opts.element.trigger($.Event("select2-close"));
+ },
+
+ /**
+ * Opens control, sets input value, and updates results.
+ */
+ // abstract
+ externalSearch: function (term) {
+ this.open();
+ this.search.val(term);
+ this.updateResults(false);
},
// abstract
@@ -1028,6 +1378,11 @@
},
+ //abstract
+ getMaximumSelectionSize: function() {
+ return evaluate(this.opts.maximumSelectionSize);
+ },
+
// abstract
ensureHighlightVisible: function () {
var results = this.results, children, index, child, hb, rb, y, more;
@@ -1046,41 +1401,46 @@
return;
}
- children = results.find(".select2-result-selectable");
+ children = this.findHighlightableChoices().find('.select2-result-label');
child = $(children[index]);
- hb = child.offset().top + child.outerHeight();
+ hb = child.offset().top + child.outerHeight(true);
// if this is the last child lets also make sure select2-more-results is visible
if (index === children.length - 1) {
more = results.find("li.select2-more-results");
if (more.length > 0) {
- hb = more.offset().top + more.outerHeight();
+ hb = more.offset().top + more.outerHeight(true);
}
}
- rb = results.offset().top + results.outerHeight();
+ rb = results.offset().top + results.outerHeight(true);
if (hb > rb) {
results.scrollTop(results.scrollTop() + (hb - rb));
}
y = child.offset().top - results.offset().top;
// make sure the top of the element is visible
- if (y < 0) {
+ if (y < 0 && child.css('display') != 'none' ) {
results.scrollTop(results.scrollTop() + y); // y is negative
}
},
+ // abstract
+ findHighlightableChoices: function() {
+ return this.results.find(".select2-result-selectable:not(.select2-disabled, .select2-selected)");
+ },
+
// abstract
moveHighlight: function (delta) {
- var choices = this.results.find(".select2-result-selectable"),
+ var choices = this.findHighlightableChoices(),
index = this.highlight();
while (index > -1 && index < choices.length) {
index += delta;
var choice = $(choices[index]);
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled")) {
+ if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
this.highlight(index);
break;
}
@@ -1089,7 +1449,9 @@
// abstract
highlight: function (index) {
- var choices = this.results.find(".select2-result-selectable").not(".select2-disabled");
+ var choices = this.findHighlightableChoices(),
+ choice,
+ data;
if (arguments.length === 0) {
return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
@@ -1098,27 +1460,37 @@
if (index >= choices.length) index = choices.length - 1;
if (index < 0) index = 0;
- choices.removeClass("select2-highlighted");
+ this.removeHighlight();
+
+ choice = $(choices[index]);
+ choice.addClass("select2-highlighted");
- $(choices[index]).addClass("select2-highlighted");
this.ensureHighlightVisible();
+ data = choice.data("select2-data");
+ if (data) {
+ this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
+ }
+ },
+
+ removeHighlight: function() {
+ this.results.find(".select2-highlighted").removeClass("select2-highlighted");
},
// abstract
countSelectableResults: function() {
- return this.results.find(".select2-result-selectable").not(".select2-disabled").length;
+ return this.findHighlightableChoices().length;
},
// abstract
highlightUnderEvent: function (event) {
var el = $(event.target).closest(".select2-result-selectable");
if (el.length > 0 && !el.is(".select2-highlighted")) {
- var choices = this.results.find('.select2-result-selectable');
+ var choices = this.findHighlightableChoices();
this.highlight(choices.index(el));
} else if (el.length == 0) {
- // if we are over an unselectable item remove al highlights
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
+ // if we are over an unselectable item remove all highlights
+ this.removeHighlight();
}
},
@@ -1127,7 +1499,6 @@
var results = this.results,
more = results.find("li.select2-more-results"),
below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
- offset = -1, // index of first element without data
page = this.resultsPage + 1,
self=this,
term=this.search.val(),
@@ -1136,9 +1507,10 @@
if (more.length === 0) return;
below = more.offset().top - results.offset().top - results.height();
- if (below <= 0) {
+ if (below <= this.opts.loadMorePadding) {
more.addClass("select2-active");
this.opts.query({
+ element: this.opts.element,
term: term,
page: page,
context: context,
@@ -1150,6 +1522,7 @@
self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
+ self.postprocessResults(data, false, false);
if (data.more===true) {
more.detach().appendTo(results).text(self.opts.formatLoadMore(page+1));
@@ -1159,6 +1532,8 @@
}
self.positionDropdown();
self.resultsPage = page;
+ self.context = data.context;
+ this.opts.element.trigger({ type: "select2-loaded", items: data });
})});
}
},
@@ -1175,42 +1550,75 @@
*/
// abstract
updateResults: function (initial) {
- var search = this.search, results = this.results, opts = this.opts, data, self=this, input;
+ var search = this.search,
+ results = this.results,
+ opts = this.opts,
+ data,
+ self = this,
+ input,
+ term = search.val(),
+ lastTerm = $.data(this.container, "select2-last-term"),
+ // sequence number used to drop out-of-order responses
+ queryNumber;
+
+ // prevent duplicate queries against the same term
+ if (initial !== true && lastTerm && equal(term, lastTerm)) return;
+
+ $.data(this.container, "select2-last-term", term);
// if the search is currently hidden we do not alter the results
if (initial !== true && (this.showSearchInput === false || !this.opened())) {
return;
}
- search.addClass("select2-active");
-
function postRender() {
- results.scrollTop(0);
search.removeClass("select2-active");
self.positionDropdown();
}
function render(html) {
- results.html(self.opts.escapeMarkup(html));
+ results.html(html);
postRender();
}
- if (opts.maximumSelectionSize >=1) {
+ queryNumber = ++this.queryCount;
+
+ var maxSelSize = this.getMaximumSelectionSize();
+ if (maxSelSize >=1) {
data = this.data();
- if ($.isArray(data) && data.length >= opts.maximumSelectionSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
- render("" + opts.formatSelectionTooBig(opts.maximumSelectionSize) + " ");
- return;
+ if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
+ render("" + opts.formatSelectionTooBig(maxSelSize) + " ");
+ return;
}
}
- if (search.val().length < opts.minimumInputLength && checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
- render("" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + " ");
+ if (search.val().length < opts.minimumInputLength) {
+ if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
+ render("" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + " ");
+ } else {
+ render("");
+ }
+ if (initial && this.showSearch) this.showSearch(true);
return;
}
- else {
+
+ if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
+ if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
+ render("" + opts.formatInputTooLong(search.val(), opts.maximumInputLength) + " ");
+ } else {
+ render("");
+ }
+ return;
+ }
+
+ if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
render("" + opts.formatSearching() + " ");
}
+ search.addClass("select2-active");
+
+ this.removeHighlight();
+
// give the tokenizer a chance to pre-process the input
input = this.tokenize();
if (input != undefined && input != null) {
@@ -1218,7 +1626,9 @@
}
this.resultsPage = 1;
+
opts.query({
+ element: opts.element,
term: search.val(),
page: this.resultsPage,
context: null,
@@ -1226,15 +1636,22 @@
callback: this.bind(function (data) {
var def; // default choice
+ // ignore old responses
+ if (queryNumber != this.queryCount) {
+ return;
+ }
+
// ignore a response if the select2 has been closed before it was received
- if (!this.opened()) return;
+ if (!this.opened()) {
+ this.search.removeClass("select2-active");
+ return;
+ }
// save context, if any
this.context = (data.context===undefined) ? null : data.context;
-
// create a default choice and prepend it to the list
if (this.opts.createSearchChoice && search.val() !== "") {
- def = this.opts.createSearchChoice.call(null, search.val(), data.results);
+ def = this.opts.createSearchChoice.call(self, search.val(), data.results);
if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
if ($(data.results).filter(
function () {
@@ -1261,6 +1678,8 @@
this.postprocessResults(data, initial);
postRender();
+
+ this.opts.element.trigger({ type: "select2-loaded", items: data });
})});
},
@@ -1271,9 +1690,12 @@
// abstract
blur: function () {
+ // if selectOnBlur == true, select the currently highlighted option
+ if (this.opts.selectOnBlur)
+ this.selectHighlighted({noFocus: true});
+
this.close();
this.container.removeClass("select2-container-active");
- this.dropdown.removeClass("select2-drop-active");
// synonymous to .is(':focus'), which is available in jquery >= 1.6
if (this.search[0] === document.activeElement) { this.search.blur(); }
this.clearSearch();
@@ -1282,38 +1704,46 @@
// abstract
focusSearch: function () {
- // need to do it here as well as in timeout so it works in IE
- this.search.show();
- this.search.focus();
-
- /* we do this in a timeout so that current event processing can complete before this code is executed.
- this makes sure the search field is focussed even if the current event would blur it */
- window.setTimeout(this.bind(function () {
- // reset the value so IE places the cursor at the end of the input box
- this.search.show();
- this.search.focus();
- this.search.val(this.search.val());
- }), 10);
+ focus(this.search);
},
// abstract
- selectHighlighted: function () {
+ selectHighlighted: function (options) {
var index=this.highlight(),
- highlighted=this.results.find(".select2-highlighted").not(".select2-disabled"),
- data = highlighted.closest('.select2-result-selectable').data("select2-data");
+ highlighted=this.results.find(".select2-highlighted"),
+ data = highlighted.closest('.select2-result').data("select2-data");
+
if (data) {
- highlighted.addClass("select2-disabled");
this.highlight(index);
- this.onSelect(data);
+ this.onSelect(data, options);
+ } else if (options && options.noFocus) {
+ this.close();
}
},
// abstract
getPlaceholder: function () {
+ var placeholderOption;
return this.opts.element.attr("placeholder") ||
this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
this.opts.element.data("placeholder") ||
- this.opts.placeholder;
+ this.opts.placeholder ||
+ ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
+ },
+
+ // abstract
+ getPlaceholderOption: function() {
+ if (this.select) {
+ var firstOption = this.select.children('option').first();
+ if (this.opts.placeholderOption !== undefined ) {
+ //Determine the placeholder option based on the specified placeholderOption setting
+ return (this.opts.placeholderOption === "first" && firstOption) ||
+ (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
+ } else if (firstOption.text() === "" && firstOption.val() === "") {
+ //No explicit placeholder option specified, use the first if it's blank
+ return firstOption;
+ }
+ }
},
/**
@@ -1325,20 +1755,20 @@
// abstract
initContainerWidth: function () {
function resolveContainerWidth() {
- var style, attrs, matches, i, l;
+ var style, attrs, matches, i, l, attr;
if (this.opts.width === "off") {
return null;
} else if (this.opts.width === "element"){
- return this.opts.element.outerWidth() === 0 ? 'auto' : this.opts.element.outerWidth() + 'px';
+ return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
} else if (this.opts.width === "copy" || this.opts.width === "resolve") {
// check if there is inline style on the element that contains width
style = this.opts.element.attr('style');
if (style !== undefined) {
attrs = style.split(';');
for (i = 0, l = attrs.length; i < l; i = i + 1) {
- matches = attrs[i].replace(/\s/g, '')
- .match(/width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/);
+ attr = attrs[i].replace(/\s/g, '');
+ matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
if (matches !== null && matches.length >= 1)
return matches[1];
}
@@ -1351,7 +1781,7 @@
if (style.indexOf("%") > 0) return style;
// finally, fallback on the calculated width of the element
- return (this.opts.element.outerWidth() === 0 ? 'auto' : this.opts.element.outerWidth() + 'px');
+ return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
}
return null;
@@ -1364,7 +1794,7 @@
var width = resolveContainerWidth.call(this);
if (width !== null) {
- this.container.attr("style", "width: "+width);
+ this.container.css("width", width);
}
}
});
@@ -1373,53 +1803,115 @@
// single
- createContainer: function () {
- var container = $("
", {
+ createContainer: function () {
+ var container = $(document.createElement("div")).attr({
"class": "select2-container"
}).html([
- " ",
- " ",
- "
" ,
+ " ",
+ " ",
+ " ",
" ",
- " " ,
- "
" ,
- " " ,
- "
" ,
- "
" ,
+ "
",
+ "
",
+ "
",
+ " ",
+ "
",
+ "
",
"
"].join(""));
return container;
},
// single
- opening: function () {
- this.search.show();
- this.parent.opening.apply(this, arguments);
- this.dropdown.removeClass("select2-offscreen");
+ enableInterface: function() {
+ if (this.parent.enableInterface.apply(this, arguments)) {
+ this.focusser.prop("disabled", !this.isInterfaceEnabled());
+ }
},
// single
- close: function () {
+ opening: function () {
+ var el, range, len;
+
+ if (this.opts.minimumResultsForSearch >= 0) {
+ this.showSearch(true);
+ }
+
+ this.parent.opening.apply(this, arguments);
+
+ if (this.showSearchInput !== false) {
+ // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
+ // all other browsers handle this just fine
+
+ this.search.val(this.focusser.val());
+ }
+ this.search.focus();
+ // move the cursor to the end after focussing, otherwise it will be at the beginning and
+ // new text will appear *before* focusser.val()
+ el = this.search.get(0);
+ if (el.createTextRange) {
+ range = el.createTextRange();
+ range.collapse(false);
+ range.select();
+ } else if (el.setSelectionRange) {
+ len = this.search.val().length;
+ el.setSelectionRange(len, len);
+ }
+
+ // initializes search's value with nextSearchTerm (if defined by user)
+ // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
+ if(this.search.val() === "") {
+ if(this.nextSearchTerm != undefined){
+ this.search.val(this.nextSearchTerm);
+ this.search.select();
+ }
+ }
+
+ this.focusser.prop("disabled", true).val("");
+ this.updateResults(true);
+ this.opts.element.trigger($.Event("select2-open"));
+ },
+
+ // single
+ close: function (params) {
if (!this.opened()) return;
this.parent.close.apply(this, arguments);
- this.dropdown.removeAttr("style").addClass("select2-offscreen").insertAfter(this.selection).show();
+
+ params = params || {focus: true};
+ this.focusser.removeAttr("disabled");
+
+ if (params.focus) {
+ this.focusser.focus();
+ }
},
// single
focus: function () {
- this.close();
- this.selection.focus();
+ if (this.opened()) {
+ this.close();
+ } else {
+ this.focusser.removeAttr("disabled");
+ this.focusser.focus();
+ }
},
// single
isFocused: function () {
- return this.selection[0] === document.activeElement;
+ return this.container.hasClass("select2-container-active");
},
// single
cancel: function () {
this.parent.cancel.apply(this, arguments);
- this.selection.focus();
+ this.focusser.removeAttr("disabled");
+ this.focusser.focus();
+ },
+
+ // single
+ destroy: function() {
+ $("label[for='" + this.focusser.attr('id') + "']")
+ .attr('for', this.opts.element.attr("id"));
+ this.parent.destroy.apply(this, arguments);
},
// single
@@ -1427,13 +1919,28 @@
var selection,
container = this.container,
- dropdown = this.dropdown,
- clickingInside = false;
+ dropdown = this.dropdown;
+
+ if (this.opts.minimumResultsForSearch < 0) {
+ this.showSearch(false);
+ } else {
+ this.showSearch(true);
+ }
this.selection = selection = container.find(".select2-choice");
- this.search.bind("keydown", this.bind(function (e) {
- if (!this.enabled) return;
+ this.focusser = container.find(".select2-focusser");
+
+ // rewrite labels from original element to focusser
+ this.focusser.attr("id", "s2id_autogen"+nextUid());
+
+ $("label[for='" + this.opts.element.attr("id") + "']")
+ .attr('for', this.focusser.attr('id'));
+
+ this.focusser.attr("tabindex", this.elementTabIndex);
+
+ this.search.on("keydown", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
// prevent the page from scrolling
@@ -1441,154 +1948,150 @@
return;
}
- if (this.opened()) {
- switch (e.which) {
- case KEY.UP:
- case KEY.DOWN:
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
- killEvent(e);
- return;
- case KEY.TAB:
- case KEY.ENTER:
- this.selectHighlighted();
- killEvent(e);
- return;
- case KEY.ESC:
- this.cancel(e);
- killEvent(e);
- return;
- }
- } else {
-
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
+ switch (e.which) {
+ case KEY.UP:
+ case KEY.DOWN:
+ this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
+ killEvent(e);
return;
- }
-
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
+ case KEY.ENTER:
+ this.selectHighlighted();
+ killEvent(e);
return;
- }
-
- this.open();
-
- if (e.which === KEY.ENTER) {
- // do not propagate the event otherwise we open, and propagate enter which closes
+ case KEY.TAB:
+ this.selectHighlighted({noFocus: true});
+ return;
+ case KEY.ESC:
+ this.cancel(e);
+ killEvent(e);
return;
- }
}
}));
- this.search.bind("focus", this.bind(function() {
- this.selection.attr("tabIndex", "-1");
- }));
- this.search.bind("blur", this.bind(function() {
- if (!this.opened()) this.container.removeClass("select2-container-active");
- window.setTimeout(this.bind(function() { this.selection.attr("tabIndex", this.opts.element.attr("tabIndex")); }), 10);
- }));
-
- selection.bind("mousedown", this.bind(function (e) {
- clickingInside = true;
-
- if (this.opened()) {
- this.close();
- this.selection.focus();
- } else if (this.enabled) {
- this.open();
+ this.search.on("blur", this.bind(function(e) {
+ // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
+ // without this the search field loses focus which is annoying
+ if (document.activeElement === this.body().get(0)) {
+ window.setTimeout(this.bind(function() {
+ this.search.focus();
+ }), 0);
}
-
- clickingInside = false;
}));
- dropdown.bind("mousedown", this.bind(function() { this.search.focus(); }));
+ this.focusser.on("keydown", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
- selection.bind("focus", this.bind(function() {
- this.container.addClass("select2-container-active");
- // hide the search so the tab key does not focus on it
- this.search.attr("tabIndex", "-1");
- }));
-
- selection.bind("blur", this.bind(function() {
- if (!this.opened()) {
- this.container.removeClass("select2-container-active");
- }
- window.setTimeout(this.bind(function() { this.search.attr("tabIndex", this.opts.element.attr("tabIndex")); }), 10);
- }));
-
- selection.bind("keydown", this.bind(function(e) {
- if (!this.enabled) return;
-
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
- // prevent the page from scrolling
- killEvent(e);
- return;
- }
-
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
- || e.which === KEY.ESC) {
+ if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
return;
}
if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
+ killEvent(e);
return;
}
- if (e.which == KEY.DELETE) {
+ if (e.which == KEY.DOWN || e.which == KEY.UP
+ || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
+
+ if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
+
+ this.open();
+ killEvent(e);
+ return;
+ }
+
+ if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
if (this.opts.allowClear) {
this.clear();
}
- return;
- }
-
- this.open();
-
- if (e.which === KEY.ENTER) {
- // do not propagate the event otherwise we open, and propagate enter which closes
killEvent(e);
return;
}
-
- // do not set the search input value for non-alpha-numeric keys
- // otherwise pressing down results in a '(' being set in the search field
- if (e.which < 48 ) { // '0' == 48
- killEvent(e);
- return;
- }
-
- var keyWritten = String.fromCharCode(e.which).toLowerCase();
-
- if (e.shiftKey) {
- keyWritten = keyWritten.toUpperCase();
- }
-
- // focus the field before calling val so the cursor ends up after the value instead of before
- this.search.focus();
- this.search.val(keyWritten);
-
- // prevent event propagation so it doesnt replay on the now focussed search field and result in double key entry
- killEvent(e);
}));
- selection.delegate("abbr", "mousedown", this.bind(function (e) {
- if (!this.enabled) return;
+
+ installKeyUpChangeEvent(this.focusser);
+ this.focusser.on("keyup-change input", this.bind(function(e) {
+ if (this.opts.minimumResultsForSearch >= 0) {
+ e.stopPropagation();
+ if (this.opened()) return;
+ this.open();
+ }
+ }));
+
+ selection.on("mousedown", "abbr", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
this.clear();
- killEvent(e);
+ killEventImmediately(e);
this.close();
- this.triggerChange();
this.selection.focus();
}));
- this.setPlaceholder();
+ selection.on("mousedown", this.bind(function (e) {
- this.search.bind("focus", this.bind(function() {
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
+
+ if (this.opened()) {
+ this.close();
+ } else if (this.isInterfaceEnabled()) {
+ this.open();
+ }
+
+ killEvent(e);
+ }));
+
+ dropdown.on("mousedown", this.bind(function() { this.search.focus(); }));
+
+ selection.on("focus", this.bind(function(e) {
+ killEvent(e);
+ }));
+
+ this.focusser.on("focus", this.bind(function(){
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
+ this.container.addClass("select2-container-active");
+ })).on("blur", this.bind(function() {
+ if (!this.opened()) {
+ this.container.removeClass("select2-container-active");
+ this.opts.element.trigger($.Event("select2-blur"));
+ }
+ }));
+ this.search.on("focus", this.bind(function(){
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
this.container.addClass("select2-container-active");
}));
+
+ this.initContainerWidth();
+ this.opts.element.addClass("select2-offscreen");
+ this.setPlaceholder();
+
},
// single
- clear: function() {
- this.opts.element.val("");
- this.selection.find("span").empty();
- this.selection.removeData("select2-data");
- this.setPlaceholder();
+ clear: function(triggerChange) {
+ var data=this.selection.data("select2-data");
+ if (data) { // guard against queued quick consecutive clicks
+ var evt = $.Event("select2-clearing");
+ this.opts.element.trigger(evt);
+ if (evt.isDefaultPrevented()) {
+ return;
+ }
+ var placeholderOption = this.getPlaceholderOption();
+ this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
+ this.selection.find(".select2-chosen").empty();
+ this.selection.removeData("select2-data");
+ this.setPlaceholder();
+
+ if (triggerChange !== false){
+ this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
+ this.triggerChange({removed:data});
+ }
+ }
},
/**
@@ -1597,7 +2100,8 @@
// single
initSelection: function () {
var selected;
- if (this.opts.element.val() === "") {
+ if (this.isPlaceholderOptionSelected()) {
+ this.updateSelection(null);
this.close();
this.setPlaceholder();
} else {
@@ -1612,47 +2116,87 @@
}
},
+ isPlaceholderOptionSelected: function() {
+ var placeholderOption;
+ if (!this.getPlaceholder()) return false; // no placeholder specified so no option should be considered
+ return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
+ || (this.opts.element.val() === "")
+ || (this.opts.element.val() === undefined)
+ || (this.opts.element.val() === null);
+ },
+
// single
prepareOpts: function () {
- var opts = this.parent.prepareOpts.apply(this, arguments);
+ var opts = this.parent.prepareOpts.apply(this, arguments),
+ self=this;
if (opts.element.get(0).tagName.toLowerCase() === "select") {
// install the selection initializer
opts.initSelection = function (element, callback) {
- var selected = element.find(":selected");
+ var selected = element.find("option").filter(function() { return this.selected });
// a single select box always has a value, no need to null check 'selected'
- if ($.isFunction(callback))
- callback({id: selected.attr("value"), text: selected.text()});
+ callback(self.optionToData(selected));
+ };
+ } else if ("data" in opts) {
+ // install default initSelection when applied to hidden input and data is local
+ opts.initSelection = opts.initSelection || function (element, callback) {
+ var id = element.val();
+ //search in data by id, storing the actual matching item
+ var match = null;
+ opts.query({
+ matcher: function(term, text, el){
+ var is_match = equal(id, opts.id(el));
+ if (is_match) {
+ match = el;
+ }
+ return is_match;
+ },
+ callback: !$.isFunction(callback) ? $.noop : function() {
+ callback(match);
+ }
+ });
};
}
return opts;
},
+ // single
+ getPlaceholder: function() {
+ // if a placeholder is specified on a single select without a valid placeholder option ignore it
+ if (this.select) {
+ if (this.getPlaceholderOption() === undefined) {
+ return undefined;
+ }
+ }
+
+ return this.parent.getPlaceholder.apply(this, arguments);
+ },
+
// single
setPlaceholder: function () {
var placeholder = this.getPlaceholder();
- if (this.opts.element.val() === "" && placeholder !== undefined) {
+ if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
- // check for a first blank option if attached to a select
- if (this.select && this.select.find("option:first").text() !== "") return;
+ // check for a placeholder option if attached to a select
+ if (this.select && this.getPlaceholderOption() === undefined) return;
- this.selection.find("span").html(this.opts.escapeMarkup(placeholder));
+ this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
this.selection.addClass("select2-default");
- this.selection.find("abbr").hide();
+ this.container.removeClass("select2-allowclear");
}
},
// single
- postprocessResults: function (data, initial) {
+ postprocessResults: function (data, initial, noHighlightUpdate) {
var selected = 0, self = this, showSearchInput = true;
// find the selected element in the result list
- this.results.find(".select2-result-selectable").each2(function (i, elm) {
+ this.findHighlightableChoices().each2(function (i, elm) {
if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
selected = i;
return false;
@@ -1660,56 +2204,91 @@
});
// and highlight it
-
- this.highlight(selected);
-
- // hide the search box if this is the first we got the results and there are a few of them
-
- if (initial === true) {
- showSearchInput = this.showSearchInput = countResults(data.results) >= this.opts.minimumResultsForSearch;
- this.dropdown.find(".select2-search")[showSearchInput ? "removeClass" : "addClass"]("select2-search-hidden");
-
- //add "select2-with-searchbox" to the container if search box is shown
- $(this.dropdown, this.container)[showSearchInput ? "addClass" : "removeClass"]("select2-with-searchbox");
+ if (noHighlightUpdate !== false) {
+ if (initial === true && selected >= 0) {
+ this.highlight(selected);
+ } else {
+ this.highlight(0);
+ }
}
+ // hide the search box if this is the first we got the results and there are enough of them for search
+
+ if (initial === true) {
+ var min = this.opts.minimumResultsForSearch;
+ if (min >= 0) {
+ this.showSearch(countResults(data.results) >= min);
+ }
+ }
},
// single
- onSelect: function (data) {
- var old = this.opts.element.val();
+ showSearch: function(showSearchInput) {
+ if (this.showSearchInput === showSearchInput) return;
+
+ this.showSearchInput = showSearchInput;
+
+ this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
+ this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
+ //add "select2-with-searchbox" to the container if search box is shown
+ $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
+ },
+
+ // single
+ onSelect: function (data, options) {
+
+ if (!this.triggerSelect(data)) { return; }
+
+ var old = this.opts.element.val(),
+ oldData = this.data();
this.opts.element.val(this.id(data));
this.updateSelection(data);
- this.close();
- this.selection.focus();
- if (!equal(old, this.id(data))) { this.triggerChange(); }
+ this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
+
+ this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
+ this.close();
+
+ if (!options || !options.noFocus)
+ this.focusser.focus();
+
+ if (!equal(old, this.id(data))) { this.triggerChange({added:data,removed:oldData}); }
},
// single
updateSelection: function (data) {
- var container=this.selection.find("span"), formatted;
+ var container=this.selection.find(".select2-chosen"), formatted, cssClass;
this.selection.data("select2-data", data);
container.empty();
- formatted=this.opts.formatSelection(data, container);
+ if (data !== null) {
+ formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
+ }
if (formatted !== undefined) {
- container.append(this.opts.escapeMarkup(formatted));
+ container.append(formatted);
+ }
+ cssClass=this.opts.formatSelectionCssClass(data, container);
+ if (cssClass !== undefined) {
+ container.addClass(cssClass);
}
this.selection.removeClass("select2-default");
if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
- this.selection.find("abbr").show();
+ this.container.addClass("select2-allowclear");
}
},
// single
val: function () {
- var val, data = null, self = this;
+ var val,
+ triggerChange = false,
+ data = null,
+ self = this,
+ oldData = this.data();
if (arguments.length === 0) {
return this.opts.element.val();
@@ -1717,29 +2296,39 @@
val = arguments[0];
+ if (arguments.length > 1) {
+ triggerChange = arguments[1];
+ }
+
if (this.select) {
this.select
.val(val)
- .find(":selected").each2(function (i, elm) {
- data = {id: elm.attr("value"), text: elm.text()};
+ .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
+ data = self.optionToData(elm);
return false;
});
this.updateSelection(data);
this.setPlaceholder();
+ if (triggerChange) {
+ this.triggerChange({added: data, removed:oldData});
+ }
} else {
+ // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
+ if (!val && val !== 0) {
+ this.clear(triggerChange);
+ return;
+ }
if (this.opts.initSelection === undefined) {
throw new Error("cannot call val() if initSelection() is not defined");
}
- // val is an id. !val is true for [undefined,null,'']
- if (!val) {
- this.clear();
- return;
- }
this.opts.element.val(val);
this.opts.initSelection(this.opts.element, function(data){
self.opts.element.val(!data ? "" : self.id(data));
self.updateSelection(data);
self.setPlaceholder();
+ if (triggerChange) {
+ self.triggerChange({added: data, removed:oldData});
+ }
});
}
},
@@ -1747,22 +2336,31 @@
// single
clearSearch: function () {
this.search.val("");
+ this.focusser.val("");
},
// single
data: function(value) {
- var data;
+ var data,
+ triggerChange = false;
if (arguments.length === 0) {
data = this.selection.data("select2-data");
if (data == undefined) data = null;
return data;
} else {
- if (!value || value === "") {
- this.clear();
+ if (arguments.length > 1) {
+ triggerChange = arguments[1];
+ }
+ if (!value) {
+ this.clear(triggerChange);
} else {
+ data = this.data();
this.opts.element.val(!value ? "" : this.id(value));
this.updateSelection(value);
+ if (triggerChange) {
+ this.triggerChange({added: value, removed:data});
+ }
}
}
}
@@ -1772,45 +2370,105 @@
// multi
createContainer: function () {
- var container = $("
", {
+ var container = $(document.createElement("div")).attr({
"class": "select2-container select2-container-multi"
}).html([
- "
" ,
- "
" ,
- "
" ,
+ "
",
+ "
"].join(""));
- return container;
+ return container;
},
// multi
prepareOpts: function () {
- var opts = this.parent.prepareOpts.apply(this, arguments);
+ var opts = this.parent.prepareOpts.apply(this, arguments),
+ self=this;
// TODO validate placeholder is a string if specified
if (opts.element.get(0).tagName.toLowerCase() === "select") {
// install sthe selection initializer
- opts.initSelection = function (element,callback) {
+ opts.initSelection = function (element, callback) {
var data = [];
- element.find(":selected").each2(function (i, elm) {
- data.push({id: elm.attr("value"), text: elm.text()});
- });
- if ($.isFunction(callback))
- callback(data);
+ element.find("option").filter(function() { return this.selected }).each2(function (i, elm) {
+ data.push(self.optionToData(elm));
+ });
+ callback(data);
+ };
+ } else if ("data" in opts) {
+ // install default initSelection when applied to hidden input and data is local
+ opts.initSelection = opts.initSelection || function (element, callback) {
+ var ids = splitVal(element.val(), opts.separator);
+ //search in data by array of ids, storing matching items in a list
+ var matches = [];
+ opts.query({
+ matcher: function(term, text, el){
+ var is_match = $.grep(ids, function(id) {
+ return equal(id, opts.id(el));
+ }).length;
+ if (is_match) {
+ matches.push(el);
+ }
+ return is_match;
+ },
+ callback: !$.isFunction(callback) ? $.noop : function() {
+ // reorder matches based on the order they appear in the ids array because right now
+ // they are in the order in which they appear in data array
+ var ordered = [];
+ for (var i = 0; i < ids.length; i++) {
+ var id = ids[i];
+ for (var j = 0; j < matches.length; j++) {
+ var match = matches[j];
+ if (equal(id, opts.id(match))) {
+ ordered.push(match);
+ matches.splice(j, 1);
+ break;
+ }
+ }
+ }
+ callback(ordered);
+ }
+ });
};
}
return opts;
},
+ // multi
+ selectChoice: function (choice) {
+
+ var selected = this.container.find(".select2-search-choice-focus");
+ if (selected.length && choice && choice[0] == selected[0]) {
+
+ } else {
+ if (selected.length) {
+ this.opts.element.trigger("choice-deselected", selected);
+ }
+ selected.removeClass("select2-search-choice-focus");
+ if (choice && choice.length) {
+ this.close();
+ choice.addClass("select2-search-choice-focus");
+ this.opts.element.trigger("choice-selected", choice);
+ }
+ }
+ },
+
+ // multi
+ destroy: function() {
+ $("label[for='" + this.search.attr('id') + "']")
+ .attr('for', this.opts.element.attr("id"));
+ this.parent.destroy.apply(this, arguments);
+ },
+
// multi
initContainer: function () {
@@ -1819,27 +2477,72 @@
this.searchContainer = this.container.find(".select2-search-field");
this.selection = selection = this.container.find(selector);
- this.search.bind("keydown", this.bind(function (e) {
- if (!this.enabled) return;
+ var _this = this;
+ this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) {
+ //killEvent(e);
+ _this.search[0].focus();
+ _this.selectChoice($(this));
+ });
- if (e.which === KEY.BACKSPACE && this.search.val() === "") {
- this.close();
+ // rewrite labels from original element to focusser
+ this.search.attr("id", "s2id_autogen"+nextUid());
+ $("label[for='" + this.opts.element.attr("id") + "']")
+ .attr('for', this.search.attr('id'));
- var choices,
- selected = selection.find(".select2-search-choice-focus");
- if (selected.length > 0) {
+ this.search.on("input paste", this.bind(function() {
+ if (!this.isInterfaceEnabled()) return;
+ if (!this.opened()) {
+ this.open();
+ }
+ }));
+
+ this.search.attr("tabindex", this.elementTabIndex);
+
+ this.keydowns = 0;
+ this.search.on("keydown", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+
+ ++this.keydowns;
+ var selected = selection.find(".select2-search-choice-focus");
+ var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
+ var next = selected.next(".select2-search-choice:not(.select2-locked)");
+ var pos = getCursorInfo(this.search);
+
+ if (selected.length &&
+ (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
+ var selectedChoice = selected;
+ if (e.which == KEY.LEFT && prev.length) {
+ selectedChoice = prev;
+ }
+ else if (e.which == KEY.RIGHT) {
+ selectedChoice = next.length ? next : null;
+ }
+ else if (e.which === KEY.BACKSPACE) {
this.unselect(selected.first());
this.search.width(10);
- killEvent(e);
- return;
+ selectedChoice = prev.length ? prev : next;
+ } else if (e.which == KEY.DELETE) {
+ this.unselect(selected.first());
+ this.search.width(10);
+ selectedChoice = next.length ? next : null;
+ } else if (e.which == KEY.ENTER) {
+ selectedChoice = null;
}
- choices = selection.find(".select2-search-choice");
- if (choices.length > 0) {
- choices.last().addClass("select2-search-choice-focus");
+ this.selectChoice(selectedChoice);
+ killEvent(e);
+ if (!selectedChoice || !selectedChoice.length) {
+ this.open();
}
+ return;
+ } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
+ || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
+
+ this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
+ killEvent(e);
+ return;
} else {
- selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
+ this.selectChoice(null);
}
if (this.opened()) {
@@ -1850,10 +2553,13 @@
killEvent(e);
return;
case KEY.ENTER:
- case KEY.TAB:
this.selectHighlighted();
killEvent(e);
return;
+ case KEY.TAB:
+ this.selectHighlighted({noFocus:true});
+ this.close();
+ return;
case KEY.ESC:
this.cancel(e);
killEvent(e);
@@ -1866,8 +2572,12 @@
return;
}
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
- return;
+ if (e.which === KEY.ENTER) {
+ if (this.opts.openOnEnter === false) {
+ return;
+ } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
+ return;
+ }
}
this.open();
@@ -1876,62 +2586,73 @@
// prevent the page from scrolling
killEvent(e);
}
+
+ if (e.which === KEY.ENTER) {
+ // prevent form from being submitted
+ killEvent(e);
+ }
+
}));
- this.search.bind("keyup", this.bind(this.resizeSearch));
+ this.search.on("keyup", this.bind(function (e) {
+ this.keydowns = 0;
+ this.resizeSearch();
+ })
+ );
- this.search.bind("blur", this.bind(function(e) {
+ this.search.on("blur", this.bind(function(e) {
this.container.removeClass("select2-container-active");
this.search.removeClass("select2-focused");
- this.clearSearch();
+ this.selectChoice(null);
+ if (!this.opened()) this.clearSearch();
e.stopImmediatePropagation();
+ this.opts.element.trigger($.Event("select2-blur"));
}));
- this.container.delegate(selector, "mousedown", this.bind(function (e) {
- if (!this.enabled) return;
+ this.container.on("click", selector, this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
if ($(e.target).closest(".select2-search-choice").length > 0) {
// clicked inside a select2 search choice, do not open
return;
}
+ this.selectChoice(null);
this.clearPlaceholder();
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
this.open();
this.focusSearch();
e.preventDefault();
}));
- this.container.delegate(selector, "focus", this.bind(function () {
- if (!this.enabled) return;
+ this.container.on("focus", selector, this.bind(function () {
+ if (!this.isInterfaceEnabled()) return;
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
this.container.addClass("select2-container-active");
this.dropdown.addClass("select2-drop-active");
this.clearPlaceholder();
}));
+ this.initContainerWidth();
+ this.opts.element.addClass("select2-offscreen");
+
// set the placeholder if necessary
this.clearSearch();
},
// multi
- enable: function() {
- if (this.enabled) return;
-
- this.parent.enable.apply(this, arguments);
-
- this.search.removeAttr("disabled");
- },
-
- // multi
- disable: function() {
- if (!this.enabled) return;
-
- this.parent.disable.apply(this, arguments);
-
- this.search.attr("disabled", true);
+ enableInterface: function() {
+ if (this.parent.enableInterface.apply(this, arguments)) {
+ this.search.prop("disabled", !this.isInterfaceEnabled());
+ }
},
// multi
initSelection: function () {
var data;
- if (this.opts.element.val() === "") {
+ if (this.opts.element.val() === "" && this.opts.element.text() === "") {
this.updateSelection([]);
this.close();
// set the placeholder if necessary
@@ -1952,16 +2673,16 @@
// multi
clearSearch: function () {
- var placeholder = this.getPlaceholder();
+ var placeholder = this.getPlaceholder(),
+ maxWidth = this.getMaxSearchWidth();
if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
this.search.val(placeholder).addClass("select2-default");
// stretch the search box to full width of the container so as much of the placeholder is visible as possible
- this.resizeSearch();
+ // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
+ this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
} else {
- // we set this to " " instead of "" and later clear it on focus() because there is a firefox bug
- // that does not properly render the caret when the field starts out blank
- this.search.val(" ").width(10);
+ this.search.val("").width(10);
}
},
@@ -1969,19 +2690,21 @@
clearPlaceholder: function () {
if (this.search.hasClass("select2-default")) {
this.search.val("").removeClass("select2-default");
- } else {
- // work around for the space character we set to avoid firefox caret bug
- if (this.search.val() === " ") this.search.val("");
}
},
// multi
opening: function () {
+ this.clearPlaceholder(); // should be done before super so placeholder is not used to search
+ this.resizeSearch();
+
this.parent.opening.apply(this, arguments);
- this.clearPlaceholder();
- this.resizeSearch();
this.focusSearch();
+
+ this.updateResults(true);
+ this.search.focus();
+ this.opts.element.trigger($.Event("select2-open"));
},
// multi
@@ -2021,9 +2744,10 @@
self.postprocessResults();
},
+ // multi
tokenize: function() {
var input = this.search.val();
- input = this.opts.tokenizer(input, this.data(), this.bind(this.onSelect), this.opts);
+ input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
if (input != null && input != undefined) {
this.search.val(input);
if (input.length > 0) {
@@ -2034,9 +2758,15 @@
},
// multi
- onSelect: function (data) {
+ onSelect: function (data, options) {
+
+ if (!this.triggerSelect(data)) { return; }
+
this.addSelectedChoice(data);
- if (this.select) { this.postprocessResults(); }
+
+ this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
+
+ if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
if (this.opts.closeOnSelect) {
this.close();
@@ -2045,10 +2775,16 @@
if (this.countSelectableResults()>0) {
this.search.width(10);
this.resizeSearch();
+ if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
+ // if we reached max selection size repaint the results so choices
+ // are replaced with the max selection reached message
+ this.updateResults(true);
+ }
this.positionDropdown();
} else {
// if nothing left to select close
this.close();
+ this.search.width(10);
}
}
@@ -2056,7 +2792,8 @@
// added we do not need to check if this is a new element before firing change
this.triggerChange({ added: data });
- this.focusSearch();
+ if (!options || !options.noFocus)
+ this.focusSearch();
},
// multi
@@ -2065,36 +2802,51 @@
this.focusSearch();
},
- // multi
addSelectedChoice: function (data) {
- var choice=$(
+ var enableChoice = !data.locked,
+ enabledItem = $(
"
" +
"
" +
" " +
" "),
+ disabledItem = $(
+ "
" +
+ "
" +
+ " ");
+ var choice = enableChoice ? enabledItem : disabledItem,
id = this.id(data),
val = this.getVal(),
- formatted;
+ formatted,
+ cssClass;
- formatted=this.opts.formatSelection(data, choice);
- choice.find("div").replaceWith("
"+this.opts.escapeMarkup(formatted)+"
");
- choice.find(".select2-search-choice-close")
- .bind("mousedown", killEvent)
- .bind("click dblclick", this.bind(function (e) {
- if (!this.enabled) return;
+ formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
+ if (formatted != undefined) {
+ choice.find("div").replaceWith("
"+formatted+"
");
+ }
+ cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
+ if (cssClass != undefined) {
+ choice.addClass(cssClass);
+ }
- $(e.target).closest(".select2-search-choice").fadeOut('fast', this.bind(function(){
- this.unselect($(e.target));
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
- this.close();
- this.focusSearch();
- })).dequeue();
- killEvent(e);
- })).bind("focus", this.bind(function () {
- if (!this.enabled) return;
- this.container.addClass("select2-container-active");
- this.dropdown.addClass("select2-drop-active");
- }));
+ if(enableChoice){
+ choice.find(".select2-search-choice-close")
+ .on("mousedown", killEvent)
+ .on("click dblclick", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+
+ $(e.target).closest(".select2-search-choice").fadeOut('fast', this.bind(function(){
+ this.unselect($(e.target));
+ this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
+ this.close();
+ this.focusSearch();
+ })).dequeue();
+ killEvent(e);
+ })).on("focus", this.bind(function () {
+ if (!this.isInterfaceEnabled()) return;
+ this.container.addClass("select2-container-active");
+ this.dropdown.addClass("select2-drop-active");
+ }));
+ }
choice.data("select2-data", data);
choice.insertBefore(this.searchContainer);
@@ -2108,7 +2860,6 @@
var val = this.getVal(),
data,
index;
-
selected = selected.closest(".select2-search-choice");
if (selected.length === 0) {
@@ -2117,55 +2868,81 @@
data = selected.data("select2-data");
- index = indexOf(this.id(data), val);
+ if (!data) {
+ // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
+ // and invoked on an element already removed
+ return;
+ }
- if (index >= 0) {
+ while((index = indexOf(this.id(data), val)) >= 0) {
val.splice(index, 1);
this.setVal(val);
if (this.select) this.postprocessResults();
}
+
+ var evt = $.Event("select2-removing");
+ evt.val = this.id(data);
+ evt.choice = data;
+ this.opts.element.trigger(evt);
+
+ if (evt.isDefaultPrevented()) {
+ return;
+ }
+
selected.remove();
+
+ this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
this.triggerChange({ removed: data });
},
// multi
- postprocessResults: function () {
+ postprocessResults: function (data, initial, noHighlightUpdate) {
var val = this.getVal(),
- choices = this.results.find(".select2-result-selectable"),
+ choices = this.results.find(".select2-result"),
compound = this.results.find(".select2-result-with-children"),
self = this;
choices.each2(function (i, choice) {
var id = self.id(choice.data("select2-data"));
if (indexOf(id, val) >= 0) {
- choice.addClass("select2-disabled").removeClass("select2-result-selectable");
- } else {
- choice.removeClass("select2-disabled").addClass("select2-result-selectable");
+ choice.addClass("select2-selected");
+ // mark all children of the selected parent as selected
+ choice.find(".select2-result-selectable").addClass("select2-selected");
}
});
- compound.each2(function(i, e) {
- if (e.find(".select2-result-selectable").length==0) {
- e.addClass("select2-disabled");
- } else {
- e.removeClass("select2-disabled");
+ compound.each2(function(i, choice) {
+ // hide an optgroup if it doesnt have any selectable children
+ if (!choice.is('.select2-result-selectable')
+ && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
+ choice.addClass("select2-selected");
}
});
- choices.each2(function (i, choice) {
- if (!choice.hasClass("select2-disabled") && choice.hasClass("select2-result-selectable")) {
- self.highlight(0);
- return false;
+ if (this.highlight() == -1 && noHighlightUpdate !== false){
+ self.highlight(0);
+ }
+
+ //If all results are chosen render formatNoMAtches
+ if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
+ if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
+ if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
+ this.results.append("
" + self.opts.formatNoMatches(self.search.val()) + " ");
+ }
}
- });
+ }
},
// multi
- resizeSearch: function () {
+ getMaxSearchWidth: function() {
+ return this.selection.width() - getSideBorderPadding(this.search);
+ },
+ // multi
+ resizeSearch: function () {
var minimumWidth, left, maxWidth, containerLeft, searchWidth,
- sideBorderPadding = getSideBorderPadding(this.search);
+ sideBorderPadding = getSideBorderPadding(this.search);
minimumWidth = measureTextWidth(this.search) + 10;
@@ -2175,6 +2952,7 @@
containerLeft = this.selection.offset().left;
searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
+
if (searchWidth < minimumWidth) {
searchWidth = maxWidth - sideBorderPadding;
}
@@ -2182,7 +2960,12 @@
if (searchWidth < 40) {
searchWidth = maxWidth - sideBorderPadding;
}
- this.search.width(searchWidth);
+
+ if (searchWidth <= 0) {
+ searchWidth = minimumWidth;
+ }
+
+ this.search.width(Math.floor(searchWidth));
},
// multi
@@ -2213,19 +2996,47 @@
},
// multi
- val: function () {
- var val, data = [], self=this;
+ buildChangeDetails: function (old, current) {
+ var current = current.slice(0),
+ old = old.slice(0);
+
+ // remove intersection from each array
+ for (var i = 0; i < current.length; i++) {
+ for (var j = 0; j < old.length; j++) {
+ if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
+ current.splice(i, 1);
+ if(i>0){
+ i--;
+ }
+ old.splice(j, 1);
+ j--;
+ }
+ }
+ }
+
+ return {added: current, removed: old};
+ },
+
+
+ // multi
+ val: function (val, triggerChange) {
+ var oldData, self=this;
if (arguments.length === 0) {
return this.getVal();
}
- val = arguments[0];
+ oldData=this.data();
+ if (!oldData.length) oldData=[];
- if (!val) {
+ // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
+ if (!val && val !== 0) {
this.opts.element.val("");
this.updateSelection([]);
this.clearSearch();
+ if (triggerChange) {
+ this.triggerChange({added: this.data(), removed: oldData});
+ }
return;
}
@@ -2233,20 +3044,23 @@
this.setVal(val);
if (this.select) {
- this.select.find(":selected").each(function () {
- data.push({id: $(this).attr("value"), text: $(this).text()});
- });
- this.updateSelection(data);
+ this.opts.initSelection(this.select, this.bind(this.updateSelection));
+ if (triggerChange) {
+ this.triggerChange(this.buildChangeDetails(oldData, this.data()));
+ }
} else {
if (this.opts.initSelection === undefined) {
- throw new Error("val() cannot be called if initSelection() is not defined")
+ throw new Error("val() cannot be called if initSelection() is not defined");
}
this.opts.initSelection(this.opts.element, function(data){
- var ids=$(data).map(self.id);
+ var ids=$.map(data, self.id);
self.setVal(ids);
self.updateSelection(data);
self.clearSearch();
+ if (triggerChange) {
+ self.triggerChange(self.buildChangeDetails(oldData, self.data()));
+ }
});
}
this.clearSearch();
@@ -2277,7 +3091,6 @@
this.resizeSearch();
// update selection
-
this.selection.find(".select2-search-choice").each(function() {
val.push(self.opts.id($(this).data("select2-data")));
});
@@ -2286,19 +3099,23 @@
},
// multi
- data: function(values) {
- var self=this, ids;
+ data: function(values, triggerChange) {
+ var self=this, ids, old;
if (arguments.length === 0) {
return this.selection
.find(".select2-search-choice")
.map(function() { return $(this).data("select2-data"); })
.get();
} else {
+ old = this.data();
if (!values) { values = []; }
- ids = $.map(values, function(e) { return self.opts.id(e)});
+ ids = $.map(values, function(e) { return self.opts.id(e); });
this.setVal(ids);
this.updateSelection(values);
this.clearSearch();
+ if (triggerChange) {
+ this.triggerChange(this.buildChangeDetails(old, this.data()));
+ }
}
}
});
@@ -2308,7 +3125,11 @@
var args = Array.prototype.slice.call(arguments, 0),
opts,
select2,
- value, multiple, allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "onSortStart", "onSortEnd", "enable", "disable", "positionDropdown", "data"];
+ method, value, multiple,
+ allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
+ valueMethods = ["opened", "isFocused", "container", "dropdown"],
+ propertyMethods = ["val", "data"],
+ methodsMap = { search: "externalSearch" };
this.each(function () {
if (args.length === 0 || typeof(args[0]) === "object") {
@@ -2316,7 +3137,7 @@
opts.element = $(this);
if (opts.element.get(0).tagName.toLowerCase() === "select") {
- multiple = opts.element.attr("multiple");
+ multiple = opts.element.prop("multiple");
} else {
multiple = opts.multiple || false;
if ("tags" in opts) {opts.multiple = multiple = true;}
@@ -2333,12 +3154,22 @@
value = undefined;
select2 = $(this).data("select2");
if (select2 === undefined) return;
- if (args[0] === "container") {
- value=select2.container;
+
+ method=args[0];
+
+ if (method === "container") {
+ value = select2.container;
+ } else if (method === "dropdown") {
+ value = select2.dropdown;
} else {
- value = select2[args[0]].apply(select2, args.slice(1));
+ if (methodsMap[method]) method = methodsMap[method];
+
+ value = select2[method].apply(select2, args.slice(1));
+ }
+ if (indexOf(args[0], valueMethods) >= 0
+ || (indexOf(args[0], propertyMethods) && args.length == 1)) {
+ return false; // abort the iteration, ready to return first matched value
}
- if (value !== undefined) {return false;}
} else {
throw "Invalid arguments to select2 plugin: " + args;
}
@@ -2349,43 +3180,58 @@
// plugin defaults, accessible to users
$.fn.select2.defaults = {
width: "copy",
+ loadMorePadding: 0,
closeOnSelect: true,
openOnEnter: true,
containerCss: {},
dropdownCss: {},
containerCssClass: "",
dropdownCssClass: "",
- formatResult: function(result, container, query) {
+ formatResult: function(result, container, query, escapeMarkup) {
var markup=[];
- markMatch(result.text, query.term, markup);
+ markMatch(result.text, query.term, markup, escapeMarkup);
return markup.join("");
},
- formatSelection: function (data, container) {
- return data.text;
+ formatSelection: function (data, container, escapeMarkup) {
+ return data ? escapeMarkup(data.text) : undefined;
+ },
+ sortResults: function (results, container, query) {
+ return results;
},
formatResultCssClass: function(data) {return undefined;},
+ formatSelectionCssClass: function(data, container) {return undefined;},
formatNoMatches: function () { return "No matches found"; },
- formatInputTooShort: function (input, min) { return "Please enter " + (min - input.length) + " more characters"; },
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1? "" : "s"); },
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1? "" : "s"); },
formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
formatLoadMore: function (pageNumber) { return "Loading more results..."; },
formatSearching: function () { return "Searching..."; },
minimumResultsForSearch: 0,
minimumInputLength: 0,
+ maximumInputLength: null,
maximumSelectionSize: 0,
id: function (e) { return e.id; },
matcher: function(term, text) {
- return text.toUpperCase().indexOf(term.toUpperCase()) >= 0;
+ return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
},
separator: ",",
tokenSeparators: [],
tokenizer: defaultTokenizer,
- escapeMarkup: function (markup) {
- if (markup && typeof(markup) === "string") {
- return markup.replace(/&/g, "&");
- }
- return markup;
- },
- blurOnChange: false
+ escapeMarkup: defaultEscapeMarkup,
+ blurOnChange: false,
+ selectOnBlur: false,
+ adaptContainerCssClass: function(c) { return c; },
+ adaptDropdownCssClass: function(c) { return null; },
+ nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; }
+ };
+
+ $.fn.select2.ajaxDefaults = {
+ transport: $.ajax,
+ params: {
+ type: "GET",
+ cache: false,
+ dataType: "json"
+ }
};
// exports
@@ -2396,7 +3242,9 @@
tags: tags
}, util: {
debounce: debounce,
- markMatch: markMatch
+ markMatch: markMatch,
+ escapeMarkup: defaultEscapeMarkup,
+ stripDiacritics: stripDiacritics
}, "class": {
"abstract": AbstractSelect2,
"single": SingleSelect2,
From 21aca926bc533e5e950e690517abea85a680257a Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 13:27:43 +0100
Subject: [PATCH 28/53] [IMP] select2: allow translation of information
messages, avoid the need of locale files from select2
bzr revid: mat@openerp.com-20140306122743-3ejmmnryx2sq8ud7
---
addons/base_import/static/src/js/import.js | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js
index 0c3acd98265..987f30d962d 100644
--- a/addons/base_import/static/src/js/import.js
+++ b/addons/base_import/static/src/js/import.js
@@ -482,5 +482,13 @@ openerp.base_import = function (instance) {
{ name: 'import_succeeded', from: 'importing', to: 'imported'},
{ name: 'import_failed', from: 'importing', to: 'results' }
]
- })
+ });
+
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () { return _t("No matches found"); },
+ formatLoadMore: function (pageNumber) { return _t("Loading more results..."); },
+ formatSearching: function () { return _t("Searching..."); }
+ });
+
};
+
From 378dbbfaaee930b8b82111cf06ea16755a8b4840 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 14:34:56 +0100
Subject: [PATCH 29/53] [IMP] product: add python tests
bzr revid: mat@openerp.com-20140306133456-cnqjcwmo73ioqxxf
---
addons/product/__openerp__.py | 1 -
addons/product/test/product_uom.yml | 15 ------------
addons/product/tests/__init__.py | 5 ++++
addons/product/tests/test_uom.py | 37 +++++++++++++++++++++++++++++
4 files changed, 42 insertions(+), 16 deletions(-)
delete mode 100644 addons/product/test/product_uom.yml
create mode 100644 addons/product/tests/__init__.py
create mode 100644 addons/product/tests/test_uom.py
diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py
index fdadda2e4d4..d81a352087e 100644
--- a/addons/product/__openerp__.py
+++ b/addons/product/__openerp__.py
@@ -61,7 +61,6 @@ Print product labels with barcode.
],
'test': [
'product_pricelist_demo.yml',
- 'test/product_uom.yml',
'test/product_pricelist.yml',
],
'installable': True,
diff --git a/addons/product/test/product_uom.yml b/addons/product/test/product_uom.yml
deleted file mode 100644
index 04928d43d87..00000000000
--- a/addons/product/test/product_uom.yml
+++ /dev/null
@@ -1,15 +0,0 @@
--
- In order to test conversation of UOM,
--
- I convert Grams into TON with price.
--
- !python {model: product.uom}: |
- from_uom_id = ref("product_uom_gram")
- to_uom_id = ref("product_uom_ton")
- price = 2
- qty = 1020000
- price = self._compute_price(cr, uid, from_uom_id, price, to_uom_id)
- qty = self._compute_qty(cr, uid, from_uom_id, qty, to_uom_id)
- assert qty == 1.02, "Qty is not correspond."
- assert price == 2000000.0, "Price is not correspond."
-
diff --git a/addons/product/tests/__init__.py b/addons/product/tests/__init__.py
new file mode 100644
index 00000000000..850189ac0f4
--- /dev/null
+++ b/addons/product/tests/__init__.py
@@ -0,0 +1,5 @@
+from . import test_uom
+
+fast_suite = [
+ test_uom,
+]
diff --git a/addons/product/tests/test_uom.py b/addons/product/tests/test_uom.py
new file mode 100644
index 00000000000..3d3ba04b689
--- /dev/null
+++ b/addons/product/tests/test_uom.py
@@ -0,0 +1,37 @@
+from openerp.tests.common import TransactionCase
+
+class TestUom(TransactionCase):
+ """Tests for unit of measure conversion"""
+
+ def setUp(self):
+ super(TestUom, self).setUp()
+ self.product = self.registry('product.product')
+ self.uom = self.registry('product.uom')
+ self.imd = self.registry('ir.model.data')
+
+ def test_10_conversion(self):
+ cr, uid = self.cr, self.uid
+ gram_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_gram')[1]
+ tonne_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_ton')[1]
+
+ qty = self.uom._compute_qty(cr, uid, gram_id, 1020000, tonne_id)
+ self.assertEquals(qty, 1.02, "Converted quantity does not correspond.")
+
+ price = self.uom._compute_price(cr, uid, gram_id, 2, tonne_id)
+ self.assertEquals(price, 2000000.0, "Converted price does not correspond.")
+
+ def test_20_rounding(self):
+ cr, uid = self.cr, self.uid
+ unit_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_unit')[1]
+ categ_unit_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_categ_unit')[1]
+
+ score_id = self.uom.create(cr, uid, {
+ 'name': 'Score',
+ 'factor_inv': 20,
+ 'uom_type': 'bigger',
+ 'rounding': 1.0,
+ 'category_id': categ_unit_id
+ })
+
+ qty = self.uom._compute_qty(cr, uid, unit_id, 2, score_id)
+ self.assertEquals(qty, 1, "Converted quantity should be rounded up.")
From ff33921b92ef521e6f306b71b8fcc33dba6c0256 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 14:40:38 +0100
Subject: [PATCH 30/53] [IMP] will add bootstrap style once needed
bzr revid: mat@openerp.com-20140306134038-s70iyxdh4j5inh56
---
addons/base_import/__openerp__.py | 3 +-
.../static/lib/select2/select2-bootstrap.css | 87 -------------------
2 files changed, 1 insertion(+), 89 deletions(-)
delete mode 100644 addons/base_import/static/lib/select2/select2-bootstrap.css
diff --git a/addons/base_import/__openerp__.py b/addons/base_import/__openerp__.py
index d7f0714e439..110d7cd9c27 100644
--- a/addons/base_import/__openerp__.py
+++ b/addons/base_import/__openerp__.py
@@ -32,8 +32,7 @@ Re-implement openerp's file import system:
],
'css': [
'static/lib/select2/select2.css',
- # TODO for trunk: use bootstrap version
- # 'static/lib/select2/select2-bootstrap.css',
+ # TODO for trunk: add select2-bootstrap.css style (to download)
'static/src/css/import.css',
],
'js': [
diff --git a/addons/base_import/static/lib/select2/select2-bootstrap.css b/addons/base_import/static/lib/select2/select2-bootstrap.css
deleted file mode 100644
index 909971074c9..00000000000
--- a/addons/base_import/static/lib/select2/select2-bootstrap.css
+++ /dev/null
@@ -1,87 +0,0 @@
-.form-control .select2-choice {
- border: 0;
- border-radius: 2px;
-}
-
-.form-control .select2-choice .select2-arrow {
- border-radius: 0 2px 2px 0;
-}
-
-.form-control.select2-container {
- height: auto !important;
- padding: 0px;
-}
-
-.form-control.select2-container.select2-dropdown-open {
- border-color: #5897FB;
- border-radius: 3px 3px 0 0;
-}
-
-.form-control .select2-container.select2-dropdown-open .select2-choices {
- border-radius: 3px 3px 0 0;
-}
-
-.form-control.select2-container .select2-choices {
- border: 0 !important;
- border-radius: 3px;
-}
-
-.control-group.warning .select2-container .select2-choice,
-.control-group.warning .select2-container .select2-choices,
-.control-group.warning .select2-container-active .select2-choice,
-.control-group.warning .select2-container-active .select2-choices,
-.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #C09853 !important;
-}
-
-.control-group.warning .select2-container .select2-choice div {
- border-left: 1px solid #C09853 !important;
- background: #FCF8E3 !important;
-}
-
-.control-group.error .select2-container .select2-choice,
-.control-group.error .select2-container .select2-choices,
-.control-group.error .select2-container-active .select2-choice,
-.control-group.error .select2-container-active .select2-choices,
-.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.error .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #B94A48 !important;
-}
-
-.control-group.error .select2-container .select2-choice div {
- border-left: 1px solid #B94A48 !important;
- background: #F2DEDE !important;
-}
-
-.control-group.info .select2-container .select2-choice,
-.control-group.info .select2-container .select2-choices,
-.control-group.info .select2-container-active .select2-choice,
-.control-group.info .select2-container-active .select2-choices,
-.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.info .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #3A87AD !important;
-}
-
-.control-group.info .select2-container .select2-choice div {
- border-left: 1px solid #3A87AD !important;
- background: #D9EDF7 !important;
-}
-
-.control-group.success .select2-container .select2-choice,
-.control-group.success .select2-container .select2-choices,
-.control-group.success .select2-container-active .select2-choice,
-.control-group.success .select2-container-active .select2-choices,
-.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.success .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #468847 !important;
-}
-
-.control-group.success .select2-container .select2-choice div {
- border-left: 1px solid #468847 !important;
- background: #DFF0D8 !important;
-}
From 1e048736df81d58e1b18f1734e047808f225cd3b Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 16:31:25 +0100
Subject: [PATCH 31/53] [IMP] remove useless imports
bzr revid: mat@openerp.com-20140306153125-czwswqw1k3w5ungh
---
addons/product/_common.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/addons/product/_common.py b/addons/product/_common.py
index 2d6fe8bec32..c05dcee66a2 100644
--- a/addons/product/_common.py
+++ b/addons/product/_common.py
@@ -21,8 +21,6 @@
from openerp import tools
import math
-import logging
-_logger = logging.getLogger(__name__)
def rounding(f, r):
From dc46ffd589f2e8735b61e76b67d4c8c4d9f1b8ce Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Thu, 6 Mar 2014 17:29:53 +0100
Subject: [PATCH 32/53] [FIX] use float rounding for pricelist instead of
ceiling
bzr revid: mat@openerp.com-20140306162953-iu7k53i5zsllokdp
---
addons/product/pricelist.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py
index 86480c60059..676ae33c66d 100644
--- a/addons/product/pricelist.py
+++ b/addons/product/pricelist.py
@@ -21,8 +21,7 @@
import time
-from _common import ceiling
-
+from openerp import tools
from openerp.osv import fields, osv
from openerp.tools.translate import _
@@ -296,7 +295,7 @@ class product_pricelist(osv.osv):
if price is not False:
price_limit = price
price = price * (1.0+(res['price_discount'] or 0.0))
- price = ceiling(price, res['price_round'])
+ price = tools.float_rouding(price, precision_rounding=res['price_round'])
price += (res['price_surcharge'] or 0.0)
if res['price_min_margin']:
price = max(price, price_limit+res['price_min_margin'])
From c43c308c33de1a3704f5d3c666dacc1a066c8cb4 Mon Sep 17 00:00:00 2001
From: Olivier Dony
Date: Thu, 6 Mar 2014 20:09:06 +0100
Subject: [PATCH 33/53] [FIX] product: typo in previous commit
"The only man who makes no mistakes is the man who never does anything. ~T.R." ;-)
bzr revid: odo@openerp.com-20140306190906-k8wjr9urekpoy7ch
---
addons/product/pricelist.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py
index 676ae33c66d..d4ed2567afc 100644
--- a/addons/product/pricelist.py
+++ b/addons/product/pricelist.py
@@ -295,7 +295,8 @@ class product_pricelist(osv.osv):
if price is not False:
price_limit = price
price = price * (1.0+(res['price_discount'] or 0.0))
- price = tools.float_rouding(price, precision_rounding=res['price_round'])
+ if res['price_round']:
+ price = tools.float_round(price, precision_rounding=res['price_round'])
price += (res['price_surcharge'] or 0.0)
if res['price_min_margin']:
price = max(price, price_limit+res['price_min_margin'])
From fd98bf36aaff2e3252f8383413319eb0bcf1263f Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Fri, 7 Mar 2014 07:24:33 +0000
Subject: [PATCH 34/53] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20140307072427-zkvqj45icrzupx0m
bzr revid: launchpad_translations_on_behalf_of_openerp-20140307072433-0lqpjt07j1s8k8cs
---
addons/account/i18n/it.po | 14 ++++++------
addons/account/i18n/mn.po | 8 +++----
addons/account/i18n/tr.po | 2 +-
addons/account/i18n/zh_CN.po | 10 ++++-----
.../account_analytic_analysis/i18n/pt_BR.po | 11 +++++-----
addons/account_analytic_analysis/i18n/tr.po | 22 +++++++++----------
addons/account_analytic_plans/i18n/tr.po | 20 ++++++++---------
addons/account_asset/i18n/it.po | 14 +++++++-----
addons/account_budget/i18n/tr.po | 16 +++++++-------
addons/account_followup/i18n/tr.po | 18 +++++++--------
addons/account_payment/i18n/tr.po | 22 +++++++++----------
addons/account_sequence/i18n/tr.po | 10 ++++-----
addons/account_voucher/i18n/tr.po | 20 ++++++++---------
addons/crm/i18n/pt_BR.po | 12 +++++-----
addons/mrp/i18n/ja.po | 12 +++++-----
addons/product/i18n/it.po | 18 +++++++--------
addons/project/i18n/tr.po | 6 ++---
addons/share/i18n/zh_CN.po | 18 ++++++++-------
addons/stock/i18n/pt_BR.po | 19 +++++++++++-----
addons/warning/i18n/pt_BR.po | 11 +++++-----
addons/web/i18n/th.po | 10 ++++-----
21 files changed, 153 insertions(+), 140 deletions(-)
diff --git a/addons/account/i18n/it.po b/addons/account/i18n/it.po
index b9afbc191f1..7f8faa9a7e8 100644
--- a/addons/account/i18n/it.po
+++ b/addons/account/i18n/it.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-02-04 12:00+0000\n"
-"Last-Translator: Leonardo Donelli \n"
+"PO-Revision-Date: 2014-03-06 12:27+0000\n"
+"Last-Translator: Roberto Piva - NemesiX SRL \n"
"Language-Team: Italian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-06 06:23+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -41,7 +41,7 @@ msgstr ""
#. module: account
#: view:res.partner:0
msgid "the parent company"
-msgstr ""
+msgstr "l'azienda padre"
#. module: account
#: view:account.move.reconcile:0
@@ -897,7 +897,7 @@ msgstr ""
#. module: account
#: view:account.account:0
msgid "Account code"
-msgstr ""
+msgstr "Codice conto"
#. module: account
#: selection:account.financial.report,display_detail:0
@@ -1847,7 +1847,7 @@ msgstr "Ricorrente"
#. module: account
#: report:account.invoice:0
msgid "TIN :"
-msgstr ""
+msgstr "P.IVA:"
#. module: account
#: field:account.journal,groups_id:0
diff --git a/addons/account/i18n/mn.po b/addons/account/i18n/mn.po
index 981466836d5..879b8d880f7 100644
--- a/addons/account/i18n/mn.po
+++ b/addons/account/i18n/mn.po
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-03-05 06:18+0000\n"
+"PO-Revision-Date: 2014-03-06 09:16+0000\n"
"Last-Translator: Jacara \n"
"Language-Team: Mongolian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: account
@@ -6176,7 +6176,7 @@ msgstr "Хөрөнгийн харагдац"
#. module: account
#: model:ir.model,name:account.model_account_common_account_report
msgid "Account Common Account Report"
-msgstr "Дансны Ерөнхий Дансны Тайлан"
+msgstr "Дансны ерөнхий тайлан"
#. module: account
#: view:account.analytic.account:0
@@ -8478,7 +8478,7 @@ msgstr "Хэсгийн Дугаар Алга !"
#: view:account.financial.report:0
#: model:ir.ui.menu,name:account.menu_account_report_tree_hierarchy
msgid "Account Reports Hierarchy"
-msgstr "Дансны Тайлангийн Шатлал"
+msgstr "Тайлангийн загварын шатлал"
#. module: account
#: help:account.account.template,chart_template_id:0
diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po
index 62bd07d9325..3f8add1602e 100644
--- a/addons/account/i18n/tr.po
+++ b/addons/account/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
diff --git a/addons/account/i18n/zh_CN.po b/addons/account/i18n/zh_CN.po
index cb47d465615..89eb3bf4e5a 100644
--- a/addons/account/i18n/zh_CN.po
+++ b/addons/account/i18n/zh_CN.po
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-03-05 09:26+0000\n"
-"Last-Translator: 盈通 ccdos \n"
+"PO-Revision-Date: 2014-03-06 08:48+0000\n"
+"Last-Translator: 开阖软件 Jeff Wang \n"
"Language-Team: Chinese (Simplified) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: account
@@ -447,7 +447,7 @@ msgid ""
msgstr ""
"此处可以管理属于公司或者个人的资产.\n"
" 跟踪资产折旧的发生,创建折旧明细账户。.\n"
-" 要安装account_asset模块. 如果不检查box, 可以处理传票和付款,\n"
+" 要安装account_asset模块. 如果不检查box, 可以处理发票和付款,\n"
" 但不能处理账记(分录明细, 科目表, ...)"
#. module: account
@@ -7807,7 +7807,7 @@ msgstr "发票明细"
#. module: account
#: view:account.invoice.report:0
msgid "Customer And Supplier Refunds"
-msgstr "客户和供应商红字传票"
+msgstr "客户和供应商红字发票"
#. module: account
#: field:account.financial.report,sign:0
diff --git a/addons/account_analytic_analysis/i18n/pt_BR.po b/addons/account_analytic_analysis/i18n/pt_BR.po
index d410faaedfe..98311e5b288 100644
--- a/addons/account_analytic_analysis/i18n/pt_BR.po
+++ b/addons/account_analytic_analysis/i18n/pt_BR.po
@@ -8,14 +8,15 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-07-18 19:35+0000\n"
-"Last-Translator: Claudio de Araujo Santos \n"
+"PO-Revision-Date: 2014-03-07 00:27+0000\n"
+"Last-Translator: Fábio Martinelli - http://zupy.com.br "
+"\n"
"Language-Team: Brazilian Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:56+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
@@ -51,7 +52,7 @@ msgstr "Restante"
#. module: account_analytic_analysis
#: field:account.analytic.account,real_margin_rate:0
msgid "Real Margin Rate (%)"
-msgstr "Taxa Real de Margem"
+msgstr "Taxa Real de Margem (%)"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
diff --git a/addons/account_analytic_analysis/i18n/tr.po b/addons/account_analytic_analysis/i18n/tr.po
index 67216475a40..fa1937ee716 100644
--- a/addons/account_analytic_analysis/i18n/tr.po
+++ b/addons/account_analytic_analysis/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-12-19 20:53+0000\n"
+"PO-Revision-Date: 2014-03-07 06:40+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: OpenERP Türkiye Yerelleştirmesi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-12-20 05:33+0000\n"
-"X-Generator: Launchpad (build 16872)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
#. module: account_analytic_analysis
@@ -212,7 +212,7 @@ msgstr "Hesap Temsilcisi"
#: help:account.analytic.account,remaining_hours_to_invoice:0
msgid "Computed using the formula: Maximum Time - Total Invoiced Time"
msgstr ""
-"Hesaplamada kullanılan formül:Maksimum Zaman - Toplam faturalandırılan Zaman"
+"Hesaplamada kullanılan formül:Maksimum Zaman - Toplam faturalanan Zaman"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
@@ -222,7 +222,7 @@ msgstr "Beklenen"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Closed contracts"
-msgstr "Kapalı sözleşmeler"
+msgstr "Kapanan sözleşmeler"
#. module: account_analytic_analysis
#: help:account.analytic.account,theorical_margin:0
@@ -355,22 +355,22 @@ msgstr "Ay"
#: model:ir.actions.act_window,name:account_analytic_analysis.action_hr_tree_invoiced_all
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_hr_tree_invoiced_all
msgid "Time & Materials to Invoice"
-msgstr "Faturalanacak Zaman & Malzemeler"
+msgstr "Faturalanacak Zaman&Malzemeler"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Start Date"
-msgstr "Başlangıç Tarihi"
+msgstr "Başlanma Tarihi"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Expiring soon"
-msgstr "Yakında bitiyor"
+msgstr "Süresi dolmak üzere"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Invoiced"
-msgstr "Faturalandı"
+msgstr "Faturalanan"
#. module: account_analytic_analysis
#: model:email.template,body_html:account_analytic_analysis.account_analytic_cron_email_template
@@ -516,7 +516,7 @@ msgstr "Zaman Çizelgeleri"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Closed"
-msgstr "Kapandı"
+msgstr "Kapanan"
#. module: account_analytic_analysis
#: help:account.analytic.account,hours_qtt_non_invoiced:0
@@ -699,7 +699,7 @@ msgstr "Faturalanmış Toplam"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "In Progress"
-msgstr "Sürüyor"
+msgstr "Devam Eden"
#. module: account_analytic_analysis
#: help:account.analytic.account,remaining_ca:0
diff --git a/addons/account_analytic_plans/i18n/tr.po b/addons/account_analytic_plans/i18n/tr.po
index 505bf7c7ee1..1b0d5a58b75 100644
--- a/addons/account_analytic_plans/i18n/tr.po
+++ b/addons/account_analytic_plans/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-12-19 21:07+0000\n"
-"Last-Translator: Ayhan KIZILTAN \n"
+"PO-Revision-Date: 2014-03-07 06:40+0000\n"
+"Last-Translator: Ediz Duman \n"
"Language-Team: OpenERP Türkiye Yerelleştirmesi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-12-20 05:33+0000\n"
-"X-Generator: Launchpad (build 16872)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
#. module: account_analytic_plans
@@ -96,7 +96,7 @@ msgstr "Plan No"
#. module: account_analytic_plans
#: model:ir.actions.act_window,name:account_analytic_plans.account_analytic_plan_instance_action
msgid "Analytic Distribution's Models"
-msgstr "Analitik dağıtımın modelleri"
+msgstr "Analitik Dağıtımın Modelleri"
#. module: account_analytic_plans
#: report:account.analytic.account.crossovered.analytic:0
@@ -106,7 +106,7 @@ msgstr "Hesap Adı"
#. module: account_analytic_plans
#: view:account.analytic.plan.instance.line:0
msgid "Analytic Distribution Line"
-msgstr "Analitik dağılım kalemi"
+msgstr "Analitik Dağılım Kalemi"
#. module: account_analytic_plans
#: field:account.analytic.plan.instance,code:0
@@ -149,7 +149,7 @@ msgstr "ya da"
#. module: account_analytic_plans
#: model:ir.model,name:account_analytic_plans.model_account_analytic_line
msgid "Analytic Line"
-msgstr "Analitik kalem"
+msgstr "Analitik Kalem"
#. module: account_analytic_plans
#: report:account.analytic.account.crossovered.analytic:0
@@ -259,7 +259,7 @@ msgstr "Analitik Plan Kalemleri"
#. module: account_analytic_plans
#: field:account.analytic.plan.line,min_required:0
msgid "Minimum Allowed (%)"
-msgstr "İzin verilen en az (%)"
+msgstr "İzin Verilen en az (%)"
#. module: account_analytic_plans
#: field:account.analytic.plan.instance,plan_id:0
@@ -382,7 +382,7 @@ msgstr "Hiç analitik plan tanımlanmamış."
#. module: account_analytic_plans
#: model:ir.model,name:account_analytic_plans.model_account_bank_statement
msgid "Bank Statement"
-msgstr "Banka ekstresi"
+msgstr "Banka Ekstresi"
#. module: account_analytic_plans
#: field:account.analytic.plan.instance.line,analytic_account_id:0
@@ -430,7 +430,7 @@ msgstr "Vazgeç"
#. module: account_analytic_plans
#: field:account.crossovered.analytic,date1:0
msgid "Start Date"
-msgstr "Başlangıç Tarihi"
+msgstr "Başlanma Tarihi"
#. module: account_analytic_plans
#: report:account.analytic.account.crossovered.analytic:0
diff --git a/addons/account_asset/i18n/it.po b/addons/account_asset/i18n/it.po
index 5f88c32452d..b39f2e969d7 100644
--- a/addons/account_asset/i18n/it.po
+++ b/addons/account_asset/i18n/it.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2012-12-22 14:16+0000\n"
-"Last-Translator: Sergio Corato \n"
+"PO-Revision-Date: 2014-03-06 12:29+0000\n"
+"Last-Translator: Davide Corio @ LS \n"
"Language-Team: Italian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:57+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_asset
#: view:account.asset.asset:0
@@ -200,7 +200,7 @@ msgstr "Riga Ammortamento"
#: code:addons/account_asset/account_asset.py:82
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "Errore!"
#. module: account_asset
#: view:asset.asset.report:0
@@ -614,6 +614,8 @@ msgstr "Attivi"
#, python-format
msgid "You cannot delete an asset that contains posted depreciation lines."
msgstr ""
+"Non puoi eliminare un'immobilizzazione che contiene linee di deprezzamento "
+"confermate."
#. module: account_asset
#: view:account.asset.category:0
@@ -753,7 +755,7 @@ msgstr "Movimenti Immobilizzazioni Creati"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Add an internal note here..."
-msgstr ""
+msgstr "Aggiungi una nota interna ..."
#. module: account_asset
#: field:account.asset.depreciation.line,sequence:0
diff --git a/addons/account_budget/i18n/tr.po b/addons/account_budget/i18n/tr.po
index 82cc3f12a91..7c33f732db8 100644
--- a/addons/account_budget/i18n/tr.po
+++ b/addons/account_budget/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-07-15 17:41+0000\n"
-"Last-Translator: Ayhan KIZILTAN \n"
+"PO-Revision-Date: 2014-03-07 06:40+0000\n"
+"Last-Translator: Ediz Duman \n"
"Language-Team: OpenERP Türkiye Yerelleştirmesi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:58+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
#. module: account_budget
@@ -96,7 +96,7 @@ msgstr "Bütçeleri Yazdır"
#. module: account_budget
#: report:account.budget:0
msgid "Currency:"
-msgstr "Döviz:"
+msgstr "Para Birimi:"
#. module: account_budget
#: model:ir.model,name:account_budget.model_account_budget_crossvered_report
@@ -116,7 +116,7 @@ msgstr "Yüzde"
#. module: account_budget
#: field:crossovered.budget,state:0
msgid "Status"
-msgstr "Durum"
+msgstr "Durumu"
#. module: account_budget
#: field:crossovered.budget.lines,analytic_account_id:0
@@ -218,7 +218,7 @@ msgstr "Yüzde(%)"
#: view:crossovered.budget:0
#: selection:crossovered.budget,state:0
msgid "Done"
-msgstr "Bitti"
+msgstr "Biten"
#. module: account_budget
#: report:account.budget:0
@@ -434,7 +434,7 @@ msgstr "İptal"
#: field:crossovered.budget,date_from:0
#: field:crossovered.budget.lines,date_from:0
msgid "Start Date"
-msgstr "Baş. Tarihi"
+msgstr "Başlama Tarihi"
#. module: account_budget
#: report:account.budget:0
diff --git a/addons/account_followup/i18n/tr.po b/addons/account_followup/i18n/tr.po
index e9ac3bd98e1..ca606e5daf5 100644
--- a/addons/account_followup/i18n/tr.po
+++ b/addons/account_followup/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-04-13 18:34+0000\n"
-"Last-Translator: Ayhan KIZILTAN \n"
+"PO-Revision-Date: 2014-03-07 06:40+0000\n"
+"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:58+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_followup
#: model:email.template,subject:account_followup.email_template_account_followup_default
@@ -366,7 +366,7 @@ msgstr "En Kötü Vade Tarihi"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Not Litigation"
-msgstr "Dava açılmamış"
+msgstr "ihtilaflı olmayan"
#. module: account_followup
#: view:account_followup.print:0
@@ -582,7 +582,7 @@ msgstr "Yazılı Mesaj"
#. module: account_followup
#: view:res.partner:0
msgid "Responsible of credit collection"
-msgstr "Kredi toplama sorumlusu"
+msgstr "Alacak toplama sorumlusu"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:155
@@ -936,7 +936,7 @@ msgstr " eposta(lar) Gönderilmiş olmalı, ancak "
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_move_line
msgid "Journal Items"
-msgstr "Günlük Öğeleri"
+msgstr "Yevmiye Öğeleri"
#. module: account_followup
#: code:addons/account_followup/account_followup.py:280
@@ -968,7 +968,7 @@ msgstr "Bir Eposta Gönder"
#. module: account_followup
#: field:account_followup.stat,credit:0
msgid "Credit"
-msgstr "Borç"
+msgstr "Alacak"
#. module: account_followup
#: field:res.partner,payment_amount_overdue:0
@@ -1200,7 +1200,7 @@ msgstr "İzleme Eylemi"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Including journal entries marked as a litigation"
-msgstr "Davalı olarak işaretli günlük girişlerini içerir"
+msgstr "İhtilaflı olarak işaretli yevmiye girişlerini içerir"
#. module: account_followup
#: report:account_followup.followup.print:0
diff --git a/addons/account_payment/i18n/tr.po b/addons/account_payment/i18n/tr.po
index e4861f1c081..f5b5f2734cc 100644
--- a/addons/account_payment/i18n/tr.po
+++ b/addons/account_payment/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-30 12:58+0000\n"
+"PO-Revision-Date: 2014-03-07 06:40+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-12-01 05:45+0000\n"
-"X-Generator: Launchpad (build 16856)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_payment
#: model:ir.actions.act_window,help:account_payment.action_payment_order_tree
@@ -57,7 +57,7 @@ msgstr "Uygulanacak Ödeme Şeklini Seç"
#: view:payment.mode:0
#: view:payment.order:0
msgid "Group By..."
-msgstr "Grupla..."
+msgstr "Grupla İle..."
#. module: account_payment
#: field:payment.order,line_ids:0
@@ -137,12 +137,12 @@ msgstr "Hata!"
#: report:payment.order:0
#: view:payment.order:0
msgid "Amount"
-msgstr "Miktar"
+msgstr "Tutar"
#. module: account_payment
#: view:payment.order:0
msgid "Total in Company Currency"
-msgstr "Şirket Para Biriminde Toplam"
+msgstr "Şirket Para Birimi ile Toplam"
#. module: account_payment
#: selection:payment.order,state:0
@@ -344,7 +344,7 @@ msgstr "Ödenecek tutar"
#. module: account_payment
#: report:payment.order:0
msgid "Currency"
-msgstr "Para birimi"
+msgstr "Para Birimi"
#. module: account_payment
#: view:account.payment.make.payment:0
@@ -489,7 +489,7 @@ msgstr "Ödeme Tutarı"
#. module: account_payment
#: field:payment.line,amount:0
msgid "Amount in Company Currency"
-msgstr "Firma Para Biriminde Tutar"
+msgstr "Firma Para Birimi ile Tutar"
#. module: account_payment
#: help:payment.line,partner_id:0
@@ -613,7 +613,7 @@ msgstr "Ödemeleri Onayla"
#: field:payment.line,company_currency:0
#: report:payment.order:0
msgid "Company Currency"
-msgstr "Firma Dövizi"
+msgstr "Firma Para Birimi"
#. module: account_payment
#: model:ir.ui.menu,name:account_payment.menu_main_payment
@@ -660,7 +660,7 @@ msgstr "Giriş Bilgisi"
#. module: account_payment
#: model:ir.model,name:account_payment.model_payment_order_create
msgid "payment.order.create"
-msgstr "ödeme.emir.oluştur"
+msgstr "payment.order.create"
#. module: account_payment
#: field:payment.line,order_id:0
@@ -681,7 +681,7 @@ msgstr "Toplam"
#: code:addons/account_payment/wizard/account_payment_order.py:112
#, python-format
msgid "Entry Lines"
-msgstr "Kayıt Kalemleri"
+msgstr "Giriş Kalemleri"
#. module: account_payment
#: view:account.payment.make.payment:0
diff --git a/addons/account_sequence/i18n/tr.po b/addons/account_sequence/i18n/tr.po
index c5cf9affa01..737916a1f8d 100644
--- a/addons/account_sequence/i18n/tr.po
+++ b/addons/account_sequence/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2012-12-21 23:00+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2014-03-07 06:41+0000\n"
+"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:59+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_sequence
#: view:account.sequence.installer:0
@@ -140,7 +140,7 @@ msgstr ""
#. module: account_sequence
#: model:ir.model,name:account_sequence.model_account_sequence_installer
msgid "account.sequence.installer"
-msgstr "hesap.dizi.kurucu"
+msgstr "account.sequence.installer"
#. module: account_sequence
#: model:ir.model,name:account_sequence.model_account_journal
diff --git a/addons/account_voucher/i18n/tr.po b/addons/account_voucher/i18n/tr.po
index dddb9925439..007d0b890ac 100644
--- a/addons/account_voucher/i18n/tr.po
+++ b/addons/account_voucher/i18n/tr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-24 13:53+0000\n"
+"PO-Revision-Date: 2014-03-07 06:40+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-25 06:00+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_voucher
#: field:account.bank.statement.line,voucher_id:0
@@ -78,7 +78,7 @@ msgstr "Fatura Ödeme"
#: view:account.statement.from.invoice.lines:0
#: model:ir.actions.act_window,name:account_voucher.action_view_account_statement_from_invoice_lines
msgid "Import Entries"
-msgstr "Girişleri İçeaktar"
+msgstr "Girişleri İçe aktar"
#. module: account_voucher
#: view:account.voucher:0
@@ -133,7 +133,7 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,user_id:0
msgid "Salesperson"
-msgstr "SatışTemsilcisi"
+msgstr "Satış Temsilcisi"
#. module: account_voucher
#: view:account.voucher:0
@@ -841,7 +841,7 @@ msgstr "Haziran"
#. module: account_voucher
#: field:account.voucher,payment_rate_currency_id:0
msgid "Payment Rate Currency"
-msgstr "Ödeme Para Birimi"
+msgstr "Ödeme Para Birimi Kuru"
#. module: account_voucher
#: field:account.voucher,paid:0
@@ -957,7 +957,7 @@ msgstr "Müşteri Ödemeleri"
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt_report_all
#: view:sale.receipt.report:0
msgid "Sales Receipts Analysis"
-msgstr "Satış Makbuzları Analizi"
+msgstr "Satış Makbuz Analizi"
#. module: account_voucher
#: view:sale.receipt.report:0
@@ -1004,7 +1004,7 @@ msgstr "Muhasebe Fişi"
#. module: account_voucher
#: field:account.voucher,number:0
msgid "Number"
-msgstr "Sayı"
+msgstr "Numara"
#. module: account_voucher
#: selection:account.voucher.line,type:0
@@ -1337,7 +1337,7 @@ msgstr "Vergisi Tutar"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_sale_receipt_report
msgid "Sales Receipt Statistics"
-msgstr "Satış Makbuzları İstatistikleri"
+msgstr "Satış Makbuz İstatistikleri"
#. module: account_voucher
#: view:account.voucher:0
@@ -1351,7 +1351,7 @@ msgstr "İş Ortağı"
#. module: account_voucher
#: field:account.voucher.line,amount_unreconciled:0
msgid "Open Balance"
-msgstr "Bilanço Aç"
+msgstr "Açık Bakiye"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:1106
diff --git a/addons/crm/i18n/pt_BR.po b/addons/crm/i18n/pt_BR.po
index 01a6689fd47..9d34f76b90d 100644
--- a/addons/crm/i18n/pt_BR.po
+++ b/addons/crm/i18n/pt_BR.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-01-07 16:56+0000\n"
-"PO-Revision-Date: 2013-07-18 19:53+0000\n"
-"Last-Translator: Claudio de Araujo Santos \n"
+"PO-Revision-Date: 2014-03-07 00:11+0000\n"
+"Last-Translator: Cloves Almeida \n"
"Language-Team: Brazilian Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-01-08 05:39+0000\n"
-"X-Generator: Launchpad (build 16877)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: crm
#: view:crm.lead.report:0
@@ -737,7 +737,7 @@ msgstr "Segmentação de Parceiros"
#: code:addons/crm/crm_lead.py:1064
#, python-format
msgid "Logged a call for %(date)s. %(description)s"
-msgstr ""
+msgstr "Registrada uma ligação em %(date)s. %(description)s"
#. module: crm
#: field:crm.lead,company_currency:0
@@ -3132,7 +3132,7 @@ msgstr "Indicado por"
#: code:addons/crm/crm_lead.py:1066
#, python-format
msgid "Scheduled a call for %(date)s. %(description)s"
-msgstr ""
+msgstr "Agendada uma ligação para %(date)s. %(description)s"
#. module: crm
#: field:crm.case.section,working_hours:0
diff --git a/addons/mrp/i18n/ja.po b/addons/mrp/i18n/ja.po
index 41415cdab83..6605f1acda4 100644
--- a/addons/mrp/i18n/ja.po
+++ b/addons/mrp/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-02-18 07:45+0000\n"
-"Last-Translator: Yoshi Tashiro \n"
+"PO-Revision-Date: 2014-03-07 05:43+0000\n"
+"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-19 05:40+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: mrp
#: help:mrp.config.settings,module_mrp_repair:0
@@ -672,7 +672,7 @@ msgstr "この製品のための部品表が定義されていません。"
#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action2
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action2
msgid "Bill of Material Components"
-msgstr "構成部品の部品表"
+msgstr "部品表構成品"
#. module: mrp
#: model:ir.model,name:mrp.model_stock_move
@@ -1961,7 +1961,7 @@ msgstr "集荷の再作成"
#. module: mrp
#: selection:mrp.bom,method:0
msgid "On Order"
-msgstr "注文中"
+msgstr "オーダ"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_configuration
diff --git a/addons/product/i18n/it.po b/addons/product/i18n/it.po
index fbcbc122148..b834e3abbfc 100644
--- a/addons/product/i18n/it.po
+++ b/addons/product/i18n/it.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2012-12-22 14:43+0000\n"
-"Last-Translator: Davide Corio \n"
+"PO-Revision-Date: 2014-03-06 10:33+0000\n"
+"Last-Translator: Leonardo Donelli \n"
"Language-Team: Italian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 06:26+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: product
#: field:product.packaging,rows:0
@@ -700,9 +700,9 @@ msgid ""
"not overlaps with original version. You should change the dates and "
"reactivate the pricelist"
msgstr ""
-"Quando una versione è dupplicata, impostare non attivo, in modo che i dati "
-"non sovrascrivano la versione originale. Cambiare le date e riattivare il "
-"Listino"
+"Quando una versione è duplicata viene impostato non attivo, in modo che i "
+"dati non sovrascrivano la versione originale. Cambiare le date e riattivare "
+"il Listino."
#. module: product
#: model:product.template,name:product.product_product_18_product_template
@@ -1105,7 +1105,7 @@ msgid ""
"Product Unit of Measure if not empty, in the default unit of measure of the "
"product otherwise."
msgstr ""
-"La quantità minima per gli acquisti da questo fornitore, expressa nell'unità "
+"La quantità minima per gli acquisti da questo fornitore, espressa nell'unità "
"di misura del fornitore se specificata, altrimenti nell'unità di misura di "
"default del prodotto."
@@ -1737,7 +1737,7 @@ msgid ""
"The minimal quantity to trigger this rule, expressed in the supplier Unit of "
"Measure if any or in the default Unit of Measure of the product otherrwise."
msgstr ""
-"La quatità minima per attivare questa regola, espressa nell'unità di misura "
+"La quantità minima per attivare questa regola, espressa nell'unità di misura "
"del fornitore se valorizzata o altrimenti nell'unità di misura di default "
"del prodotto."
diff --git a/addons/project/i18n/tr.po b/addons/project/i18n/tr.po
index 86516d2b90b..4bd194950a8 100644
--- a/addons/project/i18n/tr.po
+++ b/addons/project/i18n/tr.po
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-03-05 10:43+0000\n"
+"PO-Revision-Date: 2014-03-06 09:20+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: project
@@ -1114,7 +1114,7 @@ msgstr "Onay Durumu"
#. module: project
#: field:project.task.work,name:0
msgid "Work summary"
-msgstr "Çlaışma Özeti"
+msgstr "Çalışma Özeti"
#. module: project
#: view:project.project:0
diff --git a/addons/share/i18n/zh_CN.po b/addons/share/i18n/zh_CN.po
index 2d7beb1a6e8..a674195543e 100644
--- a/addons/share/i18n/zh_CN.po
+++ b/addons/share/i18n/zh_CN.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2013-11-01 16:12+0000\n"
-"Last-Translator: jeffery chen fan \n"
+"PO-Revision-Date: 2014-03-06 08:55+0000\n"
+"Last-Translator: jack lee \n"
"Language-Team: Chinese (Simplified) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 06:34+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:842
@@ -76,6 +76,8 @@ msgid ""
" %s\n"
"\n"
msgstr ""
+"附件没弄好,你可以在OpenERP服务器上查看: %s\n"
+"\n"
#. module: share
#: model:ir.module.category,name:share.module_category_share
@@ -147,7 +149,7 @@ msgstr "共享URL"
#: code:addons/share/wizard/share_wizard.py:881
#, python-format
msgid "These are your credentials to access this protected area:\n"
-msgstr ""
+msgstr "这是你访问这个保护区域的凭证:\n"
#. module: share
#: view:share.wizard:0
@@ -173,7 +175,7 @@ msgstr ""
#, python-format
msgid ""
"Please indicate the emails of the persons to share with, one per line."
-msgstr ""
+msgstr "请标明分享的用户电子邮箱,每行一个。"
#. module: share
#: help:share.wizard,domain:0
@@ -189,7 +191,7 @@ msgstr "下一个"
#: code:addons/share/wizard/share_wizard.py:662
#, python-format
msgid "Action and Access Mode are required to create a shared access."
-msgstr ""
+msgstr "操作和访问模式都需要要创建一个共享入口。"
#. module: share
#: code:addons/share/wizard/share_wizard.py:850
@@ -282,7 +284,7 @@ msgstr "共享操作"
#. module: share
#: help:share.wizard,record_name:0
msgid "Name of the shared record, if sharing a precise record"
-msgstr ""
+msgstr "如果共享一个精确记录,记录下分享名"
#. module: share
#: field:res.users,share:0
diff --git a/addons/stock/i18n/pt_BR.po b/addons/stock/i18n/pt_BR.po
index 59ad275b1bd..c3ca786a30f 100644
--- a/addons/stock/i18n/pt_BR.po
+++ b/addons/stock/i18n/pt_BR.po
@@ -8,14 +8,15 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2013-07-18 20:54+0000\n"
-"Last-Translator: Claudio de Araujo Santos \n"
+"PO-Revision-Date: 2014-03-07 00:14+0000\n"
+"Last-Translator: Fábio Martinelli - http://zupy.com.br "
+"\n"
"Language-Team: Brazilian Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-07 07:13+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -1989,7 +1990,7 @@ msgstr "Conta de Valorização do Estoque (Saindo)"
#: code:addons/stock/stock.py:1805
#, python-format
msgid "Operation Forbidden!"
-msgstr ""
+msgstr "Operação Proibida!"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_move_form2
@@ -2763,6 +2764,8 @@ msgid ""
"The unit of measure rounding does not allow you to ship \"%s %s\", only "
"rounding of \"%s %s\" is accepted by the Unit of Measure."
msgstr ""
+"O Arredondamento da Unidade de Medida não permite o envio de \"%s %s\", "
+"apenas arredondamentos de \"%s %s\" são aceitos pela Unidade de Medida."
#. module: stock
#: report:lot.stock.overview:0
@@ -3923,6 +3926,9 @@ msgid ""
"would let a quantity of \"%s %s\" to ship and only rounding of \"%s %s\" is "
"accepted by the uom."
msgstr ""
+"O Arredondamento da Unidade de Medida Inicial não permite o envio de \"%s "
+"%s\", pois deixará uma quantidade de \"%s %s\" para o envio e somente "
+"arredondamentos de \"%s %s\" são aceitos pela Udm"
#. module: stock
#: model:stock.location,name:stock.stock_location_intermediatelocation0
@@ -4265,6 +4271,7 @@ msgstr "Esta lista de separação não requer faturamento."
msgid ""
"You have manually created product lines, please delete them to proceed"
msgstr ""
+"Você criou linha de produtos manualmente, por favor exclua-as para prosseguir"
#. module: stock
#: model:stock.location,name:stock.stock_location_shop0
@@ -4325,7 +4332,7 @@ msgstr "Revisões de Número de Série"
#: code:addons/stock/stock.py:1134
#, python-format
msgid "Error, no partner!"
-msgstr ""
+msgstr "Erro, sem parceiro associado!"
#. module: stock
#: view:stock.picking:0
diff --git a/addons/warning/i18n/pt_BR.po b/addons/warning/i18n/pt_BR.po
index ab1f0873973..4367359e965 100644
--- a/addons/warning/i18n/pt_BR.po
+++ b/addons/warning/i18n/pt_BR.po
@@ -7,14 +7,15 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2012-12-21 23:00+0000\n"
-"Last-Translator: Luiz Fernando M.França (Sig Informática) \n"
+"PO-Revision-Date: 2014-03-07 00:20+0000\n"
+"Last-Translator: Fábio Martinelli - http://zupy.com.br "
+"\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 06:38+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: warning
#: model:ir.model,name:warning.model_purchase_order_line
@@ -120,7 +121,7 @@ msgid ""
"block the flow. The Message has to be written in the next field."
msgstr ""
"Selecionando a opção de \"Aviso\" irá notificar o usuário com a mensagem, "
-"marcar \"Bloqueio de Mensagem\" irá lançar uma exceção com a mensagem e "
+"marcar \"Mensagem de Bloqueio\" irá lançar uma exceção com a mensagem e "
"bloquear o fluxo. A mensagem tem de ser escrita no campo a seguir."
#. module: warning
diff --git a/addons/web/i18n/th.po b/addons/web/i18n/th.po
index 312b61f9085..cf71700f2b9 100644
--- a/addons/web/i18n/th.po
+++ b/addons/web/i18n/th.po
@@ -8,21 +8,21 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2014-02-04 07:39+0000\n"
-"Last-Translator: Nirun Tungketmukda \n"
+"PO-Revision-Date: 2014-03-06 06:57+0000\n"
+"Last-Translator: Sumonchai ( เหลา ) \n"
"Language-Team: Thai \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-22 07:35+0000\n"
-"X-Generator: Launchpad (build 16926)\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:147
#, python-format
msgid "Default language:"
-msgstr "ภาษาหลัก:"
+msgstr "ภาษาหลัก"
#. module: web
#. openerp-web
From c375851b4666aed49670ec8b62d0d6243b1f0ce0 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Fri, 7 Mar 2014 10:54:28 +0100
Subject: [PATCH 35/53] [FIX] phonecall: in 'Logged Call' menu display (by
default) only the one in done state (opw 601725)
bzr revid: mat@openerp.com-20140307095428-buwc6m008mowaoy3
---
addons/crm/crm_phonecall_menu.xml | 2 +-
addons/crm/crm_phonecall_view.xml | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/addons/crm/crm_phonecall_menu.xml b/addons/crm/crm_phonecall_menu.xml
index f6f94547173..8f934a9638d 100644
--- a/addons/crm/crm_phonecall_menu.xml
+++ b/addons/crm/crm_phonecall_menu.xml
@@ -58,7 +58,7 @@
tree,calendar
[]
- {'default_state': 'done'}
+ {'search_default_state': 'done', 'default_state': 'done'}
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index 4530f412e07..2d456cc053a 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -178,6 +178,7 @@
+
From 8db1b77757041892c37b333928f2011918e084a2 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Fri, 7 Mar 2014 12:18:35 +0100
Subject: [PATCH 36/53] [FIX] crm: write a value to date_closed when mark an
opportunity as won or lost.
This value is required to compute 'Days to Close' field
bzr revid: mat@openerp.com-20140307111835-o7nd7dmkn5y8zg2a
---
addons/crm/crm_lead.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 56aa3d4dae3..28f89533ac3 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -440,7 +440,7 @@ class crm_lead(base_stage, format_address, osv.osv):
for lead in self.browse(cr, uid, ids):
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 0.0),('on_change','=',True)], context=context)
if stage_id:
- self.case_set(cr, uid, [lead.id], values_to_update={'probability': 0.0}, new_stage_id=stage_id, context=context)
+ self.case_set(cr, uid, [lead.id], values_to_update={'probability': 0.0, 'date_closed': fields.datetime.now()}, new_stage_id=stage_id, context=context)
return True
def case_mark_won(self, cr, uid, ids, context=None):
@@ -448,7 +448,7 @@ class crm_lead(base_stage, format_address, osv.osv):
for lead in self.browse(cr, uid, ids):
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 100.0),('on_change','=',True)], context=context)
if stage_id:
- self.case_set(cr, uid, [lead.id], values_to_update={'probability': 100.0}, new_stage_id=stage_id, context=context)
+ self.case_set(cr, uid, [lead.id], values_to_update={'probability': 100.0, 'date_closed': fields.datetime.now()}, new_stage_id=stage_id, context=context)
return True
def set_priority(self, cr, uid, ids, priority):
From 618c8b910077981757967966d0221af7690d10a4 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Fri, 7 Mar 2014 15:12:57 +0100
Subject: [PATCH 37/53] [FIX] quick create: do not add the id in the form if
the form is readonly (eg: clicking on save button will make the form
uneditable)
bzr revid: mat@openerp.com-20140307141257-rvusvzm6oq3tel51
---
addons/web/static/src/js/view_form.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index c996a57ded7..706bee5bd1a 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -2977,7 +2977,8 @@ instance.web.form.CompletionFieldMixin = {
if (self.options.quick_create === undefined || self.options.quick_create) {
new instance.web.DataSet(this, this.field.relation, self.build_context())
.name_create(name).done(function(data) {
- self.add_id(data[0]);
+ if (!self.get('effective_readonly'))
+ self.add_id(data[0]);
}).fail(function(error, event) {
event.preventDefault();
slow_create();
From a5bca93a137e36d595770ab6a2ce3c9a0393f4c3 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Fri, 7 Mar 2014 16:14:26 +0100
Subject: [PATCH 38/53] [FIX] also track modifications on fee_lines field
bzr revid: mat@openerp.com-20140307151426-x7b269mxjfmna1pb
---
addons/mrp_repair/mrp_repair.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py
index fb7fd4ab71b..4dbc6ac89de 100644
--- a/addons/mrp_repair/mrp_repair.py
+++ b/addons/mrp_repair/mrp_repair.py
@@ -163,19 +163,19 @@ class mrp_repair(osv.osv):
'repaired': fields.boolean('Repaired', readonly=True),
'amount_untaxed': fields.function(_amount_untaxed, string='Untaxed Amount',
store={
- 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10),
+ 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations', 'fees_lines'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}),
'amount_tax': fields.function(_amount_tax, string='Taxes',
store={
- 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10),
+ 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations', 'fees_lines'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}),
'amount_total': fields.function(_amount_total, string='Total',
store={
- 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10),
+ 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations', 'fees_lines'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}),
From f166daf0652aa54037cf1baa5d81a7ae758f5e6e Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Sun, 9 Mar 2014 06:03:14 +0000
Subject: [PATCH 39/53] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20140308065427-0he29w0cqe07xmc8
bzr revid: launchpad_translations_on_behalf_of_openerp-20140308065421-4udfyb7xcfq5h1zy
bzr revid: launchpad_translations_on_behalf_of_openerp-20140309060314-64jktl10pkq3inv4
---
addons/account/i18n/ja.po | 14 ++++----
addons/account_analytic_analysis/i18n/fr.po | 37 ++++++++++++++++-----
addons/account_analytic_analysis/i18n/tr.po | 2 +-
addons/account_analytic_plans/i18n/tr.po | 2 +-
addons/account_budget/i18n/tr.po | 2 +-
addons/account_followup/i18n/tr.po | 2 +-
addons/account_payment/i18n/tr.po | 2 +-
addons/account_sequence/i18n/tr.po | 2 +-
addons/account_voucher/i18n/tr.po | 2 +-
addons/delivery/i18n/it.po | 10 +++---
addons/hr_expense/i18n/ja.po | 10 +++---
addons/hr_timesheet/i18n/ja.po | 24 ++++++-------
addons/hr_timesheet_sheet/i18n/ja.po | 10 +++---
addons/mrp/i18n/ja.po | 2 +-
addons/mrp_repair/i18n/fr.po | 10 +++---
addons/stock/i18n/it.po | 10 +++---
addons/stock/i18n/ja.po | 8 ++---
addons/web/i18n/cs.po | 10 +++---
18 files changed, 89 insertions(+), 70 deletions(-)
diff --git a/addons/account/i18n/ja.po b/addons/account/i18n/ja.po
index 195c22733ff..958f54e473c 100644
--- a/addons/account/i18n/ja.po
+++ b/addons/account/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-02-14 01:42+0000\n"
-"Last-Translator: Yoshi Tashiro \n"
+"PO-Revision-Date: 2014-03-08 05:09+0000\n"
+"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-14 07:44+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-09 06:02+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -3932,10 +3932,10 @@ msgstr ""
"\n"
" クリックして顧客請求書を登録してください。\n"
"
\n"
-" OpenERPの電子請求は顧客入金の回収を容易にします。\n"
-" 顧客は電子メールで請求書を受け取り、顧客のシステムがオンラインで支払うかインポートすることができます。\n"
+" OpenERPの電子請求で顧客入金処理が簡単になります。\n"
+" 顧客はEメールで請求書を受け取り、そのままオンラインで支払ったり、システムにインポートしたりすることができます。\n"
"
\n"
-" 顧客との議論は各請求書の下部に自動で表示されます。\n"
+" 顧客とのコミュニケーション履歴は各請求書の下部に自動で表示されます。\n"
"
\n"
" "
diff --git a/addons/account_analytic_analysis/i18n/fr.po b/addons/account_analytic_analysis/i18n/fr.po
index b0a1d267f38..4b357354728 100644
--- a/addons/account_analytic_analysis/i18n/fr.po
+++ b/addons/account_analytic_analysis/i18n/fr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-01-11 07:34+0000\n"
-"Last-Translator: Florian Hatat \n"
+"PO-Revision-Date: 2014-03-07 18:07+0000\n"
+"Last-Translator: Lionel Sausin - Numérigraphe \n"
"Language-Team: French \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-01-12 05:48+0000\n"
-"X-Generator: Launchpad (build 16890)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
@@ -101,6 +101,16 @@ msgid ""
"
\n"
" "
msgstr ""
+"\n"
+" Cliquez pour créer un devis qui peut être converti en un "
+"commande de\n"
+" vente.\n"
+"
\n"
+" Utiliser les commandes de vente pour suivre tout ce qui doit "
+"être facturé\n"
+" à un prix fixe sur un contrat.\n"
+"
\n"
+" "
#. module: account_analytic_analysis
#: help:account.analytic.account,ca_invoiced:0
@@ -120,7 +130,7 @@ msgstr "Total du temps passé facturé pour ce contrat."
#. module: account_analytic_analysis
#: model:email.template,subject:account_analytic_analysis.account_analytic_cron_email_template
msgid "Contract expiration reminder ${user.company_id.name}"
-msgstr ""
+msgstr "Rappel expiration du contrat ${user.company_id.name}"
#. module: account_analytic_analysis
#: code:addons/account_analytic_analysis/account_analytic_analysis.py:464
@@ -131,7 +141,7 @@ msgstr "Lignes de commandes de %s"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "End date is in the next month"
-msgstr ""
+msgstr "La date de fin est dans le prochain mois"
#. module: account_analytic_analysis
#: help:account.analytic.account,revenue_per_hour:0
@@ -212,7 +222,7 @@ msgstr "Attendu"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Closed contracts"
-msgstr ""
+msgstr "Contrats terminés"
#. module: account_analytic_analysis
#: help:account.analytic.account,theorical_margin:0
@@ -245,7 +255,7 @@ msgstr ""
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Pricelist"
-msgstr ""
+msgstr "Liste de prix"
#. module: account_analytic_analysis
#: help:account.analytic.account,remaining_hours:0
@@ -636,7 +646,7 @@ msgstr ""
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Contracts in progress (open, draft)"
-msgstr ""
+msgstr "Contrats en cours (ouvert, brouillon)"
#. module: account_analytic_analysis
#: field:account.analytic.account,last_invoice_date:0
@@ -661,6 +671,15 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" Vous trouverez ici les feuilles de temps et les achats que "
+"vous avez effectué pour\n"
+" des contrats que vous pouvez refacturer à un client. Pour\n"
+" enregistrer de nouvelles activités à facturer, utiliser "
+"plutôt le menu de \n"
+" des feuilles de temps à la place.\n"
+"
\n"
+" "
#. module: account_analytic_analysis
#: field:account.analytic.account,hours_qtt_non_invoiced:0
diff --git a/addons/account_analytic_analysis/i18n/tr.po b/addons/account_analytic_analysis/i18n/tr.po
index fa1937ee716..e673d507a5a 100644
--- a/addons/account_analytic_analysis/i18n/tr.po
+++ b/addons/account_analytic_analysis/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
diff --git a/addons/account_analytic_plans/i18n/tr.po b/addons/account_analytic_plans/i18n/tr.po
index 1b0d5a58b75..4344f7e4c3a 100644
--- a/addons/account_analytic_plans/i18n/tr.po
+++ b/addons/account_analytic_plans/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
diff --git a/addons/account_budget/i18n/tr.po b/addons/account_budget/i18n/tr.po
index 7c33f732db8..ffcdbb26dd5 100644
--- a/addons/account_budget/i18n/tr.po
+++ b/addons/account_budget/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
"Language: tr\n"
diff --git a/addons/account_followup/i18n/tr.po b/addons/account_followup/i18n/tr.po
index ca606e5daf5..af77c3e21a3 100644
--- a/addons/account_followup/i18n/tr.po
+++ b/addons/account_followup/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: account_followup
diff --git a/addons/account_payment/i18n/tr.po b/addons/account_payment/i18n/tr.po
index f5b5f2734cc..fe2a6939c71 100644
--- a/addons/account_payment/i18n/tr.po
+++ b/addons/account_payment/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: account_payment
diff --git a/addons/account_sequence/i18n/tr.po b/addons/account_sequence/i18n/tr.po
index 737916a1f8d..770a3c28104 100644
--- a/addons/account_sequence/i18n/tr.po
+++ b/addons/account_sequence/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: account_sequence
diff --git a/addons/account_voucher/i18n/tr.po b/addons/account_voucher/i18n/tr.po
index 007d0b890ac..93640794339 100644
--- a/addons/account_voucher/i18n/tr.po
+++ b/addons/account_voucher/i18n/tr.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: account_voucher
diff --git a/addons/delivery/i18n/it.po b/addons/delivery/i18n/it.po
index 9f3b1e5dd10..8a37565a0d2 100644
--- a/addons/delivery/i18n/it.po
+++ b/addons/delivery/i18n/it.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-01-03 22:45+0000\n"
-"Last-Translator: Sergio Corato \n"
+"PO-Revision-Date: 2014-03-07 13:39+0000\n"
+"Last-Translator: Leonardo Donelli \n"
"Language-Team: Italian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 06:07+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: delivery
#: report:sale.shipping:0
@@ -576,7 +576,7 @@ msgstr "Prezzo di Vendita"
#. module: delivery
#: view:stock.picking.out:0
msgid "Print Delivery Order"
-msgstr "Stampa ordine consegna"
+msgstr "Stampa Ordine di Consegna"
#. module: delivery
#: view:delivery.grid:0
diff --git a/addons/hr_expense/i18n/ja.po b/addons/hr_expense/i18n/ja.po
index 24a4e57e639..bc4c901bf7c 100644
--- a/addons/hr_expense/i18n/ja.po
+++ b/addons/hr_expense/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-02-21 02:49+0000\n"
+"PO-Revision-Date: 2014-03-08 05:28+0000\n"
"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-22 07:32+0000\n"
-"X-Generator: Launchpad (build 16926)\n"
+"X-Launchpad-Export-Date: 2014-03-09 06:02+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: hr_expense
#: view:hr.expense.expense:0
@@ -544,7 +544,7 @@ msgstr "草案"
#. module: hr_expense
#: selection:hr.expense.expense,state:0
msgid "Paid"
-msgstr ""
+msgstr "支払済"
#. module: hr_expense
#: code:addons/hr_expense/hr_expense.py:353
@@ -676,7 +676,7 @@ msgstr "交通費"
#. module: hr_expense
#: view:hr.expense.expense:0
msgid "Submit to Manager"
-msgstr "上長に申請"
+msgstr "マネジャーに申請"
#. module: hr_expense
#: view:hr.expense.report:0
diff --git a/addons/hr_timesheet/i18n/ja.po b/addons/hr_timesheet/i18n/ja.po
index 0fc180a0a83..8ce12c31d8a 100644
--- a/addons/hr_timesheet/i18n/ja.po
+++ b/addons/hr_timesheet/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-02-21 02:40+0000\n"
+"PO-Revision-Date: 2014-03-08 06:18+0000\n"
"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-22 07:32+0000\n"
-"X-Generator: Launchpad (build 16926)\n"
+"X-Launchpad-Export-Date: 2014-03-09 06:02+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: hr_timesheet
#: model:ir.actions.act_window,help:hr_timesheet.act_analytic_cost_revenue
@@ -53,7 +53,7 @@ msgstr "水曜日"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
msgid "(Keep empty for current_time)"
-msgstr "(現在、空白)"
+msgstr "(現在時刻を適用する場合は空白)"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
@@ -133,7 +133,7 @@ msgstr "タイムシート活動明細"
#. module: hr_timesheet
#: field:hr.sign.out.project,analytic_amount:0
msgid "Minimum Analytic Amount"
-msgstr "最小分析アカウント"
+msgstr "最小分析数(時/日)"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
@@ -143,7 +143,7 @@ msgstr "月間従業員作業表"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
msgid "Work done in the last period"
-msgstr "前期の完了作業"
+msgstr "今回行った作業"
#. module: hr_timesheet
#: field:hr.sign.in.project,name:0
@@ -341,7 +341,7 @@ msgstr "月"
#. module: hr_timesheet
#: field:hr.sign.out.project,info:0
msgid "Work Description"
-msgstr "作業記述"
+msgstr "作業内容"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
@@ -349,7 +349,7 @@ msgstr "作業記述"
#: view:hr.sign.in.project:0
#: view:hr.sign.out.project:0
msgid "or"
-msgstr "or"
+msgstr "または"
#. module: hr_timesheet
#: xsl:hr.analytical.timesheet:0
@@ -365,7 +365,7 @@ msgstr "従業員勤務表"
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_sign_in
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_sign_out
msgid "Sign in / Sign out by project"
-msgstr "プロジェクトごとのサインイン / サインアウト"
+msgstr "プロジェクト勤怠"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.action_define_analytic_structure
@@ -452,7 +452,7 @@ msgstr "11月"
#. module: hr_timesheet
#: field:hr.sign.out.project,date:0
msgid "Closing Date"
-msgstr "締切日"
+msgstr "終了日"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:41
@@ -640,7 +640,7 @@ msgstr "4月"
#: code:addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py:132
#, python-format
msgid "User Error!"
-msgstr ""
+msgstr "ユーザエラー"
#. module: hr_timesheet
#: view:hr.sign.in.project:0
@@ -672,4 +672,4 @@ msgstr ""
#. module: hr_timesheet
#: view:hr.sign.out.project:0
msgid "Change Work"
-msgstr "作業の変更"
+msgstr "作業更新"
diff --git a/addons/hr_timesheet_sheet/i18n/ja.po b/addons/hr_timesheet_sheet/i18n/ja.po
index 6cec2e72791..63b339f0897 100644
--- a/addons/hr_timesheet_sheet/i18n/ja.po
+++ b/addons/hr_timesheet_sheet/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2013-11-27 23:31+0000\n"
-"Last-Translator: Yoshi Tashiro \n"
+"PO-Revision-Date: 2014-03-08 05:25+0000\n"
+"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-28 06:06+0000\n"
-"X-Generator: Launchpad (build 16847)\n"
+"X-Launchpad-Export-Date: 2014-03-09 06:03+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: hr_timesheet_sheet
#: field:hr.analytic.timesheet,sheet_id:0
@@ -771,7 +771,7 @@ msgstr ""
#. module: hr_timesheet_sheet
#: view:hr_timesheet_sheet.sheet:0
msgid "Submit to Manager"
-msgstr ""
+msgstr "マネジャーに申請"
#. module: hr_timesheet_sheet
#: view:hr.timesheet.report:0
diff --git a/addons/mrp/i18n/ja.po b/addons/mrp/i18n/ja.po
index 6605f1acda4..0cd252364bf 100644
--- a/addons/mrp/i18n/ja.po
+++ b/addons/mrp/i18n/ja.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:24+0000\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:54+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: mrp
diff --git a/addons/mrp_repair/i18n/fr.po b/addons/mrp_repair/i18n/fr.po
index 09cc624f7ed..6f6ba33f837 100644
--- a/addons/mrp_repair/i18n/fr.po
+++ b/addons/mrp_repair/i18n/fr.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2013-10-23 08:18+0000\n"
-"Last-Translator: Florian Hatat \n"
+"PO-Revision-Date: 2014-03-07 18:04+0000\n"
+"Last-Translator: Lionel Sausin - Numérigraphe \n"
"Language-Team: French \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 06:22+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:54+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: mrp_repair
#: field:mrp.repair.line,move_id:0
@@ -377,7 +377,7 @@ msgstr ""
#. module: mrp_repair
#: field:mrp.repair,pricelist_id:0
msgid "Pricelist"
-msgstr "Liste de Prix"
+msgstr "Liste de prix"
#. module: mrp_repair
#: field:mrp.repair,quotation_notes:0
diff --git a/addons/stock/i18n/it.po b/addons/stock/i18n/it.po
index 6f5926e077c..b563c427ee7 100644
--- a/addons/stock/i18n/it.po
+++ b/addons/stock/i18n/it.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2013-01-09 21:34+0000\n"
-"Last-Translator: Sergio Corato \n"
+"PO-Revision-Date: 2014-03-07 13:39+0000\n"
+"Last-Translator: Leonardo Donelli \n"
"Language-Team: Italian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-07 07:11+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:54+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -4922,7 +4922,7 @@ msgstr ""
#. module: stock
#: view:stock.picking.out:0
msgid "Print Delivery Slip"
-msgstr "Stampa Ordine di Consegna"
+msgstr "Stampa Ordine di Prelievo"
#. module: stock
#: view:report.stock.inventory:0
diff --git a/addons/stock/i18n/ja.po b/addons/stock/i18n/ja.po
index 963871afd3f..ef719dd5117 100644
--- a/addons/stock/i18n/ja.po
+++ b/addons/stock/i18n/ja.po
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2014-02-28 04:43+0000\n"
+"PO-Revision-Date: 2014-03-08 03:50+0000\n"
"Last-Translator: Yoshi Tashiro \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-01 05:52+0000\n"
+"X-Launchpad-Export-Date: 2014-03-09 06:03+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: stock
@@ -920,7 +920,7 @@ msgstr "参照は会社ごとに固有でなければいけません。"
#: code:addons/stock/product.py:448
#, python-format
msgid "Future Receptions"
-msgstr "将来の受取"
+msgstr "入荷予定"
#. module: stock
#: selection:stock.move,priority:0
@@ -3325,7 +3325,7 @@ msgstr "請求書を生成したい場合は、集荷リストにパートナを
#. module: stock
#: view:stock.picking.in:0
msgid "Confirm & Receive"
-msgstr "確認と受取り"
+msgstr "確認して入荷"
#. module: stock
#: field:stock.picking,origin:0
diff --git a/addons/web/i18n/cs.po b/addons/web/i18n/cs.po
index 17b948769d9..1d270f14e0e 100644
--- a/addons/web/i18n/cs.po
+++ b/addons/web/i18n/cs.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2013-08-25 07:34+0000\n"
-"Last-Translator: Jan B. Krejčí \n"
+"PO-Revision-Date: 2014-03-07 21:03+0000\n"
+"Last-Translator: Jiří Hajda \n"
"Language-Team: openerp-i18n-czech \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-22 07:33+0000\n"
-"X-Generator: Launchpad (build 16926)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:54+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
"X-Poedit-Language: Czech\n"
#. module: web
@@ -1781,7 +1781,7 @@ msgstr "Mažu databázi"
#: code:addons/web/static/src/xml/base.xml:467
#, python-format
msgid "Powered by"
-msgstr ""
+msgstr "Založeno na"
#. module: web
#. openerp-web
From 4387a63c9b5c8cef3cac61fdf0d46b391514d1a3 Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Mon, 10 Mar 2014 12:35:57 +0100
Subject: [PATCH 40/53] [FIX] event: event report registration, replace char by
varchar in the view, so it can handle more events (basically, it wasnt
working when there was more than 10 events)
bzr revid: dle@openerp.com-20140310113557-rbohomzy8xrvwk05
---
addons/event/report/report_event_registration.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/event/report/report_event_registration.py b/addons/event/report/report_event_registration.py
index 481b86f032c..595d3947687 100644
--- a/addons/event/report/report_event_registration.py
+++ b/addons/event/report/report_event_registration.py
@@ -58,7 +58,7 @@ class report_event_registration(osv.osv):
# TOFIX this request won't select events that have no registration
cr.execute(""" CREATE VIEW report_event_registration AS (
SELECT
- e.id::char || '/' || coalesce(r.id::char,'') AS id,
+ e.id::varchar || '/' || coalesce(r.id::varchar,'') AS id,
e.id AS event_id,
e.user_id AS user_id,
r.user_id AS user_id_registration,
From 4235dc8e88378d013d74d85f1b4f18e7ce4b6882 Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Mon, 10 Mar 2014 14:33:14 +0100
Subject: [PATCH 41/53] [REVERT]9882
revid:jri@openerp.com-20140307160945-r2t5pbl2bb7yaw9n
While it seems right to only show the partner addresses in invoice and shipping addresses, this fix will prevent to use sibling addresses (the address of another contact in the same company), which is a requirement for several users. Therefore, this fix causes more problems than it resolves.
Moreover, these addresses are displayed on the invoice form as following: Company Name / Partner Name / Address Name. Therefore, if you want to change the address while seeing only the partner addresses, you just have to remove the "Address Name", leaving "Company Name / Partner Name".
bzr revid: dle@openerp.com-20140310133314-5mv4h2h5zmqlw4d2
---
addons/sale/sale.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 2673465b01b..bdadc4489da 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -209,8 +209,8 @@ class sale_order(osv.osv):
'date_confirm': fields.date('Confirmation Date', readonly=True, select=True, help="Date on which sales order is confirmed."),
'user_id': fields.many2one('res.users', 'Salesperson', states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True, track_visibility='onchange'),
'partner_id': fields.many2one('res.partner', 'Customer', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, required=True, change_default=True, select=True, track_visibility='always'),
- 'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', domain="[('parent_id','=',partner_id)]", readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."),
- 'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', domain="[('parent_id','=',partner_id)]", readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."),
+ 'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."),
+ 'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."),
'order_policy': fields.selection([
('manual', 'On Demand'),
], 'Create Invoice', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
From a4c27d560d12762640e89a0ecf6f1cae13aceef4 Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Tue, 11 Mar 2014 06:08:54 +0000
Subject: [PATCH 42/53] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20140307072259-nwltzdp1dky79a3h
bzr revid: launchpad_translations_on_behalf_of_openerp-20140308065331-um114asu0v6l8y5e
bzr revid: launchpad_translations_on_behalf_of_openerp-20140311060830-c174n48jvgwwgvlo
bzr revid: launchpad_translations_on_behalf_of_openerp-20140311060854-j335qf61ll6hvrma
---
addons/account/i18n/id.po | 65 ++++++++++++++++++-------
addons/account_check_writing/i18n/nl.po | 8 +--
addons/account_voucher/i18n/nl.po | 10 ++--
openerp/addons/base/i18n/cs.po | 19 ++++----
openerp/addons/base/i18n/id.po | 63 ++++++++++++++++++++++--
openerp/addons/base/i18n/ja.po | 2 +-
openerp/addons/base/i18n/nl.po | 8 +--
7 files changed, 129 insertions(+), 46 deletions(-)
diff --git a/addons/account/i18n/id.po b/addons/account/i18n/id.po
index bd04d19de68..4ee51fb1982 100644
--- a/addons/account/i18n/id.po
+++ b/addons/account/i18n/id.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2012-12-21 23:00+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2014-03-10 19:00+0000\n"
+"Last-Translator: williamlsd \n"
"Language-Team: Indonesian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:51+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-11 06:08+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -34,13 +34,13 @@ msgid ""
"Determine the display order in the report 'Accounting \\ Reporting \\ "
"Generic Reporting \\ Taxes \\ Taxes Report'"
msgstr ""
-"Menentukan urutan tampilan dalam laporan 'Akunting\\Pelaporan\\Pelaporan "
-"Generik\\Pajak\\Laporan Pjak'"
+"Menentukan urutan tampilan dalam laporan 'Accounting \\ Reporting \\ Generic "
+"Reporting \\ Taxes \\ Taxes Report'"
#. module: account
#: view:res.partner:0
msgid "the parent company"
-msgstr ""
+msgstr "perusahaan induk"
#. module: account
#: view:account.move.reconcile:0
@@ -68,7 +68,7 @@ msgstr "Sisa"
#: code:addons/account/account_bank_statement.py:369
#, python-format
msgid "Journal item \"%s\" is not valid."
-msgstr "Jurnal item \"%s\" tidak valid"
+msgstr "Item \"%s\" dalam Jurnal tidak valid"
#. module: account
#: model:ir.model,name:account.model_report_aged_receivable
@@ -86,7 +86,7 @@ msgstr "Impor dari tagihan atau pembayaran"
#: code:addons/account/account_move_line.py:1210
#, python-format
msgid "Bad Account!"
-msgstr ""
+msgstr "Akun Salah"
#. module: account
#: view:account.move:0
@@ -172,6 +172,9 @@ msgid ""
"which is set after generating opening entries from 'Generate Opening "
"Entries'."
msgstr ""
+"Anda harus menetapkan 'End of Year Entries Journal' untuk tahun fiskal ini, "
+"yang akan ditetapkan setelah menghasilkan entri awal dari 'Generate Opening "
+"Entries'"
#. module: account
#: field:account.fiscal.position.account,account_src_id:0
@@ -190,6 +193,14 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" Klik untuk menambah periode fiskal\n"
+"
\n"
+" Satu periode akunting biasanya adalah satu bulan atau satu "
+"kuartal. \n"
+" Biasanya terkait dengan periode pajak.\n"
+"
\n"
+" "
#. module: account
#: model:ir.actions.act_window,name:account.action_view_created_invoice_dashboard
@@ -204,7 +215,7 @@ msgstr "Nama Kolom"
#. module: account
#: help:account.config.settings,code_digits:0
msgid "No. of digits to use for account code"
-msgstr ""
+msgstr "Jumlah digit untuk kode akun"
#. module: account
#: help:account.analytic.journal,type:0
@@ -224,6 +235,9 @@ msgid ""
"lines for invoices. Leave empty if you don't want to use an analytic account "
"on the invoice tax lines by default."
msgstr ""
+"Set akun analitik yang akan digunakan sebagai default pada baris pajak "
+"tagihan dalam invoice. Biarkan kosong jika anda tidak ingin menggunakan akun "
+"analitik pada baris pajak tagihan sebagai default."
#. module: account
#: model:ir.actions.act_window,name:account.action_account_tax_template_form
@@ -249,12 +263,12 @@ msgstr "Laporan menurut standar Belgia"
#. module: account
#: model:mail.message.subtype,name:account.mt_invoice_validated
msgid "Validated"
-msgstr ""
+msgstr "Tervalidasi"
#. module: account
#: model:account.account.type,name:account.account_type_income_view1
msgid "Income View"
-msgstr ""
+msgstr "View Pendapatan"
#. module: account
#: help:account.account,user_type:0
@@ -270,7 +284,7 @@ msgstr ""
#. module: account
#: field:account.config.settings,sale_refund_sequence_next:0
msgid "Next credit note number"
-msgstr ""
+msgstr "Nomor catatan kredit berikutnya"
#. module: account
#: help:account.config.settings,module_account_voucher:0
@@ -279,6 +293,9 @@ msgid ""
"sales, purchase, expense, contra, etc.\n"
" This installs the module account_voucher."
msgstr ""
+"Ini mencakup seluruh kebutuhan dasar untuk entri voucher bank, kas, "
+"penjualan, pembelian, biaya, kontra, dsb.\n"
+" Menginstal modul account_voucher."
#. module: account
#: model:ir.actions.act_window,name:account.action_account_use_model_create_entry
@@ -310,6 +327,18 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" Klik untuk membentuk refund dana pelanggan.\n"
+"
\n"
+" Refund adalah dokumen yang meng-kredit tagihan seluruhnya "
+"atau \n"
+" sebagian.\n"
+"
\n"
+" Anda dapat menerbitkan refund langsung dari tagihan "
+"pelanggan,\n"
+" tidak harus diterbitkan secara manual.\n"
+"
\n"
+" "
#. module: account
#: help:account.installer,charts:0
@@ -328,7 +357,7 @@ msgstr "Pembatalan Rekonsiliasi Akun"
#. module: account
#: field:account.config.settings,module_account_budget:0
msgid "Budget management"
-msgstr ""
+msgstr "Manajemen anggaran"
#. module: account
#: view:product.template:0
@@ -349,13 +378,13 @@ msgstr ""
#. module: account
#: field:account.config.settings,group_multi_currency:0
msgid "Allow multi currencies"
-msgstr ""
+msgstr "Izinkan mata uang jamak"
#. module: account
#: code:addons/account/account_invoice.py:77
#, python-format
msgid "You must define an analytic journal of type '%s'!"
-msgstr ""
+msgstr "Anda harus mendefinisikan jurnal analitik tipe '%s'!"
#. module: account
#: selection:account.entries.report,month:0
@@ -370,12 +399,12 @@ msgstr "Juni"
#: code:addons/account/wizard/account_automatic_reconcile.py:148
#, python-format
msgid "You must select accounts to reconcile."
-msgstr ""
+msgstr "Anda harus memilih akun untuk di rekonsiliasi"
#. module: account
#: help:account.config.settings,group_analytic_accounting:0
msgid "Allows you to use the analytic accounting."
-msgstr ""
+msgstr "Mengizinkan anda menggunakan akunting analitik"
#. module: account
#: view:account.invoice:0
diff --git a/addons/account_check_writing/i18n/nl.po b/addons/account_check_writing/i18n/nl.po
index a90f253c9f9..20d99736812 100644
--- a/addons/account_check_writing/i18n/nl.po
+++ b/addons/account_check_writing/i18n/nl.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2012-12-25 14:36+0000\n"
+"PO-Revision-Date: 2014-03-10 20:45+0000\n"
"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n"
"Language-Team: Dutch \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:58+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-11 06:08+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_check_writing
#: selection:res.company,check_layout:0
@@ -25,7 +25,7 @@ msgstr "Cheque boven"
#. module: account_check_writing
#: report:account.print.check.top:0
msgid "Open Balance"
-msgstr "Open balans"
+msgstr "Openstaand bedrag"
#. module: account_check_writing
#: view:account.check.write:0
diff --git a/addons/account_voucher/i18n/nl.po b/addons/account_voucher/i18n/nl.po
index bb354bcae59..9513d876648 100644
--- a/addons/account_voucher/i18n/nl.po
+++ b/addons/account_voucher/i18n/nl.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-02-19 09:56+0000\n"
+"PO-Revision-Date: 2014-03-10 20:43+0000\n"
"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n"
"Language-Team: Dutch \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-20 05:41+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-11 06:08+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: account_voucher
#: field:account.bank.statement.line,voucher_id:0
@@ -488,7 +488,7 @@ msgid ""
"At the operation date, the exchange rate was\n"
"%s = %s"
msgstr ""
-"Op de verwerkingsdatum, was de valutakoer\n"
+"Op de verwerkingsdatum, was de valutakoers\n"
"%s = %s"
#. module: account_voucher
@@ -1359,7 +1359,7 @@ msgstr "Relatie"
#. module: account_voucher
#: field:account.voucher.line,amount_unreconciled:0
msgid "Open Balance"
-msgstr "Open balans"
+msgstr "Openstaand bedrag"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:1106
diff --git a/openerp/addons/base/i18n/cs.po b/openerp/addons/base/i18n/cs.po
index 4c0848246d0..1de34103c72 100644
--- a/openerp/addons/base/i18n/cs.po
+++ b/openerp/addons/base/i18n/cs.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:35+0000\n"
-"PO-Revision-Date: 2014-01-07 16:17+0000\n"
-"Last-Translator: Maros Tarbajovsky \n"
+"PO-Revision-Date: 2014-03-07 20:45+0000\n"
+"Last-Translator: Marek Stopka \n"
"Language-Team: Czech \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-01-08 05:38+0000\n"
-"X-Generator: Launchpad (build 16877)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
"X-Language: cs_CZ\n"
"X-Source-Language: en\n"
@@ -71,7 +71,7 @@ msgstr "Zobrazení architektury"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
-msgstr "Nabídky, zakázky, řízení dopravy a fakturace"
+msgstr "Nabídky, zakázky, řízení dodávek a fakturace"
#. module: base
#: selection:ir.sequence,implementation:0
@@ -94,8 +94,7 @@ msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr ""
-"Pomůže vám spravovat projekty a úkoly jejich sledováním, generováním plánů, "
-"apod."
+"Pomůže vám řídit projekty a úkoly jejich sledováním, generováním plánů, aj."
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
@@ -165,7 +164,7 @@ msgstr ""
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
-msgstr "Zaškrtněte toto pole, pokud je kontakt zaměstnanec."
+msgstr "Zaškrtněte toto pole, pokud je kontakt zaměstnancem."
#. module: base
#: help:ir.model.fields,domain:0
@@ -11295,7 +11294,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_product_visible_discount
msgid "Prices Visible Discounts"
-msgstr ""
+msgstr "Zobrazení slevy u ceny"
#. module: base
#: field:ir.attachment,datas:0
@@ -16098,7 +16097,7 @@ msgstr "Automatická instalace"
#. module: base
#: view:base.language.import:0
msgid "e.g. en_US"
-msgstr ""
+msgstr "např. en_US"
#. module: base
#: model:ir.module.module,description:base.module_l10n_hn
diff --git a/openerp/addons/base/i18n/id.po b/openerp/addons/base/i18n/id.po
index df2e90f4321..7d8cc6a4f14 100644
--- a/openerp/addons/base/i18n/id.po
+++ b/openerp/addons/base/i18n/id.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:35+0000\n"
-"PO-Revision-Date: 2014-02-01 05:58+0000\n"
-"Last-Translator: Kristi Hari \n"
+"PO-Revision-Date: 2014-03-10 19:22+0000\n"
+"Last-Translator: williamlsd \n"
"Language-Team: Indonesian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-02 05:59+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-11 06:08+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -216,6 +216,15 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
+"\n"
+"Bentuk tagihan anda dari entri Expenses, Timesheet.\n"
+"========================================================\n"
+"\n"
+"Modul untuk menerbitkan tagihan berbasis biaya (sdm, biaya, dsb).\n"
+"\n"
+"Anda dapat mendefinisikan daftar harga pada akun analitik, membuat laporan "
+"anggaran \n"
+"penghasilan."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@@ -325,6 +334,37 @@ msgid ""
"launchpad:\n"
" https://launchpad.net/openerp-swiss-localization\n"
msgstr ""
+"\n"
+" Lokalisasi Swiss :\n"
+" ====================\n"
+" **Multilang swiss STERCHI account chart and taxes**\n"
+" **Penulis:** Camptocamp SA\n"
+"\n"
+" **Kontributor finansial:** Prisme Solutions Informatique SA, Quod SA\n"
+"\n"
+" **Kontributor terjemahan:** brain-tec AG, Agile Business Group\n"
+"\n"
+" **Rilisi ini akan memperkenalkan perubahan besar pada l10n_ch.**\n"
+"\n"
+" Sehubungan dengan kebutuhan refaktoring yang penting, dan adopsi "
+"Switzerland atas strandar pembayaran internasional yang baru selama 2013-"
+"2014. Kami mengorganisasikan addons lokalisasi swiss dengan cara berikut: \n"
+"\n"
+" - **l10n_ch**: Akun multilang swiss STERCHI diagram and pajak (addon "
+"resmi)\n"
+" - **l10n_ch_base_bank**: Modul teknis yang memperkenalkan versi baru dari "
+"manajemen tipe bank yang lebih mudah.\n"
+" - **l10n_ch_bank**: Daftar bank-bank swiss \n"
+" - **l10n_ch_zip**: Daftar kotak pos swiss\n"
+" - **l10n_ch_dta**: Dukungan protokol pembayaran dta (akan diakhiri pada "
+"akhir 2014)\n"
+" - **l10n_ch_payment_slip**: Dukungan slip dan rekonsliasi pembayaran "
+"ESR/BVR. Laporan refaktor dengan penempatan elemen yang mudah.\n"
+" - **l10n_ch_sepa**: Implementasi alfa dari dukungan PostFinance SEPA/PAIN "
+"akan diselesaikan dalam 2013/2014\n"
+"\n"
+" Modul-modul akan tersedia pada lokalisasi Swiss OpenERP pada launchpad: \n"
+" https://launchpad.net/openerp-swiss-localization\n"
#. module: base
#: model:res.groups,name:base.group_multi_currency
@@ -341,6 +381,12 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Lokalisasi skema akunting dan pajak Chili.\n"
+"==============================================\n"
+"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
+"\n"
+" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@@ -440,6 +486,15 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
+"\n"
+"Mengizinkan anda untuk menambahkan metode deliveri pada order penjualan dan "
+"pengambilan.\n"
+"==============================================================\n"
+"\n"
+"Anda dapat menentukan carrier sendiri dan metode antar untuk harga tersebut. "
+"Saat membuat\n"
+"tagihan dari pengantaran, OpenERP dapat menambah dan menghitung biaya "
+"pengiriman.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
diff --git a/openerp/addons/base/i18n/ja.po b/openerp/addons/base/i18n/ja.po
index 9d276888ff4..288297863a1 100644
--- a/openerp/addons/base/i18n/ja.po
+++ b/openerp/addons/base/i18n/ja.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-06 06:14+0000\n"
+"X-Launchpad-Export-Date: 2014-03-07 07:22+0000\n"
"X-Generator: Launchpad (build 16948)\n"
#. module: base
diff --git a/openerp/addons/base/i18n/nl.po b/openerp/addons/base/i18n/nl.po
index e84881a4ff4..04b3c4e54d1 100644
--- a/openerp/addons/base/i18n/nl.po
+++ b/openerp/addons/base/i18n/nl.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:35+0000\n"
-"PO-Revision-Date: 2014-02-12 12:26+0000\n"
+"PO-Revision-Date: 2014-03-07 12:12+0000\n"
"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n"
"Language-Team: Dutch \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-13 06:47+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-08 06:53+0000\n"
+"X-Generator: Launchpad (build 16948)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -13601,7 +13601,7 @@ msgstr ""
#. module: base
#: selection:res.currency,position:0
msgid "Before Amount"
-msgstr "Voormalig bedrag"
+msgstr "Voor bedrag"
#. module: base
#: field:res.request,act_from:0
From c033e5a5351a070043131720faf8f8f7df669571 Mon Sep 17 00:00:00 2001
From: Xavier ALT <>
Date: Tue, 11 Mar 2014 10:15:22 +0100
Subject: [PATCH 43/53] [FIX] web: on SearchPopup creation concat build context
even if we have initial_ids
On SearchPopupCreation, if we have initial_ids - 1st search_read() will be
missing custom context defined on the field.
1. defined view like this:
2. in we expand the list of available item, name_search() has 'test' in context
3. in we click on 'Search More', search_read() is missing 'test' in context
4. if we change filter add/remove item, search_read() will have 'test' in context
Step 3. is wrong, should also have 'test' in context
lp bug: https://launchpad.net/bugs/1209295 fixed
bzr revid: mat@openerp.com-20140311091522-03imwd5rj3rmwapl
---
addons/web/static/src/js/view_form.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 706bee5bd1a..edb44e7ea06 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -4796,7 +4796,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
this.searchview.on('search_data', self, function(domains, contexts, groupbys) {
if (self.initial_ids) {
self.do_search(domains.concat([[["id", "in", self.initial_ids]], self.domain]),
- contexts, groupbys);
+ contexts.concat(self.context), groupbys);
self.initial_ids = undefined;
} else {
self.do_search(domains.concat([self.domain]), contexts.concat(self.context), groupbys);
From 6e9f3ad8064bcd8491e85817d704aba6eb0d944c Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Tue, 11 Mar 2014 11:49:47 +0100
Subject: [PATCH 44/53] [FIX] web: set z-index of 9999 for autocompletion pane
of search bar, to avoid being behind jquery ui dialogs. Besides, this pane
should always be on top, therefore we can assume that setting 9999 will not
have bad side effects
bzr revid: dle@openerp.com-20140311104947-is5qpw71y1m2oakf
---
addons/web/static/src/js/search.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index ad212d7f86d..b82ad6504a9 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -341,7 +341,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
}
},
'autocompleteopen': function () {
- this.$el.autocomplete('widget').css('z-index', 1004);
+ this.$el.autocomplete('widget').css('z-index', 9999);
},
},
/**
From 8a3523cd9721ecfbc860464b66f4b8db7b0c717f Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Tue, 11 Mar 2014 12:23:41 +0100
Subject: [PATCH 45/53] [FIX] partner: backport of trunk revision 4882
When adding a new contact or a new company based from the partner form, use the customer value as default value (was doign it only for the supplier flag)
bzr revid: mat@openerp.com-20140311112341-9yoi1hf0ks98ju3r
---
openerp/addons/base/res/res_partner_view.xml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml
index 8236e0b283e..9ff9649b8b7 100644
--- a/openerp/addons/base/res/res_partner_view.xml
+++ b/openerp/addons/base/res/res_partner_view.xml
@@ -138,7 +138,7 @@
@@ -186,7 +186,7 @@
-
+
@@ -286,6 +286,7 @@
+
From 5041f63b353c82267b8669dfb0811e15246ef6d4 Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Tue, 11 Mar 2014 16:04:46 +0100
Subject: [PATCH 46/53] [FIX] crm: write a value to date_closed field as well
if change directly the stage instead of using buttons (which will probably be
removed later)
bzr revid: mat@openerp.com-20140311150446-0atbc6esymjyv69e
---
addons/crm/crm_lead.py | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 28f89533ac3..bd3c6f33f4e 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -926,11 +926,14 @@ class crm_lead(base_stage, format_address, osv.osv):
return res
def write(self, cr, uid, ids, vals, context=None):
- if vals.get('stage_id') and not vals.get('probability'):
- # change probability of lead(s) if required by stage
+ if vals.get('stage_id'):
stage = self.pool.get('crm.case.stage').browse(cr, uid, vals['stage_id'], context=context)
- if stage.on_change:
+ if not vals.get('probability') and stage.on_change:
+ # change probability of lead(s) if required by stage
vals['probability'] = stage.probability
+ # set closed date when won or lost
+ if not vals.get('date_closed') and (vals.get('probability', 0) >= 100 or stage.state == 'canceled'):
+ vals['date_closed'] = fields.datetime.now()
return super(crm_lead, self).write(cr, uid, ids, vals, context=context)
def copy(self, cr, uid, id, default=None, context=None):
From 65d0a0733d9f26ee10654d521d67d9a363c24969 Mon Sep 17 00:00:00 2001
From: Olivier Dony
Date: Tue, 11 Mar 2014 17:03:07 +0100
Subject: [PATCH 47/53] [FIX] portal: expensive copy/paste typo
bzr revid: odo@openerp.com-20140311160307-lth3kmu9z4h3l8c1
---
addons/portal/mail_message.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/portal/mail_message.py b/addons/portal/mail_message.py
index 211cf74a88f..428b1be3c4b 100644
--- a/addons/portal/mail_message.py
+++ b/addons/portal/mail_message.py
@@ -42,7 +42,7 @@ class mail_message(osv.Model):
args = ['&', '|', ('type', '!=', 'comment'), ('subtype_id', '!=', False)] + list(args)
return super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
- context=context, count=False, access_rights_uid=access_rights_uid)
+ context=context, count=count, access_rights_uid=access_rights_uid)
def check_access_rule(self, cr, uid, ids, operation, context=None):
""" Add Access rules of mail.message for non-employee user:
From b756b693e2c56c43c3454207505cb5b2c2cf78fe Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Tue, 11 Mar 2014 17:14:21 +0100
Subject: [PATCH 48/53] [FIX] portal: expensive copy/paste typo
bzr revid: dle@openerp.com-20140311161421-6u54mzzj7pefypg8
---
addons/portal/mail_message.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/portal/mail_message.py b/addons/portal/mail_message.py
index 428b1be3c4b..3929908fe77 100644
--- a/addons/portal/mail_message.py
+++ b/addons/portal/mail_message.py
@@ -35,7 +35,7 @@ class mail_message(osv.Model):
"""
if uid == SUPERUSER_ID:
return super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
- context=context, count=False, access_rights_uid=access_rights_uid)
+ context=context, count=count, access_rights_uid=access_rights_uid)
group_ids = self.pool.get('res.users').browse(cr, uid, uid, context=context).groups_id
group_user_id = self.pool.get("ir.model.data").get_object_reference(cr, uid, 'base', 'group_user')[1]
if group_user_id not in [group.id for group in group_ids]:
From 160229d58e340c7ba6799c5ae90607e205e5016c Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Wed, 12 Mar 2014 05:26:04 +0000
Subject: [PATCH 49/53] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20140312052604-hgt48h8szpiw9szj
---
addons/account/i18n/id.po | 98 +++++++++++-----
addons/account/i18n/ko.po | 12 +-
addons/account/i18n/mn.po | 12 +-
addons/account_accountant/i18n/id.po | 10 +-
addons/account_asset/i18n/id.po | 165 +++++++++++++++------------
addons/account_cancel/i18n/id.po | 10 +-
addons/stock/i18n/nl.po | 9 +-
addons/stock/i18n/zh_TW.po | 77 +++++++------
8 files changed, 229 insertions(+), 164 deletions(-)
diff --git a/addons/account/i18n/id.po b/addons/account/i18n/id.po
index 4ee51fb1982..a4ece1f4bbd 100644
--- a/addons/account/i18n/id.po
+++ b/addons/account/i18n/id.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-03-10 19:00+0000\n"
+"PO-Revision-Date: 2014-03-11 17:03+0000\n"
"Last-Translator: williamlsd \n"
"Language-Team: Indonesian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-11 06:08+0000\n"
-"X-Generator: Launchpad (build 16948)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -253,7 +253,7 @@ msgstr "Pindahkan baris rekonsiliasi terpilih"
#. module: account
#: model:process.transition,note:account.process_transition_supplierentriesreconcile0
msgid "Accounting entries are an input of the reconciliation."
-msgstr "Catatan akuntansi adalah sebuah masukan dari rekonsiliasi"
+msgstr "Entri akunting adalah input rekonsiliasi"
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_management_belgian_reports
@@ -412,18 +412,18 @@ msgstr "Mengizinkan anda menggunakan akunting analitik"
#: view:account.invoice.report:0
#: field:account.invoice.report,user_id:0
msgid "Salesperson"
-msgstr ""
+msgstr "Pramuniaga"
#. module: account
#: view:account.bank.statement:0
#: view:account.invoice:0
msgid "Responsible"
-msgstr "Bertanggung Jawab"
+msgstr "Tanggung-jawab"
#. module: account
#: model:ir.model,name:account.model_account_bank_accounts_wizard
msgid "account.bank.accounts.wizard"
-msgstr "tuntunan.akun.bank"
+msgstr "account.bank.accounts.wizard"
#. module: account
#: field:account.move.line,date_created:0
@@ -434,7 +434,7 @@ msgstr "Tanggal pembuatan"
#. module: account
#: view:account.invoice:0
msgid "Cancel Invoice"
-msgstr ""
+msgstr "Batalkan Tagihan"
#. module: account
#: selection:account.journal,type:0
@@ -472,18 +472,25 @@ msgid ""
"this box, you will be able to do invoicing & payments,\n"
" but not accounting (Journal Items, Chart of Accounts, ...)"
msgstr ""
+"Memungkinkan anda mengatur aktiva yang dimiliki oleh perusahaan atau "
+"perseorangan.\n"
+" Menyimpan depresiasi yang terjadi pada aktiva tersebut , dan "
+"membuat akun bergerak untuk baris depresiasinya.\n"
+" Menginstal modul account_asset. Jika anda tidak mencentang "
+"kotak ini, anda bisa melakukan penagihan dan pembayaran, tetapi tidak bisa "
+"melakukan pembukuan (Jurnal Items, Chart of Accounts, ...)"
#. module: account
#: help:account.bank.statement.line,name:0
msgid "Originator to Beneficiary Information"
-msgstr ""
+msgstr "Pembuat Informasi Penerima"
#. module: account
#. openerp-web
#: code:addons/account/static/src/xml/account_move_line_quickadd.xml:8
#, python-format
msgid "Period :"
-msgstr ""
+msgstr "Periode :"
#. module: account
#: field:account.account.template,chart_template_id:0
@@ -491,12 +498,13 @@ msgstr ""
#: field:account.tax.template,chart_template_id:0
#: field:wizard.multi.charts.accounts,chart_template_id:0
msgid "Chart Template"
-msgstr "Salinan Bagan Akun"
+msgstr "Template Bagan"
#. module: account
#: selection:account.invoice.refund,filter_refund:0
msgid "Modify: create refund, reconcile and create a new draft invoice"
msgstr ""
+"Perubahan: buat pengembalian, rekonsiliasi, dan membuat draft tagihan baru"
#. module: account
#: help:account.config.settings,tax_calculation_rounding_method:0
@@ -510,11 +518,19 @@ msgid ""
"should choose 'Round per line' because you certainly want the sum of your "
"tax-included line subtotals to be equal to the total amount with taxes."
msgstr ""
+"Jika anda memilih 'Round per line' : untuk setiap pajak, nilai pajak awal "
+"akan dihitung dan dibulatkan untuk setiap baris PO/SO/Tagihan kemudian hasil "
+"pembulatan ini dijumlahkan, hasilnya adalah total pajak. Jika anda memilih "
+"'Round globally': untuk setiap pajak, jumlah pajak akan dihitung untuk "
+"setiap baris PO/SO/tagihan, kemudian jumlahnya barulah di bulatkan. Jika "
+"anda menjual dengan pajak, anda harusnya memilih 'Round per line' karena "
+"tentunya anda menginginkan agar nilai pajak pada subtotal sama dengan jumlah "
+"total pajak setiap baris."
#. module: account
#: model:ir.model,name:account.model_wizard_multi_charts_accounts
msgid "wizard.multi.charts.accounts"
-msgstr "tuntunan.multi.bagan.akun"
+msgstr "wizard.multi.charts.accounts"
#. module: account
#: help:account.model.line,amount_currency:0
@@ -524,12 +540,12 @@ msgstr "Jumlah yang ditampilkan dalam mata uang pilihan lainnya"
#. module: account
#: view:account.journal:0
msgid "Available Coins"
-msgstr ""
+msgstr "Koin yang tersedia"
#. module: account
#: field:accounting.report,enable_filter:0
msgid "Enable Comparison"
-msgstr "Perbandingan diperbolehkan"
+msgstr "Izinkan Perbandingan"
#. module: account
#: view:account.analytic.line:0
@@ -577,7 +593,7 @@ msgstr "Induk target"
#. module: account
#: help:account.invoice.line,sequence:0
msgid "Gives the sequence of this line when displaying the invoice."
-msgstr ""
+msgstr "Memberikan urutan baris ini saat menampilkan tagihan"
#. module: account
#: field:account.bank.statement,account_id:0
@@ -621,7 +637,7 @@ msgstr "Bukan transaksi yang dapat direkonsiliasi"
#: report:account.general.ledger:0
#: report:account.general.ledger_landscape:0
msgid "Counterpart"
-msgstr "Lawan"
+msgstr "Counterpart"
#. module: account
#: view:account.fiscal.position:0
@@ -655,7 +671,7 @@ msgstr "Semua"
#. module: account
#: field:account.config.settings,decimal_precision:0
msgid "Decimal precision on journal entries"
-msgstr ""
+msgstr "Presisi desimal pada entri jurnal"
#. module: account
#: selection:account.config.settings,period:0
@@ -681,6 +697,8 @@ msgid ""
"Specified journal does not have any account move entries in draft state for "
"this period."
msgstr ""
+"Jurnal dimaksud tidak memiliki entri akun bergerak pada kondisi draft untuk "
+"periode ini."
#. module: account
#: view:account.fiscal.position:0
@@ -703,12 +721,12 @@ msgstr "Urutan Utama harus berbeda dari yang sekarang !"
#: code:addons/account/wizard/account_change_currency.py:70
#, python-format
msgid "Current currency is not configured properly."
-msgstr ""
+msgstr "Mata uang saat ini tidak terkonfigurasi dengan baik."
#. module: account
#: field:account.journal,profit_account_id:0
msgid "Profit Account"
-msgstr ""
+msgstr "Akun Profit"
#. module: account
#: code:addons/account/account_move_line.py:1156
@@ -729,11 +747,19 @@ msgid ""
"either the user pressed the button \"Nothing more to reconcile\" during the "
"manual reconciliation process."
msgstr ""
+"Tanggal dimana partner entri akunting terakhir kali sepenuhnya ter-"
+"rekonsiliasi. Berbeda dengan tanggal terakhir dimana suatu rekonsiliasi "
+"dilakukan untuk partner ini, karena disini kita menggambarkan fakta bahwa "
+"tidak ada lagi yang perlu di rekonsiliasi pada tanggal ini. Hal ini dapat "
+"dicapai dengan 2 cara berbeda: bisa entri debit/kredit terakhir yang belum "
+"di rekonsiliasi untuk partner ini di rekonsiliasikan, atau pengguna "
+"menggunakan tombol \"Tidak ada lagi yang perlu di rekonsiliasi\" pada proses "
+"rekonsiliasi manual."
#. module: account
#: model:ir.model,name:account.model_report_account_type_sales
msgid "Report of the Sales by Account Type"
-msgstr ""
+msgstr "Laporan Penjualan Menurut Tipe Akun"
#. module: account
#: code:addons/account/account.py:3201
@@ -745,7 +771,7 @@ msgstr "SAJ"
#: code:addons/account/account.py:1591
#, python-format
msgid "Cannot create move with currency different from .."
-msgstr ""
+msgstr "Tidak dapat membuat gerakan dengan mata uang berbeda dari .."
#. module: account
#: model:email.template,report_name:account.email_template_edi_invoice
@@ -753,6 +779,8 @@ msgid ""
"Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' "
"and 'draft' or ''}"
msgstr ""
+"Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' "
+"and 'draft' or ''}"
#. module: account
#: view:account.period:0
@@ -781,12 +809,16 @@ msgid ""
"The amount expressed in the secondary currency must be positive when the "
"journal item is a debit and negative when if it is a credit."
msgstr ""
+"Jumlah pada mata uang sekunder harus positif saat item jurnal adalah debit "
+"dan negatif saat kredit."
#. module: account
#: constraint:account.move:0
msgid ""
"You cannot create more than one move per period on a centralized journal."
msgstr ""
+"Anda tidak dapat membuat lebih dari satu pergerakan per periode pada jurnal "
+"tersentralisasi."
#. module: account
#: help:account.tax,account_analytic_paid_id:0
@@ -795,6 +827,9 @@ msgid ""
"lines for refunds. Leave empty if you don't want to use an analytic account "
"on the invoice tax lines by default."
msgstr ""
+"Set akun analitik yang akan digunakan sebagai default pada baris pajak "
+"tagihan untuk pengembalian. Tinggalkan kosong jika sebagai default anda "
+"tidak ingin menggunakan akun analitik pada baris pajak tagihan."
#. module: account
#: view:account.account:0
@@ -812,12 +847,12 @@ msgstr "Akun Piutang"
#. module: account
#: view:account.config.settings:0
msgid "Configure your company bank accounts"
-msgstr ""
+msgstr "Konfigurasi akun bank perusahaan anda."
#. module: account
#: view:account.invoice.refund:0
msgid "Create Refund"
-msgstr ""
+msgstr "Buat Pengembalian"
#. module: account
#: constraint:account.move.line:0
@@ -825,13 +860,13 @@ msgid ""
"The date of your Journal Entry is not in the defined period! You should "
"change the date or remove this constraint from the journal."
msgstr ""
-"Tanggal pada jurnal entri tidak sesuai dengan Period ! Anda harus merubah "
-"atau menghilangkan tanggal ini pada jurnal."
+"Tanggal pada jurnal entri tidak sesuai dengan Periode ! Anda harus merubah "
+"tanggal atau menghilangkan batasan ini dari jurnal."
#. module: account
#: model:ir.model,name:account.model_account_report_general_ledger
msgid "General Ledger Report"
-msgstr "Laporan Buku Besar Umum"
+msgstr "Laporan Buku Besar"
#. module: account
#: view:account.invoice:0
@@ -847,12 +882,12 @@ msgstr "Apakah anda yakin untuk membuat catatan baru?"
#: code:addons/account/account_invoice.py:1361
#, python-format
msgid "Invoice partially paid: %s%s of %s%s (%s%s remaining)."
-msgstr ""
+msgstr "Tagihan dibayar parsial: %s%s dari %s%s (%s%s tersisa)."
#. module: account
#: view:account.invoice:0
msgid "Print Invoice"
-msgstr "Print Faktur"
+msgstr "Cetak Tagihan"
#. module: account
#: code:addons/account/wizard/account_invoice_refund.py:111
@@ -861,16 +896,19 @@ msgid ""
"Cannot %s invoice which is already reconciled, invoice should be "
"unreconciled first. You can only refund this invoice."
msgstr ""
+"Tidak dapat %s tagihan yang sudah di rekonsiliasi, tagihan seharusnya di-"
+"unreconciled terlebih dulu. Anda hanya dapat melakukan pengembalian atas "
+"tagihan ini."
#. module: account
#: view:account.account:0
msgid "Account code"
-msgstr ""
+msgstr "Kode akun"
#. module: account
#: selection:account.financial.report,display_detail:0
msgid "Display children with hierarchy"
-msgstr "Tampilkan anak dengan terstruktur"
+msgstr "Tampilkan hirarki anak"
#. module: account
#: selection:account.payment.term.line,value:0
diff --git a/addons/account/i18n/ko.po b/addons/account/i18n/ko.po
index 9b272d2c28a..bf5699cfb5d 100644
--- a/addons/account/i18n/ko.po
+++ b/addons/account/i18n/ko.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2013-05-14 01:08+0000\n"
-"Last-Translator: AhnJD \n"
+"PO-Revision-Date: 2014-03-12 04:39+0000\n"
+"Last-Translator: Gong HK \n"
"Language-Team: Korean \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:51+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -84,7 +84,7 @@ msgstr "청구서 또는 납부서로부터 가져오기"
#: code:addons/account/account_move_line.py:1210
#, python-format
msgid "Bad Account!"
-msgstr ""
+msgstr "비정상 계정"
#. module: account
#: view:account.move:0
@@ -198,7 +198,7 @@ msgstr "열 라벨"
#. module: account
#: help:account.config.settings,code_digits:0
msgid "No. of digits to use for account code"
-msgstr ""
+msgstr "계좌번호"
#. module: account
#: help:account.analytic.journal,type:0
diff --git a/addons/account/i18n/mn.po b/addons/account/i18n/mn.po
index 879b8d880f7..029628d02db 100644
--- a/addons/account/i18n/mn.po
+++ b/addons/account/i18n/mn.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-14 22:29+0000\n"
-"PO-Revision-Date: 2014-03-06 09:16+0000\n"
+"PO-Revision-Date: 2014-03-11 06:15+0000\n"
"Last-Translator: Jacara \n"
"Language-Team: Mongolian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-07 07:23+0000\n"
-"X-Generator: Launchpad (build 16948)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -6832,7 +6832,7 @@ msgstr "Захиалагчийн буцаалт"
#. module: account
#: field:account.account,foreign_balance:0
msgid "Foreign Balance"
-msgstr "Гадаад бланс"
+msgstr "Валютын баланс"
#. module: account
#: field:account.journal.period,name:0
@@ -9161,7 +9161,7 @@ msgstr "Орлогын толгой данс"
#. module: account
#: field:account.account,adjusted_balance:0
msgid "Adjusted Balance"
-msgstr "Тохируулсан бланс"
+msgstr "Тохируулсан баланс"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_fiscal_position_template_form
@@ -11040,7 +11040,7 @@ msgstr "Дэлгэрэнгүй байхгүй"
#: model:ir.actions.act_window,name:account.action_account_gain_loss
#: model:ir.ui.menu,name:account.menu_unrealized_gains_losses
msgid "Unrealized Gain or Loss"
-msgstr "Тэгшитгэгдээгүй Ашиг эсвэл Алдагдал"
+msgstr "Хэрэгжээгүй ашиг алдагдал"
#. module: account
#: view:account.move:0
diff --git a/addons/account_accountant/i18n/id.po b/addons/account_accountant/i18n/id.po
index 7f45dcd09c5..834bd2d265c 100644
--- a/addons/account_accountant/i18n/id.po
+++ b/addons/account_accountant/i18n/id.po
@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2012-12-21 23:00+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2014-03-11 08:21+0000\n"
+"Last-Translator: williamlsd \n"
"Language-Team: Indonesian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:56+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: account_accountant
#: model:ir.actions.client,name:account_accountant.action_client_account_menu
msgid "Open Accounting Menu"
-msgstr ""
+msgstr "Buka Menu Akunting"
diff --git a/addons/account_asset/i18n/id.po b/addons/account_asset/i18n/id.po
index f45ba33316b..dc1457a9e90 100644
--- a/addons/account_asset/i18n/id.po
+++ b/addons/account_asset/i18n/id.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2012-12-21 23:00+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2014-03-11 08:50+0000\n"
+"Last-Translator: williamlsd \n"
"Language-Team: Indonesian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:57+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: account_asset
#: view:account.asset.asset:0
@@ -27,27 +27,27 @@ msgstr ""
#: field:account.asset.history,method_end:0
#: field:asset.modify,method_end:0
msgid "Ending date"
-msgstr ""
+msgstr "Tanggal akhir"
#. module: account_asset
#: field:account.asset.asset,value_residual:0
msgid "Residual Value"
-msgstr ""
+msgstr "Nilai residual"
#. module: account_asset
#: field:account.asset.category,account_expense_depreciation_id:0
msgid "Depr. Expense Account"
-msgstr ""
+msgstr "Depr Akun Biaya"
#. module: account_asset
#: view:asset.asset.report:0
msgid "Group By..."
-msgstr ""
+msgstr "Dikelompokan berdasarkan ..."
#. module: account_asset
#: field:asset.asset.report,gross_value:0
msgid "Gross Amount"
-msgstr ""
+msgstr "Jumlah Kotor"
#. module: account_asset
#: view:account.asset.asset:0
@@ -58,7 +58,7 @@ msgstr ""
#: field:asset.asset.report,asset_id:0
#: model:ir.model,name:account_asset.model_account_asset_asset
msgid "Asset"
-msgstr ""
+msgstr "Aktiva"
#. module: account_asset
#: help:account.asset.asset,prorata:0
@@ -67,12 +67,14 @@ msgid ""
"Indicates that the first depreciation entry for this asset have to be done "
"from the purchase date instead of the first January"
msgstr ""
+"Mengindikasikan bahwa entri depresiasi pertama untuk aset ini harus "
+"dilakukan dari tanggal pembelian, bukan dari tanggal satu Januari."
#. module: account_asset
#: selection:account.asset.asset,method:0
#: selection:account.asset.category,method:0
msgid "Linear"
-msgstr ""
+msgstr "Linier"
#. module: account_asset
#: field:account.asset.asset,company_id:0
@@ -85,19 +87,19 @@ msgstr "Perusahaan"
#. module: account_asset
#: view:asset.modify:0
msgid "Modify"
-msgstr ""
+msgstr "Ubah"
#. module: account_asset
#: selection:account.asset.asset,state:0
#: view:asset.asset.report:0
#: selection:asset.asset.report,state:0
msgid "Running"
-msgstr ""
+msgstr "Sedang berjalan"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Set to Draft"
-msgstr ""
+msgstr "Atur menjadi draft"
#. module: account_asset
#: view:asset.asset.report:0
@@ -105,24 +107,24 @@ msgstr ""
#: model:ir.model,name:account_asset.model_asset_asset_report
#: model:ir.ui.menu,name:account_asset.menu_action_asset_asset_report
msgid "Assets Analysis"
-msgstr ""
+msgstr "Analisa Aset"
#. module: account_asset
#: field:asset.modify,name:0
msgid "Reason"
-msgstr ""
+msgstr "Alasan"
#. module: account_asset
#: field:account.asset.asset,method_progress_factor:0
#: field:account.asset.category,method_progress_factor:0
msgid "Degressive Factor"
-msgstr ""
+msgstr "Faktor Penurunan Nilai"
#. module: account_asset
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal
msgid "Asset Categories"
-msgstr ""
+msgstr "Kategori Aset"
#. module: account_asset
#: view:account.asset.asset:0
@@ -130,40 +132,40 @@ msgstr ""
#: field:account.move.line,entry_ids:0
#: model:ir.actions.act_window,name:account_asset.act_entries_open
msgid "Entries"
-msgstr ""
+msgstr "Entri"
#. module: account_asset
#: view:account.asset.asset:0
#: field:account.asset.asset,depreciation_line_ids:0
msgid "Depreciation Lines"
-msgstr ""
+msgstr "Baris Depresiasi"
#. module: account_asset
#: help:account.asset.asset,salvage_value:0
msgid "It is the amount you plan to have that you cannot depreciate."
-msgstr ""
+msgstr "Adalah besaran yang anda rencanakan yang tidak dapat di depresiasi."
#. module: account_asset
#: help:account.asset.asset,method_period:0
msgid "The amount of time between two depreciations, in months"
-msgstr ""
+msgstr "Waktu antara dua depresiasi, dalam bulan"
#. module: account_asset
#: field:account.asset.depreciation.line,depreciation_date:0
#: view:asset.asset.report:0
#: field:asset.asset.report,depreciation_date:0
msgid "Depreciation Date"
-msgstr ""
+msgstr "Tanggal Depresiasi"
#. module: account_asset
#: constraint:account.asset.asset:0
msgid "Error ! You cannot create recursive assets."
-msgstr ""
+msgstr "Salah ! Anda tidak dapat membuat aset rekursif"
#. module: account_asset
#: field:asset.asset.report,posted_value:0
msgid "Posted Amount"
-msgstr ""
+msgstr "Jumlah terposting"
#. module: account_asset
#: view:account.asset.asset:0
@@ -173,12 +175,12 @@ msgstr ""
#: model:ir.ui.menu,name:account_asset.menu_finance_assets
#: model:ir.ui.menu,name:account_asset.menu_finance_config_assets
msgid "Assets"
-msgstr ""
+msgstr "Aset"
#. module: account_asset
#: field:account.asset.category,account_depreciation_id:0
msgid "Depreciation Account"
-msgstr ""
+msgstr "Akun Depresiasi"
#. module: account_asset
#: view:account.asset.asset:0
@@ -187,34 +189,34 @@ msgstr ""
#: view:asset.modify:0
#: field:asset.modify,note:0
msgid "Notes"
-msgstr ""
+msgstr "Catatan"
#. module: account_asset
#: field:account.asset.depreciation.line,move_id:0
msgid "Depreciation Entry"
-msgstr ""
+msgstr "Entri Depresiasi"
#. module: account_asset
#: code:addons/account_asset/account_asset.py:82
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "Ada Kesalahan !"
#. module: account_asset
#: view:asset.asset.report:0
#: field:asset.asset.report,nbr:0
msgid "# of Depreciation Lines"
-msgstr ""
+msgstr "# Baris Depresiasi"
#. module: account_asset
#: field:account.asset.asset,method_period:0
msgid "Number of Months in a Period"
-msgstr ""
+msgstr "Jumlah Bulan dalam Satu Periode"
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets in draft state"
-msgstr ""
+msgstr "Aset pada kondisi draft"
#. module: account_asset
#: field:account.asset.asset,method_end:0
@@ -222,37 +224,37 @@ msgstr ""
#: selection:account.asset.category,method_time:0
#: selection:account.asset.history,method_time:0
msgid "Ending Date"
-msgstr ""
+msgstr "Tanggal Akhir"
#. module: account_asset
#: field:account.asset.asset,code:0
msgid "Reference"
-msgstr ""
+msgstr "Referensi"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Account Asset"
-msgstr ""
+msgstr "Akun Aset"
#. module: account_asset
#: model:ir.actions.act_window,name:account_asset.action_asset_depreciation_confirmation_wizard
#: model:ir.ui.menu,name:account_asset.menu_asset_depreciation_confirmation_wizard
msgid "Compute Assets"
-msgstr ""
+msgstr "Hitung Aset"
#. module: account_asset
#: field:account.asset.category,method_period:0
#: field:account.asset.history,method_period:0
#: field:asset.modify,method_period:0
msgid "Period Length"
-msgstr ""
+msgstr "Lama Periode"
#. module: account_asset
#: selection:account.asset.asset,state:0
#: view:asset.asset.report:0
#: selection:asset.asset.report,state:0
msgid "Draft"
-msgstr ""
+msgstr "Draft"
#. module: account_asset
#: view:asset.asset.report:0
@@ -262,24 +264,24 @@ msgstr "Tanggal pembelian aset"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Change Duration"
-msgstr ""
+msgstr "Ubah Durasi"
#. module: account_asset
#: help:account.asset.asset,method_number:0
#: help:account.asset.category,method_number:0
#: help:account.asset.history,method_number:0
msgid "The number of depreciations needed to depreciate your asset"
-msgstr ""
+msgstr "Jumlah depresiasi yang dibutuhkan untuk mendepresiasi aset anda"
#. module: account_asset
#: view:account.asset.category:0
msgid "Analytic Information"
-msgstr ""
+msgstr "Informasi Analitik"
#. module: account_asset
#: field:account.asset.category,account_analytic_id:0
msgid "Analytic account"
-msgstr ""
+msgstr "Akun Analitik"
#. module: account_asset
#: field:account.asset.asset,method:0
@@ -297,24 +299,24 @@ msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,remaining_value:0
msgid "Next Period Depreciation"
-msgstr ""
+msgstr "Periode Depresiasi Berikutnya"
#. module: account_asset
#: help:account.asset.history,method_period:0
msgid "Time in month between two depreciations"
-msgstr ""
+msgstr "Waktu dalam bulan antara dua depresiasi"
#. module: account_asset
#: view:asset.modify:0
#: model:ir.actions.act_window,name:account_asset.action_asset_modify
#: model:ir.model,name:account_asset.model_asset_modify
msgid "Modify Asset"
-msgstr ""
+msgstr "Ubah Aktiva"
#. module: account_asset
#: field:account.asset.asset,salvage_value:0
msgid "Salvage Value"
-msgstr ""
+msgstr "Nilai Likuidasi Aset"
#. module: account_asset
#: field:account.asset.asset,category_id:0
@@ -322,68 +324,68 @@ msgstr ""
#: field:account.invoice.line,asset_category_id:0
#: view:asset.asset.report:0
msgid "Asset Category"
-msgstr ""
+msgstr "Kategori Aktiva"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Assets in closed state"
-msgstr ""
+msgstr "Aktiva pada kondisi tertutup"
#. module: account_asset
#: field:account.asset.asset,parent_id:0
msgid "Parent Asset"
-msgstr ""
+msgstr "Aktiva induk"
#. module: account_asset
#: view:account.asset.history:0
#: model:ir.model,name:account_asset.model_account_asset_history
msgid "Asset history"
-msgstr ""
+msgstr "Histori Aktiva"
#. module: account_asset
#: view:account.asset.category:0
msgid "Search Asset Category"
-msgstr ""
+msgstr "Cari Kategori Aktiva"
#. module: account_asset
#: view:asset.modify:0
msgid "months"
-msgstr ""
+msgstr "bulan"
#. module: account_asset
#: model:ir.model,name:account_asset.model_account_invoice_line
msgid "Invoice Line"
-msgstr ""
+msgstr "Baris Tagihan"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Depreciation Board"
-msgstr ""
+msgstr "Papan Depresiasi"
#. module: account_asset
#: field:asset.asset.report,unposted_value:0
msgid "Unposted Amount"
-msgstr ""
+msgstr "Jumlah Belum Terposting"
#. module: account_asset
#: field:account.asset.asset,method_time:0
#: field:account.asset.category,method_time:0
#: field:account.asset.history,method_time:0
msgid "Time Method"
-msgstr ""
+msgstr "Metode Waktu"
#. module: account_asset
#: view:asset.depreciation.confirmation.wizard:0
#: view:asset.modify:0
msgid "or"
-msgstr ""
+msgstr "atau"
#. module: account_asset
#: field:account.asset.asset,note:0
#: field:account.asset.category,note:0
#: field:account.asset.history,note:0
msgid "Note"
-msgstr ""
+msgstr "Catatan"
#. module: account_asset
#: help:account.asset.history,method_time:0
@@ -394,6 +396,12 @@ msgid ""
"Ending Date: Choose the time between 2 depreciations and the date the "
"depreciations won't go beyond."
msgstr ""
+"Metode yang digunakan untuk menghitung tanggal dan angka pada baris "
+"depresiasi.\n"
+"Angka Depresiasi: Angka tetap dari baris depresiasi dan waktu antara 2 "
+"depresiasi.\n"
+"Tanggal Akhir: Pilih waktu antara 2 depresiasi dimana tanggal depresiasi "
+"tidak melebihinya."
#. module: account_asset
#: help:account.asset.asset,method_time:0
@@ -406,16 +414,22 @@ msgid ""
" * Ending Date: Choose the time between 2 depreciations and the date the "
"depreciations won't go beyond."
msgstr ""
+"Pilih metode untuk digunakan untuk menghitung tanggal dan jumlah baris "
+"depresiasi.\n"
+" * Jumlah Depresiasi: Angkat baris depresiasi tetap dan waktu antara 2 "
+"depresiasi.\n"
+" * Tanggal Akhir: Pilih waktu antara 2 depresiasi dan tanggal depresiasi "
+"tidak boleh melebihinya."
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets in running state"
-msgstr ""
+msgstr "Aktiva pada kondisi berjalan"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Closed"
-msgstr ""
+msgstr "Ditutup"
#. module: account_asset
#: help:account.asset.asset,state:0
@@ -426,43 +440,48 @@ msgid ""
"You can manually close an asset when the depreciation is over. If the last "
"line of depreciation is posted, the asset automatically goes in that status."
msgstr ""
+"Saat aktiva dibuat, statusnya adalah 'Draft'.\n"
+"Jika aktiva di konfirmasi, statusnya menjadi 'Berjalan' dan baris depresiasi "
+"dapat di posting pada pembukuan.\n"
+"Anda dapat menutup secara manual suatu aktiva saat depresiasi sudah "
+"berakhir. Jika baris akhir depresiasi dimasukkan, aktiva otomatis tertutup."
#. module: account_asset
#: field:account.asset.asset,state:0
#: field:asset.asset.report,state:0
msgid "Status"
-msgstr ""
+msgstr "Status"
#. module: account_asset
#: field:account.asset.asset,partner_id:0
#: field:asset.asset.report,partner_id:0
msgid "Partner"
-msgstr ""
+msgstr "Partner"
#. module: account_asset
#: view:asset.asset.report:0
msgid "Posted depreciation lines"
-msgstr ""
+msgstr "Baris depresiasi terposting"
#. module: account_asset
#: field:account.asset.asset,child_ids:0
msgid "Children Assets"
-msgstr ""
+msgstr "Aktiva anak"
#. module: account_asset
#: view:asset.asset.report:0
msgid "Date of depreciation"
-msgstr ""
+msgstr "Tanggal depresiasi"
#. module: account_asset
#: field:account.asset.history,user_id:0
msgid "User"
-msgstr ""
+msgstr "Pengguna"
#. module: account_asset
#: field:account.asset.category,account_asset_id:0
msgid "Asset Account"
-msgstr ""
+msgstr "Akun Aktiva"
#. module: account_asset
#: view:asset.asset.report:0
@@ -473,17 +492,17 @@ msgstr "Filter Tambahan..."
#: view:account.asset.asset:0
#: view:asset.depreciation.confirmation.wizard:0
msgid "Compute"
-msgstr ""
+msgstr "Hitung"
#. module: account_asset
#: view:account.asset.history:0
msgid "Asset History"
-msgstr ""
+msgstr "Histori Aktiva"
#. module: account_asset
#: model:ir.model,name:account_asset.model_asset_depreciation_confirmation_wizard
msgid "asset.depreciation.confirmation.wizard"
-msgstr ""
+msgstr "wizard.konfirmasi.depresiasi.aktiva"
#. module: account_asset
#: field:account.asset.asset,active:0
@@ -493,12 +512,12 @@ msgstr "Aktif"
#. module: account_asset
#: field:account.asset.depreciation.line,parent_state:0
msgid "State of Asset"
-msgstr ""
+msgstr "Status Aktiva"
#. module: account_asset
#: field:account.asset.depreciation.line,name:0
msgid "Depreciation Name"
-msgstr ""
+msgstr "Nama Depresiasi"
#. module: account_asset
#: view:account.asset.asset:0
diff --git a/addons/account_cancel/i18n/id.po b/addons/account_cancel/i18n/id.po
index 637c294a34c..7b29df9011b 100644
--- a/addons/account_cancel/i18n/id.po
+++ b/addons/account_cancel/i18n/id.po
@@ -8,19 +8,19 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2012-12-21 23:00+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2014-03-11 08:23+0000\n"
+"Last-Translator: williamlsd \n"
"Language-Team: Indonesian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-11-21 05:58+0000\n"
-"X-Generator: Launchpad (build 16831)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: account_cancel
#: view:account.invoice:0
msgid "Cancel Invoice"
-msgstr ""
+msgstr "Batalkan Tagihan"
#~ msgid "Cancel"
#~ msgstr "Batal"
diff --git a/addons/stock/i18n/nl.po b/addons/stock/i18n/nl.po
index f68f714f3a6..2fc05f0f3f0 100644
--- a/addons/stock/i18n/nl.po
+++ b/addons/stock/i18n/nl.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2014-03-04 13:05+0000\n"
+"PO-Revision-Date: 2014-03-11 17:54+0000\n"
"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n"
"Language-Team: Dutch \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-05 05:57+0000\n"
-"X-Generator: Launchpad (build 16948)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:25+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -2430,7 +2430,8 @@ msgstr "Bedrag"
#: field:stock.config.settings,module_stock_invoice_directly:0
msgid "Create and open the invoice when the user finish a delivery order"
msgstr ""
-"Maak en open de factuur wanneer de gebruiker klaar is met de uitgaande order"
+"Maak en open de factuur wanneer de gebruiker klaar is met de uitgaande "
+"levering"
#. module: stock
#: model:ir.model,name:stock.model_stock_return_picking_memory
diff --git a/addons/stock/i18n/zh_TW.po b/addons/stock/i18n/zh_TW.po
index 3c305085902..d8117d175fa 100644
--- a/addons/stock/i18n/zh_TW.po
+++ b/addons/stock/i18n/zh_TW.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2014-02-14 11:58+0000\n"
+"PO-Revision-Date: 2014-03-11 08:04+0000\n"
"Last-Translator: Andy Cheng \n"
"Language-Team: Chinese (Traditional) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-15 07:37+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2014-03-12 05:26+0000\n"
+"X-Generator: Launchpad (build 16963)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -3323,6 +3323,13 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 點擊增加一個追蹤號碼。\n"
+"
\n"
+" 這是您所有的包裹清單。當您選擇一個「包裹」,\n"
+" 即可讀取這個包裹內含產品的上下游追溯資料。\n"
+"
\n"
+" "
#. module: stock
#: code:addons/stock/stock.py:2545
@@ -3406,7 +3413,7 @@ msgstr "已排程"
#. module: stock
#: view:stock.picking:0
msgid "Add an internal note..."
-msgstr ""
+msgstr "增加一個內部備註"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_warehouse_form
@@ -3417,26 +3424,26 @@ msgstr "倉庫"
#. module: stock
#: field:stock.journal,user_id:0
msgid "Responsible"
-msgstr ""
+msgstr "負責人"
#. module: stock
#: view:stock.move:0
msgid "Process Entirely"
-msgstr ""
+msgstr "全部處理"
#. module: stock
#: help:product.template,property_stock_procurement:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated by procurements."
-msgstr ""
+msgstr "此倉位將會替代預設倉位,用在因採購而產生的庫存調動的來源倉位。"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_inventory_report
#: model:ir.ui.menu,name:stock.menu_action_stock_inventory_report
#: view:report.stock.inventory:0
msgid "Inventory Analysis"
-msgstr ""
+msgstr "庫存分析"
#. module: stock
#: field:stock.invoice.onshipping,journal_id:0
@@ -3453,7 +3460,7 @@ msgstr "庫存"
#: code:addons/stock/wizard/stock_return_picking.py:226
#, python-format
msgid "Returned Picking"
-msgstr ""
+msgstr "退貨提貨"
#. module: stock
#: model:ir.model,name:stock.model_product_product
@@ -3503,33 +3510,33 @@ msgstr ""
#. module: stock
#: view:stock.return.picking:0
msgid "Return"
-msgstr ""
+msgstr "退貨"
#. module: stock
#: field:stock.return.picking,invoice_state:0
msgid "Invoicing"
-msgstr ""
+msgstr "發票開立"
#. module: stock
#: view:stock.picking:0
msgid "Assigned Internal Moves"
-msgstr ""
+msgstr "指定的內部調動"
#. module: stock
#: code:addons/stock/stock.py:804
#, python-format
msgid "You cannot process picking without stock moves."
-msgstr ""
+msgstr "沒有庫存調動,您不能進行提貨。"
#. module: stock
#: field:stock.production.lot,move_ids:0
msgid "Moves for this serial number"
-msgstr ""
+msgstr "該序號的庫存調動"
#. module: stock
#: field:stock.move,product_uos:0
msgid "Product UOS"
-msgstr ""
+msgstr "貨品銷售計量單位"
#. module: stock
#: field:stock.location,posz:0
@@ -3561,7 +3568,7 @@ msgstr "走廊 (X)"
#. module: stock
#: field:stock.config.settings,group_stock_packaging:0
msgid "Allow to define several packaging methods on products"
-msgstr ""
+msgstr "允許產品定義多種包裝方式"
#. module: stock
#: model:stock.location,name:stock.stock_location_7
@@ -3584,12 +3591,12 @@ msgstr "各分類產品"
#: selection:stock.picking.in,state:0
#: selection:stock.picking.out,state:0
msgid "Waiting Another Operation"
-msgstr ""
+msgstr "正在等待其它作業"
#. module: stock
#: view:stock.location:0
msgid "Supplier Locations"
-msgstr ""
+msgstr "供應商倉位"
#. module: stock
#: field:stock.partial.move.line,wizard_id:0
@@ -3601,7 +3608,7 @@ msgstr "精靈"
#. module: stock
#: view:report.stock.move:0
msgid "Completed Stock-Moves"
-msgstr ""
+msgstr "已完成的庫存調動"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_stock_location_product
@@ -3612,7 +3619,7 @@ msgstr "各地點產品"
#. module: stock
#: view:stock.config.settings:0
msgid "Logistic"
-msgstr ""
+msgstr "物流"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_location_form
@@ -3656,7 +3663,7 @@ msgstr "貨架 1"
#. module: stock
#: field:stock.tracking,name:0
msgid "Pack Reference"
-msgstr ""
+msgstr "包裹編號"
#. module: stock
#: view:report.stock.move:0
@@ -3670,12 +3677,12 @@ msgstr "來源地點"
#. module: stock
#: view:product.template:0
msgid "Accounting Entries"
-msgstr ""
+msgstr "會計分錄"
#. module: stock
#: model:res.groups,name:stock.group_stock_manager
msgid "Manager"
-msgstr ""
+msgstr "主管"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:192
@@ -3689,17 +3696,17 @@ msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_intermediatelocation0
msgid "Internal Shippings"
-msgstr ""
+msgstr "內部運送"
#. module: stock
#: field:stock.change.standard.price,enable_stock_in_out_acc:0
msgid "Enable Related Account"
-msgstr ""
+msgstr "啟動相關科目"
#. module: stock
#: field:stock.location.product,type:0
msgid "Analyse Type"
-msgstr ""
+msgstr "分析類型"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_picking_tree4
@@ -3731,7 +3738,7 @@ msgstr "一次過"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_open
msgid "Inventory Move"
-msgstr ""
+msgstr "存貨調動"
#. module: stock
#: code:addons/stock/product.py:476
@@ -3764,35 +3771,35 @@ msgstr ""
#: model:ir.actions.act_window,name:stock.action_stock_config_settings
#: view:stock.config.settings:0
msgid "Configure Warehouse"
-msgstr ""
+msgstr "倉庫設定"
#. module: stock
#: view:stock.picking:0
#: view:stock.picking.in:0
msgid "To Invoice"
-msgstr ""
+msgstr "待開發票"
#. module: stock
#: view:stock.return.picking:0
msgid "Return lines"
-msgstr ""
+msgstr "退貨明細"
#. module: stock
#: view:stock.inventory:0
msgid "Search Inventory"
-msgstr ""
+msgstr "搜尋庫存"
#. module: stock
#: model:ir.model,name:stock.model_report_stock_lines_date
#: view:report.stock.lines.date:0
msgid "Dates of Inventories"
-msgstr ""
+msgstr "盤點日期"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_receive_move
#: view:product.product:0
msgid "Receptions"
-msgstr ""
+msgstr "接收"
#. module: stock
#: view:report.stock.move:0
@@ -3802,7 +3809,7 @@ msgstr "總內送量"
#. module: stock
#: field:report.stock.move,product_qty_out:0
msgid "Out Qty"
-msgstr ""
+msgstr "出貨數量"
#. module: stock
#: view:report.stock.inventory:0
@@ -3827,7 +3834,7 @@ msgstr "公司"
#: field:stock.move.consume,product_uom:0
#: field:stock.move.scrap,product_uom:0
msgid "Product Unit of Measure"
-msgstr ""
+msgstr "產品度量單位"
#. module: stock
#: view:stock.move:0
From 6c96d110ab1ad4e29aa24bb43264c2571d85b5ea Mon Sep 17 00:00:00 2001
From: "Somesh Khare (OpenERP)"
Date: Wed, 12 Mar 2014 11:15:35 +0530
Subject: [PATCH 50/53] [FIX]audittrail:on deletion of record from one2many and
saving the parent form error raised as list index out of range (Ref: Case
604750)
bzr revid: skh@openerp.com-20140312054535-kjlqltscnojb7lce
---
addons/audittrail/audittrail.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py
index 63b505e0007..b68a8e201c6 100644
--- a/addons/audittrail/audittrail.py
+++ b/addons/audittrail/audittrail.py
@@ -466,14 +466,12 @@ class audittrail_objects_proxy(object_proxy):
# if at least one modification has been found
for model_id, resource_id in lines:
line_model = pool.get('ir.model').browse(cr, SUPERUSER_ID, model_id).model
- name = pool.get(line_model).name_get(cr, uid, [resource_id])[0][1]
vals = {
'method': method,
'object_id': model_id,
'user_id': uid,
'res_id': resource_id,
- 'name': name,
}
if (model_id, resource_id) not in old_values and method not in ('copy', 'read'):
# the resource was not existing so we are forcing the method to 'create'
@@ -484,7 +482,11 @@ class audittrail_objects_proxy(object_proxy):
# the resource is not existing anymore so we are forcing the method to 'unlink'
# (because it could also come with the value 'write' if we are deleting the
# record through a one2many field)
+ name = old_values[(model_id, resource_id)]['value'].get('name',False)
vals.update({'method': 'unlink'})
+ else :
+ name = pool[line_model].name_get(cr, uid, [resource_id])[0][1]
+ vals.update({'name': name})
# create the audittrail log in super admin mode, only if a change has been detected
if lines[(model_id, resource_id)]:
log_id = pool.get('audittrail.log').create(cr, SUPERUSER_ID, vals)
From e9228e2c5a16c3adfb5392d8d8a0469e3814c43b Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Wed, 12 Mar 2014 12:03:03 +0100
Subject: [PATCH 51/53] [FIX] account_check_writing: set the amount_in_word
even if the check is not created through the voucher form (for example, for
checks created through pay wizard of invoices)
bzr revid: dle@openerp.com-20140312110303-x82juu3i2nox3u3j
---
.../account_check_writing/account_voucher.py | 47 ++++++++++++-------
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/addons/account_check_writing/account_voucher.py b/addons/account_check_writing/account_voucher.py
index f7b35dccacc..6e47139c626 100644
--- a/addons/account_check_writing/account_voucher.py
+++ b/addons/account_check_writing/account_voucher.py
@@ -41,6 +41,23 @@ class account_voucher(osv.osv):
'number': fields.char('Number', size=32),
}
+ def _amount_to_text(self, cr, uid, amount, currency_id, context=None):
+ # Currency complete name is not available in res.currency model
+ # Exceptions done here (EUR, USD, BRL) cover 75% of cases
+ # For other currencies, display the currency code
+ currency = self.pool['res.currency'].browse(cr, uid, currency_id, context=context)
+ if currency.name.upper() == 'EUR':
+ currency_name = 'Euro'
+ elif currency.name.upper() == 'USD':
+ currency_name = 'Dollars'
+ elif currency.name.upper() == 'BRL':
+ currency_name = 'reais'
+ else:
+ currency_name = currency.name
+ #TODO : generic amount_to_text is not ready yet, otherwise language (and country) and currency can be passed
+ #amount_in_word = amount_to_text(amount, context=context)
+ return amount_to_text(amount, currency=currency_name)
+
def onchange_amount(self, cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, payment_rate_currency_id, company_id, context=None):
""" Inherited - add amount_in_word and allow_check_writting in returned value dictionary """
if not context:
@@ -48,22 +65,7 @@ class account_voucher(osv.osv):
default = super(account_voucher, self).onchange_amount(cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, payment_rate_currency_id, company_id, context=context)
if 'value' in default:
amount = 'amount' in default['value'] and default['value']['amount'] or amount
-
- # Currency complete name is not available in res.currency model
- # Exceptions done here (EUR, USD, BRL) cover 75% of cases
- # For other currencies, display the currency code
- currency = self.pool['res.currency'].browse(cr, uid, currency_id, context=context)
- if currency.name.upper() == 'EUR':
- currency_name = 'Euro'
- elif currency.name.upper() == 'USD':
- currency_name = 'Dollars'
- elif currency.name.upper() == 'BRL':
- currency_name = 'reais'
- else:
- currency_name = currency.name
- #TODO : generic amount_to_text is not ready yet, otherwise language (and country) and currency can be passed
- #amount_in_word = amount_to_text(amount, context=context)
- amount_in_word = amount_to_text(amount, currency=currency_name)
+ amount_in_word = self._amount_to_text(cr, uid, amount, currency_id, context=context)
default['value'].update({'amount_in_word':amount_in_word})
if journal_id:
allow_check_writing = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context).allow_check_writing
@@ -92,6 +94,19 @@ class account_voucher(osv.osv):
},
'nodestroy': True
}
+ def create(self, cr, uid, vals, context=None):
+ if vals.get('amount') and vals.get('journal_id') and 'amount_in_word' not in vals:
+ vals['amount_in_word'] = self._amount_to_text(cr, uid, vals['amount'], vals.get('currency_id') or \
+ self.pool['account.journal'].browse(cr, uid, vals['journal_id'], context=context).currency.id or \
+ self.pool['res.company'].browse(cr, uid, vals['company_id']).currency_id.id, context=context)
+ return super(account_voucher, self).create(cr, uid, vals, context=context)
+
+ def write(self, cr, uid, ids, vals, context=None):
+ if vals.get('amount') and vals.get('journal_id') and 'amount_in_word' not in vals:
+ vals['amount_in_word'] = self._amount_to_text(cr, uid, vals['amount'], vals.get('currency_id') or \
+ self.pool['account.journal'].browse(cr, uid, vals['journal_id'], context=context).currency.id or \
+ self.pool['res.company'].browse(cr, uid, vals['company_id']).currency_id.id, context=context)
+ return super(account_voucher, self).write(cr, uid, ids, vals, context=context)
def fields_view_get(self, cr, uid, view_id=None, view_type=False, context=None, toolbar=False, submenu=False):
"""
From 1a5d2e77c48c3f923bbbc44cd97b2fef341709d7 Mon Sep 17 00:00:00 2001
From: Denis Ledoux
Date: Wed, 12 Mar 2014 13:09:04 +0100
Subject: [PATCH 52/53] [FIX] account: using float_round instead of native
python round method, to apply half-up tie-breaking rule (1.655 with precision
2 is now 1.66 instead of 1.65).
bzr revid: dle@openerp.com-20140312120904-ucixsl1szfi1q0ea
---
addons/account/account.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/account/account.py b/addons/account/account.py
index 4ccdac59ee8..c45c337f019 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -30,7 +30,7 @@ from openerp import SUPERUSER_ID
from openerp import pooler, tools
from openerp.osv import fields, osv, expression
from openerp.tools.translate import _
-from openerp.tools.float_utils import float_round
+from openerp.tools.float_utils import float_round as round
import openerp.addons.decimal_precision as dp
@@ -2155,7 +2155,7 @@ class account_tax(osv.osv):
tax_compute_precision = precision
if taxes and taxes[0].company_id.tax_calculation_rounding_method == 'round_globally':
tax_compute_precision += 5
- totalin = totalex = float_round(price_unit * quantity, precision)
+ totalin = totalex = round(price_unit * quantity, precision)
tin = []
tex = []
for tax in taxes:
From 6ab74d0d8db3bc72940d25c95db84d05fc5e55fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Najla=C3=A2?=
Date: Wed, 12 Mar 2014 14:05:22 +0100
Subject: [PATCH 53/53] [FIX] account: change decimal precision to avoid
erasing tax and base values when updating a tax with coefficients on more
than 2 decimals
bzr revid: nel@tinyerp.com-20140312130522-qr5e010onc7ejrz5
---
addons/account/account.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/addons/account/account.py b/addons/account/account.py
index c45c337f019..2910d3d64a1 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -1949,15 +1949,15 @@ class account_tax(osv.osv):
#
'base_code_id': fields.many2one('account.tax.code', 'Account Base Code', help="Use this code for the tax declaration."),
'tax_code_id': fields.many2one('account.tax.code', 'Account Tax Code', help="Use this code for the tax declaration."),
- 'base_sign': fields.float('Base Code Sign', help="Usually 1 or -1."),
- 'tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."),
+ 'base_sign': fields.float('Base Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()),
+ 'tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()),
# Same fields for refund invoices
'ref_base_code_id': fields.many2one('account.tax.code', 'Refund Base Code', help="Use this code for the tax declaration."),
'ref_tax_code_id': fields.many2one('account.tax.code', 'Refund Tax Code', help="Use this code for the tax declaration."),
- 'ref_base_sign': fields.float('Base Code Sign', help="Usually 1 or -1."),
- 'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."),
+ 'ref_base_sign': fields.float('Base Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()),
+ 'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()),
'include_base_amount': fields.boolean('Included in base amount', help="Indicates if the amount of tax must be included in the base amount for the computation of the next taxes"),
'company_id': fields.many2one('res.company', 'Company', required=True),
'description': fields.char('Tax Code'),