[MERGE] Merge with trunk upto revision no 1184.
authorYogesh (OpenERP) <ysa@tinyerp.com>
Mon, 10 Oct 2011 05:00:54 +0000 (10:30 +0530)
committerYogesh (OpenERP) <ysa@tinyerp.com>
Mon, 10 Oct 2011 05:00:54 +0000 (10:30 +0530)
bzr revid: ysa@tinyerp.com-20111010050054-hvwr29706js07cmb

67 files changed:
addons/web/__init__.py
addons/web/__openerp__.py
addons/web/common/__init__.py
addons/web/common/ast.py [deleted file]
addons/web/common/dates.py [deleted file]
addons/web/common/dispatch.py [deleted file]
addons/web/common/http.py
addons/web/common/session.py
addons/web/common/xml2json.py [new file with mode: 0644]
addons/web/controllers/main.py
addons/web/po/es_EC.po [new file with mode: 0644]
addons/web/po/it.po [new file with mode: 0644]
addons/web/po/nl_BE.po [new file with mode: 0644]
addons/web/po/web.pot
addons/web/static/src/css/base.css
addons/web/static/src/js/formats.js
addons/web/static/src/js/search.js
addons/web/static/src/js/view_form.js
addons/web/static/src/js/view_list.js
addons/web/static/src/js/view_list_editable.js
addons/web/static/src/js/views.js
addons/web/static/src/xml/base.xml
addons/web_calendar/__openerp__.py
addons/web_calendar/po/es_EC.po [new file with mode: 0644]
addons/web_calendar/po/it.po [new file with mode: 0644]
addons/web_calendar/po/nl_BE.po [new file with mode: 0644]
addons/web_calendar/po/web_calendar.pot
addons/web_calendar/static/src/js/calendar.js
addons/web_chat/__openerp__.py
addons/web_chat/controllers/main.py
addons/web_chat/po/web_chat.pot
addons/web_dashboard/__openerp__.py
addons/web_dashboard/controllers.py
addons/web_dashboard/po/es_EC.po [new file with mode: 0644]
addons/web_dashboard/po/it.po [new file with mode: 0644]
addons/web_dashboard/po/nl_BE.po [new file with mode: 0644]
addons/web_dashboard/po/web_dashboard.pot
addons/web_default_home/__openerp__.py
addons/web_default_home/po/es_EC.po [new file with mode: 0644]
addons/web_default_home/po/it.po [new file with mode: 0644]
addons/web_default_home/po/nl_BE.po [new file with mode: 0644]
addons/web_default_home/po/web_default_home.pot
addons/web_default_home/static/src/js/home.js
addons/web_diagram/__openerp__.py
addons/web_diagram/controllers/main.py
addons/web_diagram/po/es_EC.po [new file with mode: 0644]
addons/web_diagram/po/it.po [new file with mode: 0644]
addons/web_diagram/po/nl_BE.po [new file with mode: 0644]
addons/web_diagram/po/web_diagram.pot
addons/web_gantt/__openerp__.py
addons/web_gantt/po/web_gantt.pot
addons/web_graph/__openerp__.py
addons/web_graph/po/web_graph.pot
addons/web_graph/static/src/js/graph.js
addons/web_hello/__openerp__.py
addons/web_hello/po/web_hello.pot
addons/web_kanban/__openerp__.py
addons/web_mobile/__openerp__.py
addons/web_mobile/po/es_EC.po [new file with mode: 0644]
addons/web_mobile/po/fr.po [new file with mode: 0644]
addons/web_mobile/po/it.po [new file with mode: 0644]
addons/web_mobile/po/nl_BE.po [new file with mode: 0644]
addons/web_mobile/po/web_mobile.pot
addons/web_rpc/__openerp__.py
addons/web_rpc/po/web_rpc.pot
addons/web_tests/__openerp__.py
openerp-web.py

index 8802cb5..06e7fa1 100644 (file)
@@ -1,6 +1,5 @@
 import common
 import controllers
-import common.dispatch
 import logging
 import optparse
 
@@ -22,6 +21,6 @@ def wsgi_postload():
     o.serve_static = True
     o.backend = 'local'
 
-    app = common.dispatch.Root(o)
+    app = common.http.Root(o)
     openerp.wsgi.register_wsgi_handler(app)
 
index 990f0b4..d304825 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name" : "web",
+    "category" : "Hidden",
     "depends" : [],
     'active': True,
     'post_load' : 'wsgi_postload',
index 9257f51..53bf3e3 100644 (file)
@@ -1,2 +1,6 @@
 #!/usr/bin/python
-from dispatch import *
+import http
+import nonliterals
+import release
+import session
+import xml2json
diff --git a/addons/web/common/ast.py b/addons/web/common/ast.py
deleted file mode 100644 (file)
index 2fd565a..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-""" Backport of Python 2.6's ast.py for Python 2.5
-"""
-__all__ = ['literal_eval']
-try:
-    from ast import literal_eval
-except ImportError:
-    from _ast import *
-    from _ast import __version__
-
-
-    def parse(expr, filename='<unknown>', mode='exec'):
-        """
-        Parse an expression into an AST node.
-        Equivalent to compile(expr, filename, mode, PyCF_ONLY_AST).
-        """
-        return compile(expr, filename, mode, PyCF_ONLY_AST)
-
-
-    def literal_eval(node_or_string):
-        """
-        Safely evaluate an expression node or a string containing a Python
-        expression.  The string or node provided may only consist of the
-        following Python literal structures: strings, numbers, tuples, lists,
-        dicts, booleans, and None.
-        """
-        _safe_names = {'None': None, 'True': True, 'False': False}
-        if isinstance(node_or_string, basestring):
-            node_or_string = parse(node_or_string, mode='eval')
-        if isinstance(node_or_string, Expression):
-            node_or_string = node_or_string.body
-        def _convert(node):
-            if isinstance(node, Str):
-                return node.s
-            elif isinstance(node, Num):
-                return node.n
-            elif isinstance(node, Tuple):
-                return tuple(map(_convert, node.elts))
-            elif isinstance(node, List):
-                return list(map(_convert, node.elts))
-            elif isinstance(node, Dict):
-                return dict((_convert(k), _convert(v)) for k, v
-                            in zip(node.keys, node.values))
-            elif isinstance(node, Name):
-                if node.id in _safe_names:
-                    return _safe_names[node.id]
-            raise ValueError('malformed string')
-        return _convert(node_or_string)
diff --git a/addons/web/common/dates.py b/addons/web/common/dates.py
deleted file mode 100644 (file)
index caa7f83..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-#    Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU Affero General Public License as
-#    published by the Free Software Foundation, either version 3 of the
-#    License, or (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU Affero General Public License for more details.
-#
-#    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-import datetime
-
-DEFAULT_SERVER_DATE_FORMAT = "%Y-%m-%d"
-DEFAULT_SERVER_TIME_FORMAT = "%H:%M:%S"
-DEFAULT_SERVER_DATETIME_FORMAT = "%s %s" % (
-    DEFAULT_SERVER_DATE_FORMAT,
-    DEFAULT_SERVER_TIME_FORMAT)
-
-def str_to_datetime(str):
-    """
-    Converts a string to a datetime object using OpenERP's
-    datetime string format (exemple: '2011-12-01 15:12:35').
-    
-    No timezone information is added, the datetime is a naive instance, but
-    according to OpenERP 6.1 specification the timezone is always UTC.
-    """
-    if not str:
-        return str
-    return datetime.datetime.strptime(str, DEFAULT_SERVER_DATETIME_FORMAT)
-
-def str_to_date(str):
-    """
-    Converts a string to a date object using OpenERP's
-    date string format (exemple: '2011-12-01').
-    """
-    if not str:
-        return str
-    return datetime.datetime.strptime(str, DEFAULT_SERVER_DATE_FORMAT).date()
-
-def str_to_time(str):
-    """
-    Converts a string to a time object using OpenERP's
-    time string format (exemple: '15:12:35').
-    """
-    if not str:
-        return str
-    return datetime.datetime.strptime(str, DEFAULT_SERVER_TIME_FORMAT).time()
-
-def datetime_to_str(obj):
-    """
-    Converts a datetime object to a string using OpenERP's
-    datetime string format (exemple: '2011-12-01 15:12:35').
-    
-    The datetime instance should not have an attached timezone and be in UTC.
-    """
-    if not obj:
-        return False
-    return obj.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
-
-def date_to_str(obj):
-    """
-    Converts a date object to a string using OpenERP's
-    date string format (exemple: '2011-12-01').
-    """
-    if not obj:
-        return False
-    return obj.strftime(DEFAULT_SERVER_DATE_FORMAT)
-
-def time_to_str(obj):
-    """
-    Converts a time object to a string using OpenERP's
-    time string format (exemple: '15:12:35').
-    """
-    if not obj:
-        return False
-    return obj.strftime(DEFAULT_SERVER_TIME_FORMAT)
diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py
deleted file mode 100644 (file)
index cb998ca..0000000
+++ /dev/null
@@ -1,428 +0,0 @@
-#!/usr/bin/python
-from __future__ import with_statement
-
-import functools
-import logging
-import urllib
-import os
-import pprint
-import sys
-import traceback
-import uuid
-import xmlrpclib
-
-import simplejson
-import werkzeug.datastructures
-import werkzeug.exceptions
-import werkzeug.utils
-import werkzeug.wrappers
-import werkzeug.wsgi
-
-import ast
-import nonliterals
-import http
-import session
-import openerplib
-
-__all__ = ['Root', 'jsonrequest', 'httprequest', 'Controller',
-           'WebRequest', 'JsonRequest', 'HttpRequest']
-
-_logger = logging.getLogger(__name__)
-
-#-----------------------------------------------------------
-# Globals (wont move into a pool)
-#-----------------------------------------------------------
-
-addons_module = {}
-addons_manifest = {}
-controllers_class = {}
-controllers_object = {}
-controllers_path = {}
-
-#----------------------------------------------------------
-# OpenERP Web RequestHandler
-#----------------------------------------------------------
-class WebRequest(object):
-    """ Parent class for all OpenERP Web request types, mostly deals with
-    initialization and setup of the request object (the dispatching itself has
-    to be handled by the subclasses)
-
-    :param request: a wrapped werkzeug Request object
-    :type request: :class:`werkzeug.wrappers.BaseRequest`
-    :param config: configuration object
-
-    .. attribute:: httprequest
-
-        the original :class:`werkzeug.wrappers.Request` object provided to the
-        request
-
-    .. attribute:: httpsession
-
-        a :class:`~collections.Mapping` holding the HTTP session data for the
-        current http session
-
-    .. attribute:: config
-
-        config parameter provided to the request object
-
-    .. attribute:: params
-
-        :class:`~collections.Mapping` of request parameters, not generally
-        useful as they're provided directly to the handler method as keyword
-        arguments
-
-    .. attribute:: session_id
-
-        opaque identifier for the :class:`session.OpenERPSession` instance of
-        the current request
-
-    .. attribute:: session
-
-        :class:`~session.OpenERPSession` instance for the current request
-
-    .. attribute:: context
-
-        :class:`~collections.Mapping` of context values for the current request
-
-    .. attribute:: debug
-
-        ``bool``, indicates whether the debug mode is active on the client
-    """
-    def __init__(self, request, config):
-        self.httprequest = request
-        self.httpresponse = None
-        self.httpsession = request.session
-        self.config = config
-
-    def init(self, params):
-        self.params = dict(params)
-        # OpenERP session setup
-        self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex
-        self.session = self.httpsession.setdefault(self.session_id, session.OpenERPSession())
-        self.session.config = self.config
-        self.context = self.params.pop('context', None)
-        self.debug = self.params.pop('debug', False) != False
-
-class JsonRequest(WebRequest):
-    """ JSON-RPC2 over HTTP.
-
-    Sucessful request::
-
-      --> {"jsonrpc": "2.0",
-           "method": "call",
-           "params": {"session_id": "SID",
-                      "context": {},
-                      "arg1": "val1" },
-           "id": null}
-
-      <-- {"jsonrpc": "2.0",
-           "result": { "res1": "val1" },
-           "id": null}
-
-    Request producing a error::
-
-      --> {"jsonrpc": "2.0",
-           "method": "call",
-           "params": {"session_id": "SID",
-                      "context": {},
-                      "arg1": "val1" },
-           "id": null}
-
-      <-- {"jsonrpc": "2.0",
-           "error": {"code": 1,
-                     "message": "End user error message.",
-                     "data": {"code": "codestring",
-                              "debug": "traceback" } },
-           "id": null}
-
-    """
-
-    def dispatch(self, controller, method, requestf=None, request=None):
-        """ Calls the method asked for by the JSON-RPC2 request
-
-        :param controller: the instance of the controller which received the request
-        :param method: the method which received the request
-        :param requestf: a file-like object containing an encoded JSON-RPC2 request
-        :param request: a JSON-RPC2 request
-
-        :returns: an utf8 encoded JSON-RPC2 reply
-        """
-        response = {"jsonrpc": "2.0" }
-        error = None
-        try:
-            # Read POST content or POST Form Data named "request"
-            if requestf:
-                self.jsonrequest = simplejson.load(requestf, object_hook=nonliterals.non_literal_decoder)
-            else:
-                self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder)
-            self.init(self.jsonrequest.get("params", {}))
-            if _logger.isEnabledFor(logging.DEBUG):
-                _logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest))
-            response['id'] = self.jsonrequest.get('id')
-            response["result"] = method(controller, self, **self.params)
-        except openerplib.AuthenticationError:
-            error = {
-                'code': 100,
-                'message': "OpenERP Session Invalid",
-                'data': {
-                    'type': 'session_invalid',
-                    'debug': traceback.format_exc()
-                }
-            }
-        except xmlrpclib.Fault, e:
-            error = {
-                'code': 200,
-                'message': "OpenERP Server Error",
-                'data': {
-                    'type': 'server_exception',
-                    'fault_code': e.faultCode,
-                    'debug': "Client %s\nServer %s" % (
-                    "".join(traceback.format_exception("", None, sys.exc_traceback)), e.faultString)
-                }
-            }
-        except Exception:
-            logging.getLogger(__name__ + '.JSONRequest.dispatch').exception\
-                ("An error occured while handling a json request")
-            error = {
-                'code': 300,
-                'message': "OpenERP WebClient Error",
-                'data': {
-                    'type': 'client_exception',
-                    'debug': "Client %s" % traceback.format_exc()
-                }
-            }
-        if error:
-            response["error"] = error
-
-        if _logger.isEnabledFor(logging.DEBUG):
-            _logger.debug("<--\n%s", pprint.pformat(response))
-        content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder)
-        return werkzeug.wrappers.Response(
-            content, headers=[('Content-Type', 'application/json'),
-                              ('Content-Length', len(content))])
-
-def jsonrequest(f):
-    """ Decorator marking the decorated method as being a handler for a
-    JSON-RPC request (the exact request path is specified via the
-    ``$(Controller._cp_path)/$methodname`` combination.
-
-    If the method is called, it will be provided with a :class:`JsonRequest`
-    instance and all ``params`` sent during the JSON-RPC request, apart from
-    the ``session_id``, ``context`` and ``debug`` keys (which are stripped out
-    beforehand)
-    """
-    @functools.wraps(f)
-    def json_handler(controller, request, config):
-        return JsonRequest(request, config).dispatch(
-            controller, f, requestf=request.stream)
-    json_handler.exposed = True
-    return json_handler
-
-class HttpRequest(WebRequest):
-    """ Regular GET/POST request
-    """
-    def dispatch(self, controller, method):
-        params = dict(self.httprequest.args)
-        params.update(self.httprequest.form)
-        params.update(self.httprequest.files)
-        self.init(params)
-        akw = {}
-        for key, value in self.httprequest.args.iteritems():
-            if isinstance(value, basestring) and len(value) < 1024:
-                akw[key] = value
-            else:
-                akw[key] = type(value)
-        _logger.debug("%s --> %s.%s %r", self.httprequest.method, controller.__class__.__name__, method.__name__, akw)
-        r = method(controller, self, **self.params)
-        if self.debug or 1:
-            if isinstance(r, werkzeug.wrappers.BaseResponse):
-                _logger.debug('<-- %s', r)
-            else:
-                _logger.debug("<-- size: %s", len(r))
-        return r
-
-    def make_response(self, data, headers=None, cookies=None):
-        """ Helper for non-HTML responses, or HTML responses with custom
-        response headers or cookies.
-
-        While handlers can just return the HTML markup of a page they want to
-        send as a string if non-HTML data is returned they need to create a
-        complete response object, or the returned data will not be correctly
-        interpreted by the clients.
-
-        :param basestring data: response body
-        :param headers: HTTP headers to set on the response
-        :type headers: ``[(name, value)]``
-        :param collections.Mapping cookies: cookies to set on the client
-        """
-        response = werkzeug.wrappers.Response(data, headers=headers)
-        if cookies:
-            for k, v in cookies.iteritems():
-                response.set_cookie(k, v)
-        return response
-
-    def not_found(self, description=None):
-        """ Helper for 404 response, return its result from the method
-        """
-        return werkzeug.exceptions.NotFound(description)
-
-def httprequest(f):
-    """ Decorator marking the decorated method as being a handler for a
-    normal HTTP request (the exact request path is specified via the
-    ``$(Controller._cp_path)/$methodname`` combination.
-
-    If the method is called, it will be provided with a :class:`HttpRequest`
-    instance and all ``params`` sent during the request (``GET`` and ``POST``
-    merged in the same dictionary), apart from the ``session_id``, ``context``
-    and ``debug`` keys (which are stripped out beforehand)
-    """
-    @functools.wraps(f)
-    def http_handler(controller, request, config):
-        return HttpRequest(request, config).dispatch(controller, f)
-    http_handler.exposed = True
-    return http_handler
-
-class ControllerType(type):
-    def __init__(cls, name, bases, attrs):
-        super(ControllerType, cls).__init__(name, bases, attrs)
-        controllers_class["%s.%s" % (cls.__module__, cls.__name__)] = cls
-
-class Controller(object):
-    __metaclass__ = ControllerType
-
-class Root(object):
-    """Root WSGI application for the OpenERP Web Client.
-
-    :param options: mandatory initialization options object, must provide
-                    the following attributes:
-
-                    ``server_host`` (``str``)
-                      hostname of the OpenERP server to dispatch RPC to
-                    ``server_port`` (``int``)
-                      RPC port of the OpenERP server
-                    ``serve_static`` (``bool | None``)
-                      whether this application should serve the various
-                      addons's static files
-                    ``storage_path`` (``str``)
-                      filesystem path where HTTP session data will be stored
-                    ``dbfilter`` (``str``)
-                      only used in case the list of databases is requested
-                      by the server, will be filtered by this pattern
-    """
-    def __init__(self, options):
-        self.root = '/web/webclient/home'
-        self.config = options
-
-        if self.config.backend == 'local':
-            conn = openerplib.get_connector(protocol='local')
-        else:
-            conn = openerplib.get_connector(hostname=self.config.server_host,
-                   port=self.config.server_port)
-        self.config.connector = conn
-
-        self.session_cookie = 'sessionid'
-        self.addons = {}
-
-        static_dirs = self._load_addons()
-        if options.serve_static:
-            self.dispatch = werkzeug.wsgi.SharedDataMiddleware(
-                self.dispatch, static_dirs)
-
-        if options.session_storage:
-            if not os.path.exists(options.session_storage):
-                os.mkdir(options.session_storage, 0700)
-            self.session_storage = options.session_storage
-
-    def __call__(self, environ, start_response):
-        """ Handle a WSGI request
-        """
-        return self.dispatch(environ, start_response)
-
-    def dispatch(self, environ, start_response):
-        """
-        Performs the actual WSGI dispatching for the application, may be
-        wrapped during the initialization of the object.
-
-        Call the object directly.
-        """
-        request = werkzeug.wrappers.Request(environ)
-        request.parameter_storage_class = werkzeug.datastructures.ImmutableDict
-
-        if request.path == '/':
-            params = urllib.urlencode(dict(request.args, debug=''))
-            return werkzeug.utils.redirect(self.root + '?' + params, 301)(
-                environ, start_response)
-        elif request.path == '/mobile':
-            return werkzeug.utils.redirect(
-                '/web_mobile/static/src/web_mobile.html', 301)(environ, start_response)
-
-        handler = self.find_handler(*(request.path.split('/')[1:]))
-
-        if not handler:
-            response = werkzeug.exceptions.NotFound()
-        else:
-            with http.session(request, self.session_storage, self.session_cookie) as session:
-                result = handler(
-                    request, self.config)
-
-                if isinstance(result, basestring):
-                    response = werkzeug.wrappers.Response(
-                        result, headers=[('Content-Type', 'text/html; charset=utf-8'),
-                                         ('Content-Length', len(result))])
-                else:
-                    response = result
-
-                response.set_cookie(self.session_cookie, session.sid)
-
-        return response(environ, start_response)
-
-    def _load_addons(self):
-        """
-        Loads all addons at the specified addons path, returns a mapping of
-        static URLs to the corresponding directories
-        """
-        statics = {}
-        for addons_path in self.config.addons_path:
-            if addons_path not in sys.path:
-                sys.path.insert(0, addons_path)
-            for module in os.listdir(addons_path):
-                if module not in addons_module:
-                    manifest_path = os.path.join(addons_path, module, '__openerp__.py')
-                    path_static = os.path.join(addons_path, module, 'static')
-                    if os.path.isfile(manifest_path) and os.path.isdir(path_static):
-                        manifest = ast.literal_eval(open(manifest_path).read())
-                        manifest['addons_path'] = addons_path
-                        _logger.info("Loading %s", module)
-                        m = __import__(module)
-                        addons_module[module] = m
-                        addons_manifest[module] = manifest
-                        statics['/%s/static' % module] = path_static
-        for k, v in controllers_class.items():
-            if k not in controllers_object:
-                o = v()
-                controllers_object[k] = o
-                if hasattr(o, '_cp_path'):
-                    controllers_path[o._cp_path] = o
-        return statics
-
-    def find_handler(self, *l):
-        """
-        Tries to discover the controller handling the request for the path
-        specified by the provided parameters
-
-        :param l: path sections to a controller or controller method
-        :returns: a callable matching the path sections, or ``None``
-        :rtype: ``Controller | None``
-        """
-        if len(l) > 1:
-            for i in range(len(l), 1, -1):
-                ps = "/" + "/".join(l[0:i])
-                if ps in controllers_path:
-                    c = controllers_path[ps]
-                    rest = l[i:] or ['index']
-                    meth = rest[0]
-                    m = getattr(c, meth)
-                    if getattr(m, 'exposed', False):
-                        _logger.debug("Dispatching to %s %s %s", ps, c, meth)
-                        return m
-        return None
index 0186fd9..453484a 100644 (file)
 # -*- coding: utf-8 -*-
