diff options
| author | xmo-odoo <xmo@odoo.com> | 2017-04-27 13:59:33 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-27 13:59:33 +0200 |
| commit | 2e6a589f417af48e3322955ffff6e94b6d8a24e3 (patch) | |
| tree | aa613ecc1f74a9531a03de89aa2bdc7bb32eed3b /addons | |
| parent | de4a2216b953abb86094c9bfa5f45b1eaaa79d3d (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')
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()) |
