[Merge] Merge with main server.
bzr revid: mdi@tinyerp.com-20121122043710-9e002b2o0oc7semk bzr revid: mdi@tinyerp.com-20121123044245-djsn1r0i031sosu0 bzr revid: mdi@tinyerp.com-20121126044756-nisc5ofd1gp2ggpu
This commit is contained in:
+5710
-5796
File diff suppressed because it is too large
Load Diff
+5753
-5812
File diff suppressed because it is too large
Load Diff
+5710
-5796
File diff suppressed because it is too large
Load Diff
+6903
-6124
File diff suppressed because it is too large
Load Diff
+4942
-5069
File diff suppressed because it is too large
Load Diff
+6656
-6051
File diff suppressed because it is too large
Load Diff
+5798
-5819
File diff suppressed because it is too large
Load Diff
+6947
-6145
File diff suppressed because it is too large
Load Diff
+7413
-6238
File diff suppressed because it is too large
Load Diff
+5912
-5855
File diff suppressed because it is too large
Load Diff
+12242
-8491
File diff suppressed because it is too large
Load Diff
+6542
-6026
File diff suppressed because it is too large
Load Diff
+8534
-6808
File diff suppressed because it is too large
Load Diff
+10851
-7653
File diff suppressed because it is too large
Load Diff
+6256
-5970
File diff suppressed because it is too large
Load Diff
+7028
-6178
File diff suppressed because it is too large
Load Diff
+13954
-9362
File diff suppressed because it is too large
Load Diff
+7950
-6483
File diff suppressed because it is too large
Load Diff
+5719
-5798
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+6341
-5970
File diff suppressed because it is too large
Load Diff
+5710
-5796
File diff suppressed because it is too large
Load Diff
+6481
-6004
File diff suppressed because it is too large
Load Diff
+5710
-5796
File diff suppressed because it is too large
Load Diff
+7323
-6203
File diff suppressed because it is too large
Load Diff
+11036
-7945
File diff suppressed because it is too large
Load Diff
+6948
-6146
File diff suppressed because it is too large
Load Diff
+6069
-5888
File diff suppressed because it is too large
Load Diff
+6174
-5938
File diff suppressed because it is too large
Load Diff
+7059
-6162
File diff suppressed because it is too large
Load Diff
+7757
-6309
File diff suppressed because it is too large
Load Diff
+5710
-5796
File diff suppressed because it is too large
Load Diff
+5740
-5804
File diff suppressed because it is too large
Load Diff
+5984
-5860
File diff suppressed because it is too large
Load Diff
+7082
-6188
File diff suppressed because it is too large
Load Diff
+13000
-8478
File diff suppressed because it is too large
Load Diff
+10349
-7629
File diff suppressed because it is too large
Load Diff
+5906
-5859
File diff suppressed because it is too large
Load Diff
+6317
-5929
File diff suppressed because it is too large
Load Diff
+6020
-5863
File diff suppressed because it is too large
Load Diff
+6568
-6031
File diff suppressed because it is too large
Load Diff
+5869
-5843
File diff suppressed because it is too large
Load Diff
+12407
-8439
File diff suppressed because it is too large
Load Diff
+6482
-6013
File diff suppressed because it is too large
Load Diff
+8357
-6579
File diff suppressed because it is too large
Load Diff
+5755
-5804
File diff suppressed because it is too large
Load Diff
+6855
-6114
File diff suppressed because it is too large
Load Diff
+7883
-6413
File diff suppressed because it is too large
Load Diff
+9752
-7267
File diff suppressed because it is too large
Load Diff
+13878
-9292
File diff suppressed because it is too large
Load Diff
+13095
-8883
File diff suppressed because it is too large
Load Diff
+6799
-6081
File diff suppressed because it is too large
Load Diff
+6988
-6142
File diff suppressed because it is too large
Load Diff
+5713
-5795
File diff suppressed because it is too large
Load Diff
+6655
-6052
File diff suppressed because it is too large
Load Diff
+10513
-7534
File diff suppressed because it is too large
Load Diff
+8304
-6698
File diff suppressed because it is too large
Load Diff
+5712
-5798
File diff suppressed because it is too large
Load Diff
+5710
-5796
File diff suppressed because it is too large
Load Diff
+7496
-6244
File diff suppressed because it is too large
Load Diff
+6210
-5943
File diff suppressed because it is too large
Load Diff
+5710
-5796
File diff suppressed because it is too large
Load Diff
+6256
-5931
File diff suppressed because it is too large
Load Diff
+9945
-6840
File diff suppressed because it is too large
Load Diff
+5796
-5831
File diff suppressed because it is too large
Load Diff
+6544
-5998
File diff suppressed because it is too large
Load Diff
@@ -73,7 +73,15 @@ class base_language_export(osv.osv_memory):
|
||||
self.write(cr, uid, ids, {'state': 'get',
|
||||
'data': out,
|
||||
'name':this.name}, context=context)
|
||||
return True
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'base.language.export',
|
||||
'view_mode': 'form',
|
||||
'view_type': 'form',
|
||||
'res_id': this.id,
|
||||
'views': [(False, 'form')],
|
||||
'target': 'new',
|
||||
}
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -127,7 +127,7 @@ class res_currency(osv.osv):
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
reads = self.read(cr, uid, ids, ['name','symbol'], context=context, load='_classic_write')
|
||||
return [(x['id'], tools.ustr(x['name']) + (x['symbol'] and (' (' + tools.ustr(x['symbol']) + ')') or '')) for x in reads]
|
||||
return [(x['id'], tools.ustr(x['name'])) for x in reads]
|
||||
|
||||
def round(self, cr, uid, currency, amount):
|
||||
"""Return ``amount`` rounded according to ``currency``'s
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<menuitem name="Sales"
|
||||
id="menu_base_partner"
|
||||
groups="base.group_sale_salesman"
|
||||
sequence="30"/>
|
||||
sequence="20"/>
|
||||
|
||||
<menuitem id="base.menu_sales" parent="base.menu_base_partner" name="Sales" sequence="1" />
|
||||
<menuitem id="menu_base_config" parent="menu_base_partner" name="Configuration" sequence="30" groups="group_system"/>
|
||||
|
||||
@@ -398,7 +398,7 @@ class res_users(osv.osv):
|
||||
# prevent/delay login in that case. It will also have been logged
|
||||
# as a SQL error, if anyone cares.
|
||||
try:
|
||||
cr.execute("SELECT id FROM res_users WHERE id=%s FOR UPDATE NOWAIT", (user_id,), log_exception=False)
|
||||
cr.execute("SELECT id FROM res_users WHERE id=%s FOR UPDATE NOWAIT", (user_id,), log_exceptions=False)
|
||||
cr.execute("UPDATE res_users SET login_date = now() AT TIME ZONE 'UTC' WHERE id=%s", (user_id,))
|
||||
except Exception:
|
||||
_logger.debug("Failed to update last_login for db:%s login:%s", db, login, exc_info=True)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import test_base, test_expression, test_ir_values
|
||||
import test_base, test_expression, test_search, test_ir_values
|
||||
|
||||
checks = [
|
||||
test_base,
|
||||
test_expression,
|
||||
test_search,
|
||||
test_ir_values,
|
||||
]
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
import unittest2
|
||||
|
||||
import openerp.tests.common as common
|
||||
|
||||
class test_expression(common.TransactionCase):
|
||||
|
||||
def test_search_order(self):
|
||||
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
|
||||
# Create 6 partners with a given name, and a given creation order to
|
||||
# ensure the order of their ID. Some are set as unactive to verify they
|
||||
# are by default excluded from the searches and to provide a second
|
||||
# `order` argument.
|
||||
|
||||
partners = registry('res.partner')
|
||||
c = partners.create(cr, uid, {'name': 'test_search_order_C'})
|
||||
d = partners.create(cr, uid, {'name': 'test_search_order_D', 'active': False})
|
||||
a = partners.create(cr, uid, {'name': 'test_search_order_A'})
|
||||
b = partners.create(cr, uid, {'name': 'test_search_order_B'})
|
||||
ab = partners.create(cr, uid, {'name': 'test_search_order_AB'})
|
||||
e = partners.create(cr, uid, {'name': 'test_search_order_E', 'active': False})
|
||||
|
||||
# The tests.
|
||||
|
||||
# The basic searches should exclude records that have active = False.
|
||||
# The order of the returned ids should be given by the `order`
|
||||
# parameter of search().
|
||||
|
||||
name_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="name asc")
|
||||
self.assertEqual([a, ab, b, c], name_asc, "Search with 'NAME ASC' order failed.")
|
||||
name_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="name desc")
|
||||
self.assertEqual([c, b, ab, a], name_desc, "Search with 'NAME DESC' order failed.")
|
||||
id_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="id asc")
|
||||
self.assertEqual([c, a, b, ab], id_asc, "Search with 'ID ASC' order failed.")
|
||||
id_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="id desc")
|
||||
self.assertEqual([ab, b, a, c], id_desc, "Search with 'ID DESC' order failed.")
|
||||
|
||||
# The inactive records shouldn't be excluded as soon as a condition on
|
||||
# that field is present in the domain. The `order` parameter of
|
||||
# search() should support any legal coma-separated values.
|
||||
|
||||
active_asc_id_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active asc, id asc")
|
||||
self.assertEqual([d, e, c, a, b, ab], active_asc_id_asc, "Search with 'ACTIVE ASC, ID ASC' order failed.")
|
||||
active_desc_id_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active desc, id asc")
|
||||
self.assertEqual([c, a, b, ab, d, e], active_desc_id_asc, "Search with 'ACTIVE DESC, ID ASC' order failed.")
|
||||
active_asc_id_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active asc, id desc")
|
||||
self.assertEqual([e, d, ab, b, a, c], active_asc_id_desc, "Search with 'ACTIVE ASC, ID DESC' order failed.")
|
||||
active_desc_id_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active desc, id desc")
|
||||
self.assertEqual([ab, b, a, c, e, d], active_desc_id_desc, "Search with 'ACTIVE DESC, ID DESC' order failed.")
|
||||
id_asc_active_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id asc, active asc")
|
||||
self.assertEqual([c, d, a, b, ab, e], id_asc_active_asc, "Search with 'ID ASC, ACTIVE ASC' order failed.")
|
||||
id_asc_active_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id asc, active desc")
|
||||
self.assertEqual([c, d, a, b, ab, e], id_asc_active_desc, "Search with 'ID ASC, ACTIVE DESC' order failed.")
|
||||
id_desc_active_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id desc, active asc")
|
||||
self.assertEqual([e, ab, b, a, d, c], id_desc_active_asc, "Search with 'ID DESC, ACTIVE ASC' order failed.")
|
||||
id_desc_active_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id desc, active desc")
|
||||
self.assertEqual([e, ab, b, a, d, c], id_desc_active_desc, "Search with 'ID DESC, ACTIVE DESC' order failed.")
|
||||
|
||||
|
||||
+1
-1
@@ -4722,7 +4722,7 @@ class BaseModel(object):
|
||||
order_direction = order_split[1].strip() if len(order_split) == 2 else ''
|
||||
inner_clause = None
|
||||
if order_field == 'id':
|
||||
order_by_clause = '"%s"."%s"' % (self._table, order_field)
|
||||
order_by_elements.append('"%s"."id" %s' % (self._table, order_direction))
|
||||
elif order_field in self._columns:
|
||||
order_column = self._columns[order_field]
|
||||
if order_column._classic_read:
|
||||
|
||||
@@ -173,6 +173,9 @@ class TestCleaner(unittest2.TestCase):
|
||||
new_html = html_email_clean(TEXT_TPL)
|
||||
self.assertNotIn('quote', new_html, 'html_email_cleaner did not remove correctly plaintext quotes')
|
||||
|
||||
# Test5: False boolean for text must return empty string
|
||||
new_html = html_email_clean(False)
|
||||
self.assertEqual(new_html, False, 'html_email_cleaner did change a False in an other value.')
|
||||
|
||||
class TestHtmlTools(unittest2.TestCase):
|
||||
""" Test some of our generic utility functions about html """
|
||||
|
||||
@@ -130,6 +130,9 @@ def html_email_clean(html):
|
||||
dest += source[idx:]
|
||||
return dest
|
||||
|
||||
if not html:
|
||||
return html
|
||||
|
||||
html = ustr(html)
|
||||
|
||||
# 1. <br[ /]> -> \n, because otherwise the tree is obfuscated
|
||||
|
||||
@@ -23,7 +23,6 @@ import codecs
|
||||
import csv
|
||||
import fnmatch
|
||||
import inspect
|
||||
import itertools
|
||||
import locale
|
||||
import os
|
||||
import openerp.pooler as pooler
|
||||
@@ -512,7 +511,7 @@ def trans_parse_rml(de):
|
||||
|
||||
def trans_parse_view(de):
|
||||
res = []
|
||||
if de.text and de.text.strip():
|
||||
if not isinstance(de, SKIPPED_ELEMENT_TYPES) and de.text and de.text.strip():
|
||||
res.append(de.text.strip().encode("utf8"))
|
||||
if de.tail and de.tail.strip():
|
||||
res.append(de.tail.strip().encode("utf8"))
|
||||
@@ -618,7 +617,12 @@ def trans_generate(lang, modules, cr):
|
||||
_to_translate = []
|
||||
def push_translation(module, type, name, id, source, comments=None):
|
||||
tuple = (module, source, name, id, type, comments or [])
|
||||
if source and tuple not in _to_translate:
|
||||
# empty and one-letter terms are ignored, they probably are not meant to be
|
||||
# translated, and would be very hard to translate anyway.
|
||||
if not source or len(source.strip()) <= 1:
|
||||
_logger.debug("Ignoring empty or 1-letter source term: %r", tuple)
|
||||
return
|
||||
if tuple not in _to_translate:
|
||||
_to_translate.append(tuple)
|
||||
|
||||
def encode(s):
|
||||
@@ -841,6 +845,8 @@ def trans_generate(lang, modules, cr):
|
||||
keywords=extract_keywords):
|
||||
push_translation(module, trans_type, display_path, lineno,
|
||||
encode(message), comments + extra_comments)
|
||||
except Exception:
|
||||
_logger.exception("Failed to extract terms from %s", fabsolutepath)
|
||||
finally:
|
||||
src_file.close()
|
||||
|
||||
@@ -856,7 +862,7 @@ def trans_generate(lang, modules, cr):
|
||||
for fname in fnmatch.filter(files, '*.js'):
|
||||
babel_extract_terms(fname, path, root, 'javascript',
|
||||
extra_comments=[WEB_TRANSLATION_COMMENT],
|
||||
extract_keywords={'_t': None})
|
||||
extract_keywords={'_t': None, '_lt': None})
|
||||
# QWeb template files
|
||||
if fnmatch.fnmatch(root, '*/static/src/xml*'):
|
||||
for fname in fnmatch.filter(files, '*.xml'):
|
||||
|
||||
Reference in New Issue
Block a user