-
+#----------------------------------------------------------
+# OpenERP Web HTTP layer
+#----------------------------------------------------------
+import ast
 import contextlib
+import functools
+import logging
+import urllib
+import os
+import pprint
+import sys
+import traceback
+import uuid
+import xmlrpclib
 
+import simplejson
 import werkzeug.contrib.sessions
+import werkzeug.datastructures
+import werkzeug.exceptions
+import werkzeug.utils
+import werkzeug.wrappers
+import werkzeug.wsgi
+
+import nonliterals
+import session
+import openerplib
+
+__all__ = ['Root', 'jsonrequest', 'httprequest', 'Controller',
+           'WebRequest', 'JsonRequest', 'HttpRequest']
+
+_logger = logging.getLogger(__name__)
+
+#----------------------------------------------------------
+# OpenERP Web RequestHandler
+#----------------------------------------------------------
+class WebRequest(object):
+    """ Parent class for all OpenERP Web request types, mostly deals with
+    initialization and setup of the request object (the dispatching itself has
+    to be handled by the subclasses)
+
+    :param request: a wrapped werkzeug Request object
+    :type request: :class:`werkzeug.wrappers.BaseRequest`
+    :param config: configuration object
+
+    .. attribute:: httprequest
+
+        the original :class:`werkzeug.wrappers.Request` object provided to the
+        request
+
+    .. attribute:: httpsession
+
+        a :class:`~collections.Mapping` holding the HTTP session data for the
+        current http session
+
+    .. attribute:: config
+
+        config parameter provided to the request object
+
+    .. attribute:: params
+
+        :class:`~collections.Mapping` of request parameters, not generally
+        useful as they're provided directly to the handler method as keyword
+        arguments
+
+    .. attribute:: session_id
+
+        opaque identifier for the :class:`session.OpenERPSession` instance of
+        the current request
+
+    .. attribute:: session
+
+        :class:`~session.OpenERPSession` instance for the current request
+
+    .. attribute:: context
+
+        :class:`~collections.Mapping` of context values for the current request
+
+    .. attribute:: debug
+
+        ``bool``, indicates whether the debug mode is active on the client
+    """
+    def __init__(self, request, config):
+        self.httprequest = request
+        self.httpresponse = None
+        self.httpsession = request.session
+        self.config = config
+
+    def init(self, params):
+        self.params = dict(params)
+        # OpenERP session setup
+        self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex
+        self.session = self.httpsession.setdefault(self.session_id, session.OpenERPSession())
+        self.session.config = self.config
+        self.context = self.params.pop('context', None)
+        self.debug = self.params.pop('debug', False) != False
+
+class JsonRequest(WebRequest):
+    """ JSON-RPC2 over HTTP.
+
+    Sucessful request::
+
+      --> {"jsonrpc": "2.0",
+           "method": "call",
+           "params": {"session_id": "SID",
+                      "context": {},
+                      "arg1": "val1" },
+           "id": null}
+
+      <-- {"jsonrpc": "2.0",
+           "result": { "res1": "val1" },
+           "id": null}
+
+    Request producing a error::
+
+      --> {"jsonrpc": "2.0",
+           "method": "call",
+           "params": {"session_id": "SID",
+                      "context": {},
+                      "arg1": "val1" },
+           "id": null}
+
+      <-- {"jsonrpc": "2.0",
+           "error": {"code": 1,
+                     "message": "End user error message.",
+                     "data": {"code": "codestring",
+                              "debug": "traceback" } },
+           "id": null}
+
+    """
+
+    def dispatch(self, controller, method, requestf=None, request=None):
+        """ Calls the method asked for by the JSON-RPC2 request
+
+        :param controller: the instance of the controller which received the request
+        :param method: the method which received the request
+        :param requestf: a file-like object containing an encoded JSON-RPC2 request
+        :param request: a JSON-RPC2 request
+
+        :returns: an utf8 encoded JSON-RPC2 reply
+        """
+        response = {"jsonrpc": "2.0" }
+        error = None
+        try:
+            # Read POST content or POST Form Data named "request"
+            if requestf:
+                self.jsonrequest = simplejson.load(requestf, object_hook=nonliterals.non_literal_decoder)
+            else:
+                self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder)
+            self.init(self.jsonrequest.get("params", {}))
+            if _logger.isEnabledFor(logging.DEBUG):
+                _logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest))
+            response['id'] = self.jsonrequest.get('id')
+            response["result"] = method(controller, self, **self.params)
+        except openerplib.AuthenticationError:
+            error = {
+                'code': 100,
+                'message': "OpenERP Session Invalid",
+                'data': {
+                    'type': 'session_invalid',
+                    'debug': traceback.format_exc()
+                }
+            }
+        except xmlrpclib.Fault, e:
+            error = {
+                'code': 200,
+                'message': "OpenERP Server Error",
+                'data': {
+                    'type': 'server_exception',
+                    'fault_code': e.faultCode,
+                    'debug': "Client %s\nServer %s" % (
+                    "".join(traceback.format_exception("", None, sys.exc_traceback)), e.faultString)
+                }
+            }
+        except Exception:
+            logging.getLogger(__name__ + '.JSONRequest.dispatch').exception\
+                ("An error occured while handling a json request")
+            error = {
+                'code': 300,
+                'message': "OpenERP WebClient Error",
+                'data': {
+                    'type': 'client_exception',
+                    'debug': "Client %s" % traceback.format_exc()
+                }
+            }
+        if error:
+            response["error"] = error
 
