From 7d487c00a679980b96409e261322f93ba3e340f2 Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Wed, 20 Jul 2016 15:00:17 +0200 Subject: [PATCH 01/12] [IMP] web: remove void file, replace openerp tags, add license, clean imports --- addons/web/__init__.py | 3 ++ addons/web/__openerp__.py | 3 ++ addons/web/controllers/__init__.py | 3 ++ addons/web/controllers/main.py | 72 +++++++++++++-------------- addons/web/controllers/pivot.py | 31 ++++++------ addons/web/models/__init__.py | 1 + addons/web/models/ir_http.py | 7 ++- addons/web/tests/__init__.py | 2 + addons/web/tests/common.py | 0 addons/web/tests/test_js.py | 4 ++ addons/web/tests/test_menu.py | 2 + addons/web/tests/test_serving_base.py | 6 ++- 12 files changed, 81 insertions(+), 53 deletions(-) delete mode 100644 addons/web/tests/common.py diff --git a/addons/web/__init__.py b/addons/web/__init__.py index b5b73c87bbb..a1a3f3105a8 100644 --- a/addons/web/__init__.py +++ b/addons/web/__init__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import sys # Mock deprecated openerp.addons.web.http module diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 33529158418..3acba98e98a 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Web', 'category': 'Hidden', diff --git a/addons/web/controllers/__init__.py b/addons/web/controllers/__init__.py index 36199bde25b..48cc37266c6 100644 --- a/addons/web/controllers/__init__.py +++ b/addons/web/controllers/__init__.py @@ -1 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from . import main, pivot diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 1a17c8c623f..fc3ffb02c1e 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. import base64 import csv @@ -23,23 +24,22 @@ from cStringIO import StringIO import babel.messages.pofile import werkzeug.utils import werkzeug.wrappers -from openerp.api import Environment try: import xlwt except ImportError: xlwt = None -import openerp -import openerp.modules.registry -from openerp.modules import get_resource_path -from openerp.tools import topological_sort -from openerp.tools.translate import _ -from openerp.tools import ustr -from openerp.tools.misc import str2bool -from openerp import http -from openerp.http import request, serialize_exception as _serialize_exception -from openerp.exceptions import AccessError +import odoo +import odoo.modules.registry +from odoo.api import Environment +from odoo.modules import get_resource_path +from odoo.tools import topological_sort +from odoo.tools.translate import _ +from odoo.tools.misc import str2bool +from odoo import http +from odoo.http import request, serialize_exception as _serialize_exception +from odoo.exceptions import AccessError _logger = logging.getLogger(__name__) @@ -48,7 +48,7 @@ if hasattr(sys, 'frozen'): path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'views')) loader = jinja2.FileSystemLoader(path) else: - loader = jinja2.PackageLoader('openerp.addons.web', "views") + loader = jinja2.PackageLoader('odoo.addons.web', "views") env = jinja2.Environment(loader=loader, autoescape=True) env.filters["json"] = json.dumps @@ -57,7 +57,7 @@ env.filters["json"] = json.dumps BUNDLE_MAXAGE = 60 * 60 * 24 * 7 #---------------------------------------------------------- -# OpenERP Web helpers +# Odoo Web helpers #---------------------------------------------------------- db_list = http.db_list @@ -163,16 +163,16 @@ def module_installed(environment): def module_installed_bypass_session(dbname): try: - registry = openerp.modules.registry.RegistryManager.get(dbname) + registry = odoo.modules.registry.RegistryManager.get(dbname) with registry.cursor() as cr: return module_installed( - environment=Environment(cr, openerp.SUPERUSER_ID, {})) + environment=Environment(cr, odoo.SUPERUSER_ID, {})) except Exception: pass return {} def module_boot(db=None): - server_wide_modules = openerp.conf.server_wide_modules or ['web'] + server_wide_modules = odoo.conf.server_wide_modules or ['web'] serverside = [] dbside = [] for i in server_wide_modules: @@ -245,7 +245,7 @@ def manifest_list(extension, mods=None, db=None, debug=None): db: a database name (return all installed modules in that database) """ if debug is not None: - _logger.warning("openerp.addons.web.main.manifest_list(): debug parameter is deprecated") + _logger.warning("odoo.addons.web.main.manifest_list(): debug parameter is deprecated") files = manifest_glob(extension, addons=mods, db=db, include_remotes=True) return [wp for _fp, wp in files] @@ -345,7 +345,7 @@ def generate_views(action): action['views'] = [(view_id, view_modes[0])] def fix_view_modes(action): - """ For historical reasons, OpenERP has weird dealings in relation to + """ For historical reasons, Odoo has weird dealings in relation to view_mode and the view_type attribute (on window actions): * one of the view modes is ``tree``, which stands for both list views @@ -427,7 +427,7 @@ def binary_content(xmlid=None, model='ir.attachment', id=None, field='datas', un download=download, mimetype=mimetype, default_mimetype=default_mimetype, env=env) #---------------------------------------------------------- -# OpenERP Web web Controllers +# Odoo Web web Controllers #---------------------------------------------------------- class Home(http.Controller): @@ -462,12 +462,12 @@ class Home(http.Controller): return http.redirect_with_hash(redirect) if not request.uid: - request.uid = openerp.SUPERUSER_ID + request.uid = odoo.SUPERUSER_ID values = request.params.copy() try: values['databases'] = http.db_list() - except openerp.exceptions.AccessDenied: + except odoo.exceptions.AccessDenied: values['databases'] = None if request.httprequest.method == 'POST': @@ -551,7 +551,7 @@ class WebClient(http.Controller): @http.route('/web/webclient/translations', type='json', auth="none") def translations(self, mods=None, lang=None): request.disable_db = False - uid = openerp.SUPERUSER_ID + uid = odoo.SUPERUSER_ID if mods is None: m = request.registry.get('ir.module.module') mods = [x['name'] for x in m.search_read(request.cr, uid, @@ -586,7 +586,7 @@ class WebClient(http.Controller): @http.route('/web/webclient/version_info', type='json', auth="none") def version_info(self): - return openerp.service.common.exp_version() + return odoo.service.common.exp_version() @http.route('/web/tests', type='http', auth="none") def index(self, mod=None, **kwargs): @@ -613,15 +613,15 @@ class Database(http.Controller): def _render_template(self, **d): d.setdefault('manage',True) - d['insecure'] = openerp.tools.config['admin_passwd'] == 'admin' - d['list_db'] = openerp.tools.config['list_db'] - d['langs'] = openerp.service.db.exp_list_lang() - d['countries'] = openerp.service.db.exp_list_countries() + d['insecure'] = odoo.tools.config['admin_passwd'] == 'admin' + d['list_db'] = odoo.tools.config['list_db'] + d['langs'] = odoo.service.db.exp_list_lang() + d['countries'] = odoo.service.db.exp_list_countries() # databases list d['databases'] = [] try: d['databases'] = http.db_list() - except openerp.exceptions.AccessDenied: + except odoo.exceptions.AccessDenied: monodb = db_monodb() if monodb: d['databases'] = [monodb] @@ -668,14 +668,14 @@ class Database(http.Controller): @http.route('/web/database/backup', type='http', auth="none", methods=['POST'], csrf=False) def backup(self, master_pwd, name, backup_format = 'zip'): try: - openerp.service.db.check_super(master_pwd) + odoo.service.db.check_super(master_pwd) ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S") filename = "%s_%s.%s" % (name, ts, backup_format) headers = [ ('Content-Type', 'application/octet-stream; charset=binary'), ('Content-Disposition', content_disposition(filename)), ] - dump_stream = openerp.service.db.dump_db(name, None, backup_format) + dump_stream = odoo.service.db.dump_db(name, None, backup_format) response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True) return response except Exception, e: @@ -742,7 +742,7 @@ class Session(http.Controller): @http.route('/web/session/modules', type='json', auth="user") def modules(self): # return all installed modules. Web client is smart enough to not load a module twice - return module_installed(environment=request.env(user=openerp.SUPERUSER_ID)) + return module_installed(environment=request.env(user=odoo.SUPERUSER_ID)) @http.route('/web/session/save_session_action', type='json', auth="user") def save_session_action(self, the_action): @@ -977,7 +977,7 @@ class Binary(http.Controller): width = 500 if height > 500: height = 500 - content = openerp.tools.image_resize_image(base64_source=content, size=(width or None, height or None), encoding='base64', filetype='PNG') + content = odoo.tools.image_resize_image(base64_source=content, size=(width or None, height or None), encoding='base64', filetype='PNG') image_base64 = content and base64.b64decode(content) or self.placeholder() headers.append(('Content-Length', len(image_base64))) @@ -1054,14 +1054,14 @@ class Binary(http.Controller): dbname = db_monodb() if not uid: - uid = openerp.SUPERUSER_ID + uid = odoo.SUPERUSER_ID if not dbname: response = http.send_file(placeholder(imgname + imgext)) else: try: # create an empty registry - registry = openerp.modules.registry.Registry(dbname) + registry = odoo.modules.registry.Registry(dbname) with registry.cursor() as cr: cr.execute("""SELECT c.logo_web, c.write_date FROM res_users u @@ -1155,7 +1155,7 @@ class Export(http.Controller): fields['.id'] = fields.pop('id', {'string': 'ID'}) fields_sequence = sorted(fields.iteritems(), - key=lambda field: openerp.tools.ustr(field[1].get('string', ''))) + key=lambda field: odoo.tools.ustr(field[1].get('string', ''))) records = [] for field_name, field in fields_sequence: @@ -1275,7 +1275,7 @@ class ExportFormat(object): raise NotImplementedError() def from_data(self, fields, rows): - """ Conversion method from OpenERP's export data to whatever the + """ Conversion method from Odoo's export data to whatever the current export class outputs :params list fields: a list of fields to export diff --git a/addons/web/controllers/pivot.py b/addons/web/controllers/pivot.py index 571cff94229..97fc1d4eb83 100644 --- a/addons/web/controllers/pivot.py +++ b/addons/web/controllers/pivot.py @@ -1,21 +1,24 @@ -from openerp import http -import json -from openerp.http import request, serialize_exception as _serialize_exception -from cStringIO import StringIO +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from collections import deque +import json + +from odoo import http +from odoo.http import request try: import xlwt except ImportError: xlwt = None + class TableExporter(http.Controller): @http.route('/web/pivot/check_xlwt', type='json', auth='none') def check_xlwt(self): return xlwt is not None - @http.route('/web/pivot/export_xls', type='http', auth="user") def export_xls(self, data, token): jdata = json.loads(data) @@ -29,41 +32,41 @@ class TableExporter(http.Controller): # Step 1: writing headers headers = jdata['headers'] - # x,y: current coordinates + # x,y: current coordinates # carry: queue containing cell information when a cell has a >= 2 height # and the drawing code needs to add empty cells below - x, y, carry = 1, 0, deque() + x, y, carry = 1, 0, deque() for i, header_row in enumerate(headers): - worksheet.write(i,0, '', header_plain) + worksheet.write(i, 0, '', header_plain) for header in header_row: while (carry and carry[0]['x'] == x): cell = carry.popleft() for i in range(nbr_measures): worksheet.write(y, x+i, '', header_plain) if cell['height'] > 1: - carry.append({'x': x, 'height':cell['height'] - 1}) + carry.append({'x': x, 'height': cell['height'] - 1}) x = x + nbr_measures style = header_plain if 'expanded' in header else header_bold for i in range(header['width']): worksheet.write(y, x + i, header['title'] if i == 0 else '', style) if header['height'] > 1: - carry.append({'x': x, 'height':header['height'] - 1}) - x = x + header['width']; + carry.append({'x': x, 'height': header['height'] - 1}) + x = x + header['width'] while (carry and carry[0]['x'] == x): cell = carry.popleft() for i in range(nbr_measures): worksheet.write(y, x+i, '', header_plain) if cell['height'] > 1: - carry.append({'x': x, 'height':cell['height'] - 1}) + carry.append({'x': x, 'height': cell['height'] - 1}) x = x + nbr_measures x, y = 1, y + 1 # Step 2: measure row if nbr_measures > 1: - worksheet.write(y,0, '', header_plain) + worksheet.write(y, 0, '', header_plain) for measure in jdata['measure_row']: style = header_bold if measure['is_bold'] else header_plain - worksheet.write(y, x, measure['measure'], style); + worksheet.write(y, x, measure['measure'], style) x = x + 1 y = y + 1 diff --git a/addons/web/models/__init__.py b/addons/web/models/__init__.py index 8d297897934..983d5aec788 100644 --- a/addons/web/models/__init__.py +++ b/addons/web/models/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. import ir_http diff --git a/addons/web/models/ir_http.py b/addons/web/models/ir_http.py index 0c3aacc09c9..6af9431bada 100644 --- a/addons/web/models/ir_http.py +++ b/addons/web/models/ir_http.py @@ -1,8 +1,11 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import json import openerp -from openerp import models -from openerp.http import request +from odoo import models +from odoo.http import request class Http(models.AbstractModel): diff --git a/addons/web/tests/__init__.py b/addons/web/tests/__init__.py index beb9e90eb76..704bbe5696f 100644 --- a/addons/web/tests/__init__.py +++ b/addons/web/tests/__init__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import test_js import test_menu import test_serving_base diff --git a/addons/web/tests/common.py b/addons/web/tests/common.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/addons/web/tests/test_js.py b/addons/web/tests/test_js.py index 811f3aac4d0..1dab0f8436b 100644 --- a/addons/web/tests/test_js.py +++ b/addons/web/tests/test_js.py @@ -1,5 +1,9 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import openerp.tests + class WebSuite(openerp.tests.HttpCase): def test_01_js(self): self.phantom_js('/web/tests?mod=web',"","", login='admin') diff --git a/addons/web/tests/test_menu.py b/addons/web/tests/test_menu.py index c85684bdf84..71182f35956 100644 --- a/addons/web/tests/test_menu.py +++ b/addons/web/tests/test_menu.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import unittest from ..controllers import main diff --git a/addons/web/tests/test_serving_base.py b/addons/web/tests/test_serving_base.py index e9689fcb1e3..ebbc4dfac62 100644 --- a/addons/web/tests/test_serving_base.py +++ b/addons/web/tests/test_serving_base.py @@ -1,18 +1,22 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. import random import unittest -from openerp.tools import topological_sort +from odoo.tools import topological_sort + def sample(population): return random.sample( population, random.randint(0, min(len(population), 5))) + class TestModulesLoading(unittest.TestCase): def setUp(self): self.mods = map(str, range(1000)) + def test_topological_sort(self): random.shuffle(self.mods) modules = [ From f88a8894099d735210faf72953ee91587ae8142f Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Wed, 27 Jul 2016 15:39:57 +0200 Subject: [PATCH 02/12] [MIG] web: migrate controllers to new API --- addons/web/controllers/main.py | 60 +++++++++++++++++----------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index fc3ffb02c1e..4b277f816ea 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1,29 +1,29 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import babel.messages.pofile import base64 import csv +import datetime import functools import glob +import hashlib import imghdr import itertools import jinja2 +import json import logging import operator -import datetime -import hashlib import os import re -import json import sys import time +import werkzeug.utils +import werkzeug.wrappers import zlib from xml.etree import ElementTree from cStringIO import StringIO -import babel.messages.pofile -import werkzeug.utils -import werkzeug.wrappers try: import xlwt @@ -482,6 +482,7 @@ class Home(http.Controller): values['error'] = _("Wrong login/password") return request.render('web.login', values) + class WebClient(http.Controller): @http.route('/web/webclient/csslist', type='json', auth="none") @@ -494,21 +495,20 @@ class WebClient(http.Controller): @http.route('/web/webclient/locale/', type='http', auth="none") def load_locale(self, lang): - magic_file_finding = [lang.replace("_",'-').lower(), lang.split('_')[0]] + magic_file_finding = [lang.replace("_", '-').lower(), lang.split('_')[0]] addons_path = http.addons_manifest['web']['addons_path'] - #load momentjs locale - momentjs_locale_file = False + # load momentjs locale momentjs_locale = "" for code in magic_file_finding: try: with open(os.path.join(addons_path, 'web', 'static', 'lib', 'moment', 'locale', code + '.js'), 'r') as f: momentjs_locale = f.read() - #we found a locale matching so we can exit + # we found a locale matching so we can exit break except IOError: continue - #return the content of the locale + # return the content of the locale headers = [('Content-Type', 'application/javascript'), ('Cache-Control', 'max-age=%s' % (36000))] return request.make_response(momentjs_locale, headers) @@ -551,37 +551,36 @@ class WebClient(http.Controller): @http.route('/web/webclient/translations', type='json', auth="none") def translations(self, mods=None, lang=None): request.disable_db = False - uid = odoo.SUPERUSER_ID if mods is None: - m = request.registry.get('ir.module.module') - mods = [x['name'] for x in m.search_read(request.cr, uid, - [('state','=','installed')], ['name'])] + mods = [x['name'] for x in request.env['ir.module.module'].sudo().search_read( + [('state', '=', 'installed')], ['name'])] if lang is None: lang = request.context["lang"] - res_lang = request.registry.get('res.lang') - ids = res_lang.search(request.cr, uid, [("code", "=", lang)]) + langs = request.env['res.lang'].sudo().search([("code", "=", lang)]) lang_params = None - if ids: - lang_params = res_lang.read(request.cr, uid, ids[0], - ["name", "direction", "date_format", "time_format", "grouping", "decimal_point", "thousands_sep"]) + if langs: + lang_params = langs.read([ + "name", "direction", "date_format", "time_format", + "grouping", "decimal_point", "thousands_sep"])[0] # Regional languages (ll_CC) must inherit/override their parent lang (ll), but this is # done server-side when the language is loaded, so we only need to load the user's lang. - ir_translation = request.registry.get('ir.translation') translations_per_module = {} - messages = ir_translation.search_read(request.cr, uid, [('module','in',mods),('lang','=',lang), - ('comments','like','openerp-web'),('value','!=',False), - ('value','!=','')], - ['module','src','value','lang'], order='module') + messages = request.env['ir.translation'].sudo().search_read([ + ('module', 'in', mods), ('lang', '=', lang), + ('comments', 'like', 'openerp-web'), ('value', '!=', False), + ('value', '!=', '')], + ['module', 'src', 'value', 'lang'], order='module') for mod, msg_group in itertools.groupby(messages, key=operator.itemgetter('module')): - translations_per_module.setdefault(mod,{'messages':[]}) - translations_per_module[mod]['messages'].extend({'id': m['src'], - 'string': m['value']} \ - for m in msg_group) + translations_per_module.setdefault(mod, {'messages': []}) + translations_per_module[mod]['messages'].extend({ + 'id': m['src'], + 'string': m['value']} + for m in msg_group) return { 'lang_parameters': lang_params, 'modules': translations_per_module, - 'multi_lang': len(res_lang.get_installed(request.cr, uid)) > 1, + 'multi_lang': len(request.env['res.lang'].sudo().get_installed()) > 1, } @http.route('/web/webclient/version_info', type='json', auth="none") @@ -592,6 +591,7 @@ class WebClient(http.Controller): def index(self, mod=None, **kwargs): return request.render('web.qunit_suite') + class Proxy(http.Controller): @http.route('/web/proxy/post/', type='http', auth='user', methods=['GET']) From d4e813b87336984d52d9ebaeb7db16e0203013f6 Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Fri, 22 Jul 2016 11:43:12 +0200 Subject: [PATCH 03/12] [REF] web, *: change deprecated import openerp.addons.web.http to odoo.http We also remove the mock in web as there is no need for it anymore. --- addons/google_calendar/controllers/main.py | 4 ++-- addons/link_tracker/controller/main.py | 2 +- addons/report/models/report.py | 2 +- addons/web/__init__.py | 7 ------- addons/web_editor/controllers/main.py | 2 +- addons/web_editor/models/ir_attachment.py | 2 +- addons/website/controllers/main.py | 2 +- addons/website/models/ir_qweb.py | 2 +- addons/website/models/website.py | 2 +- addons/website_blog/controllers/main.py | 4 ++-- addons/website_crm_partner_assign/controllers/main.py | 4 ++-- addons/website_customer/controllers/main.py | 4 ++-- addons/website_forum/controllers/main.py | 4 ++-- addons/website_google_map/controllers/main.py | 4 ++-- addons/website_links/controller/main.py | 2 +- addons/website_membership/controllers/main.py | 4 ++-- addons/website_quote/controllers/main.py | 4 ++-- addons/website_rating_project_issue/controllers/main.py | 4 ++-- addons/website_sale/controllers/website_mail.py | 2 +- addons/website_slides/controllers/main.py | 2 +- addons/website_twitter/controllers/main.py | 4 ++-- openerp/addons/base/ir/ir_qweb/ir_qweb.py | 2 +- 22 files changed, 31 insertions(+), 38 deletions(-) diff --git a/addons/google_calendar/controllers/main.py b/addons/google_calendar/controllers/main.py index 1f307133ea0..233126bee64 100644 --- a/addons/google_calendar/controllers/main.py +++ b/addons/google_calendar/controllers/main.py @@ -1,5 +1,5 @@ -import openerp.addons.web.http as http -from openerp.addons.web.http import request +import openerp.http as http +from openerp.http import request class google_calendar_controller(http.Controller): diff --git a/addons/link_tracker/controller/main.py b/addons/link_tracker/controller/main.py index 1d7707fb65a..d902fef8a7c 100644 --- a/addons/link_tracker/controller/main.py +++ b/addons/link_tracker/controller/main.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import werkzeug -from openerp.addons.web import http +from openerp import http from openerp.http import request diff --git a/addons/report/models/report.py b/addons/report/models/report.py index 398bb7beade..caaee1f95a0 100644 --- a/addons/report/models/report.py +++ b/addons/report/models/report.py @@ -6,7 +6,7 @@ from odoo.exceptions import AccessError from odoo.sql_db import TestCursor from odoo.tools import config from odoo.tools.misc import find_in_path -from odoo.addons.web.http import request +from odoo.http import request from odoo.tools.safe_eval import safe_eval as eval from odoo.exceptions import UserError diff --git a/addons/web/__init__.py b/addons/web/__init__.py index a1a3f3105a8..ac0011716f6 100644 --- a/addons/web/__init__.py +++ b/addons/web/__init__.py @@ -1,12 +1,5 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import sys - -# Mock deprecated openerp.addons.web.http module -import openerp.http -sys.modules['openerp.addons.web.http'] = openerp.http -http = openerp.http - import controllers import models diff --git a/addons/web_editor/controllers/main.py b/addons/web_editor/controllers/main.py index c9daf246691..fa891ee296c 100644 --- a/addons/web_editor/controllers/main.py +++ b/addons/web_editor/controllers/main.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from openerp.http import request, STATIC_CACHE -from openerp.addons.web import http +from openerp import http import json import io from PIL import Image, ImageFont, ImageDraw diff --git a/addons/web_editor/models/ir_attachment.py b/addons/web_editor/models/ir_attachment.py index f489aa90aa2..135d82bc592 100644 --- a/addons/web_editor/models/ir_attachment.py +++ b/addons/web_editor/models/ir_attachment.py @@ -4,7 +4,7 @@ from openerp.osv import osv, fields import contextlib from sys import maxint -from openerp.addons.web.http import request +from openerp.http import request import datetime import hashlib import time diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 0b1d9bd78af..f3c9f5b4d28 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -13,7 +13,7 @@ import werkzeug.wrappers import openerp from openerp.addons.web.controllers.main import WebClient, Binary -from openerp.addons.web import http +from openerp import http from openerp.http import request from openerp.osv.orm import browse_record from openerp.addons.website.models.website import slug diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index bfae7d49b5f..14b5a0d8f1c 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from openerp.addons.web.http import request +from openerp.http import request from openerp.osv import orm import ast diff --git a/addons/website/models/website.py b/addons/website/models/website.py index f45d9b505c3..b4a4b3d9ffa 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -21,7 +21,7 @@ from openerp.tools.translate import _ from openerp.osv import orm, osv, fields from openerp.tools import html_escape as escape, ustr, image_resize_and_sharpen, image_save_for_web from openerp.tools.safe_eval import safe_eval -from openerp.addons.web.http import request +from openerp.http import request from werkzeug.exceptions import NotFound logger = logging.getLogger(__name__) diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py index 3ef3c670256..f7d8ce7be7d 100644 --- a/addons/website_blog/controllers/main.py +++ b/addons/website_blog/controllers/main.py @@ -5,8 +5,8 @@ import json import werkzeug from openerp import tools -from openerp.addons.web import http -from openerp.addons.web.http import request +from openerp import http +from openerp.http import request from openerp.addons.website.models.website import slug, unslug from odoo.addons.website.controllers.main import QueryURL from openerp.exceptions import UserError diff --git a/addons/website_crm_partner_assign/controllers/main.py b/addons/website_crm_partner_assign/controllers/main.py index a2f4ce16602..dd13570b4dd 100644 --- a/addons/website_crm_partner_assign/controllers/main.py +++ b/addons/website_crm_partner_assign/controllers/main.py @@ -7,8 +7,8 @@ import werkzeug from collections import OrderedDict from odoo import fields -from odoo.addons.web import http -from odoo.addons.web.http import request +from odoo import http +from odoo.http import request from odoo.addons.website.models.website import slug, unslug from odoo.addons.website_partner.controllers.main import WebsitePartnerPage from odoo.tools.translate import _ diff --git a/addons/website_customer/controllers/main.py b/addons/website_customer/controllers/main.py index 5b6aec225f3..9af35347a82 100644 --- a/addons/website_customer/controllers/main.py +++ b/addons/website_customer/controllers/main.py @@ -3,10 +3,10 @@ import openerp from openerp import SUPERUSER_ID -from openerp.addons.web import http +from openerp import http from openerp.addons.website.models.website import unslug from openerp.tools.translate import _ -from openerp.addons.web.http import request +from openerp.http import request import werkzeug.urls diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py index 01cb42d3cc3..98c7ae854c8 100644 --- a/addons/website_forum/controllers/main.py +++ b/addons/website_forum/controllers/main.py @@ -10,9 +10,9 @@ import base64 import openerp from openerp import tools, _ -from openerp.addons.web import http +from openerp import http from openerp.addons.web.controllers.main import binary_content -from openerp.addons.web.http import request +from openerp.http import request from openerp.addons.website.models.website import slug diff --git a/addons/website_google_map/controllers/main.py b/addons/website_google_map/controllers/main.py index 01a547920bf..101d3382dfe 100644 --- a/addons/website_google_map/controllers/main.py +++ b/addons/website_google_map/controllers/main.py @@ -2,8 +2,8 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import json -from odoo.addons.web import http -from odoo.addons.web.http import request +from odoo import http +from odoo.http import request from odoo.tools import html_escape as escape diff --git a/addons/website_links/controller/main.py b/addons/website_links/controller/main.py index a91021161e2..65a9a750c0e 100644 --- a/addons/website_links/controller/main.py +++ b/addons/website_links/controller/main.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import werkzeug -from openerp.addons.web import http +from openerp import http from openerp.http import request diff --git a/addons/website_membership/controllers/main.py b/addons/website_membership/controllers/main.py index c682dca2ad5..df953d74d40 100644 --- a/addons/website_membership/controllers/main.py +++ b/addons/website_membership/controllers/main.py @@ -5,8 +5,8 @@ import werkzeug.urls from odoo import fields -from odoo.addons.web import http -from odoo.addons.web.http import request +from odoo import http +from odoo.http import request from odoo.addons.website.models.website import unslug from odoo.tools.translate import _ diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py index 42b5b0b2dac..02a68ddec6d 100644 --- a/addons/website_quote/controllers/main.py +++ b/addons/website_quote/controllers/main.py @@ -2,8 +2,8 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from openerp import SUPERUSER_ID -from openerp.addons.web import http -from openerp.addons.web.http import request +from openerp import http +from openerp.http import request import werkzeug import datetime import time diff --git a/addons/website_rating_project_issue/controllers/main.py b/addons/website_rating_project_issue/controllers/main.py index c46e32a6b0a..4797ee4b0c7 100644 --- a/addons/website_rating_project_issue/controllers/main.py +++ b/addons/website_rating_project_issue/controllers/main.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from openerp.addons.web import http -from openerp.addons.web.http import request +from openerp import http +from openerp.http import request import datetime from werkzeug.exceptions import NotFound diff --git a/addons/website_sale/controllers/website_mail.py b/addons/website_sale/controllers/website_mail.py index cf677e0a51a..5474d21e090 100644 --- a/addons/website_sale/controllers/website_mail.py +++ b/addons/website_sale/controllers/website_mail.py @@ -3,7 +3,7 @@ import urlparse from odoo import http -from odoo.addons.web.http import request +from odoo.http import request from odoo.addons.website_mail.controllers.main import WebsiteMail diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index cadb72a2145..651507df075 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -3,7 +3,7 @@ import base64 import logging import werkzeug -from openerp.addons.web import http +from openerp import http from openerp.exceptions import AccessError, UserError from openerp.http import request from openerp.tools.translate import _ diff --git a/addons/website_twitter/controllers/main.py b/addons/website_twitter/controllers/main.py index 2e1347464b9..9d0e2c40edd 100644 --- a/addons/website_twitter/controllers/main.py +++ b/addons/website_twitter/controllers/main.py @@ -3,8 +3,8 @@ import json from odoo import _ -from odoo.addons.web import http -from odoo.addons.web.http import request +from odoo import http +from odoo.http import request class Twitter(http.Controller): diff --git a/openerp/addons/base/ir/ir_qweb/ir_qweb.py b/openerp/addons/base/ir/ir_qweb/ir_qweb.py index 88e6ee95307..d5bf6a1f64d 100644 --- a/openerp/addons/base/ir/ir_qweb/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb/ir_qweb.py @@ -10,7 +10,7 @@ from collections import OrderedDict from openerp import api, models, tools from openerp.tools import safe_eval -from openerp.addons.web.http import request +from openerp.http import request from odoo.modules.module import get_resource_path import json from time import time From d8b652d706fcd9b89eb95f70aebb16926d0c5deb Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Wed, 20 Jul 2016 15:02:19 +0200 Subject: [PATCH 04/12] [MOV][IMP] web_calendar: rename files according to guidelines, replace openerp and add license --- addons/web_calendar/__init__.py | 2 ++ addons/web_calendar/__openerp__.py | 5 ++++- .../views/{web_calendar.xml => web_calendar_templates.xml} | 6 ++---- 3 files changed, 8 insertions(+), 5 deletions(-) rename addons/web_calendar/views/{web_calendar.xml => web_calendar_templates.xml} (94%) diff --git a/addons/web_calendar/__init__.py b/addons/web_calendar/__init__.py index e69de29bb2d..67dee8c60db 100644 --- a/addons/web_calendar/__init__.py +++ b/addons/web_calendar/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. diff --git a/addons/web_calendar/__openerp__.py b/addons/web_calendar/__openerp__.py index be0bbf69dab..4134668c732 100644 --- a/addons/web_calendar/__openerp__.py +++ b/addons/web_calendar/__openerp__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Web Calendar', 'category': 'Hidden', @@ -10,7 +13,7 @@ Odoo Web Calendar view. 'version': '2.0', 'depends': ['web'], 'data' : [ - 'views/web_calendar.xml', + 'views/web_calendar_templates.xml', ], 'qweb': [ 'static/src/xml/*.xml', diff --git a/addons/web_calendar/views/web_calendar.xml b/addons/web_calendar/views/web_calendar_templates.xml similarity index 94% rename from addons/web_calendar/views/web_calendar.xml rename to addons/web_calendar/views/web_calendar_templates.xml index 60949374acf..23290e08c87 100644 --- a/addons/web_calendar/views/web_calendar.xml +++ b/addons/web_calendar/views/web_calendar_templates.xml @@ -1,6 +1,5 @@ - - + - - + From 271ba327b461bfbb8a5d097cd5d875b0e29d80c2 Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Fri, 22 Jul 2016 13:04:13 +0200 Subject: [PATCH 05/12] [MOV][IMP] web_diagram: reorganize files, add license and clean imports --- addons/web_diagram/__init__.py | 3 +++ addons/web_diagram/__openerp__.py | 7 +++++-- addons/web_diagram/controllers/__init__.py | 3 +++ addons/web_diagram/controllers/main.py | 14 ++++++++++---- .../{web_diagram.xml => web_diagram_templates.xml} | 4 ++-- 5 files changed, 23 insertions(+), 8 deletions(-) rename addons/web_diagram/views/{web_diagram.xml => web_diagram_templates.xml} (96%) diff --git a/addons/web_diagram/__init__.py b/addons/web_diagram/__init__.py index e046e49fbe2..dd15b5c32e5 100644 --- a/addons/web_diagram/__init__.py +++ b/addons/web_diagram/__init__.py @@ -1 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from . import controllers diff --git a/addons/web_diagram/__openerp__.py b/addons/web_diagram/__openerp__.py index 111d4731049..537e8785f85 100644 --- a/addons/web_diagram/__openerp__.py +++ b/addons/web_diagram/__openerp__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Odoo Web Diagram', 'category': 'Hidden', @@ -8,8 +11,8 @@ Openerp Web Diagram view. """, 'version': '2.0', 'depends': ['web'], - 'data' : [ - 'views/web_diagram.xml', + 'data': [ + 'views/web_diagram_templates.xml', ], 'qweb': [ 'static/src/xml/*.xml', diff --git a/addons/web_diagram/controllers/__init__.py b/addons/web_diagram/controllers/__init__.py index 12a7e529b67..5d4b25db9c0 100644 --- a/addons/web_diagram/controllers/__init__.py +++ b/addons/web_diagram/controllers/__init__.py @@ -1 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from . import main diff --git a/addons/web_diagram/controllers/main.py b/addons/web_diagram/controllers/main.py index 40f5c9a5674..0b661623e3c 100644 --- a/addons/web_diagram/controllers/main.py +++ b/addons/web_diagram/controllers/main.py @@ -1,9 +1,15 @@ -import openerp -from openerp.tools.safe_eval import safe_eval as eval +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. -class DiagramView(openerp.http.Controller): +import odoo +import odoo.http as http - @openerp.http.route('/web_diagram/diagram/get_diagram_info', type='json', auth='user') +from odoo.tools.safe_eval import safe_eval as eval + + +class DiagramView(http.Controller): + + @http.route('/web_diagram/diagram/get_diagram_info', type='json', auth='user') def get_diagram_info(self, req, id, model, node, connector, src_node, des_node, label, **kw): diff --git a/addons/web_diagram/views/web_diagram.xml b/addons/web_diagram/views/web_diagram_templates.xml similarity index 96% rename from addons/web_diagram/views/web_diagram.xml rename to addons/web_diagram/views/web_diagram_templates.xml index c8606506c53..2b12b218ae6 100644 --- a/addons/web_diagram/views/web_diagram.xml +++ b/addons/web_diagram/views/web_diagram_templates.xml @@ -1,5 +1,5 @@ - + - + From 86cb52e145e9cdbd6ef6e91cde480bc0d1cd6d51 Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Fri, 22 Jul 2016 16:22:44 +0200 Subject: [PATCH 06/12] [MOV][IMP] web_kanban: reorganize files, remove openerp tags and add license --- addons/web_kanban/__init__.py | 2 ++ addons/web_kanban/__openerp__.py | 5 ++++- .../views/{web_kanban.xml => web_kanban_templates.xml} | 6 ++---- 3 files changed, 8 insertions(+), 5 deletions(-) rename addons/web_kanban/views/{web_kanban.xml => web_kanban_templates.xml} (96%) diff --git a/addons/web_kanban/__init__.py b/addons/web_kanban/__init__.py index e69de29bb2d..67dee8c60db 100644 --- a/addons/web_kanban/__init__.py +++ b/addons/web_kanban/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. diff --git a/addons/web_kanban/__openerp__.py b/addons/web_kanban/__openerp__.py index 80118d61400..ce02c1c5ebc 100644 --- a/addons/web_kanban/__openerp__.py +++ b/addons/web_kanban/__openerp__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Base Kanban', 'category': 'Hidden', @@ -9,7 +12,7 @@ Odoo Web kanban view. 'version': '2.0', 'depends': ['web'], 'data' : [ - 'views/web_kanban.xml', + 'views/web_kanban_templates.xml', ], 'qweb' : [ 'static/src/xml/*.xml', diff --git a/addons/web_kanban/views/web_kanban.xml b/addons/web_kanban/views/web_kanban_templates.xml similarity index 96% rename from addons/web_kanban/views/web_kanban.xml rename to addons/web_kanban/views/web_kanban_templates.xml index ce6d7e9c7b1..7c28cdd875e 100644 --- a/addons/web_kanban/views/web_kanban.xml +++ b/addons/web_kanban/views/web_kanban_templates.xml @@ -1,6 +1,5 @@ - - + - - + From b2126e5854b8ada57ae46de6903e8f8e7f3f169f Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Mon, 25 Jul 2016 10:01:50 +0200 Subject: [PATCH 07/12] [MOV][IMP] web_kanban_gauge: reorganize files, clean openerp tags and add license --- addons/web_kanban_gauge/__init__.py | 2 ++ addons/web_kanban_gauge/__openerp__.py | 5 ++++- ...{web_kanban_gauge.xml => web_kanban_gauge_templates.xml} | 6 ++---- 3 files changed, 8 insertions(+), 5 deletions(-) rename addons/web_kanban_gauge/views/{web_kanban_gauge.xml => web_kanban_gauge_templates.xml} (88%) diff --git a/addons/web_kanban_gauge/__init__.py b/addons/web_kanban_gauge/__init__.py index e69de29bb2d..67dee8c60db 100644 --- a/addons/web_kanban_gauge/__init__.py +++ b/addons/web_kanban_gauge/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. diff --git a/addons/web_kanban_gauge/__openerp__.py b/addons/web_kanban_gauge/__openerp__.py index 15ede1c79e2..065b4746b21 100644 --- a/addons/web_kanban_gauge/__openerp__.py +++ b/addons/web_kanban_gauge/__openerp__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Gauge Widget for Kanban', 'category': 'Hidden', @@ -7,7 +10,7 @@ This widget allows to display gauges using d3 library. 'version': '1.0', 'depends': ['web_kanban'], 'data' : [ - 'views/web_kanban_gauge.xml', + 'views/web_kanban_gauge_templates.xml', ], 'qweb': [ ], diff --git a/addons/web_kanban_gauge/views/web_kanban_gauge.xml b/addons/web_kanban_gauge/views/web_kanban_gauge_templates.xml similarity index 88% rename from addons/web_kanban_gauge/views/web_kanban_gauge.xml rename to addons/web_kanban_gauge/views/web_kanban_gauge_templates.xml index d524bddc551..93ac6cf2653 100644 --- a/addons/web_kanban_gauge/views/web_kanban_gauge.xml +++ b/addons/web_kanban_gauge/views/web_kanban_gauge_templates.xml @@ -1,10 +1,8 @@ - - + - - + From 65fbeb21f6d27068b0a598eb9c84eb35755249a7 Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Mon, 25 Jul 2016 10:03:23 +0200 Subject: [PATCH 08/12] [IMP] web_planner: remove openerp tags and add license --- addons/web_planner/__openerp__.py | 2 ++ addons/web_planner/models/__init__.py | 2 ++ addons/web_planner/models/web_planner.py | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/web_planner/__openerp__.py b/addons/web_planner/__openerp__.py index 2fb2b4406d3..a347a6b755c 100644 --- a/addons/web_planner/__openerp__.py +++ b/addons/web_planner/__openerp__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Planner', 'category': 'Extra Tools', diff --git a/addons/web_planner/models/__init__.py b/addons/web_planner/models/__init__.py index c00c0203d52..6ee384e9eb8 100644 --- a/addons/web_planner/models/__init__.py +++ b/addons/web_planner/models/__init__.py @@ -1,2 +1,4 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import web_planner diff --git a/addons/web_planner/models/web_planner.py b/addons/web_planner/models/web_planner.py index a0f14b15879..a8ba777ffa1 100644 --- a/addons/web_planner/models/web_planner.py +++ b/addons/web_planner/models/web_planner.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from urllib import urlencode -from openerp import api, models, fields +from odoo import api, models, fields class Planner(models.Model): From a32c1d3c8dfd3d4684f89a6181f3a093dde26ae6 Mon Sep 17 00:00:00 2001 From: fwi-odoo Date: Tue, 26 Jul 2016 12:06:35 +0200 Subject: [PATCH 09/12] [MIG] web_editor: migrate to new api --- addons/web_editor/__init__.py | 2 + addons/web_editor/__openerp__.py | 3 + addons/web_editor/controllers/__init__.py | 3 + addons/web_editor/controllers/main.py | 67 +++++++++---------- addons/web_editor/models/__init__.py | 2 + addons/web_editor/models/ir_attachment.py | 38 +++-------- addons/web_editor/models/ir_http.py | 10 +-- addons/web_editor/models/ir_qweb.py | 73 ++++++++------------- addons/web_editor/models/ir_translation.py | 10 +-- addons/web_editor/models/ir_ui_view.py | 72 +++++++++----------- addons/web_editor/models/test_models.py | 60 ++++++++--------- addons/web_editor/static/src/xml/editor.xml | 4 +- addons/web_editor/tests/__init__.py | 2 + addons/web_editor/tests/test_converter.py | 6 +- addons/web_editor/tests/test_ui.py | 7 +- addons/web_editor/views/iframe.xml | 4 +- addons/website/tests/test_views.py | 50 +++++++------- 17 files changed, 194 insertions(+), 219 deletions(-) diff --git a/addons/web_editor/__init__.py b/addons/web_editor/__init__.py index 03ab5da2fb6..d8b1dcd9413 100644 --- a/addons/web_editor/__init__.py +++ b/addons/web_editor/__init__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import controllers import models import tests diff --git a/addons/web_editor/__openerp__.py b/addons/web_editor/__openerp__.py index 69583b9f150..4b6cf3fcc8a 100644 --- a/addons/web_editor/__openerp__.py +++ b/addons/web_editor/__openerp__.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Web Editor', 'category': 'Hidden', diff --git a/addons/web_editor/controllers/__init__.py b/addons/web_editor/controllers/__init__.py index 8ee9bae18d9..f48716d3a69 100644 --- a/addons/web_editor/controllers/__init__.py +++ b/addons/web_editor/controllers/__init__.py @@ -1 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import main diff --git a/addons/web_editor/controllers/main.py b/addons/web_editor/controllers/main.py index fa891ee296c..324b3caf564 100644 --- a/addons/web_editor/controllers/main.py +++ b/addons/web_editor/controllers/main.py @@ -1,14 +1,17 @@ # -*- coding: utf-8 -*- -from openerp.http import request, STATIC_CACHE -from openerp import http -import json -import io -from PIL import Image, ImageFont, ImageDraw -from openerp import tools +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import cStringIO -import werkzeug.wrappers -import time +import io +import json import logging +import time +import werkzeug.wrappers +from PIL import Image, ImageFont, ImageDraw + +from odoo.http import request +from odoo import http, tools + logger = logging.getLogger(__name__) @@ -25,8 +28,6 @@ class Web_Editor(http.Controller): #------------------------------------------------------ @http.route('/web_editor/field/html', type='http', auth="user") def FieldTextHtml(self, model=None, res_id=None, field=None, callback=None, **kwargs): - cr, uid, context = request.cr, request.uid, request.context - kwargs.update( model=model, res_id=res_id, @@ -39,17 +40,16 @@ class Web_Editor(http.Controller): kwargs[k] = int(kwargs[k]) trans = dict( - lang=kwargs.get('lang', context.get('lang')), + lang=kwargs.get('lang', request.env.context.get('lang')), translatable=kwargs.get('translatable'), edit_translations=kwargs.get('edit_translations'), editable=kwargs.get('enable_editor')) - context.update(trans) kwargs.update(trans) record = None if model and kwargs.get('res_id'): - record = request.registry[model].browse(cr, uid, kwargs.get('res_id'), context) + record = request.env[model].with_context(trans).browse(kwargs.get('res_id')) kwargs.update(content=record and getattr(record, field) or "") @@ -141,23 +141,23 @@ class Web_Editor(http.Controller): # the upload argument doesn't allow us to access the files if more than # one file is uploaded, as upload references the first file # therefore we have to recover the files from the request object - Attachments = request.registry['ir.attachment'] # registry for the attachment table + Attachments = request.env['ir.attachment'] # registry for the attachment table uploads = [] message = None if not upload: # no image provided, storing the link and the image name name = url.split("/").pop() # recover filename - attachment_id = Attachments.create(request.cr, request.uid, { + attachment = Attachments.create({ 'name': name, 'type': 'url', 'url': url, 'public': True, 'res_model': 'ir.ui.view', - }, request.context) - uploads += Attachments.read(request.cr, request.uid, [attachment_id], ['name', 'mimetype', 'checksum', 'url'], request.context) + }) + uploads += attachment.read(['name', 'mimetype', 'checksum', 'url']) else: # images provided try: - attachment_ids = [] + attachments = request.env['ir.attachment'] for c_file in request.httprequest.files.getlist('upload'): data = c_file.read() try: @@ -172,15 +172,15 @@ class Web_Editor(http.Controller): except IOError, e: pass - attachment_id = Attachments.create(request.cr, request.uid, { + attachment = Attachments.create({ 'name': c_file.filename, 'datas': data.encode('base64'), 'datas_fname': c_file.filename, 'public': True, 'res_model': 'ir.ui.view', - }, request.context) - attachment_ids.append(attachment_id) - uploads += Attachments.read(request.cr, request.uid, attachment_ids, ['name', 'mimetype', 'checksum', 'url'], request.context) + }) + attachments += attachment + uploads += attachments.read(['name', 'mimetype', 'checksum', 'url']) except Exception, e: logger.exception("Failed to upload image to attachment") message = unicode(e) @@ -199,25 +199,26 @@ class Web_Editor(http.Controller): Returns a dict mapping attachments which would not be removed (if any) mapped to the views preventing their removal """ - cr, uid, context = request.cr, request.uid, request.context - Attachment = request.registry['ir.attachment'] - Views = request.registry['ir.ui.view'] + Attachment = attachments_to_remove = request.env['ir.attachment'] + Views = request.env['ir.ui.view'] - attachments_to_remove = [] # views blocking removal of the attachment removal_blocked_by = {} - for attachment in Attachment.browse(cr, uid, ids, context=context): + for attachment in Attachment.browse(ids): # in-document URLs are html-escaped, a straight search will not # find them url = tools.html_escape(attachment.local_url) - ids = Views.search(cr, uid, ["|", ('arch_db', 'like', '"%s"' % url), ('arch_db', 'like', "'%s'" % url)], context=context) + views = Views.search([ + "|", + ('arch_db', 'like', '"%s"' % url), + ('arch_db', 'like', "'%s'" % url) + ]) - if ids: - removal_blocked_by[attachment.id] = Views.read( - cr, uid, ids, ['name'], context=context) + if views: + removal_blocked_by[attachment.id] = views.read(['name']) else: - attachments_to_remove.append(attachment.id) + attachments_to_remove += attachment if attachments_to_remove: - Attachment.unlink(cr, uid, attachments_to_remove, context=context) + attachments_to_remove.unlink() return removal_blocked_by diff --git a/addons/web_editor/models/__init__.py b/addons/web_editor/models/__init__.py index e4dbfa5ad4f..feae3b90394 100644 --- a/addons/web_editor/models/__init__.py +++ b/addons/web_editor/models/__init__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import ir_attachment import ir_qweb import ir_ui_view diff --git a/addons/web_editor/models/ir_attachment.py b/addons/web_editor/models/ir_attachment.py index 135d82bc592..0c5f0e53de8 100644 --- a/addons/web_editor/models/ir_attachment.py +++ b/addons/web_editor/models/ir_attachment.py @@ -1,36 +1,18 @@ # -*- coding: utf-8 -*- -import openerp -from openerp.osv import osv, fields +# Part of Odoo. See LICENSE file for full copyright and licensing details. -import contextlib -from sys import maxint -from openerp.http import request -import datetime -import hashlib -import time -import os - -from openerp.tools import html_escape as escape, ustr, image_resize_and_sharpen, image_save_for_web -from PIL import Image -import cStringIO - -import logging -logger = logging.getLogger(__name__) +from odoo import api, models, fields -class ir_attachment(osv.osv): +class IrAttachment(models.Model): _inherit = "ir.attachment" - def _local_url_get(self, cr, uid, ids, name, arg, context=None): - result = {} - for attach in self.browse(cr, uid, ids, context=context): - if attach.url: - result[attach.id] = attach.url - else: - result[attach.id] = '/web/image/%s?unique=%s' % (attach.id, attach.checksum) - return result + local_url = fields.Char("Attachment URL", compute='_compute_local_url') - _columns = { - 'local_url': fields.function(_local_url_get, string="Attachment URL", type='char'), - } + @api.one + def _compute_local_url(self): + if self.url: + self.local_url = self.url + else: + self.local_url = '/web/image/%s?unique=%s' % (self.id, self.checksum) diff --git a/addons/web_editor/models/ir_http.py b/addons/web_editor/models/ir_http.py index c72fee55e83..238b488716e 100644 --- a/addons/web_editor/models/ir_http.py +++ b/addons/web_editor/models/ir_http.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- -from openerp.osv import orm -from openerp.http import request +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models +from odoo.http import request -class ir_http(orm.AbstractModel): +class IrHttp(models.AbstractModel): _inherit = 'ir.http' def _dispatch(self): @@ -13,4 +15,4 @@ class ir_http(orm.AbstractModel): request.context['edit_translations'] = True if request.context.get('lang') != "en_US" and 'translatable' not in request.context: request.context['translatable'] = True - return super(ir_http, self)._dispatch() + return super(IrHttp, self)._dispatch() diff --git a/addons/web_editor/models/ir_qweb.py b/addons/web_editor/models/ir_qweb.py index b1c0a165e44..ca16f9e86a9 100644 --- a/addons/web_editor/models/ir_qweb.py +++ b/addons/web_editor/models/ir_qweb.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + """ Web_editor-context rendering needs to add some metadata to rendered and allow to edit fields, as well as render a few fields differently. -Also, adds methods to convert values back to openerp models. +Also, adds methods to convert values back to Odoo models. """ import ast @@ -22,22 +24,19 @@ import pytz from dateutil import parser from lxml import etree, html from PIL import Image as I -import openerp.modules +import odoo.modules -from odoo import api - -import openerp -from openerp.osv import orm, fields -from openerp.tools import ustr, DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT -from openerp.tools import html_escape as escape -from openerp.addons.base.ir import ir_qweb +from odoo import api, models, fields +from odoo.tools import ustr +from odoo.tools import html_escape as escape +from odoo.addons.base.ir import ir_qweb REMOTE_CONNECTION_TIMEOUT = 2.5 logger = logging.getLogger(__name__) -class QWeb(orm.AbstractModel): +class QWeb(models.AbstractModel): """ QWeb object for rendering editor stuff """ _inherit = 'ir.qweb' @@ -69,7 +68,7 @@ class QWeb(orm.AbstractModel): #------------------------------------------------------ -class Field(orm.AbstractModel): +class Field(models.AbstractModel): _name = 'ir.qweb.field' _inherit = 'ir.qweb.field' @@ -98,14 +97,14 @@ class Field(orm.AbstractModel): return self.value_from_string(element.text_content().strip()) -class Integer(orm.AbstractModel): +class Integer(models.AbstractModel): _name = 'ir.qweb.field.integer' _inherit = 'ir.qweb.field.integer' value_from_string = int -class Float(orm.AbstractModel): +class Float(models.AbstractModel): _name = 'ir.qweb.field.float' _inherit = 'ir.qweb.field.float' @@ -117,7 +116,7 @@ class Float(orm.AbstractModel): .replace(lang.decimal_point, '.')) -class ManyToOne(orm.AbstractModel): +class ManyToOne(models.AbstractModel): _name = 'ir.qweb.field.many2one' _inherit = 'ir.qweb.field.many2one' @@ -146,7 +145,7 @@ class ManyToOne(orm.AbstractModel): return None -class Contact(orm.AbstractModel): +class Contact(models.AbstractModel): _name = 'ir.qweb.field.contact' _inherit = 'ir.qweb.field.contact' @@ -165,18 +164,7 @@ class Contact(orm.AbstractModel): return node and node.__html__() -def parse_fuzzy(in_format, value): - day_first = in_format.find('%d') < in_format.find('%m') - - if '%y' in in_format: - year_first = in_format.find('%y') < in_format.find('%d') - else: - year_first = in_format.find('%Y') < in_format.find('%d') - - return parser.parse(value, dayfirst=day_first, yearfirst=year_first) - - -class Date(orm.AbstractModel): +class Date(models.AbstractModel): _name = 'ir.qweb.field.date' _inherit = 'ir.qweb.field.date' @@ -192,11 +180,10 @@ class Date(orm.AbstractModel): if not value: return False - datetime.datetime.strptime(value, DEFAULT_SERVER_DATE_FORMAT) return value -class DateTime(orm.AbstractModel): +class DateTime(models.AbstractModel): _name = 'ir.qweb.field.datetime' _inherit = 'ir.qweb.field.datetime' @@ -205,13 +192,11 @@ class DateTime(orm.AbstractModel): attrs = super(DateTime, self).attributes(record, field_name, options, values) value = record[field_name] if isinstance(value, basestring): - value = datetime.datetime.strptime( - value, DEFAULT_SERVER_DATETIME_FORMAT) + value = fields.Datetime.from_string(value) if value: # convert from UTC (server timezone) to user timezone - value = fields.datetime.context_timestamp( - self._cr, self._uid, timestamp=value, context=self.env.context) - value = value.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + value = fields.Datetime.context_timestamp(self, timestamp=value) + value = fields.Datetime.to_string(value) attrs['data-oe-original'] = value return attrs @@ -240,10 +225,10 @@ class DateTime(orm.AbstractModel): exc_info=True) # format back to string - return dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + return fields.Datetime.to_string(dt) -class Text(orm.AbstractModel): +class Text(models.AbstractModel): _name = 'ir.qweb.field.text' _inherit = 'ir.qweb.field.text' @@ -252,7 +237,7 @@ class Text(orm.AbstractModel): return html_to_text(element) -class Selection(orm.AbstractModel): +class Selection(models.AbstractModel): _name = 'ir.qweb.field.selection' _inherit = 'ir.qweb.field.selection' @@ -270,7 +255,7 @@ class Selection(orm.AbstractModel): value, selection)) -class HTML(orm.AbstractModel): +class HTML(models.AbstractModel): _name = 'ir.qweb.field.html' _inherit = 'ir.qweb.field.html' @@ -284,7 +269,7 @@ class HTML(orm.AbstractModel): return '\n'.join(content) -class Image(orm.AbstractModel): +class Image(models.AbstractModel): """ Widget options: @@ -361,7 +346,7 @@ class Image(orm.AbstractModel): if sep and sep != '/': rest.replace(sep, '/') - path = openerp.modules.get_module_resource( + path = odoo.modules.get_module_resource( match.group('module'), 'static', *(rest.split('/'))) if not path: @@ -403,7 +388,7 @@ class Image(orm.AbstractModel): return out.getvalue().encode('base64') -class Monetary(orm.AbstractModel): +class Monetary(models.AbstractModel): _name = 'ir.qweb.field.monetary' _inherit = 'ir.qweb.field.monetary' @@ -417,7 +402,7 @@ class Monetary(orm.AbstractModel): .replace(lang.decimal_point, '.')) -class Duration(orm.AbstractModel): +class Duration(models.AbstractModel): _name = 'ir.qweb.field.duration' _inherit = 'ir.qweb.field.duration' @@ -435,14 +420,14 @@ class Duration(orm.AbstractModel): return float(value) -class RelativeDatetime(orm.AbstractModel): +class RelativeDatetime(models.AbstractModel): _name = 'ir.qweb.field.relative' _inherit = 'ir.qweb.field.relative' # get formatting from ir.qweb.field.relative but edition/save from datetime -class QwebView(orm.AbstractModel): +class QwebView(models.AbstractModel): _name = 'ir.qweb.field.qweb' _inherit = 'ir.qweb.field.qweb' diff --git a/addons/web_editor/models/ir_translation.py b/addons/web_editor/models/ir_translation.py index df56cf41011..0dedc93cc84 100644 --- a/addons/web_editor/models/ir_translation.py +++ b/addons/web_editor/models/ir_translation.py @@ -3,14 +3,16 @@ from lxml import etree -from openerp import models, api -from openerp.tools.translate import encode, xml_translate, html_translate +from odoo import models, api +from odoo.tools.translate import encode, xml_translate, html_translate + def edit_translation_mapping(data): data = dict(data, model=data['name'].partition(',')[0]) return '%(value)s' % data -class ir_translation(models.Model): + +class IrTranslation(models.Model): _inherit = 'ir.translation' @api.model @@ -18,7 +20,7 @@ class ir_translation(models.Model): if self._context.get('edit_translations'): self.insert_missing(field, records) return edit_translation_mapping - return super(ir_translation, self)._get_terms_mapping(field, records) + return super(IrTranslation, self)._get_terms_mapping(field, records) @api.multi def save_html(self, value): diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py index f770a40d980..bb6ff4b7411 100644 --- a/addons/web_editor/models/ir_ui_view.py +++ b/addons/web_editor/models/ir_ui_view.py @@ -1,40 +1,33 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import copy -import openerp -from openerp.exceptions import AccessError -from openerp.osv import osv from lxml import etree, html -from openerp import api + +from odoo.exceptions import AccessError +from odoo import api, models -class view(osv.osv): +class IrUiView(models.Model): _inherit = 'ir.ui.view' - @api.cr_uid_ids_context - def render(self, cr, uid, id_or_xml_id, values=None, engine='ir.qweb', context=None): - if isinstance(id_or_xml_id, list): - id_or_xml_id = id_or_xml_id[0] - if not values: - values = {} - if values.get('editable'): + @api.multi + def render(self, values=None, engine='ir.qweb'): + if values and values.get('editable'): try: - if not isinstance(id_or_xml_id, (int, long)): - if '.' not in id_or_xml_id: - raise ValueError('Invalid template id: %r' % (id_or_xml_id,)) - id_or_xml_id = self.get_view_id(cr, uid, id_or_xml_id, context=context) - self.check_access_rights(cr, uid, 'write') - self.check_access_rule(cr, uid, [id_or_xml_id], 'write', context=context) - + self.check_access_rights('write') + self.check_access_rule('write') except AccessError: values['editable'] = False - return super(view, self).render(cr, uid, id_or_xml_id, values=values, engine=engine, context=context) + return super(IrUiView, self).render(values=values, engine=engine) #------------------------------------------------------ # Save from html #------------------------------------------------------ - def extract_embedded_fields(self, cr, uid, arch, context=None): + @api.model + def extract_embedded_fields(self, arch): return arch.xpath('//*[@data-oe-model != "ir.ui.view"]') @api.model @@ -62,12 +55,12 @@ class view(osv.osv): return etree.tostring( arch_no_whitespace, encoding='unicode', pretty_print=True) - def replace_arch_section(self, cr, uid, view_id, section_xpath, replacement, context=None): + @api.multi + def replace_arch_section(self, section_xpath, replacement): # the root of the arch section shouldn't actually be replaced as it's # not really editable itself, only the content truly is editable. - - [view] = self.browse(cr, uid, [view_id], context=context) - arch = etree.fromstring(view.arch.encode('utf-8')) + self.ensure_one() + arch = etree.fromstring(self.arch.encode('utf-8')) # => get the replacement root if not section_xpath: root = arch @@ -84,7 +77,8 @@ class view(osv.osv): return arch - def to_field_ref(self, cr, uid, el, context=None): + @api.model + def to_field_ref(self, el): # filter out meta-information inserted in the document attributes = dict((k, v) for k, v in el.items() if not k.startswith('data-oe-')) @@ -94,34 +88,28 @@ class view(osv.osv): out.tail = el.tail return out - def save(self, cr, uid, res_id, value, xpath=None, context=None): + @api.multi + def save(self, value, xpath=None): """ Update a view section. The view section may embed fields to write - :param str model: - :param int res_id: :param str xpath: valid xpath to the tag to replace """ - res_id = int(res_id) - arch_section = html.fromstring( value, parser=html.HTMLParser(encoding='utf-8')) if xpath is None: # value is an embedded field on its own, not a view section - self.save_embedded_field(cr, uid, arch_section, context=context) + self.save_embedded_field(arch_section) return - for el in self.extract_embedded_fields(cr, uid, arch_section, context=context): - self.save_embedded_field(cr, uid, el, context=context) + for el in self.extract_embedded_fields(arch_section): + self.save_embedded_field(el) # transform embedded field back to t-field - el.getparent().replace(el, self.to_field_ref(cr, uid, el, context=context)) + el.getparent().replace(el, self.to_field_ref(el)) - arch = self.replace_arch_section(cr, uid, res_id, xpath, arch_section, context=context) - self.write(cr, uid, res_id, { - 'arch': self._pretty_arch(arch) - }, context=context) + for view in self: + arch = view.replace_arch_section(xpath, arch_section) + view.write({'arch': view._pretty_arch(arch)}) - view = self.browse(cr, openerp.SUPERUSER_ID, res_id, context=context) - if view.model_data_id: - view.model_data_id.write({'noupdate': True}) + self.sudo().mapped('model_data_id').write({'noupdate': True}) diff --git a/addons/web_editor/models/test_models.py b/addons/web_editor/models/test_models.py index 716e42a4dc3..c4ac2c748da 100644 --- a/addons/web_editor/models/test_models.py +++ b/addons/web_editor/models/test_models.py @@ -1,43 +1,41 @@ # -*- coding: utf-8 -*- -from openerp.osv import orm, fields +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models, fields -class test_converter(orm.Model): +class ConverterTest(models.Model): _name = 'web_editor.converter.test' # disable translation export for those brilliant field labels and values _translate = False - _columns = { - 'char': fields.char(), - 'integer': fields.integer(), - 'float': fields.float(), - 'numeric': fields.float(digits=(16, 2)), - 'many2one': fields.many2one('web_editor.converter.test.sub'), - 'binary': fields.binary(), - 'date': fields.date(), - 'datetime': fields.datetime(), - 'selection': fields.selection([ - (1, "réponse A"), - (2, "réponse B"), - (3, "réponse C"), - (4, "réponse "), - ]), - 'selection_str': fields.selection([ - ('A', "Qu'il n'est pas arrivé à Toronto"), - ('B', "Qu'il était supposé arriver à Toronto"), - ('C', "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?"), - ('D', "La réponse D"), - ], string=u"Lorsqu'un pancake prend l'avion à destination de Toronto et " - u"qu'il fait une escale technique à St Claude, on dit:"), - 'html': fields.html(), - 'text': fields.text(), - } + char = fields.Char() + integer = fields.Integer() + float = fields.Float() + numeric = fields.Float(digits=(16, 2)) + many2one = fields.Many2one('web_editor.converter.test.sub') + binary = fields.Binary() + date = fields.Date() + datetime = fields.Datetime() + selection = fields.Selection([ + (1, "réponse A"), + (2, "réponse B"), + (3, "réponse C"), + (4, "réponse "), + ]) + selection_str = fields.Selection([ + ('A', "Qu'il n'est pas arrivé à Toronto"), + ('B', "Qu'il était supposé arriver à Toronto"), + ('C', "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?"), + ('D', "La réponse D"), + ], string=u"Lorsqu'un pancake prend l'avion à destination de Toronto et " + u"qu'il fait une escale technique à St Claude, on dit:") + html = fields.Html() + text = fields.Text() -class test_converter_sub(orm.Model): +class ConverterTestSub(models.Model): _name = 'web_editor.converter.test.sub' - _columns = { - 'name': fields.char(), - } + name = fields.Char() diff --git a/addons/web_editor/static/src/xml/editor.xml b/addons/web_editor/static/src/xml/editor.xml index ff22af71f3d..138c84da6f0 100644 --- a/addons/web_editor/static/src/xml/editor.xml +++ b/addons/web_editor/static/src/xml/editor.xml @@ -110,7 +110,7 @@ — or —
- +
@@ -238,7 +238,7 @@ - +