summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorxmo-odoo <xmo@odoo.com>2017-04-27 13:59:33 +0200
committerGitHub <noreply@github.com>2017-04-27 13:59:33 +0200
commit2e6a589f417af48e3322955ffff6e94b6d8a24e3 (patch)
treeaa613ecc1f74a9531a03de89aa2bdc7bb32eed3b /addons
parentde4a2216b953abb86094c9bfa5f45b1eaaa79d3d (diff)
[FIX] builtins removed from Python 3
* Reverse wrapper courtesy of @rco-odoo's original P3 branch * thin compat module stripped down from werkzeug (to augment as needed) issue 8530
Diffstat (limited to 'addons')
-rw-r--r--addons/account/models/account.py6
-rw-r--r--addons/account/models/account_bank_statement.py6
-rw-r--r--addons/auth_signup/models/res_partner.py3
-rw-r--r--addons/calendar/models/calendar.py45
-rw-r--r--addons/calendar/tests/test_calendar.py47
-rw-r--r--addons/gamification/models/goal.py5
-rw-r--r--addons/hr_payroll/tests/test_payslip_flow.py4
-rw-r--r--addons/hw_escpos/escpos/escpos.py3
-rw-r--r--addons/l10n_ch/models/mail_template.py3
-rw-r--r--addons/l10n_in_hr_payroll/tests/test_payment_advice.py2
-rw-r--r--addons/mail/models/mail_template.py12
-rw-r--r--addons/mail/models/mail_thread.py3
-rw-r--r--addons/mail/models/res_partner.py11
-rw-r--r--addons/mail/models/res_users.py3
-rw-r--r--addons/mail/wizard/mail_compose_message.py5
-rw-r--r--addons/payment_ogone/models/payment.py2
-rw-r--r--addons/product/models/product.py4
-rw-r--r--addons/product/models/product_template.py3
-rw-r--r--addons/report/models/report.py2
-rw-r--r--addons/report_intrastat/tests/test_report_intrastat.py2
-rw-r--r--addons/resource/tests/test_resource.py10
-rw-r--r--addons/sale/models/account_invoice.py8
-rw-r--r--addons/stock/models/procurement.py5
-rw-r--r--addons/stock/models/product.py7
-rw-r--r--addons/web_editor/models/ir_ui_view.py3
-rw-r--r--addons/website/models/ir_ui_view.py5
-rw-r--r--addons/website/models/website.py9
-rw-r--r--addons/website/tests/test_crawl.py4
28 files changed, 142 insertions, 80 deletions
diff --git a/addons/account/models/account.py b/addons/account/models/account.py
index d9f6b83fb07..a626a410582 100644
--- a/addons/account/models/account.py
+++ b/addons/account/models/account.py
@@ -5,7 +5,7 @@ import math
from odoo.osv import expression
from odoo.tools.float_utils import float_round as round
-from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
+from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, pycompat
from odoo.exceptions import UserError, ValidationError
from odoo import api, fields, models, _
@@ -383,7 +383,7 @@ class AccountJournal(models.Model):
account_code_prefix = company.bank_account_code_prefix or ''
else:
account_code_prefix = company.cash_account_code_prefix or company.bank_account_code_prefix or ''
- for num in xrange(1, 100):
+ for num in pycompat.range(1, 100):
new_code = str(account_code_prefix.ljust(code_digits - 1, '0')) + str(num)
rec = self.env['account.account'].search([('code', '=', new_code), ('company_id', '=', company.id)], limit=1)
if not rec:
@@ -412,7 +412,7 @@ class AccountJournal(models.Model):
if not vals.get('code'):
journal_code_base = (vals['type'] == 'cash' and 'CSH' or 'BNK')
journals = self.env['account.journal'].search([('code', 'like', journal_code_base + '%'), ('company_id', '=', company_id)])
- for num in xrange(1, 100):
+ for num in pycompat.range(1, 100):
# journal_code has a maximal size of 5, hence we can enforce the boundary num < 100
journal_code = journal_code_base + str(num)
if journal_code not in journals.mapped('code'):
diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py
index 1ee32068a00..2d7569f2c56 100644
--- a/addons/account/models/account_bank_statement.py
+++ b/addons/account/models/account_bank_statement.py
@@ -2,7 +2,7 @@
from odoo import api, fields, models, _
from odoo.osv import expression
-from odoo.tools import float_is_zero
+from odoo.tools import float_is_zero, pycompat
from odoo.tools import float_compare, float_round
from odoo.tools.misc import formatLang
from odoo.exceptions import UserError, ValidationError
@@ -874,10 +874,10 @@ class AccountBankStatementLine(models.Model):
for aml_dict in counterpart_aml_dicts:
if aml_dict['move_line'].reconciled:
raise UserError(_('A selected move line was already reconciled.'))
- if isinstance(aml_dict['move_line'], (int, long)):
+ if isinstance(aml_dict['move_line'], pycompat.integer_types):
aml_dict['move_line'] = aml_obj.browse(aml_dict['move_line'])
for aml_dict in (counterpart_aml_dicts + new_aml_dicts):
- if aml_dict.get('tax_ids') and aml_dict['tax_ids'] and isinstance(aml_dict['tax_ids'][0], (int, long)):
+ if aml_dict.get('tax_ids') and isinstance(aml_dict['tax_ids'][0], pycompat.integer_types):
# Transform the value in the format required for One2many and Many2many fields
aml_dict['tax_ids'] = map(lambda id: (4, id, None), aml_dict['tax_ids'])
diff --git a/addons/auth_signup/models/res_partner.py b/addons/auth_signup/models/res_partner.py
index 6dbf14188d8..99e0b98c5ea 100644
--- a/addons/auth_signup/models/res_partner.py
+++ b/addons/auth_signup/models/res_partner.py
@@ -8,6 +8,7 @@ from datetime import datetime, timedelta
from urlparse import urljoin
from odoo import api, fields, models, _
+from odoo.tools import pycompat
class SignupError(Exception):
@@ -16,7 +17,7 @@ class SignupError(Exception):
def random_token():
# the token has an entropy of about 120 bits (6 bits/char * 20 chars)
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
- return ''.join(random.SystemRandom().choice(chars) for i in xrange(20))
+ return ''.join(random.SystemRandom().choice(chars) for _ in pycompat.range(20))
def now(**kwargs):
dt = datetime.now() + timedelta(**kwargs)
diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py
index f4380d12e66..98f5e5c95d9 100644
--- a/addons/calendar/models/calendar.py
+++ b/addons/calendar/models/calendar.py
@@ -17,7 +17,7 @@ import uuid
from odoo import api, fields, models
from odoo import tools
from odoo.tools.translate import _
-from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, pycompat
from odoo.exceptions import UserError, ValidationError
@@ -47,7 +47,7 @@ def calendar_id2real_id(calendar_id=None, with_date=False):
def get_real_ids(ids):
- if isinstance(ids, (basestring, int, long)):
+ if isinstance(ids, (basestring, pycompat.integer_types)):
return calendar_id2real_id(ids)
if isinstance(ids, (list, tuple)):
@@ -62,6 +62,15 @@ def is_calendar_id(record_id):
return len(str(record_id).split('-')) != 1
+SORT_ALIASES = {
+ 'start': 'sort_start',
+ 'start_date': 'sort_start',
+ 'start_datetime': 'sort_start',
+}
+def sort_remap(f):
+ return SORT_ALIASES.get(f, f)
+
+
class Contacts(models.Model):
_name = 'calendar.contacts'
@@ -1062,23 +1071,17 @@ class Meeting(models.Model):
continue
result_data.append(meeting.get_search_fields(order_fields, r_date=r_start_date))
- if order_fields:
- uniq = lambda it: collections.OrderedDict((id(x), x) for x in it).values()
-
- def comparer(left, right):
- for fn, mult in comparers:
- result = cmp(fn(left), fn(right))
- if result:
- return mult * result
- return 0
-
- sort_params = [key.split()[0] if key[-4:].lower() != 'desc' else '-%s' % key.split()[0] for key in (order or self._order).split(',')]
- sort_params = uniq([comp if comp not in ['start', 'start_date', 'start_datetime'] else 'sort_start' for comp in sort_params])
- sort_params = uniq([comp if comp not in ['-start', '-start_date', '-start_datetime'] else '-sort_start' for comp in sort_params])
- comparers = [((itemgetter(col[1:]), -1) if col[0] == '-' else (itemgetter(col), 1)) for col in sort_params]
- ids = [r['id'] for r in sorted(result_data, cmp=comparer)]
-
- return ids
+ # seq of (field, should_reverse)
+ sort_spec = list(tools.unique(
+ (sort_remap(key.split()[0]), key.lower().endswith(' desc'))
+ for key in (order or self._order).split(',')
+ ))
+ def key(record):
+ return [
+ tools.Reverse(record[name]) if desc else record[name]
+ for name, desc in sort_spec
+ ]
+ return [r['id'] for r in sorted(result_data, key=key)]
@api.multi
def _rrule_serialize(self):
@@ -1154,7 +1157,7 @@ class Meeting(models.Model):
data['final_date'] = rule._until and rule._until.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
#repeat weekly
if rule._byweekday:
- for i in xrange(0, 7):
+ for i in pycompat.range(0, 7):
if i in rule._byweekday:
data[day_list[i]] = True
data['rrule_type'] = 'weekly'
@@ -1466,7 +1469,7 @@ class Meeting(models.Model):
for calendar_id, real_id in select:
res = real_data[real_id].copy()
ls = calendar_id2real_id(calendar_id, with_date=res and res.get('duration', 0) > 0 and res.get('duration') or 1)
- if not isinstance(ls, (basestring, int, long)) and len(ls) >= 2:
+ if not isinstance(ls, (basestring, pycompat.integer_types)) and len(ls) >= 2:
res['start'] = ls[1]
res['stop'] = ls[2]
diff --git a/addons/calendar/tests/test_calendar.py b/addons/calendar/tests/test_calendar.py
index 3604352ace5..0b986f18bb3 100644
--- a/addons/calendar/tests/test_calendar.py
+++ b/addons/calendar/tests/test_calendar.py
@@ -97,3 +97,50 @@ class TestCalendar(TransactionCase):
self.assertEqual(calendar_event_sprint_review.month_by, 'day', 'rrule_type should be mothly')
self.assertEqual(calendar_event_sprint_review.byday, '1', 'rrule_type should be mothly')
self.assertEqual(calendar_event_sprint_review.week_list, 'MO', 'rrule_type should be mothly')
+
+ def test_event_order(self):
+ """ check the ordering of events when searching """
+ def create_event(name, date):
+ return self.CalendarEvent.create({
+ 'name': name,
+ 'start': date + ' 12:00:00',
+ 'stop': date + ' 14:00:00',
+ 'duration': 2.0,
+ })
+ foo1 = create_event('foo', '2011-04-01')
+ foo2 = create_event('foo', '2011-06-01')
+ bar1 = create_event('bar', '2011-05-01')
+ bar2 = create_event('bar', '2011-06-01')
+ domain = [('id', 'in', (foo1 + foo2 + bar1 + bar2).ids)]
+
+ # sort them by name only
+ events = self.CalendarEvent.search(domain, order='name')
+ self.assertEqual(events.mapped('name'), ['bar', 'bar', 'foo', 'foo'])
+ events = self.CalendarEvent.search(domain, order='name desc')
+ self.assertEqual(events.mapped('name'), ['foo', 'foo', 'bar', 'bar'])
+
+ # sort them by start date only
+ events = self.CalendarEvent.search(domain, order='start')
+ self.assertEqual(events.mapped('start'), (foo1 + bar1 + foo2 + bar2).mapped('start'))
+ events = self.CalendarEvent.search(domain, order='start desc')
+ self.assertEqual(events.mapped('start'), (foo2 + bar2 + bar1 + foo1).mapped('start'))
+
+ # sort them by name then start date
+ events = self.CalendarEvent.search(domain, order='name asc, start asc')
+ self.assertEqual(list(events), [bar1, bar2, foo1, foo2])
+ events = self.CalendarEvent.search(domain, order='name asc, start desc')
+ self.assertEqual(list(events), [bar2, bar1, foo2, foo1])
+ events = self.CalendarEvent.search(domain, order='name desc, start asc')
+ self.assertEqual(list(events), [foo1, foo2, bar1, bar2])
+ events = self.CalendarEvent.search(domain, order='name desc, start desc')
+ self.assertEqual(list(events), [foo2, foo1, bar2, bar1])
+
+ # sort them by start date then name
+ events = self.CalendarEvent.search(domain, order='start asc, name asc')
+ self.assertEqual(list(events), [foo1, bar1, bar2, foo2])
+ events = self.CalendarEvent.search(domain, order='start asc, name desc')
+ self.assertEqual(list(events), [foo1, bar1, foo2, bar2])
+ events = self.CalendarEvent.search(domain, order='start desc, name asc')
+ self.assertEqual(list(events), [bar2, foo2, bar1, foo1])
+ events = self.CalendarEvent.search(domain, order='start desc, name desc')
+ self.assertEqual(list(events), [foo2, bar2, bar1, foo1])
diff --git a/addons/gamification/models/goal.py b/addons/gamification/models/goal.py
index 1e9975ea97f..5a306ae9a33 100644
--- a/addons/gamification/models/goal.py
+++ b/addons/gamification/models/goal.py
@@ -7,6 +7,7 @@ from datetime import date, datetime, timedelta
from odoo import api, fields, models, _, exceptions
from odoo.osv import expression
+from odoo.tools import pycompat
from odoo.tools.safe_eval import safe_eval
_logger = logging.getLogger(__name__)
@@ -281,7 +282,7 @@ class Goal(models.Model):
safe_eval(code, cxt, mode="exec", nocopy=True)
# the result of the evaluated codeis put in the 'result' local variable, propagated to the context
result = cxt.get('result')
- if result is not None and isinstance(result, (float, int, long)):
+ if result is not None and isinstance(result, (float, pycompat.integer_types)):
goals_to_write.update(goal._get_write_values(result))
else:
_logger.error(
@@ -322,7 +323,7 @@ class Goal(models.Model):
for goal in [g for g in goals if g.id in query_goals]:
for user_value in user_values:
queried_value = field_name in user_value and user_value[field_name] or False
- if isinstance(queried_value, tuple) and len(queried_value) == 2 and isinstance(queried_value[0], (int, long)):
+ if isinstance(queried_value, tuple) and len(queried_value) == 2 and isinstance(queried_value[0], pycompat.integer_types):
queried_value = queried_value[0]
if queried_value == query_goals[goal.id]:
new_value = user_value.get(field_name+'_count', goal.current)
diff --git a/addons/hr_payroll/tests/test_payslip_flow.py b/addons/hr_payroll/tests/test_payslip_flow.py
index 6fa71dbe27f..7ab0fad275a 100644
--- a/addons/hr_payroll/tests/test_payslip_flow.py
+++ b/addons/hr_payroll/tests/test_payslip_flow.py
@@ -74,12 +74,12 @@ class TestPayslipFlow(TestPayslipBase):
# I print the payslip report
data, format = render_report(self.env.cr, self.env.uid, richard_payslip.ids, 'hr_payroll.report_payslip', {}, {})
if config.get('test_report_directory'):
- file(os.path.join(config['test_report_directory'], 'hr_payroll-payslip.'+ format), 'wb+').write(data)
+ open(os.path.join(config['test_report_directory'], 'hr_payroll-payslip.'+ format), 'wb+').write(data)
# I print the payslip details report
data, format = render_report(self.env.cr, self.env.uid, richard_payslip.ids, 'hr_payroll.report_payslipdetails', {}, {})
if config.get('test_report_directory'):
- file(os.path.join(config['test_report_directory'], 'hr_payroll-payslipdetails.'+ format), 'wb+').write(data)
+ open(os.path.join(config['test_report_directory'], 'hr_payroll-payslipdetails.'+ format), 'wb+').write(data)
# I print the contribution register report
context = {'model': 'hr.contribution.register', 'active_ids': [self.ref('hr_payroll.hr_houserent_register')]}
diff --git a/addons/hw_escpos/escpos/escpos.py b/addons/hw_escpos/escpos/escpos.py
index 1299db9a553..994c7769af6 100644
--- a/addons/hw_escpos/escpos/escpos.py
+++ b/addons/hw_escpos/escpos/escpos.py
@@ -168,8 +168,7 @@ class StyleStack:
def to_escpos(self):
""" converts the current style to an escpos command string """
cmd = ''
- ordered_cmds = self.cmds.keys()
- ordered_cmds.sort(lambda x,y: cmp(self.cmds[x]['_order'], self.cmds[y]['_order']))
+ ordered_cmds = sorted(self.cmds.keys(), key=lambda x: self.cmds[x]['_order'])
for style in ordered_cmds:
cmd += self.cmds[style][self.get(style)]
return cmd
diff --git a/addons/l10n_ch/models/mail_template.py b/addons/l10n_ch/models/mail_template.py
index e67968c5ef7..2ae41812b3e 100644
--- a/addons/l10n_ch/models/mail_template.py
+++ b/addons/l10n_ch/models/mail_template.py
@@ -4,6 +4,7 @@
import base64
from odoo import api, models
+from odoo.tools import pycompat
class MailTemplate(models.Model):
@@ -20,7 +21,7 @@ class MailTemplate(models.Model):
rslt = super(MailTemplate, self).generate_email(res_ids, fields)
multi_mode = True
- if isinstance(res_ids, (int, long)):
+ if isinstance(res_ids, pycompat.integer_types):
res_ids = [res_ids]
multi_mode = False
diff --git a/addons/l10n_in_hr_payroll/tests/test_payment_advice.py b/addons/l10n_in_hr_payroll/tests/test_payment_advice.py
index 0d418aae4df..d08c0f58b7a 100644
--- a/addons/l10n_in_hr_payroll/tests/test_payment_advice.py
+++ b/addons/l10n_in_hr_payroll/tests/test_payment_advice.py
@@ -40,4 +40,4 @@ class TestPaymentAdvice(TestPaymentAdviceBase):
# In order to test the PDF report defined on a Payment Advice, we will print a Print Advice Report when NEFT is checked
data, format = render_report(self.env.cr, self.env.uid, payment_advice.ids, 'l10n_in_hr_payroll.report_payrolladvice', {}, {})
if config.get('test_report_directory'):
- file(os.path.join(config['test_report_directory'], 'l10n_in_hr_payroll_summary_report' + format), 'wb+').write(data)
+ open(os.path.join(config['test_report_directory'], 'l10n_in_hr_payroll_summary_report' + format), 'wb+').write(data)
diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py
index 1fc922a0d55..2c989bb7e2e 100644
--- a/addons/mail/models/mail_template.py
+++ b/addons/mail/models/mail_template.py
@@ -7,6 +7,8 @@ import copy
import datetime
import dateutil.relativedelta as relativedelta
import logging
+
+import functools
import lxml
import urlparse
@@ -15,6 +17,7 @@ from urllib import urlencode, quote as quote
from odoo import _, api, fields, models, tools
from odoo import report as odoo_report
from odoo.exceptions import UserError
+from odoo.tools import pycompat
_logger = logging.getLogger(__name__)
@@ -90,10 +93,9 @@ try:
'max': max,
'sum': sum,
'filter': filter,
- 'reduce': reduce,
+ 'reduce': functools.reduce,
'map': map,
'round': round,
- 'cmp': cmp,
# dateutil.relativedelta is an old-style class and cannot be directly
# instanciated wihtin a jinja2 expression, so a lambda "proxy" is
@@ -340,7 +342,7 @@ class MailTemplate(models.Model):
:param int res_ids: list of ids of document records those mails are related to.
"""
multi_mode = True
- if isinstance(res_ids, (int, long)):
+ if isinstance(res_ids, pycompat.integer_types):
multi_mode = False
res_ids = [res_ids]
@@ -385,7 +387,7 @@ class MailTemplate(models.Model):
@api.multi
def get_email_template(self, res_ids):
multi_mode = True
- if isinstance(res_ids, (int, long)):
+ if isinstance(res_ids, pycompat.integer_types):
res_ids = [res_ids]
multi_mode = False
@@ -450,7 +452,7 @@ class MailTemplate(models.Model):
"""
self.ensure_one()
multi_mode = True
- if isinstance(res_ids, (int, long)):
+ if isinstance(res_ids, pycompat.integer_types):
res_ids = [res_ids]
multi_mode = False
if fields is None:
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index e7e61b61f3c..e9197a7292d 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -22,6 +22,7 @@ from lxml import etree
from werkzeug import url_encode
from odoo import _, api, exceptions, fields, models, tools
+from odoo.tools import pycompat
from odoo.tools.safe_eval import safe_eval
@@ -1811,7 +1812,7 @@ class MailThread(models.AbstractModel):
partner_ids.add(partner_id[1])
if isinstance(partner_id, (list, tuple)) and partner_id[0] == 6 and len(partner_id) == 3:
partner_ids |= set(partner_id[2])
- elif isinstance(partner_id, (int, long)):
+ elif isinstance(partner_id, pycompat.integer_types):
partner_ids.add(partner_id)
else:
pass # we do not manage anything else
diff --git a/addons/mail/models/res_partner.py b/addons/mail/models/res_partner.py
index 1f2a30af659..4958c043bb7 100644
--- a/addons/mail/models/res_partner.py
+++ b/addons/mail/models/res_partner.py
@@ -4,6 +4,8 @@
import logging
import threading
+from odoo.tools.misc import split_every
+
from odoo import _, api, fields, models, registry, SUPERUSER_ID
from odoo.osv import expression
@@ -107,9 +109,8 @@ class Partner(models.Model):
@api.model
def _notify_send(self, body, subject, recipients, **mail_values):
emails = self.env['mail.mail']
- recipients_nbr, recipients_max = len(recipients), 50
- email_chunks = [recipients[x:x + recipients_max] for x in xrange(0, len(recipients), recipients_max)]
- for email_chunk in email_chunks:
+ recipients_nbr = len(recipients)
+ for email_chunk in split_every(50, recipients.ids):
# TDE FIXME: missing message parameter. So we will find mail_message_id
# in the mail_values and browse it. It should already be in the
# cache so should not impact performances.
@@ -117,9 +118,9 @@ class Partner(models.Model):
message = self.env['mail.message'].browse(mail_message_id) if mail_message_id else None
if message and message.model and message.res_id and message.model in self.env and hasattr(self.env[message.model], 'message_get_recipient_values'):
tig = self.env[message.model].browse(message.res_id)
- recipient_values = tig.message_get_recipient_values(notif_message=message, recipient_ids=email_chunk.ids)
+ recipient_values = tig.message_get_recipient_values(notif_message=message, recipient_ids=email_chunk)
else:
- recipient_values = self.env['mail.thread'].message_get_recipient_values(notif_message=None, recipient_ids=email_chunk.ids)
+ recipient_values = self.env['mail.thread'].message_get_recipient_values(notif_message=None, recipient_ids=email_chunk)
create_values = {
'body_html': body,
'subject': subject,
diff --git a/addons/mail/models/res_users.py b/addons/mail/models/res_users.py
index a3130c36d44..059e0f521ad 100644
--- a/addons/mail/models/res_users.py
+++ b/addons/mail/models/res_users.py
@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, exceptions, fields, models
+from odoo.tools import pycompat
class Users(models.Model):
@@ -97,7 +98,7 @@ class Users(models.Model):
current_pids.append(partner_id[1])
elif isinstance(partner_id, (list, tuple)) and partner_id[0] == 6 and len(partner_id) == 3:
current_pids.append(partner_id[2])
- elif isinstance(partner_id, (int, long)):
+ elif isinstance(partner_id, pycompat.integer_types):
current_pids.append(partner_id)
if user_pid not in current_pids:
partner_ids.append(user_pid)
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 35114a2542b..92822154ff3 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -5,6 +5,7 @@ import base64
import re
from odoo import _, api, fields, models, SUPERUSER_ID, tools
+from odoo.tools import pycompat
from odoo.tools.safe_eval import safe_eval
@@ -434,7 +435,7 @@ class MailComposer(models.TransientModel):
"""
self.ensure_one()
multi_mode = True
- if isinstance(res_ids, (int, long)):
+ if isinstance(res_ids, pycompat.integer_types):
multi_mode = False
res_ids = [res_ids]
@@ -484,7 +485,7 @@ class MailComposer(models.TransientModel):
""" Call email_template.generate_email(), get fields relevant for
mail.compose.message, transform email_cc and email_to into partner_ids """
multi_mode = True
- if isinstance(res_ids, (int, long)):
+ if isinstance(res_ids, pycompat.integer_types):
multi_mode = False
res_ids = [res_ids]
diff --git a/addons/payment_ogone/models/payment.py b/addons/payment_ogone/models/payment.py
index 770af5f5f2d..7f5a23927f0 100644
--- a/addons/payment_ogone/models/payment.py
+++ b/addons/payment_ogone/models/payment.py
@@ -344,7 +344,7 @@ class PaymentTxOgone(models.Model):
'USERID': account.ogone_userid,
'PSWD': account.ogone_password,
'ORDERID': reference,
- 'AMOUNT': long(self.amount * 100),
+ 'AMOUNT': self.amount * 100,
'CURRENCY': self.currency_id.name,
'OPERATION': 'SAL',
'ECI': 2, # Recurring (from MOTO)
diff --git a/addons/product/models/product.py b/addons/product/models/product.py
index 4b06ea68f9a..9d786281383 100644
--- a/addons/product/models/product.py
+++ b/addons/product/models/product.py
@@ -9,6 +9,8 @@ from odoo.osv import expression
import odoo.addons.decimal_precision as dp
+from odoo.tools import pycompat
+
class ProductCategory(models.Model):
_name = "product.category"
@@ -184,7 +186,7 @@ class ProductProduct(models.Model):
pricelist_name_search = self.env['product.pricelist'].name_search(pricelist_id_or_name, operator='=', limit=1)
if pricelist_name_search:
pricelist = self.env['product.pricelist'].browse([pricelist_name_search[0][0]])
- elif isinstance(pricelist_id_or_name, (int, long)):
+ elif isinstance(pricelist_id_or_name, pycompat.integer_types):
pricelist = self.env['product.pricelist'].browse(pricelist_id_or_name)
if pricelist:
diff --git a/addons/product/models/product_template.py b/addons/product/models/product_template.py
index 0082bbf7793..2aab1114448 100644
--- a/addons/product/models/product_template.py
+++ b/addons/product/models/product_template.py
@@ -8,6 +8,7 @@ import odoo.addons.decimal_precision as dp
from odoo import api, fields, models, tools, _
from odoo.exceptions import ValidationError, except_orm
+from odoo.tools import pycompat
class ProductTemplate(models.Model):
@@ -164,7 +165,7 @@ class ProductTemplate(models.Model):
# Support context pricelists specified as display_name or ID for compatibility
if isinstance(pricelist_id_or_name, basestring):
pricelist = self.env['product.pricelist'].name_search(pricelist_id_or_name, operator='=', limit=1)
- elif isinstance(pricelist_id_or_name, (int, long)):
+ elif isinstance(pricelist_id_or_name, pycompat.integer_types):
pricelist = self.env['product.pricelist'].browse(pricelist_id_or_name)
if pricelist:
diff --git a/addons/report/models/report.py b/addons/report/models/report.py
index 4c72a9d5058..55abb28a638 100644
--- a/addons/report/models/report.py
+++ b/addons/report/models/report.py
@@ -577,7 +577,7 @@ class Report(models.Model):
writer = PdfFileWriter()
streams = [] # We have to close the streams *after* PdfFilWriter's call to write()
for document in documents:
- pdfreport = file(document, 'rb')
+ pdfreport = open(document, 'rb')
streams.append(pdfreport)
reader = PdfFileReader(pdfreport)
for page in range(0, reader.getNumPages()):
diff --git a/addons/report_intrastat/tests/test_report_intrastat.py b/addons/report_intrastat/tests/test_report_intrastat.py
index fdd2b4d8e1f..90d688f922b 100644
--- a/addons/report_intrastat/tests/test_report_intrastat.py
+++ b/addons/report_intrastat/tests/test_report_intrastat.py
@@ -31,4 +31,4 @@ class RepoortIntrastatTest(common.TransactionCase):
def test_00_create_pdf(self):
data, report_format = self.env['ir.actions.report.xml'].render_report(self.invoice.ids, 'report_intrastat.report_intrastatinvoice', {})
if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'report_intrastat-intrastat_report.' + report_format), 'wb+').write(data)
+ open(os.path.join(tools.config['test_report_directory'], 'report_intrastat-intrastat_report.' + report_format), 'wb+').write(data)
diff --git a/addons/resource/tests/test_resource.py b/addons/resource/tests/test_resource.py
index 3a545f5feef..37e1d46fee7 100644
--- a/addons/resource/tests/test_resource.py
+++ b/addons/resource/tests/test_resource.py
@@ -4,6 +4,8 @@
import babel.dates
from datetime import datetime, timedelta, date, time
+
+from dateutil import rrule
from dateutil.relativedelta import relativedelta
from odoo.fields import Date, Datetime
@@ -349,13 +351,7 @@ class TestWorkDays(TestResourceCommon):
]
})
- self._days = [
- date.fromordinal(o)
- for o in xrange(
- WAR_START.toordinal(),
- WAR_END.toordinal() + 1
- )
- ]
+ self._days = [dt.date() for dt in rrule.rrule(rrule.DAILY, dtstart=WAR_START, until=WAR_END)]
def test_trivial_calendar_no_leaves(self):
""" If leaves are not involved, only calendar attendances (basic
diff --git a/addons/sale/models/account_invoice.py b/addons/sale/models/account_invoice.py
index 713308aa7a1..3d61900129d 100644
--- a/addons/sale/models/account_invoice.py
+++ b/addons/sale/models/account_invoice.py
@@ -56,11 +56,11 @@ class AccountInvoice(models.Model):
def _refund_cleanup_lines(self, lines):
result = super(AccountInvoice, self)._refund_cleanup_lines(lines)
if self.env.context.get('mode') == 'modify':
- for i in xrange(0, len(lines)):
- for name, field in lines[i]._fields.iteritems():
+ for i, line in enumerate(lines):
+ for name, field in line._fields.iteritems():
if name == 'sale_line_ids':
- result[i][2][name] = [(6, 0, lines[i][name].ids)]
- lines[i][name] = False
+ result[i][2][name] = [(6, 0, line[name].ids)]
+ line[name] = False
return result
@api.multi
diff --git a/addons/stock/models/procurement.py b/addons/stock/models/procurement.py
index b3edca53c0f..7ce3bb2abed 100644
--- a/addons/stock/models/procurement.py
+++ b/addons/stock/models/procurement.py
@@ -4,6 +4,7 @@
from collections import defaultdict
from datetime import datetime
from dateutil.relativedelta import relativedelta
+from odoo.tools.misc import split_every
from psycopg2 import OperationalError
from odoo import api, fields, models, registry, _
@@ -239,9 +240,9 @@ class ProcurementOrder(models.Model):
# Search all confirmed stock_moves and try to assign them
confirmed_moves = self.env['stock.move'].search([('state', '=', 'confirmed')], limit=None, order='priority desc, date_expected asc')
- for x in xrange(0, len(confirmed_moves.ids), 100):
+ for moves_chunk in split_every(100, confirmed_moves.ids):
# TDE CLEANME: muf muf
- self.env['stock.move'].browse(confirmed_moves.ids[x:x + 100]).action_assign()
+ self.env['stock.move'].browse(moves_chunk).action_assign()
if use_new_cursor:
self._cr.commit()
if use_new_cursor:
diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py
index a661169296f..63a9be564aa 100644
--- a/addons/stock/models/product.py
+++ b/addons/stock/models/product.py
@@ -4,6 +4,7 @@
from odoo import api, fields, models, _
from odoo.addons import decimal_precision as dp
from odoo.exceptions import UserError
+from odoo.tools import pycompat
from odoo.tools.float_utils import float_round
from datetime import datetime
import operator as py_operator
@@ -180,7 +181,7 @@ class Product(models.Model):
location_ids = []
if self.env.context.get('location', False):
- if isinstance(self.env.context['location'], (int, long)):
+ if isinstance(self.env.context['location'], pycompat.integer_types):
location_ids = [self.env.context['location']]
elif isinstance(self.env.context['location'], basestring):
domain = [('complete_name', 'ilike', self.env.context['location'])]
@@ -191,7 +192,7 @@ class Product(models.Model):
location_ids = self.env.context['location']
else:
if self.env.context.get('warehouse', False):
- if isinstance(self.env.context['warehouse'], (int, long)):
+ if isinstance(self.env.context['warehouse'], pycompat.integer_types):
wids = [self.env.context['warehouse']]
elif isinstance(self.env.context['warehouse'], basestring):
domain = [('name', 'ilike', self.env.context['warehouse'])]
@@ -326,7 +327,7 @@ class Product(models.Model):
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
res = super(Product, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
- if self._context.get('location') and isinstance(self._context['location'], (int, long)):
+ if self._context.get('location') and isinstance(self._context['location'], pycompat.integer_types):
location = self.env['stock.location'].browse(self._context['location'])
fields = res.get('fields')
if fields:
diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py
index 2dc9cba0fdb..65464fa7493 100644
--- a/addons/web_editor/models/ir_ui_view.py
+++ b/addons/web_editor/models/ir_ui_view.py
@@ -7,6 +7,7 @@ from lxml import etree, html
from odoo.exceptions import AccessError
from odoo import api, models
+from odoo.tools import pycompat
_logger = logging.getLogger(__name__)
@@ -121,7 +122,7 @@ class IrUiView(models.Model):
def _view_obj(self, view_id):
if isinstance(view_id, basestring):
return self.env.ref(view_id)
- elif isinstance(view_id, (int, long)):
+ elif isinstance(view_id, pycompat.integer_types):
return self.browse(view_id)
# assume it's already a view object (WTF?)
return view_id
diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py
index ce93898914e..42f90e0cc0c 100644
--- a/addons/website/models/ir_ui_view.py
+++ b/addons/website/models/ir_ui_view.py
@@ -10,6 +10,7 @@ from odoo import tools
from odoo.addons.website.models import website
from odoo.http import request
+from odoo.tools import pycompat
_logger = logging.getLogger(__name__)
@@ -63,7 +64,7 @@ class View(models.Model):
return views.filter_duplicate()
else:
return self.env.ref(view_id)
- elif isinstance(view_id, (int, long)):
+ elif isinstance(view_id, pycompat.integer_types):
return self.browse(view_id)
# assume it's already a view object (WTF?)
@@ -72,7 +73,7 @@ class View(models.Model):
@api.model
@tools.ormcache_context('self._uid', 'xml_id', keys=('website_id',))
def get_view_id(self, xml_id):
- if 'website_id' in self._context and not isinstance(xml_id, (int, long)):
+ if 'website_id' in self._context and not isinstance(xml_id, pycompat.integer_types):
domain = [('key', '=', xml_id), '|', ('website_id', '=', self._context['website_id']), ('website_id', '=', False)]
view = self.search(domain, order='website_id', limit=1)
if not view:
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index bb26fc7ee85..bd7621c767d 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -19,7 +19,7 @@ except ImportError:
from odoo import api, fields, models
from odoo import tools
-from odoo.tools import ustr
+from odoo.tools import ustr, pycompat
from odoo.http import request
from odoo.tools.translate import _
@@ -421,7 +421,7 @@ class Website(models.Model):
@api.model
def get_template(self, template):
View = self.env['ir.ui.view']
- if isinstance(template, (int, long)):
+ if isinstance(template, pycompat.integer_types):
view_id = template
else:
if '.' not in template:
@@ -486,7 +486,7 @@ class Website(models.Model):
'num': pmax
},
"pages": [
- {'url': get_url(page), 'num': page} for page in xrange(pmin, pmax+1)
+ {'url': get_url(page), 'num': page} for page in pycompat.range(pmin, pmax+1)
]
}
@@ -544,8 +544,7 @@ class Website(models.Model):
values = [{}]
convitems = converters.items()
# converters with a domain are processed after the other ones
- gd = lambda x: hasattr(x[1], 'domain') and (x[1].domain != '[]')
- convitems.sort(lambda x, y: cmp(gd(x), gd(y)))
+ convitems.sort(key=lambda x: hasattr(x[1], 'domain') and (x[1].domain != '[]'))
for (i, (name, converter)) in enumerate(convitems):
newval = []
for val in values:
diff --git a/addons/website/tests/test_crawl.py b/addons/website/tests/test_crawl.py
index 5ef5c551163..704cd62a41b 100644
--- a/addons/website/tests/test_crawl.py
+++ b/addons/website/tests/test_crawl.py
@@ -10,6 +10,8 @@ import lxml.html
import odoo
import re
+from odoo.tools import pycompat
+
_logger = logging.getLogger(__name__)
@@ -38,7 +40,7 @@ class Crawler(odoo.tests.HttpCase):
_logger.info("%s %s", msg, url)
r = self.url_open(url)
code = r.getcode()
- self.assertIn(code, xrange(200, 300), "%s Fetching %s returned error response (%d)" % (msg, url, code))
+ self.assertIn(code, pycompat.range(200, 300), "%s Fetching %s returned error response (%d)" % (msg, url, code))
if r.info().gettype() == 'text/html':
doc = lxml.html.fromstring(r.read())