+        if _logger.isEnabledFor(logging.DEBUG):
+            _logger.debug("<--\n%s", pprint.pformat(response))
+        content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder)
+        return werkzeug.wrappers.Response(
+            content, headers=[('Content-Type', 'application/json'),
+                              ('Content-Length', len(content))])
+
+def jsonrequest(f):
+    """ Decorator marking the decorated method as being a handler for a
+    JSON-RPC request (the exact request path is specified via the
+    ``$(Controller._cp_path)/$methodname`` combination.
+
+    If the method is called, it will be provided with a :class:`JsonRequest`
+    instance and all ``params`` sent during the JSON-RPC request, apart from
+    the ``session_id``, ``context`` and ``debug`` keys (which are stripped out
+    beforehand)
+    """
+    @functools.wraps(f)
+    def json_handler(controller, request, config):
+        return JsonRequest(request, config).dispatch(
+            controller, f, requestf=request.stream)
+    json_handler.exposed = True
+    return json_handler
+
+class HttpRequest(WebRequest):
+    """ Regular GET/POST request
+    """
+    def dispatch(self, controller, method):
+        params = dict(self.httprequest.args)
+        params.update(self.httprequest.form)
+        params.update(self.httprequest.files)
+        self.init(params)
+        akw = {}
+        for key, value in self.httprequest.args.iteritems():
+            if isinstance(value, basestring) and len(value) < 1024:
+                akw[key] = value
+            else:
+                akw[key] = type(value)
+        _logger.debug("%s --> %s.%s %r", self.httprequest.method, controller.__class__.__name__, method.__name__, akw)
+        r = method(controller, self, **self.params)
+        if self.debug or 1:
+            if isinstance(r, werkzeug.wrappers.BaseResponse):
+                _logger.debug('<-- %s', r)
+            else:
+                _logger.debug("<-- size: %s", len(r))
+        return r
+
+    def make_response(self, data, headers=None, cookies=None):
+        """ Helper for non-HTML responses, or HTML responses with custom
+        response headers or cookies.
+
+        While handlers can just return the HTML markup of a page they want to
+        send as a string if non-HTML data is returned they need to create a
+        complete response object, or the returned data will not be correctly
+        interpreted by the clients.
+
+        :param basestring data: response body
+        :param headers: HTTP headers to set on the response
+        :type headers: ``[(name, value)]``
+        :param collections.Mapping cookies: cookies to set on the client
+        """
+        response = werkzeug.wrappers.Response(data, headers=headers)
+        if cookies:
+            for k, v in cookies.iteritems():
+                response.set_cookie(k, v)
+        return response
+
+    def not_found(self, description=None):
+        """ Helper for 404 response, return its result from the method
+        """
+        return werkzeug.exceptions.NotFound(description)
+
+def httprequest(f):
+    """ Decorator marking the decorated method as being a handler for a
+    normal HTTP request (the exact request path is specified via the
+    ``$(Controller._cp_path)/$methodname`` combination.
+
+    If the method is called, it will be provided with a :class:`HttpRequest`
+    instance and all ``params`` sent during the request (``GET`` and ``POST``
+    merged in the same dictionary), apart from the ``session_id``, ``context``
+    and ``debug`` keys (which are stripped out beforehand)
+    """
+    @functools.wraps(f)
+    def http_handler(controller, request, config):
+        return HttpRequest(request, config).dispatch(controller, f)
+    http_handler.exposed = True
+    return http_handler
+
+#----------------------------------------------------------
+# OpenERP Web werkzeug Session Managment wraped using with
+#----------------------------------------------------------
 STORES = {}
 
 @contextlib.contextmanager
