diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 745df64a913..2303b6a68e8 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -42,6 +42,7 @@ This module provides the core of the OpenERP Web Client. "static/lib/py.js/lib/py.js", "static/src/js/boot.js", "static/src/js/testing.js", + "static/src/js/pyeval.js", "static/src/js/corelib.js", "static/src/js/coresetup.js", "static/src/js/dates.js", diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index def93c16ea4..3f35b3f44ea 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -31,7 +31,6 @@ import openerp from openerp.tools.translate import _ from .. import http -from .. import nonliterals openerpweb = http #---------------------------------------------------------- @@ -362,40 +361,15 @@ def set_cookie_and_redirect(req, redirect_url): redirect.set_cookie('instance0|session_id', cookie_val) return redirect -def eval_context_and_domain(session, context, domain=None): - e_context = session.eval_context(context) - # should we give the evaluated context as an evaluation context to the domain? - e_domain = session.eval_domain(domain or []) - - return e_context, e_domain - def load_actions_from_ir_values(req, key, key2, models, meta): - context = req.session.eval_context(req.context) Values = req.session.model('ir.values') - actions = Values.get(key, key2, models, meta, context) + actions = Values.get(key, key2, models, meta, req.context) - return [(id, name, clean_action(req, action, context)) + return [(id, name, clean_action(req, action)) for id, name, action in actions] -def clean_action(req, action, context, do_not_eval=False): +def clean_action(req, action): action.setdefault('flags', {}) - - context = context or {} - eval_ctx = req.session.evaluation_context(context) - - if not do_not_eval: - # values come from the server, we can just eval them - if action.get('context') and isinstance(action.get('context'), basestring): - action['context'] = eval( action['context'], eval_ctx ) or {} - - if action.get('domain') and isinstance(action.get('domain'), basestring): - action['domain'] = eval( action['domain'], eval_ctx ) or [] - else: - if 'context' in action: - action['context'] = parse_context(action['context'], req.session) - if 'domain' in action: - action['domain'] = parse_domain(action['domain'], req.session) - action_type = action.setdefault('type', 'ir.actions.act_window_close') if action_type == 'ir.actions.act_window': return fix_view_modes(action) @@ -474,39 +448,6 @@ def fix_view_modes(action): return action -def parse_domain(domain, session): - """ Parses an arbitrary string containing a domain, transforms it - to either a literal domain or a :class:`nonliterals.Domain` - - :param domain: the domain to parse, if the domain is not a string it - is assumed to be a literal domain and is returned as-is - :param session: Current OpenERP session - :type session: openerpweb.OpenERPSession - """ - if not isinstance(domain, basestring): - return domain - try: - return ast.literal_eval(domain) - except ValueError: - # not a literal - return nonliterals.Domain(session, domain) - -def parse_context(context, session): - """ Parses an arbitrary string containing a context, transforms it - to either a literal context or a :class:`nonliterals.Context` - - :param context: the context to parse, if the context is not a string it - is assumed to be a literal domain and is returned as-is - :param session: Current OpenERP session - :type session: openerpweb.OpenERPSession - """ - if not isinstance(context, basestring): - return context - try: - return ast.literal_eval(context) - except ValueError: - return nonliterals.Context(session, context) - def _local_web_translations(trans_file): messages = [] try: @@ -912,7 +853,7 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def sc_list(self, req): return req.session.model('ir.ui.view_sc').get_sc( - req.session._uid, "ir.ui.menu", req.session.eval_context(req.context)) + req.session._uid, "ir.ui.menu", req.context) @openerpweb.jsonrequest def get_lang_list(self, req): @@ -926,59 +867,6 @@ class Session(openerpweb.Controller): # return all installed modules. Web client is smart enough to not load a module twice return module_installed(req) - @openerpweb.jsonrequest - def eval_domain_and_context(self, req, contexts, domains, - group_by_seq=None): - """ Evaluates sequences of domains and contexts, composing them into - a single context, domain or group_by sequence. - - :param list contexts: list of contexts to merge together. Contexts are - evaluated in sequence, all previous contexts - are part of their own evaluation context - (starting at the session context). - :param list domains: list of domains to merge together. Domains are - evaluated in sequence and appended to one another - (implicit AND), their evaluation domain is the - result of merging all contexts. - :param list group_by_seq: list of domains (which may be in a different - order than the ``contexts`` parameter), - evaluated in sequence, their ``'group_by'`` - key is extracted if they have one. - :returns: - a 3-dict of: - - context (``dict``) - the global context created by merging all of - ``contexts`` - - domain (``list``) - the concatenation of all domains - - group_by (``list``) - a list of fields to group by, potentially empty (in which case - no group by should be performed) - """ - context, domain = eval_context_and_domain(req.session, - nonliterals.CompoundContext(*(contexts or [])), - nonliterals.CompoundDomain(*(domains or []))) - - group_by_sequence = [] - for candidate in (group_by_seq or []): - ctx = req.session.eval_context(candidate, context) - group_by = ctx.get('group_by') - if not group_by: - continue - elif isinstance(group_by, basestring): - group_by_sequence.append(group_by) - else: - group_by_sequence.extend(group_by) - - return { - 'context': context, - 'domain': domain, - 'group_by': group_by_sequence - } - @openerpweb.jsonrequest def save_session_action(self, req, the_action): """ @@ -1048,18 +936,19 @@ class Menu(openerpweb.Controller): :rtype: list(int) """ s = req.session - context = s.eval_context(req.context) Menus = s.model('ir.ui.menu') # If a menu action is defined use its domain to get the root menu items - user_menu_id = s.model('res.users').read([s._uid], ['menu_id'], context)[0]['menu_id'] + user_menu_id = s.model('res.users').read([s._uid], ['menu_id'], + req.context)[0]['menu_id'] menu_domain = [('parent_id', '=', False)] if user_menu_id: - domain_string = s.model('ir.actions.act_window').read([user_menu_id[0]], ['domain'], context)[0]['domain'] + domain_string = s.model('ir.actions.act_window').read( + [user_menu_id[0]], ['domain'],req.context)[0]['domain'] if domain_string: menu_domain = ast.literal_eval(domain_string) - return Menus.search(menu_domain, 0, False, False, context) + return Menus.search(menu_domain, 0, False, False, req.context) def do_load(self, req): """ Loads all menu items (all applications and their sub-menus). @@ -1069,23 +958,30 @@ class Menu(openerpweb.Controller): :return: the menu root :rtype: dict('children': menu_nodes) """ - context = req.session.eval_context(req.context) Menus = req.session.model('ir.ui.menu') - menu_roots = Menus.read(self.do_get_user_roots(req), ['name', 'sequence', 'parent_id', 'action', 'needaction_enabled', 'needaction_counter'], context) - menu_root = {'id': False, 'name': 'root', 'parent_id': [-1, ''], 'children' : menu_roots} + fields = ['name', 'sequence', 'parent_id', 'action', + 'needaction_enabled', 'needaction_counter'] + menu_roots = Menus.read(self.do_get_user_roots(req), fields, req.context) + menu_root = { + 'id': False, + 'name': 'root', + 'parent_id': [-1, ''], + 'children': menu_roots + } # menus are loaded fully unlike a regular tree view, cause there are a # limited number of items (752 when all 6.1 addons are installed) - menu_ids = Menus.search([], 0, False, False, context) - menu_items = Menus.read(menu_ids, ['name', 'sequence', 'parent_id', 'action', 'needaction_enabled', 'needaction_counter'], context) + menu_ids = Menus.search([], 0, False, False, req.context) + menu_items = Menus.read(menu_ids, fields, req.context) # adds roots at the end of the sequence, so that they will overwrite # equivalent menu items from full menu read when put into id:item # mapping, resulting in children being correctly set on the roots. menu_items.extend(menu_roots) # make a tree using parent_id - menu_items_map = dict((menu_item["id"], menu_item) for menu_item in menu_items) + menu_items_map = dict( + (menu_item["id"], menu_item) for menu_item in menu_items) for menu_item in menu_items: if menu_item['parent_id']: parent = menu_item['parent_id'][0] @@ -1135,12 +1031,10 @@ class DataSet(openerpweb.Controller): """ Model = req.session.model(model) - context, domain = eval_context_and_domain( - req.session, req.context, domain) - - ids = Model.search(domain, offset or 0, limit or False, sort or False, context) + ids = Model.search(domain, offset or 0, limit or False, sort or False, + req.context) if limit and len(ids) == limit: - length = Model.search_count(domain, context) + length = Model.search_count(domain, req.context) else: length = len(ids) + (offset or 0) if fields and fields == ['id']: @@ -1150,7 +1044,7 @@ class DataSet(openerpweb.Controller): 'records': [{'id': id} for id in ids] } - records = Model.read(ids, fields or False, context) + records = Model.read(ids, fields or False, req.context) records.sort(key=lambda obj: ids.index(obj['id'])) return { 'length': length, @@ -1161,37 +1055,15 @@ class DataSet(openerpweb.Controller): def load(self, req, model, id, fields): m = req.session.model(model) value = {} - r = m.read([id], False, req.session.eval_context(req.context)) + r = m.read([id], False, req.context) if r: value = r[0] return {'value': value} def call_common(self, req, model, method, args, domain_id=None, context_id=None): - has_domain = domain_id is not None and domain_id < len(args) - has_context = context_id is not None and context_id < len(args) - - domain = args[domain_id] if has_domain else [] - context = args[context_id] if has_context else {} - c, d = eval_context_and_domain(req.session, context, domain) - if has_domain: - args[domain_id] = d - if has_context: - args[context_id] = c - return self._call_kw(req, model, method, args, {}) - - def _call_kw(self, req, model, method, args, kwargs): - for i in xrange(len(args)): - if isinstance(args[i], nonliterals.BaseContext): - args[i] = req.session.eval_context(args[i]) - elif isinstance(args[i], nonliterals.BaseDomain): - args[i] = req.session.eval_domain(args[i]) - for k in kwargs.keys(): - if isinstance(kwargs[k], nonliterals.BaseContext): - kwargs[k] = req.session.eval_context(kwargs[k]) - elif isinstance(kwargs[k], nonliterals.BaseDomain): - kwargs[k] = req.session.eval_domain(kwargs[k]) + def _call_kw(self, req, model, method, args, kwargs): # Temporary implements future display_name special field for model#read() if method == 'read' and kwargs.get('context') and kwargs['context'].get('future_display_name'): if 'display_name' in args[1]: @@ -1204,39 +1076,9 @@ class DataSet(openerpweb.Controller): return getattr(req.session.model(model), method)(*args, **kwargs) - @openerpweb.jsonrequest - def onchange(self, req, model, method, args, context_id=None): - """ Support method for handling onchange calls: behaves much like call - with the following differences: - - * Does not take a domain_id - * Is aware of the return value's structure, and will parse the domains - if needed in order to return either parsed literal domains (in JSON) - or non-literal domain instances, allowing those domains to be used - from JS - - :param req: - :type req: web.common.http.JsonRequest - :param str model: object type on which to call the method - :param str method: name of the onchange handler method - :param list args: arguments to call the onchange handler with - :param int context_id: index of the context object in the list of - arguments - :return: result of the onchange call with all domains parsed - """ - result = self.call_common(req, model, method, args, context_id=context_id) - if not result or 'domain' not in result: - return result - - result['domain'] = dict( - (k, parse_domain(v, req.session)) - for k, v in result['domain'].iteritems()) - - return result - @openerpweb.jsonrequest def call(self, req, model, method, args, domain_id=None, context_id=None): - return self.call_common(req, model, method, args, domain_id, context_id) + return self._call_kw(req, model, method, args, {}) @openerpweb.jsonrequest def call_kw(self, req, model, method, args, kwargs): @@ -1244,10 +1086,9 @@ class DataSet(openerpweb.Controller): @openerpweb.jsonrequest def call_button(self, req, model, method, args, domain_id=None, context_id=None): - context = req.session.eval_context(req.context) - action = self.call_common(req, model, method, args, domain_id, context_id) + action = self._call_kw(req, model, method, args, {}) if isinstance(action, dict) and action.get('type') != '': - return clean_action(req, action, context) + return clean_action(req, action) return False @openerpweb.jsonrequest @@ -1283,12 +1124,9 @@ class View(openerpweb.Controller): def fields_view_get(self, req, model, view_id, view_type, transform=True, toolbar=False, submenu=False): Model = req.session.model(model) - context = req.session.eval_context(req.context) - fvg = Model.fields_view_get(view_id, view_type, context, toolbar, submenu) + fvg = Model.fields_view_get(view_id, view_type, req.context, toolbar, submenu) # todo fme?: check that we should pass the evaluated context here - self.process_view(req.session, fvg, context, transform, (view_type == 'kanban')) - if toolbar and transform: - self.process_toolbar(req, fvg['toolbar']) + self.process_view(req.session, fvg, req.context, transform, (view_type == 'kanban')) return fvg def process_view(self, session, fvg, context, transform, preserve_whitespaces=False): @@ -1305,12 +1143,8 @@ class View(openerpweb.Controller): arch = fvg['arch'] fvg['arch_string'] = arch - if transform: - evaluation_context = session.evaluation_context(context or {}) - xml = self.transform_view(arch, session, evaluation_context) - else: - xml = ElementTree.fromstring(arch) - fvg['arch'] = xml2json_from_elementtree(xml, preserve_whitespaces) + fvg['arch'] = xml2json_from_elementtree( + ElementTree.fromstring(arch), preserve_whitespaces) if 'id' in fvg['fields']: # Special case for id's @@ -1319,29 +1153,8 @@ class View(openerpweb.Controller): id_field['type'] = 'id' for field in fvg['fields'].itervalues(): - if field.get('views'): - for view in field["views"].itervalues(): - self.process_view(session, view, None, transform) - if field.get('domain'): - field["domain"] = parse_domain(field["domain"], session) - if field.get('context'): - field["context"] = parse_context(field["context"], session) - - def process_toolbar(self, req, toolbar): - """ - The toolbar is a mapping of section_key: [action_descriptor] - - We need to clean all those actions in order to ensure correct - round-tripping - """ - for actions in toolbar.itervalues(): - for action in actions: - if 'context' in action: - action['context'] = parse_context( - action['context'], req.session) - if 'domain' in action: - action['domain'] = parse_domain( - action['domain'], req.session) + for view in field.get("views", {}).itervalues(): + self.process_view(session, view, None, transform) @openerpweb.jsonrequest def add_custom(self, req, view_id, arch): @@ -1350,57 +1163,22 @@ class View(openerpweb.Controller): 'user_id': req.session._uid, 'ref_id': view_id, 'arch': arch - }, req.session.eval_context(req.context)) + }, req.context) return {'result': True} @openerpweb.jsonrequest def undo_custom(self, req, view_id, reset=False): CustomView = req.session.model('ir.ui.view.custom') - context = req.session.eval_context(req.context) vcustom = CustomView.search([('user_id', '=', req.session._uid), ('ref_id' ,'=', view_id)], - 0, False, False, context) + 0, False, False, req.context) if vcustom: if reset: - CustomView.unlink(vcustom, context) + CustomView.unlink(vcustom, req.context) else: - CustomView.unlink([vcustom[0]], context) + CustomView.unlink([vcustom[0]], req.context) return {'result': True} return {'result': False} - def transform_view(self, view_string, session, context=None): - # transform nodes on the fly via iterparse, instead of - # doing it statically on the parsing result - parser = ElementTree.iterparse(StringIO(view_string), events=("start",)) - root = None - for event, elem in parser: - if event == "start": - if root is None: - root = elem - self.parse_domains_and_contexts(elem, session) - return root - - def parse_domains_and_contexts(self, elem, session): - """ Converts domains and contexts from the view into Python objects, - either literals if they can be parsed by literal_eval or a special - placeholder object if the domain or context refers to free variables. - - :param elem: the current node being parsed - :type param: xml.etree.ElementTree.Element - :param session: OpenERP session object, used to store and retrieve - non-literal objects - :type session: openerpweb.openerpweb.OpenERPSession - """ - for el in ['domain', 'filter_domain']: - domain = elem.get(el, '').strip() - if domain: - elem.set(el, parse_domain(domain, session)) - elem.set(el + '_string', domain) - for el in ['context', 'default_get']: - context_string = elem.get(el, '').strip() - if context_string: - elem.set(el, parse_context(context_string, session)) - elem.set(el + '_string', context_string) - @openerpweb.jsonrequest def load(self, req, model, view_id, view_type, toolbar=False): return self.fields_view_get(req, model, view_id, view_type, toolbar=toolbar) @@ -1414,50 +1192,6 @@ class TreeView(View): req,'action', 'tree_but_open',[(model, id)], False) -class SearchView(View): - _cp_path = "/web/searchview" - - @openerpweb.jsonrequest - def load(self, req, model, view_id): - fields_view = self.fields_view_get(req, model, view_id, 'search') - return {'fields_view': fields_view} - - @openerpweb.jsonrequest - def fields_get(self, req, model): - Model = req.session.model(model) - fields = Model.fields_get(False, req.session.eval_context(req.context)) - for field in fields.values(): - # shouldn't convert the views too? - if field.get('domain'): - field["domain"] = parse_domain(field["domain"], req.session) - if field.get('context'): - field["context"] = parse_context(field["context"], req.session) - return {'fields': fields} - - @openerpweb.jsonrequest - def get_filters(self, req, model): - logger = logging.getLogger(__name__ + '.SearchView.get_filters') - Model = req.session.model("ir.filters") - filters = Model.get_filters(model) - for filter in filters: - try: - parsed_context = parse_context(filter["context"], req.session) - filter["context"] = (parsed_context - if not isinstance(parsed_context, nonliterals.BaseContext) - else req.session.eval_context(parsed_context)) - - parsed_domain = parse_domain(filter["domain"], req.session) - filter["domain"] = (parsed_domain - if not isinstance(parsed_domain, nonliterals.BaseDomain) - else req.session.eval_domain(parsed_domain)) - except Exception: - logger.exception(_("Failed to parse custom filter %s in %s"), - filter['name'], model) - filter['disabled'] = True - del filter['context'] - del filter['domain'] - return filters - class Binary(openerpweb.Controller): _cp_path = "/web/binary" @@ -1465,7 +1199,6 @@ class Binary(openerpweb.Controller): def image(self, req, model, id, field, **kw): last_update = '__last_update' Model = req.session.model(model) - context = req.session.eval_context(req.context) headers = [('Content-Type', 'image/png')] etag = req.httprequest.headers.get('If-None-Match') hashed_session = hashlib.md5(req.session_id).hexdigest() @@ -1476,22 +1209,22 @@ class Binary(openerpweb.Controller): if not id and hashed_session == etag: return werkzeug.wrappers.Response(status=304) else: - date = Model.read([id], [last_update], context)[0].get(last_update) + date = Model.read([id], [last_update], req.context)[0].get(last_update) if hashlib.md5(date).hexdigest() == etag: return werkzeug.wrappers.Response(status=304) retag = hashed_session try: if not id: - res = Model.default_get([field], context).get(field) + res = Model.default_get([field], req.context).get(field) image_base64 = res else: - res = Model.read([id], [last_update, field], context)[0] + res = Model.read([id], [last_update, field], req.context)[0] retag = hashlib.md5(res.get(last_update)).hexdigest() image_base64 = res.get(field) if kw.get('resize'): - resize = kw.get('resize').split(','); + resize = kw.get('resize').split(',') if len(resize) == 2 and int(resize[0]) and int(resize[1]): width = int(resize[0]) height = int(resize[1]) @@ -1533,14 +1266,13 @@ class Binary(openerpweb.Controller): :returns: :class:`werkzeug.wrappers.Response` """ Model = req.session.model(model) - context = req.session.eval_context(req.context) fields = [field] if filename_field: fields.append(filename_field) if id: - res = Model.read([int(id)], fields, context)[0] + res = Model.read([int(id)], fields, req.context)[0] else: - res = Model.default_get(fields, context) + res = Model.default_get(fields, req.context) filecontent = base64.b64decode(res.get(field, '')) if not filecontent: return req.not_found() @@ -1559,9 +1291,8 @@ class Binary(openerpweb.Controller): field = jdata['field'] id = jdata.get('id', None) filename_field = jdata.get('filename_field', None) - context = jdata.get('context', dict()) + context = jdata.get('context', {}) - context = req.session.eval_context(context) Model = req.session.model(model) fields = [field] if filename_field: @@ -1600,7 +1331,6 @@ class Binary(openerpweb.Controller): @openerpweb.httprequest def upload_attachment(self, req, callback, model, id, ufile): - context = req.session.eval_context(req.context) Model = req.session.model('ir.attachment') try: out = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + diff --git a/addons/web/tests/__init__.py b/addons/web/tests/__init__.py index 8cb2118e0b6..d7abb8e5a8c 100644 --- a/addons/web/tests/__init__.py +++ b/addons/web/tests/__init__.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- -from . import test_dataset, test_menu, test_serving_base, test_view, test_js +from . import test_dataset, test_menu, test_serving_base, test_js fast_suite = [] checks = [ test_dataset, test_menu, test_serving_base, - test_view, ] diff --git a/addons/web/tests/test_dataset.py b/addons/web/tests/test_dataset.py index 1169ff5f0b9..a6faf9e6df1 100644 --- a/addons/web/tests/test_dataset.py +++ b/addons/web/tests/test_dataset.py @@ -18,14 +18,14 @@ class TestDataSetController(unittest2.TestCase): self.dataset.do_search_read(self.request, 'fake.model'), {'records': [], 'length': 0}) self.read.assert_called_once_with( - [], False, self.request.session.eval_context()) + [], False, self.request.context) def test_regular_find(self): self.search.return_value = [1, 2, 3] self.dataset.do_search_read(self.request, 'fake.model') self.read.assert_called_once_with( - [1, 2, 3], False,self.request.session.eval_context()) + [1, 2, 3], False,self.request.context) def test_ids_shortcut(self): self.search.return_value = [1, 2, 3] diff --git a/addons/web/tests/test_menu.py b/addons/web/tests/test_menu.py index c5e1b948b67..75d1d009408 100644 --- a/addons/web/tests/test_menu.py +++ b/addons/web/tests/test_menu.py @@ -4,7 +4,6 @@ import mock import unittest2 from ..controllers import main -from ..session import OpenERPSession class Placeholder(object): def __init__(self, **kwargs): @@ -40,11 +39,11 @@ class LoadTest(unittest2.TestCase): root = self.menu.do_load(self.request) self.MockMenus.search.assert_called_with( - [], 0, False, False, self.request.session.eval_context()) + [], 0, False, False, self.request.context) self.MockMenus.read.assert_called_with( [], ['name', 'sequence', 'parent_id', 'action', 'needaction_enabled', 'needaction_counter'], - self.request.session.eval_context()) + self.request.context) self.assertListEqual( root['children'], @@ -63,7 +62,7 @@ class LoadTest(unittest2.TestCase): self.MockMenus.read.assert_called_with( [1, 2, 3], ['name', 'sequence', 'parent_id', 'action', 'needaction_enabled', 'needaction_counter'], - self.request.session.eval_context()) + self.request.context) self.assertEqual( root['children'], diff --git a/addons/web/tests/test_view.py b/addons/web/tests/test_view.py deleted file mode 100644 index 51377099558..00000000000 --- a/addons/web/tests/test_view.py +++ /dev/null @@ -1,128 +0,0 @@ -import copy -import xml.etree.ElementTree -import mock - -import unittest2 -import simplejson - -import openerp.addons.web.controllers.main -from .. import nonliterals, session as s - -def field_attrs(fields_view_get, fieldname): - (field,) = filter(lambda f: f['attrs'].get('name') == fieldname, - fields_view_get['arch']['children']) - return field['attrs'] - -#noinspection PyCompatibility -class DomainsAndContextsTest(unittest2.TestCase): - def setUp(self): - self.view = openerp.addons.web.controllers.main.View() - - def test_convert_literal_domain(self): - e = xml.etree.ElementTree.Element( - 'field', domain=" [('somefield', '=', 3)] ") - self.view.parse_domains_and_contexts(e, None) - - self.assertEqual( - e.get('domain'), - [('somefield', '=', 3)]) - - def test_convert_complex_domain(self): - e = xml.etree.ElementTree.Element( - 'field', - domain="[('account_id.type','in',['receivable','payable'])," - "('reconcile_id','=',False)," - "('reconcile_partial_id','=',False)," - "('state', '=', 'valid')]" - ) - self.view.parse_domains_and_contexts(e, None) - - self.assertEqual( - e.get('domain'), - [('account_id.type', 'in', ['receivable', 'payable']), - ('reconcile_id', '=', False), - ('reconcile_partial_id', '=', False), - ('state', '=', 'valid')] - ) - - def test_retrieve_nonliteral_domain(self): - session = mock.Mock(spec=s.OpenERPSession) - session.domains_store = {} - domain_string = ("[('month','=',(datetime.date.today() - " - "datetime.timedelta(365/12)).strftime('%%m'))]") - e = xml.etree.ElementTree.Element( - 'field', domain=domain_string) - - self.view.parse_domains_and_contexts(e, session) - - self.assertIsInstance(e.get('domain'), nonliterals.Domain) - self.assertEqual( - nonliterals.Domain( - session, key=e.get('domain').key).get_domain_string(), - domain_string) - - def test_convert_literal_context(self): - e = xml.etree.ElementTree.Element( - 'field', context=" {'some_prop': 3} ") - self.view.parse_domains_and_contexts(e, None) - - self.assertEqual( - e.get('context'), - {'some_prop': 3}) - - def test_convert_complex_context(self): - e = xml.etree.ElementTree.Element( - 'field', - context="{'account_id.type': ['receivable','payable']," - "'reconcile_id': False," - "'reconcile_partial_id': False," - "'state': 'valid'}" - ) - self.view.parse_domains_and_contexts(e, None) - - self.assertEqual( - e.get('context'), - {'account_id.type': ['receivable', 'payable'], - 'reconcile_id': False, - 'reconcile_partial_id': False, - 'state': 'valid'} - ) - - def test_retrieve_nonliteral_context(self): - session = mock.Mock(spec=s.OpenERPSession) - session.contexts_store = {} - context_string = ("{'month': (datetime.date.today() - " - "datetime.timedelta(365/12)).strftime('%%m')}") - e = xml.etree.ElementTree.Element( - 'field', context=context_string) - - self.view.parse_domains_and_contexts(e, session) - - self.assertIsInstance(e.get('context'), nonliterals.Context) - self.assertEqual( - nonliterals.Context( - session, key=e.get('context').key).get_context_string(), - context_string) - -class AttrsNormalizationTest(unittest2.TestCase): - def setUp(self): - self.view = openerp.addons.web.controllers.main.View() - - def test_identity(self): - web_view = """ -
- - - - - - - """ - - pristine = xml.etree.ElementTree.fromstring(web_view) - transformed = self.view.transform_view(web_view, None) - - self.assertEqual( - xml.etree.ElementTree.tostring(transformed), - xml.etree.ElementTree.tostring(pristine) - ) diff --git a/addons/web_calendar/i18n/es_EC.po b/addons/web_calendar/i18n/es_EC.po index a5a1fe9638f..312e325e79c 100644 --- a/addons/web_calendar/i18n/es_EC.po +++ b/addons/web_calendar/i18n/es_EC.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_calendar #. openerp-web diff --git a/addons/web_calendar/i18n/es_MX.po b/addons/web_calendar/i18n/es_MX.po new file mode 100644 index 00000000000..6663a170261 --- /dev/null +++ b/addons/web_calendar/i18n/es_MX.po @@ -0,0 +1,203 @@ +# Spanish (Mexico) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 15:51+0000\n" +"Last-Translator: OscarAlca \n" +"Language-Team: Spanish (Mexico) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:151 +#, python-format +msgid "New event" +msgstr "Nuevo evento" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:154 +#, python-format +msgid "Details" +msgstr "Más" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:152 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:147 +#, python-format +msgid "Today" +msgstr "Hoy" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:149 +#, python-format +msgid "Week" +msgstr "Semana" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:161 +#, python-format +msgid "Full day" +msgstr "Día completo" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:159 +#: code:addons/web_calendar/static/src/js/calendar.js:172 +#, python-format +msgid "Description" +msgstr "Descripción" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:158 +#, python-format +msgid "Event will be deleted permanently, are you sure?" +msgstr "¿El evento sera eliminado permanentemente, esta seguro?" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/xml/web_calendar.xml:8 +#: code:addons/web_calendar/static/src/xml/web_calendar.xml:9 +#, python-format +msgid " " +msgstr " " + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:171 +#, python-format +msgid "Date" +msgstr "Fecha" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:468 +#, python-format +msgid "Edit: " +msgstr "Editar: " + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:148 +#, python-format +msgid "Day" +msgstr "Día" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:155 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:167 +#, python-format +msgid "Enabled" +msgstr "Habilitado" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:164 +#, python-format +msgid "Do you want to edit the whole set of repeated events?" +msgstr "¿Quiere editar todos los eventos repetidos?" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:80 +#, python-format +msgid "Filter" +msgstr "Filtro" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:165 +#, python-format +msgid "Repeat event" +msgstr "Repetir evento" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:170 +#: code:addons/web_calendar/static/src/js/calendar.js:178 +#, python-format +msgid "Agenda" +msgstr "Agenda" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:160 +#, python-format +msgid "Time period" +msgstr "Periodo de tiempo" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:156 +#, python-format +msgid "Delete" +msgstr "Borrar" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:150 +#, python-format +msgid "Month" +msgstr "Mes" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:166 +#, python-format +msgid "Disabled" +msgstr "Deshabilitado/a" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:433 +#, python-format +msgid "Create: " +msgstr "Crear: " + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:175 +#, python-format +msgid "Year" +msgstr "Año" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:153 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: web_calendar +#. openerp-web +#: code:addons/web_calendar/static/src/js/calendar.js:28 +#, python-format +msgid "Calendar" +msgstr "Calendario" diff --git a/addons/web_calendar/i18n/fa.po b/addons/web_calendar/i18n/fa.po index d0ec75941c4..1249c9a5238 100644 --- a/addons/web_calendar/i18n/fa.po +++ b/addons/web_calendar/i18n/fa.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_calendar #. openerp-web diff --git a/addons/web_diagram/i18n/es_MX.po b/addons/web_diagram/i18n/es_MX.po new file mode 100644 index 00000000000..94797d3d364 --- /dev/null +++ b/addons/web_diagram/i18n/es_MX.po @@ -0,0 +1,104 @@ +# Spanish (Mexico) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 15:54+0000\n" +"Last-Translator: OscarAlca \n" +"Language-Team: Spanish (Mexico) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:254 +#: code:addons/web_diagram/static/src/js/diagram.js:319 +#, python-format +msgid "Open: " +msgstr "Abrir: " + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:217 +#, python-format +msgid "" +"Deleting this node cannot be undone.\n" +"It will also delete all connected transitions.\n" +"\n" +"Are you sure ?" +msgstr "" +"Eliminar este nodo no puede ser revertido.\n" +"También eliminara todas las transisiones conectadas." + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13 +#, python-format +msgid "New Node" +msgstr "Nuevo Nodo" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:312 +#: code:addons/web_diagram/static/src/js/diagram.js:331 +#, python-format +msgid "Transition" +msgstr "Transición" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:11 +#, python-format +msgid "Diagram" +msgstr "Diagrama" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:246 +#: code:addons/web_diagram/static/src/js/diagram.js:280 +#, python-format +msgid "Activity" +msgstr "Actividad" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:422 +#, python-format +msgid "%d / %d" +msgstr "%d / %d" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:285 +#: code:addons/web_diagram/static/src/js/diagram.js:337 +#, python-format +msgid "Create:" +msgstr "Crear:" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:187 +#, python-format +msgid "Are you sure?" +msgstr "¿Está Seguro?" + +#. module: web_diagram +#. openerp-web +#: code:addons/web_diagram/static/src/js/diagram.js:235 +#, python-format +msgid "" +"Deleting this transition cannot be undone.\n" +"\n" +"Are you sure ?" +msgstr "" +"Eliminar esta transision no puede ser revertido.\n" +"\n" +"¿Está seguro?" diff --git a/addons/web_diagram/i18n/fa.po b/addons/web_diagram/i18n/fa.po index 30e2ab40dc3..6fc9cf7d9e2 100644 --- a/addons/web_diagram/i18n/fa.po +++ b/addons/web_diagram/i18n/fa.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_diagram #. openerp-web diff --git a/addons/web_gantt/i18n/es_MX.po b/addons/web_gantt/i18n/es_MX.po new file mode 100644 index 00000000000..a54ad0629df --- /dev/null +++ b/addons/web_gantt/i18n/es_MX.po @@ -0,0 +1,32 @@ +# Spanish (Mexico) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 15:54+0000\n" +"Last-Translator: OscarAlca \n" +"Language-Team: Spanish (Mexico) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_gantt +#. openerp-web +#: code:addons/web_gantt/static/src/xml/web_gantt.xml:10 +#, python-format +msgid "Create" +msgstr "Crear" + +#. module: web_gantt +#. openerp-web +#: code:addons/web_gantt/static/src/js/gantt.js:11 +#, python-format +msgid "Gantt" +msgstr "Gantt" diff --git a/addons/web_gantt/i18n/fa.po b/addons/web_gantt/i18n/fa.po index 47163d22562..a1928179ead 100644 --- a/addons/web_gantt/i18n/fa.po +++ b/addons/web_gantt/i18n/fa.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_gantt #. openerp-web diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 627942d0dbc..ebbf04926ed 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -22,10 +22,11 @@ instance.web_gantt.GanttView = instance.web.View.extend({ var self = this; this.fields_view = fields_view_get; this.$el.addClass(this.fields_view.arch.attrs['class']); - return this.rpc("/web/searchview/fields_get", {"model": this.dataset.model}).then(function(fields_get) { - self.fields = fields_get.fields; - self.has_been_loaded.resolve(); - }); + return new instance.web.Model(this.dataset.model) + .call('fields_get').then(function (fields) { + self.fields = fields; + self.has_been_loaded.resolve(); + }); }, do_search: function (domains, contexts, group_bys) { var self = this; diff --git a/addons/web_graph/i18n/es_EC.po b/addons/web_graph/i18n/es_EC.po index 09d0ae48cd2..e7d8aa1cf38 100644 --- a/addons/web_graph/i18n/es_EC.po +++ b/addons/web_graph/i18n/es_EC.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_graph #. openerp-web diff --git a/addons/web_graph/i18n/es_MX.po b/addons/web_graph/i18n/es_MX.po new file mode 100644 index 00000000000..d264632a762 --- /dev/null +++ b/addons/web_graph/i18n/es_MX.po @@ -0,0 +1,137 @@ +# Spanish (Mexico) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 15:57+0000\n" +"Last-Translator: OscarAlca \n" +"Language-Team: Spanish (Mexico) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:12 +#, python-format +msgid "Bars" +msgstr "Barras" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:33 +#, python-format +msgid "Show Data" +msgstr "Mostrar Datos" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/js/graph.js:22 +#, python-format +msgid "Graph" +msgstr "Gráfico" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:25 +#, python-format +msgid "Inside" +msgstr "Dentro de" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:3 +#, python-format +msgid "í" +msgstr "í" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:11 +#, python-format +msgid "Pie" +msgstr "Pastel" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:28 +#, python-format +msgid "Actions" +msgstr "Acciones" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:7 +#, python-format +msgid "Graph Mode" +msgstr "Modo de gráfico" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:18 +#, python-format +msgid "Radar" +msgstr "Radar" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:34 +#, python-format +msgid "Download as PNG" +msgstr "Descargando como PNG" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:26 +#, python-format +msgid "Top" +msgstr "Arriba" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:24 +#, python-format +msgid "Hidden" +msgstr "Oculto" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:3 +#, python-format +msgid "Graph Options" +msgstr "Opciones del gráfico" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:14 +#, python-format +msgid "Lines" +msgstr "Líneas" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:20 +#, python-format +msgid "Legend" +msgstr "Leyenda:" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:32 +#, python-format +msgid "Switch Axis" +msgstr "Cambiar Eje" + +#. module: web_graph +#. openerp-web +#: code:addons/web_graph/static/src/xml/web_graph.xml:15 +#, python-format +msgid "Areas" +msgstr "Areas" diff --git a/addons/web_graph/i18n/fa.po b/addons/web_graph/i18n/fa.po index cadb3252155..b3a7d0fc236 100644 --- a/addons/web_graph/i18n/fa.po +++ b/addons/web_graph/i18n/fa.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_graph #. openerp-web diff --git a/addons/web_kanban/i18n/es_MX.po b/addons/web_kanban/i18n/es_MX.po new file mode 100644 index 00000000000..ae2dbe088dd --- /dev/null +++ b/addons/web_kanban/i18n/es_MX.po @@ -0,0 +1,146 @@ +# Spanish (Mexico) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 15:59+0000\n" +"Last-Translator: OscarAlca \n" +"Language-Team: Spanish (Mexico) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:697 +#, python-format +msgid "Edit column" +msgstr "Editar columna" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:70 +#, python-format +msgid "Show more... (" +msgstr "Mostrar más... (" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:10 +#, python-format +msgid "Kanban" +msgstr "Kanban" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:551 +#, python-format +msgid "Undefined" +msgstr "Sin definir" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:716 +#, python-format +msgid "Are you sure to remove this column ?" +msgstr "¿Está seguro de querer eliminar esta columna?" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:42 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:188 +#, python-format +msgid "Add column" +msgstr "Añadir columna" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:1090 +#, python-format +msgid "Create: " +msgstr "Crear: " + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:24 +#, python-format +msgid "Add a new column" +msgstr "Añadir una nueva columna" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:687 +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:40 +#, python-format +msgid "Fold" +msgstr "Doblar" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:88 +#, python-format +msgid "Add" +msgstr "Agregar" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:35 +#, python-format +msgid "Quick create" +msgstr "Creación rapida" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:687 +#, python-format +msgid "Unfold" +msgstr "Desplegar" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:89 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:70 +#, python-format +msgid "remaining)" +msgstr "restante)" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:22 +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:88 +#, python-format +msgid "or" +msgstr "ó" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/js/kanban.js:928 +#, python-format +msgid "Are you sure you want to delete this record ?" +msgstr "¿Está seguro que quiere eliminar este registro?" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:43 +#, python-format +msgid "Delete" +msgstr "Borrar" diff --git a/addons/web_kanban/i18n/fa.po b/addons/web_kanban/i18n/fa.po index e2dffe99e8c..3968d0f1a0e 100644 --- a/addons/web_kanban/i18n/fa.po +++ b/addons/web_kanban/i18n/fa.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_kanban #. openerp-web diff --git a/addons/web_kanban/i18n/zh_CN.po b/addons/web_kanban/i18n/zh_CN.po index 8d0448e0720..3544cddc944 100644 --- a/addons/web_kanban/i18n/zh_CN.po +++ b/addons/web_kanban/i18n/zh_CN.po @@ -8,21 +8,29 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-24 01:23+0000\n" -"PO-Revision-Date: 2012-02-10 08:25+0000\n" -"Last-Translator: 开阖软件 Jeff Wang \n" +"PO-Revision-Date: 2012-11-28 07:30+0000\n" +"Last-Translator: youring \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-25 06:42+0000\n" -"X-Generator: Launchpad (build 16293)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_kanban +#. openerp-web +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:22 +#: code:addons/web_kanban/static/src/xml/web_kanban.xml:88 +#, python-format +msgid "or" +msgstr "or" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/js/kanban.js:697 #, python-format msgid "Edit column" -msgstr "" +msgstr "编辑列" #. module: web_kanban #. openerp-web @@ -50,35 +58,35 @@ msgstr "未定义" #: code:addons/web_kanban/static/src/js/kanban.js:716 #, python-format msgid "Are you sure to remove this column ?" -msgstr "" +msgstr "您确认要移除此列?" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/xml/web_kanban.xml:42 #, python-format msgid "Edit" -msgstr "" +msgstr "编辑" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/js/kanban.js:188 #, python-format msgid "Add column" -msgstr "" +msgstr "增加列" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/js/kanban.js:1090 #, python-format msgid "Create: " -msgstr "" +msgstr "创建: " #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/xml/web_kanban.xml:24 #, python-format msgid "Add a new column" -msgstr "" +msgstr "添加新列" #. module: web_kanban #. openerp-web @@ -86,35 +94,35 @@ msgstr "" #: code:addons/web_kanban/static/src/xml/web_kanban.xml:40 #, python-format msgid "Fold" -msgstr "" +msgstr "收拢" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/xml/web_kanban.xml:88 #, python-format msgid "Add" -msgstr "" +msgstr "添加" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/xml/web_kanban.xml:35 #, python-format msgid "Quick create" -msgstr "" +msgstr "快速创建" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/js/kanban.js:687 #, python-format msgid "Unfold" -msgstr "" +msgstr "展开" #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/xml/web_kanban.xml:89 #, python-format msgid "Cancel" -msgstr "" +msgstr "取消" #. module: web_kanban #. openerp-web @@ -123,14 +131,6 @@ msgstr "" msgid "remaining)" msgstr "剩下的)" -#. module: web_kanban -#. openerp-web -#: code:addons/web_kanban/static/src/xml/web_kanban.xml:22 -#: code:addons/web_kanban/static/src/xml/web_kanban.xml:88 -#, python-format -msgid "or" -msgstr "" - #. module: web_kanban #. openerp-web #: code:addons/web_kanban/static/src/js/kanban.js:928 @@ -143,7 +143,7 @@ msgstr "您确定要删除此记录吗?" #: code:addons/web_kanban/static/src/xml/web_kanban.xml:43 #, python-format msgid "Delete" -msgstr "" +msgstr "删除" #~ msgid "" #~ msgstr "" diff --git a/addons/web_view_editor/i18n/es_MX.po b/addons/web_view_editor/i18n/es_MX.po new file mode 100644 index 00000000000..8ff0b2a35db --- /dev/null +++ b/addons/web_view_editor/i18n/es_MX.po @@ -0,0 +1,149 @@ +# Spanish (Mexico) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 16:01+0000\n" +"Last-Translator: OscarAlca \n" +"Language-Team: Spanish (Mexico) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:396 +#, python-format +msgid "Preview" +msgstr "Vista Preliminar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:90 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:64 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:37 +#, python-format +msgid "Manage Views (%s)" +msgstr "Administrar vistas (%s)" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:14 +#, python-format +msgid "Could not find current view declaration" +msgstr "No se ha encontrado la declaración de la vista actual" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:382 +#, python-format +msgid "Inherited View" +msgstr "Vista Heredada" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:828 +#: code:addons/web_view_editor/static/src/js/view_editor.js:954 +#, python-format +msgid "Update" +msgstr "Actualizar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:65 +#, python-format +msgid "Remove" +msgstr "Eliminar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:825 +#: code:addons/web_view_editor/static/src/js/view_editor.js:951 +#, python-format +msgid "Properties" +msgstr "Propiedades" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:379 +#, python-format +msgid "View Editor %d - %s" +msgstr "Ver Editor %d - %s" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:386 +#, python-format +msgid "Do you really wants to create an inherited view here?" +msgstr "¿De verdad desea crear una vista heredada aquí?" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:13 +#, python-format +msgid "Manage Views" +msgstr "Administrar Vistas" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:112 +#: code:addons/web_view_editor/static/src/js/view_editor.js:846 +#: code:addons/web_view_editor/static/src/js/view_editor.js:974 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:66 +#: code:addons/web_view_editor/static/src/js/view_editor.js:413 +#, python-format +msgid "Close" +msgstr "Cerrar" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:516 +#, python-format +msgid "Do you really want to remove this node?" +msgstr "¿De verdad desea eliminar este nodo?" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:183 +#, python-format +msgid "Do you really want to remove this view?" +msgstr "¿De verdad desea eliminar esta vista?" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:63 +#, python-format +msgid "Create" +msgstr "Crear" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:88 +#, python-format +msgid "Create a view (%s)" +msgstr "Crear vista (%s)" diff --git a/addons/web_view_editor/i18n/fa.po b/addons/web_view_editor/i18n/fa.po index d9f992a76b8..e3a8a5804c0 100644 --- a/addons/web_view_editor/i18n/fa.po +++ b/addons/web_view_editor/i18n/fa.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-11-28 04:57+0000\n" -"X-Generator: Launchpad (build 16309)\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" #. module: web_view_editor #. openerp-web diff --git a/addons/web_view_editor/i18n/zh_CN.po b/addons/web_view_editor/i18n/zh_CN.po new file mode 100644 index 00000000000..2c3020c8bc2 --- /dev/null +++ b/addons/web_view_editor/i18n/zh_CN.po @@ -0,0 +1,149 @@ +# Chinese (Simplified) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 01:23+0000\n" +"PO-Revision-Date: 2012-11-28 06:44+0000\n" +"Last-Translator: youring \n" +"Language-Team: Chinese (Simplified) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-11-29 05:21+0000\n" +"X-Generator: Launchpad (build 16319)\n" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:396 +#, python-format +msgid "Preview" +msgstr "预览" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:90 +#, python-format +msgid "Save" +msgstr "保存" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:64 +#, python-format +msgid "Edit" +msgstr "编辑" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:37 +#, python-format +msgid "Manage Views (%s)" +msgstr "管理视图 (%s)" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:14 +#, python-format +msgid "Could not find current view declaration" +msgstr "" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:382 +#, python-format +msgid "Inherited View" +msgstr "继承视图" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:828 +#: code:addons/web_view_editor/static/src/js/view_editor.js:954 +#, python-format +msgid "Update" +msgstr "更新" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:65 +#, python-format +msgid "Remove" +msgstr "移除" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:825 +#: code:addons/web_view_editor/static/src/js/view_editor.js:951 +#, python-format +msgid "Properties" +msgstr "属性" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:379 +#, python-format +msgid "View Editor %d - %s" +msgstr "视图编辑器 %d - %s" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:386 +#, python-format +msgid "Do you really wants to create an inherited view here?" +msgstr "您确定要在此处创建继承视图吗?" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:13 +#, python-format +msgid "Manage Views" +msgstr "管理视图" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:112 +#: code:addons/web_view_editor/static/src/js/view_editor.js:846 +#: code:addons/web_view_editor/static/src/js/view_editor.js:974 +#, python-format +msgid "Cancel" +msgstr "取消" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:66 +#: code:addons/web_view_editor/static/src/js/view_editor.js:413 +#, python-format +msgid "Close" +msgstr "关闭" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:516 +#, python-format +msgid "Do you really want to remove this node?" +msgstr "您确认要删除这个节点吗?" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:183 +#, python-format +msgid "Do you really want to remove this view?" +msgstr "您确认要移除此视图吗?" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:63 +#, python-format +msgid "Create" +msgstr "创建" + +#. module: web_view_editor +#. openerp-web +#: code:addons/web_view_editor/static/src/js/view_editor.js:88 +#, python-format +msgid "Create a view (%s)" +msgstr "创建视图 (%s)"