-def session(request, storage_path, session_cookie='sessionid'):
+def session_context(request, storage_path, session_cookie='sessionid'):
     session_store = STORES.get(storage_path)
     if not session_store:
         session_store = werkzeug.contrib.sessions.FilesystemSessionStore(
@@ -24,3 +297,157 @@ def session(request, storage_path, session_cookie='sessionid'):
         yield request.session
     finally:
         session_store.save(request.session)
+
+#----------------------------------------------------------
+# OpenERP Web Module/Controller Loading and URL Routing
+#----------------------------------------------------------
+addons_module = {}
+addons_manifest = {}
+controllers_class = {}
+controllers_object = {}
+controllers_path = {}
+
+class ControllerType(type):
+    def __init__(cls, name, bases, attrs):
+        super(ControllerType, cls).__init__(name, bases, attrs)
+        controllers_class["%s.%s" % (cls.__module__, cls.__name__)] = cls
+
+class Controller(object):
+    __metaclass__ = ControllerType
+
+class Root(object):
+    """Root WSGI application for the OpenERP Web Client.
+
+    :param options: mandatory initialization options object, must provide
+                    the following attributes:
+
+                    ``server_host`` (``str``)
+                      hostname of the OpenERP server to dispatch RPC to
+                    ``server_port`` (``int``)
+                      RPC port of the OpenERP server
+                    ``serve_static`` (``bool | None``)
+                      whether this application should serve the various
+                      addons's static files
+                    ``storage_path`` (``str``)
+                      filesystem path where HTTP session data will be stored
+                    ``dbfilter`` (``str``)
+                      only used in case the list of databases is requested
+                      by the server, will be filtered by this pattern
+    """
+    def __init__(self, options):
+        self.root = '/web/webclient/home'
+        self.config = options
+
+        if self.config.backend == 'local':
+            conn = openerplib.get_connector(protocol='local')
+        else:
+            conn = openerplib.get_connector(hostname=self.config.server_host,
+                   port=self.config.server_port)
+        self.config.connector = conn
+
+        self.session_cookie = 'sessionid'
+        self.addons = {}
+
+        static_dirs = self._load_addons()
+        if options.serve_static:
+            self.dispatch = werkzeug.wsgi.SharedDataMiddleware(
+                self.dispatch, static_dirs)
+
+        if options.session_storage:
+            if not os.path.exists(options.session_storage):
+                os.mkdir(options.session_storage, 0700)
+            self.session_storage = options.session_storage
+
+    def __call__(self, environ, start_response):
+        """ Handle a WSGI request
+        """
+        return self.dispatch(environ, start_response)
+
+    def dispatch(self, environ, start_response):
+        """
+        Performs the actual WSGI dispatching for the application, may be
+        wrapped during the initialization of the object.
+
+        Call the object directly.
+        """
+        request = werkzeug.wrappers.Request(environ)
+        request.parameter_storage_class = werkzeug.datastructures.ImmutableDict
+
+        if request.path == '/':
+            params = urllib.urlencode(dict(request.args, debug=''))
+            return werkzeug.utils.redirect(self.root + '?' + params, 301)(
+                environ, start_response)
+        elif request.path == '/mobile':
+            return werkzeug.utils.redirect(
+                '/web_mobile/static/src/web_mobile.html', 301)(environ, start_response)
+
+        handler = self.find_handler(*(request.path.split('/')[1:]))
+
+        if not handler:
+            response = werkzeug.exceptions.NotFound()
+        else:
+            with session_context(request, self.session_storage, self.session_cookie) as session:
+                result = handler( request, self.config)
+
+                if isinstance(result, basestring):
+                    headers=[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', len(result))]
+                    response = werkzeug.wrappers.Response(result, headers=headers)
+                else:
+                    response = result
+
+                response.set_cookie(self.session_cookie, session.sid)
+
+        return response(environ, start_response)
+
+    def _load_addons(self):
+        """
+        Loads all addons at the specified addons path, returns a mapping of
+        static URLs to the corresponding directories
+        """
+        statics = {}
+        for addons_path in self.config.addons_path:
+            if addons_path not in sys.path:
+                sys.path.insert(0, addons_path)
+            for module in os.listdir(addons_path):
+                if module not in addons_module:
+                    manifest_path = os.path.join(addons_path, module, '__openerp__.py')
+                    path_static = os.path.join(addons_path, module, 'static')
+                    if os.path.isfile(manifest_path) and os.path.isdir(path_static):
+                        manifest = ast.literal_eval(open(manifest_path).read())
+                        manifest['addons_path'] = addons_path
+                        _logger.info("Loading %s", module)
+                        m = __import__(module)
+                        addons_module[module] = m
+                        addons_manifest[module] = manifest
+                        statics['/%s/static' % module] = path_static
+        for k, v in controllers_class.items():
+            if k not in controllers_object:
+                o = v()
+                controllers_object[k] = o
+                if hasattr(o, '_cp_path'):
+                    controllers_path[o._cp_path] = o
+        return statics
+
+    def find_handler(self, *l):
+        """
+        Tries to discover the controller handling the request for the path
+        specified by the provided parameters
+
+        :param l: path sections to a controller or controller method
+        :returns: a callable matching the path sections, or ``None``
+        :rtype: ``Controller | None``
+        """
+        if len(l) > 1:
+            for i in range(len(l), 1, -1):
+                ps = "/" + "/".join(l[0:i])
+                if ps in controllers_path:
+                    c = controllers_path[ps]
+                    rest = l[i:] or ['index']
+                    meth = rest[0]
+                    m = getattr(c, meth)
+                    if getattr(m, 'exposed', False):
+                        _logger.debug("Dispatching to %s %s %s", ps, c, meth)
+                        return m
+        return None
+
+#
index 2ed50bd..e8027db 100644 (file)
@@ -1,17 +1,16 @@
 #!/usr/bin/python
 import datetime
 import dateutil.relativedelta
+import logging
 import time
 import openerplib
 
 import nonliterals
 
-import logging
 _logger = logging.getLogger(__name__)
 #----------------------------------------------------------
 # OpenERPSession RPC openerp backend access
 #----------------------------------------------------------
-
 class OpenERPSession(object):
     """
     An OpenERP RPC session, a given user can own multiple such sessions
diff --git a/addons/web/common/xml2json.py b/addons/web/common/xml2json.py
new file mode 100644 (file)
index 0000000..1602262
--- /dev/null
@@ -0,0 +1,38 @@
+# xml2json-direct
+# Simple and straightforward XML-to-JSON converter in Python
+# New BSD Licensed
+#
+# URL: http://code.google.com/p/xml2json-direct/
+
+class Xml2Json(object):
+    @staticmethod
+    def convert_to_json(s):
+        return simplejson.dumps(
+            Xml2Json.convert_to_structure(s), sort_keys=True, indent=4)
+
+    @staticmethod
+    def convert_to_structure(s):
+        root = ElementTree.fromstring(s)
+        return Xml2Json.convert_element(root)
+
+    @staticmethod
+    def convert_element(el, skip_whitespaces=True):
+        res = {}
+        if el.tag[0] == "{":
+            ns, name = el.tag.rsplit("}", 1)
+            res["tag"] = name
+            res["namespace"] = ns[1:]
+        else:
+            res["tag"] = el.tag
+        res["attrs"] = {}
+        for k, v in el.items():
+            res["attrs"][k] = v
+        kids = []
+        if el.text and (not skip_whitespaces or el.text.strip() != ''):
+            kids.append(el.text)
+        for kid in el:
+            kids.append(Xml2Json.convert_element(kid))
+            if kid.tail and (not skip_whitespaces or kid.tail.strip() != ''):
+                kids.append(kid.tail)
+        res["children"] = kids
+        return res
index 9be0794..7ca80fb 100644 (file)
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 
+import ast
 import base64
 import csv
 import glob
@@ -9,60 +10,16 @@ import os
 import re
 import simplejson
 import textwrap
-import xmlrpclib
 import time
+import xmlrpclib
 import zlib
 from xml.etree import ElementTree
 from cStringIO import StringIO
 
-from babel.messages.pofile import read_po
-
-import web.common.dispatch as openerpweb
-import web.common.ast
-import web.common.nonliterals
-import web.common.release
-openerpweb.ast = web.common.ast
-openerpweb.nonliterals = web.common.nonliterals
-
-
-# Should move to openerpweb.Xml2Json
-class Xml2Json:
-    # xml2json-direct
-    # Simple and straightforward XML-to-JSON converter in Python
-    # New BSD Licensed
-    #
-    # URL: http://code.google.com/p/xml2json-direct/
-    @staticmethod
-    def convert_to_json(s):
-        return simplejson.dumps(
-            Xml2Json.convert_to_structure(s), sort_keys=True, indent=4)
-
-    @staticmethod
-    def convert_to_structure(s):
-        root = ElementTree.fromstring(s)
-        return Xml2Json.convert_element(root)
-
-    @staticmethod
-    def convert_element(el, skip_whitespaces=True):
-        res = {}
-        if el.tag[0] == "{":
-            ns, name = el.tag.rsplit("}", 1)
-            res["tag"] = name
-            res["namespace"] = ns[1:]
-        else:
-            res["tag"] = el.tag
-        res["attrs"] = {}
-        for k, v in el.items():
-            res["attrs"][k] = v
-        kids = []
-        if el.text and (not skip_whitespaces or el.text.strip() != ''):
-            kids.append(el.text)
-        for kid in el:
-            kids.append(Xml2Json.convert_element(kid))
-            if kid.tail and (not skip_whitespaces or kid.tail.strip() != ''):
-                kids.append(kid.tail)
-        res["children"] = kids
-        return res
+import babel.messages.pofile
+
+import web.common
+openerpweb = web.common.http
 
 #----------------------------------------------------------
 # OpenERP Web web Controllers
@@ -200,7 +157,7 @@ class WebClient(openerpweb.Controller):
                     continue
                 try:
                     with open(f_name) as t_file:
-                        po = read_po(t_file)
+                        po = babel.messages.pofile.read_po(t_file)
                 except:
                     continue
                 for x in po:
@@ -358,13 +315,22 @@ class Session(openerpweb.Controller):
 
     @openerpweb.jsonrequest
     def modules(self, req):
-        # TODO query server for installed web modules
-        mods = []
-        for name, manifest in openerpweb.addons_manifest.items():
-            # TODO replace by ir.module.module installed web
-            if name not in req.config.server_wide_modules and manifest.get('active', True):
-                mods.append(name)
-        return mods
+        # Compute available candidates module
+        loadable = openerpweb.addons_manifest.iterkeys()
+        loaded = req.config.server_wide_modules
+        candidates = [mod for mod in loadable if mod not in loaded]
+
+        # Compute active true modules that might be on the web side only
+        active = set(name for name in candidates
+                     if openerpweb.addons_manifest[name].get('active'))
+
+        # Retrieve database installed modules
+        Modules = req.session.model('ir.module.module')
+        installed = set(module['name'] for module in Modules.search_read(
+            [('state','=','installed'), ('name','in', candidates)], ['name']))
+
+        # Merge both
+        return list(active | installed)
 
     @openerpweb.jsonrequest
     def eval_domain_and_context(self, req, contexts, domains,
@@ -399,8 +365,8 @@ class Session(openerpweb.Controller):
                 no group by should be performed)
         """
         context, domain = eval_context_and_domain(req.session,
-                                                  openerpweb.nonliterals.CompoundContext(*(contexts or [])),
-                                                  openerpweb.nonliterals.CompoundDomain(*(domains or [])))
+                                                  web.common.nonliterals.CompoundContext(*(contexts or [])),
+                                                  web.common.nonliterals.CompoundDomain(*(domains or [])))
 
         group_by_sequence = []
         for candidate in (group_by_seq or []):
@@ -817,7 +783,7 @@ class View(openerpweb.Controller):
             xml = self.transform_view(arch, session, evaluation_context)
         else:
             xml = ElementTree.fromstring(arch)
-        fvg['arch'] = Xml2Json.convert_element(xml)
+        fvg['arch'] = web.common.xml2json.Xml2Json.convert_element(xml)
 
         for field in fvg['fields'].itervalues():
             if field.get('views'):
@@ -882,7 +848,7 @@ class View(openerpweb.Controller):
 
     def parse_domain(self, domain, session):
         """ Parses an arbitrary string containing a domain, transforms it
-        to either a literal domain or a :class:`openerpweb.nonliterals.Domain`
+        to either a literal domain or a :class:`web.common.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
@@ -892,14 +858,14 @@ class View(openerpweb.Controller):
         if not isinstance(domain, (str, unicode)):
             return domain
         try:
-            return openerpweb.ast.literal_eval(domain)
+            return ast.literal_eval(domain)
         except ValueError:
             # not a literal
-            return openerpweb.nonliterals.Domain(session, domain)
+            return web.common.nonliterals.Domain(session, domain)
 
     def parse_context(self, context, session):
         """ Parses an arbitrary string containing a context, transforms it
-        to either a literal context or a :class:`openerpweb.nonliterals.Context`
+        to either a literal context or a :class:`web.common.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
@@ -909,9 +875,9 @@ class View(openerpweb.Controller):
         if not isinstance(context, (str, unicode)):
             return context
         try:
-            return openerpweb.ast.literal_eval(context)
+            return ast.literal_eval(context)
         except ValueError:
-            return openerpweb.nonliterals.Context(session, context)
+            return web.common.nonliterals.Context(session, context)
 
     def parse_domains_and_contexts(self, elem, session):
         """ Converts domains and contexts from the view into Python objects,
@@ -999,10 +965,10 @@ class SearchView(View):
     @openerpweb.jsonrequest
     def save_filter(self, req, model, name, context_to_save, domain):
         Model = req.session.model("ir.filters")
-        ctx = openerpweb.nonliterals.CompoundContext(context_to_save)
+        ctx = web.common.nonliterals.CompoundContext(context_to_save)
         ctx.session = req.session
         ctx = ctx.evaluate()
-        domain = openerpweb.nonliterals.CompoundDomain(domain)
+        domain = web.common.nonliterals.CompoundDomain(domain)
         domain.session = req.session
         domain = domain.evaluate()
         uid = req.session._uid
@@ -1025,16 +991,17 @@ class Binary(openerpweb.Controller):
 
         try:
             if not id:
-                res = Model.default_get([field], context).get(field, '')
+                res = Model.default_get([field], context).get(field)
             else:
-                res = Model.read([int(id)], [field], context)[0].get(field, '')
+                res = Model.read([int(id)], [field], context)[0].get(field)
             image_data = base64.b64decode(res)
         except (TypeError, xmlrpclib.Fault):
             image_data = self.placeholder(req)
         return req.make_response(image_data, [
             ('Content-Type', 'image/png'), ('Content-Length', len(image_data))])
     def placeholder(self, req):
-        return open(os.path.join(req.addons_path, 'web', 'static', 'src', 'img', 'placeholder.png'), 'rb').read()
+        addons_path = openerpweb.addons_manifest['web']['addons_path']
+        return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', 'placeholder.png'), 'rb').read()
 
     @openerpweb.httprequest
     def saveas(self, req, model, id, field, fieldname, **kw):
@@ -1393,7 +1360,7 @@ class Reports(View):
 
         report_srv = req.session.proxy("report")
         context = req.session.eval_context(
-            openerpweb.nonliterals.CompoundContext(
+            web.common.nonliterals.CompoundContext(
                 req.context or {}, action[ "context"]))
 
         report_data = {}
@@ -1432,7 +1399,6 @@ class Reports(View):
                  ('Content-Length', len(report))],
              cookies={'fileToken': int(token)})
 
-
 class Import(View):
     _cp_path = "/web/import"
 
diff --git a/addons/web/po/es_EC.po b/addons/web/po/es_EC.po
new file mode 100644 (file)
index 0000000..eb2283f
--- /dev/null
@@ -0,0 +1,710 @@
+# Spanish (Ecuador) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
+"PO-Revision-Date: 2011-10-07 18:16+0000\n"
+"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
+"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:29+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web/static/src/js/view_form.js:355
+msgid ""
+"Warning, the record has been modified, your changes will be discarded."
+msgstr ""
+"Aviso, el registro ha sido modificado, sus cambios serán descartados."
+
+#: addons/web/static/src/js/view_form.js:1659
+msgid "<em>   Search More...</em>"
+msgstr "<em>   Buscar Más...</em>"
+
+#: addons/web/static/src/js/view_form.js:1672
+#, python-format
+msgid "<em>   Create \"<strong>%s</strong>\"</em>"
+msgstr "<em>   Crear \"<strong>%s</strong>\"</em>"
+
+#: addons/web/static/src/js/view_form.js:1678
+msgid "<em>   Create and Edit...</em>"
+msgstr "<em>   Crear y Editar...</em>"
+
+#: addons/web/static/src/js/views.js:568
+msgid "You must choose at least one record."
+msgstr "Debe seleccionar al menos un registro."
+
+#: addons/web/static/src/js/views.js:569
+msgid "Warning"
+msgstr "Advertencia"
+
+#: addons/web/static/src/js/views.js:609
+msgid "Translations"
+msgstr "Traducciones"
+
+#: addons/web/static/src/js/views.js:614 addons/web/static/src/xml/base.xml:0
+msgid "Save"
+msgstr "Guardar"
+
+#: addons/web/static/src/js/views.js:615
+msgid "Close"
+msgstr "Cerrar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "x"
+msgstr "x"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#{title}"
+msgstr "#{title}"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#{text}"
+msgstr "#{text}"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Powered by"
+msgstr "Powered by"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "openerp.com"
+msgstr "openerp.com"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "."
+msgstr "."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Loading..."
+msgstr "Cargando..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create"
+msgstr "Crear"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Drop"
+msgstr "Borrar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Backup"
+msgstr "Respaldar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Restore"
+msgstr "Restaurar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Password"
+msgstr "Contraseña"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Back to Login"
+msgstr "Regresar a inicio de sesión"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CREATE DATABASE"
+msgstr "CREATE DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Master password:"
+msgstr "Master password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New database name:"
+msgstr "Nuevo nombre de la base de datos:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Load Demonstration data:"
+msgstr "Cargar datos de demostración"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Default language:"
+msgstr "Lenguaje por defecto:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Admin password:"
+msgstr "Admin password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm password:"
+msgstr "Confirmar password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "DROP DATABASE"
+msgstr "DROP DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Database:"
+msgstr "Base de datos:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Master Password:"
+msgstr "Master Password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "BACKUP DATABASE"
+msgstr "BACKUP DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "RESTORE DATABASE"
+msgstr "RESTORE DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "File:"
+msgstr "Archivo:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CHANGE MASTER PASSWORD"
+msgstr "CHANGE MASTER PASSWORD"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New master password:"
+msgstr "New master password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm new master password:"
+msgstr "Confirmar nueva master password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "User:"
+msgstr "Usuario:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Database"
+msgstr "Bases de datos"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Login"
+msgstr "Iniciar sesión"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Bad username or password"
+msgstr "Usuario o contraseña incorrectos"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"We think that daily job activities can be more intuitive, efficient, "
+"automated, .. and even fun."
+msgstr ""
+"Pensamos que el trabajo diario debe ser mas intuitivo, eficiente, "
+"automatizado, ... e incluso divertido."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP's vision to be:"
+msgstr "OpenERP's vision to be:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Full featured"
+msgstr "Full featured"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Today's enterprise challenges are multiple. We provide one module for each "
+"need."
+msgstr ""
+"Today's enterprise challenges are multiple. We provide one module for each "
+"need."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Open Source"
+msgstr "Open Source"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"To Build a great product, we rely on the knowledge of thousands of "
+"contributors."
+msgstr ""
+"To Build a great product, we rely on the knowledge of thousands of "
+"contributors."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "User Friendly"
+msgstr "User Friendly"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"In order to be productive, people need clean and easy to use interface."
+msgstr ""
+"Para ser productivo, los usuarios necesitan una interfaz limpia y fácil de "
+"usar."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "("
+msgstr "("
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ")"
+msgstr ")"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "LOGOUT"
+msgstr "LOGOUT"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&laquo;"
+msgstr "&laquo;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&raquo;"
+msgstr "&raquo;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_menu_item"
+msgstr "oe_secondary_menu_item"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_submenu_item"
+msgstr "oe_secondary_submenu_item"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Hide this tip"
+msgstr "Ocultar este tip"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Disable all tips"
+msgstr "Desactivar todas las sugerencias"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View#"
+msgstr "View#"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Fields"
+msgstr "Campos"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View labels"
+msgstr "Ver etiquetas"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Sidebar Relates"
+msgstr "Columna lateral relacionada"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Field"
+msgstr "Campo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ":"
+msgstr ":"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Translate view"
+msgstr "Traducir vista"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Translate sidebar"
+msgstr "Traducir Barra lateral"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delete"
+msgstr "Eliminar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "First"
+msgstr "Primero"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "<"
+msgstr "<"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ">"
+msgstr ">"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Last"
+msgstr "Último"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "♻"
+msgstr "♻"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & Edit"
+msgstr "Grabar & Editar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create & Edit"
+msgstr "Crear & Editar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New"
+msgstr "Nuevo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Readonly/Editable"
+msgstr "Sólo Lectura/Editable"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "<<"
+msgstr "<<"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "0"
+msgstr "0"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "/"
+msgstr "/"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ">>"
+msgstr ">>"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Add"
+msgstr "Agregar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Unhandled widget"
+msgstr "Wdiget no controlado"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "?"
+msgstr "?"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#"
+msgstr "#"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Done"
+msgstr "Realizado"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Open..."
+msgstr "Abrir…"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create..."
+msgstr "Crear..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Search..."
+msgstr "Buscar..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "..."
+msgstr "..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Uploading ..."
+msgstr "Subiendo..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Select"
+msgstr "Seleccionar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Clear"
+msgstr "Limpiar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Advanced Filter"
+msgstr "Filtro Avanzado"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "-- Filters --"
+msgstr "-- Filtros --"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "-- Actions --"
+msgstr "-- Acciones --"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save Filter"
+msgstr "Guardar Filtro"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Manage Filters"
+msgstr "Gestionar filtros"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Filter Name:"
+msgstr "Nombre del Filtro:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "(Any existing filter with the same name will be replaced)"
+msgstr "(Cualquier filtro existente con el mismo nombre será reemplazado)"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Any of the following conditions must match"
+msgstr "Cualquiera de las siguientes condiciones debe coincidir"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "All the following conditions must match"
+msgstr "Todas las siguientes condiciones deben coincidir"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "None of the following conditions must match"
+msgstr "Ninguna de las siguientes condiciones debe coincidir"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Add condition"
+msgstr "Agregar condición"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "and"
+msgstr "y"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & New"
+msgstr "Grabar & Nuevo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & Close"
+msgstr "Grabar & Cerrar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export"
+msgstr "Exportar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"This wizard will export all data that matches the current search criteria to "
+"a CSV file.\n"
+"            You can export all data or only the fields that can be "
+"reimported after modification."
+msgstr ""
+"Este asistente exportará todos los datos que coincidan con el criterio de "
+"búsqueda actual a un archivo CSV.\n"
+"            Tu puedes exportar todos los datos o solo los campos que serán "
+"reimportados después de la modificación."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export Type:"
+msgstr "Tipo de Exportación"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Compatible Export"
+msgstr "Import Compatible Export"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export all Data"
+msgstr "Exportar todos los datos"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export Formats"
+msgstr "Formato para exportar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Available fields"
+msgstr "Campos disponibles"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Fields to export"
+msgstr "Campos a exportar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save fields list"
+msgstr "Guardar lista de campos"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Remove"
+msgstr "Eliminar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Remove All"
+msgstr "Borrar todo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Name"
+msgstr "Nombre"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&nbsp;"
+msgstr "&nbsp;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save as:"
+msgstr "Guardar Como:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Ok"
+msgstr "Ok"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Saved exports:"
+msgstr "Exportaciones guardadas:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Old Password:"
+msgstr "Password anterior:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New Password:"
+msgstr "Nueva Password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm Password:"
+msgstr "Confirmar Password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import"
+msgstr "Importar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "1. Import a .CSV file"
+msgstr "1. Importar a archivo .CSV"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Select a .CSV file to import. If you need a sample of file to import,\n"
+"       you should use the export tool with the \"Import Compatible\" option."
+msgstr ""
+"Seleccionar un .archivo CSV para importar. Si necesitas un ejemplo de un "
+"archivo para importar,\n"
+"       you podrías usar la herramienta de exportar con la opción de "
+"\"Compatible con Importación\"."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CSV File:"
+msgstr "Archivo CSV:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "2. Check your file format"
+msgstr "Revisa tu formato de archivo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Options"
+msgstr "Opciones para importar"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Does your file have titles?"
+msgstr "Tiene tu archivo títulos ?"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Separator:"
+msgstr "Separador:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delimiter:"
+msgstr "Delimitador:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Encoding:"
+msgstr "Codificación:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "UTF-8"
+msgstr "UTF-8"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Latin 1"
+msgstr "Latin 1"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Lines to skip"
+msgstr "Líneas a omitir"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "The import failed due to:"
+msgstr "La importación falló debido a:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Here is a preview of the file we could not import:"
+msgstr "Aquí está una vista preliminar del archivo que no podemos importar:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP Web"
+msgstr "OpenERP Web"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Version"
+msgstr "Versión"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Copyright © 2011-TODAY OpenERP SA. All Rights Reserved."
+msgstr "Copyright © 2011-TODAY OpenERP SA. All Rights Reserved."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP is a trademark of the"
+msgstr "OpenERP es una marca registrada de"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP SA Company"
+msgstr "OpenERP SA Company"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Licenced under the terms of"
+msgstr "Licenciado bajo los términos de"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "GNU Affero General Public License"
+msgstr "GNU Affero General Public License"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "About OpenERP"
+msgstr "Acerca de OpenERP"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP"
+msgstr "OpenERP"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"is a free enterprise-scale software system that is designed to boost\n"
+"            productivity and profit through data integration. It connects, "
+"improves and\n"
+"            manages business processes in areas such as sales, finance, "
+"supply chain,\n"
+"            project management, production, services, CRM, etc..."
+msgstr ""
+"is a free enterprise-scale software system that is designed to boost\n"
+"            productivity and profit through data integration. It connects, "
+"improves and\n"
+"            manages business processes in areas such as sales, finance, "
+"supply chain,\n"
+"            project management, production, services, CRM, etc..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"The system is platform-independent, and can be installed on Windows, Mac OS "
+"X,\n"
+"            and various Linux and other Unix-based distributions. Its "
+"architecture enables\n"
+"            new functionality to be rapidly created, modifications to be "
+"made to a\n"
+"            production system and migration to a new version to be "
+"straightforward."
+msgstr ""
+"The system is platform-independent, and can be installed on Windows, Mac OS "
+"X,\n"
+"            and various Linux and other Unix-based distributions. Its "
+"architecture enables\n"
+"            new functionality to be rapidly created, modifications to be "
+"made to a\n"
+"            production system and migration to a new version to be "
+"straightforward."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Depending on your needs, OpenERP is available through a web or application "
+"client."
+msgstr ""
+"Dependiendo de tus necesidades, OpenERP está disponible através de un "
+"cliente web o escritorio."
diff --git a/addons/web/po/it.po b/addons/web/po/it.po
new file mode 100644 (file)
index 0000000..fc53244
--- /dev/null
@@ -0,0 +1,689 @@
+# Italian translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
+"PO-Revision-Date: 2011-10-08 13:39+0000\n"
+"Last-Translator: Nicola Riolini - Micronaet <Unknown>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-09 05:22+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web/static/src/js/view_form.js:355
+msgid ""
+"Warning, the record has been modified, your changes will be discarded."
+msgstr ""
+"Attenzione, il record è stato modificato, i vostri cambiamenti verranno "
+"scartati."
+
+#: addons/web/static/src/js/view_form.js:1659
+msgid "<em>   Search More...</em>"
+msgstr "<em>   Cerca ancora...</em>"
+
+#: addons/web/static/src/js/view_form.js:1672
+#, python-format
+msgid "<em>   Create \"<strong>%s</strong>\"</em>"
+msgstr "<em>   Crea \"<strong>%s</strong>\"</em>"
+
+#: addons/web/static/src/js/view_form.js:1678
+msgid "<em>   Create and Edit...</em>"
+msgstr "<em>   Crea e modifica...</em>"
+
+#: addons/web/static/src/js/views.js:568
+msgid "You must choose at least one record."
+msgstr "E' necessario selezionare almeno un record."
+
+#: addons/web/static/src/js/views.js:569
+msgid "Warning"
+msgstr "Attenzione"
+
+#: addons/web/static/src/js/views.js:609
+msgid "Translations"
+msgstr "Traduzioni"
+
+#: addons/web/static/src/js/views.js:614 addons/web/static/src/xml/base.xml:0
+msgid "Save"
+msgstr "Salva"
+
+#: addons/web/static/src/js/views.js:615
+msgid "Close"
+msgstr "Chiudi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "x"
+msgstr "x"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#{title}"
+msgstr "#{title}"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#{text}"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Powered by"
+msgstr "Powered by"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "openerp.com"
+msgstr "openerp.com"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "."
+msgstr "."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Loading..."
+msgstr "Caricamento..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create"
+msgstr "Crea"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Drop"
+msgstr "Elimina"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Backup"
+msgstr "Backup"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Restore"
+msgstr "Ripristina"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Password"
+msgstr "Password"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Back to Login"
+msgstr "Ritorno al Login"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CREATE DATABASE"
+msgstr "CREA DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Master password:"
+msgstr "Password principale"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New database name:"
+msgstr "Nome nuovo database:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Load Demonstration data:"
+msgstr "Caricadati dimostrativi:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Default language:"
+msgstr "Lingua predefinita:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Admin password:"
+msgstr "Password di amministrazione:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm password:"
+msgstr "Conferma password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "DROP DATABASE"
+msgstr "ELIMINA DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Database:"
+msgstr "Database:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Master Password:"
+msgstr "Password principale"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "BACKUP DATABASE"
+msgstr "BACKUP DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "RESTORE DATABASE"
+msgstr "RIPRISTINA DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "File:"
+msgstr "File:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CHANGE MASTER PASSWORD"
+msgstr "CAMBIA PASSWORD PRINCIPALE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New master password:"
+msgstr "Nuova password principale:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm new master password:"
+msgstr "Conferma nuova password principale"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "User:"
+msgstr "Utente:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Password:"
+msgstr "Password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Database"
+msgstr "Database"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Login"
+msgstr "Login"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Bad username or password"
+msgstr "Username o password errati"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"We think that daily job activities can be more intuitive, efficient, "
+"automated, .. and even fun."
+msgstr ""
+"Pensiamo che le attività quotidiane possano essere più intuitive, "
+"efficienti, automatizzate...e anche più divertenti."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP's vision to be:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Full featured"
+msgstr "Completo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Today's enterprise challenges are multiple. We provide one module for each "
+"need."
+msgstr ""
+"Le esigenze odierne delle aziende sono molteplici. Noi forniamo un modulo "
+"per ogni necessità."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Open Source"
+msgstr "Open Source"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"To Build a great product, we rely on the knowledge of thousands of "
+"contributors."
+msgstr ""
+"Per creare un buon prodotto, facciamo affidamento sull'esperienza di "
+"migliaia di contributori."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "User Friendly"
+msgstr "User Friendly"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"In order to be productive, people need clean and easy to use interface."
+msgstr ""
+"Per essere produttive, le persone necessitano di interfacce semplici e "
+"pulite."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "("
+msgstr "("
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ")"
+msgstr ")"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "LOGOUT"
+msgstr "LOGOUT"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&laquo;"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&raquo;"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_menu_item"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_submenu_item"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Hide this tip"
+msgstr "Nascondi questo consiglio"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Disable all tips"
+msgstr "Disabilita tutti i consigli"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View#"
+msgstr "Vista à"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Fields"
+msgstr "Campi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View labels"
+msgstr "Visualizza etichette"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Sidebar Relates"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Field"
+msgstr "Campo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ":"
+msgstr ":"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Translate view"
+msgstr "Traduci vista"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Translate sidebar"
+msgstr "Traduci barra laterale"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delete"
+msgstr "Elimina"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "First"
+msgstr "Primo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "<"
+msgstr "<"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ">"
+msgstr ">"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Last"
+msgstr "Ultimo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "♻"
+msgstr "♻"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & Edit"
+msgstr "Salva & Modifica"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create & Edit"
+msgstr "Crea & Modifica"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New"
+msgstr "Nuovo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Duplicate"
+msgstr "Duplica"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Readonly/Editable"
+msgstr "Sola lettura / Modificabile"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "<<"
+msgstr "<<"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "0"
+msgstr "0"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "/"
+msgstr "/"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ">>"
+msgstr ">>"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Add"
+msgstr "Aggiungi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Unhandled widget"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "?"
+msgstr "?"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#"
+msgstr "#"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Done"
+msgstr "Completato"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Open..."
+msgstr "Apri..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create..."
+msgstr "Crea..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Search..."
+msgstr "Cerca..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "..."
+msgstr "..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Uploading ..."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Select"
+msgstr "Seleziona"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save As"
+msgstr "Salva come"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Clear"
+msgstr "Pulisci"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Advanced Filter"
+msgstr "Filtro avanzato"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "-- Filters --"
+msgstr "-- Filtri --"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "-- Actions --"
+msgstr "-- Azioni --"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save Filter"
+msgstr "Salva Filtro"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Manage Filters"
+msgstr "Gestisci Filtri"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Filter Name:"
+msgstr "Nome filtro:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "(Any existing filter with the same name will be replaced)"
+msgstr "(Eventuali filtri esistenti con lo stesso nome saranno rimpiazzati)"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Any of the following conditions must match"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "All the following conditions must match"
+msgstr "Tutte le seguenti condizioni deve verificarsi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "None of the following conditions must match"
+msgstr "Nessuna delle seguenti condizioni deve verificarsi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Add condition"
+msgstr "Aggiungi condizione"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "and"
+msgstr "e"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Cancel"
+msgstr "Annulla"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & New"
+msgstr "Salva & Nuovo"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & Close"
+msgstr "Salva & Chiudi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export"
+msgstr "Esporta"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"This wizard will export all data that matches the current search criteria to "
+"a CSV file.\n"
+"            You can export all data or only the fields that can be "
+"reimported after modification."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export Type:"
+msgstr "Tipo di esportazione:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Compatible Export"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export all Data"
+msgstr "Esporta tutti i dati"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export Formats"
+msgstr "Formati esportazione"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Available fields"
+msgstr "Campi disponibili"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Fields to export"
+msgstr "Campi da esportare"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save fields list"
+msgstr "Salva l'elenco dei campi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Remove All"
+msgstr "Rimuovi tutto"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Name"
+msgstr "Nome"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&nbsp;"
+msgstr "&nbsp;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save as:"
+msgstr "Salva come:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Ok"
+msgstr "Ok"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Saved exports:"
+msgstr "Esportazioni salvate:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Old Password:"
+msgstr "Vecchia Password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New Password:"
+msgstr "Nuova password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm Password:"
+msgstr "Conferma password:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import"
+msgstr "Importa"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "1. Import a .CSV file"
+msgstr "1. Importa un file .CSV"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Select a .CSV file to import. If you need a sample of file to import,\n"
+"       you should use the export tool with the \"Import Compatible\" option."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CSV File:"
+msgstr "File CSV:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "2. Check your file format"
+msgstr "2. Controlla il formato del tuo file"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Options"
+msgstr "Opzioni di importazione"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Does your file have titles?"
+msgstr "Il vostro file ha i titoli?"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Separator:"
+msgstr "Separatore:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delimiter:"
+msgstr "Delimitatore:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Encoding:"
+msgstr "Codifica:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "UTF-8"
+msgstr "UTF-8"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Latin 1"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Lines to skip"
+msgstr "Linee da saltare"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "The import failed due to:"
+msgstr "L'importazione è fallita a causa di:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Here is a preview of the file we could not import:"
+msgstr "Ecco un anteprima del file che non si è riuscito ad importare:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP Web"
+msgstr "OpenERP Web"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Version"
+msgstr "Versione"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Copyright © 2011-TODAY OpenERP SA. All Rights Reserved."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP is a trademark of the"
+msgstr "OpenERP è un marchio di"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP SA Company"
+msgstr "OpenERP SA Company"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Licenced under the terms of"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "GNU Affero General Public License"
+msgstr "GNU Affero General Public License"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "About OpenERP"
+msgstr "Informazioni su OpenERP"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP"
+msgstr "OpenERP"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"is a free enterprise-scale software system that is designed to boost\n"
+"            productivity and profit through data integration. It connects, "
+"improves and\n"
+"            manages business processes in areas such as sales, finance, "
+"supply chain,\n"
+"            project management, production, services, CRM, etc..."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"The system is platform-independent, and can be installed on Windows, Mac OS "
+"X,\n"
+"            and various Linux and other Unix-based distributions. Its "
+"architecture enables\n"
+"            new functionality to be rapidly created, modifications to be "
+"made to a\n"
+"            production system and migration to a new version to be "
+"straightforward."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Depending on your needs, OpenERP is available through a web or application "
+"client."
+msgstr ""
+"In base alle tue esigenze, OpenERP è disponibile tramite un browse web o "
+"un'applicazione client."
diff --git a/addons/web/po/nl_BE.po b/addons/web/po/nl_BE.po
new file mode 100644 (file)
index 0000000..2a2dccb
--- /dev/null
@@ -0,0 +1,689 @@
+# Dutch (Belgium) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
+"PO-Revision-Date: 2011-10-07 12:50+0000\n"
+"Last-Translator: Niels Huylebroeck <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:29+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web/static/src/js/view_form.js:355
+msgid ""
+"Warning, the record has been modified, your changes will be discarded."
+msgstr ""
+"Opgelet, het record werd gewijzigd, uw veranderingen zullen niet opgeslagen "
+"worden."
+
+#: addons/web/static/src/js/view_form.js:1659
+msgid "<em>   Search More...</em>"
+msgstr "<em>   Uitgebreid zoeken...</em>"
+
+#: addons/web/static/src/js/view_form.js:1672
+#, python-format
+msgid "<em>   Create \"<strong>%s</strong>\"</em>"
+msgstr "<em>   Creër \"<strong>%s</strong>\"</em>"
+
+#: addons/web/static/src/js/view_form.js:1678
+msgid "<em>   Create and Edit...</em>"
+msgstr "<em>   Creër en bewerk...</em>"
+
+#: addons/web/static/src/js/views.js:568
+msgid "You must choose at least one record."
+msgstr "U moet minstens een record selecteren."
+
+#: addons/web/static/src/js/views.js:569
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#: addons/web/static/src/js/views.js:609
+msgid "Translations"
+msgstr "Vertalingen"
+
+#: addons/web/static/src/js/views.js:614 addons/web/static/src/xml/base.xml:0
+msgid "Save"
+msgstr "Opslaan"
+
+#: addons/web/static/src/js/views.js:615
+msgid "Close"
+msgstr "Sluiten"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "x"
+msgstr "x"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#{title}"
+msgstr "#{title}"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#{text}"
+msgstr "#{text}"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Powered by"
+msgstr "Mogelijk gemaakt door"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "openerp.com"
+msgstr "openerp.com"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "."
+msgstr "."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Loading..."
+msgstr "Laden..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create"
+msgstr "Creër"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Drop"
+msgstr "Drop"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Backup"
+msgstr "Backup"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Restore"
+msgstr "Restore"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Back to Login"
+msgstr "Terug naar aanmelding"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CREATE DATABASE"
+msgstr "CREATE DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Master password:"
+msgstr "Master wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New database name:"
+msgstr "Nieuwe database naam:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Load Demonstration data:"
+msgstr "Demonstratie data laden:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Default language:"
+msgstr "Standaard taal:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Admin password:"
+msgstr "Beheerder wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm password:"
+msgstr "Bevestig wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "DROP DATABASE"
+msgstr "DROP DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Database:"
+msgstr "Database:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Master Password:"
+msgstr "Master wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "BACKUP DATABASE"
+msgstr "BACKUP DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "RESTORE DATABASE"
+msgstr "RESTORE DATABASE"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "File:"
+msgstr "Bestand:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CHANGE MASTER PASSWORD"
+msgstr "CHANGE MASTER PASSWORD"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New master password:"
+msgstr "Nieuw master wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm new master password:"
+msgstr "Bevestig nieuw master wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "User:"
+msgstr "Gebruiker:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Database"
+msgstr "Database"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Login"
+msgstr "Login"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Bad username or password"
+msgstr "Verkeerde gebruikersnaam of wachtwoord"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"We think that daily job activities can be more intuitive, efficient, "
+"automated, .. and even fun."
+msgstr ""
+"Wij geloven dat je dagelijkse werk intuitiver, efficienter, geautomatiseerd "
+"en leuker kan zijn."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP's vision to be:"
+msgstr "OpenERP's visie is:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Full featured"
+msgstr "Volledig uitgerust"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Today's enterprise challenges are multiple. We provide one module for each "
+"need."
+msgstr ""
+"Hedendaagse uitdaging voor bedrijven zijn alom. Wij voorzien een module voor "
+"elke uitdaging."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Open Source"
+msgstr "Open Source"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"To Build a great product, we rely on the knowledge of thousands of "
+"contributors."
+msgstr ""
+"Om een geweldig product te maken vertrouwen we op de kennis van duizenden "
+"mensen."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "User Friendly"
+msgstr "Gebruiksvriendelijk"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"In order to be productive, people need clean and easy to use interface."
+msgstr ""
+"Om productief te kunnen zijn hebben mensen een mooie en gemakkelijke "
+"interface nodig."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "("
+msgstr "("
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ")"
+msgstr ")"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "LOGOUT"
+msgstr "LOGOUT"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&laquo;"
+msgstr "&laquo;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&raquo;"
+msgstr "&raquo;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_menu_item"
+msgstr "oe_secondary_menu_item"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_submenu_item"
+msgstr "oe_secondary_submenu_item"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Hide this tip"
+msgstr "Verberg deze tip"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Disable all tips"
+msgstr "Verberg alle tips"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View#"
+msgstr "View#"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Fields"
+msgstr "Velden"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View labels"
+msgstr "Toon labels"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Sidebar Relates"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Field"
+msgstr "Veld"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ":"
+msgstr ":"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Translate view"
+msgstr "Vertaal scherm"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Translate sidebar"
+msgstr "Vertaal balk"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delete"
+msgstr "Verwijder"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "First"
+msgstr "Eerste"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "<"
+msgstr "<"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ">"
+msgstr ">"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Last"
+msgstr "Laatste"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "♻"
+msgstr "♻"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & Edit"
+msgstr "Opslaan & Bewerken"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create & Edit"
+msgstr "Creër & Bewerk"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New"
+msgstr "Nieuw"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Duplicate"
+msgstr "Dupliceer"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Readonly/Editable"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "<<"
+msgstr "<<"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "0"
+msgstr "0"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "/"
+msgstr "/"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ">>"
+msgstr ">>"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Add"
+msgstr "Toevoegen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Unhandled widget"
+msgstr "Niet-verwerkbare widget"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "?"
+msgstr "?"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "#"
+msgstr "#"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Done"
+msgstr "Voltooid"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Open..."
+msgstr "Open..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Create..."
+msgstr "Creër..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Search..."
+msgstr "Zoeken..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "..."
+msgstr "..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Uploading ..."
+msgstr "Uploaden ..."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Select"
+msgstr "Selecteer"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save As"
+msgstr "Opslaan als"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Clear"
+msgstr "Leegmaken"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Advanced Filter"
+msgstr "Geavanceerde filter"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "-- Filters --"
+msgstr "-- Filters --"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "-- Actions --"
+msgstr "-- Acties --"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save Filter"
+msgstr "Filter opslaan"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Manage Filters"
+msgstr "Filters beheren"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Filter Name:"
+msgstr "Filternaam:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "(Any existing filter with the same name will be replaced)"
+msgstr "(Bestaande filters met dezelfde naam worden overschreven)"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Any of the following conditions must match"
+msgstr "Een van de volgende voorwaarden moet overeenstemmen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "All the following conditions must match"
+msgstr "Elke van de volgende voorwaarden moeten overeenstemmen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "None of the following conditions must match"
+msgstr "Geen enkele van de volgende voorwaarden moeten overeenstemmen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Add condition"
+msgstr "Voorwaarde toevoegen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "and"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & New"
+msgstr "Opslaan & Nieuwe"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save & Close"
+msgstr "Opslaan & Sluiten"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export"
+msgstr "Exporteren"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"This wizard will export all data that matches the current search criteria to "
+"a CSV file.\n"
+"            You can export all data or only the fields that can be "
+"reimported after modification."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export Type:"
+msgstr "Export Type:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Compatible Export"
+msgstr "Exporteren op een compatibele manier"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export all Data"
+msgstr "Alles exporteren"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Export Formats"
+msgstr "Export formaten"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Available fields"
+msgstr "Beschikbare velden"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Fields to export"
+msgstr "Te exporteren velden"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save fields list"
+msgstr "Export definitie opslaan"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Remove All"
+msgstr "Alles verwijderen"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Name"
+msgstr "Naam"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "&nbsp;"
+msgstr "&nbsp;"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Save as:"
+msgstr "Opslaan als:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Ok"
+msgstr "Ok"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Saved exports:"
+msgstr "Export definities"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Old Password:"
+msgstr "Huidig wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "New Password:"
+msgstr "Nieuw wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Confirm Password:"
+msgstr "Bevestig wachtwoord:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import"
+msgstr "Importeren"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "1. Import a .CSV file"
+msgstr "1. Importeer een .CSV bestand"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Select a .CSV file to import. If you need a sample of file to import,\n"
+"       you should use the export tool with the \"Import Compatible\" option."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CSV File:"
+msgstr "CSV Bestand:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "2. Check your file format"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Options"
+msgstr "Import opties"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Does your file have titles?"
+msgstr "Heeft uw bestand een hoofding ?"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Separator:"
+msgstr "Scheidingsteken"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delimiter:"
+msgstr "Veld begrenzing"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Encoding:"
+msgstr "Encodering:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "UTF-8"
+msgstr "UTF-8"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Latin 1"
+msgstr "Latin 1"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Lines to skip"
+msgstr "Aantal lijnen overslaan"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "The import failed due to:"
+msgstr "De import is niet gelukt omdat:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Here is a preview of the file we could not import:"
+msgstr "Hier is een voorbeeld van het bestand dat we niet konden importeren:"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP Web"
+msgstr "OpenERP Web"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Version"
+msgstr "Versie"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Copyright © 2011-TODAY OpenERP SA. All Rights Reserved."
+msgstr "Copyright © 2011-TODAY OpenERP SA. Alle rechten voorbehouden."
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP is a trademark of the"
+msgstr "OpenERP is een handelsmerk van"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP SA Company"
+msgstr "OpenERP SA Company"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Licenced under the terms of"
+msgstr "Gelicensieërd onder de voorwaarden van"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "GNU Affero General Public License"
+msgstr "GNU Affero General Public License"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "About OpenERP"
+msgstr "About OpenERP"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "OpenERP"
+msgstr "OpenERP"
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"is a free enterprise-scale software system that is designed to boost\n"
+"            productivity and profit through data integration. It connects, "
+"improves and\n"
+"            manages business processes in areas such as sales, finance, "
+"supply chain,\n"
+"            project management, production, services, CRM, etc..."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"The system is platform-independent, and can be installed on Windows, Mac OS "
+"X,\n"
+"            and various Linux and other Unix-based distributions. Its "
+"architecture enables\n"
+"            new functionality to be rapidly created, modifications to be "
+"made to a\n"
+"            production system and migration to a new version to be "
+"straightforward."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Depending on your needs, OpenERP is available through a web or application "
+"client."
+msgstr ""
+"Afhankelijk van uw behoefte is OpenERP beschikbaar via een web- of desktop-"
+"applicatie."
index 8d302a4..adfa150 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,28 +17,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: addons/web/static/src/js/form.js:1473
+#: addons/web/static/src/js/view_form.js:355
+msgid "Warning, the record has been modified, your changes will be discarded."
+msgstr ""
+
+#: addons/web/static/src/js/view_form.js:1659
 msgid "<em>   Search More...</em>"
 msgstr ""
 
-#: addons/web/static/src/js/form.js:1486
+#: addons/web/static/src/js/view_form.js:1672
 #, python-format
 msgid "<em>   Create \"<strong>%s</strong>\"</em>"
 msgstr ""
 
-#: addons/web/static/src/js/form.js:1492
+#: addons/web/static/src/js/view_form.js:1678
 msgid "<em>   Create and Edit...</em>"
 msgstr ""
 
-#: addons/web/static/src/js/views.js:484
+#: addons/web/static/src/js/views.js:568
+msgid "You must choose at least one record."
+msgstr ""
+
+#: addons/web/static/src/js/views.js:569
+msgid "Warning"
+msgstr ""
+
+#: addons/web/static/src/js/views.js:609
 msgid "Translations"
 msgstr ""
 
-#: addons/web/static/src/js/views.js:489 addons/web/static/src/xml/base.xml:0
+#: addons/web/static/src/js/views.js:614 addons/web/static/src/xml/base.xml:0
 msgid "Save"
 msgstr ""
 
-#: addons/web/static/src/js/views.js:490
+#: addons/web/static/src/js/views.js:615
 msgid "Close"
 msgstr ""
 
@@ -229,23 +241,31 @@ msgid "LOGOUT"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "h3"
+msgid "&laquo;"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "<"
+msgid "&raquo;"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid ">"
+msgid "oe_secondary_menu_item"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "oe_secondary_submenu_item"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "</"
+msgid "Hide this tip"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "h4"
+msgid "Disable all tips"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "View#"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
@@ -285,15 +305,19 @@ msgid "First"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "Last"
+msgid "<"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "♻"
+msgid ">"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
-msgid "View#"
+msgid "Last"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "♻"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
@@ -309,6 +333,14 @@ msgid "New"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
+msgid "Duplicate"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Readonly/Editable"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
 msgid "<<"
 msgstr ""
 
@@ -337,6 +369,14 @@ msgid "?"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
+msgid "#"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Done"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
 msgid "Open..."
 msgstr ""
 
@@ -509,6 +549,69 @@ msgid "Confirm Password:"
 msgstr ""
 
 #: addons/web/static/src/xml/base.xml:0
+msgid "Import"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "1. Import a .CSV file"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid ""
+"Select a .CSV file to import. If you need a sample of file to import,\n"
+"       you should use the export tool with the \"Import Compatible\" "
+"option."
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "CSV File:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "2. Check your file format"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Import Options"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Does your file have titles?"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Separator:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Delimiter:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Encoding:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "UTF-8"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Latin 1"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Lines to skip"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "The import failed due to:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
+msgid "Here is a preview of the file we could not import:"
+msgstr ""
+
+#: addons/web/static/src/xml/base.xml:0
 msgid "OpenERP Web"
 msgstr ""
 
index 7f5b7f5..0e2a4e9 100644 (file)
@@ -855,7 +855,7 @@ label.error {
     cursor: help;
 }
 
-.openerp .oe_form_field label.oe_label, .openerp .oe_form_field label.oe_label_help {
+.openerp .oe_forms label.oe_label, .openerp .oe_forms label.oe_label_help {
     text-align: right;
     margin: 3px 0 0 10px;
 }
@@ -943,7 +943,7 @@ label.error {
     position: relative;
 }
 .openerp input.oe-binary-file {
-    z-index: 2;
+    z-index: 0;
     line-height: 0;
     font-size: 50px;
     position: absolute;
index e7feedf..d3d88bc 100644 (file)
@@ -179,9 +179,13 @@ openerp.web.auto_date_to_str = function(value, type) {
  * @param {String} [column.string] button label
  * @param {String} [column.icon] button icon
  * @param {String} [value_if_empty=''] what to display if the field's value is ``false``
+ * @param {Boolean} [process_modifiers=true] should the modifiers be computed ?
  */
-openerp.web.format_cell = function (row_data, column, value_if_empty) {
-    var attrs = column.modifiers_for(row_data);
+openerp.web.format_cell = function (row_data, column, value_if_empty, process_modifiers) {
+    var attrs = {};
+    if (process_modifiers !== false) {
+        attrs = column.modifiers_for(row_data);
+    }
     if (attrs.invisible) { return ''; }
     if (column.tag === 'button') {
         return [
index cf253c3..9cab0ad 100644 (file)
@@ -116,8 +116,9 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search
      */
     make_field: function (item, field) {
         try {
-            return new (openerp.web.search.fields.get_object(field.type))
-                        (item, field, this);
+            return new (openerp.web.search.fields.get_any(
+                    [item.attrs.widget, field.type]))
+                (item, field, this);
         } catch (e) {
             if (! e instanceof openerp.web.KeyNotFound) {
                 throw e;
@@ -338,7 +339,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search
         this.notification.notify("Invalid Search", "triggered from search view");
     },
     do_clear: function () {
-        this.$element.find('.filter_label').removeClass('enabled');
+        this.$element.find('.filter_label, .filter_icon').removeClass('enabled');
         this.enabled_filters.splice(0);
         var string = $('a.searchview_group_string');
         _.each(string, function(str){
@@ -759,9 +760,44 @@ openerp.web.search.FloatField = openerp.web.search.NumberField.extend(/** @lends
  * @extends openerp.web.search.Field
  */
 openerp.web.search.SelectionField = openerp.web.search.Field.extend(/** @lends openerp.web.search.SelectionField# */{
+    // This implementation is a basic <select> field, but it may have to be
+    // altered to be more in line with the GTK client, which uses a combo box
+    // (~ jquery.autocomplete):
+    // * If an option was selected in the list, behave as currently
+    // * If something which is not in the list was entered (via the text input),
+    //   the default domain should become (`ilike` string_value) but **any
+    //   ``context`` or ``filter_domain`` becomes falsy, idem if ``@operator``
+    //   is specified. So at least get_domain needs to be quite a bit
+    //   overridden (if there's no @value and there is no filter_domain and
+    //   there is no @operator, return [[name, 'ilike', str_val]]
     template: 'SearchView.field.selection',
+    init: function () {
+        this._super.apply(this, arguments);
+        // prepend empty option if there is no empty option in the selection list
+        this.prepend_empty = !_(this.attrs.selection).detect(function (item) {
+            return !item[1];
+        });
+    },
     get_value: function () {
-        return this.$element.val();
+        var index = parseInt(this.$element.val(), 10);
+        if (isNaN(index)) { return null; }
+        var value = this.attrs.selection[index][0];
+        if (value === false) { return null; }
+        return value;
+    },
+    /**
+     * The selection field needs a default ``false`` value in case none is
+     * provided, so that selector options with a ``false`` value (convention
+     * for explicitly empty options) get selected by default rather than the
+     * first (value-holding) option in the selection.
+     *
+     * @param {Object} defaults search default values
+     */
+    render: function (defaults) {
+        if (!defaults[this.attrs.name]) {
+            defaults[this.attrs.name] = false;
+        }
+        return this._super(defaults);
     }
 });
 openerp.web.search.BooleanField = openerp.web.search.SelectionField.extend(/** @lends openerp.web.search.BooleanField# */{
index 4982e93..aecb7e5 100644 (file)
@@ -896,11 +896,11 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
                             self.on_confirmed().then(function() {
                                 def.resolve();
                             });
-                            $(self).dialog("close");
+                            $(this).dialog("close");
                         },
                         Cancel: function() {
                             def.resolve();
-                            $(self).dialog("close");
+                            $(this).dialog("close");
                         }
                     }
                 });
@@ -909,7 +909,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
                 return self.on_confirmed();
             }
         };
-        if ((!this.node.attrs.special && this.view.dirty_for_user) || !this.view.datarecord.id) {
+        if (!this.node.attrs.special && (this.view.dirty_for_user || !this.view.datarecord.id)) {
             return this.view.recursive_save().pipe(exec_action);
         } else {
             return exec_action();
@@ -1785,6 +1785,9 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
             result.result.context = _.extend(result.result.context || {}, additional_context);
             self.do_action(result.result);
         });
+    },
+    focus: function () {
+        this.$input.focus();
     }
 });
 
@@ -1894,6 +1897,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
                     self.save_form_view();
                 });
                 controller.$element.find(".oe_form_button_save_edit").hide();
+            } else if (view_type == "graph") {
+                self.reload_current_view()
             }
             self.is_started.resolve();
         });
@@ -1916,6 +1921,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
             this.form_last_update.then(function() {
                 this.form_last_update = view.do_show();
             });
+        } else if (self.viewmanager.active_view === "graph") {
+            view.do_search(this.build_domain(), this.dataset.get_context(), []);
         }
     },
     set_value: function(value) {
@@ -2241,11 +2248,11 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
                 });
         this.searchview.on_search.add(function(domains, contexts, groupbys) {
             if (self.initial_ids) {
-                self.view_list.do_search.call(self, domains.concat([[["id", "in", self.initial_ids]], self.domain]),
+                self.do_search(domains.concat([[["id", "in", self.initial_ids]], self.domain]),
                     contexts, groupbys);
                 self.initial_ids = undefined;
             } else {
-                self.view_list.do_search.call(self, domains.concat([self.domain]), contexts, groupbys);
+                self.do_search(domains.concat([self.domain]), contexts, groupbys);
             }
         });
         this.searchview.on_loaded.add_last(function () {
@@ -2272,10 +2279,19 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
             }).pipe(function() {
                 self.searchview.do_search();
             });
-            
         });
         this.searchview.appendTo($("#" + this.element_id + "_search"));
     },
+    do_search: function(domains, contexts, groupbys) {
+        var self = this;
+        this.rpc('/web/session/eval_domain_and_context', {
+            domains: domains || [],
+            contexts: contexts || [],
+            group_by_seq: groupbys || []
+        }, function (results) {
+            self.view_list.do_search(results.domain, results.context, results.group_by);
+        });
+    },
     create_row: function(data) {
         var self = this;
         var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain);
index 7cceec0..f169e64 100644 (file)
@@ -471,6 +471,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
             _(ids).each(function (id) {
                 self.records.remove(self.records.get(id));
             });
+            self.configure_pager(self.dataset);
             self.compute_aggregates();
         });
     },
@@ -620,7 +621,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
             }
 
             $footer_cells.filter(_.sprintf('[data-field=%s]', column.id))
-                .html(openerp.web.format_cell(aggregation, column));
+                .html(openerp.web.format_cell(aggregation, column, undefined, false));
         });
     },
     get_selected_ids: function() {
index dc49c20..826508e 100644 (file)
@@ -22,6 +22,7 @@ openerp.web.list_editable = function (openerp) {
                     if (self.groups.get_selection().length) {
                         return;
                     }
+                    self.configure_pager(self.dataset);
                     self.compute_aggregates();
                 }
             })
index 9279d95..f0bbbe7 100644 (file)
@@ -116,6 +116,9 @@ db.web.ActionManager = db.web.Widget.extend({
         */
     },
     ir_actions_act_window_close: function (action, on_closed) {
+        if (!this.dialog && on_closed) {
+            on_closed();
+        }
         this.dialog_stop();
     },
     ir_actions_server: function (action, on_closed) {
@@ -379,7 +382,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
         var main_view_loaded = this._super();
 
         var manager_ready = $.when(searchview_loaded, main_view_loaded);
-        if (searchview_loaded && this.action['auto_search']) {
+        if (searchview_loaded && this.action['auto_search'] !== false) {
             // schedule auto_search
             manager_ready.then(this.searchview.do_search);
         }
index 3f06270..d0fbe16 100644 (file)
     <input type="text" size="1"
         t-att-name="widget.name"
         t-att-id="widget.element_id"
-        t-attf-class="field_#{widget.type} #{widget.element_class}"
+        t-attf-class="field_#{widget.type}"
         t-attf-style="width: #{widget.field.translate ? '99' : '100'}%"
     />
     <img class="oe_field_translate" t-if="widget.field.translate" src="/web/static/src/img/icons/terp-translate.png" width="16" height="16" border="0"/>
 <t t-name="FieldChar.readonly">
     <div
         t-att-id="widget.element_id"
-        t-attf-class="field_#{widget.type} #{widget.element_class}"
+        t-attf-class="field_#{widget.type}"
         t-attf-style="width: #{widget.field.translate ? '99' : '100'}%">
     </div>
 </t>
     <textarea rows="6"
         t-att-name="widget.name"
         t-att-id="widget.element_id"
-        t-attf-class="field_#{widget.type} #{widget.element_class}"
+        t-attf-class="field_#{widget.type}"
         t-attf-style="width: #{widget.field.translate ? '99' : '100'}%"
     ></textarea>
     <img class="oe_field_translate" t-if="widget.field.translate" src="/web/static/src/img/icons/terp-translate.png" width="16" height="16" border="0"/>
 <t t-name="FieldSelection">
     <select
         t-att-name="widget.name"
-        t-att-id="widget.element_id + '_field'"
-        t-attf-class="field_#{widget.type} #{widget.element_class}"
+        t-att-id="widget.element_id"
+        t-attf-class="field_#{widget.type}"
         style="width: 100%">
             <t t-foreach="widget.values" t-as="option">
                 <option><t t-esc="option[1]"/></option>
     </select>
 </t>
 <t t-name="FieldMany2One">
-    <div t-att-class="widget.element_class" class="oe-m2o">
-        <input type="text" size="1" style="width: 100%;"/>
+    <div class="oe-m2o">
+        <input type="text" size="1" style="width: 100%;"
+                t-att-id="widget.element_id"/>
         <span class="oe-m2o-drop-down-button">
             <img src="/web/static/src/img/down-arrow.png" /></span>
         <span class="oe-m2o-cm-button" t-att-id="widget.name + '_open'">
 <t t-name="FieldBoolean">
     <input type="checkbox"
         t-att-name="widget.name"
-        t-att-id="widget.element_id + '_field'"
-        t-attf-class="field_#{widget.type} #{widget.element_class}"/>
+        t-att-id="widget.element_id"
+        t-attf-class="field_#{widget.type}"/>
 </t>
 <t t-name="FieldProgressBar">
     <div t-opentag="true" class="oe-progressbar">
                 t-att-border="widget.readonly ? 0 : 1"
                 t-att-id="widget.element_id + '_field'"
                 t-att-name="widget.name"
-                t-attf-class="field_#{widget.type} #{widget.element_class}"
+                t-attf-class="field_#{widget.type}"
                 t-att-width="widget.node.attrs.img_width || widget.node.attrs.width"
                 t-att-height="widget.node.attrs.img_height || widget.node.attrs.height"
             />
             <input type="text" size="1"
                 t-att-name="widget.name"
                 t-att-id="widget.element_id + '_field'"
-                t-attf-class="field_#{widget.type} #{widget.element_class}" style="width: 100%"
+                t-attf-class="field_#{widget.type}" style="width: 100%"
             />
         </td>
         <td class="oe-binary" nowrap="true">
 </t>
 <t t-name="WidgetButton">
     <button type="button"
-        t-attf-class="#{widget.element_class}"
         t-att-title="widget.help"
         style="width: 100%" class="button">
         <img t-if="widget.node.attrs.icon" t-att-src="'/web/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/>
     <div style="white-space: nowrap;">
         <select t-att-name="attrs.name" t-att-id="element_id"
                 t-att-autofocus="attrs.default_focus === '1' || undefined">
-            <option/>
+            <option t-if="prepend_empty"/>
             <t t-foreach="attrs.selection" t-as="option">
                 <t t-set="selected" t-value="defaults[attrs.name] === option[0]"/>
                 <option t-if="selected"
-                        t-att-value="option[0]" selected="selected">
+                        t-att-value="option_index" selected="selected">
                     <t t-esc="option[1]"/>
                 </option>
-                <option t-if="!selected" t-att-value="option[0]">
+                <option t-if="!selected" t-att-value="option_index">
                     <t t-esc="option[1]"/>
                 </option>
             </t>
index ba18ef0..1eba260 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "web calendar",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": ['web'],
     "js": [
diff --git a/addons/web_calendar/po/es_EC.po b/addons/web_calendar/po/es_EC.po
new file mode 100644 (file)
index 0000000..2aea3aa
--- /dev/null
@@ -0,0 +1,22 @@
+# Spanish (Ecuador) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
+"PO-Revision-Date: 2011-10-07 15:54+0000\n"
+"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
+"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_calendar/static/src/xml/web_calendar.xml:0
+msgid "&nbsp;"
+msgstr "&nbsp;"
diff --git a/addons/web_calendar/po/it.po b/addons/web_calendar/po/it.po
new file mode 100644 (file)
index 0000000..29bbe86
--- /dev/null
@@ -0,0 +1,22 @@
+# Italian translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
+"PO-Revision-Date: 2011-10-08 13:39+0000\n"
+"Last-Translator: Nicola Riolini - Micronaet <Unknown>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-09 05:22+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_calendar/static/src/xml/web_calendar.xml:0
+msgid "&nbsp;"
+msgstr "&nbsp;"
diff --git a/addons/web_calendar/po/nl_BE.po b/addons/web_calendar/po/nl_BE.po
new file mode 100644 (file)
index 0000000..ecb2d56
--- /dev/null
@@ -0,0 +1,22 @@
+# Dutch (Belgium) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
+"PO-Revision-Date: 2011-10-07 09:05+0000\n"
+"Last-Translator: Niels Huylebroeck <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_calendar/static/src/xml/web_calendar.xml:0
+msgid "&nbsp;"
+msgstr "&nbsp;"
index 822614f..9974931 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:38+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 42e1c33..da13012 100644 (file)
@@ -30,7 +30,7 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
     },
     start: function() {
         this._super();
-        this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type":"calendar", 'toolbar': true}, this.on_loaded);
+        return this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type":"calendar", 'toolbar': true}, this.on_loaded);
     },
     stop: function() {
         scheduler.clearAll();
@@ -58,6 +58,10 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
         this.day_length = this.fields_view.arch.attrs.day_length || 8;
         this.color_field = this.fields_view.arch.attrs.color;
         this.fields =  this.fields_view.fields;
+        
+        if (!this.date_start) {
+            throw new Error("Calendar view has not defined 'date_start' attribute.");
+        }
 
         //* Calendar Fields *
         this.calendar_fields.date_start = {'name': this.date_start, 'kind': this.fields[this.date_start].type};
@@ -71,9 +75,6 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
         if (this.date_stop) {
             this.calendar_fields.date_stop = {'name': this.date_stop, 'kind': this.fields[this.date_stop].type};
         }
-        if (!this.date_delay && !this.date_stop) {
-            throw new Error("Calendar view has none of the following attributes : 'date_stop', 'date_delay'");
-        }
 
         for (var fld = 0; fld < this.fields_view.arch.children.length; fld++) {
             this.info_fields.push(this.fields_view.arch.children[fld].attrs.name);
@@ -198,7 +199,7 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
     convert_event: function(evt) {
         var date_start = openerp.web.str_to_datetime(evt[this.date_start]),
             date_stop = this.date_stop ? openerp.web.str_to_datetime(evt[this.date_stop]) : null,
-            date_delay = evt[this.date_delay] || null,
+            date_delay = evt[this.date_delay] || 1.0,
             res_text = '',
             res_description = [];
 
index c5e2fa7..f0525bc 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "Web Chat",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": ['web'],
     "js": [
@@ -10,6 +11,6 @@
         'static/src/js/web_chat.js'
     ],
     "css": [],
-#    'active': True,
     'active': False,
+    'installable': False,
 }
index e9a0267..87d6480 100644 (file)
@@ -2,7 +2,7 @@
 import time
 
 import simplejson
-import web.common as openerpweb
+import web.common.http as openerpweb
 import logging
 
 _logger = logging.getLogger(__name__)
index d7f6df2..48ad2bf 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:03+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index e4bad9c..7a52751 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "web Dashboard",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": ['web'],
     "js": [
index 8023549..37fe039 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-import web.common as openerpweb
+import web.common.http as openerpweb
 
 WIDGET_CONTENT_PATTERN = """<!DOCTYPE html>
 <html>
diff --git a/addons/web_dashboard/po/es_EC.po b/addons/web_dashboard/po/es_EC.po
new file mode 100644 (file)
index 0000000..11cf891
--- /dev/null
@@ -0,0 +1,46 @@
+# Spanish (Ecuador) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 15:56+0000\n"
+"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
+"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Reset"
+msgstr "Reset"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Undo"
+msgstr "Deshacer"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Add Widget"
+msgstr "Agregar Widget"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Change layout"
+msgstr "Cambiar disposición"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Choose dashboard layout"
+msgstr "Elegir el diseño del panel de control"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "progress:"
+msgstr "progreso:"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "%"
+msgstr "%"
diff --git a/addons/web_dashboard/po/it.po b/addons/web_dashboard/po/it.po
new file mode 100644 (file)
index 0000000..2986cb8
--- /dev/null
@@ -0,0 +1,46 @@
+# Italian translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 09:00+0000\n"
+"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Reset"
+msgstr "Ripristina"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Undo"
+msgstr "Annulla"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Add Widget"
+msgstr "Aggiungi Widget"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Change layout"
+msgstr "Cambia layout"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Choose dashboard layout"
+msgstr "Scegli layout dashboard"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "progress:"
+msgstr "avanzamento:"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "%"
+msgstr "%"
diff --git a/addons/web_dashboard/po/nl_BE.po b/addons/web_dashboard/po/nl_BE.po
new file mode 100644 (file)
index 0000000..40dcc04
--- /dev/null
@@ -0,0 +1,46 @@
+# Dutch (Belgium) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 09:04+0000\n"
+"Last-Translator: Niels Huylebroeck <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Reset"
+msgstr "Reset"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Undo"
+msgstr "Ongedaan maken"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Add Widget"
+msgstr "Widget toevoegen"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Change layout"
+msgstr "Layout aanpassen"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "Choose dashboard layout"
+msgstr "Dashboard layout kiezen"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "progress:"
+msgstr "vooruitgang:"
+
+#: addons/web_dashboard/static/src/xml/web_dashboard.xml:0
+msgid "%"
+msgstr "%"
index 3ebe957..1c6f145 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 2093e62..9d9d2f8 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name" : "OpenERP Web installer home",
+    "category" : "Hidden",
     "version" : "2.0",
     "depends" : ['web'],
     'active': True,
diff --git a/addons/web_default_home/po/es_EC.po b/addons/web_default_home/po/es_EC.po
new file mode 100644 (file)
index 0000000..d4c90bb
--- /dev/null
@@ -0,0 +1,38 @@
+# Spanish (Ecuador) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 16:00+0000\n"
+"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
+"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Welcome to your new OpenERP instance."
+msgstr "Bienvenido a tu nueva instancia de OpenERP"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Remember to bookmark this page."
+msgstr "Recuerda marcar esta página"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Remember your login:"
+msgstr "Recordar tu inicio de sesión"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Choose the first OpenERP Application you want to install.."
+msgstr "Escoge la primea Aplicación OpenERP que deseas instalar..."
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Install"
+msgstr "Instalar"
diff --git a/addons/web_default_home/po/it.po b/addons/web_default_home/po/it.po
new file mode 100644 (file)
index 0000000..ad80602
--- /dev/null
@@ -0,0 +1,38 @@
+# Italian translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-08 13:41+0000\n"
+"Last-Translator: Nicola Riolini - Micronaet <Unknown>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-09 05:22+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Welcome to your new OpenERP instance."
+msgstr "Benvenuto nella nuova istanza di OpenERP"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Remember to bookmark this page."
+msgstr "Ricordarsi di aggiungere ai preferiti questa pagina"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Remember your login:"
+msgstr "Ricordare il proprio login:"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Choose the first OpenERP Application you want to install.."
+msgstr "Scegliere la prima applicazione OpenERP che volete installare..."
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Install"
+msgstr "Installa"
diff --git a/addons/web_default_home/po/nl_BE.po b/addons/web_default_home/po/nl_BE.po
new file mode 100644 (file)
index 0000000..bdaaf18
--- /dev/null
@@ -0,0 +1,38 @@
+# Dutch (Belgium) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 09:07+0000\n"
+"Last-Translator: Niels Huylebroeck <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Welcome to your new OpenERP instance."
+msgstr "Welkom bij uw nieuwe OpenERP."
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Remember to bookmark this page."
+msgstr "Gelieve een bookmark voor deze pagina te maken."
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Remember your login:"
+msgstr "Vergeet je login niet:"
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Choose the first OpenERP Application you want to install.."
+msgstr "Kies welke OpenERP Applicatie je wilt installeren..."
+
+#: addons/web_default_home/static/src/xml/web_default_home.xml:0
+msgid "Install"
+msgstr "Installeer"
index 2b533ee..1c940aa 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 6796435..eff0567 100644 (file)
@@ -102,7 +102,7 @@ openerp.web_default_home = function (openerp) {
 
             $.blockUI({message:'<img src="/web/static/src/img/throbber2.gif">'});
             Modules.read_slice(['id'], {}, function (records) {
-                if (!(records.length === 1)) { return; }
+                if (!(records.length === 1)) { $.unblockUI(); return; }
                 Modules.call('state_update',
                     [_.pluck(records, 'id'), 'to install', ['uninstalled']],
                     function () {
index c1851af..584c0a1 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name" : "OpenERP Web Diagram",
+    "category" : "Hidden",
     "version" : "2.0",
     "depends" : ["base"],
     "js": [
index c443b04..51861c1 100644 (file)
@@ -1,4 +1,4 @@
-import web.common as openerpweb
+import web.common.http as openerpweb
 from web.controllers.main import View
 
 class DiagramView(View):
diff --git a/addons/web_diagram/po/es_EC.po b/addons/web_diagram/po/es_EC.po
new file mode 100644 (file)
index 0000000..0aff9dc
--- /dev/null
@@ -0,0 +1,54 @@
+# Spanish (Ecuador) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 16:02+0000\n"
+"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
+"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "New Node"
+msgstr "Nuevo Nodo"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "New Edge"
+msgstr "Nueva arista"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "Show Grid:"
+msgstr "Mostrar cuadrícula"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "First"
+msgstr "Primero"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "<<"
+msgstr "<<"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "0"
+msgstr "0"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "/"
+msgstr "/"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid ">>"
+msgstr ">>"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "Last"
+msgstr "Último"
diff --git a/addons/web_diagram/po/it.po b/addons/web_diagram/po/it.po
new file mode 100644 (file)
index 0000000..f9ab13e
--- /dev/null
@@ -0,0 +1,54 @@
+# Italian translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-08 13:41+0000\n"
+"Last-Translator: Nicola Riolini - Micronaet <Unknown>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-09 05:22+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "New Node"
+msgstr "Nuovo Nodo"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "New Edge"
+msgstr ""
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "Show Grid:"
+msgstr "Mostra griglia"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "First"
+msgstr "Primo"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "<<"
+msgstr "<<"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "0"
+msgstr "0"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "/"
+msgstr "/"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid ">>"
+msgstr ">>"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "Last"
+msgstr "Ultimo"
diff --git a/addons/web_diagram/po/nl_BE.po b/addons/web_diagram/po/nl_BE.po
new file mode 100644 (file)
index 0000000..6f57450
--- /dev/null
@@ -0,0 +1,54 @@
+# Dutch (Belgium) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 09:08+0000\n"
+"Last-Translator: Niels Huylebroeck <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "New Node"
+msgstr "Nieuw knooppunt"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "New Edge"
+msgstr "Nieuwe verbinding"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "Show Grid:"
+msgstr "Toon raster:"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "First"
+msgstr "Begin"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "<<"
+msgstr "<<"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "0"
+msgstr "0"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "/"
+msgstr "/"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid ">>"
+msgstr ">>"
+
+#: addons/web_diagram/static/src/xml/base_diagram.xml:0
+msgid "Last"
+msgstr "Einde"
index 3fb8462..29ffd19 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 6d857e5..d2b24f9 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "web Gantt",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": ['web'],
     "js": [
index 945fa40..48ad2bf 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 0383974..68775b7 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "web Graph",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": ['web'],
     "js": [
@@ -7,4 +8,4 @@
            "static/src/js/graph.js"],
     "css": ["static/lib/dhtmlxGraph/codebase/dhtmlxchart.css"],
     "active": True
-}
\ No newline at end of file
+}
index 945fa40..48ad2bf 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:02+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index ffdec86..bac147b 100644 (file)
@@ -17,8 +17,9 @@ QWeb.add_template('/web_graph/static/src/xml/web_graph.xml');
 openerp.web.views.add('graph', 'openerp.web_graph.GraphView');
 openerp.web_graph.GraphView = openerp.web.View.extend({
 
-    init: function(parent, dataset, view_id) {
+    init: function(parent, dataset, view_id, options) {
         this._super(parent);
+        this.set_default_options(options);
         this.dataset = dataset;
         this.view_id = view_id;
 
@@ -27,6 +28,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
         this.ordinate = null;
         this.columns = [];
         this.group_field = null;
+        this.is_loaded = $.Deferred();
     },
     do_show: function () {
         this.$element.show();
@@ -37,17 +39,24 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
     start: function() {
         var self = this;
         this._super();
+        var loaded;
+        if (this.embedded_view) {
+            loaded = $.when([self.embedded_view]);
+        } else {
+            loaded = this.rpc('/web/view/load', {
+                    model: this.dataset.model,
+                    view_id: this.view_id,
+                    view_type: 'graph'
+            });
+        }
         return $.when(
             this.dataset.call('fields_get', []),
-            this.rpc('/web/view/load', {
-                model: this.dataset.model,
-                view_id: this.view_id,
-                view_type: 'graph'
-            })).then(function (fields_result, view_result) {
+            loaded)
+            .then(function (fields_result, view_result) {
                 self.fields = fields_result[0];
                 self.fields_view = view_result[0];
                 self.on_loaded();
-        });
+            });
     },
     /**
      * Returns all object fields involved in the graph view
@@ -78,6 +87,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
             }
         }, this);
         this.ordinate = this.columns[0].name;
+        this.is_loaded.resolve();
     },
     schedule_chart: function(results) {
         var self = this;
@@ -363,13 +373,16 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
     },
 
     do_search: function(domain, context, group_by) {
-        // TODO: handle non-empty group_by with read_group?
-        if (!_(group_by).isEmpty()) {
-            this.abscissa = group_by[0];
-        } else {
-            this.abscissa = this.first_field;
-        }
-        this.dataset.read_slice(this.list_fields(), {}, $.proxy(this, 'schedule_chart'));
+        var self = this;
+        return $.when(this.is_loaded).pipe(function() {
+            // TODO: handle non-empty group_by with read_group?
+            if (!_(group_by).isEmpty()) {
+                self.abscissa = group_by[0];
+            } else {
+                self.abscissa = self.first_field;
+            }
+            return self.dataset.read_slice(self.list_fields(), {}, $.proxy(self, 'schedule_chart'));
+        });
     }
 });
 };
index 498f512..5e48d2e 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "Hello",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": [],
     "js": ["static/*/*.js", "static/*/js/*.js"],
index d7f6df2..48ad2bf 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:03+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 30a6421..f39cd64 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name" : "Base Kanban",
+    "category" : "Hidden",
     "version" : "2.0",
     "depends" : ["web"],
     "js": [
index 8561c9b..ce219df 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name" : "OpenERP Web mobile",
+    "category" : "Hidden",
     "version" : "2.0",
     "depends" : [],
     'active': True,
diff --git a/addons/web_mobile/po/es_EC.po b/addons/web_mobile/po/es_EC.po
new file mode 100644 (file)
index 0000000..5cff102
--- /dev/null
@@ -0,0 +1,66 @@
+# Spanish (Ecuador) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 17:50+0000\n"
+"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
+"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "OpenERP"
+msgstr "OpenERP"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Database:"
+msgstr "Base de datos:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login:"
+msgstr "Iniciar sesión:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login"
+msgstr "Iniciar sesión"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Bad username or password"
+msgstr "Usuario o contraseña incorrecta"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Favourite"
+msgstr "Favorito"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Preference"
+msgstr "Preferencia"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Applications"
+msgstr "Aplicaciones"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Options"
+msgstr "Opciones"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Logout"
+msgstr "Salir"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid ":"
+msgstr ":"
diff --git a/addons/web_mobile/po/fr.po b/addons/web_mobile/po/fr.po
new file mode 100644 (file)
index 0000000..19b9d0d
--- /dev/null
@@ -0,0 +1,66 @@
+# French translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-08 02:26+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: French <fr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-09 05:22+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "OpenERP"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Database:"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login:"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Password:"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Bad username or password"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Favourite"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Preference"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Applications"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Options"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Logout"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid ":"
+msgstr ""
diff --git a/addons/web_mobile/po/it.po b/addons/web_mobile/po/it.po
new file mode 100644 (file)
index 0000000..8d15537
--- /dev/null
@@ -0,0 +1,66 @@
+# Italian translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-08 13:44+0000\n"
+"Last-Translator: Nicola Riolini - Micronaet <Unknown>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-09 05:22+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "OpenERP"
+msgstr "OpenERP"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Database:"
+msgstr "Database:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login:"
+msgstr "Login:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Password:"
+msgstr "Password:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login"
+msgstr "Login"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Bad username or password"
+msgstr "Username o password errati"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Favourite"
+msgstr "Preferito"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Preference"
+msgstr ""
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Applications"
+msgstr "Applicazioni"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Options"
+msgstr "Opzioni"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Logout"
+msgstr "Disconnetti"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid ":"
+msgstr ":"
diff --git a/addons/web_mobile/po/nl_BE.po b/addons/web_mobile/po/nl_BE.po
new file mode 100644 (file)
index 0000000..f483032
--- /dev/null
@@ -0,0 +1,66 @@
+# Dutch (Belgium) translation for openerp-web
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
+"PO-Revision-Date: 2011-10-07 09:10+0000\n"
+"Last-Translator: Niels Huylebroeck <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-08 05:30+0000\n"
+"X-Generator: Launchpad (build 14110)\n"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "OpenERP"
+msgstr "OpenERP"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Database:"
+msgstr "Database:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login:"
+msgstr "Login:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Login"
+msgstr "Login"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Bad username or password"
+msgstr "Verkeerde gebruikersnaam of wachtwoord"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Favourite"
+msgstr "Favoriet"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Preference"
+msgstr "Voorkeur"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Applications"
+msgstr "Applicaties"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Options"
+msgstr "Opties"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid "Logout"
+msgstr "Afmelden"
+
+#: addons/web_mobile/static/src/xml/web_mobile.xml:0
+msgid ":"
+msgstr ":"
index 37b557d..9380d0a 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:03+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -42,15 +42,15 @@ msgid "Bad username or password"
 msgstr ""
 
 #: addons/web_mobile/static/src/xml/web_mobile.xml:0
-msgid "Home"
+msgid "Favourite"
 msgstr ""
 
 #: addons/web_mobile/static/src/xml/web_mobile.xml:0
-msgid "Shortcuts"
+msgid "Preference"
 msgstr ""
 
 #: addons/web_mobile/static/src/xml/web_mobile.xml:0
-msgid "Menu"
+msgid "Applications"
 msgstr ""
 
 #: addons/web_mobile/static/src/xml/web_mobile.xml:0
@@ -62,10 +62,6 @@ msgid "Logout"
 msgstr ""
 
 #: addons/web_mobile/static/src/xml/web_mobile.xml:0
-msgid "Preferences"
-msgstr ""
-
-#: addons/web_mobile/static/src/xml/web_mobile.xml:0
 msgid ":"
 msgstr ""
 
index f0cc1db..c725489 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name" : "OpenERP Web web",
+    "category" : "Hidden",
     "version" : "2.0",
     "depends" : [],
     'active': False,
index d7f6df2..48ad2bf 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-09-06 12:03+0200\n"
+"POT-Creation-Date: 2011-10-07 10:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index d622190..4d95281 100644 (file)
@@ -1,5 +1,6 @@
 {
     "name": "Tests",
+    "category" : "Hidden",
     "version": "2.0",
     "depends": [],
     "js": ["static/src/js/*.js"],
index c4e6012..fe33585 100755 (executable)
@@ -55,7 +55,7 @@ logging_opts.add_option("--log-config", dest="log_config", default=os.path.join(
                         help="Logging configuration file", metavar="FILE")
 optparser.add_option_group(logging_opts)
 
-import web.common.dispatch
+import web.common.http
 
 if __name__ == "__main__":
     (options, args) = optparser.parse_args(sys.argv[1:])
@@ -71,7 +71,7 @@ if __name__ == "__main__":
     else:
         logging.basicConfig(level=getattr(logging, options.log_level.upper()))
 
-    app = web.common.dispatch.Root(options)
+    app = web.common.http.Root(options)
 
     if options.proxy_mode:
         app = werkzeug.contrib.fixers.ProxyFix(app)