[MERGE] trunk
bzr revid: fme@openerp.com-20121219150025-h9h1956xey3tok57
This commit is contained in:
commit
d234a24de0
|
@ -1,4 +1,5 @@
|
|||
import http
|
||||
import controllers
|
||||
import cli
|
||||
|
||||
wsgi_postload = http.wsgi_postload
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
import test_js
|
|
@ -0,0 +1,35 @@
|
|||
import logging
|
||||
import optparse
|
||||
import sys
|
||||
|
||||
import unittest2
|
||||
|
||||
import openerp
|
||||
import openerp.addons.web.tests
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class TestJs(openerp.cli.Command):
|
||||
def run(self, args):
|
||||
self.parser = parser = optparse.OptionParser()
|
||||
parser.add_option("-d", "--database", dest="db_name", default=False, help="specify the database name")
|
||||
parser.add_option("--xmlrpc-port", dest="xmlrpc_port", default=8069, help="specify the TCP port for the XML-RPC protocol", type="int")
|
||||
# proably need to add both --superadmin-password and --database-admin-password
|
||||
self.parser.parse_args(args)
|
||||
|
||||
# test ony uses db_name xmlrpc_port admin_passwd, so use the server one for the actual parsing
|
||||
|
||||
config = openerp.tools.config
|
||||
config.parse_config(args)
|
||||
# needed until runbot is fixed
|
||||
config['db_password'] = config['admin_passwd']
|
||||
|
||||
# run js tests
|
||||
openerp.netsvc.init_alternative_logger()
|
||||
suite = unittest2.TestSuite()
|
||||
suite.addTests(unittest2.TestLoader().loadTestsFromModule(openerp.addons.web.tests.test_js))
|
||||
r = unittest2.TextTestRunner(verbosity=2).run(suite)
|
||||
if r.errors or r.failures:
|
||||
sys.exit(1)
|
||||
|
||||
# vim:et:ts=4:sw=4:
|
|
@ -28,6 +28,7 @@ except ImportError:
|
|||
xlwt = None
|
||||
|
||||
import openerp
|
||||
import openerp.modules.registry
|
||||
from openerp.tools.translate import _
|
||||
|
||||
from .. import http
|
||||
|
@ -169,7 +170,6 @@ def module_installed_bypass_session(dbname):
|
|||
loadable = openerpweb.addons_manifest.keys()
|
||||
modules = {}
|
||||
try:
|
||||
import openerp.modules.registry
|
||||
registry = openerp.modules.registry.RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
m = registry.get('ir.module.module')
|
||||
|
@ -523,21 +523,7 @@ html_template = """<!DOCTYPE html>
|
|||
<body>
|
||||
<!--[if lte IE 8]>
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
|
||||
<script>
|
||||
var test = function() {
|
||||
CFInstall.check({
|
||||
mode: "overlay"
|
||||
});
|
||||
};
|
||||
if (window.localStorage && false) {
|
||||
if (! localStorage.getItem("hasShownGFramePopup")) {
|
||||
test();
|
||||
localStorage.setItem("hasShownGFramePopup", true);
|
||||
}
|
||||
} else {
|
||||
test();
|
||||
}
|
||||
</script>
|
||||
<script>CFInstall.check({mode: "overlay"});</script>
|
||||
<![endif]-->
|
||||
</body>
|
||||
</html>
|
||||
|
@ -919,15 +905,8 @@ class Session(openerpweb.Controller):
|
|||
class Menu(openerpweb.Controller):
|
||||
_cp_path = "/web/menu"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self, req):
|
||||
return {'data': self.do_load(req)}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def get_user_roots(self, req):
|
||||
return self.do_get_user_roots(req)
|
||||
|
||||
def do_get_user_roots(self, req):
|
||||
""" Return all root menu ids visible for the session user.
|
||||
|
||||
:param req: A request object, with an OpenERP session attribute
|
||||
|
@ -950,7 +929,8 @@ class Menu(openerpweb.Controller):
|
|||
|
||||
return Menus.search(menu_domain, 0, False, False, req.context)
|
||||
|
||||
def do_load(self, req):
|
||||
@openerpweb.jsonrequest
|
||||
def load(self, req):
|
||||
""" Loads all menu items (all applications and their sub-menus).
|
||||
|
||||
:param req: A request object, with an OpenERP session attribute
|
||||
|
@ -960,24 +940,28 @@ class Menu(openerpweb.Controller):
|
|||
"""
|
||||
Menus = req.session.model('ir.ui.menu')
|
||||
|
||||
fields = ['name', 'sequence', 'parent_id', 'action',
|
||||
'needaction_enabled', 'needaction_counter']
|
||||
menu_roots = Menus.read(self.do_get_user_roots(req), fields, req.context)
|
||||
fields = ['name', 'sequence', 'parent_id', 'action']
|
||||
menu_root_ids = self.get_user_roots(req)
|
||||
menu_roots = Menus.read(menu_root_ids, fields, req.context) if menu_root_ids else []
|
||||
menu_root = {
|
||||
'id': False,
|
||||
'name': 'root',
|
||||
'parent_id': [-1, ''],
|
||||
'children': menu_roots
|
||||
'children': menu_roots,
|
||||
'all_menu_ids': menu_root_ids,
|
||||
}
|
||||
if not menu_roots:
|
||||
return menu_root
|
||||
|
||||
# menus are loaded fully unlike a regular tree view, cause there are a
|
||||
# limited number of items (752 when all 6.1 addons are installed)
|
||||
menu_ids = Menus.search([], 0, False, False, req.context)
|
||||
menu_ids = Menus.search([('id', 'child_of', menu_root_ids)], 0, False, False, req.context)
|
||||
menu_items = Menus.read(menu_ids, fields, req.context)
|
||||
# adds roots at the end of the sequence, so that they will overwrite
|
||||
# equivalent menu items from full menu read when put into id:item
|
||||
# mapping, resulting in children being correctly set on the roots.
|
||||
menu_items.extend(menu_roots)
|
||||
menu_root['all_menu_ids'] = menu_ids # includes menu_root_ids!
|
||||
|
||||
# make a tree using parent_id
|
||||
menu_items_map = dict(
|
||||
|
@ -998,8 +982,18 @@ class Menu(openerpweb.Controller):
|
|||
|
||||
return menu_root
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load_needaction(self, req, menu_ids):
|
||||
""" Loads needaction counters for specific menu ids.
|
||||
|
||||
:return: needaction data
|
||||
:rtype: dict(menu_id: {'needaction_enabled': boolean, 'needaction_counter': int})
|
||||
"""
|
||||
return req.session.model('ir.ui.menu').get_needaction_data(menu_ids, req.context)
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def action(self, req, menu_id):
|
||||
# still used by web_shortcut
|
||||
actions = load_actions_from_ir_values(req,'action', 'tree_but_open',
|
||||
[('ir.ui.menu', menu_id)], False)
|
||||
return {"action": actions}
|
||||
|
@ -1065,14 +1059,15 @@ class DataSet(openerpweb.Controller):
|
|||
|
||||
def _call_kw(self, req, model, method, args, kwargs):
|
||||
# Temporary implements future display_name special field for model#read()
|
||||
if method == 'read' and kwargs.get('context') and kwargs['context'].get('future_display_name'):
|
||||
if method == 'read' and kwargs.get('context', {}).get('future_display_name'):
|
||||
if 'display_name' in args[1]:
|
||||
names = req.session.model(model).name_get(args[0], **kwargs)
|
||||
names = dict(req.session.model(model).name_get(args[0], **kwargs))
|
||||
args[1].remove('display_name')
|
||||
r = getattr(req.session.model(model), method)(*args, **kwargs)
|
||||
for i in range(len(r)):
|
||||
r[i]['display_name'] = names[i][1] or "%s#%d" % (model, names[i][0])
|
||||
return r
|
||||
records = req.session.model(model).read(*args, **kwargs)
|
||||
for record in records:
|
||||
record['display_name'] = \
|
||||
names.get(record['id']) or "%s#%d" % (model, (record['id']))
|
||||
return records
|
||||
|
||||
return getattr(req.session.model(model), method)(*args, **kwargs)
|
||||
|
||||
|
@ -1121,41 +1116,6 @@ class DataSet(openerpweb.Controller):
|
|||
class View(openerpweb.Controller):
|
||||
_cp_path = "/web/view"
|
||||
|
||||
def fields_view_get(self, req, model, view_id, view_type,
|
||||
transform=True, toolbar=False, submenu=False):
|
||||
Model = req.session.model(model)
|
||||
fvg = Model.fields_view_get(view_id, view_type, req.context, toolbar, submenu)
|
||||
# todo fme?: check that we should pass the evaluated context here
|
||||
self.process_view(req.session, fvg, req.context, transform, (view_type == 'kanban'))
|
||||
return fvg
|
||||
|
||||
def process_view(self, session, fvg, context, transform, preserve_whitespaces=False):
|
||||
# depending on how it feels, xmlrpclib.ServerProxy can translate
|
||||
# XML-RPC strings to ``str`` or ``unicode``. ElementTree does not
|
||||
# enjoy unicode strings which can not be trivially converted to
|
||||
# strings, and it blows up during parsing.
|
||||
|
||||
# So ensure we fix this retardation by converting view xml back to
|
||||
# bit strings.
|
||||
if isinstance(fvg['arch'], unicode):
|
||||
arch = fvg['arch'].encode('utf-8')
|
||||
else:
|
||||
arch = fvg['arch']
|
||||
fvg['arch_string'] = arch
|
||||
|
||||
fvg['arch'] = xml2json_from_elementtree(
|
||||
ElementTree.fromstring(arch), preserve_whitespaces)
|
||||
|
||||
if 'id' in fvg['fields']:
|
||||
# Special case for id's
|
||||
id_field = fvg['fields']['id']
|
||||
id_field['original_type'] = id_field['type']
|
||||
id_field['type'] = 'id'
|
||||
|
||||
for field in fvg['fields'].itervalues():
|
||||
for view in field.get("views", {}).itervalues():
|
||||
self.process_view(session, view, None, transform)
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def add_custom(self, req, view_id, arch):
|
||||
CustomView = req.session.model('ir.ui.view.custom')
|
||||
|
@ -1179,10 +1139,6 @@ class View(openerpweb.Controller):
|
|||
return {'result': True}
|
||||
return {'result': False}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self, req, model, view_id, view_type, toolbar=False):
|
||||
return self.fields_view_get(req, model, view_id, view_type, toolbar=toolbar)
|
||||
|
||||
class TreeView(View):
|
||||
_cp_path = "/web/treeview"
|
||||
|
||||
|
@ -1245,9 +1201,10 @@ class Binary(openerpweb.Controller):
|
|||
except:
|
||||
pass
|
||||
return req.make_response(image_data, headers)
|
||||
def placeholder(self, req):
|
||||
|
||||
def placeholder(self, req, image='placeholder.png'):
|
||||
addons_path = openerpweb.addons_manifest['web']['addons_path']
|
||||
return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', 'placeholder.png'), 'rb').read()
|
||||
return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', image), 'rb').read()
|
||||
|
||||
@openerpweb.httprequest
|
||||
def saveas(self, req, model, field, id=None, filename_field=None, **kw):
|
||||
|
@ -1289,6 +1246,7 @@ class Binary(openerpweb.Controller):
|
|||
jdata = simplejson.loads(data)
|
||||
model = jdata['model']
|
||||
field = jdata['field']
|
||||
data = jdata['data']
|
||||
id = jdata.get('id', None)
|
||||
filename_field = jdata.get('filename_field', None)
|
||||
context = jdata.get('context', {})
|
||||
|
@ -1297,7 +1255,9 @@ class Binary(openerpweb.Controller):
|
|||
fields = [field]
|
||||
if filename_field:
|
||||
fields.append(filename_field)
|
||||
if id:
|
||||
if data:
|
||||
res = { field: data }
|
||||
elif id:
|
||||
res = Model.read([int(id)], fields, context)[0]
|
||||
else:
|
||||
res = Model.default_get(fields, context)
|
||||
|
@ -1317,11 +1277,11 @@ class Binary(openerpweb.Controller):
|
|||
@openerpweb.httprequest
|
||||
def upload(self, req, callback, ufile):
|
||||
# TODO: might be useful to have a configuration flag for max-length file uploads
|
||||
out = """<script language="javascript" type="text/javascript">
|
||||
var win = window.top.window;
|
||||
win.jQuery(win).trigger(%s, %s);
|
||||
</script>"""
|
||||
try:
|
||||
out = """<script language="javascript" type="text/javascript">
|
||||
var win = window.top.window;
|
||||
win.jQuery(win).trigger(%s, %s);
|
||||
</script>"""
|
||||
data = ufile.read()
|
||||
args = [len(data), ufile.filename,
|
||||
ufile.content_type, base64.b64encode(data)]
|
||||
|
@ -1332,11 +1292,11 @@ class Binary(openerpweb.Controller):
|
|||
@openerpweb.httprequest
|
||||
def upload_attachment(self, req, callback, model, id, ufile):
|
||||
Model = req.session.model('ir.attachment')
|
||||
out = """<script language="javascript" type="text/javascript">
|
||||
var win = window.top.window;
|
||||
win.jQuery(win).trigger(%s, %s);
|
||||
</script>"""
|
||||
try:
|
||||
out = """<script language="javascript" type="text/javascript">
|
||||
var win = window.top.window;
|
||||
win.jQuery(win).trigger(%s, %s);
|
||||
</script>"""
|
||||
attachment_id = Model.create({
|
||||
'name': ufile.filename,
|
||||
'datas': base64.encodestring(ufile.read()),
|
||||
|
@ -1348,10 +1308,39 @@ class Binary(openerpweb.Controller):
|
|||
'filename': ufile.filename,
|
||||
'id': attachment_id
|
||||
}
|
||||
except Exception,e:
|
||||
args = {'erorr':e.faultCode.split('--')[1],'title':e.faultCode.split('--')[0]}
|
||||
except xmlrpclib.Fault, e:
|
||||
args = {'error':e.faultCode }
|
||||
return out % (simplejson.dumps(callback), simplejson.dumps(args))
|
||||
|
||||
@openerpweb.httprequest
|
||||
def company_logo(self, req, dbname=None):
|
||||
# TODO add etag, refactor to use /image code for etag
|
||||
uid = None
|
||||
if req.session._db:
|
||||
dbname = req.session._db
|
||||
uid = req.session._uid
|
||||
elif dbname is None:
|
||||
dbname = db_monodb(req)
|
||||
|
||||
if uid is None:
|
||||
uid = openerp.SUPERUSER_ID
|
||||
|
||||
if not dbname:
|
||||
image_data = self.placeholder(req, 'logo.png')
|
||||
else:
|
||||
registry = openerp.modules.registry.RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
user = registry.get('res.users').browse(cr, uid, uid)
|
||||
if user.company_id.logo_web:
|
||||
image_data = user.company_id.logo_web.decode('base64')
|
||||
else:
|
||||
image_data = self.placeholder(req, 'nologo.png')
|
||||
headers = [
|
||||
('Content-Type', 'image/png'),
|
||||
('Content-Length', len(image_data)),
|
||||
]
|
||||
return req.make_response(image_data, headers)
|
||||
|
||||
class Action(openerpweb.Controller):
|
||||
_cp_path = "/web/action"
|
||||
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
Guidelines and Recommendations
|
||||
==============================
|
||||
|
||||
Web Module Recommendations
|
||||
--------------------------
|
||||
|
||||
Identifiers (``id`` attribute) should be avoided
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
In generic applications and modules, ``@id`` limits the reusabily of
|
||||
components and tends to make code more brittle.
|
||||
|
||||
Just about all the time, they can be replaced with nothing, with
|
||||
classes or with keeping a reference to a DOM node or a jQuery element
|
||||
around.
|
||||
|
||||
.. note::
|
||||
|
||||
If it is *absolutely necessary* to have an ``@id`` (because a
|
||||
third-party library requires one and can't take a DOM element), it
|
||||
should be generated with `_.uniqueId
|
||||
<http://underscorejs.org/#uniqueId>`_ or some other similar
|
||||
method.
|
||||
|
||||
Avoid predictable/common CSS class names
|
||||
''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
Class names such as "content" or "navigation" might match the desired
|
||||
meaning/semantics, but it is likely an other developer will have the
|
||||
same need, creating a naming conflict and unintended behavior. Generic
|
||||
class names should be prefixed with e.g. the name of the component
|
||||
they belong to (creating "informal" namespaces, much as in C or
|
||||
Objective-C)
|
||||
|
||||
Global selectors should be avoided
|
||||
''''''''''''''''''''''''''''''''''
|
||||
|
||||
Because a component may be used several times in a single page (an
|
||||
example in OpenERP is dashboards), queries should be restricted to a
|
||||
given component's scope. Unfiltered selections such as ``$(selector)``
|
||||
or ``document.querySelectorAll(selector)`` will generally lead to
|
||||
unintended or incorrect behavior.
|
||||
|
||||
OpenERP Web's :js:class:`~openerp.web.Widget` has an attribute
|
||||
providing its DOM root :js:attr:`Widget.$el <openerp.web.Widget.$el>`,
|
||||
and a shortcut to select nodes directly :js:attr:`Widget.$
|
||||
<openerp.web.Widget.$>`.
|
||||
|
||||
More generally, never assume your components own or controls anything
|
||||
beyond its own personal DOM.
|
||||
|
||||
Understand deferreds
|
||||
''''''''''''''''''''
|
||||
|
||||
Deferreds, promises, futures, …
|
||||
|
||||
Known under many names, these objects are essential to and (in OpenERP
|
||||
Web) widely used for making :doc:`asynchronous javascript operations
|
||||
<async>` palatable and understandable.
|
||||
|
||||
OpenERP Web guidelines
|
||||
----------------------
|
||||
|
||||
* HTML templating/rendering should use :doc:`qweb` unless absolutely
|
||||
trivial.
|
||||
|
||||
* All interactive components (components displaying information to the
|
||||
screen or intercepting DOM events) must inherit from
|
||||
:class:`~openerp.web.Widget` and correctly implement and use its API
|
||||
and lifecycle.
|
||||
|
||||
* All css classes must be prefixed with *oe_* .
|
||||
|
||||
* Asynchronous functions (functions which call :ref:`session.rpc
|
||||
<rpc_rpc>` directly or indirectly at the very least) *must* return
|
||||
deferreds, so that callers of overriders can correctly synchronize
|
||||
with them.
|
|
@ -12,17 +12,21 @@ Contents:
|
|||
:maxdepth: 1
|
||||
|
||||
module
|
||||
testing
|
||||
|
||||
widget
|
||||
|
||||
|
||||
async
|
||||
rpc
|
||||
qweb
|
||||
client_action
|
||||
form_view
|
||||
|
||||
guidelines
|
||||
|
||||
testing
|
||||
|
||||
search_view
|
||||
list_view
|
||||
form_view
|
||||
|
||||
changelog-7.0
|
||||
|
||||
|
|
|
@ -0,0 +1,281 @@
|
|||
Building an OpenERP Web module
|
||||
==============================
|
||||
|
||||
There is no significant distinction between an OpenERP Web module and
|
||||
an OpenERP module, the web part is mostly additional data and code
|
||||
inside a regular OpenERP module. This allows providing more seamless
|
||||
features by integrating your module deeper into the web client.
|
||||
|
||||
A Basic Module
|
||||
--------------
|
||||
|
||||
A very basic OpenERP module structure will be our starting point:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
web_example
|
||||
├── __init__.py
|
||||
└── __openerp__.py
|
||||
|
||||
.. literalinclude:: module/__openerp__.py
|
||||
:language: python
|
||||
|
||||
This is a sufficient minimal declaration of a valid OpenERP module.
|
||||
|
||||
Web Declaration
|
||||
---------------
|
||||
|
||||
There is no such thing as a "web module" declaration. An OpenERP
|
||||
module is automatically recognized as "web-enabled" if it contains a
|
||||
``static`` directory at its root, so:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
web_example
|
||||
├── __init__.py
|
||||
├── __openerp__.py
|
||||
└── static
|
||||
|
||||
is the extent of it. You should also change the dependency to list
|
||||
``web``:
|
||||
|
||||
.. literalinclude:: module/__openerp__.py.1.diff
|
||||
:language: diff
|
||||
|
||||
.. note::
|
||||
|
||||
This does not matter in normal operation so you may not realize
|
||||
it's wrong (the web module does the loading of everything else, so
|
||||
it can only be loaded), but when e.g. testing the loading process
|
||||
is slightly different than normal, and incorrect dependency may
|
||||
lead to broken code.
|
||||
|
||||
This makes the "web" discovery system consider the module as having a
|
||||
"web part", and check if it has web controllers to mount or javascript
|
||||
files to load. The content of the ``static/`` folder is also
|
||||
automatically made available to web browser at the URL
|
||||
``$module-name/static/$file-path``. This is sufficient to provide
|
||||
pictures (of cats, usually) through your module. However there are
|
||||
still a few more steps to running javascript code.
|
||||
|
||||
Getting Things Done
|
||||
-------------------
|
||||
|
||||
The first one is to add javascript code. It's customary to put it in
|
||||
``static/src/js``, to have room for e.g. other file types, or
|
||||
third-party libraries.
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js
|
||||
:language: javascript
|
||||
|
||||
The client won't load any file unless specified, thus the new file
|
||||
should be listed in the module's manifest file, under a new key ``js``
|
||||
(a list of file names, or glob patterns):
|
||||
|
||||
.. literalinclude:: module/__openerp__.py.2.diff
|
||||
:language: diff
|
||||
|
||||
At this point, if the module is installed and the client reloaded the
|
||||
message should appear in your browser's development console.
|
||||
|
||||
.. note::
|
||||
|
||||
Because the manifest file has been edited, you will have to
|
||||
restart the OpenERP server itself for it to be taken in account.
|
||||
|
||||
You may also want to open your browser's console *before*
|
||||
reloading, depending on the browser messages printed while the
|
||||
console is closed may not work or may not appear after opening it.
|
||||
|
||||
.. note::
|
||||
|
||||
If the message does not appear, try cleaning your browser's caches
|
||||
and ensure the file is correctly loaded from the server logs or
|
||||
the "resources" tab of your browser's developers tools.
|
||||
|
||||
At this point the code runs, but it runs only once when the module is
|
||||
initialized, and it can't get access to the various APIs of the web
|
||||
client (such as making RPC requests to the server). This is done by
|
||||
providing a `javascript module`_:
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js.1.diff
|
||||
:language: diff
|
||||
|
||||
If you reload the client, you'll see a message in the console exactly
|
||||
as previously. The differences, though invisible at this point, are:
|
||||
|
||||
* All javascript files specified in the manifest (only this one so
|
||||
far) have been fully loaded
|
||||
* An instance of the web client and a namespace inside that instance
|
||||
(with the same name as the module) have been created and are
|
||||
available for use
|
||||
|
||||
The latter point is what the ``instance`` parameter to the function
|
||||
provides: an instance of the OpenERP Web client, with the contents of
|
||||
all the new module's dependencies loaded in and initialized. These are
|
||||
the entry points to the web client's APIs.
|
||||
|
||||
To demonstrate, let's build a simple :doc:`client action
|
||||
<client_action>`: a stopwatch
|
||||
|
||||
First, the action declaration:
|
||||
|
||||
.. literalinclude:: module/__openerp__.py.3.diff
|
||||
:language: diff
|
||||
|
||||
.. literalinclude:: module/web_example.xml
|
||||
:language: xml
|
||||
|
||||
then set up the :doc:`client action hook <client_action>` to register
|
||||
a function (for now):
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js.2.diff
|
||||
:language: diff
|
||||
|
||||
Updating the module (in order to load the XML description) and
|
||||
re-starting the server should display a new menu *Example Client
|
||||
Action* at the top-level. Opening said menu will make the message
|
||||
appear, as usual, in the browser's console.
|
||||
|
||||
Paint it black
|
||||
--------------
|
||||
|
||||
The next step is to take control of the page itself, rather than just
|
||||
print little messages in the console. This we can do by replacing our
|
||||
client action function by a :doc:`widget`. Our widget will simply use
|
||||
its :js:func:`~openerp.web.Widget.start` to add some content to its
|
||||
DOM:
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js.3.diff
|
||||
:language: diff
|
||||
|
||||
after reloading the client (to update the javascript file), instead of
|
||||
printing to the console the menu item clears the whole screen and
|
||||
displays the specified message in the page.
|
||||
|
||||
Since we've added a class on the widget's :ref:`DOM root
|
||||
<widget-dom_root>` we can now see how to add a stylesheet to a module:
|
||||
first create the stylesheet file:
|
||||
|
||||
.. literalinclude:: module/static/src/css/web_example.css
|
||||
:language: css
|
||||
|
||||
then add a reference to the stylesheet in the module's manifest (which
|
||||
will require restarting the OpenERP Server to see the changes, as
|
||||
usual):
|
||||
|
||||
.. literalinclude:: module/__openerp__.py.4.diff
|
||||
:language: diff
|
||||
|
||||
the text displayed by the menu item should now be huge, and
|
||||
white-on-black (instead of small and black-on-white). From there on,
|
||||
the world's your canvas.
|
||||
|
||||
.. note::
|
||||
|
||||
Prefixing CSS rules with both ``.openerp`` (to ensure the rule
|
||||
will apply only within the confines of the OpenERP Web client) and
|
||||
a class at the root of your own hierarchy of widgets is strongly
|
||||
recommended to avoid "leaking" styles in case the code is running
|
||||
embedded in an other web page, and does not have the whole screen
|
||||
to itself.
|
||||
|
||||
So far we haven't built much (any, really) DOM content. It could all
|
||||
be done in :js:func:`~openerp.web.Widget.start` but that gets unwieldy
|
||||
and hard to maintain fast. It is also very difficult to extend by
|
||||
third parties (trying to add or change things in your widgets) unless
|
||||
broken up into multiple methods which each perform a little bit of the
|
||||
rendering.
|
||||
|
||||
The first way to handle this method is to delegate the content to
|
||||
plenty of sub-widgets, which can be individually overridden. An other
|
||||
method [#DOM-building]_ is to use `a template
|
||||
<http://en.wikipedia.org/wiki/Web_template>`_ to render a widget's
|
||||
DOM.
|
||||
|
||||
OpenERP Web's template language is :doc:`qweb`. Although any
|
||||
templating engine can be used (e.g. `mustache
|
||||
<http://mustache.github.com/>`_ or `_.template
|
||||
<http://underscorejs.org/#template>`_) QWeb has important features
|
||||
which other template engines may not provide, and has special
|
||||
integration to OpenERP Web widgets.
|
||||
|
||||
Adding a template file is similar to adding a style sheet:
|
||||
|
||||
.. literalinclude:: module/static/src/xml/web_example.xml
|
||||
:language: xml
|
||||
|
||||
.. literalinclude:: module/__openerp__.py.5.diff
|
||||
:language: diff
|
||||
|
||||
The template can then easily be hooked in the widget:
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js.4.diff
|
||||
:language: diff
|
||||
|
||||
And finally the CSS can be altered to style the new (and more complex)
|
||||
template-generated DOM, rather than the code-generated one:
|
||||
|
||||
.. literalinclude:: module/static/src/css/web_example.css.1.diff
|
||||
:language: diff
|
||||
|
||||
.. note::
|
||||
|
||||
The last section of the CSS change is an example of "state
|
||||
classes": a CSS class (or set of classes) on the root of the
|
||||
widget, which is toggled when the state of the widget changes and
|
||||
can perform drastic alterations in rendering (usually
|
||||
showing/hiding various elements).
|
||||
|
||||
This pattern is both fairly simple (to read and understand) and
|
||||
efficient (because most of the hard work is pushed to the
|
||||
browser's CSS engine, which is usually highly optimized, and done
|
||||
in a single repaint after toggling the class).
|
||||
|
||||
The last step (until the next one) is to add some behavior and make
|
||||
our stopwatch watch. First hook some events on the buttons to toggle
|
||||
the widget's state:
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js.5.diff
|
||||
:language: diff
|
||||
|
||||
This demonstrates the use of the "events hash" and event delegation to
|
||||
declaratively handle events on the widget's DOM. And already changes
|
||||
the button displayed in the UI. Then comes some actual logic:
|
||||
|
||||
.. literalinclude:: module/static/src/js/first_module.js.6.diff
|
||||
:language: diff
|
||||
|
||||
* An initializer (the ``init`` method) is introduced to set-up a few
|
||||
internal variables: ``_start`` will hold the start of the timer (as
|
||||
a javascript Date object), and ``_watch`` will hold a ticker to
|
||||
update the interface regularly and display the "current time".
|
||||
|
||||
* ``update_counter`` is in charge of taking the time difference
|
||||
between "now" and ``_start``, formatting as ``HH:MM:SS`` and
|
||||
displaying the result on screen.
|
||||
|
||||
* ``watch_start`` is augmented to initialize ``_start`` with its value
|
||||
and set-up the update of the counter display every 33ms.
|
||||
|
||||
* ``watch_stop`` disables the updater, does a final update of the
|
||||
counter display and resets everything.
|
||||
|
||||
* Finally, because javascript Interval and Timeout objects execute
|
||||
"outside" the widget, they will keep going even after the widget has
|
||||
been destroyed (especially an issue with intervals as they repeat
|
||||
indefinitely). So ``_watch`` *must* be cleared when the widget is
|
||||
destroyed (then the ``_super`` must be called as well in order to
|
||||
perform the "normal" widget cleanup).
|
||||
|
||||
Starting and stopping the watch now works, and correctly tracks time
|
||||
since having started the watch, neatly formatted.
|
||||
|
||||
.. [#DOM-building] they are not alternative solutions: they work very
|
||||
well together. Templates are used to build "just
|
||||
DOM", sub-widgets are used to build DOM subsections
|
||||
*and* delegate part of the behavior (e.g. events
|
||||
handling).
|
||||
|
||||
.. _javascript module:
|
||||
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript
|
|
@ -0,0 +1,7 @@
|
|||
# __openerp__.py
|
||||
{
|
||||
'name': "Web Example",
|
||||
'description': "Basic example of a (future) web module",
|
||||
'category': 'Hidden',
|
||||
'depends': ['base'],
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
--- web_example/__openerp__.py
|
||||
+++ web_example/__openerp__.py
|
||||
@@ -1,7 +1,7 @@
|
||||
# __openerp__.py
|
||||
{
|
||||
'name': "Web Example",
|
||||
'description': "Basic example of a (future) web module",
|
||||
'category': 'Hidden',
|
||||
- 'depends': ['base'],
|
||||
+ 'depends': ['web'],
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
--- web_example/__openerp__.py
|
||||
+++ web_example/__openerp__.py
|
||||
@@ -1,7 +1,8 @@
|
||||
# __openerp__.py
|
||||
{
|
||||
'name': "Web Example",
|
||||
'description': "Basic example of a (future) web module",
|
||||
'category': 'Hidden',
|
||||
'depends': ['web'],
|
||||
+ 'js': ['static/src/js/first_module.js'],
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
--- web_example/__openerp__.py
|
||||
+++ web_example/__openerp__.py
|
||||
@@ -1,8 +1,9 @@
|
||||
# __openerp__.py
|
||||
{
|
||||
'name': "Web Example",
|
||||
'description': "Basic example of a (future) web module",
|
||||
'category': 'Hidden',
|
||||
'depends': ['web'],
|
||||
+ 'data': ['web_example.xml'],
|
||||
'js': ['static/src/js/first_module.js'],
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
--- web_example/__openerp__.py
|
||||
+++ web_example/__openerp__.py
|
||||
@@ -1,9 +1,10 @@
|
||||
# __openerp__.py
|
||||
{
|
||||
'name': "Web Example",
|
||||
'description': "Basic example of a (future) web module",
|
||||
'category': 'Hidden',
|
||||
'depends': ['web'],
|
||||
'data': ['web_example.xml'],
|
||||
'js': ['static/src/js/first_module.js'],
|
||||
+ 'css': ['static/src/css/web_example.css'],
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
--- web_example/__openerp__.py
|
||||
+++ web_example/__openerp__.py
|
||||
@@ -1,10 +1,11 @@
|
||||
# __openerp__.py
|
||||
{
|
||||
'name': "Web Example",
|
||||
'description': "Basic example of a (future) web module",
|
||||
'category': 'Hidden',
|
||||
'depends': ['web'],
|
||||
'data': ['web_example.xml'],
|
||||
'js': ['static/src/js/first_module.js'],
|
||||
'css': ['static/src/css/web_example.css'],
|
||||
+ 'qweb': ['static/src/xml/web_example.xml'],
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
.openerp .oe_web_example {
|
||||
color: white;
|
||||
background-color: black;
|
||||
height: 100%;
|
||||
font-size: 400%;
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
--- web_example/static/src/css/web_example.css
|
||||
+++ web_example/static/src/css/web_example.css
|
||||
@@ -1,6 +1,13 @@
|
||||
.openerp .oe_web_example {
|
||||
color: white;
|
||||
background-color: black;
|
||||
height: 100%;
|
||||
- font-size: 400%;
|
||||
}
|
||||
+.openerp .oe_web_example h4 {
|
||||
+ margin: 0;
|
||||
+ font-size: 200%;
|
||||
+}
|
||||
+.openerp .oe_web_example.oe_web_example_started .oe_web_example_start button,
|
||||
+.openerp .oe_web_example.oe_web_example_stopped .oe_web_example_stop button {
|
||||
+ display: none
|
||||
+}
|
|
@ -0,0 +1,2 @@
|
|||
// static/src/js/first_module.js
|
||||
console.log("Debug statement: file loaded");
|
|
@ -0,0 +1,8 @@
|
|||
--- web_example/static/src/js/first_module.js
|
||||
+++ web_example/static/src/js/first_module.js
|
||||
@@ -1,2 +1,4 @@
|
||||
// static/src/js/first_module.js
|
||||
-console.log("Debug statement: file loaded");
|
||||
+openerp.web_example = function (instance) {
|
||||
+ console.log("Module loaded");
|
||||
+};
|
|
@ -0,0 +1,11 @@
|
|||
--- web_example/static/src/js/first_module.js
|
||||
+++ web_example/static/src/js/first_module.js
|
||||
@@ -1,4 +1,7 @@
|
||||
// static/src/js/first_module.js
|
||||
openerp.web_example = function (instance) {
|
||||
- console.log("Module loaded");
|
||||
+ instance.web.client_actions.add('example.action', 'instance.web_example.action');
|
||||
+ instance.web_example.action = function (parent, action) {
|
||||
+ console.log("Executed the action", action);
|
||||
+ };
|
||||
};
|
|
@ -0,0 +1,18 @@
|
|||
--- web_example/static/src/js/first_module.js
|
||||
+++ web_example/static/src/js/first_module.js
|
||||
@@ -1,7 +1,11 @@
|
||||
// static/src/js/first_module.js
|
||||
openerp.web_example = function (instance) {
|
||||
- instance.web.client_actions.add('example.action', 'instance.web_example.action');
|
||||
- instance.web_example.action = function (parent, action) {
|
||||
- console.log("Executed the action", action);
|
||||
- };
|
||||
+ instance.web.client_actions.add('example.action', 'instance.web_example.Action');
|
||||
+ instance.web_example.Action = instance.web.Widget.extend({
|
||||
+ className: 'oe_web_example',
|
||||
+ start: function () {
|
||||
+ this.$el.text("Hello, world!");
|
||||
+ return this._super();
|
||||
+ }
|
||||
+ });
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
--- web_example/static/src/js/first_module.js
|
||||
+++ web_example/static/src/js/first_module.js
|
||||
@@ -1,11 +1,7 @@
|
||||
// static/src/js/first_module.js
|
||||
openerp.web_example = function (instance) {
|
||||
instance.web.client_actions.add('example.action', 'instance.web_example.Action');
|
||||
instance.web_example.Action = instance.web.Widget.extend({
|
||||
+ template: 'web_example.action'
|
||||
- className: 'oe_web_example',
|
||||
- start: function () {
|
||||
- this.$el.text("Hello, world!");
|
||||
- return this._super();
|
||||
- }
|
||||
});
|
||||
};
|
|
@ -0,0 +1,23 @@
|
|||
--- web_example/static/src/js/first_module.js
|
||||
+++ web_example/static/src/js/first_module.js
|
||||
@@ -1,7 +1,19 @@
|
||||
// static/src/js/first_module.js
|
||||
openerp.web_example = function (instance) {
|
||||
instance.web.client_actions.add('example.action', 'instance.web_example.Action');
|
||||
instance.web_example.Action = instance.web.Widget.extend({
|
||||
- template: 'web_example.action'
|
||||
+ template: 'web_example.action',
|
||||
+ events: {
|
||||
+ 'click .oe_web_example_start button': 'watch_start',
|
||||
+ 'click .oe_web_example_stop button': 'watch_stop'
|
||||
+ },
|
||||
+ watch_start: function () {
|
||||
+ this.$el.addClass('oe_web_example_started')
|
||||
+ .removeClass('oe_web_example_stopped');
|
||||
+ },
|
||||
+ watch_stop: function () {
|
||||
+ this.$el.removeClass('oe_web_example_started')
|
||||
+ .addClass('oe_web_example_stopped');
|
||||
+ },
|
||||
});
|
||||
};
|
|
@ -0,0 +1,55 @@
|
|||
--- web_example/static/src/js/first_module.js
|
||||
+++ web_example/static/src/js/first_module.js
|
||||
@@ -1,19 +1,52 @@
|
||||
// static/src/js/first_module.js
|
||||
openerp.web_example = function (instance) {
|
||||
instance.web.client_actions.add('example.action', 'instance.web_example.Action');
|
||||
instance.web_example.Action = instance.web.Widget.extend({
|
||||
template: 'web_example.action',
|
||||
events: {
|
||||
'click .oe_web_example_start button': 'watch_start',
|
||||
'click .oe_web_example_stop button': 'watch_stop'
|
||||
},
|
||||
+ init: function () {
|
||||
+ this._super.apply(this, arguments);
|
||||
+ this._start = null;
|
||||
+ this._watch = null;
|
||||
+ },
|
||||
+ update_counter: function () {
|
||||
+ var h, m, s;
|
||||
+ // Subtracting javascript dates returns the difference in milliseconds
|
||||
+ var diff = new Date() - this._start;
|
||||
+ s = diff / 1000;
|
||||
+ m = Math.floor(s / 60);
|
||||
+ s -= 60*m;
|
||||
+ h = Math.floor(m / 60);
|
||||
+ m -= 60*h;
|
||||
+ this.$('.oe_web_example_timer').text(
|
||||
+ _.str.sprintf("%02d:%02d:%02d", h, m, s));
|
||||
+ },
|
||||
watch_start: function () {
|
||||
this.$el.addClass('oe_web_example_started')
|
||||
.removeClass('oe_web_example_stopped');
|
||||
+ this._start = new Date();
|
||||
+ // Update the UI to the current time
|
||||
+ this.update_counter();
|
||||
+ // Update the counter at 30 FPS (33ms/frame)
|
||||
+ this._watch = setInterval(
|
||||
+ this.proxy('update_counter'),
|
||||
+ 33);
|
||||
},
|
||||
watch_stop: function () {
|
||||
+ clearInterval(this._watch);
|
||||
+ this.update_counter();
|
||||
+ this._start = this._watch = null;
|
||||
this.$el.removeClass('oe_web_example_started')
|
||||
.addClass('oe_web_example_stopped');
|
||||
},
|
||||
+ destroy: function () {
|
||||
+ if (this._watch) {
|
||||
+ clearInterval(this._watch);
|
||||
+ }
|
||||
+ this._super();
|
||||
+ }
|
||||
});
|
||||
};
|
|
@ -0,0 +1,11 @@
|
|||
<templates>
|
||||
<div t-name="web_example.action" class="oe_web_example oe_web_example_stopped">
|
||||
<h4 class="oe_web_example_timer">00:00:00</h4>
|
||||
<p class="oe_web_example_start">
|
||||
<button type="button">Start</button>
|
||||
</p>
|
||||
<p class="oe_web_example_stop">
|
||||
<button type="button">Stop</button>
|
||||
</p>
|
||||
</div>
|
||||
</templates>
|
|
@ -0,0 +1,11 @@
|
|||
<!-- web_example/web_example.xml -->
|
||||
<openerp>
|
||||
<data>
|
||||
<record model="ir.actions.client" id="action_client_example">
|
||||
<field name="name">Example Client Action</field>
|
||||
<field name="tag">example.action</field>
|
||||
</record>
|
||||
<menuitem action="action_client_example"
|
||||
id="menu_client_example"/>
|
||||
</data>
|
||||
</openerp>
|
|
@ -1,42 +0,0 @@
|
|||
|
||||
Presentation
|
||||
============
|
||||
|
||||
Prerequisites
|
||||
-------------
|
||||
|
||||
Prerequisites to code addons for the OpenERP Web Client:
|
||||
|
||||
- HTML5
|
||||
- CSS
|
||||
- Javascript (Ecmascript 5)
|
||||
- jQuery
|
||||
|
||||
Once you know all this, that's only the beginning. Most usages of Javascript/jQuery are small hacks to make a web page nicer. The OpenERP Client Web is different: it's a web application, not a web site. It doesn't have multiple pages generated by a server side code. Only one unique empty page is loaded and all the html is generated by Javascript code, the page is never reloaded. If you never developed that kind of application you still have lot of good practices to learn.
|
||||
|
||||
Generic Guidelines
|
||||
------------------
|
||||
|
||||
First, here are some generic recommandations about web 2.0 applications:
|
||||
|
||||
* **Do not use ids**. Html ids are evil, the key anti-feature that makes your components non-reusable. You want to identify a dom part? Save a jQuery object over that dom element. If you really need to use ids, use _.uniqueId(), but 99% of the time you don't need to, classes are sufficient.
|
||||
* **Do not use predictable css class names** like "content" or "navigation", ten other developers will have the same idea than you and there will be clashes. A simple way to avoid this is to use prefixes. For example, if you need a css class for the button named "new" that is contained in the form view which is itself contained in the OpenERP application, name it "oe-form-view-new-button".
|
||||
* **Do not use global selectors** like *$(".my-class")*, you never know if your component will be instantiated multiple times. Limit the selector with a context, like *$(".my-class", this.$el)*.
|
||||
* As a general advice, **Never assume you own the page**. When you create a component, it is never unique and is always surrounded by a bunch of crazy html. You have to do with it.
|
||||
* **Learn how to use jQuery's deferreds** [1]_. That concept may seem over-complicated, but the experience tell us that it is nearly impossible to create big-size javascript applications without that.
|
||||
|
||||
OpenERP guidelines
|
||||
------------------
|
||||
More recommendations related to the specific case of the OpenERP Web Client:
|
||||
|
||||
* The code should conform to EcmasScript 5 without the "use strict" mode as we support IE9.
|
||||
|
||||
* Your components should inherit from the *Widget* class. And use *Widget* 's methods (*appendTo*, *replace*,...) to insert your component and its content into the dom.
|
||||
|
||||
* Use QWeb templates for html rendering.
|
||||
|
||||
* All css classes should have the prefix *oe_* .
|
||||
|
||||
* Functions that call rpc() should return a deferred, even if it calls it indirectly. So a function that calls a function that calls a function that calls rpc() should return a deferred too.
|
||||
|
||||
.. [1] http://api.jquery.com/category/deferred-object/
|
|
@ -1,79 +1,546 @@
|
|||
|
||||
QWeb
|
||||
====
|
||||
|
||||
QWeb is the template engine used by the OpenERP Web Client. It is a home made engine create by OpenERP developers. There are a few things to note about it:
|
||||
QWeb is the template engine used by the OpenERP Web Client. It is an
|
||||
XML-based templating language, similar to `Genshi
|
||||
<http://en.wikipedia.org/wiki/Genshi_(templating_language)>`_,
|
||||
`Thymeleaf <http://en.wikipedia.org/wiki/Thymeleaf>`_ or `Facelets
|
||||
<http://en.wikipedia.org/wiki/Facelets>`_ with a few peculiarities:
|
||||
|
||||
* Template are rendered in javascript on the client-side, the server does nothing.
|
||||
* It is an xml template engine, like Facelets_ for example. The source file must be a valid xml.
|
||||
* Templates are not interpreted. There are compiled to javascript. This makes them a lot faster to render, but sometimes harder to debug.
|
||||
* Most of the time it is used through the Widget class, but you can also use it directly using *openerp.web.qweb.render()* .
|
||||
* It's implemented fully in javascript and rendered in the browser.
|
||||
* Each template file (XML files) contains multiple templates, where
|
||||
template engine usually have a 1:1 mapping between template files
|
||||
and templates.
|
||||
* It has special support in OpenERP Web's
|
||||
:class:`~instance.web.Widget`, though it can be used outside of
|
||||
OpenERP Web (and it's possible to use :class:`~instance.web.Widget`
|
||||
without relying on the QWeb integration).
|
||||
|
||||
.. _Facelets: http://en.wikipedia.org/wiki/Facelets
|
||||
The rationale behind using QWeb instead of a more popular template syntax is
|
||||
that its extension mechanism is very similar to the openerp view inheritance
|
||||
mechanism. Like openerp views a QWeb template is an xml tree and therefore
|
||||
xpath or dom manipulations are easy to performs on it.
|
||||
|
||||
Here is a typical QWeb file:
|
||||
Here's an example demonstrating most of the basic QWeb features:
|
||||
|
||||
::
|
||||
.. code-block:: xml
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates>
|
||||
<t t-name="Template1">
|
||||
<div>...</div>
|
||||
</t>
|
||||
<t t-name="Template2">
|
||||
<div>...</div>
|
||||
</t>
|
||||
<div t-name="example_template" t-attf-class="base #{cls}">
|
||||
<h4 t-if="title"><t t-esc="title"/></h4>
|
||||
<ul>
|
||||
<li t-foreach="items" t-as="item" t-att-class="item_parity">
|
||||
<t t-call="example_template.sub">
|
||||
<t t-set="arg" t-value="item_value"/>
|
||||
</t>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<t t-name="example_template.sub">
|
||||
<t t-esc="arg.name"/>
|
||||
<dl>
|
||||
<t t-foreach="arg.tags" t-as="tag" t-if="tag_index lt 5">
|
||||
<dt><t t-esc="tag"/></dt>
|
||||
<dd><t t-esc="tag_value"/></dd>
|
||||
</t>
|
||||
</dl>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
A QWeb file contains multiple templates, they are simply identified by a name.
|
||||
rendered with the following context:
|
||||
|
||||
Here is a sample QWeb template:
|
||||
.. code-block:: json
|
||||
|
||||
::
|
||||
{
|
||||
"class1": "foo",
|
||||
"title": "Random Title",
|
||||
"items": [
|
||||
{ "name": "foo", "tags": {"bar": "baz", "qux": "quux"} },
|
||||
{ "name": "Lorem", "tags": {
|
||||
"ipsum": "dolor",
|
||||
"sit": "amet",
|
||||
"consectetur": "adipiscing",
|
||||
"elit": "Sed",
|
||||
"hendrerit": "ullamcorper",
|
||||
"ante": "id",
|
||||
"vestibulum": "Lorem",
|
||||
"ipsum": "dolor",
|
||||
"sit": "amet"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
<t t-name="UserPage">
|
||||
<div>
|
||||
<p>Name: <t t-esc="widget.user_name"/></p>
|
||||
<p>Password: <input type="text" t-att-value="widget.password"/></p>
|
||||
<p t-if="widget.is_admin">This user is an Administrator</p>
|
||||
<t t-foreach="widget.roles" t-as="role">
|
||||
<p>User has role: <t t-esc="role"/></p>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
will yield this section of HTML document (reformated for readability):
|
||||
|
||||
.. code-block:: html
|
||||
|
||||
*widget* is a variable given to the template engine by Widget sub-classes when they decide to render their associated template, it is simply *this*. Here is the corresponding Widget sub-class:
|
||||
|
||||
::
|
||||
|
||||
UserPageWidget = openerp.base.Widget.extend({
|
||||
template: "UserPage",
|
||||
init: function(parent) {
|
||||
this._super(parent);
|
||||
this.user_name = "Xavier";
|
||||
this.password = "lilo";
|
||||
this.is_admin = true;
|
||||
this.roles = ["Web Developer", "IE Hater", "Steve Jobs Worshiper"];
|
||||
},
|
||||
});
|
||||
|
||||
It could output something like this:
|
||||
|
||||
::
|
||||
|
||||
<div>
|
||||
<p>Name: Xavier</p>
|
||||
<p>Password: <input type="text" value="lilo"/></p>
|
||||
<p>This user is an Administrator</p
|
||||
<p>User has role: Web Developer</p>
|
||||
<p>User has role: IE Hater</p>
|
||||
<p>User has role: Steve Jobs Worshiper</p>
|
||||
<div class="base foo">
|
||||
<h4>Random Title</h4>
|
||||
<ul>
|
||||
<li class="even">
|
||||
foo
|
||||
<dl>
|
||||
<dt>bar</dt>
|
||||
<dd>baz</dd>
|
||||
<dt>qux</dt>
|
||||
<dd>quux</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="odd">
|
||||
Lorem
|
||||
<dl>
|
||||
<dt>ipsum</dt>
|
||||
<dd>dolor</dd>
|
||||
<dt>sit</dt>
|
||||
<dd>amet</dd>
|
||||
<dt>consectetur</dt>
|
||||
<dd>adipiscing</dd>
|
||||
<dt>elit</dt>
|
||||
<dd>Sed</dd>
|
||||
<dt>hendrerit</dt>
|
||||
<dd>ullamcorper</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
A QWeb template should always contain one unique root element to be used effectively with the Widget class, here it is a *<div>*. QWeb only react to *<t>* elements or attributes prefixed by *t-*. The *<t>* is simply a null element, it is only used when you need to use a *t-* attribute without outputting an html element at the same time. Here are the effects of the most common QWeb attributes:
|
||||
API
|
||||
---
|
||||
|
||||
* *t-esc* outputs the result of the evaluation of the given javascript expression
|
||||
* *t-att-ATTR* sets the value of the *ATTR* attribute to the result of the evaluation of the given javascript expression
|
||||
* *t-if* outputs the element and its content only if the given javascript expression returns true
|
||||
* *t-foreach* outputs as many times as contained in the list returned by the given javascript expression. For each iteration, a variable with the name defined by *t-as* contains the current element in the list.
|
||||
While QWeb implements a number of attributes and methods for
|
||||
customization and configuration, only two things are really important
|
||||
to the user:
|
||||
|
||||
.. js:class:: QWeb2.Engine
|
||||
|
||||
The QWeb "renderer", handles most of QWeb's logic (loading,
|
||||
parsing, compiling and rendering templates).
|
||||
|
||||
OpenERP Web instantiates one for the user, and sets it to
|
||||
``instance.web.qweb``. It also loads all the template files of the
|
||||
various modules into that QWeb instance.
|
||||
|
||||
A :js:class:`QWeb2.Engine` also serves as a "template namespace".
|
||||
|
||||
.. js:function:: QWeb2.Engine.render(template[, context])
|
||||
|
||||
Renders a previously loaded template to a String, using
|
||||
``context`` (if provided) to find the variables accessed
|
||||
during template rendering (e.g. strings to display).
|
||||
|
||||
:param String template: the name of the template to render
|
||||
:param Object context: the basic namespace to use for template
|
||||
rendering
|
||||
:returns: String
|
||||
|
||||
The engine exposes an other method which may be useful in some
|
||||
cases (e.g. if you need a separate template namespace with, in
|
||||
OpenERP Web, Kanban views get their own :js:class:`QWeb2.Engine`
|
||||
instance so their templates don't collide with more general
|
||||
"module" templates):
|
||||
|
||||
.. js:function:: QWeb2.Engine.add_template(templates)
|
||||
|
||||
Loads a template file (a collection of templates) in the QWeb
|
||||
instance. The templates can be specified as:
|
||||
|
||||
An XML string
|
||||
QWeb will attempt to parse it to an XML document then load
|
||||
it.
|
||||
|
||||
A URL
|
||||
QWeb will attempt to download the URL content, then load
|
||||
the resulting XML string.
|
||||
|
||||
A ``Document`` or ``Node``
|
||||
QWeb will traverse the first level of the document (the
|
||||
child nodes of the provided root) and load any named
|
||||
template or template override.
|
||||
|
||||
:type templates: String | Document | Node
|
||||
|
||||
A :js:class:`QWeb2.Engine` also exposes various attributes for
|
||||
behavior customization:
|
||||
|
||||
.. js:attribute:: QWeb2.Engine.prefix
|
||||
|
||||
Prefix used to recognize :ref:`directives <qweb-directives>`
|
||||
during parsing. A string. By default, ``t``.
|
||||
|
||||
.. js:attribute:: QWeb2.Engine.debug
|
||||
|
||||
Boolean flag putting the engine in "debug mode". Normally,
|
||||
QWeb intercepts any error raised during template execution. In
|
||||
debug mode, it leaves all exceptions go through without
|
||||
intercepting them.
|
||||
|
||||
.. js:attribute:: QWeb2.Engine.jQuery
|
||||
|
||||
The jQuery instance used during :ref:`template inheritance
|
||||
<qweb-directives-inheritance>` processing. Defaults to
|
||||
``window.jQuery``.
|
||||
|
||||
.. js:attribute:: QWeb2.Engine.preprocess_node
|
||||
|
||||
A ``Function``. If present, called before compiling each DOM
|
||||
node to template code. In OpenERP Web, this is used to
|
||||
automatically translate text content and some attributes in
|
||||
templates. Defaults to ``null``.
|
||||
|
||||
.. _qweb-directives:
|
||||
|
||||
Directives
|
||||
----------
|
||||
|
||||
A basic QWeb template is nothing more than an XHTML document (as it
|
||||
must be valid XML), which will be output as-is. But the rendering can
|
||||
be customized with bits of logic called "directives". Directives are
|
||||
attributes elements prefixed by :js:attr:`~QWeb2.Engine.prefix` (this
|
||||
document will use the default prefix ``t``, as does OpenERP Web).
|
||||
|
||||
A directive will usually control or alter the output of the element it
|
||||
is set on. If no suitable element is available, the prefix itself can
|
||||
be used as a "no-operation" element solely for supporting directives
|
||||
(or internal content, which will be rendered). This means:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<t>Something something</t>
|
||||
|
||||
will simply output the string "Something something" (the element
|
||||
itself will be skipped and "unwrapped"):
|
||||
|
||||
.. code-block:: javascript
|
||||
|
||||
var e = new QWeb2.Engine();
|
||||
e.add_template('<templates>\
|
||||
<t t-name="test1"><t>Test 1</t></t>\
|
||||
<t t-name="test2"><span>Test 2</span></t>\
|
||||
</templates>');
|
||||
e.render('test1'); // Test 1
|
||||
e.render('test2'); // <span>Test 2</span>
|
||||
|
||||
.. note::
|
||||
|
||||
The conventions used in directive descriptions are the following:
|
||||
|
||||
* directives are described as compound functions, potentially with
|
||||
optional sections. Each section of the function name is an
|
||||
attribute of the element bearing the directive.
|
||||
|
||||
* a special parameter is ``BODY``, which does not have a name and
|
||||
designates the content of the element.
|
||||
|
||||
* special parameter types (aside from ``BODY`` which remains
|
||||
untyped) are ``Name``, which designates a valid javascript
|
||||
variable name, ``Expression`` which designates a valid
|
||||
javascript expression, and ``Format`` which designates a
|
||||
Ruby-style format string (a literal string with
|
||||
``#{Expression}`` inclusions executed and replaced by their
|
||||
result)
|
||||
|
||||
.. note::
|
||||
|
||||
``Expression`` actually supports a few extensions on the
|
||||
javascript syntax: because some syntactic elements of javascript
|
||||
are not compatible with XML and must be escaped, text
|
||||
substitutions are performed from forms which don't need to be
|
||||
escaped. Thus the following "keyword operators" are available in
|
||||
an ``Expression``: ``and`` (maps to ``&&``), ``or`` (maps to
|
||||
``||``), ``gt`` (maps to ``>``), ``gte`` (maps to ``>=``), ``lt``
|
||||
(maps to ``<``) and ``lte`` (maps to ``<=``).
|
||||
|
||||
.. _qweb-directives-templates:
|
||||
|
||||
Defining Templates
|
||||
++++++++++++++++++
|
||||
|
||||
.. _qweb-directive-name:
|
||||
|
||||
.. function:: t-name=name
|
||||
|
||||
:param String name: an arbitrary javascript string. Each template
|
||||
name is unique in a given
|
||||
:js:class:`QWeb2.Engine` instance, defining a
|
||||
new template with an existing name will
|
||||
overwrite the previous one without warning.
|
||||
|
||||
When multiple templates are related, it is
|
||||
customary to use dotted names as a kind of
|
||||
"namespace" e.g. ``foo`` and ``foo.bar`` which
|
||||
will be used either by ``foo`` or by a
|
||||
sub-widget of the widget used by ``foo``.
|
||||
|
||||
Templates can only be defined as the children of the document
|
||||
root. The document root's name is irrelevant (it's not checked)
|
||||
but is usually ``<templates>`` for simplicity.
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<templates>
|
||||
<t t-name="template1">
|
||||
<!-- template code -->
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
:ref:`t-name <qweb-directive-name>` can be used on an element with
|
||||
an output as well:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<templates>
|
||||
<div t-name="template2">
|
||||
<!-- template code -->
|
||||
</div>
|
||||
</templates>
|
||||
|
||||
which ensures the template has a single root (if a template has
|
||||
multiple roots and is then passed directly to jQuery, odd things
|
||||
occur).
|
||||
|
||||
.. _qweb-directives-output:
|
||||
|
||||
Output
|
||||
++++++
|
||||
|
||||
.. _qweb-directive-esc:
|
||||
|
||||
.. function:: t-esc=content
|
||||
|
||||
:param Expression content:
|
||||
|
||||
Evaluates, html-escapes and outputs ``content``.
|
||||
|
||||
.. _qweb-directive-escf:
|
||||
|
||||
.. function:: t-escf=content
|
||||
|
||||
:param Format content:
|
||||
|
||||
Similar to :ref:`t-esc <qweb-directive-esc>` but evaluates a
|
||||
``Format`` instead of just an expression.
|
||||
|
||||
.. _qweb-directive-raw:
|
||||
|
||||
.. function:: t-raw=content
|
||||
|
||||
:param Expression content:
|
||||
|
||||
Similar to :ref:`t-esc <qweb-directive-esc>` but does *not*
|
||||
html-escape the result of evaluating ``content``. Should only ever
|
||||
be used for known-secure content, or will be an XSS attack vector.
|
||||
|
||||
.. _qweb-directive-rawf:
|
||||
|
||||
.. function:: t-rawf=content
|
||||
|
||||
:param Format content:
|
||||
|
||||
``Format``-based version of :ref:`t-raw <qweb-directive-raw>`.
|
||||
|
||||
.. _qweb-directive-att:
|
||||
|
||||
.. function:: t-att=map
|
||||
|
||||
:param Expression map:
|
||||
|
||||
Evaluates ``map`` expecting an ``Object`` result, sets each
|
||||
key:value pair as an attribute (and its value) on the holder
|
||||
element:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<span t-att="{foo: 3, bar: 42}"/>
|
||||
|
||||
will yield
|
||||
|
||||
.. code-block:: html
|
||||
|
||||
<span foo="3" bar="42"/>
|
||||
|
||||
.. function:: t-att-ATTNAME=value
|
||||
|
||||
:param Name ATTNAME:
|
||||
:param Expression value:
|
||||
|
||||
Evaluates ``value`` and sets it on the attribute ``ATTNAME`` on
|
||||
the holder element.
|
||||
|
||||
If ``value``'s result is ``undefined``, suppresses the creation of
|
||||
the attribute.
|
||||
|
||||
.. _qweb-directive-attf:
|
||||
|
||||
.. function:: t-attf-ATTNAME=value
|
||||
|
||||
:param Name ATTNAME:
|
||||
:param Format value:
|
||||
|
||||
Similar to :ref:`t-att-* <qweb-directive-att>` but the value of
|
||||
the attribute is specified via a ``Format`` instead of an
|
||||
expression. Useful for specifying e.g. classes mixing literal
|
||||
classes and computed ones.
|
||||
|
||||
.. _qweb-directives-flow:
|
||||
|
||||
Flow Control
|
||||
++++++++++++
|
||||
|
||||
.. _qweb-directive-set:
|
||||
|
||||
.. function:: t-set=name (t-value=value | BODY)
|
||||
|
||||
:param Name name:
|
||||
:param Expression value:
|
||||
:param BODY:
|
||||
|
||||
Creates a new binding in the template context. If ``value`` is
|
||||
specified, evaluates it and sets it to the specified
|
||||
``name``. Otherwise, processes ``BODY`` and uses that instead.
|
||||
|
||||
.. _qweb-directive-if:
|
||||
|
||||
.. function:: t-if=condition
|
||||
|
||||
:param Expression condition:
|
||||
|
||||
Evaluates ``condition``, suppresses the output of the holder
|
||||
element and its content of the result is falsy.
|
||||
|
||||
.. _qweb-directive-foreach:
|
||||
|
||||
.. function:: t-foreach=iterable [t-as=name]
|
||||
|
||||
:param Expression iterable:
|
||||
:param Name name:
|
||||
|
||||
Evaluates ``iterable``, iterates on it and evaluates the holder
|
||||
element and its body once per iteration round.
|
||||
|
||||
If ``name`` is not specified, computes a ``name`` based on
|
||||
``iterable`` (by replacing non-``Name`` characters by ``_``).
|
||||
|
||||
If ``iterable`` yields a ``Number``, treats it as a range from 0
|
||||
to that number (excluded).
|
||||
|
||||
While iterating, :ref:`t-foreach <qweb-directive-foreach>` adds a
|
||||
number of variables in the context:
|
||||
|
||||
``#{name}``
|
||||
If iterating on an array (or a range), the current value in
|
||||
the iteration. If iterating on an *object*, the current key.
|
||||
``#{name}_all``
|
||||
The collection being iterated (the array generated for a
|
||||
``Number``)
|
||||
``#{name}_value``
|
||||
The current iteration value (current item for an array, value
|
||||
for the current item for an object)
|
||||
``#{name}_index``
|
||||
The 0-based index of the current iteration round.
|
||||
``#{name}_first``
|
||||
Whether the current iteration round is the first one.
|
||||
``#{name}_parity``
|
||||
``"odd"`` if the current iteration round is odd, ``"even"``
|
||||
otherwise. ``0`` is considered even.
|
||||
|
||||
.. _qweb-directive-call:
|
||||
|
||||
.. function:: t-call=template [BODY]
|
||||
|
||||
:param String template:
|
||||
:param BODY:
|
||||
|
||||
Calls the specified ``template`` and returns its result. If
|
||||
``BODY`` is specified, it is evaluated *before* calling
|
||||
``template`` and can be used to specify e.g. parameters. This
|
||||
usage is similar to `call-template with with-param in XSLT
|
||||
<http://zvon.org/xxl/XSLTreference/OutputOverview/xslt_with-param_frame.html>`_.
|
||||
|
||||
.. _qweb-directives-inheritance:
|
||||
|
||||
Template Inheritance and Extension
|
||||
++++++++++++++++++++++++++++++++++
|
||||
|
||||
.. _qweb-directive-extend:
|
||||
|
||||
.. function:: t-extend=template BODY
|
||||
|
||||
:param String template: name of the template to extend
|
||||
|
||||
Works similarly to OpenERP models: if used on its own, will alter
|
||||
the specified template in-place; if used in conjunction with
|
||||
:ref:`t-name <qweb-directive-name>` will create a new template
|
||||
using the old one as a base.
|
||||
|
||||
``BODY`` should be a sequence of :ref:`t-jquery
|
||||
<qweb-directive-jquery>` alteration directives.
|
||||
|
||||
.. note::
|
||||
|
||||
The inheritance in the second form is *static*: the parent
|
||||
template is copied and transformed when :ref:`t-extend
|
||||
<qweb-directive-extend>` is called. If it is altered later (by
|
||||
a :ref:`t-extend <qweb-directive-extend>` without a
|
||||
:ref:`t-name <qweb-directive-name>`), these changes will *not*
|
||||
appear in the "child" templates.
|
||||
|
||||
.. _qweb-directive-jquery:
|
||||
|
||||
.. function:: t-jquery=selector [t-operation=operation] BODY
|
||||
|
||||
:param String selector: a CSS selector into the parent template
|
||||
:param operation: one of ``append``, ``prepend``, ``before``,
|
||||
``after``, ``inner`` or ``replace``.
|
||||
:param BODY: ``operation`` argument, or alterations to perform
|
||||
|
||||
* If ``operation`` is specified, applies the selector to the
|
||||
parent template to find a *context node*, then applies
|
||||
``operation`` (as a jQuery operation) to the *context node*,
|
||||
passing ``BODY`` as parameter.
|
||||
|
||||
.. note::
|
||||
|
||||
``replace`` maps to jQuery's `replaceWith(newContent)
|
||||
<http://api.jquery.com/replaceWith/>`_, ``inner`` maps to
|
||||
`html(htmlString) <http://api.jquery.com/html/>`_.
|
||||
|
||||
* If ``operation`` is not provided, ``BODY`` is evaluated as
|
||||
javascript code, with the *context node* as ``this``.
|
||||
|
||||
.. warning::
|
||||
|
||||
While this second form is much more powerful than the first,
|
||||
it is also much harder to read and maintain and should be
|
||||
avoided. It is usually possible to either avoid it or
|
||||
replace it with a sequence of ``t-jquery:t-operation:``.
|
||||
|
||||
Escape Hatches / debugging
|
||||
++++++++++++++++++++++++++
|
||||
|
||||
.. _qweb-directive-log:
|
||||
|
||||
.. function:: t-log=expression
|
||||
|
||||
:param Expression expression:
|
||||
|
||||
Evaluates the provided expression (in the current template
|
||||
context) and logs its result via ``console.log``.
|
||||
|
||||
.. _qweb-directive-debug:
|
||||
|
||||
.. function:: t-debug
|
||||
|
||||
Injects a debugger breakpoint (via the ``debugger;`` statement) in
|
||||
the compiled template output.
|
||||
|
||||
.. _qweb-directive-js:
|
||||
|
||||
.. function:: t-js=context BODY
|
||||
|
||||
:param Name context:
|
||||
:param BODY: javascript code
|
||||
|
||||
Injects the provided ``BODY`` javascript code into the compiled
|
||||
template, passing it the current template context using the name
|
||||
specified by ``context``.
|
||||
|
|
|
@ -240,6 +240,8 @@ regular query for records):
|
|||
The result of a (successful) :js:func:`~openerp.web.Query.group_by` is
|
||||
an array of :js:class:`~openerp.web.QueryGroup`.
|
||||
|
||||
.. _rpc_rpc:
|
||||
|
||||
Low-level API: RPC calls to Python side
|
||||
---------------------------------------
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
Widget
|
||||
======
|
||||
|
||||
.. js:class:: openerp.web.Widget
|
||||
|
||||
This is the base class for all visual components. It corresponds to an MVC
|
||||
view. It provides a number of services to handle a section of a page:
|
||||
|
||||
|
@ -15,31 +17,33 @@ view. It provides a number of services to handle a section of a page:
|
|||
be anything the corresponding jQuery method accepts (generally selectors,
|
||||
DOM nodes and jQuery objects):
|
||||
|
||||
:js:func:`~openerp.base.Widget.appendTo`
|
||||
:js:func:`~openerp.web.Widget.appendTo`
|
||||
Renders the widget and inserts it as the last child of the target, uses
|
||||
`.appendTo()`_
|
||||
|
||||
:js:func:`~openerp.base.Widget.prependTo`
|
||||
:js:func:`~openerp.web.Widget.prependTo`
|
||||
Renders the widget and inserts it as the first child of the target, uses
|
||||
`.prependTo()`_
|
||||
|
||||
:js:func:`~openerp.base.Widget.insertAfter`
|
||||
:js:func:`~openerp.web.Widget.insertAfter`
|
||||
Renders the widget and inserts it as the preceding sibling of the target,
|
||||
uses `.insertAfter()`_
|
||||
|
||||
:js:func:`~openerp.base.Widget.insertBefore`
|
||||
:js:func:`~openerp.web.Widget.insertBefore`
|
||||
Renders the widget and inserts it as the following sibling of the target,
|
||||
uses `.insertBefore()`_
|
||||
|
||||
* Backbone-compatible shortcuts
|
||||
|
||||
.. _widget-dom_root:
|
||||
|
||||
DOM Root
|
||||
--------
|
||||
|
||||
A :js:class:`~openerp.web.Widget` is responsible for a section of the
|
||||
page materialized by the DOM root of the widget. The DOM root is
|
||||
available via the :js:attr:`~openerp.web.Widget.el` and
|
||||
:js:attr:`~openerp.web.Widget.$element` attributes, which are
|
||||
:js:attr:`~openerp.web.Widget.$el` attributes, which are
|
||||
respectively the raw DOM Element and the jQuery wrapper around the DOM
|
||||
element.
|
||||
|
||||
|
@ -121,7 +125,7 @@ DOM:
|
|||
|
||||
.. code-block:: javascript
|
||||
|
||||
this.$element.find(selector);
|
||||
this.$el.find(selector);
|
||||
|
||||
:param String selector: CSS selector
|
||||
:returns: jQuery object
|
||||
|
@ -157,7 +161,16 @@ To this end, :js:class:`~openerp.web.Widget` provides an shortcut:
|
|||
Events are a mapping of ``event selector`` (an event name and a
|
||||
CSS selector separated by a space) to a callback. The callback can
|
||||
be either a method name in the widget or a function. In either
|
||||
case, the ``this`` will be set to the widget.
|
||||
case, the ``this`` will be set to the widget:
|
||||
|
||||
.. code-block:: javascript
|
||||
|
||||
events: {
|
||||
'click p.oe_some_class a': 'some_method',
|
||||
'change input': function (e) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
},
|
||||
|
||||
The selector is used for jQuery's `event delegation`_, the
|
||||
callback will only be triggered for descendants of the DOM root
|
||||
|
|
|
@ -103,7 +103,7 @@ class WebRequest(object):
|
|||
lang = self.httprequest.cookies.get('lang')
|
||||
if lang is None:
|
||||
lang = self.httprequest.accept_languages.best
|
||||
if lang is None:
|
||||
if not lang:
|
||||
lang = 'en_US'
|
||||
# tranform 2 letters lang like 'en' into 5 letters like 'en_US'
|
||||
lang = babel.core.LOCALE_ALIASES.get(lang, lang)
|
||||
|
@ -478,10 +478,9 @@ class Root(object):
|
|||
"""
|
||||
def __init__(self):
|
||||
self.addons = {}
|
||||
self.statics = {}
|
||||
|
||||
static_dirs = self._load_addons()
|
||||
app = werkzeug.wsgi.SharedDataMiddleware( self.dispatch, static_dirs)
|
||||
self.dispatch = DisableCacheMiddleware(app)
|
||||
self.load_addons()
|
||||
|
||||
# Setup http sessions
|
||||
path = session_path()
|
||||
|
@ -530,14 +529,12 @@ class Root(object):
|
|||
|
||||
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 = {}
|
||||
def load_addons(self):
|
||||
""" Load all addons from addons patch containg static files and
|
||||
controllers and configure them. """
|
||||
|
||||
for addons_path in openerp.modules.module.ad_paths:
|
||||
for module in os.listdir(addons_path):
|
||||
for module in sorted(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')
|
||||
|
@ -551,14 +548,17 @@ class Root(object):
|
|||
m = __import__(module)
|
||||
addons_module[module] = m
|
||||
addons_manifest[module] = manifest
|
||||
statics['/%s/static' % module] = path_static
|
||||
self.statics['/%s/static' % module] = path_static
|
||||
|
||||
for k, v in controllers_class:
|
||||
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
|
||||
|
||||
app = werkzeug.wsgi.SharedDataMiddleware(self.dispatch, self.statics)
|
||||
self.dispatch = DisableCacheMiddleware(app)
|
||||
|
||||
def find_handler(self, *l):
|
||||
"""
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-04-13 20:46+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2012-12-17 17:31+0000\n"
|
||||
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
|
||||
"Language-Team: Bosnian <bs@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: 2012-12-01 05:20+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-18 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -29,7 +29,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:593
|
||||
#, python-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr ""
|
||||
msgstr "prije %d minuta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-02-07 19:41+0000\n"
|
||||
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-16 10:58+0000\n"
|
||||
"Last-Translator: Felix Schubert <Unknown>\n"
|
||||
"Language-Team: German <de@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: 2012-12-01 05:20+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-17 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -29,14 +29,14 @@ msgstr "Standardsprache:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:593
|
||||
#, python-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr ""
|
||||
msgstr "vor %d Minuten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:621
|
||||
#, python-format
|
||||
msgid "Still loading...<br />Please be patient."
|
||||
msgstr ""
|
||||
msgstr "Lädt immer noch ...<br/>Bitte haben Sie noch etwas Geduld."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -75,7 +75,7 @@ msgstr "Master Passwort"
|
|||
#: code:addons/web/static/src/xml/base.xml:274
|
||||
#, python-format
|
||||
msgid "Change Master Password"
|
||||
msgstr ""
|
||||
msgstr "Hauptpasswort ändern"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -103,7 +103,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:594
|
||||
#, python-format
|
||||
msgid "about an hour ago"
|
||||
msgstr ""
|
||||
msgstr "vor einer Stunde"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -112,7 +112,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:216
|
||||
#, python-format
|
||||
msgid "Backup Database"
|
||||
msgstr ""
|
||||
msgstr "Sicherung der Datenbank"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -134,7 +134,7 @@ msgstr "Hier ist eine Vorschau der Datei die nicht importiert werden konnte"
|
|||
#: code:addons/web/static/src/js/coresetup.js:592
|
||||
#, python-format
|
||||
msgid "about a minute ago"
|
||||
msgstr ""
|
||||
msgstr "vor einer Minute"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -213,7 +213,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1583
|
||||
#, python-format
|
||||
msgid "Share with all users"
|
||||
msgstr ""
|
||||
msgstr "Mit allen Benutzern teilen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -277,14 +277,14 @@ msgstr "Datei hochladen"
|
|||
#: code:addons/web/static/src/js/coresetup.js:598
|
||||
#, python-format
|
||||
msgid "about a month ago"
|
||||
msgstr ""
|
||||
msgstr "letzten Monat"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1575
|
||||
#, python-format
|
||||
msgid "Custom Filters"
|
||||
msgstr ""
|
||||
msgstr "Benutzerdefinierte Filter"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -305,14 +305,14 @@ msgstr "OpenERP SA"
|
|||
#: code:addons/web/static/src/js/search.js:1555
|
||||
#, python-format
|
||||
msgid "Custom Filter"
|
||||
msgstr ""
|
||||
msgstr "Benutzerdefinierter Filter"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:159
|
||||
#, python-format
|
||||
msgid "Duplicate Database"
|
||||
msgstr ""
|
||||
msgstr "Datenbank kopieren"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -390,7 +390,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1245
|
||||
#, python-format
|
||||
msgid "...Upload in progress..."
|
||||
msgstr ""
|
||||
msgstr "... Wird hochgeladen ..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -411,7 +411,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:4811
|
||||
#, python-format
|
||||
msgid "File upload"
|
||||
msgstr ""
|
||||
msgstr "Datei hochladen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -447,7 +447,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:413
|
||||
#, python-format
|
||||
msgid "Activate the developer mode"
|
||||
msgstr ""
|
||||
msgstr "Entwickler Modus aktivieren"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -461,14 +461,14 @@ msgstr "Lade (%d)"
|
|||
#: code:addons/web/static/src/js/search.js:1116
|
||||
#, python-format
|
||||
msgid "GroupBy"
|
||||
msgstr ""
|
||||
msgstr "Gruppieren nach"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list.js:684
|
||||
#, python-format
|
||||
msgid "You must select at least one record."
|
||||
msgstr ""
|
||||
msgstr "Sie müssen mindestens einen Datensatz auswählen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -496,7 +496,7 @@ msgstr "Relation:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:591
|
||||
#, python-format
|
||||
msgid "less than a minute ago"
|
||||
msgstr ""
|
||||
msgstr "vor weniger als einer Minute"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -594,7 +594,7 @@ msgstr "Für weitere Informationen besuchen Sie:"
|
|||
#: code:addons/web/static/src/xml/base.xml:1834
|
||||
#, python-format
|
||||
msgid "Add All Info..."
|
||||
msgstr ""
|
||||
msgstr "All Informationen hinzufügen..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -645,7 +645,7 @@ msgstr "ist größer als"
|
|||
#: code:addons/web/static/src/xml/base.xml:540
|
||||
#, python-format
|
||||
msgid "View"
|
||||
msgstr "Sicht"
|
||||
msgstr "Ansicht"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -730,14 +730,14 @@ msgstr "Speichern unter"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "E-mail error"
|
||||
msgstr "EMail-Fehler"
|
||||
msgstr "E-Mail-Fehler"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:596
|
||||
#, python-format
|
||||
msgid "a day ago"
|
||||
msgstr ""
|
||||
msgstr "Vor 1 Tag"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -762,6 +762,10 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure you want to leave this page ?"
|
||||
msgstr ""
|
||||
"Achtung! Der Datensatz wurde geändert. Ihre Änderungen werden verloren "
|
||||
"gehen!\n"
|
||||
"\n"
|
||||
"Sind Sie sicher, dass Sie diese Seite verlassen wollen?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -782,7 +786,7 @@ msgstr "Technische Übersetzung"
|
|||
#: code:addons/web/static/src/xml/base.xml:1772
|
||||
#, python-format
|
||||
msgid "Delimiter:"
|
||||
msgstr "Feldtrenner:"
|
||||
msgstr "Trennzeichen:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -803,7 +807,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1439
|
||||
#, python-format
|
||||
msgid "-- Actions --"
|
||||
msgstr "-- Vorgänge --"
|
||||
msgstr "-- Actions --"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -834,14 +838,14 @@ msgstr "OpenERP.com"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "Can't send email to invalid e-mail address"
|
||||
msgstr "Kann Nachricht nicht an ungültige EMail-Adresse senden"
|
||||
msgstr "Kann keine Nachricht an eine ungültige E-Mail Adresse senden"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:614
|
||||
#, python-format
|
||||
msgid "Add..."
|
||||
msgstr ""
|
||||
msgstr "Hinzufügen ..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -863,7 +867,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:185
|
||||
#, python-format
|
||||
msgid "Drop Database"
|
||||
msgstr ""
|
||||
msgstr "Datenbank löschen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -884,7 +888,7 @@ msgstr "Modifikatoren:"
|
|||
#: code:addons/web/static/src/xml/base.xml:605
|
||||
#, python-format
|
||||
msgid "Delete this attachment"
|
||||
msgstr ""
|
||||
msgstr "Diesen Anhang löschen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -902,7 +906,7 @@ msgstr "Speichern"
|
|||
#: code:addons/web/static/src/xml/base.xml:355
|
||||
#, python-format
|
||||
msgid "More"
|
||||
msgstr ""
|
||||
msgstr "Mehr"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -992,7 +996,7 @@ msgstr "Zeige Log (%s)"
|
|||
#: code:addons/web/static/src/xml/base.xml:558
|
||||
#, python-format
|
||||
msgid "Creation Date:"
|
||||
msgstr "Datum Erstellung"
|
||||
msgstr "Erstellungsdatum:"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:806
|
||||
|
@ -1006,7 +1010,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:4810
|
||||
#, python-format
|
||||
msgid "The selected file exceed the maximum file size of %s."
|
||||
msgstr ""
|
||||
msgstr "Die ausgewählte Datei überschreitet die maximale Dateigröße von %s."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1076,7 +1080,7 @@ msgstr "(keine Bezeichnung)"
|
|||
#: code:addons/web/static/src/js/coresetup.js:597
|
||||
#, python-format
|
||||
msgid "%d days ago"
|
||||
msgstr ""
|
||||
msgstr "vor %d Tagen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1101,7 +1105,7 @@ msgstr "Abbrechen"
|
|||
#: code:addons/web/static/src/xml/base.xml:9
|
||||
#, python-format
|
||||
msgid "Loading..."
|
||||
msgstr "Lade..."
|
||||
msgstr "Lädt…"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1130,7 +1134,7 @@ msgstr "Unbekannter Operator %s in Domain %s"
|
|||
#: code:addons/web/static/src/js/view_form.js:426
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1163,7 +1167,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:599
|
||||
#, python-format
|
||||
msgid "%d months ago"
|
||||
msgstr ""
|
||||
msgstr "vor %d Monaten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1192,7 +1196,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:248
|
||||
#, python-format
|
||||
msgid "Restore Database"
|
||||
msgstr ""
|
||||
msgstr "Datenbank wiederherstellen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1271,7 +1275,7 @@ msgstr "Sie müssen mindestens einen Datensatz auswählen"
|
|||
#: code:addons/web/static/src/js/coresetup.js:622
|
||||
#, python-format
|
||||
msgid "Don't leave yet,<br />it's still loading..."
|
||||
msgstr ""
|
||||
msgstr "Nicht verlassen. <br/>Ladevorgang noch aktiv"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1320,14 +1324,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:4846
|
||||
#, python-format
|
||||
msgid "Save As..."
|
||||
msgstr ""
|
||||
msgstr "Speichern als..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4971
|
||||
#, python-format
|
||||
msgid "Could not display the selected image."
|
||||
msgstr ""
|
||||
msgstr "Das ausgewählte Bild kann nicht angezeigt werden"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1385,7 +1389,7 @@ msgstr "Standardwert ändern:"
|
|||
#: code:addons/web/static/src/xml/base.xml:171
|
||||
#, python-format
|
||||
msgid "Original database name:"
|
||||
msgstr ""
|
||||
msgstr "Original Datenbank Name :"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1395,7 +1399,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/search.js:1940
|
||||
#, python-format
|
||||
msgid "is equal to"
|
||||
msgstr "Ist gleich"
|
||||
msgstr "ist gleich"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1409,7 +1413,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1594
|
||||
#, python-format
|
||||
msgid "Advanced Search"
|
||||
msgstr ""
|
||||
msgstr "Erweiterte Suche"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1423,7 +1427,7 @@ msgstr "Bestätigen Sie das neue Master Passwort:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:625
|
||||
#, python-format
|
||||
msgid "Maybe you should consider reloading the application by pressing F5..."
|
||||
msgstr ""
|
||||
msgstr "Viellecht sollten Sie die Anwendung mit F5 neu laden"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1455,7 +1459,7 @@ msgstr "Import-Einstellungen"
|
|||
#: code:addons/web/static/src/js/view_form.js:2909
|
||||
#, python-format
|
||||
msgid "Add %s"
|
||||
msgstr ""
|
||||
msgstr "%s hinzufügen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1480,6 +1484,7 @@ msgstr "Schließen"
|
|||
msgid ""
|
||||
"You may not believe it,<br />but the application is actually loading..."
|
||||
msgstr ""
|
||||
"Sie werden es kaum glauben,<br />aber die Anwendung wird gerade geladen."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1493,7 +1498,7 @@ msgstr "CSV Datei:"
|
|||
#: code:addons/web/static/src/js/search.js:1743
|
||||
#, python-format
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
msgstr "Erweitert"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1541,7 +1546,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1403
|
||||
#, python-format
|
||||
msgid "Advanced Search..."
|
||||
msgstr ""
|
||||
msgstr "Erweiterte Suche ..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1592,21 +1597,21 @@ msgstr "Größe:"
|
|||
#: code:addons/web/static/src/xml/base.xml:1799
|
||||
#, python-format
|
||||
msgid "--- Don't Import ---"
|
||||
msgstr ""
|
||||
msgstr "--- Nicht importieren ---"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1654
|
||||
#, python-format
|
||||
msgid "Import-Compatible Export"
|
||||
msgstr ""
|
||||
msgstr "Import-kompatibler Export"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:601
|
||||
#, python-format
|
||||
msgid "%d years ago"
|
||||
msgstr ""
|
||||
msgstr "vor %d Jahren"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1657,7 +1662,7 @@ msgstr "Ansichten verwalten"
|
|||
#: code:addons/web/static/src/xml/base.xml:1776
|
||||
#, python-format
|
||||
msgid "Encoding:"
|
||||
msgstr "Zeichenkodierung:"
|
||||
msgstr "Zeichensatz:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1678,8 +1683,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/data_export.js:361
|
||||
#, python-format
|
||||
msgid "Please select fields to save export list..."
|
||||
msgstr ""
|
||||
"Bitte wählen Sie die Felder die in der Exportliste gespeichert werden sollen."
|
||||
msgstr "Bitte wählen Sie die zu exportierenden Felder..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1826,7 +1830,7 @@ msgstr "Hochladen ..."
|
|||
#: code:addons/web/static/src/xml/base.xml:1828
|
||||
#, python-format
|
||||
msgid "Name:"
|
||||
msgstr ""
|
||||
msgstr "Name:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1936,14 +1940,14 @@ msgstr "Objekt:"
|
|||
#: code:addons/web/static/src/js/chrome.js:326
|
||||
#, python-format
|
||||
msgid "Loading"
|
||||
msgstr ""
|
||||
msgstr "Laden"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:600
|
||||
#, python-format
|
||||
msgid "about a year ago"
|
||||
msgstr ""
|
||||
msgstr "letztes Jahr"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1969,7 +1973,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:595
|
||||
#, python-format
|
||||
msgid "%d hours ago"
|
||||
msgstr ""
|
||||
msgstr "vor %d Stunden"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2012,7 +2016,7 @@ msgstr "Ok"
|
|||
#: code:addons/web/static/src/js/views.js:1163
|
||||
#, python-format
|
||||
msgid "Uploading..."
|
||||
msgstr ""
|
||||
msgstr "Hochladen …"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2086,7 +2090,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1578
|
||||
#, python-format
|
||||
msgid "Save current filter"
|
||||
msgstr ""
|
||||
msgstr "Aktuellen Filter speichern"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2136,7 +2140,7 @@ msgstr "Feld Ansicht Definition"
|
|||
#: code:addons/web/static/src/xml/base.xml:149
|
||||
#, python-format
|
||||
msgid "Confirm password:"
|
||||
msgstr "Passwort wiederholen:"
|
||||
msgstr "Passwort bestätigen:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2187,7 +2191,7 @@ msgstr "ist falsch"
|
|||
#: code:addons/web/static/src/xml/base.xml:404
|
||||
#, python-format
|
||||
msgid "About OpenERP"
|
||||
msgstr ""
|
||||
msgstr "Über OpenERP"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2207,14 +2211,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:304
|
||||
#, python-format
|
||||
msgid "Database Management"
|
||||
msgstr ""
|
||||
msgstr "Datenbank Verwaltung"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4971
|
||||
#, python-format
|
||||
msgid "Image"
|
||||
msgstr ""
|
||||
msgstr "Bild"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2235,7 +2239,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/search.js:1285
|
||||
#, python-format
|
||||
msgid "not a valid integer"
|
||||
msgstr "ungültiger Trigger"
|
||||
msgstr "ungültiger Integer"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2293,7 +2297,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:620
|
||||
#, python-format
|
||||
msgid "Still loading..."
|
||||
msgstr ""
|
||||
msgstr "Noch am Laden..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2328,7 +2332,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:4846
|
||||
#, python-format
|
||||
msgid "The field is empty, there's nothing to save !"
|
||||
msgstr ""
|
||||
msgstr "Das Feld ist leer, sie können nichts speichern!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2356,7 +2360,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:928
|
||||
#, python-format
|
||||
msgid "Widget:"
|
||||
msgstr "Bedienelement:"
|
||||
msgstr "Widget:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2391,7 +2395,7 @@ msgstr "Workflow bearbeiten"
|
|||
#: code:addons/web/static/src/js/views.js:1172
|
||||
#, python-format
|
||||
msgid "Do you really want to delete this attachment ?"
|
||||
msgstr ""
|
||||
msgstr "Wollen Sie diesen Anhang wirklich löschen?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2434,7 +2438,7 @@ msgstr "Client Fehler"
|
|||
#: code:addons/web/static/src/js/views.js:996
|
||||
#, python-format
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
msgstr "Drucken"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2476,7 +2480,7 @@ msgstr "Speichern & Beenden"
|
|||
#: code:addons/web/static/src/js/view_form.js:2818
|
||||
#, python-format
|
||||
msgid "Search More..."
|
||||
msgstr ""
|
||||
msgstr "Mehr suchen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-12-04 20:16+0000\n"
|
||||
"PO-Revision-Date: 2012-12-10 20:41+0000\n"
|
||||
"Last-Translator: Santi (Pexego) <santiago@pexego.es>\n"
|
||||
"Language-Team: Spanish <es@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: 2012-12-05 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16335)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -43,7 +43,7 @@ msgstr "Todavía está cargando ... <br /> Por favor, sea paciente."
|
|||
#: code:addons/web/static/src/js/search.js:1834
|
||||
#, python-format
|
||||
msgid "%(field)s %(operator)s \"%(value)s\""
|
||||
msgstr ""
|
||||
msgstr "%(field)s %(operator)s \"%(value)s\""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -609,7 +609,7 @@ msgstr "Formatos de Exportación"
|
|||
#: code:addons/web/static/src/xml/base.xml:952
|
||||
#, python-format
|
||||
msgid "On change:"
|
||||
msgstr "On change:"
|
||||
msgstr "Al cambiar:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -676,7 +676,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:1238
|
||||
#, python-format
|
||||
msgid "Field '%s' specified in view could not be found."
|
||||
msgstr ""
|
||||
msgstr "No se encontró el campo '%s' especificado en la vista."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -863,7 +863,7 @@ msgstr "Preferencias"
|
|||
#: code:addons/web/static/src/js/view_form.js:434
|
||||
#, python-format
|
||||
msgid "Wrong on change format: %s"
|
||||
msgstr ""
|
||||
msgstr "Error en el cambio de formato: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1255,7 +1255,7 @@ msgstr "Agrupar por: %s"
|
|||
#: code:addons/web/static/src/js/view_form.js:151
|
||||
#, python-format
|
||||
msgid "No data provided."
|
||||
msgstr ""
|
||||
msgstr "No se han facilitado datos"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1298,7 +1298,7 @@ msgstr "Búsqueda incorrecta"
|
|||
#: code:addons/web/static/src/js/view_list.js:959
|
||||
#, python-format
|
||||
msgid "Could not find id in dataset"
|
||||
msgstr ""
|
||||
msgstr "No se ha podido encontrar un dataset"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1326,7 +1326,7 @@ msgstr "%(page)d/%(page_count)d"
|
|||
#: code:addons/web/static/src/js/chrome.js:397
|
||||
#, python-format
|
||||
msgid "The confirmation does not match the password"
|
||||
msgstr ""
|
||||
msgstr "La confirmación no coincide con la contraseña"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1417,7 +1417,7 @@ msgstr "es igual a"
|
|||
#: code:addons/web/static/src/js/views.js:1455
|
||||
#, python-format
|
||||
msgid "Could not serialize XML"
|
||||
msgstr ""
|
||||
msgstr "No pudo serializar el XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1661,7 +1661,7 @@ msgstr "Por favor ingrese su nueva contraseña"
|
|||
#: code:addons/web/static/src/js/views.js:1463
|
||||
#, python-format
|
||||
msgid "Could not parse string to xml"
|
||||
msgstr ""
|
||||
msgstr "No se ha podido parsear la cadena a xml"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2049,14 +2049,14 @@ msgstr "Cargar datos de demostración:"
|
|||
#: code:addons/web/static/src/js/dates.js:26
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid datetime"
|
||||
msgstr ""
|
||||
msgstr "'%s' no es un fecha y hora válido"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:1471
|
||||
#, python-format
|
||||
msgid "Could not find a DOM Parser: %s"
|
||||
msgstr ""
|
||||
msgstr "No se pudo encontrar un parser DOM: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2229,7 +2229,7 @@ msgstr "No se encontró contenido para el campo '%s' en '%s:%s'"
|
|||
#: code:addons/web/static/src/xml/base.xml:304
|
||||
#, python-format
|
||||
msgid "Database Management"
|
||||
msgstr ""
|
||||
msgstr "Administración base de datos"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2315,7 +2315,7 @@ msgstr "Agregar condición"
|
|||
#: code:addons/web/static/src/js/coresetup.js:620
|
||||
#, python-format
|
||||
msgid "Still loading..."
|
||||
msgstr ""
|
||||
msgstr "Aún cargando..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2331,6 +2331,7 @@ msgstr ""
|
|||
#, python-format
|
||||
msgid "The o2m record must be saved before an action can be used"
|
||||
msgstr ""
|
||||
"El registro O2M debe guardarse antes que una acción pueda ser utilizada"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2372,7 +2373,7 @@ msgstr "Disparador activado desde la vista de búsqueda"
|
|||
#: code:addons/web/static/src/js/search.js:980
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2414,7 +2415,7 @@ msgstr "Editar Flujo de trabajo"
|
|||
#: code:addons/web/static/src/js/views.js:1172
|
||||
#, python-format
|
||||
msgid "Do you really want to delete this attachment ?"
|
||||
msgstr ""
|
||||
msgstr "¿Realmente quiere borrar este adjunto?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2442,7 +2443,7 @@ msgstr "La base de datos %s ha sido eliminada"
|
|||
#: code:addons/web/static/src/xml/base.xml:456
|
||||
#, python-format
|
||||
msgid "User's timezone"
|
||||
msgstr ""
|
||||
msgstr "Zona horaria del usuario"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-28 01:51+0000\n"
|
||||
"PO-Revision-Date: 2012-12-07 13:23+0000\n"
|
||||
"Last-Translator: fshahy <fshahy@gmail.com>\n"
|
||||
"Language-Team: Persian <fa@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: 2012-12-01 05:20+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -36,7 +36,7 @@ msgstr "%d دقیقه پیش"
|
|||
#: code:addons/web/static/src/js/coresetup.js:621
|
||||
#, python-format
|
||||
msgid "Still loading...<br />Please be patient."
|
||||
msgstr ""
|
||||
msgstr "در حال بارگذاری...</ br> لطفا صبر کنید."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -59,7 +59,7 @@ msgstr "کوچکتر یا مساوی"
|
|||
#: code:addons/web/static/src/js/chrome.js:393
|
||||
#, python-format
|
||||
msgid "Please enter your previous password"
|
||||
msgstr ""
|
||||
msgstr "لطفا کلمه عبور قبلی خود را وارد کنید."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -68,21 +68,21 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:282
|
||||
#, python-format
|
||||
msgid "Master password:"
|
||||
msgstr ""
|
||||
msgstr "کلمه عبور اصلی:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:274
|
||||
#, python-format
|
||||
msgid "Change Master Password"
|
||||
msgstr ""
|
||||
msgstr "تغییر کلمه عبور اصلی"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:491
|
||||
#, python-format
|
||||
msgid "Do you really want to delete the database: %s ?"
|
||||
msgstr ""
|
||||
msgstr "آیا پایگاه داده حذف شود: %s ؟"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -96,14 +96,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/chrome.js:537
|
||||
#, python-format
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "امکان دسترسی وجود ندارد"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:594
|
||||
#, python-format
|
||||
msgid "about an hour ago"
|
||||
msgstr ""
|
||||
msgstr "حدود یک ساعت قبل"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -112,7 +112,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:216
|
||||
#, python-format
|
||||
msgid "Backup Database"
|
||||
msgstr ""
|
||||
msgstr "تهیه کپی پشتیبان از پایگاه داده"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -120,7 +120,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/dates.js:53
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid date"
|
||||
msgstr ""
|
||||
msgstr "'%s' یک تاریخ معتبر نیست"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -134,7 +134,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:592
|
||||
#, python-format
|
||||
msgid "about a minute ago"
|
||||
msgstr ""
|
||||
msgstr "حدود یک دقیقه قبل"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -147,14 +147,14 @@ msgstr "فایل"
|
|||
#: code:addons/web/controllers/main.py:842
|
||||
#, python-format
|
||||
msgid "You cannot leave any password empty."
|
||||
msgstr ""
|
||||
msgstr "هیچ یک از فیلد های کلمه عبور نباید خالی باشد."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:681
|
||||
#, python-format
|
||||
msgid "Invalid username or password"
|
||||
msgstr ""
|
||||
msgstr "نام کاربری یا کلمه عبور معتبر نیست"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -163,7 +163,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:260
|
||||
#, python-format
|
||||
msgid "Master Password:"
|
||||
msgstr ""
|
||||
msgstr "کلمه عبور اصلی:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -171,14 +171,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1349
|
||||
#, python-format
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
msgstr "انتخاب"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:549
|
||||
#, python-format
|
||||
msgid "Database restored successfully"
|
||||
msgstr ""
|
||||
msgstr "پایگاه داده با موفقیت بازیابی شد"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -192,7 +192,7 @@ msgstr "نسخه"
|
|||
#: code:addons/web/static/src/xml/base.xml:564
|
||||
#, python-format
|
||||
msgid "Latest Modification Date:"
|
||||
msgstr ""
|
||||
msgstr "تاریخ آخرین تغییر"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -213,7 +213,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1583
|
||||
#, python-format
|
||||
msgid "Share with all users"
|
||||
msgstr ""
|
||||
msgstr "اشتراک با همه کاربران"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -221,7 +221,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:319
|
||||
#, python-format
|
||||
msgid "Form"
|
||||
msgstr ""
|
||||
msgstr "فرم"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -270,14 +270,14 @@ msgstr "تعریف نشده"
|
|||
#: code:addons/web/static/src/js/view_form.js:4831
|
||||
#, python-format
|
||||
msgid "File Upload"
|
||||
msgstr ""
|
||||
msgstr "آپلود فایل"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:598
|
||||
#, python-format
|
||||
msgid "about a month ago"
|
||||
msgstr ""
|
||||
msgstr "حدود یک ماه قبل"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-12-04 14:14+0000\n"
|
||||
"PO-Revision-Date: 2012-12-14 14:51+0000\n"
|
||||
"Last-Translator: Numérigraphe <Unknown>\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: 2012-12-05 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16335)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-15 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -670,6 +670,8 @@ msgstr "ID Action :"
|
|||
#, python-format
|
||||
msgid "Your user's preference timezone does not match your browser timezone:"
|
||||
msgstr ""
|
||||
"Le fuseau horaire défini dans vos préférences d'utilisateur n'est pas le "
|
||||
"même que celui de votre navigateur."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -733,7 +735,7 @@ msgstr "Enregistrer sous"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "E-mail error"
|
||||
msgstr ""
|
||||
msgstr "Erreur dans le courriel"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -827,7 +829,7 @@ msgstr "Ajouter"
|
|||
#: code:addons/web/static/src/xml/base.xml:530
|
||||
#, python-format
|
||||
msgid "Toggle Form Layout Outline"
|
||||
msgstr ""
|
||||
msgstr "Activer/désactiver la mise en valeur de la structure."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -938,7 +940,7 @@ msgstr "Le mot de passe a été modifié avec succès"
|
|||
#: code:addons/web/static/src/js/view_list_editable.js:781
|
||||
#, python-format
|
||||
msgid "The form's data can not be discarded"
|
||||
msgstr ""
|
||||
msgstr "Les données du formulaire ne peuvent pas être annulées"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1366,7 +1368,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:393
|
||||
#, python-format
|
||||
msgid "99+"
|
||||
msgstr ""
|
||||
msgstr "99+"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1401,7 +1403,7 @@ msgstr "Déclencheur de valeur par défaut :"
|
|||
#: code:addons/web/static/src/xml/base.xml:171
|
||||
#, python-format
|
||||
msgid "Original database name:"
|
||||
msgstr ""
|
||||
msgstr "Nom de la base de données originale :"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1512,7 +1514,7 @@ msgstr "Fichier CSV :"
|
|||
#: code:addons/web/static/src/js/search.js:1743
|
||||
#, python-format
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
msgstr "Avancé"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2049,7 +2051,7 @@ msgstr "Charger les données de démonstration:"
|
|||
#: code:addons/web/static/src/js/dates.js:26
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid datetime"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" n'est pas un horodatage valide"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2143,7 +2145,7 @@ msgstr "Nouveau"
|
|||
#: code:addons/web/static/src/js/view_list.js:1746
|
||||
#, python-format
|
||||
msgid "Can't convert value %s to context"
|
||||
msgstr ""
|
||||
msgstr "Impossible de convertir la valeur %s en un contexte"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2216,7 +2218,7 @@ msgstr "À propos d'OpenERP"
|
|||
#: code:addons/web/static/src/js/formats.js:297
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct date, datetime nor time"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" n'est ni une date, ni un horodatage ni une heure correcte"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:1306
|
||||
|
@ -2284,6 +2286,7 @@ msgstr "Non"
|
|||
#, python-format
|
||||
msgid "'%s' is not convertible to date, datetime nor time"
|
||||
msgstr ""
|
||||
"\"%s\" n'est pas convertible en une date, ni un horodatage ni une heure"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2315,7 +2318,7 @@ msgstr "Ajouter une condition"
|
|||
#: code:addons/web/static/src/js/coresetup.js:620
|
||||
#, python-format
|
||||
msgid "Still loading..."
|
||||
msgstr ""
|
||||
msgstr "Chargement en cours…"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2415,7 +2418,7 @@ msgstr "Modifier le workflow"
|
|||
#: code:addons/web/static/src/js/views.js:1172
|
||||
#, python-format
|
||||
msgid "Do you really want to delete this attachment ?"
|
||||
msgstr ""
|
||||
msgstr "Voulez-vous réellement supprimer cette pièce jointe ?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2540,7 +2543,7 @@ msgstr "Choisir une date"
|
|||
#: code:addons/web/static/src/js/search.js:1251
|
||||
#, python-format
|
||||
msgid "Search %(field)s for: %(value)s"
|
||||
msgstr ""
|
||||
msgstr "Rechercher %(value)s dans %(field)s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-24 19:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-09 18:47+0000\n"
|
||||
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
|
||||
"Language-Team: Croatian <hr@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -59,7 +59,7 @@ msgstr "manje ili jednako od"
|
|||
#: code:addons/web/static/src/js/chrome.js:393
|
||||
#, python-format
|
||||
msgid "Please enter your previous password"
|
||||
msgstr ""
|
||||
msgstr "Upišite trenutno važeću lozinku"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -68,7 +68,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:282
|
||||
#, python-format
|
||||
msgid "Master password:"
|
||||
msgstr "Glavna zaporka"
|
||||
msgstr "Glavna lozinka"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -82,7 +82,7 @@ msgstr "Promijeni glavnu lozinku"
|
|||
#: code:addons/web/static/src/js/chrome.js:491
|
||||
#, python-format
|
||||
msgid "Do you really want to delete the database: %s ?"
|
||||
msgstr ""
|
||||
msgstr "Zaista želite obrisati bazu podataka: %s ?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -96,7 +96,7 @@ msgstr "Traži %(field)s at: %(value)s"
|
|||
#: code:addons/web/static/src/js/chrome.js:537
|
||||
#, python-format
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "Pristup odbijen / zabranjen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -120,7 +120,7 @@ msgstr "Backup baze podataka"
|
|||
#: code:addons/web/static/src/js/dates.js:53
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid date"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravan datum"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -147,14 +147,14 @@ msgstr "Datoteka"
|
|||
#: code:addons/web/controllers/main.py:842
|
||||
#, python-format
|
||||
msgid "You cannot leave any password empty."
|
||||
msgstr ""
|
||||
msgstr "Popunite sva polja."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:681
|
||||
#, python-format
|
||||
msgid "Invalid username or password"
|
||||
msgstr "Neispravno korisničko ime ili zaporka."
|
||||
msgstr "Neispravno korisničko ime ili lozinka."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -163,7 +163,7 @@ msgstr "Neispravno korisničko ime ili zaporka."
|
|||
#: code:addons/web/static/src/xml/base.xml:260
|
||||
#, python-format
|
||||
msgid "Master Password:"
|
||||
msgstr "Glavna zaporka"
|
||||
msgstr "Glavna lozinka"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -207,7 +207,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:1242
|
||||
#, python-format
|
||||
msgid "Widget type '%s' is not implemented"
|
||||
msgstr ""
|
||||
msgstr "Widget tipa '%s' nije implementiran"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -236,7 +236,7 @@ msgstr "(prazno)"
|
|||
#: code:addons/web/static/src/js/formats.js:282
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct time"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravno vrijeme"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -250,7 +250,7 @@ msgstr "nije ispravan broj"
|
|||
#: code:addons/web/static/src/xml/base.xml:325
|
||||
#, python-format
|
||||
msgid "New Password:"
|
||||
msgstr "Nova zaporka:"
|
||||
msgstr "Nova lozinka:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -271,7 +271,7 @@ msgstr "Nedefiniran"
|
|||
#: code:addons/web/static/src/js/view_form.js:4831
|
||||
#, python-format
|
||||
msgid "File Upload"
|
||||
msgstr ""
|
||||
msgstr "Slanje datoteke"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -328,14 +328,14 @@ msgstr "Dupliciraj bazu podataka"
|
|||
#: code:addons/web/static/src/xml/base.xml:336
|
||||
#, python-format
|
||||
msgid "Change Password"
|
||||
msgstr "Promijeni zaporku"
|
||||
msgstr "Promijeni lozinku"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:3382
|
||||
#, python-format
|
||||
msgid "View type '%s' is not supported in One2Many."
|
||||
msgstr ""
|
||||
msgstr "Pogled tipa '%s' nije podržan za JedanNaViše (One2Many) polja."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -350,7 +350,7 @@ msgstr "Preuzimanje"
|
|||
#: code:addons/web/static/src/js/formats.js:266
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct datetime"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravno vrijeme"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -378,13 +378,13 @@ msgstr "Odabir:"
|
|||
#: code:addons/web/static/src/js/view_form.js:869
|
||||
#, python-format
|
||||
msgid "The following fields are invalid:"
|
||||
msgstr ""
|
||||
msgstr "Popis neispravnih polja:"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:863
|
||||
#, python-format
|
||||
msgid "Languages"
|
||||
msgstr ""
|
||||
msgstr "Jezici"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -405,7 +405,7 @@ msgstr "Uvoz"
|
|||
#: code:addons/web/static/src/js/chrome.js:543
|
||||
#, python-format
|
||||
msgid "Could not restore the database"
|
||||
msgstr ""
|
||||
msgstr "Oporavak baze podataka nije uspješno dovršen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -518,7 +518,7 @@ msgstr "Operator %s nije podržan unutar domene %s"
|
|||
#: code:addons/web/static/src/js/formats.js:242
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct float"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravna decimalna vrijednost"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -532,7 +532,7 @@ msgstr "Oporavljeno"
|
|||
#: code:addons/web/static/src/js/view_list.js:392
|
||||
#, python-format
|
||||
msgid "%d-%d of %d"
|
||||
msgstr ""
|
||||
msgstr "%d-%d od %d"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -546,14 +546,14 @@ msgstr "Kreiraj i uredi"
|
|||
#: code:addons/web/static/src/js/pyeval.js:731
|
||||
#, python-format
|
||||
msgid "Unknown nonliteral type "
|
||||
msgstr ""
|
||||
msgstr "Nepoznat tip podatka "
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:2345
|
||||
#, python-format
|
||||
msgid "Resource error"
|
||||
msgstr ""
|
||||
msgstr "Greška resursa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -574,7 +574,7 @@ msgstr "Ispiši tijek rada"
|
|||
#: code:addons/web/static/src/js/chrome.js:396
|
||||
#, python-format
|
||||
msgid "Please confirm your new password"
|
||||
msgstr ""
|
||||
msgstr "Potvrdite Vašu novu zaporku"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -623,7 +623,7 @@ msgstr "Polja %s modela"
|
|||
#: code:addons/web/static/src/js/view_list.js:890
|
||||
#, python-format
|
||||
msgid "Setting 'id' attribute on existing record %s"
|
||||
msgstr ""
|
||||
msgstr "Postavljanje 'id' atributa na postojećem zapisu %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -668,13 +668,15 @@ msgstr "Action ID:"
|
|||
#, python-format
|
||||
msgid "Your user's preference timezone does not match your browser timezone:"
|
||||
msgstr ""
|
||||
"Pojasno vrijeme u Vašim korisničkim podacima ne odgovara pojasnom vremenu "
|
||||
"zadanom u Vašem Internet pretraživaču"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:1238
|
||||
#, python-format
|
||||
msgid "Field '%s' specified in view could not be found."
|
||||
msgstr ""
|
||||
msgstr "Ne postoji polje '%s', a navedeno je u definiciji pogleda."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -688,7 +690,7 @@ msgstr "Snimljeni izvozi"
|
|||
#: code:addons/web/static/src/xml/base.xml:320
|
||||
#, python-format
|
||||
msgid "Old Password:"
|
||||
msgstr "Stara zaporka:"
|
||||
msgstr "Stara lozinka:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -702,7 +704,7 @@ msgstr "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
|
|||
#: code:addons/web/static/src/js/chrome.js:481
|
||||
#, python-format
|
||||
msgid "The database has been duplicated."
|
||||
msgstr ""
|
||||
msgstr "Baza podataka je duplicirana."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -731,7 +733,7 @@ msgstr "Spremi kao"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "E-mail error"
|
||||
msgstr ""
|
||||
msgstr "E-mail greška"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -793,7 +795,7 @@ msgstr "Graničnik:"
|
|||
#: code:addons/web/static/src/xml/base.xml:458
|
||||
#, python-format
|
||||
msgid "Browser's timezone"
|
||||
msgstr ""
|
||||
msgstr "Pojasno vrijeme internet preglednika"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -838,7 +840,7 @@ msgstr "OpenERP.com"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "Can't send email to invalid e-mail address"
|
||||
msgstr ""
|
||||
msgstr "Nije moguće poslati email na neispravne e-mail adrese"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -859,7 +861,7 @@ msgstr "Postavke"
|
|||
#: code:addons/web/static/src/js/view_form.js:434
|
||||
#, python-format
|
||||
msgid "Wrong on change format: %s"
|
||||
msgstr ""
|
||||
msgstr "Greška u promjeni formata: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -874,7 +876,7 @@ msgstr "Obriši bazu podataka"
|
|||
#: code:addons/web/static/src/xml/base.xml:462
|
||||
#, python-format
|
||||
msgid "Click here to change your user's timezone."
|
||||
msgstr ""
|
||||
msgstr "Kliknite ovdje za promjenu korisničkog pojasnog vremena"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -920,21 +922,21 @@ msgstr "Korisničko ime"
|
|||
#: code:addons/web/static/src/js/chrome.js:481
|
||||
#, python-format
|
||||
msgid "Duplicating database"
|
||||
msgstr ""
|
||||
msgstr "Dupliciram bazu podataka"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:563
|
||||
#, python-format
|
||||
msgid "Password has been changed successfully"
|
||||
msgstr ""
|
||||
msgstr "Lozinka uspješno promjenjena"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list_editable.js:781
|
||||
#, python-format
|
||||
msgid "The form's data can not be discarded"
|
||||
msgstr ""
|
||||
msgstr "Podaci (form's data) se ne mogu odbaciti"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -969,6 +971,10 @@ msgid ""
|
|||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Greška lokalne evaluacije\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1003,7 +1009,7 @@ msgstr "Kreirano:"
|
|||
#: code:addons/web/controllers/main.py:851
|
||||
#, python-format
|
||||
msgid "Error, password not changed !"
|
||||
msgstr ""
|
||||
msgstr "Greška, lozika nije promjenjena!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1025,7 +1031,7 @@ msgstr "/web/binary/upload_attachment"
|
|||
#: code:addons/web/static/src/js/chrome.js:563
|
||||
#, python-format
|
||||
msgid "Changed Password"
|
||||
msgstr ""
|
||||
msgstr "Promjenjena lozinka"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1059,14 +1065,14 @@ msgstr "Arhiviranje/Backup"
|
|||
#: code:addons/web/static/src/js/dates.js:80
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid time"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravno vrijeme"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:274
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct date"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravan datum"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1120,7 +1126,7 @@ msgstr "Zadnju promjenu napravio:"
|
|||
#: code:addons/web/static/src/xml/base.xml:466
|
||||
#, python-format
|
||||
msgid "Timezone mismatch"
|
||||
msgstr ""
|
||||
msgstr "Neslaganje vremenskih pojasa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1189,7 +1195,7 @@ msgstr "Dodaj napredni filter"
|
|||
#: code:addons/web/controllers/main.py:844
|
||||
#, python-format
|
||||
msgid "The new password and its confirmation must be identical."
|
||||
msgstr ""
|
||||
msgstr "Nova lozinka i potvrda lozinke moraju biti identične."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1204,7 +1210,7 @@ msgstr "Povrati bazu podataka"
|
|||
#: code:addons/web/static/src/js/chrome.js:645
|
||||
#, python-format
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Prijava"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1247,7 +1253,7 @@ msgstr "Grupiraj po: %s"
|
|||
#: code:addons/web/static/src/js/view_form.js:151
|
||||
#, python-format
|
||||
msgid "No data provided."
|
||||
msgstr ""
|
||||
msgstr "Nema podataka."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1290,7 +1296,7 @@ msgstr "Neispravna pretraga"
|
|||
#: code:addons/web/static/src/js/view_list.js:959
|
||||
#, python-format
|
||||
msgid "Could not find id in dataset"
|
||||
msgstr ""
|
||||
msgstr "Id nije pronađen u podacima"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1318,7 +1324,7 @@ msgstr "%(page)d/%(page_count)d"
|
|||
#: code:addons/web/static/src/js/chrome.js:397
|
||||
#, python-format
|
||||
msgid "The confirmation does not match the password"
|
||||
msgstr ""
|
||||
msgstr "Nova lozinka i potvrda su različite"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1357,7 +1363,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:393
|
||||
#, python-format
|
||||
msgid "99+"
|
||||
msgstr ""
|
||||
msgstr "99+"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1371,7 +1377,7 @@ msgstr "1. Uvezi .CSV datoteku"
|
|||
#: code:addons/web/static/src/js/chrome.js:645
|
||||
#, python-format
|
||||
msgid "No database selected !"
|
||||
msgstr ""
|
||||
msgstr "Nije odabrana baza podataka"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1409,7 +1415,7 @@ msgstr "je jednako"
|
|||
#: code:addons/web/static/src/js/views.js:1455
|
||||
#, python-format
|
||||
msgid "Could not serialize XML"
|
||||
msgstr ""
|
||||
msgstr "Could not serialize XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1513,14 +1519,14 @@ msgstr "Stablo"
|
|||
#: code:addons/web/controllers/main.py:766
|
||||
#, python-format
|
||||
msgid "Could not drop database !"
|
||||
msgstr ""
|
||||
msgstr "Brisanje baze podataka nije uspjelo!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:227
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct integer"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravna cjelobrojna vrijednost"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1541,7 +1547,7 @@ msgstr "Nepoznato polje %s unutar domene %s"
|
|||
#: code:addons/web/static/src/js/views.js:1421
|
||||
#, python-format
|
||||
msgid "Node [%s] is not a JSONified XML node"
|
||||
msgstr ""
|
||||
msgstr "Node [%s] nije JSONified XML node"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1555,7 +1561,7 @@ msgstr "Napredno pretraživanje"
|
|||
#: code:addons/web/static/src/js/chrome.js:499
|
||||
#, python-format
|
||||
msgid "Dropping database"
|
||||
msgstr ""
|
||||
msgstr "Brisanje baze podataka"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1578,7 +1584,7 @@ msgstr "Da"
|
|||
#: code:addons/web/static/src/js/view_form.js:4831
|
||||
#, python-format
|
||||
msgid "There was a problem while uploading your file"
|
||||
msgstr ""
|
||||
msgstr "Pojavio se problem kod učitavanja vaše datoteke"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1620,7 +1626,7 @@ msgstr "%d godina prije"
|
|||
#: code:addons/web/static/src/js/view_list.js:1019
|
||||
#, python-format
|
||||
msgid "Unknown m2m command %s"
|
||||
msgstr ""
|
||||
msgstr "Napoznata m2m naredba %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1643,14 +1649,14 @@ msgstr "Naziv nove baze podataka:"
|
|||
#: code:addons/web/static/src/js/chrome.js:394
|
||||
#, python-format
|
||||
msgid "Please enter your new password"
|
||||
msgstr ""
|
||||
msgstr "Molim, unesite novu lozinku"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:1463
|
||||
#, python-format
|
||||
msgid "Could not parse string to xml"
|
||||
msgstr ""
|
||||
msgstr "Could not parse string to xml"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1699,7 +1705,7 @@ msgstr "Copyright © 2004-TODAY OpenERP SA. Sva prava pridržana."
|
|||
#: code:addons/web/static/src/js/view_form.js:2345
|
||||
#, python-format
|
||||
msgid "This resource is empty"
|
||||
msgstr ""
|
||||
msgstr "Ovaj resurs je prazan"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1757,7 +1763,7 @@ msgstr "Polja pogleda"
|
|||
#: code:addons/web/static/src/xml/base.xml:330
|
||||
#, python-format
|
||||
msgid "Confirm New Password:"
|
||||
msgstr ""
|
||||
msgstr "Potvrda nove zaporke:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1908,7 +1914,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:319
|
||||
#, python-format
|
||||
msgid "The record could not be found in the database."
|
||||
msgstr ""
|
||||
msgstr "Zapis nije pronađen u bazi podataka."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1929,7 +1935,7 @@ msgstr "Tip:"
|
|||
#: code:addons/web/static/src/js/chrome.js:538
|
||||
#, python-format
|
||||
msgid "Incorrect super-administrator password"
|
||||
msgstr ""
|
||||
msgstr "Neispravna lozinka super-administratora"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1971,6 +1977,8 @@ msgid ""
|
|||
"The type of the field '%s' must be a many2many field with a relation to "
|
||||
"'ir.attachment' model."
|
||||
msgstr ""
|
||||
"Tip polja '%s' mora biti VišeNaViše (many2many) polje u relaciji sa "
|
||||
"'ir.attachment' (privici) modelom."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2035,14 +2043,14 @@ msgstr "Učitaj demonstracijske podatke:"
|
|||
#: code:addons/web/static/src/js/dates.js:26
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid datetime"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravno vrijeme"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:1471
|
||||
#, python-format
|
||||
msgid "Could not find a DOM Parser: %s"
|
||||
msgstr ""
|
||||
msgstr "Could not find a DOM Parser: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2122,14 +2130,14 @@ msgstr "Preuzimanje \"%s\""
|
|||
#: code:addons/web/static/src/js/view_form.js:324
|
||||
#, python-format
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Nova(i)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list.js:1746
|
||||
#, python-format
|
||||
msgid "Can't convert value %s to context"
|
||||
msgstr ""
|
||||
msgstr "Vrijednost %s ne odgovara za context"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2202,13 +2210,13 @@ msgstr "O OpenERP-u"
|
|||
#: code:addons/web/static/src/js/formats.js:297
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct date, datetime nor time"
|
||||
msgstr ""
|
||||
msgstr "'%s' nije ispravno vrijeme ili datum"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:1306
|
||||
#, python-format
|
||||
msgid "No content found for field '%s' on '%s:%s'"
|
||||
msgstr ""
|
||||
msgstr "Nedostaje kontekst za polje '%s' na '%s:%s'"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2236,7 +2244,7 @@ msgstr "Upravljanje bazama podataka"
|
|||
#: code:addons/web/static/src/js/pyeval.js:765
|
||||
#, python-format
|
||||
msgid "Evaluation Error"
|
||||
msgstr ""
|
||||
msgstr "Greška evaluacije"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2269,7 +2277,7 @@ msgstr "Ne"
|
|||
#: code:addons/web/static/src/js/formats.js:309
|
||||
#, python-format
|
||||
msgid "'%s' is not convertible to date, datetime nor time"
|
||||
msgstr ""
|
||||
msgstr "Interpretacija '%s' ne reultira datumom ili vremenom"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2344,7 +2352,7 @@ msgstr "Polje je prazno. Ništa za snimanje !"
|
|||
#: code:addons/web/static/src/js/view_list.js:1327
|
||||
#, python-format
|
||||
msgid "%s (%d)"
|
||||
msgstr ""
|
||||
msgstr "%s (%d)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2407,7 +2415,7 @@ msgstr "Obrisati privitak?"
|
|||
#: code:addons/web/static/src/js/views.js:838
|
||||
#, python-format
|
||||
msgid "Technical Translation"
|
||||
msgstr ""
|
||||
msgstr "tehnički prijevod"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2421,14 +2429,14 @@ msgstr "Polje:"
|
|||
#: code:addons/web/static/src/js/chrome.js:499
|
||||
#, python-format
|
||||
msgid "The database %s has been dropped"
|
||||
msgstr ""
|
||||
msgstr "Baza podataka %s je obrisana"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:456
|
||||
#, python-format
|
||||
msgid "User's timezone"
|
||||
msgstr ""
|
||||
msgstr "Korisnikov vremenski pojas"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2457,7 +2465,7 @@ msgstr "Posebno:"
|
|||
#, python-format
|
||||
msgid ""
|
||||
"The old password you provided is incorrect, your password was not changed."
|
||||
msgstr ""
|
||||
msgstr "Trenutna lozinka nije točno upisana. Lozinka nije promijenjena."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-30 22:53+0000\n"
|
||||
"Last-Translator: Sergio Corato <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-13 19:55+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: 2012-12-01 05:20+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-14 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16369)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -236,7 +236,7 @@ msgstr "(no string)"
|
|||
#: code:addons/web/static/src/js/formats.js:282
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct time"
|
||||
msgstr ""
|
||||
msgstr "'%s' non è un orario corretto"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -553,7 +553,7 @@ msgstr "Tipo non letterale sconosciuto "
|
|||
#: code:addons/web/static/src/js/view_form.js:2345
|
||||
#, python-format
|
||||
msgid "Resource error"
|
||||
msgstr ""
|
||||
msgstr "Errore risorsa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -595,7 +595,7 @@ msgstr "Per maggiori informazioni visita"
|
|||
#: code:addons/web/static/src/xml/base.xml:1834
|
||||
#, python-format
|
||||
msgid "Add All Info..."
|
||||
msgstr ""
|
||||
msgstr "Aggiungi tutte le informazioni ..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -623,7 +623,7 @@ msgstr "Campi modello %s"
|
|||
#: code:addons/web/static/src/js/view_list.js:890
|
||||
#, python-format
|
||||
msgid "Setting 'id' attribute on existing record %s"
|
||||
msgstr ""
|
||||
msgstr "Imposta l'attributo 'id' su record esistente %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -668,13 +668,14 @@ msgstr "Action ID:"
|
|||
#, python-format
|
||||
msgid "Your user's preference timezone does not match your browser timezone:"
|
||||
msgstr ""
|
||||
"Il vostro timezone nelle preferenze non coincide al timezone del browser"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:1238
|
||||
#, python-format
|
||||
msgid "Field '%s' specified in view could not be found."
|
||||
msgstr ""
|
||||
msgstr "Il campo '%s' specificato nella vista non può essere trovato."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -695,21 +696,21 @@ msgstr "Vecchia Password:"
|
|||
#: code:addons/web/static/src/js/formats.js:113
|
||||
#, python-format
|
||||
msgid "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
|
||||
msgstr ""
|
||||
msgstr "Bytes, Kb, Mb, Gb, Tb, Pb, Eb, Zb, Yb"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:481
|
||||
#, python-format
|
||||
msgid "The database has been duplicated."
|
||||
msgstr ""
|
||||
msgstr "Il database è stato duplicato."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1600
|
||||
#, python-format
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
msgstr "Applica"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -731,7 +732,7 @@ msgstr "Salva come"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "E-mail error"
|
||||
msgstr ""
|
||||
msgstr "Errore e-mail"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -763,6 +764,10 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure you want to leave this page ?"
|
||||
msgstr ""
|
||||
"Attenzione, il record è stato modificato, i vostri cambiamenti saranno "
|
||||
"scartati se non salvati.\n"
|
||||
"\n"
|
||||
"Confermare l'abbandono della pagina"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -790,14 +795,14 @@ msgstr "Delimitatore:"
|
|||
#: code:addons/web/static/src/xml/base.xml:458
|
||||
#, python-format
|
||||
msgid "Browser's timezone"
|
||||
msgstr ""
|
||||
msgstr "Timezone del browser"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1580
|
||||
#, python-format
|
||||
msgid "Filter name"
|
||||
msgstr ""
|
||||
msgstr "Nome del filtro"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -821,7 +826,7 @@ msgstr "Aggiungi"
|
|||
#: code:addons/web/static/src/xml/base.xml:530
|
||||
#, python-format
|
||||
msgid "Toggle Form Layout Outline"
|
||||
msgstr ""
|
||||
msgstr "Passa al layout struttura del form"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -835,14 +840,14 @@ msgstr "OpenERP.com"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "Can't send email to invalid e-mail address"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile inviare mail ad indirizzi non corretti"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:614
|
||||
#, python-format
|
||||
msgid "Add..."
|
||||
msgstr ""
|
||||
msgstr "Aggiungi..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -856,7 +861,7 @@ msgstr "Preferenze"
|
|||
#: code:addons/web/static/src/js/view_form.js:434
|
||||
#, python-format
|
||||
msgid "Wrong on change format: %s"
|
||||
msgstr ""
|
||||
msgstr "Errato formato \"on change\": %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -864,14 +869,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:185
|
||||
#, python-format
|
||||
msgid "Drop Database"
|
||||
msgstr ""
|
||||
msgstr "Elimina database"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:462
|
||||
#, python-format
|
||||
msgid "Click here to change your user's timezone."
|
||||
msgstr ""
|
||||
msgstr "Cliccare qui per cambiare il timezone personale utente"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -885,7 +890,7 @@ msgstr "Modificatori:"
|
|||
#: code:addons/web/static/src/xml/base.xml:605
|
||||
#, python-format
|
||||
msgid "Delete this attachment"
|
||||
msgstr ""
|
||||
msgstr "Elimina questo allegato"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -903,7 +908,7 @@ msgstr "Salva"
|
|||
#: code:addons/web/static/src/xml/base.xml:355
|
||||
#, python-format
|
||||
msgid "More"
|
||||
msgstr ""
|
||||
msgstr "Altro"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -917,21 +922,21 @@ msgstr "Utente"
|
|||
#: code:addons/web/static/src/js/chrome.js:481
|
||||
#, python-format
|
||||
msgid "Duplicating database"
|
||||
msgstr ""
|
||||
msgstr "Duplicazione database"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:563
|
||||
#, python-format
|
||||
msgid "Password has been changed successfully"
|
||||
msgstr ""
|
||||
msgstr "Password cambiata con successo"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list_editable.js:781
|
||||
#, python-format
|
||||
msgid "The form's data can not be discarded"
|
||||
msgstr ""
|
||||
msgstr "I dati del form non possono essere scartati"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -966,6 +971,10 @@ msgid ""
|
|||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Fallita valutazione locale\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1000,14 +1009,14 @@ msgstr "Data Creazione:"
|
|||
#: code:addons/web/controllers/main.py:851
|
||||
#, python-format
|
||||
msgid "Error, password not changed !"
|
||||
msgstr ""
|
||||
msgstr "Errore, la password non è stata cambiata!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4810
|
||||
#, python-format
|
||||
msgid "The selected file exceed the maximum file size of %s."
|
||||
msgstr ""
|
||||
msgstr "Il file selezionato eccede la massima dimensione possibile di %s."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1015,14 +1024,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1275
|
||||
#, python-format
|
||||
msgid "/web/binary/upload_attachment"
|
||||
msgstr ""
|
||||
msgstr "/web/binary/upload_attachment"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:563
|
||||
#, python-format
|
||||
msgid "Changed Password"
|
||||
msgstr ""
|
||||
msgstr "Password modificata"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1056,14 +1065,14 @@ msgstr "Backup"
|
|||
#: code:addons/web/static/src/js/dates.js:80
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid time"
|
||||
msgstr ""
|
||||
msgstr "'%s' non è un orario valido"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:274
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct date"
|
||||
msgstr ""
|
||||
msgstr "'%s' non è una data corretta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1117,7 +1126,7 @@ msgstr "Ultima Modifica fatta da:"
|
|||
#: code:addons/web/static/src/xml/base.xml:466
|
||||
#, python-format
|
||||
msgid "Timezone mismatch"
|
||||
msgstr ""
|
||||
msgstr "Discordanza timezone"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1131,7 +1140,7 @@ msgstr "Operatore %s sconosciuto nel dominio %s"
|
|||
#: code:addons/web/static/src/js/view_form.js:426
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1185,7 +1194,7 @@ msgstr "Aggiungi Filtro Avanzato"
|
|||
#: code:addons/web/controllers/main.py:844
|
||||
#, python-format
|
||||
msgid "The new password and its confirmation must be identical."
|
||||
msgstr ""
|
||||
msgstr "La nuova password e la sua conferma devono essere identiche."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1200,7 +1209,7 @@ msgstr "Ripristina Database"
|
|||
#: code:addons/web/static/src/js/chrome.js:645
|
||||
#, python-format
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Login"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1229,21 +1238,21 @@ msgstr "Tipo di esportazione:"
|
|||
#: code:addons/web/static/src/xml/base.xml:406
|
||||
#, python-format
|
||||
msgid "Log out"
|
||||
msgstr ""
|
||||
msgstr "Log out"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/search.js:1092
|
||||
#, python-format
|
||||
msgid "Group by: %s"
|
||||
msgstr ""
|
||||
msgstr "Raggruppa per: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:151
|
||||
#, python-format
|
||||
msgid "No data provided."
|
||||
msgstr ""
|
||||
msgstr "Nessun dato fornito."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1272,7 +1281,7 @@ msgstr "E' necessario selezionare almeno un record."
|
|||
#: code:addons/web/static/src/js/coresetup.js:622
|
||||
#, python-format
|
||||
msgid "Don't leave yet,<br />it's still loading..."
|
||||
msgstr ""
|
||||
msgstr "Non abbandonare ora, <br />caricamento in corso..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1286,7 +1295,7 @@ msgstr "Ricerca Non Valida"
|
|||
#: code:addons/web/static/src/js/view_list.js:959
|
||||
#, python-format
|
||||
msgid "Could not find id in dataset"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile trovare l'id nel set di dati"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1314,7 +1323,7 @@ msgstr "%(page)d/%(page_count)d"
|
|||
#: code:addons/web/static/src/js/chrome.js:397
|
||||
#, python-format
|
||||
msgid "The confirmation does not match the password"
|
||||
msgstr ""
|
||||
msgstr "La conferma password non combacia con la password"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1353,7 +1362,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:393
|
||||
#, python-format
|
||||
msgid "99+"
|
||||
msgstr ""
|
||||
msgstr "99+"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1367,7 +1376,7 @@ msgstr "1. Importa un file .CSV"
|
|||
#: code:addons/web/static/src/js/chrome.js:645
|
||||
#, python-format
|
||||
msgid "No database selected !"
|
||||
msgstr ""
|
||||
msgstr "Nessun database selezionato!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1388,7 +1397,7 @@ msgstr "Cambia default:"
|
|||
#: code:addons/web/static/src/xml/base.xml:171
|
||||
#, python-format
|
||||
msgid "Original database name:"
|
||||
msgstr ""
|
||||
msgstr "Nome originale database:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1405,14 +1414,14 @@ msgstr "è uguale a"
|
|||
#: code:addons/web/static/src/js/views.js:1455
|
||||
#, python-format
|
||||
msgid "Could not serialize XML"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile serializzare l'XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1594
|
||||
#, python-format
|
||||
msgid "Advanced Search"
|
||||
msgstr ""
|
||||
msgstr "Ricerca avanzata"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1427,6 +1436,8 @@ msgstr "Conferma nuova password principale"
|
|||
#, python-format
|
||||
msgid "Maybe you should consider reloading the application by pressing F5..."
|
||||
msgstr ""
|
||||
"Probabilmente dovreste effettuare un reload dell'applicazione premendo il "
|
||||
"tasto F5..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1458,7 +1469,7 @@ msgstr "Opzioni di importazione"
|
|||
#: code:addons/web/static/src/js/view_form.js:2909
|
||||
#, python-format
|
||||
msgid "Add %s"
|
||||
msgstr ""
|
||||
msgstr "Aggiungi %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1482,7 +1493,7 @@ msgstr "Chiudi"
|
|||
#, python-format
|
||||
msgid ""
|
||||
"You may not believe it,<br />but the application is actually loading..."
|
||||
msgstr ""
|
||||
msgstr "Potrete non crederci,<br />ma l'applicazione è già caricata..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1496,7 +1507,7 @@ msgstr "File CSV:"
|
|||
#: code:addons/web/static/src/js/search.js:1743
|
||||
#, python-format
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
msgstr "Avanzate"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1509,14 +1520,14 @@ msgstr "Albero"
|
|||
#: code:addons/web/controllers/main.py:766
|
||||
#, python-format
|
||||
msgid "Could not drop database !"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile eliminare il database!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:227
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct integer"
|
||||
msgstr ""
|
||||
msgstr "'%s' non è un intero corretto"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1537,21 +1548,21 @@ msgstr "Campo %s sconosciuto nel dominio %s"
|
|||
#: code:addons/web/static/src/js/views.js:1421
|
||||
#, python-format
|
||||
msgid "Node [%s] is not a JSONified XML node"
|
||||
msgstr ""
|
||||
msgstr "Il node [%s] non è un nodo JSONified XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1403
|
||||
#, python-format
|
||||
msgid "Advanced Search..."
|
||||
msgstr ""
|
||||
msgstr "Ricerca avanzata..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:499
|
||||
#, python-format
|
||||
msgid "Dropping database"
|
||||
msgstr ""
|
||||
msgstr "Eliminazione database"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1574,7 +1585,7 @@ msgstr "Sì"
|
|||
#: code:addons/web/static/src/js/view_form.js:4831
|
||||
#, python-format
|
||||
msgid "There was a problem while uploading your file"
|
||||
msgstr ""
|
||||
msgstr "C'è stato un problema durante l'upload del vostro file"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1595,28 +1606,28 @@ msgstr "Dimensione:"
|
|||
#: code:addons/web/static/src/xml/base.xml:1799
|
||||
#, python-format
|
||||
msgid "--- Don't Import ---"
|
||||
msgstr ""
|
||||
msgstr "--- Non importare ---"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1654
|
||||
#, python-format
|
||||
msgid "Import-Compatible Export"
|
||||
msgstr ""
|
||||
msgstr "Esportazione compatile alla successiva importazione"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:601
|
||||
#, python-format
|
||||
msgid "%d years ago"
|
||||
msgstr ""
|
||||
msgstr "%d anni fa'"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list.js:1019
|
||||
#, python-format
|
||||
msgid "Unknown m2m command %s"
|
||||
msgstr ""
|
||||
msgstr "Comando m2m sconosciuto %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1639,14 +1650,14 @@ msgstr "Nome nuovo database:"
|
|||
#: code:addons/web/static/src/js/chrome.js:394
|
||||
#, python-format
|
||||
msgid "Please enter your new password"
|
||||
msgstr ""
|
||||
msgstr "Prego Inserire la tua nuova password"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:1463
|
||||
#, python-format
|
||||
msgid "Could not parse string to xml"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile interpretare la stringa XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1674,7 +1685,7 @@ msgstr "Linee da saltare"
|
|||
#: code:addons/web/static/src/js/view_form.js:2831
|
||||
#, python-format
|
||||
msgid "Create \"<strong>%s</strong>\""
|
||||
msgstr ""
|
||||
msgstr "Creato \"<strong>%s</strong>\""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1695,7 +1706,7 @@ msgstr "Copyright © 2004-TODAY OpenERP SA. All Rights Reserved."
|
|||
#: code:addons/web/static/src/js/view_form.js:2345
|
||||
#, python-format
|
||||
msgid "This resource is empty"
|
||||
msgstr ""
|
||||
msgstr "Questa risorsa è vuota"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1717,7 +1728,7 @@ msgstr "L'importazione è fallita a causa di:"
|
|||
#: code:addons/web/static/src/xml/base.xml:533
|
||||
#, python-format
|
||||
msgid "JS Tests"
|
||||
msgstr ""
|
||||
msgstr "JS test"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1731,7 +1742,7 @@ msgstr "Salva come:"
|
|||
#: code:addons/web/static/src/js/search.js:929
|
||||
#, python-format
|
||||
msgid "Filter on: %s"
|
||||
msgstr ""
|
||||
msgstr "Filtro su: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1753,7 +1764,7 @@ msgstr "Campi Vista"
|
|||
#: code:addons/web/static/src/xml/base.xml:330
|
||||
#, python-format
|
||||
msgid "Confirm New Password:"
|
||||
msgstr ""
|
||||
msgstr "Conferma la nuova password:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1828,7 +1839,7 @@ msgstr "Caricando ..."
|
|||
#: code:addons/web/static/src/xml/base.xml:1828
|
||||
#, python-format
|
||||
msgid "Name:"
|
||||
msgstr ""
|
||||
msgstr "Nome:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1842,7 +1853,7 @@ msgstr "Informazioni"
|
|||
#: code:addons/web/static/src/xml/base.xml:1406
|
||||
#, python-format
|
||||
msgid "Search Again"
|
||||
msgstr ""
|
||||
msgstr "Cerca ancora"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1874,13 +1885,15 @@ msgid ""
|
|||
"Grouping on field '%s' is not possible because that field does not appear in "
|
||||
"the list view."
|
||||
msgstr ""
|
||||
"Il raggruppamento sul campo \"%s\" non è possibile perchè il campo non "
|
||||
"appare nella lista"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:531
|
||||
#, python-format
|
||||
msgid "Set Defaults"
|
||||
msgstr ""
|
||||
msgstr "Imposta predefiniti"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1902,7 +1915,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:319
|
||||
#, python-format
|
||||
msgid "The record could not be found in the database."
|
||||
msgstr ""
|
||||
msgstr "Il record non può essere trovato nel database"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1923,7 +1936,7 @@ msgstr "Tipo:"
|
|||
#: code:addons/web/static/src/js/chrome.js:538
|
||||
#, python-format
|
||||
msgid "Incorrect super-administrator password"
|
||||
msgstr ""
|
||||
msgstr "Password di super-admin non corretta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1965,6 +1978,8 @@ msgid ""
|
|||
"The type of the field '%s' must be a many2many field with a relation to "
|
||||
"'ir.attachment' model."
|
||||
msgstr ""
|
||||
"Il tipo del campo \"%s\" deve essere: \"molti a molti\" con una relazione al "
|
||||
"modello \"ir.attachment\"."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1986,7 +2001,7 @@ msgstr "Aggiungi: "
|
|||
#: code:addons/web/static/src/xml/base.xml:1833
|
||||
#, python-format
|
||||
msgid "Quick Add"
|
||||
msgstr ""
|
||||
msgstr "Aggiungi (rapido)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2029,14 +2044,14 @@ msgstr "Caricadati dimostrativi:"
|
|||
#: code:addons/web/static/src/js/dates.js:26
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid datetime"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" non è un valido \"datetime\""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:1471
|
||||
#, python-format
|
||||
msgid "Could not find a DOM Parser: %s"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile trovare un interprete DOM : \"%s\""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2116,14 +2131,14 @@ msgstr "Download \"%s\""
|
|||
#: code:addons/web/static/src/js/view_form.js:324
|
||||
#, python-format
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Nuovo"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list.js:1746
|
||||
#, python-format
|
||||
msgid "Can't convert value %s to context"
|
||||
msgstr ""
|
||||
msgstr "Non è possibile convertire il valore %s a context"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2189,34 +2204,34 @@ msgstr "è falso"
|
|||
#: code:addons/web/static/src/xml/base.xml:404
|
||||
#, python-format
|
||||
msgid "About OpenERP"
|
||||
msgstr ""
|
||||
msgstr "Informazioni su OpenERP"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:297
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct date, datetime nor time"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" non è una data corretta, datetime e neppure orario"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:1306
|
||||
#, python-format
|
||||
msgid "No content found for field '%s' on '%s:%s'"
|
||||
msgstr ""
|
||||
msgstr "Nessun contenuto trovato per il campo \"%s\" su \"%s:%s\""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:304
|
||||
#, python-format
|
||||
msgid "Database Management"
|
||||
msgstr ""
|
||||
msgstr "Gestione Database"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4971
|
||||
#, python-format
|
||||
msgid "Image"
|
||||
msgstr ""
|
||||
msgstr "Immagine"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2230,7 +2245,7 @@ msgstr "Gestisci Database"
|
|||
#: code:addons/web/static/src/js/pyeval.js:765
|
||||
#, python-format
|
||||
msgid "Evaluation Error"
|
||||
msgstr ""
|
||||
msgstr "Errore valutazione"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2249,7 +2264,7 @@ msgstr "intero non valido"
|
|||
#: code:addons/web/static/src/xml/base.xml:1605
|
||||
#, python-format
|
||||
msgid "or"
|
||||
msgstr ""
|
||||
msgstr "o"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2263,7 +2278,7 @@ msgstr "No"
|
|||
#: code:addons/web/static/src/js/formats.js:309
|
||||
#, python-format
|
||||
msgid "'%s' is not convertible to date, datetime nor time"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" non è convertibile ad una data, datetime o orario"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2281,21 +2296,21 @@ msgstr "Duplica"
|
|||
#: code:addons/web/static/src/xml/base.xml:1366
|
||||
#, python-format
|
||||
msgid "Discard"
|
||||
msgstr ""
|
||||
msgstr "Scarta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1599
|
||||
#, python-format
|
||||
msgid "Add a condition"
|
||||
msgstr ""
|
||||
msgstr "Aggiungi una condizione"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:620
|
||||
#, python-format
|
||||
msgid "Still loading..."
|
||||
msgstr ""
|
||||
msgstr "Ancora in caricamento..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2310,6 +2325,7 @@ msgstr "Valore non valido per campo %(fieldname)s: [%(value)s] è %(message)s"
|
|||
#, python-format
|
||||
msgid "The o2m record must be saved before an action can be used"
|
||||
msgstr ""
|
||||
"I record o2m devono essere salvati prima che l'azione possa essere usata"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2323,21 +2339,21 @@ msgstr "Salvato"
|
|||
#: code:addons/web/static/src/xml/base.xml:1585
|
||||
#, python-format
|
||||
msgid "Use by default"
|
||||
msgstr ""
|
||||
msgstr "Utilizza per default"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4846
|
||||
#, python-format
|
||||
msgid "The field is empty, there's nothing to save !"
|
||||
msgstr ""
|
||||
msgstr "Questo campo è vuoto, non c'è nulla da salvare!"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list.js:1327
|
||||
#, python-format
|
||||
msgid "%s (%d)"
|
||||
msgstr ""
|
||||
msgstr "%s (%d)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2351,7 +2367,7 @@ msgstr "avviato da vista ricerca"
|
|||
#: code:addons/web/static/src/js/search.js:980
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2393,14 +2409,14 @@ msgstr "Modifica Workflow"
|
|||
#: code:addons/web/static/src/js/views.js:1172
|
||||
#, python-format
|
||||
msgid "Do you really want to delete this attachment ?"
|
||||
msgstr ""
|
||||
msgstr "Volete veramente cancellare questo allegato?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:838
|
||||
#, python-format
|
||||
msgid "Technical Translation"
|
||||
msgstr ""
|
||||
msgstr "Traduzione tecnica"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2414,14 +2430,14 @@ msgstr "Campo:"
|
|||
#: code:addons/web/static/src/js/chrome.js:499
|
||||
#, python-format
|
||||
msgid "The database %s has been dropped"
|
||||
msgstr ""
|
||||
msgstr "Il database %s è stato eliminato"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:456
|
||||
#, python-format
|
||||
msgid "User's timezone"
|
||||
msgstr ""
|
||||
msgstr "Timezone utente"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2436,7 +2452,7 @@ msgstr "Errore Client"
|
|||
#: code:addons/web/static/src/js/views.js:996
|
||||
#, python-format
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
msgstr "Stampa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2451,6 +2467,7 @@ msgstr "Speciale:"
|
|||
msgid ""
|
||||
"The old password you provided is incorrect, your password was not changed."
|
||||
msgstr ""
|
||||
"La vecchia password fornita non è corretta, la password non è stata cambiata."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2478,7 +2495,7 @@ msgstr "Salva & Chiudi"
|
|||
#: code:addons/web/static/src/js/view_form.js:2818
|
||||
#, python-format
|
||||
msgid "Search More..."
|
||||
msgstr ""
|
||||
msgstr "Cerca Ancora..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2516,21 +2533,21 @@ msgstr "Seleziona data"
|
|||
#: code:addons/web/static/src/js/search.js:1251
|
||||
#, python-format
|
||||
msgid "Search %(field)s for: %(value)s"
|
||||
msgstr ""
|
||||
msgstr "Cerca %(field)s per: %(value)s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1252
|
||||
#, python-format
|
||||
msgid "Delete this file"
|
||||
msgstr ""
|
||||
msgstr "Cancella questo file"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:109
|
||||
#, python-format
|
||||
msgid "Create Database"
|
||||
msgstr ""
|
||||
msgstr "Crea database"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-26 09:06+0000\n"
|
||||
"PO-Revision-Date: 2012-12-10 08:54+0000\n"
|
||||
"Last-Translator: gobi <Unknown>\n"
|
||||
"Language-Team: Mongolian <mn@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: 2012-12-01 05:20+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -59,7 +59,7 @@ msgstr "бага буюу тэнцүү"
|
|||
#: code:addons/web/static/src/js/chrome.js:393
|
||||
#, python-format
|
||||
msgid "Please enter your previous password"
|
||||
msgstr ""
|
||||
msgstr "Өмнө нууц үгээ оруулна уу"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -82,7 +82,7 @@ msgstr "Мастер Нууц Үг Солих"
|
|||
#: code:addons/web/static/src/js/chrome.js:491
|
||||
#, python-format
|
||||
msgid "Do you really want to delete the database: %s ?"
|
||||
msgstr ""
|
||||
msgstr "Та үнэхээр энэн өгөгдлийн баазыг устгамаар байна уу: %s ?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -96,7 +96,7 @@ msgstr "%(field)s талбарыг: %(value)s-д хайх"
|
|||
#: code:addons/web/static/src/js/chrome.js:537
|
||||
#, python-format
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "Хандалтыг татгалзав"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -120,7 +120,7 @@ msgstr "Өгөгдлийн Бааз Нөөцлөх"
|
|||
#: code:addons/web/static/src/js/dates.js:53
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid date"
|
||||
msgstr ""
|
||||
msgstr "'%s' нь огноо биш байна"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -147,7 +147,7 @@ msgstr "Файл"
|
|||
#: code:addons/web/controllers/main.py:842
|
||||
#, python-format
|
||||
msgid "You cannot leave any password empty."
|
||||
msgstr ""
|
||||
msgstr "Ямарваа нууц үгийг хоосон үлдээж болохгүй"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -208,7 +208,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:1242
|
||||
#, python-format
|
||||
msgid "Widget type '%s' is not implemented"
|
||||
msgstr ""
|
||||
msgstr "'%s' төрөлийн виджет хийгдээгүй"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -237,7 +237,7 @@ msgstr "(тэмдэгт мөр үгүй)"
|
|||
#: code:addons/web/static/src/js/formats.js:282
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct time"
|
||||
msgstr ""
|
||||
msgstr "'%s' нь цаг биш байна"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -336,7 +336,7 @@ msgstr "Нууц үг солих"
|
|||
#: code:addons/web/static/src/js/view_form.js:3382
|
||||
#, python-format
|
||||
msgid "View type '%s' is not supported in One2Many."
|
||||
msgstr ""
|
||||
msgstr "'%s' төрөлийн харагдац нь Нэг нь Олонтой дотор дэмжигдэхгүй"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -351,7 +351,7 @@ msgstr "Татах"
|
|||
#: code:addons/web/static/src/js/formats.js:266
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct datetime"
|
||||
msgstr ""
|
||||
msgstr "'%s' нь огноо, цаг биш"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -379,13 +379,13 @@ msgstr "Сонголт:"
|
|||
#: code:addons/web/static/src/js/view_form.js:869
|
||||
#, python-format
|
||||
msgid "The following fields are invalid:"
|
||||
msgstr ""
|
||||
msgstr "Дараах талбарууд буруу:"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:863
|
||||
#, python-format
|
||||
msgid "Languages"
|
||||
msgstr ""
|
||||
msgstr "Хэлүүд"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-12-05 10:11+0000\n"
|
||||
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-10 17:13+0000\n"
|
||||
"Last-Translator: Virgílio Oliveira <virgilio.oliveira@multibase.pt>\n"
|
||||
"Language-Team: Portuguese <pt@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: 2012-12-06 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -206,7 +206,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:1242
|
||||
#, python-format
|
||||
msgid "Widget type '%s' is not implemented"
|
||||
msgstr ""
|
||||
msgstr "Elemento do tipo '%s' não está implementado"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -519,7 +519,7 @@ msgstr "Operador não suportado %s no domínio %s"
|
|||
#: code:addons/web/static/src/js/formats.js:242
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct float"
|
||||
msgstr ""
|
||||
msgstr "'%s' não é um número fracional correto"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -547,14 +547,14 @@ msgstr "Criar e editar"
|
|||
#: code:addons/web/static/src/js/pyeval.js:731
|
||||
#, python-format
|
||||
msgid "Unknown nonliteral type "
|
||||
msgstr ""
|
||||
msgstr "Tipo não literal desconhecido "
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:2345
|
||||
#, python-format
|
||||
msgid "Resource error"
|
||||
msgstr ""
|
||||
msgstr "Erro de recurso"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -596,7 +596,7 @@ msgstr "Para mais informações visite"
|
|||
#: code:addons/web/static/src/xml/base.xml:1834
|
||||
#, python-format
|
||||
msgid "Add All Info..."
|
||||
msgstr ""
|
||||
msgstr "Adicionar toda a informação..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -624,7 +624,7 @@ msgstr "Campos %s modelo"
|
|||
#: code:addons/web/static/src/js/view_list.js:890
|
||||
#, python-format
|
||||
msgid "Setting 'id' attribute on existing record %s"
|
||||
msgstr ""
|
||||
msgstr "Atribuição do atributo 'id' no registo %s já existente"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -676,7 +676,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:1238
|
||||
#, python-format
|
||||
msgid "Field '%s' specified in view could not be found."
|
||||
msgstr ""
|
||||
msgstr "Campo '%s' especificado na vista não foi encontrado."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -718,7 +718,7 @@ msgstr "Aplicar"
|
|||
#: code:addons/web/static/src/xml/base.xml:1361
|
||||
#, python-format
|
||||
msgid "Save & New"
|
||||
msgstr ""
|
||||
msgstr "Gravar & criar"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -733,7 +733,7 @@ msgstr "Guardar como"
|
|||
#: code:addons/web/static/src/js/view_form.js:2316
|
||||
#, python-format
|
||||
msgid "E-mail error"
|
||||
msgstr ""
|
||||
msgstr "Erro de e-mail"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -861,7 +861,7 @@ msgstr "Preferências"
|
|||
#: code:addons/web/static/src/js/view_form.js:434
|
||||
#, python-format
|
||||
msgid "Wrong on change format: %s"
|
||||
msgstr ""
|
||||
msgstr "Erro na alteração de formato: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -890,7 +890,7 @@ msgstr "Modificadores:"
|
|||
#: code:addons/web/static/src/xml/base.xml:605
|
||||
#, python-format
|
||||
msgid "Delete this attachment"
|
||||
msgstr ""
|
||||
msgstr "Apagar este anexo"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -922,7 +922,7 @@ msgstr "Nome de utilizador"
|
|||
#: code:addons/web/static/src/js/chrome.js:481
|
||||
#, python-format
|
||||
msgid "Duplicating database"
|
||||
msgstr ""
|
||||
msgstr "Duplicando a base de dados"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -936,7 +936,7 @@ msgstr "A senha foi alterada com êxito"
|
|||
#: code:addons/web/static/src/js/view_list_editable.js:781
|
||||
#, python-format
|
||||
msgid "The form's data can not be discarded"
|
||||
msgstr ""
|
||||
msgstr "A informação no formulário não pode ser descartada"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -971,6 +971,10 @@ msgid ""
|
|||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Falha na avaliação local\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1012,7 +1016,7 @@ msgstr "Erro, a senha não foi alterada!"
|
|||
#: code:addons/web/static/src/js/view_form.js:4810
|
||||
#, python-format
|
||||
msgid "The selected file exceed the maximum file size of %s."
|
||||
msgstr ""
|
||||
msgstr "O ficheiro selecionado excede o tamanho máximo de %s."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1061,7 +1065,7 @@ msgstr "Cópia de segurança"
|
|||
#: code:addons/web/static/src/js/dates.js:80
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid time"
|
||||
msgstr ""
|
||||
msgstr "'%s' não é uma hora válida"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1249,7 +1253,7 @@ msgstr "Agrupar por: %s"
|
|||
#: code:addons/web/static/src/js/view_form.js:151
|
||||
#, python-format
|
||||
msgid "No data provided."
|
||||
msgstr ""
|
||||
msgstr "Ausência de dados"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1278,7 +1282,7 @@ msgstr "Deve escolher pelo menos um registo."
|
|||
#: code:addons/web/static/src/js/coresetup.js:622
|
||||
#, python-format
|
||||
msgid "Don't leave yet,<br />it's still loading..."
|
||||
msgstr ""
|
||||
msgstr "Não se vá embora já<br />porque ainda está carregando..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1292,7 +1296,7 @@ msgstr "Pesquisa inválida"
|
|||
#: code:addons/web/static/src/js/view_list.js:959
|
||||
#, python-format
|
||||
msgid "Could not find id in dataset"
|
||||
msgstr ""
|
||||
msgstr "O ID não foi encontrado"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1320,7 +1324,7 @@ msgstr "%(page)d/%(page_count)d"
|
|||
#: code:addons/web/static/src/js/chrome.js:397
|
||||
#, python-format
|
||||
msgid "The confirmation does not match the password"
|
||||
msgstr ""
|
||||
msgstr "A confirmação não coincide com a senha"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1411,7 +1415,7 @@ msgstr "é igual a"
|
|||
#: code:addons/web/static/src/js/views.js:1455
|
||||
#, python-format
|
||||
msgid "Could not serialize XML"
|
||||
msgstr ""
|
||||
msgstr "Não foi possível serializar o XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1432,7 +1436,7 @@ msgstr "Confirme a nova senha de administração:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:625
|
||||
#, python-format
|
||||
msgid "Maybe you should consider reloading the application by pressing F5..."
|
||||
msgstr ""
|
||||
msgstr "Talvez deva pensar em recarregar a aplicação carregando em F5..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1522,7 +1526,7 @@ msgstr "Não foi possível eliminar a base de dados!"
|
|||
#: code:addons/web/static/src/js/formats.js:227
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct integer"
|
||||
msgstr ""
|
||||
msgstr "'%s' não é um número inteiro correto"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1543,7 +1547,7 @@ msgstr "Campo desconhecido %s no domínio %s"
|
|||
#: code:addons/web/static/src/js/views.js:1421
|
||||
#, python-format
|
||||
msgid "Node [%s] is not a JSONified XML node"
|
||||
msgstr ""
|
||||
msgstr "O nó [%s] não é do tipo JSONified XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1608,7 +1612,7 @@ msgstr "--- Não importar ---"
|
|||
#: code:addons/web/static/src/xml/base.xml:1654
|
||||
#, python-format
|
||||
msgid "Import-Compatible Export"
|
||||
msgstr ""
|
||||
msgstr "Exportação compatível com importação"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1622,7 +1626,7 @@ msgstr "%d anos atrás"
|
|||
#: code:addons/web/static/src/js/view_list.js:1019
|
||||
#, python-format
|
||||
msgid "Unknown m2m command %s"
|
||||
msgstr ""
|
||||
msgstr "Comando m2m %s desconhecio"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1652,7 +1656,7 @@ msgstr "Por favor introduza a sua nova senha"
|
|||
#: code:addons/web/static/src/js/views.js:1463
|
||||
#, python-format
|
||||
msgid "Could not parse string to xml"
|
||||
msgstr ""
|
||||
msgstr "Não foi possível passar o texto para XML"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1724,7 +1728,7 @@ msgstr "A importação falhou devido a:"
|
|||
#: code:addons/web/static/src/xml/base.xml:533
|
||||
#, python-format
|
||||
msgid "JS Tests"
|
||||
msgstr ""
|
||||
msgstr "Testes JS"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1930,7 +1934,7 @@ msgstr "Tipo:"
|
|||
#: code:addons/web/static/src/js/chrome.js:538
|
||||
#, python-format
|
||||
msgid "Incorrect super-administrator password"
|
||||
msgstr ""
|
||||
msgstr "Senha de super-administrador incorreta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2043,7 +2047,7 @@ msgstr "'%s' não é uma data/hora correta"
|
|||
#: code:addons/web/static/src/js/views.js:1471
|
||||
#, python-format
|
||||
msgid "Could not find a DOM Parser: %s"
|
||||
msgstr ""
|
||||
msgstr "Não foi encontrado o interpretador de DOM: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2403,7 +2407,7 @@ msgstr "Editar fluxo de trabalho"
|
|||
#: code:addons/web/static/src/js/views.js:1172
|
||||
#, python-format
|
||||
msgid "Do you really want to delete this attachment ?"
|
||||
msgstr ""
|
||||
msgstr "Quer mesmo apagar este anexo?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2469,7 +2473,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:555
|
||||
#, python-format
|
||||
msgid "Creation User:"
|
||||
msgstr ""
|
||||
msgstr "Utilizador de criação:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2535,7 +2539,7 @@ msgstr "Pesquisar %(field)s por: %(value)s"
|
|||
#: code:addons/web/static/src/xml/base.xml:1252
|
||||
#, python-format
|
||||
msgid "Delete this file"
|
||||
msgstr ""
|
||||
msgstr "Apagar este ficheiro"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,15 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-12-03 19:25+0000\n"
|
||||
"Last-Translator: Cristiano Korndörfer <codigo.aberto@dorfer.com.br>\n"
|
||||
"PO-Revision-Date: 2012-12-16 22:21+0000\n"
|
||||
"Last-Translator: Fábio Martinelli - http://zupy.com.br "
|
||||
"<webmaster@guaru.net>\n"
|
||||
"Language-Team: Brazilian Portuguese <pt_BR@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: 2012-12-04 05:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16335)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-17 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -29,7 +30,7 @@ msgstr "Idioma padrão:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:593
|
||||
#, python-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d minutos atrás"
|
||||
msgstr "há %d minutos"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -75,7 +76,7 @@ msgstr "Senha Super Admin:"
|
|||
#: code:addons/web/static/src/xml/base.xml:274
|
||||
#, python-format
|
||||
msgid "Change Master Password"
|
||||
msgstr "Alterar senha principal"
|
||||
msgstr "Alterar Senha Super Admin"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -860,7 +861,7 @@ msgstr "Preferências"
|
|||
#: code:addons/web/static/src/js/view_form.js:434
|
||||
#, python-format
|
||||
msgid "Wrong on change format: %s"
|
||||
msgstr ""
|
||||
msgstr "Formato invalido para on change: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1547,7 +1548,7 @@ msgstr "Campo desconhecido %s no domínio %s"
|
|||
#: code:addons/web/static/src/js/views.js:1421
|
||||
#, python-format
|
||||
msgid "Node [%s] is not a JSONified XML node"
|
||||
msgstr ""
|
||||
msgstr "O Nó [%s] não é um nó no formato XML JSONified"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2050,7 +2051,7 @@ msgstr "'%s' não é uma data válida"
|
|||
#: code:addons/web/static/src/js/views.js:1471
|
||||
#, python-format
|
||||
msgid "Could not find a DOM Parser: %s"
|
||||
msgstr ""
|
||||
msgstr "Não foi possível encontrar um Interpretador DOM: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -186,6 +186,6 @@ class OpenERPSession(object):
|
|||
if lang in babel.core.LOCALE_ALIASES:
|
||||
lang = babel.core.LOCALE_ALIASES[lang]
|
||||
|
||||
context['lang'] = lang
|
||||
context['lang'] = lang or 'en_US'
|
||||
|
||||
# vim:et:ts=4:sw=4:
|
||||
|
|
|
@ -8952,7 +8952,8 @@ $.extend( $.ui.dialog.overlay, {
|
|||
$( document ).bind( $.ui.dialog.overlay.events, function( event ) {
|
||||
// stop events if the z-index of the target is < the z-index of the overlay
|
||||
// we cannot return true when we don't want to cancel the event (#3523)
|
||||
if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
|
||||
if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ &&
|
||||
$(event.target).closest('.ui-dialog').zIndex() < $.ui.dialog.overlay.maxZ) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -6484,9 +6484,9 @@ jQuery.uaMatch = function( ua ) {
|
|||
ua = ua.toLowerCase();
|
||||
|
||||
var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(msie) ([\w.]+)/.exec( ua ) ||
|
||||
(/(webkit)[ \/]([\w.]+)/.exec( ua )) ||
|
||||
(/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua )) ||
|
||||
(/(msie) ([\w.]+)/.exec( ua )) ||
|
||||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
|
||||
[];
|
||||
|
||||
|
|
|
@ -228,6 +228,7 @@ QWeb2.Engine = (function() {
|
|||
}
|
||||
if (name) {
|
||||
this.templates[name] = node;
|
||||
this.compiled_templates[name] = null;
|
||||
} else if (extend) {
|
||||
delete(this.compiled_templates[extend]);
|
||||
if (this.extend_templates[extend]) {
|
||||
|
|
|
@ -43,6 +43,10 @@
|
|||
color: #afafb6 !important;
|
||||
font-style: italic !important;
|
||||
}
|
||||
.openerp :-ms-input-placeholder {
|
||||
color: #afafb6 !important;
|
||||
font-style: italic !important;
|
||||
}
|
||||
.openerp a {
|
||||
text-decoration: none;
|
||||
cursor: pointer !important;
|
||||
|
@ -608,6 +612,9 @@
|
|||
}
|
||||
.openerp .oe_notebook > li > a {
|
||||
display: block;
|
||||
color: gray;
|
||||
}
|
||||
.openerp .oe_notebook > li.ui-tabs-active > a {
|
||||
color: #4c4c4c;
|
||||
}
|
||||
.openerp .oe_notebook {
|
||||
|
@ -703,6 +710,9 @@
|
|||
display: block;
|
||||
color: #4c4c4c;
|
||||
text-decoration: none;
|
||||
width: 200px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_dropdown_menu > li > a:hover {
|
||||
text-decoration: none;
|
||||
|
@ -809,6 +819,16 @@
|
|||
margin-top: 1px;
|
||||
background-color: #f6cf3b;
|
||||
}
|
||||
.openerp .oe_dialog_warning {
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_dialog_warning p {
|
||||
text-align: center;
|
||||
}
|
||||
.openerp .oe_dialog_icon {
|
||||
padding: 5px;
|
||||
width: 32px;
|
||||
}
|
||||
.openerp .oe_login {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
|
||||
text-align: center;
|
||||
|
@ -988,6 +1008,39 @@
|
|||
background-image: -o-linear-gradient(top, #646060, #262626);
|
||||
background-image: linear-gradient(to bottom, #646060, #262626);
|
||||
}
|
||||
.openerp .oe_topbar .oe_topbar_anonymous_login {
|
||||
background-color: #dc5f59;
|
||||
color: #eeeeee;
|
||||
background-color: #fc8787;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fc8787), to(maroon));
|
||||
background-image: -webkit-linear-gradient(top, #fc8787, maroon);
|
||||
background-image: -moz-linear-gradient(top, #fc8787, maroon);
|
||||
background-image: -ms-linear-gradient(top, #fc8787, maroon);
|
||||
background-image: -o-linear-gradient(top, #fc8787, maroon);
|
||||
background-image: linear-gradient(to bottom, #fc8787, maroon);
|
||||
}
|
||||
.openerp .oe_topbar .oe_topbar_anonymous_login a {
|
||||
display: block;
|
||||
padding: 5px 10px 7px;
|
||||
line-height: 20px;
|
||||
height: 20px;
|
||||
text-decoration: none;
|
||||
color: white;
|
||||
background: transparent;
|
||||
-webkit-transition: all 0.2s ease-out;
|
||||
-moz-transition: all 0.2s ease-out;
|
||||
-ms-transition: all 0.2s ease-out;
|
||||
-o-transition: all 0.2s ease-out;
|
||||
transition: all 0.2s ease-out;
|
||||
}
|
||||
.openerp .oe_topbar .oe_topbar_anonymous_login a:hover {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
color: white;
|
||||
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
|
||||
}
|
||||
.openerp .oe_topbar .oe_topbar_item {
|
||||
display: block;
|
||||
padding: 5px 10px 7px;
|
||||
|
@ -1059,6 +1112,14 @@
|
|||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
.openerp .oe_topbar .oe_topbar_name {
|
||||
max-width: 150px;
|
||||
overflow: hidden;
|
||||
display: inline-block;
|
||||
max-height: 100%;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.openerp .oe_menu {
|
||||
float: left;
|
||||
padding: 0;
|
||||
|
@ -1131,18 +1192,33 @@
|
|||
padding-bottom: 16px;
|
||||
}
|
||||
.openerp a.oe_logo {
|
||||
position: relative;
|
||||
width: 220px;
|
||||
display: block;
|
||||
text-align: center;
|
||||
height: 70px;
|
||||
line-height: 70px;
|
||||
}
|
||||
.openerp a.oe_logo img {
|
||||
height: 40px;
|
||||
width: 157px;
|
||||
margin: 14px 0;
|
||||
border: 0;
|
||||
}
|
||||
.openerp a.oe_logo .oe_logo_edit {
|
||||
margin: 14px 0;
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
padding: 4px;
|
||||
width: 100%;
|
||||
display: none;
|
||||
text-align: center;
|
||||
color: #eeeeee;
|
||||
background: rgba(37, 37, 37, 0.9);
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-ms-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.openerp a.oe_logo:hover .oe_logo_edit_admin {
|
||||
display: block;
|
||||
}
|
||||
.openerp .oe_footer {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
|
@ -1152,14 +1228,11 @@
|
|||
text-align: center;
|
||||
}
|
||||
.openerp .oe_footer a {
|
||||
font-weight: 800;
|
||||
font-family: serif;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
}
|
||||
.openerp .oe_footer a span {
|
||||
color: #c81010;
|
||||
font-style: italic;
|
||||
}
|
||||
.openerp .oe_secondary_menu_section {
|
||||
font-weight: bold;
|
||||
|
@ -1192,7 +1265,7 @@
|
|||
color: white;
|
||||
padding: 2px 4px;
|
||||
margin: 1px 6px 0 0;
|
||||
border: 1px solid lightGray;
|
||||
border: 1px solid lightgrey;
|
||||
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
||||
-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
|
@ -1217,7 +1290,7 @@
|
|||
transform: scale(1.1);
|
||||
}
|
||||
.openerp .oe_secondary_submenu .oe_active {
|
||||
border-top: 1px solid lightGray;
|
||||
border-top: 1px solid lightgrey;
|
||||
border-bottom: 1px solid #dedede;
|
||||
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
|
||||
|
@ -1322,12 +1395,14 @@
|
|||
height: 100%;
|
||||
}
|
||||
.openerp .oe_application .oe_breadcrumb_item:not(:last-child) {
|
||||
display: inline-block;
|
||||
max-width: 7em;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.openerp .oe_application .oe_breadcrumb_title > * {
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_view_manager .oe_view_manager_body {
|
||||
height: inherit;
|
||||
}
|
||||
|
@ -1335,6 +1410,7 @@
|
|||
height: inherit;
|
||||
}
|
||||
.openerp .oe_view_manager table.oe_view_manager_header {
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
@ -2018,6 +2094,12 @@
|
|||
margin: -16px -16px 0 -16px;
|
||||
padding: 0;
|
||||
}
|
||||
.openerp .oe_form_nosheet.oe_form_nomargin {
|
||||
margin: 0;
|
||||
}
|
||||
.openerp .oe_form_nosheet.oe_form_nomargin > header {
|
||||
margin: 0;
|
||||
}
|
||||
.openerp .oe_form_sheetbg {
|
||||
padding: 16px 0;
|
||||
}
|
||||
|
@ -2031,6 +2113,9 @@
|
|||
min-height: 330px;
|
||||
padding: 16px;
|
||||
}
|
||||
.openerp .oe_form_sheet .oe_list {
|
||||
overflow-x: auto;
|
||||
}
|
||||
.openerp .oe_application .oe_form_sheetbg {
|
||||
background: url(/web/static/src/img/form_sheetbg.png);
|
||||
border-bottom: 1px solid #dddddd;
|
||||
|
@ -2154,7 +2239,7 @@
|
|||
}
|
||||
.openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
|
||||
font-size: 80%;
|
||||
color: darkGreen;
|
||||
color: darkgreen;
|
||||
vertical-align: top;
|
||||
position: relative;
|
||||
top: -4px;
|
||||
|
@ -2535,6 +2620,7 @@
|
|||
background: -moz-linear-gradient(135deg, #dedede, #fcfcfc);
|
||||
background: -o-linear-gradient(135deg, #fcfcfc, #dedede);
|
||||
background: -webkit-gradient(linear, left top, right bottom, from(#fcfcfc), to(#dedede));
|
||||
background: -ms-linear-gradient(top, #fcfcfc, #dedede);
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
|
@ -2558,6 +2644,7 @@
|
|||
background: -moz-linear-gradient(135deg, #3465a4, #729fcf);
|
||||
background: -o-linear-gradient(135deg, #729fcf, #3465a4);
|
||||
background: -webkit-gradient(linear, left top, right bottom, from(#729fcf), to(#3465a4));
|
||||
background: -ms-linear-gradient(top, #729fcf, #3465a4);
|
||||
}
|
||||
.openerp ul.oe_form_status li.oe_active .label, .openerp ul.oe_form_status_clickable li.oe_active .label {
|
||||
color: white;
|
||||
|
@ -2607,6 +2694,7 @@
|
|||
background: -moz-linear-gradient(135deg, #284d7d, #4c85c2);
|
||||
background: -o-linear-gradient(135deg, #4c85c2, #284d7d);
|
||||
background: -webkit-gradient(linear, left top, right bottom, from(#4c85c2), to(#284d7d));
|
||||
background: -ms-linear-gradient(top, #4c85c2, #284d7d);
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page {
|
||||
display: none;
|
||||
|
@ -3039,6 +3127,69 @@ div.ui-widget-overlay {
|
|||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.openerp_ie input[type='checkbox'] {
|
||||
border: none;
|
||||
background: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
.openerp_ie .oe_logo img {
|
||||
border: none;
|
||||
}
|
||||
.openerp_ie .oe_header_row button.oe_highlight {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_view_manager_buttons button.oe_write_full {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_view_manager_buttons button.oe_highlight {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_view_manager_buttons button .oe_form_button_edit {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_view_manager_buttons button .oe_form_button_create {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_kanban_image {
|
||||
border: none;
|
||||
}
|
||||
.openerp_ie .oe_msg_icon {
|
||||
border: none;
|
||||
}
|
||||
.openerp_ie .oe_form header ul {
|
||||
height: 29px;
|
||||
}
|
||||
.openerp_ie .oe_attach {
|
||||
filter: none;
|
||||
}
|
||||
.openerp_ie .oe_link {
|
||||
filter: none;
|
||||
}
|
||||
.openerp_ie .oe_kanban_show_more {
|
||||
clear: both;
|
||||
text-align: center;
|
||||
}
|
||||
.openerp_ie.oe_kanban_grouped .oe_kanban_show_more .oe_button {
|
||||
width: 100%;
|
||||
padding: 3px 12px;
|
||||
}
|
||||
.openerp_ie .oe_form_buttons button {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_sidebar button {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp_ie .oe_form_field.oe_tags {
|
||||
float: left;
|
||||
}
|
||||
|
||||
@media print {
|
||||
.openerp {
|
||||
text-shadow: none;
|
||||
|
@ -3065,6 +3216,9 @@ div.ui-widget-overlay {
|
|||
border: 0px !important;
|
||||
box-shadow: 0px 0px 0px;
|
||||
}
|
||||
.openerp .oe_application .oe_form_sheet .oe_list, .openerp .oe_application .oe_form_sheetbg .oe_list {
|
||||
overflow-x: visible;
|
||||
}
|
||||
.openerp .oe_view_manager_current > .oe_view_manager_header {
|
||||
border: 0px !important;
|
||||
box-shadow: 0px 0px 0px;
|
||||
|
@ -3076,3 +3230,7 @@ div.ui-widget-overlay {
|
|||
overflow: hidden !important;
|
||||
}
|
||||
}
|
||||
.blockUI.blockOverlay {
|
||||
background-color: black;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
|
|
@ -95,6 +95,7 @@ $sheet-padding: 16px
|
|||
background: -moz-linear-gradient(135deg, $endColor, $startColor)
|
||||
background: -o-linear-gradient(135deg, $startColor, $endColor)
|
||||
background: -webkit-gradient(linear, left top, right bottom, from($startColor), to($endColor))
|
||||
background: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */
|
||||
|
||||
@mixin transform($transform)
|
||||
-webkit-transform: $transform
|
||||
|
@ -159,6 +160,9 @@ $sheet-padding: 16px
|
|||
\::-webkit-input-placeholder
|
||||
color: $tag-border !important
|
||||
font-style: italic !important
|
||||
\:-ms-input-placeholder
|
||||
color: $tag-border !important
|
||||
font-style: italic !important
|
||||
//}}}
|
||||
// Tag reset {{{
|
||||
a
|
||||
|
@ -530,6 +534,8 @@ $sheet-padding: 16px
|
|||
float: left
|
||||
.oe_notebook > li > a
|
||||
display: block
|
||||
color: #808080
|
||||
.oe_notebook > li.ui-tabs-active > a
|
||||
color: #4c4c4c
|
||||
.oe_notebook
|
||||
border-color: #ddd
|
||||
|
@ -598,6 +604,9 @@ $sheet-padding: 16px
|
|||
display: block
|
||||
color: #4c4c4c
|
||||
text-decoration: none
|
||||
width: 200px
|
||||
text-overflow: ellipsis
|
||||
overflow: hidden
|
||||
&:hover
|
||||
text-decoration: none
|
||||
.oe_dropdown_arrow:after
|
||||
|
@ -687,6 +696,15 @@ $sheet-padding: 16px
|
|||
margin-top: 1px
|
||||
background-color: #f6cf3b
|
||||
// }}}
|
||||
// CrashManager {{{
|
||||
.oe_dialog_warning
|
||||
width: 100%
|
||||
p
|
||||
text-align: center
|
||||
.oe_dialog_icon
|
||||
padding: 5px
|
||||
width: 32px
|
||||
// }}}
|
||||
// Login {{{
|
||||
.oe_login
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=)
|
||||
|
@ -818,6 +836,24 @@ $sheet-padding: 16px
|
|||
height: 32px
|
||||
background-color: #414141
|
||||
@include vertical-gradient(#646060, #262626)
|
||||
.oe_topbar_anonymous_login
|
||||
background-color: #dc5f59
|
||||
color: #eeeeee
|
||||
@include vertical-gradient(#FC8787, #800000)
|
||||
a
|
||||
display: block
|
||||
padding: 5px 10px 7px
|
||||
line-height: 20px
|
||||
height: 20px
|
||||
text-decoration: none
|
||||
color: white
|
||||
background: transparent
|
||||
@include transition(all 0.2s ease-out)
|
||||
a:hover
|
||||
background: rgba(0,0,0,0.1)
|
||||
color: white
|
||||
text-shadow: 0px 0px 3px rgba(0,0,0,0.2)
|
||||
@include box-shadow(0 1px 2px rgba(0,0,0,0.2) inset)
|
||||
.oe_topbar_item
|
||||
display: block
|
||||
padding: 5px 10px 7px
|
||||
|
@ -861,6 +897,13 @@ $sheet-padding: 16px
|
|||
&:hover
|
||||
@include vertical-gradient(#292929, #191919)
|
||||
@include box-shadow(none)
|
||||
.oe_topbar_name
|
||||
max-width: 150px
|
||||
overflow: hidden
|
||||
display: inline-block
|
||||
max-height: 100%
|
||||
text-overflow: ellipsis
|
||||
white-space: nowrap
|
||||
|
||||
// oe menu is the list of the buttons on the left side of the bar.
|
||||
// So why aren't the buttons oe_topbar_items ? This sad state of affairs
|
||||
|
@ -924,16 +967,26 @@ $sheet-padding: 16px
|
|||
text-shadow: 0 1px 1px white
|
||||
padding-bottom: 16px
|
||||
a.oe_logo
|
||||
position: relative
|
||||
width: 220px
|
||||
display: block
|
||||
text-align: center
|
||||
height: 70px
|
||||
line-height: 70px
|
||||
img
|
||||
height: 40px
|
||||
width: 157px
|
||||
margin: 14px 0
|
||||
border: 0
|
||||
.oe_logo_edit
|
||||
margin: 14px 0
|
||||
position: absolute
|
||||
top: 1px
|
||||
padding: 4px
|
||||
width: 100%
|
||||
display: none
|
||||
text-align: center
|
||||
color: #eee
|
||||
background: rgba(37,37,37,0.9)
|
||||
@include box-sizing(border)
|
||||
&:hover .oe_logo_edit_admin
|
||||
display: block
|
||||
.oe_footer
|
||||
position: fixed
|
||||
bottom: 0
|
||||
|
@ -942,13 +995,10 @@ $sheet-padding: 16px
|
|||
width: 220px
|
||||
text-align: center
|
||||
a
|
||||
font-weight: 800
|
||||
font-family: serif
|
||||
font-size: 16px
|
||||
font-weight: bold
|
||||
color: black
|
||||
span
|
||||
color: #c81010
|
||||
font-style: italic
|
||||
// }}}
|
||||
// Webclient.leftbar items {{{
|
||||
|
||||
|
@ -1069,11 +1119,12 @@ $sheet-padding: 16px
|
|||
> div
|
||||
height: 100%
|
||||
.oe_breadcrumb_item:not(:last-child)
|
||||
display: inline-block
|
||||
max-width: 7em
|
||||
white-space: nowrap
|
||||
overflow: hidden
|
||||
text-overflow: ellipsis
|
||||
.oe_breadcrumb_title > *
|
||||
display: inline-block
|
||||
overflow: hidden
|
||||
// }}}
|
||||
// ViewManager common {{{
|
||||
.oe_view_manager
|
||||
|
@ -1083,6 +1134,7 @@ $sheet-padding: 16px
|
|||
height: inherit
|
||||
|
||||
table.oe_view_manager_header
|
||||
border-collapse: separate
|
||||
width: 100%
|
||||
table-layout: fixed
|
||||
.oe_header_row
|
||||
|
@ -1606,6 +1658,10 @@ $sheet-padding: 16px
|
|||
> header
|
||||
margin: -16px -16px 0 -16px
|
||||
padding: 0
|
||||
.oe_form_nosheet.oe_form_nomargin
|
||||
margin: 0
|
||||
> header
|
||||
margin: 0
|
||||
.oe_form_sheetbg
|
||||
padding: 16px 0
|
||||
.oe_form_sheet_width
|
||||
|
@ -1616,6 +1672,8 @@ $sheet-padding: 16px
|
|||
background: white
|
||||
min-height: 330px
|
||||
padding: 16px
|
||||
.oe_list
|
||||
overflow-x: auto
|
||||
// Sheet inline mode
|
||||
.oe_application
|
||||
.oe_form_sheetbg
|
||||
|
@ -1653,7 +1711,7 @@ $sheet-padding: 16px
|
|||
width: 400px
|
||||
padding-bottom: 0
|
||||
div.oe_chatter
|
||||
box-sizing: border-box
|
||||
box-sizing: border-box
|
||||
min-width: $sheet-min-width + 2* $sheet-padding
|
||||
max-width: $sheet-max-width + 2* $sheet-padding
|
||||
margin: 0 auto
|
||||
|
@ -1925,7 +1983,7 @@ $sheet-padding: 16px
|
|||
overflow: hidden
|
||||
width: 24px
|
||||
overflow: hidden
|
||||
background: transparent
|
||||
background: transparent
|
||||
color: #7C7BAD
|
||||
box-shadow: none
|
||||
border: none
|
||||
|
@ -2409,6 +2467,63 @@ div.ui-widget-overlay
|
|||
@include radius(3px)
|
||||
// }}}
|
||||
|
||||
// Internet Explorer 9+ specifics {{{
|
||||
.openerp_ie
|
||||
input[type='checkbox']
|
||||
border: none
|
||||
background: none
|
||||
box-shadow: none
|
||||
.oe_logo
|
||||
img
|
||||
border: none
|
||||
.oe_header_row
|
||||
button.oe_highlight
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
.oe_view_manager_buttons
|
||||
button.oe_write_full
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
button.oe_highlight
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
button .oe_form_button_edit
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
button .oe_form_button_create
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
.oe_kanban_image
|
||||
border: none
|
||||
.oe_msg_icon
|
||||
border: none
|
||||
.oe_form
|
||||
header
|
||||
ul
|
||||
height: 29px
|
||||
.oe_attach
|
||||
filter: none
|
||||
.oe_link
|
||||
filter: none
|
||||
|
||||
.oe_kanban_show_more
|
||||
clear: both
|
||||
text-align: center
|
||||
&.oe_kanban_grouped .oe_kanban_show_more .oe_button
|
||||
width: 100%
|
||||
padding: 3px 12px
|
||||
|
||||
.oe_form_buttons button
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
.oe_sidebar button
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
|
||||
.oe_form_field.oe_tags
|
||||
float: left
|
||||
// }}}
|
||||
|
||||
// @media print {{{
|
||||
@media print
|
||||
.openerp
|
||||
|
@ -2432,6 +2547,8 @@ div.ui-widget-overlay
|
|||
.oe_form_sheet, .oe_form_sheetbg
|
||||
border: 0px !important
|
||||
box-shadow: 0px 0px 0px
|
||||
.oe_list
|
||||
overflow-x: visible
|
||||
.oe_view_manager_current > .oe_view_manager_header
|
||||
border: 0px !important
|
||||
box-shadow: 0px 0px 0px
|
||||
|
@ -2442,5 +2559,9 @@ div.ui-widget-overlay
|
|||
overflow: hidden !important
|
||||
// }}}
|
||||
|
||||
.blockUI.blockOverlay
|
||||
background-color: black
|
||||
opacity: 0.6000000238418579
|
||||
|
||||
// au BufWritePost,FileWritePost *.sass :!sass --style expanded --line-numbers <afile> > "%:p:r.css"
|
||||
// vim:tabstop=4:shiftwidth=4:softtabstop=4:fdm=marker:
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
/* This css contains the styling specific to the 'normal mode'. (as opposite to the embedded mode) */
|
||||
/* In embedded mode [1], this stylesheet won't be loaded. */
|
||||
|
||||
/* [1] The web client features an embedded mode in which the webclient */
|
||||
/* or a part of it can be started in any element of any webpage host. */
|
||||
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
overflow-y: scroll;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 3.9 KiB |
|
@ -565,8 +565,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
|
|||
},
|
||||
do_exit: function () {
|
||||
this.$el.remove();
|
||||
instance.webclient.toggle_bars(false);
|
||||
this.do_action('login');
|
||||
instance.webclient.show_login();
|
||||
}
|
||||
});
|
||||
instance.web.client_actions.add("database_manager", "instance.web.DatabaseManager");
|
||||
|
@ -692,6 +691,7 @@ instance.web.Login = instance.web.Widget.extend({
|
|||
});
|
||||
instance.web.client_actions.add("login", "instance.web.Login");
|
||||
|
||||
|
||||
/**
|
||||
* Redirect to url by replacing window.location
|
||||
* If wait is true, sleep 1s and wait for the server i.e. after a restart.
|
||||
|
@ -799,10 +799,25 @@ instance.web.client_actions.add("change_password", "instance.web.ChangePassword"
|
|||
instance.web.Menu = instance.web.Widget.extend({
|
||||
template: 'Menu',
|
||||
init: function() {
|
||||
var self = this;
|
||||
this._super.apply(this, arguments);
|
||||
this.has_been_loaded = $.Deferred();
|
||||
this.maximum_visible_links = 'auto'; // # of menu to show. 0 = do not crop, 'auto' = algo
|
||||
this.data = {data:{children:[]}};
|
||||
this.on("menu_loaded", this, function (menu_data) {
|
||||
self.reflow();
|
||||
// launch the fetch of needaction counters, asynchronous
|
||||
if (!_.isEmpty(menu_data.all_menu_ids)) {
|
||||
this.rpc("/web/menu/load_needaction", {menu_ids: menu_data.all_menu_ids}).done(function(r) {
|
||||
self.on_needaction_loaded(r);
|
||||
});
|
||||
}
|
||||
});
|
||||
var lazyreflow = _.debounce(this.reflow.bind(this), 200);
|
||||
instance.web.bus.on('resize', this, function() {
|
||||
self.$el.height(0);
|
||||
lazyreflow();
|
||||
});
|
||||
},
|
||||
start: function() {
|
||||
this._super.apply(this, arguments);
|
||||
|
@ -818,14 +833,8 @@ instance.web.Menu = instance.web.Widget.extend({
|
|||
},
|
||||
menu_loaded: function(data) {
|
||||
var self = this;
|
||||
this.data = data;
|
||||
this.data = {data: data};
|
||||
this.renderElement();
|
||||
this.limit_entries();
|
||||
// Hide toplevel item if there is only one
|
||||
var $toplevel = this.$("li");
|
||||
if($toplevel.length == 1) {
|
||||
$toplevel.hide();
|
||||
}
|
||||
this.$secondary_menus.html(QWeb.render("Menu.secondary", { widget : this }));
|
||||
this.$el.on('click', 'a[data-menu]', this.on_menu_click);
|
||||
// Hide second level submenus
|
||||
|
@ -836,23 +845,45 @@ instance.web.Menu = instance.web.Widget.extend({
|
|||
this.trigger('menu_loaded', data);
|
||||
this.has_been_loaded.resolve();
|
||||
},
|
||||
limit_entries: function() {
|
||||
var maximum_visible_links = this.maximum_visible_links;
|
||||
if (maximum_visible_links === 'auto') {
|
||||
maximum_visible_links = this.auto_limit_entries();
|
||||
}
|
||||
if (maximum_visible_links < this.data.data.children.length) {
|
||||
var $more = $(QWeb.render('Menu.more')),
|
||||
$index = this.$el.find('li').eq(maximum_visible_links - 1);
|
||||
$index.after($more);
|
||||
//$('.oe_topbar').append($more);
|
||||
$more.find('.oe_menu_more').append($index.next().nextAll());
|
||||
}
|
||||
on_needaction_loaded: function(data) {
|
||||
var self = this;
|
||||
this.needaction_data = data;
|
||||
_.each(this.needaction_data, function (item, menu_id) {
|
||||
var $item = self.$secondary_menus.find('a[data-menu="' + menu_id + '"]');
|
||||
$item.remove('oe_menu_counter');
|
||||
if (item.needaction_counter && item.needaction_counter > 0) {
|
||||
$item.append(QWeb.render("Menu.needaction_counter", { widget : item }));
|
||||
}
|
||||
});
|
||||
},
|
||||
auto_limit_entries: function() {
|
||||
// TODO: auto detect overflow and bind window on resize
|
||||
var width = $(window).width();
|
||||
return Math.floor(width / 125);
|
||||
/**
|
||||
* Reflow the menu items and dock overflowing items into a "More" menu item.
|
||||
* Automatically called when 'menu_loaded' event is triggered and on window resizing.
|
||||
*/
|
||||
reflow: function() {
|
||||
var self = this;
|
||||
this.$el.height('auto').show();
|
||||
var $more_container = this.$('.oe_menu_more_container').hide();
|
||||
var $more = this.$('.oe_menu_more');
|
||||
$more.children('li').insertBefore($more_container);
|
||||
var $toplevel_items = this.$el.children('li').not($more_container).hide();
|
||||
$toplevel_items.each(function() {
|
||||
var remaining_space = self.$el.parent().width() - $more_container.outerWidth();
|
||||
self.$el.parent().children(':visible').each(function() {
|
||||
remaining_space -= $(this).outerWidth();
|
||||
});
|
||||
if ($(this).width() > remaining_space) {
|
||||
return false;
|
||||
}
|
||||
$(this).show();
|
||||
});
|
||||
$more.append($toplevel_items.filter(':hidden').show());
|
||||
$more_container.toggle(!!$more.children().length);
|
||||
// Hide toplevel item if there is only one
|
||||
var $toplevel = this.$el.children("li:visible");
|
||||
if ($toplevel.length === 1) {
|
||||
$toplevel.hide();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Opens a given menu by id, as if a user had browsed to that menu by hand
|
||||
|
@ -1099,9 +1130,14 @@ instance.web.Client = instance.web.Widget.extend({
|
|||
|
||||
instance.web.WebClient = instance.web.Client.extend({
|
||||
_template: 'WebClient',
|
||||
events: {
|
||||
'click .oe_logo_edit_admin': 'logo_edit'
|
||||
},
|
||||
init: function(parent) {
|
||||
this._super(parent);
|
||||
this._current_state = null;
|
||||
this.menu_dm = new instance.web.DropMisordered();
|
||||
this.action_mutex = new $.Mutex();
|
||||
},
|
||||
start: function() {
|
||||
var self = this;
|
||||
|
@ -1153,6 +1189,7 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
show_application: function() {
|
||||
var self = this;
|
||||
self.toggle_bars(true);
|
||||
self.update_logo();
|
||||
self.menu = new instance.web.Menu(self);
|
||||
self.menu.replace(this.$el.find('.oe_menu_placeholder'));
|
||||
self.menu.on('menu_click', this, this.on_menu_action);
|
||||
|
@ -1164,6 +1201,32 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
self.set_title();
|
||||
self.check_timezone();
|
||||
},
|
||||
update_logo: function() {
|
||||
var img = this.session.url('/web/binary/company_logo');
|
||||
this.$('.oe_logo img').attr('src', '').attr('src', img);
|
||||
this.$('.oe_logo_edit').toggleClass('oe_logo_edit_admin', this.session.uid === 1);
|
||||
},
|
||||
logo_edit: function(ev) {
|
||||
var self = this;
|
||||
new instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"]).then(function(res) {
|
||||
self.rpc("/web/action/load", { action_id: "base.action_res_company_form" }).done(function(result) {
|
||||
result.res_id = res['company_id'][0];
|
||||
result.target = "new";
|
||||
result.views = [[false, 'form']];
|
||||
result.flags = {
|
||||
action_buttons: true,
|
||||
};
|
||||
self.action_manager.do_action(result);
|
||||
var form = self.action_manager.dialog_widget.views.form.controller;
|
||||
form.on("on_button_cancel", self.action_manager.dialog, self.action_manager.dialog.close);
|
||||
form.on('record_saved', self, function() {
|
||||
self.action_manager.dialog.close();
|
||||
self.update_logo();
|
||||
});
|
||||
});
|
||||
});
|
||||
return false;
|
||||
},
|
||||
check_timezone: function() {
|
||||
var self = this;
|
||||
return new instance.web.Model('res.users').call('read', [[this.session.uid], ['tz_offset']]).then(function(result) {
|
||||
|
@ -1267,18 +1330,29 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
},
|
||||
on_menu_action: function(options) {
|
||||
var self = this;
|
||||
return this.rpc("/web/action/load", { action_id: options.action_id })
|
||||
return this.menu_dm.add(this.rpc("/web/action/load", { action_id: options.action_id }))
|
||||
.then(function (result) {
|
||||
if (options.needaction) {
|
||||
result.context = new instance.web.CompoundContext(
|
||||
result.context,
|
||||
{search_default_message_unread: true});
|
||||
}
|
||||
return $.when(self.action_manager.do_action(result, {
|
||||
clear_breadcrumbs: true,
|
||||
action_menu_id: self.menu.current_menu,
|
||||
})).fail(function() {
|
||||
self.menu.open_menu(options.previous_menu_id);
|
||||
return self.action_mutex.exec(function() {
|
||||
if (options.needaction) {
|
||||
result.context = new instance.web.CompoundContext(
|
||||
result.context,
|
||||
{search_default_message_unread: true});
|
||||
}
|
||||
var completed = $.Deferred();
|
||||
$.when(self.action_manager.do_action(result, {
|
||||
clear_breadcrumbs: true,
|
||||
action_menu_id: self.menu.current_menu,
|
||||
})).fail(function() {
|
||||
self.menu.open_menu(options.previous_menu_id);
|
||||
}).always(function() {
|
||||
completed.resolve();
|
||||
});
|
||||
setTimeout(function() {
|
||||
completed.resolve();
|
||||
}, 2000);
|
||||
// We block the menu when clicking on an element until the action has correctly finished
|
||||
// loading. If something crash, there is a 2 seconds timeout before it's unblocked.
|
||||
return completed;
|
||||
});
|
||||
});
|
||||
},
|
||||
|
@ -1306,17 +1380,17 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
|
|||
_template: 'EmbedClient',
|
||||
init: function(parent, origin, dbname, login, key, action_id, options) {
|
||||
this._super(parent, origin);
|
||||
|
||||
this.dbname = dbname;
|
||||
this.login = login;
|
||||
this.key = key;
|
||||
this.bind_credentials(dbname, login, key);
|
||||
this.action_id = action_id;
|
||||
this.options = options || {};
|
||||
},
|
||||
start: function() {
|
||||
var self = this;
|
||||
return $.when(this._super()).then(function() {
|
||||
return instance.session.session_authenticate(self.dbname, self.login, self.key, true).then(function() {
|
||||
return self.authenticate().then(function() {
|
||||
if (!self.action_id) {
|
||||
return;
|
||||
}
|
||||
return self.rpc("/web/action/load", { action_id: self.action_id }).done(function(result) {
|
||||
var action = result;
|
||||
action.flags = _.extend({
|
||||
|
@ -1327,11 +1401,30 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
|
|||
//pager : false
|
||||
}, self.options, action.flags || {});
|
||||
|
||||
self.action_manager.do_action(action);
|
||||
self.do_action(action);
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
do_action: function(action) {
|
||||
return this.action_manager.do_action(action);
|
||||
},
|
||||
|
||||
authenticate: function() {
|
||||
var s = instance.session;
|
||||
if (s.session_is_valid() && s.db === this.dbname && s.login === this.login) {
|
||||
return $.when();
|
||||
}
|
||||
return instance.session.session_authenticate(this.dbname, this.login, this.key, true);
|
||||
},
|
||||
|
||||
bind_credentials: function(dbname, login, key) {
|
||||
this.dbname = dbname;
|
||||
this.login = login;
|
||||
this.key = key;
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
instance.web.embed = function (origin, dbname, login, key, action, options) {
|
||||
|
|
|
@ -30,6 +30,12 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
|
|||
* Setup a sessionm
|
||||
*/
|
||||
session_bind: function(origin) {
|
||||
if (!_.isUndefined(this.origin)) {
|
||||
if (this.origin === origin) {
|
||||
return $.when();
|
||||
}
|
||||
throw new Error('Session already bound to ' + this.origin);
|
||||
}
|
||||
var self = this;
|
||||
this.setup(origin);
|
||||
instance.web.qweb.default_dict['_s'] = this.origin;
|
||||
|
@ -119,9 +125,7 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
|
|||
},
|
||||
session_logout: function() {
|
||||
this.set_cookie('session_id', '');
|
||||
var url = "#";
|
||||
$.bbq.pushState(url);
|
||||
window.location.search = "";
|
||||
$.bbq.removeState();
|
||||
return this.rpc("/web/session/destroy", {});
|
||||
},
|
||||
get_cookie: function (name) {
|
||||
|
|
|
@ -341,12 +341,10 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
|
|||
if (this.headless) {
|
||||
this.ready.resolve();
|
||||
} else {
|
||||
var load_view = this.rpc("/web/view/load", {
|
||||
model: this.model,
|
||||
var load_view = instance.web.fields_view_get({
|
||||
model: this.dataset._model,
|
||||
view_id: this.view_id,
|
||||
view_type: 'search',
|
||||
context: instance.web.pyeval.eval(
|
||||
'context', this.dataset.get_context())
|
||||
});
|
||||
|
||||
$.when(load_view).then(function (r) {
|
||||
|
@ -642,7 +640,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
|
|||
.then(this.proxy('setup_default_query'));
|
||||
|
||||
return $.when(drawer_started, defaults_fetched)
|
||||
.done(function () {
|
||||
.then(function () {
|
||||
self.trigger("search_view_loaded", data);
|
||||
self.ready.resolve();
|
||||
});
|
||||
|
|
|
@ -10,7 +10,7 @@ openerp.testing = {};
|
|||
formats: ['coresetup', 'dates'],
|
||||
chrome: ['corelib', 'coresetup'],
|
||||
views: ['corelib', 'coresetup', 'data', 'chrome'],
|
||||
search: ['data', 'coresetup', 'formats'],
|
||||
search: ['views', 'formats'],
|
||||
list: ['views', 'data'],
|
||||
form: ['data', 'views', 'list', 'formats'],
|
||||
list_editable: ['list', 'form', 'data'],
|
||||
|
|
|
@ -128,13 +128,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
self.init_pager();
|
||||
});
|
||||
self.on("load_record", self, self.load_record);
|
||||
this.on('view_loaded', self, self.load_form);
|
||||
instance.web.bus.on('clear_uncommitted_changes', this, function(e) {
|
||||
if (!this.can_be_discarded()) {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
},
|
||||
view_loading: function(r) {
|
||||
return this.load_form(r);
|
||||
},
|
||||
destroy: function() {
|
||||
_.each(this.get_widgets(), function(w) {
|
||||
w.off('focused blurred');
|
||||
|
@ -194,7 +196,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
}
|
||||
this.sidebar.add_items('other', _.compact([
|
||||
self.is_action_enabled('delete') && { label: _t('Delete'), callback: self.on_button_delete },
|
||||
self.is_action_enabled('create') && { label: _t('Duplicate'), callback: self.on_button_duplicate },
|
||||
self.is_action_enabled('create') && { label: _t('Duplicate'), callback: self.on_button_duplicate }
|
||||
]));
|
||||
}
|
||||
|
||||
|
@ -211,7 +213,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
});
|
||||
//bounce effect on red button when click on statusbar.
|
||||
this.$el.find(".oe_form_field_status:not(.oe_form_status_clickable)").on('click', function (e) {
|
||||
if((self.get("actual_mode") == "view")) {
|
||||
if((self.get("actual_mode") == "view")) {
|
||||
var $button = self.$el.find(".oe_highlight:not(.oe_form_invisible)").css({'float':'left','clear':'none'});
|
||||
$button.effect('bounce', {distance:18, times: 5}, 250);
|
||||
e.stopPropagation();
|
||||
|
@ -917,7 +919,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
this.do_update_pager();
|
||||
if (this.sidebar) {
|
||||
this.sidebar.do_attachement_update(this.dataset, this.datarecord.id);
|
||||
}
|
||||
}
|
||||
//openerp.log("The record has been created with id #" + this.datarecord.id);
|
||||
return $.when(this.reload()).then(function () {
|
||||
self.trigger('record_created', r);
|
||||
|
@ -1189,36 +1191,19 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
|
|||
});
|
||||
}
|
||||
},
|
||||
view_arch_to_dom_node: function(arch) {
|
||||
// Historic mess for views arch
|
||||
//
|
||||
// server:
|
||||
// -> got xml as string
|
||||
// -> parse to xml and manipulate domains and contexts
|
||||
// -> convert to json
|
||||
// client:
|
||||
// -> got view as json
|
||||
// -> convert back to xml as string
|
||||
// -> parse it as xml doc (manipulate button@type for IE)
|
||||
// -> convert back to string
|
||||
// -> parse it as dom element with jquery
|
||||
// -> for each widget, convert node to json
|
||||
//
|
||||
// Wow !!!
|
||||
var xml = instance.web.json_node_to_xml(arch);
|
||||
|
||||
var doc = $.parseXML('<div class="oe_form">' + xml + '</div>');
|
||||
get_arch_fragment: function() {
|
||||
var doc = $.parseXML(instance.web.json_node_to_xml(this.fvg.arch)).documentElement;
|
||||
// IE won't allow custom button@type and will revert it to spec default : 'submit'
|
||||
$('button', doc).each(function() {
|
||||
$(this).attr('data-button-type', $(this).attr('type')).attr('type', 'button');
|
||||
});
|
||||
xml = instance.web.xml_to_str(doc);
|
||||
return $(xml);
|
||||
return $('<div class="oe_form"/>').append(instance.web.xml_to_str(doc));
|
||||
},
|
||||
render_to: function($target) {
|
||||
var self = this;
|
||||
this.$target = $target;
|
||||
|
||||
this.$form = this.view_arch_to_dom_node(this.fvg.arch);
|
||||
this.$form = this.get_arch_fragment();
|
||||
|
||||
this.process_version();
|
||||
|
||||
|
@ -1711,6 +1696,10 @@ instance.web.form.compute_domain = function(expr, fields) {
|
|||
return _.all(stack, _.identity);
|
||||
};
|
||||
|
||||
instance.web.form.is_bin_size = function(v) {
|
||||
return /^\d+(\.\d*)? \w+$/.test(v);
|
||||
};
|
||||
|
||||
/**
|
||||
* Must be applied over an class already possessing the PropertiesMixin.
|
||||
*
|
||||
|
@ -2233,19 +2222,28 @@ instance.web.form.ReinitializeFieldMixin = _.extend({}, instance.web.form.Reini
|
|||
instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
|
||||
template: 'FieldChar',
|
||||
widget_class: 'oe_form_field_char',
|
||||
events: {
|
||||
'change input': 'store_dom_value',
|
||||
},
|
||||
init: function (field_manager, node) {
|
||||
this._super(field_manager, node);
|
||||
this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
|
||||
},
|
||||
initialize_content: function() {
|
||||
var self = this;
|
||||
var $input = this.$el.find('input');
|
||||
$input.change(function() {
|
||||
if(self.is_syntax_valid()){
|
||||
self.internal_set_value(self.parse_value($input.val()));
|
||||
}
|
||||
});
|
||||
this.setupFocus($input);
|
||||
this.setupFocus(this.$('input'));
|
||||
},
|
||||
store_dom_value: function () {
|
||||
if (!this.get('effective_readonly')
|
||||
&& this.$('input').length
|
||||
&& this.is_syntax_valid()) {
|
||||
this.internal_set_value(
|
||||
this.parse_value(
|
||||
this.$('input').val()));
|
||||
}
|
||||
},
|
||||
commit_value: function () {
|
||||
this.store_dom_value();
|
||||
return this._super();
|
||||
},
|
||||
render_value: function() {
|
||||
var show_value = this.format_value(this.get('value'), '');
|
||||
|
@ -2261,7 +2259,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
|
|||
is_syntax_valid: function() {
|
||||
if (!this.get("effective_readonly") && this.$("input").size() > 0) {
|
||||
try {
|
||||
var value_ = this.parse_value(this.$el.find('input').val(), '');
|
||||
this.parse_value(this.$('input').val(), '');
|
||||
return true;
|
||||
} catch(e) {
|
||||
return false;
|
||||
|
@ -2279,7 +2277,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
|
|||
return this.get('value') === '' || this._super();
|
||||
},
|
||||
focus: function() {
|
||||
this.$('input:first').focus();
|
||||
this.$('input:first')[0].focus();
|
||||
},
|
||||
set_dimensions: function (height, width) {
|
||||
this._super(height, width);
|
||||
|
@ -2291,7 +2289,10 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
|
|||
});
|
||||
|
||||
instance.web.form.FieldID = instance.web.form.FieldChar.extend({
|
||||
|
||||
process_modifiers: function () {
|
||||
this._super();
|
||||
this.set({ readonly: true });
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.form.FieldEmail = instance.web.form.FieldChar.extend({
|
||||
|
@ -2380,6 +2381,9 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
|
|||
template: "web.datepicker",
|
||||
jqueryui_object: 'datetimepicker',
|
||||
type_of_date: "datetime",
|
||||
events: {
|
||||
'change .oe_datepicker_master': 'change_datetime',
|
||||
},
|
||||
init: function(parent) {
|
||||
this._super(parent);
|
||||
this.name = parent.name;
|
||||
|
@ -2388,10 +2392,7 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
|
|||
var self = this;
|
||||
this.$input = this.$el.find('input.oe_datepicker_master');
|
||||
this.$input_picker = this.$el.find('input.oe_datepicker_container');
|
||||
this.$input.change(function(){
|
||||
self.change_datetime();
|
||||
});
|
||||
|
||||
|
||||
this.picker({
|
||||
onClose: this.on_picker_select,
|
||||
onSelect: this.on_picker_select,
|
||||
|
@ -2464,7 +2465,10 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
|
|||
this.set_value_from_ui_();
|
||||
this.trigger("datetime_changed");
|
||||
}
|
||||
}
|
||||
},
|
||||
commit_value: function () {
|
||||
this.change_datetime();
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.DateWidget = instance.web.DateTimeWidget.extend({
|
||||
|
@ -2511,7 +2515,7 @@ instance.web.form.FieldDatetime = instance.web.form.AbstractField.extend(instanc
|
|||
},
|
||||
focus: function() {
|
||||
if (this.datewidget && this.datewidget.$input) {
|
||||
this.datewidget.$input.focus();
|
||||
this.datewidget.$input[0].focus();
|
||||
}
|
||||
},
|
||||
set_dimensions: function (height, width) {
|
||||
|
@ -2529,40 +2533,56 @@ instance.web.form.FieldDate = instance.web.form.FieldDatetime.extend({
|
|||
|
||||
instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
|
||||
template: 'FieldText',
|
||||
events: {
|
||||
'keyup': function (e) {
|
||||
if (e.which === $.ui.keyCode.ENTER) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
},
|
||||
'change textarea': 'store_dom_value',
|
||||
},
|
||||
init: function (field_manager, node) {
|
||||
this._super(field_manager, node);
|
||||
},
|
||||
initialize_content: function() {
|
||||
var self = this;
|
||||
this.$textarea = this.$el.find('textarea');
|
||||
this.auto_sized = false;
|
||||
this.default_height = this.$textarea.css('height');
|
||||
if (!this.get("effective_readonly")) {
|
||||
this.$textarea.change(_.bind(function() {
|
||||
self.internal_set_value(instance.web.parse_value(self.$textarea.val(), self));
|
||||
}, this));
|
||||
} else {
|
||||
if (this.get("effective_readonly")) {
|
||||
this.$textarea.attr('disabled', 'disabled');
|
||||
}
|
||||
this.$el.keyup(function (e) {
|
||||
if (e.which === $.ui.keyCode.ENTER) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
});
|
||||
this.setupFocus(this.$textarea);
|
||||
},
|
||||
commit_value: function () {
|
||||
this.store_dom_value();
|
||||
return this._super();
|
||||
},
|
||||
store_dom_value: function () {
|
||||
if (!this.get('effective_readonly') && this.$('textarea').length) {
|
||||
this.internal_set_value(
|
||||
instance.web.parse_value(
|
||||
this.$textarea.val(),
|
||||
this));
|
||||
}
|
||||
},
|
||||
render_value: function() {
|
||||
$(window).resize();
|
||||
var show_value = instance.web.format_value(this.get('value'), this, '');
|
||||
if (show_value === '') {
|
||||
this.$textarea.css('height', parseInt(this.default_height)+"px");
|
||||
}
|
||||
this.$textarea.val(show_value);
|
||||
this.$textarea.autosize();
|
||||
if (! this.auto_sized) {
|
||||
this.auto_sized = true;
|
||||
this.$textarea.autosize();
|
||||
} else {
|
||||
this.$textarea.trigger("autosize");
|
||||
}
|
||||
},
|
||||
is_syntax_valid: function() {
|
||||
if (!this.get("effective_readonly") && this.$textarea) {
|
||||
try {
|
||||
var value_ = instance.web.parse_value(this.$textarea.val(), this, '');
|
||||
instance.web.parse_value(this.$textarea.val(), this, '');
|
||||
return true;
|
||||
} catch(e) {
|
||||
return false;
|
||||
|
@ -2574,7 +2594,7 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we
|
|||
return this.get('value') === '' || this._super();
|
||||
},
|
||||
focus: function($el) {
|
||||
this.$textarea.focus();
|
||||
this.$textarea[0].focus();
|
||||
},
|
||||
set_dimensions: function (height, width) {
|
||||
this._super(height, width);
|
||||
|
@ -2655,7 +2675,7 @@ instance.web.form.FieldBoolean = instance.web.form.AbstractField.extend({
|
|||
this.$checkbox[0].checked = this.get('value');
|
||||
},
|
||||
focus: function() {
|
||||
this.$checkbox.focus();
|
||||
this.$checkbox[0].focus();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -2677,16 +2697,16 @@ instance.web.form.FieldProgressBar = instance.web.form.AbstractField.extend({
|
|||
|
||||
instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
|
||||
template: 'FieldSelection',
|
||||
events: {
|
||||
'change select': 'store_dom_value',
|
||||
},
|
||||
init: function(field_manager, node) {
|
||||
var self = this;
|
||||
this._super(field_manager, node);
|
||||
this.values = _.clone(this.field.selection);
|
||||
_.each(this.values, function(v, i) {
|
||||
if (v[0] === false && v[1] === '') {
|
||||
self.values.splice(i, 1);
|
||||
}
|
||||
});
|
||||
this.values.unshift([false, '']);
|
||||
this.values = _(this.field.selection).chain()
|
||||
.reject(function (v) { return v[0] === false && v[1] === ''; })
|
||||
.unshift([false, ''])
|
||||
.value();
|
||||
},
|
||||
initialize_content: function() {
|
||||
// Flag indicating whether we're in an event chain containing a change
|
||||
|
@ -2702,9 +2722,6 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
|
|||
// row
|
||||
var ischanging = false;
|
||||
var $select = this.$el.find('select')
|
||||
.change(_.bind(function() {
|
||||
this.internal_set_value(this.values[this.$el.find('select')[0].selectedIndex][0]);
|
||||
}, this))
|
||||
.change(function () { ischanging = true; })
|
||||
.click(function () { ischanging = false; })
|
||||
.keyup(function (e) {
|
||||
|
@ -2714,6 +2731,16 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
|
|||
});
|
||||
this.setupFocus($select);
|
||||
},
|
||||
commit_value: function () {
|
||||
this.store_dom_value();
|
||||
return this._super();
|
||||
},
|
||||
store_dom_value: function () {
|
||||
if (!this.get('effective_readonly') && this.$('select').length) {
|
||||
this.internal_set_value(
|
||||
this.values[this.$('select')[0].selectedIndex][0]);
|
||||
}
|
||||
},
|
||||
set_value: function(value_) {
|
||||
value_ = value_ === null ? false : value_;
|
||||
value_ = value_ instanceof Array ? value_[0] : value_;
|
||||
|
@ -2734,7 +2761,7 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
|
|||
}
|
||||
},
|
||||
focus: function() {
|
||||
this.$el.find('select:first').focus();
|
||||
this.$('select:first')[0].focus();
|
||||
},
|
||||
set_dimensions: function (height, width) {
|
||||
this._super(height, width);
|
||||
|
@ -2930,6 +2957,15 @@ instance.web.form.M2ODialog = instance.web.Dialog.extend({
|
|||
|
||||
instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instance.web.form.CompletionFieldMixin, instance.web.form.ReinitializeFieldMixin, {
|
||||
template: "FieldMany2One",
|
||||
events: {
|
||||
'keydown input': function (e) {
|
||||
switch (e.which) {
|
||||
case $.ui.keyCode.UP:
|
||||
case $.ui.keyCode.DOWN:
|
||||
e.stopPropagation();
|
||||
}
|
||||
}
|
||||
},
|
||||
init: function(field_manager, node) {
|
||||
this._super(field_manager, node);
|
||||
instance.web.form.CompletionFieldMixin.init.call(this);
|
||||
|
@ -3211,7 +3247,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
|||
},
|
||||
focus: function () {
|
||||
if (!this.get('effective_readonly')) {
|
||||
this.$input.focus();
|
||||
this.$input[0].focus();
|
||||
}
|
||||
},
|
||||
_quick_create: function() {
|
||||
|
@ -4061,6 +4097,9 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
|
|||
add_id: function(id) {
|
||||
this.set({'value': _.uniq(this.get('value').concat([id]))});
|
||||
},
|
||||
focus: function () {
|
||||
this.$text[0].focus();
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
|
@ -4397,7 +4436,7 @@ instance.web.form.Many2ManyQuickCreate = instance.web.Widget.extend({
|
|||
});
|
||||
},
|
||||
focus: function() {
|
||||
this.$text.focus();
|
||||
this.$text[0].focus();
|
||||
},
|
||||
add_id: function(id) {
|
||||
var self = this;
|
||||
|
@ -4845,11 +4884,6 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
|
|||
if (!value) {
|
||||
this.do_warn(_t("Save As..."), _t("The field is empty, there's nothing to save !"));
|
||||
ev.stopPropagation();
|
||||
} else if (this._dirty_flag) {
|
||||
var link = this.$('.oe_form_binary_file_save_data')[0];
|
||||
link.download = this.filename || "download.bin"; // Works on only on Google Chrome
|
||||
//link.target = '_blank';
|
||||
link.href = "data:application/octet-stream;base64," + value;
|
||||
} else {
|
||||
instance.web.blockUI();
|
||||
var c = instance.webclient.crashmanager;
|
||||
|
@ -4860,6 +4894,7 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
|
|||
id: (this.view.datarecord.id || ''),
|
||||
field: this.name,
|
||||
filename_field: (this.node.attrs.filename || ''),
|
||||
data: instance.web.form.is_bin_size(value) ? null : value,
|
||||
context: this.view.dataset.get_context()
|
||||
})},
|
||||
complete: instance.web.unblockUI,
|
||||
|
@ -4939,7 +4974,7 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
|
|||
render_value: function() {
|
||||
var self = this;
|
||||
var url;
|
||||
if (this.get('value') && ! /^\d+(\.\d*)? \w+$/.test(this.get('value'))) {
|
||||
if (this.get('value') && !instance.web.form.is_bin_size(this.get('value'))) {
|
||||
url = 'data:image/png;base64,' + this.get('value');
|
||||
} else if (this.get('value')) {
|
||||
var id = JSON.stringify(this.view.datarecord.id || null);
|
||||
|
@ -5040,7 +5075,7 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
this._super( ids );
|
||||
},
|
||||
get_value: function() {
|
||||
return _.map(this.get('value'), function (value) { return commands.link_to( value.id ); });
|
||||
return _.map(this.get('value'), function (value) { return commands.link_to( isNaN(value) ? value.id : value ); });
|
||||
},
|
||||
get_file_url: function (attachment) {
|
||||
return this.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: attachment['id']});
|
||||
|
@ -5060,7 +5095,7 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
_.each(datas, function (data) {
|
||||
data.no_unlink = true;
|
||||
data.url = self.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: data.id});
|
||||
|
||||
|
||||
_.each(self.get('value'), function (val, key) {
|
||||
if(val == data.id) {
|
||||
self.get('value')[key] = data;
|
||||
|
@ -5134,6 +5169,8 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
}
|
||||
},
|
||||
on_file_loaded: function (event, result) {
|
||||
var files = this.get('value');
|
||||
|
||||
// unblock UI
|
||||
if(this.node.attrs.blockui>0) {
|
||||
instance.web.unblockUI();
|
||||
|
@ -5141,15 +5178,19 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
|
||||
// TODO : activate send on wizard and form
|
||||
|
||||
var files = this.get('value');
|
||||
for(var i in files){
|
||||
if(files[i].filename == result.filename && files[i].upload) {
|
||||
files[i] = {
|
||||
'id': result.id,
|
||||
'name': result.name,
|
||||
'filename': result.filename,
|
||||
'url': this.get_file_url(result)
|
||||
};
|
||||
if (result.error || !result.id ) {
|
||||
this.do_warn( _t('Uploading error'), result.error);
|
||||
files = _.filter(files, function (val) { return !val.upload; });
|
||||
} else {
|
||||
for(var i in files){
|
||||
if(files[i].filename == result.filename && files[i].upload) {
|
||||
files[i] = {
|
||||
'id': result.id,
|
||||
'name': result.name,
|
||||
'filename': result.filename,
|
||||
'url': this.get_file_url(result)
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5220,7 +5261,8 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
|
|||
if (this.field.type == "many2one") {
|
||||
var domain = [];
|
||||
if(!_.isEmpty(this.field.domain) || !_.isEmpty(this.node.attrs.domain)) {
|
||||
domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.get('value')]]);
|
||||
var d = instance.web.pyeval.eval('domain', self.build_domain());
|
||||
domain = ['|', ['id', '=', self.get('value')]].concat(d);
|
||||
}
|
||||
var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
|
||||
return ds.read_slice(['name'], {}).then(function (records) {
|
||||
|
|
|
@ -90,7 +90,9 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
|
|||
|
||||
this.no_leaf = false;
|
||||
this.grouped = false;
|
||||
this.on('view_loaded', self, self.load_list);
|
||||
},
|
||||
view_loading: function(r) {
|
||||
return this.load_list(r);
|
||||
},
|
||||
set_default_options: function (options) {
|
||||
this._super(options);
|
||||
|
@ -952,12 +954,18 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.
|
|||
field = $target.closest('td').data('field'),
|
||||
$row = $target.closest('tr'),
|
||||
record_id = self.row_id($row);
|
||||
|
||||
if ($target.attr('disabled')) {
|
||||
return;
|
||||
}
|
||||
$target.attr('disabled', 'disabled');
|
||||
|
||||
// note: $.data converts data to number if it's composed only
|
||||
// of digits, nice when storing actual numbers, not nice when
|
||||
// storing strings composed only of digits. Force the action
|
||||
// name to be a string
|
||||
$(self).trigger('action', [field.toString(), record_id, function (id) {
|
||||
$target.removeAttr('disabled');
|
||||
return self.reload_record(self.records.get(id));
|
||||
}]);
|
||||
})
|
||||
|
|
|
@ -105,8 +105,15 @@ openerp.web.list_editable = function (instance) {
|
|||
* Replace do_search to handle editability process
|
||||
*/
|
||||
do_search: function(domain, context, group_by) {
|
||||
this._context_editable = !!context.set_editable;
|
||||
this._super.apply(this, arguments);
|
||||
var self=this, _super = self._super, args=arguments;
|
||||
var ready = this.editor.is_editing()
|
||||
? this.cancel_edition(true)
|
||||
: $.when();
|
||||
|
||||
return ready.then(function () {
|
||||
self._context_editable = !!context.set_editable;
|
||||
return _super.apply(self, args);
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Replace do_add_record to handle editability (and adding new record
|
||||
|
|
|
@ -9,6 +9,7 @@ var QWeb = instance.web.qweb,
|
|||
instance.web.views.add('tree', 'instance.web.TreeView');
|
||||
instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeView# */{
|
||||
display_name: _lt('Tree'),
|
||||
view_type: 'tree',
|
||||
/**
|
||||
* Indicates that this view is not searchable, and thus that no search
|
||||
* view should be displayed (if there is one active).
|
||||
|
@ -38,16 +39,10 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie
|
|||
_.bindAll(this, 'color_for');
|
||||
},
|
||||
|
||||
start: function () {
|
||||
return this.rpc("/web/treeview/load", {
|
||||
model: this.model,
|
||||
view_id: this.view_id,
|
||||
view_type: "tree",
|
||||
toolbar: this.view_manager ? !!this.view_manager.sidebar : false,
|
||||
context: instance.web.pyeval.eval(
|
||||
'context', this.dataset.get_context())
|
||||
}).done(this.on_loaded);
|
||||
view_loading: function(r) {
|
||||
return this.load_tree(r);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the list of fields needed to correctly read objects.
|
||||
*
|
||||
|
@ -64,7 +59,7 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie
|
|||
}
|
||||
return fields;
|
||||
},
|
||||
on_loaded: function (fields_view) {
|
||||
load_tree: function (fields_view) {
|
||||
var self = this;
|
||||
var has_toolbar = !!fields_view.arch.attrs.toolbar;
|
||||
// field name in OpenERP is kinda stupid: this is the name of the field
|
||||
|
|
|
@ -467,6 +467,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
this.flags = flags || {};
|
||||
this.registry = instance.web.views;
|
||||
this.views_history = [];
|
||||
this.view_completely_inited = $.Deferred();
|
||||
},
|
||||
/**
|
||||
* @returns {jQuery.Deferred} initial view loading promise
|
||||
|
@ -586,6 +587,8 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
&& self.flags.auto_search
|
||||
&& view.controller.searchable !== false) {
|
||||
self.searchview.ready.done(self.searchview.do_search);
|
||||
} else {
|
||||
self.view_completely_inited.resolve();
|
||||
}
|
||||
self.trigger("controller_inited",view_type,controller);
|
||||
});
|
||||
|
@ -700,7 +703,9 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
if (_.isString(groupby)) {
|
||||
groupby = [groupby];
|
||||
}
|
||||
controller.do_search(results.domain, results.context, groupby || []);
|
||||
$.when(controller.do_search(results.domain, results.context, groupby || [])).then(function() {
|
||||
self.view_completely_inited.resolve();
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
|
@ -782,7 +787,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
|
|||
|
||||
var main_view_loaded = this._super();
|
||||
|
||||
var manager_ready = $.when(searchview_loaded, main_view_loaded);
|
||||
var manager_ready = $.when(searchview_loaded, main_view_loaded, this.view_completely_inited);
|
||||
|
||||
this.$el.find('.oe_debug_view').change(this.on_debug_changed);
|
||||
this.$el.addClass("oe_view_manager_" + (this.action.target || 'current'));
|
||||
|
@ -1027,6 +1032,11 @@ instance.web.Sidebar = instance.web.Widget.extend({
|
|||
this.$('.oe_form_dropdown_section').each(function() {
|
||||
$(this).toggle(!!$(this).find('li').length);
|
||||
});
|
||||
|
||||
self.$("[title]").tipsy({
|
||||
'html': true,
|
||||
'delayIn': 500,
|
||||
})
|
||||
},
|
||||
/**
|
||||
* For each item added to the section:
|
||||
|
@ -1110,27 +1120,19 @@ instance.web.Sidebar = instance.web.Widget.extend({
|
|||
});
|
||||
});
|
||||
},
|
||||
do_attachement_update: function(dataset, model_id,args) {
|
||||
do_attachement_update: function(dataset, model_id, args) {
|
||||
var self = this;
|
||||
this.dataset = dataset;
|
||||
this.model_id = model_id;
|
||||
if (args && args[0]["erorr"]) {
|
||||
instance.web.dialog($('<div>'),{
|
||||
modal: true,
|
||||
title: "OpenERP " + _.str.capitalize(args[0]["title"]),
|
||||
buttons: [{
|
||||
text: _t("Ok"),
|
||||
click: function(){
|
||||
$(this).dialog("close");
|
||||
}}]
|
||||
}).html(args[0]["erorr"]);
|
||||
if (args && args[0].error) {
|
||||
this.do_warn( instance.web.qweb.render('message_error_uploading'), args[0].error);
|
||||
}
|
||||
if (!model_id) {
|
||||
this.on_attachments_loaded([]);
|
||||
} else {
|
||||
var dom = [ ['res_model', '=', dataset.model], ['res_id', '=', model_id], ['type', 'in', ['binary', 'url']] ];
|
||||
var ds = new instance.web.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom);
|
||||
ds.read_slice(['name', 'url', 'type'], {}).done(this.on_attachments_loaded);
|
||||
ds.read_slice(['name', 'url', 'type', 'create_uid', 'create_date', 'write_uid', 'write_date'], {}).done(this.on_attachments_loaded);
|
||||
}
|
||||
},
|
||||
on_attachments_loaded: function(attachments) {
|
||||
|
@ -1189,33 +1191,36 @@ instance.web.View = instance.web.Widget.extend({
|
|||
},
|
||||
load_view: function(context) {
|
||||
var self = this;
|
||||
var view_loaded;
|
||||
var view_loaded_def;
|
||||
if (this.embedded_view) {
|
||||
view_loaded = $.Deferred();
|
||||
view_loaded_def = $.Deferred();
|
||||
$.async_when().done(function() {
|
||||
view_loaded.resolve(self.embedded_view);
|
||||
view_loaded_def.resolve(self.embedded_view);
|
||||
});
|
||||
} else {
|
||||
if (! this.view_type)
|
||||
console.warn("view_type is not defined", this);
|
||||
view_loaded = this.rpc("/web/view/load", {
|
||||
"model": this.dataset.model,
|
||||
view_loaded_def = instance.web.fields_view_get({
|
||||
"model": this.dataset._model,
|
||||
"view_id": this.view_id,
|
||||
"view_type": this.view_type,
|
||||
toolbar: !!this.options.$sidebar,
|
||||
context: instance.web.pyeval.eval(
|
||||
'context', this.dataset.get_context(context))
|
||||
"toolbar": !!this.options.$sidebar,
|
||||
});
|
||||
}
|
||||
return view_loaded.then(function(r) {
|
||||
self.trigger('view_loaded', r);
|
||||
return view_loaded_def.then(function(r) {
|
||||
self.fields_view = r;
|
||||
// add css classes that reflect the (absence of) access rights
|
||||
self.$el.addClass('oe_view')
|
||||
.toggleClass('oe_cannot_create', !self.is_action_enabled('create'))
|
||||
.toggleClass('oe_cannot_edit', !self.is_action_enabled('edit'))
|
||||
.toggleClass('oe_cannot_delete', !self.is_action_enabled('delete'));
|
||||
return $.when(self.view_loading(r)).then(function() {
|
||||
self.trigger('view_loaded', r);
|
||||
});
|
||||
});
|
||||
},
|
||||
view_loading: function(r) {
|
||||
},
|
||||
set_default_options: function(options) {
|
||||
this.options = options || {};
|
||||
_.defaults(this.options, {
|
||||
|
@ -1379,12 +1384,53 @@ instance.web.View = instance.web.Widget.extend({
|
|||
}
|
||||
});
|
||||
|
||||
instance.web.xml_to_json = function(node) {
|
||||
/**
|
||||
* Performs a fields_view_get and apply postprocessing.
|
||||
* return a {$.Deferred} resolved with the fvg
|
||||
*
|
||||
* @param {Object} [args]
|
||||
* @param {String|Object} args.model instance.web.Model instance or string repr of the model
|
||||
* @param {null|Object} args.context context if args.model is a string
|
||||
* @param {null|Number} args.view_id id of the view to be loaded, default view if null
|
||||
* @param {null|String} args.view_type type of view to be loaded if view_id is null
|
||||
* @param {Boolean} [args.toolbar=false] get the toolbar definition
|
||||
*/
|
||||
instance.web.fields_view_get = function(args) {
|
||||
function postprocess(fvg) {
|
||||
var doc = $.parseXML(fvg.arch).documentElement;
|
||||
fvg.arch = instance.web.xml_to_json(doc, (doc.nodeName.toLowerCase() !== 'kanban'));
|
||||
if ('id' in fvg.fields) {
|
||||
// Special case for id's
|
||||
var id_field = fvg.fields['id'];
|
||||
id_field.original_type = id_field.type;
|
||||
id_field.type = 'id';
|
||||
}
|
||||
_.each(fvg.fields, function(field) {
|
||||
_.each(field.views || {}, function(view) {
|
||||
postprocess(view);
|
||||
});
|
||||
});
|
||||
return fvg;
|
||||
}
|
||||
args = _.defaults(args, {
|
||||
toolbar: false,
|
||||
});
|
||||
var model = args.model;
|
||||
if (typeof model === 'string') {
|
||||
model = new instance.web.Model(args.model, args.context);
|
||||
}
|
||||
return args.model.call('fields_view_get', [args.view_id, args.view_type, model.context(), args.toolbar]).then(function(fvg) {
|
||||
return postprocess(fvg);
|
||||
});
|
||||
};
|
||||
|
||||
instance.web.xml_to_json = function(node, strip_whitespace) {
|
||||
switch (node.nodeType) {
|
||||
case 9:
|
||||
return instance.web.xml_to_json(node.documentElement, strip_whitespace);
|
||||
case 3:
|
||||
case 4:
|
||||
return node.data;
|
||||
break;
|
||||
return (strip_whitespace && node.data.trim() === '') ? undefined : node.data;
|
||||
case 1:
|
||||
var attrs = $(node).getAttributes();
|
||||
_.each(['domain', 'filter_domain', 'context', 'default_get'], function(key) {
|
||||
|
@ -1397,7 +1443,9 @@ instance.web.xml_to_json = function(node) {
|
|||
return {
|
||||
tag: node.tagName.toLowerCase(),
|
||||
attrs: attrs,
|
||||
children: _.map(node.childNodes, instance.web.xml_to_json)
|
||||
children: _.compact(_.map(node.childNodes, function(node) {
|
||||
return instance.web.xml_to_json(node, strip_whitespace);
|
||||
})),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1449,26 +1497,6 @@ instance.web.xml_to_str = function(node) {
|
|||
throw new Error(_t("Could not serialize XML"));
|
||||
}
|
||||
};
|
||||
instance.web.str_to_xml = function(s) {
|
||||
if (window.DOMParser) {
|
||||
var dp = new DOMParser();
|
||||
var r = dp.parseFromString(s, "text/xml");
|
||||
if (r.body && r.body.firstChild && r.body.firstChild.nodeName == 'parsererror') {
|
||||
throw new Error(_t("Could not parse string to xml"));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
var xDoc;
|
||||
try {
|
||||
xDoc = new ActiveXObject("MSXML2.DOMDocument");
|
||||
} catch (e) {
|
||||
throw new Error(_.str.sprintf( _t("Could not find a DOM Parser: %s"), e.message));
|
||||
}
|
||||
xDoc.async = false;
|
||||
xDoc.preserveWhiteSpace = true;
|
||||
xDoc.loadXML(s);
|
||||
return xDoc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registry for all the main views
|
||||
|
|
|
@ -36,11 +36,11 @@
|
|||
<t t-name="CrashManager.warning">
|
||||
<table cellspacing="0" cellpadding="0" border="0" class="oe_dialog_warning">
|
||||
<tr>
|
||||
<td><img t-att-src='_s + "/web/static/src/img/warning.png"' class="oe_dialog_icon"/></td>
|
||||
<td class="oe_dialog_icon"><img t-att-src='_s + "/web/static/src/img/warning.png"'/></td>
|
||||
<td>
|
||||
<p>
|
||||
<t t-js="d">
|
||||
var message = d.message ? d.message : d.error.data.fault_code;
|
||||
var message = d.error.message ? d.error.message : d.error.data.fault_code;
|
||||
d.html_error = context.engine.tools.html_escape(message)
|
||||
.replace(/\n/g, '<br/>');
|
||||
</t>
|
||||
|
@ -348,16 +348,14 @@
|
|||
<li t-foreach="widget.data.data.children" t-as="menu">
|
||||
<t t-call="Menu.link"/>
|
||||
</li>
|
||||
<li class="oe_menu_more_container" style="display: none;">
|
||||
<span class="oe_topbar_item oe_menu_more_link oe_dropdown_toggle oe_dropdown_arrow">
|
||||
More
|
||||
<ul class="oe_menu_more oe_dropdown_menu"/>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</t>
|
||||
<t t-name="Menu.more">
|
||||
<li class="oe_menu_more_container">
|
||||
<span class="oe_topbar_item oe_menu_more_link oe_dropdown_toggle oe_dropdown_arrow">
|
||||
More
|
||||
<ul class="oe_menu_more oe_dropdown_menu"/>
|
||||
</span>
|
||||
</li>
|
||||
</t>
|
||||
<t t-name="Menu.secondary">
|
||||
<div t-foreach="widget.data.data.children" t-as="menu" style="display: none" class="oe_secondary_menu" t-att-data-menu-parent="menu.id">
|
||||
<t t-foreach="menu.children" t-as="menu">
|
||||
|
@ -388,14 +386,16 @@
|
|||
t-att-data-action-model="menu.action ? menu.action.split(',')[0] : ''"
|
||||
t-att-data-action-id="menu.action ? menu.action.split(',')[1] : ''">
|
||||
<t t-esc="menu.name"/>
|
||||
<t t-if="menu.needaction_enabled and menu.needaction_counter">
|
||||
<div class="oe_tag oe_tag_dark oe_menu_counter">
|
||||
<t t-if="menu.needaction_counter > 99"> 99+ </t><t t-if="menu.needaction_counter <= 99"> <t t-esc="menu.needaction_counter"/> </t>
|
||||
</div>
|
||||
</t>
|
||||
</a>
|
||||
</t>
|
||||
|
||||
<t t-name="Menu.needaction_counter">
|
||||
<div class="oe_tag oe_tag_dark oe_menu_counter">
|
||||
<t t-if="widget.needaction_counter > 99"> 99+ </t>
|
||||
<t t-if="widget.needaction_counter <= 99"> <t t-esc="widget.needaction_counter"/> </t>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-name="UserMenu">
|
||||
<span class="oe_user_menu oe_topbar_item oe_dropdown_toggle oe_dropdown_arrow">
|
||||
<img class="oe_topbar_avatar" t-att-data-default-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
|
||||
|
@ -436,7 +436,11 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td class="oe_leftbar" valign="top">
|
||||
<a class="oe_logo" t-attf-href="/?ts=#{Date.now()}"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
|
||||
<t t-set="debug" t-value="__debug__ ? '&debug' : ''"/>
|
||||
<a class="oe_logo" t-attf-href="/?ts=#{Date.now()}#{debug}">
|
||||
<span class="oe_logo_edit">Edit Company data</span>
|
||||
<img t-att-src='widget.session.url("/web/binary/company_logo")'/>
|
||||
</a>
|
||||
<div class="oe_secondary_menus_container"/>
|
||||
<div class="oe_footer">
|
||||
Powered by <a href="http://www.openerp.com" target="_blank"><span>OpenERP</span></a>
|
||||
|
@ -599,7 +603,23 @@
|
|||
</button>
|
||||
<ul class="oe_dropdown_menu">
|
||||
<li t-foreach="widget.items[section.name]" t-as="item" t-att-class="item.classname">
|
||||
<a class="oe_sidebar_action_a" t-att-title="item.title" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url" target="_blank">
|
||||
<t t-if="section.name == 'files'">
|
||||
<t t-set="item.title">
|
||||
<b>Attachment : </b><br/>
|
||||
<t t-raw="item.name"/>
|
||||
</t>
|
||||
<t t-if="item.create_uid and item.create_uid[0]" t-set="item.title">
|
||||
<t t-raw="item.title"/><br/>
|
||||
<b>Created by : </b><br/>
|
||||
<t t-raw="item.create_uid[1] + ' ' + item.create_date"/>
|
||||
</t>
|
||||
<t t-if="item.create_uid and item.write_uid and item.create_uid[0] != item.write_uid[0]" t-set="item.title">
|
||||
<t t-raw="item.title"/><br/>
|
||||
<b>Modified by : </b><br/>
|
||||
<t t-raw="item.write_uid[1] + ' ' + item.write_date"/>
|
||||
</t>
|
||||
</t>
|
||||
<a class="oe_sidebar_action_a" t-att-title="item.title or ''" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url" target="_blank">
|
||||
<t t-raw="item.label"/>
|
||||
</a>
|
||||
<a t-if="section.name == 'files' and !item.callback" class="oe_sidebar_delete_item" t-att-data-id="item.id" title="Delete this attachment">x</a>
|
||||
|
@ -1054,7 +1074,10 @@
|
|||
t-att-autofocus="widget.node.attrs.autofocus"
|
||||
t-att-id="widget.id_for_label">
|
||||
<t t-foreach="widget.values" t-as="option">
|
||||
<option><t t-esc="widget.node.attrs.placeholder" t-if="option[0] == false and widget.node.attrs.placeholder"/><t t-esc="option[1]" t-if="option[0] != false"/></option>
|
||||
<option>
|
||||
<t t-esc="widget.node.attrs.placeholder" t-if="option[0] === false and widget.node.attrs.placeholder"/>
|
||||
<t t-esc="option[1]" t-if="option[0] !== false"/>
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
</span>
|
||||
|
@ -1346,7 +1369,7 @@
|
|||
</t>
|
||||
<t t-name="SelectCreatePopup.search.buttons">
|
||||
<t t-if="! widget.options.disable_multiple_selection">
|
||||
<button type="button" class="oe_button oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
|
||||
<button type="button" class="oe_button oe_selectcreatepopup-search-select oe_highlight" disabled="disabled">Select</button>
|
||||
</t>
|
||||
<button type="button" class="oe_button oe_selectcreatepopup-search-create">Create</button>
|
||||
or <a class="oe_button oe_selectcreatepopup-search-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Cancel</a>
|
||||
|
|
|
@ -4,27 +4,37 @@ openerp.testing.section('eval.types', {
|
|||
instance.session.uid = 42;
|
||||
}
|
||||
}, function (test) {
|
||||
test('strftime', function (instance) {
|
||||
var d = new Date();
|
||||
var makeTimeCheck = function (instance) {
|
||||
var context = instance.web.pyeval.context();
|
||||
strictEqual(
|
||||
py.eval("time.strftime('%Y')", context),
|
||||
String(d.getFullYear()));
|
||||
strictEqual(
|
||||
py.eval("time.strftime('%Y')+'-01-30'", context),
|
||||
String(d.getFullYear()) + '-01-30');
|
||||
strictEqual(
|
||||
py.eval("time.strftime('%Y-%m-%d %H:%M:%S')", context),
|
||||
_.str.sprintf('%04d-%02d-%02d %02d:%02d:%02d',
|
||||
return function (expr, func, message) {
|
||||
// evaluate expr between two calls to new Date(), and check that
|
||||
// the result is between the transformed dates
|
||||
var d0 = new Date;
|
||||
var result = py.eval(expr, context);
|
||||
var d1 = new Date;
|
||||
ok(func(d0) <= result && result <= func(d1), message);
|
||||
};
|
||||
};
|
||||
test('strftime', function (instance) {
|
||||
var check = makeTimeCheck(instance);
|
||||
check("time.strftime('%Y')", function(d) {
|
||||
return String(d.getFullYear());
|
||||
});
|
||||
check("time.strftime('%Y')+'-01-30'", function(d) {
|
||||
return String(d.getFullYear()) + '-01-30';
|
||||
});
|
||||
check("time.strftime('%Y-%m-%d %H:%M:%S')", function(d) {
|
||||
return _.str.sprintf('%04d-%02d-%02d %02d:%02d:%02d',
|
||||
d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(),
|
||||
d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds()));
|
||||
d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());
|
||||
});
|
||||
});
|
||||
test('context_today', function (instance) {
|
||||
var d = new Date();
|
||||
var context = instance.web.pyeval.context();
|
||||
strictEqual(
|
||||
py.eval("context_today().strftime('%Y-%m-%d')", context),
|
||||
String(_.str.sprintf('%04d-%02d-%02d', d.getFullYear(), d.getMonth() + 1, d.getDate())));
|
||||
var check = makeTimeCheck(instance);
|
||||
check("context_today().strftime('%Y-%m-%d')", function(d) {
|
||||
return String(_.str.sprintf('%04d-%02d-%02d',
|
||||
d.getFullYear(), d.getMonth() + 1, d.getDate()));
|
||||
});
|
||||
});
|
||||
// Port from pypy/lib_pypy/test_datetime.py
|
||||
var makeEq = function (instance, c2) {
|
||||
|
|
|
@ -183,7 +183,7 @@ openerp.testing.section('list.edition', {
|
|||
}
|
||||
return [];
|
||||
});
|
||||
mock('/web/view/load', function () {
|
||||
mock('demo:fields_view_get', function () {
|
||||
return {
|
||||
type: 'tree',
|
||||
fields: {
|
||||
|
@ -191,15 +191,7 @@ openerp.testing.section('list.edition', {
|
|||
b: {type: 'char', string: "B"},
|
||||
c: {type: 'char', string: "C"}
|
||||
},
|
||||
arch: {
|
||||
tag: 'tree',
|
||||
attrs: {},
|
||||
children: [
|
||||
{tag: 'field', attrs: {name: 'a'}},
|
||||
{tag: 'field', attrs: {name: 'b'}},
|
||||
{tag: 'field', attrs: {name: 'c'}}
|
||||
]
|
||||
}
|
||||
arch: '<tree><field name="a"/><field name="b"/><field name="c"/></tree>',
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@ -247,7 +239,7 @@ openerp.testing.section('list.edition.events', {
|
|||
mock('demo:read', function () {
|
||||
return [{ id: 1, a: 'foo', b: 'bar', c: 'baz' }];
|
||||
});
|
||||
mock('/web/view/load', function () {
|
||||
mock('demo:fields_view_get', function () {
|
||||
return {
|
||||
type: 'tree',
|
||||
fields: {
|
||||
|
@ -255,15 +247,7 @@ openerp.testing.section('list.edition.events', {
|
|||
b: {type: 'char', string: "B"},
|
||||
c: {type: 'char', string: "C"}
|
||||
},
|
||||
arch: {
|
||||
tag: 'tree',
|
||||
attrs: {},
|
||||
children: [
|
||||
{tag: 'field', attrs: {name: 'a'}},
|
||||
{tag: 'field', attrs: {name: 'b'}},
|
||||
{tag: 'field', attrs: {name: 'c'}}
|
||||
]
|
||||
}
|
||||
arch: '<tree><field name="a"/><field name="b"/><field name="c"/></tree>',
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@ -320,19 +304,13 @@ openerp.testing.section('list.edition.onwrite', {
|
|||
templates: true,
|
||||
}, function (test) {
|
||||
test('record-to-read', {asserts: 4}, function (instance, $fix, mock) {
|
||||
mock('/web/view/load', function () {
|
||||
mock('demo:fields_view_get', function () {
|
||||
return {
|
||||
type: 'tree',
|
||||
fields: {
|
||||
a: {type: 'char', string: "A"}
|
||||
},
|
||||
arch: {
|
||||
tag: 'tree',
|
||||
attrs: { on_write: 'on_write', colors: 'red:a == "foo"' },
|
||||
children: [
|
||||
{tag: 'field', attrs: {name: 'a'}}
|
||||
]
|
||||
}
|
||||
arch: '<tree on_write="on_write" colors="red:a == \'foo\'"><field name="a"/></tree>',
|
||||
};
|
||||
});
|
||||
mock('demo:read', function (args, kwargs) {
|
||||
|
|
|
@ -4,20 +4,13 @@ openerp.testing.section('list.buttons', {
|
|||
templates: true
|
||||
}, function (test) {
|
||||
test('record-deletion', {asserts: 2}, function (instance, $fix, mock) {
|
||||
mock('/web/view/load', function () {
|
||||
mock('demo:fields_view_get', function () {
|
||||
return {
|
||||
type: 'tree',
|
||||
fields: {
|
||||
a: {type: 'char', string: "A"}
|
||||
},
|
||||
arch: {
|
||||
tag: 'tree',
|
||||
attrs: { },
|
||||
children: [
|
||||
{tag: 'field', attrs: {name: 'a'}},
|
||||
{tag: 'button', attrs: {type: 'object', name: 'foo'}}
|
||||
]
|
||||
}
|
||||
arch: '<tree><field name="a"/><button type="object" name="foo"/></tree>',
|
||||
};
|
||||
});
|
||||
mock('demo:read', function (args, kwargs) {
|
||||
|
|
|
@ -152,25 +152,14 @@ var makeSearchView = function (instance, dummy_widget_attributes, defaults) {
|
|||
instance.dummy = {};
|
||||
instance.dummy.DummyWidget = instance.web.search.Field.extend(
|
||||
dummy_widget_attributes || {});
|
||||
if (!('/web/view/load' in instance.session.responses)) {
|
||||
instance.session.responses['/web/view/load'] = function () {
|
||||
if (!('dummy.model:fields_view_get' in instance.session.responses)) {
|
||||
instance.session.responses['dummy.model:fields_view_get'] = function () {
|
||||
return {
|
||||
type: 'search',
|
||||
fields: {
|
||||
dummy: {type: 'char', string: "Dummy"}
|
||||
},
|
||||
arch: {
|
||||
tag: 'search',
|
||||
attrs: {},
|
||||
children: [{
|
||||
tag: 'field',
|
||||
attrs: {
|
||||
name: 'dummy',
|
||||
widget: 'dummy'
|
||||
},
|
||||
children: []
|
||||
}]
|
||||
}
|
||||
arch: '<search><field name="dummy" widget="dummy"/></search>'
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -183,7 +172,7 @@ var makeSearchView = function (instance, dummy_widget_attributes, defaults) {
|
|||
};
|
||||
};
|
||||
|
||||
var dataset = {model: 'dummy.model', get_context: function () { return {}; }};
|
||||
var dataset = new instance.web.DataSet(null, 'dummy.model');
|
||||
var view = new instance.web.SearchView(null, dataset, false, defaults);
|
||||
var self = this;
|
||||
view.on('invalid_search', self, function () {
|
||||
|
@ -926,31 +915,16 @@ openerp.testing.section('filters', {
|
|||
rpc: 'mock',
|
||||
templates: true,
|
||||
setup: function (instance, $s, mock) {
|
||||
mock('/web/view/load', function () {
|
||||
mock('dummy.model:fields_view_get', function () {
|
||||
// view with a single group of filters
|
||||
return {
|
||||
type: 'search',
|
||||
fields: {},
|
||||
arch: {
|
||||
tag: 'search',
|
||||
attrs: {},
|
||||
children: [{
|
||||
tag: 'filter',
|
||||
attrs: { string: "Foo1", domain: [ ['foo', '=', '1'] ] },
|
||||
children: []
|
||||
}, {
|
||||
tag: 'filter',
|
||||
attrs: {
|
||||
name: 'foo2',
|
||||
string: "Foo2",
|
||||
domain: [ ['foo', '=', '2'] ] },
|
||||
children: []
|
||||
}, {
|
||||
tag: 'filter',
|
||||
attrs: { string: "Foo3", domain: [ ['foo', '=', '3'] ] },
|
||||
children: []
|
||||
}]
|
||||
}
|
||||
arch: '<search>' +
|
||||
'<filter string="Foo1" domain="[ [\'foo\', \'=\', \'1\'] ]"/>' +
|
||||
'<filter name="foo2" string="Foo2" domain="[ [\'foo\', \'=\', \'2\'] ]"/>' +
|
||||
'<filter string="Foo3" domain="[ [\'foo\', \'=\', \'3\'] ]"/>' +
|
||||
'</search>',
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
QUnitSuite is a ``unittest.TestSuite`` able to run QUnit_ test suites
|
||||
within the normal unittest process, through PhantomJS_.
|
||||
|
||||
QUnitSuite is built upon `Ben Alman`_'s work of for the interfacing
|
||||
between PhantomJS_ and the host/reporting code: the shims and the
|
||||
PhantomJS_ configuration files are those of grunt_'s ``qunit`` task.
|
||||
|
||||
Why
|
||||
---
|
||||
|
||||
You're a Python shop or developer, you have tools and tests built
|
||||
around unittest (or compatible with unittests) and your testing
|
||||
pipeline is predicated upon that, you're doing web development of some
|
||||
sort these days (as so many are) and you'd like to do some testing of
|
||||
your web stuff.
|
||||
|
||||
But you don't really want to redo your whole testing stack just for
|
||||
that.
|
||||
|
||||
QUnitSuite simply grafts QUnit_-based tests, run in PhantomJS_, in
|
||||
your existing ``unittest``-based architecture.
|
||||
|
||||
What
|
||||
----
|
||||
|
||||
QUnitSuite currently provides a single object as part of its API:
|
||||
``qunitsuite.QUnitSuite(testfile[, timeout])``.
|
||||
|
||||
This produces a ``unittest.TestSuite`` suitable for all the usual
|
||||
stuff (running it, and giving it to an other test suite which will run
|
||||
it, that is).
|
||||
|
||||
``testfile`` is the HTML file bootstrapping your qunit tests, as would
|
||||
usually be accessed via a browser. It can be either a local
|
||||
(``file:``) url, or an HTTP one. As long as a regular browser can open
|
||||
and execute it, PhantomJS_ will manage.
|
||||
|
||||
``timeout`` is a check passed to the PhantomJS_ runner: if the runner
|
||||
produces no information for longer than ``timeout`` milliseconds, the
|
||||
run will be cancelled and a test error will be generated. This
|
||||
situation usually means either your ``testfile`` is not a qunit test
|
||||
file, qunit is not running or qunit's runner was stopped (for an async
|
||||
test) and never restarted.
|
||||
|
||||
The default value is very conservative, most tests should run
|
||||
correctly with lower timeouts (especially if all tests are
|
||||
synchronous).
|
||||
|
||||
How
|
||||
---
|
||||
|
||||
``unittest``'s autodiscovery protocol does not directly work with test
|
||||
suites (it looks for test cases). If you want autodiscovery to work
|
||||
correctly, you will have to use the ``load_tests`` protocol::
|
||||
|
||||
# in a testing module
|
||||
def load_tests(loader, tests, pattern):
|
||||
tests.addTest(QUnitSuite(qunit_test_path.html))
|
||||
return tests
|
||||
|
||||
outside of that specific case, you can use a ``QUnitSuite`` as a
|
||||
standard ``TestSuite`` instance, running it, adding it to an other
|
||||
suite or passing it to a ``TestRunner``
|
||||
|
||||
Complaints and Grievances
|
||||
-------------------------
|
||||
|
||||
Speed
|
||||
~~~~~
|
||||
|
||||
Starting up a phantomjs instance and running a suite turns out to have
|
||||
a rather high overhead, on the order of a second on this machine
|
||||
(2.4GHz, 8GB RAM and an SSD).
|
||||
|
||||
As each ``QUnitSuite`` currently creates its own phantomjs instance,
|
||||
it's probably a good idea to create bigger suites (put many modules &
|
||||
tests in the same QUnit html file, which doesn't preclude splitting
|
||||
them across multiple js files).
|
||||
|
||||
Hacks
|
||||
~~~~~
|
||||
|
||||
QUnitSuite contains a pretty big hack which may or may not cause
|
||||
problem depending on your exact setup: in case of case failure or
|
||||
error, ``unittest.TestResult`` formats the error traceback provided
|
||||
alongside the test object. This goes through Python's
|
||||
traceback-formatting code and there are no hooks there.
|
||||
|
||||
One could expect to use a custom ``TestResult``, but for test suites
|
||||
the ``TestResult`` instance must be provided by the caller, so there
|
||||
is no direct hook onto it.
|
||||
|
||||
This leaves three options:
|
||||
|
||||
* Create a custom ``TestResult`` class and require that it be the one
|
||||
provided to the test suite. This requires altered work flows,
|
||||
customization of the test runner and (as far as I know) isn't
|
||||
available through Python 2.7's autodiscovery. It's the cleanest
|
||||
option but completely fails on practicality.
|
||||
|
||||
* Create a custom ``TestResult`` which directly alters the original
|
||||
result's ``errors`` and ``failures`` attributes as they're part of
|
||||
the testrunner API. This would work but may put custom results in a
|
||||
strange state and break e.g. unittest2's ``@failfast``.
|
||||
|
||||
* Lastly, monkeypatch the undocumented and implementation detail
|
||||
``_exc_info_to_string`` on the provided ``result``. This is the
|
||||
route taken, at least for now.
|
||||
|
||||
.. _QUnit: http://qunitjs.com/
|
||||
|
||||
.. _PhantomJS: http://phantomjs.org/
|
||||
|
||||
.. _Ben Alman: http://benalman.com/
|
||||
|
||||
.. _grunt: http://gruntjs.com/
|
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
* grunt
|
||||
* http://gruntjs.com/
|
||||
*
|
||||
* Copyright (c) 2012 "Cowboy" Ben Alman
|
||||
* Licensed under the MIT license.
|
||||
* http://benalman.com/about/license/
|
||||
*/
|
||||
|
||||
/*global phantom:true*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
|
||||
// The page .html file to load.
|
||||
var url = phantom.args[0];
|
||||
// Extra, optionally overridable stuff.
|
||||
var options = JSON.parse(phantom.args[1] || {});
|
||||
|
||||
// Default options.
|
||||
if (!options.timeout) { options.timeout = 5000; }
|
||||
|
||||
// Keep track of the last time a client message was sent.
|
||||
var last = new Date();
|
||||
|
||||
// Messages are sent to the parent by appending them to the tempfile.
|
||||
var sendMessage = function(arg) {
|
||||
var args = Array.isArray(arg) ? arg : [].slice.call(arguments);
|
||||
last = new Date();
|
||||
console.log(JSON.stringify(args));
|
||||
};
|
||||
|
||||
// This allows grunt to abort if the PhantomJS version isn't adequate.
|
||||
sendMessage('private', 'version', phantom.version);
|
||||
|
||||
// Abort if the page doesn't send any messages for a while.
|
||||
setInterval(function() {
|
||||
if (new Date() - last > options.timeout) {
|
||||
sendMessage('fail.timeout');
|
||||
phantom.exit();
|
||||
}
|
||||
}, 100);
|
||||
|
||||
// Create a new page.
|
||||
var page = require('webpage').create();
|
||||
|
||||
// The client page must send its messages via alert(jsonstring).
|
||||
page.onAlert = function(args) {
|
||||
sendMessage(JSON.parse(args));
|
||||
};
|
||||
|
||||
// Keep track if the client-side helper script already has been injected.
|
||||
var injected;
|
||||
page.onUrlChanged = function(newUrl) {
|
||||
injected = false;
|
||||
sendMessage('onUrlChanged', newUrl);
|
||||
};
|
||||
|
||||
// Relay console logging messages.
|
||||
page.onConsoleMessage = function(message) {
|
||||
sendMessage('console', message);
|
||||
};
|
||||
|
||||
// For debugging.
|
||||
page.onResourceRequested = function(request) {
|
||||
sendMessage('onResourceRequested', request.url);
|
||||
};
|
||||
|
||||
page.onResourceReceived = function(request) {
|
||||
if (request.stage === 'end') {
|
||||
sendMessage('onResourceReceived', request.url);
|
||||
}
|
||||
};
|
||||
|
||||
// Run when the page has finished loading.
|
||||
page.onLoadFinished = function(status) {
|
||||
// The window has loaded.
|
||||
sendMessage('onLoadFinished', status);
|
||||
if (status === 'success') {
|
||||
if (options.inject && !injected) {
|
||||
// Inject client-side helper script, but only if it has not yet been
|
||||
// injected.
|
||||
sendMessage('inject', options.inject);
|
||||
page.injectJs(options.inject);
|
||||
}
|
||||
} else {
|
||||
// File loading failure.
|
||||
sendMessage('fail.load', url);
|
||||
phantom.exit();
|
||||
}
|
||||
};
|
||||
|
||||
// Actually load url.
|
||||
page.open(url);
|
|
@ -0,0 +1,22 @@
|
|||
Copyright (c) 2012 "Cowboy" Ben Alman
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1 @@
|
|||
{}
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* grunt
|
||||
* http://gruntjs.com/
|
||||
*
|
||||
* Copyright (c) 2012 "Cowboy" Ben Alman
|
||||
* Licensed under the MIT license.
|
||||
* http://benalman.com/about/license/
|
||||
*/
|
||||
|
||||
/*global QUnit:true, alert:true*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// Don't re-order tests.
|
||||
QUnit.config.reorder = false;
|
||||
// Run tests serially, not in parallel.
|
||||
QUnit.config.autorun = false;
|
||||
|
||||
// Send messages to the parent PhantomJS process via alert! Good times!!
|
||||
function sendMessage() {
|
||||
var args = [].slice.call(arguments);
|
||||
alert(JSON.stringify(args));
|
||||
}
|
||||
|
||||
// These methods connect QUnit to PhantomJS.
|
||||
QUnit.log(function(obj) {
|
||||
// What is this I don’t even
|
||||
if (obj.message === '[object Object], undefined:undefined') { return; }
|
||||
// Parse some stuff before sending it.
|
||||
var actual = QUnit.jsDump.parse(obj.actual);
|
||||
var expected = QUnit.jsDump.parse(obj.expected);
|
||||
// Send it.
|
||||
sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source);
|
||||
});
|
||||
|
||||
QUnit.testStart(function(obj) {
|
||||
sendMessage('qunit.testStart', obj.name);
|
||||
});
|
||||
|
||||
QUnit.testDone(function(obj) {
|
||||
sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total);
|
||||
});
|
||||
|
||||
QUnit.moduleStart(function(obj) {
|
||||
sendMessage('qunit.moduleStart', obj.name);
|
||||
});
|
||||
|
||||
QUnit.moduleDone(function(obj) {
|
||||
sendMessage('qunit.moduleDone', obj.name, obj.failed, obj.passed, obj.total);
|
||||
});
|
||||
|
||||
QUnit.begin(function() {
|
||||
sendMessage('qunit.begin');
|
||||
});
|
||||
|
||||
QUnit.done(function(obj) {
|
||||
sendMessage('qunit.done', obj.failed, obj.passed, obj.total, obj.runtime);
|
||||
});
|
||||
|
||||
// PhantomJS (up to and including 1.7) uses a version of webkit so old
|
||||
// it does not have Function.prototype.bind:
|
||||
// http://code.google.com/p/phantomjs/issues/detail?id=522
|
||||
|
||||
// Use moz polyfill:
|
||||
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind#Compatibility
|
||||
if (!Function.prototype.bind) {
|
||||
Function.prototype.bind = function (oThis) {
|
||||
if (typeof this !== "function") {
|
||||
// closest thing possible to the ECMAScript 5 internal IsCallable function
|
||||
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
|
||||
}
|
||||
|
||||
var aArgs = Array.prototype.slice.call(arguments, 1),
|
||||
fToBind = this,
|
||||
fNOP = function () {},
|
||||
fBound = function () {
|
||||
return fToBind.apply(this instanceof fNOP && oThis
|
||||
? this
|
||||
: oThis,
|
||||
aArgs.concat(Array.prototype.slice.call(arguments)));
|
||||
};
|
||||
|
||||
fNOP.prototype = this.prototype;
|
||||
fBound.prototype = new fNOP();
|
||||
|
||||
return fBound;
|
||||
};
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
import json
|
||||
import subprocess
|
||||
import unittest
|
||||
import os
|
||||
import time
|
||||
|
||||
ROOT = os.path.join(os.path.dirname(__file__), 'grunt')
|
||||
|
||||
__all__ = ['QUnitSuite']
|
||||
|
||||
def _exc_info_to_string(err, test):
|
||||
return err
|
||||
|
||||
class QUnitTest(unittest.TestCase):
|
||||
def __init__(self, module, name):
|
||||
self.module = module
|
||||
self.name = name
|
||||
self.failed = False
|
||||
def shortDescription(self):
|
||||
return None
|
||||
def __repr__(self):
|
||||
return '<QUnitTest %s:%s>' % (self.module, self.name)
|
||||
def __str__(self):
|
||||
return '%s: %s' % (self.module, self.name)
|
||||
|
||||
class QUnitSuite(unittest.TestSuite):
|
||||
def __init__(self, qunitfile, timeout=5000):
|
||||
self.testfile = qunitfile
|
||||
self.timeout = timeout
|
||||
self._module = None
|
||||
self._test = None
|
||||
|
||||
def __iter__(self):
|
||||
return iter([self])
|
||||
|
||||
def run(self, result):
|
||||
try:
|
||||
subprocess.call(['phantomjs', '-v'],
|
||||
stdout=open(os.devnull, 'w'),
|
||||
stderr=subprocess.STDOUT)
|
||||
except OSError:
|
||||
test = QUnitTest('phantomjs', 'javascript tests')
|
||||
result.startTest(test)
|
||||
result.startTest(test)
|
||||
result.addSkip(test , "phantomjs command not found")
|
||||
result.stopTest(test)
|
||||
return
|
||||
|
||||
result._exc_info_to_string = _exc_info_to_string
|
||||
try:
|
||||
self._run(result)
|
||||
finally:
|
||||
del result._exc_info_to_string
|
||||
|
||||
def _run(self, result):
|
||||
phantom = subprocess.Popen([
|
||||
'phantomjs',
|
||||
'--config=%s' % os.path.join(ROOT, 'phantomjs.json'),
|
||||
os.path.join(ROOT, 'bootstrap.js'), self.testfile,
|
||||
json.dumps({
|
||||
'timeout': self.timeout,
|
||||
'inject': os.path.join(ROOT, 'qunit-phantomjs-bridge.js')
|
||||
})
|
||||
], stdout=subprocess.PIPE)
|
||||
|
||||
try:
|
||||
while True:
|
||||
line = phantom.stdout.readline()
|
||||
if line:
|
||||
if self.process(line, result):
|
||||
break
|
||||
else:
|
||||
time.sleep(0.1)
|
||||
finally:
|
||||
# If the phantomjs process hasn't quit, kill it
|
||||
if phantom.poll() is None:
|
||||
phantom.terminate()
|
||||
|
||||
def process(self, line, result):
|
||||
args = json.loads(line)
|
||||
event_name = args[0]
|
||||
|
||||
if event_name == 'qunit.done':
|
||||
return True
|
||||
elif event_name == 'fail.load':
|
||||
self.add_error(result, "PhantomJS unable to load %s" % args[1])
|
||||
return True
|
||||
elif event_name == 'fail.timeout':
|
||||
self.add_error(result, "PhantomJS timed out, possibly due to a"
|
||||
" missing QUnit start() call")
|
||||
return True
|
||||
|
||||
elif event_name == 'qunit.moduleStart':
|
||||
self._module = args[1].encode('utf-8')
|
||||
elif event_name == 'qunit.moduleStop':
|
||||
self._test = None
|
||||
self._module = None
|
||||
elif event_name == 'qunit.testStart':
|
||||
self._test = QUnitTest(self._module, args[1].encode('utf-8'))
|
||||
result.startTest(self._test)
|
||||
elif event_name == 'qunit.testDone':
|
||||
if not self._test.failed:
|
||||
result.addSuccess(self._test)
|
||||
result.stopTest(self._test)
|
||||
self._test = None
|
||||
elif event_name == 'qunit.log':
|
||||
if args[1]:
|
||||
return False
|
||||
|
||||
self._test.failed = True
|
||||
result.addFailure(
|
||||
self._test, self.failure_to_str(*args[2:]))
|
||||
|
||||
return False
|
||||
|
||||
def add_error(self, result, s):
|
||||
test = QUnitTest('phantomjs', 'startup')
|
||||
result.startTest(test)
|
||||
result.addError(test, s)
|
||||
result.stopTest(test)
|
||||
|
||||
def failure_to_str(self, actual, expected, message, source):
|
||||
if message or actual == expected:
|
||||
formatted = str(message or '')
|
||||
else:
|
||||
formatted = "%s != %s" % (actual, expected)
|
||||
|
||||
if source:
|
||||
formatted += '\n\n' + source
|
||||
|
||||
return formatted
|
|
@ -10,6 +10,12 @@ class WebSuite(QUnitSuite):
|
|||
'/web/tests',
|
||||
'mod=*&source={db}&supadmin={supadmin}&password={password}'.format(
|
||||
db=tools.config['db_name'],
|
||||
# al: i dont understand why both are needed, db_password is the
|
||||
# password for postgres and should not appear here of that i'm
|
||||
# sure
|
||||
#
|
||||
# But runbot provides it with this wrong key so i let it here
|
||||
# until it's fixed
|
||||
supadmin=tools.config['db_password'] or 'admin',
|
||||
password=tools.config['admin_passwd'] or 'admin'),
|
||||
''
|
||||
|
|
|
@ -36,15 +36,14 @@ class LoadTest(unittest2.TestCase):
|
|||
self.MockMenus.search.return_value = []
|
||||
self.MockMenus.read.return_value = []
|
||||
|
||||
root = self.menu.do_load(self.request)
|
||||
root = self.menu.load(self.request)
|
||||
|
||||
self.MockMenus.search.assert_called_with(
|
||||
[], 0, False, False, self.request.context)
|
||||
self.MockMenus.read.assert_called_with(
|
||||
[], ['name', 'sequence', 'parent_id',
|
||||
'action', 'needaction_enabled', 'needaction_counter'],
|
||||
[('parent_id','=', False)], 0, False, False,
|
||||
self.request.context)
|
||||
|
||||
self.assertEqual(root['all_menu_ids'], [])
|
||||
|
||||
self.assertListEqual(
|
||||
root['children'],
|
||||
[])
|
||||
|
@ -57,13 +56,19 @@ class LoadTest(unittest2.TestCase):
|
|||
{'id': 2, 'sequence': 3, 'parent_id': False},
|
||||
]
|
||||
|
||||
root = self.menu.do_load(self.request)
|
||||
root = self.menu.load(self.request)
|
||||
|
||||
self.MockMenus.search.assert_called_with(
|
||||
[('id','child_of', [1, 2, 3])], 0, False, False,
|
||||
self.request.context)
|
||||
|
||||
self.MockMenus.read.assert_called_with(
|
||||
[1, 2, 3], ['name', 'sequence', 'parent_id',
|
||||
'action', 'needaction_enabled', 'needaction_counter'],
|
||||
'action'],
|
||||
self.request.context)
|
||||
|
||||
self.assertEqual(root['all_menu_ids'], [1, 2, 3])
|
||||
|
||||
self.assertEqual(
|
||||
root['children'],
|
||||
[{
|
||||
|
@ -90,7 +95,13 @@ class LoadTest(unittest2.TestCase):
|
|||
{'id': 4, 'sequence': 2, 'parent_id': [2, '']},
|
||||
])
|
||||
|
||||
root = self.menu.do_load(self.request)
|
||||
root = self.menu.load(self.request)
|
||||
|
||||
self.MockMenus.search.assert_called_with(
|
||||
[('id','child_of', [1])], 0, False, False,
|
||||
self.request.context)
|
||||
|
||||
self.assertEqual(root['all_menu_ids'], [1, 2, 3, 4])
|
||||
|
||||
self.assertEqual(
|
||||
root['children'],
|
||||
|
|
|
@ -8,63 +8,63 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-04-09 03:26+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2012-12-16 06:30+0000\n"
|
||||
"Last-Translator: David Bowers <sales@skitzotek.com>\n"
|
||||
"Language-Team: English (Australia) <en_AU@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-17 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:151
|
||||
#, python-format
|
||||
msgid "New event"
|
||||
msgstr ""
|
||||
msgstr "New event"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:154
|
||||
#, python-format
|
||||
msgid "Details"
|
||||
msgstr ""
|
||||
msgstr "Details"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:152
|
||||
#, python-format
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "Save"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:99
|
||||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
msgstr "Calendar view has a 'date_delay' type != float"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:147
|
||||
#, python-format
|
||||
msgid "Today"
|
||||
msgstr ""
|
||||
msgstr "Today"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:149
|
||||
#, python-format
|
||||
msgid "Week"
|
||||
msgstr ""
|
||||
msgstr "Week"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:161
|
||||
#, python-format
|
||||
msgid "Full day"
|
||||
msgstr ""
|
||||
msgstr "Full day"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -72,14 +72,14 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:172
|
||||
#, python-format
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
msgstr "Description"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:158
|
||||
#, python-format
|
||||
msgid "Event will be deleted permanently, are you sure?"
|
||||
msgstr ""
|
||||
msgstr "Event will be deleted permanently. Are you sure?"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -94,56 +94,56 @@ msgstr " "
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:171
|
||||
#, python-format
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Date"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:468
|
||||
#, python-format
|
||||
msgid "Edit: "
|
||||
msgstr ""
|
||||
msgstr "Edit: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:148
|
||||
#, python-format
|
||||
msgid "Day"
|
||||
msgstr ""
|
||||
msgstr "Day"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:155
|
||||
#, python-format
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Edit"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:167
|
||||
#, python-format
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
msgstr "Enabled"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:164
|
||||
#, python-format
|
||||
msgid "Do you want to edit the whole set of repeated events?"
|
||||
msgstr ""
|
||||
msgstr "Do you want to edit the whole set of repeated events?"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:80
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filter"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:165
|
||||
#, python-format
|
||||
msgid "Repeat event"
|
||||
msgstr ""
|
||||
msgstr "Repeat event"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -151,56 +151,56 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:178
|
||||
#, python-format
|
||||
msgid "Agenda"
|
||||
msgstr ""
|
||||
msgstr "Agenda"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:160
|
||||
#, python-format
|
||||
msgid "Time period"
|
||||
msgstr ""
|
||||
msgstr "Time period"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:156
|
||||
#, python-format
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "Delete"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:150
|
||||
#, python-format
|
||||
msgid "Month"
|
||||
msgstr ""
|
||||
msgstr "Month"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:166
|
||||
#, python-format
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
msgstr "Disabled"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:433
|
||||
#, python-format
|
||||
msgid "Create: "
|
||||
msgstr ""
|
||||
msgstr "Create: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:175
|
||||
#, python-format
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
msgstr "Year"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:153
|
||||
#, python-format
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Cancel"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +214,7 @@ msgstr "Calendar"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "Calendar view has not defined the 'date_start' attribute."
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navigator"
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-12-04 17:08+0000\n"
|
||||
"Last-Translator: Vicente Jiménez Aguilar <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-17 13:10+0000\n"
|
||||
"Last-Translator: Santi (Pexego) <santiago@pexego.es>\n"
|
||||
"Language-Team: Spanish <es@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: 2012-12-05 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16335)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-18 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -43,7 +43,7 @@ msgstr "Guardar"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:99
|
||||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
msgstr "La vista calendario tiene un tipo 'date_delay' != float"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +214,7 @@ msgstr "Calendario"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "La vista calendario no tiene definido el atributo 'date_start'"
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navegador"
|
||||
|
|
|
@ -8,35 +8,35 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2011-10-10 19:20+0000\n"
|
||||
"Last-Translator: Aare Vesi <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-16 20:45+0000\n"
|
||||
"Last-Translator: Ahti Hinnov <sipelgas@gmail.com>\n"
|
||||
"Language-Team: Estonian <et@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-17 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:151
|
||||
#, python-format
|
||||
msgid "New event"
|
||||
msgstr ""
|
||||
msgstr "Uus sündmus"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:154
|
||||
#, python-format
|
||||
msgid "Details"
|
||||
msgstr ""
|
||||
msgstr "Üksikasjad"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:152
|
||||
#, python-format
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "Salvesta"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -50,21 +50,21 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:147
|
||||
#, python-format
|
||||
msgid "Today"
|
||||
msgstr ""
|
||||
msgstr "Täna"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:149
|
||||
#, python-format
|
||||
msgid "Week"
|
||||
msgstr ""
|
||||
msgstr "Nädal"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:161
|
||||
#, python-format
|
||||
msgid "Full day"
|
||||
msgstr ""
|
||||
msgstr "Terve päev"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -72,7 +72,7 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:172
|
||||
#, python-format
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
msgstr "Kirjeldus"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -94,35 +94,35 @@ msgstr " "
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:171
|
||||
#, python-format
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Kuupäev"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:468
|
||||
#, python-format
|
||||
msgid "Edit: "
|
||||
msgstr ""
|
||||
msgstr "Muuda: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:148
|
||||
#, python-format
|
||||
msgid "Day"
|
||||
msgstr ""
|
||||
msgstr "Päev"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:155
|
||||
#, python-format
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Muuda"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:167
|
||||
#, python-format
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
msgstr "Lubatud"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -136,14 +136,14 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:80
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filter"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:165
|
||||
#, python-format
|
||||
msgid "Repeat event"
|
||||
msgstr ""
|
||||
msgstr "Korduv sündmus"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -151,63 +151,63 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:178
|
||||
#, python-format
|
||||
msgid "Agenda"
|
||||
msgstr ""
|
||||
msgstr "Päevakava"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:160
|
||||
#, python-format
|
||||
msgid "Time period"
|
||||
msgstr ""
|
||||
msgstr "Periood"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:156
|
||||
#, python-format
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "Kustuta"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:150
|
||||
#, python-format
|
||||
msgid "Month"
|
||||
msgstr ""
|
||||
msgstr "Kuu"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:166
|
||||
#, python-format
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
msgstr "Keelatud"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:433
|
||||
#, python-format
|
||||
msgid "Create: "
|
||||
msgstr ""
|
||||
msgstr "Loo: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:175
|
||||
#, python-format
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
msgstr "Aasta"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:153
|
||||
#, python-format
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Loobu"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:28
|
||||
#, python-format
|
||||
msgid "Calendar"
|
||||
msgstr ""
|
||||
msgstr "Kalender"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-24 18:16+0000\n"
|
||||
"PO-Revision-Date: 2012-12-09 18:06+0000\n"
|
||||
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
|
||||
"Language-Team: Croatian <hr@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -43,7 +43,7 @@ msgstr "Snimi"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:99
|
||||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
msgstr "U pogledu tipa kalendar polje 'date_delay' tip != float"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -215,6 +215,7 @@ msgstr "Kalendar"
|
|||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
"U pogledu tipa kalendar obavezno je polje 'date_start' - početno vrijeme."
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navigator"
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-27 22:10+0000\n"
|
||||
"Last-Translator: Juhász Krisztián <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-10 11:45+0000\n"
|
||||
"Last-Translator: krnkris <Unknown>\n"
|
||||
"Language-Team: Hungarian <hu@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -43,7 +43,7 @@ msgstr "Mentés"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:99
|
||||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
msgstr "Naptár nézetnek van 'halasztás_dátum' típusa != lebegőpontos"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +214,7 @@ msgstr "Naptár"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "Naptár nézetnek nincs definiálva 'induló_dátum' értéke"
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navigátor"
|
||||
|
|
|
@ -8,63 +8,63 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-02-16 21:55+0000\n"
|
||||
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
|
||||
"PO-Revision-Date: 2012-12-11 07:35+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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-12 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16361)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:151
|
||||
#, python-format
|
||||
msgid "New event"
|
||||
msgstr ""
|
||||
msgstr "Nuovo evento"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:154
|
||||
#, python-format
|
||||
msgid "Details"
|
||||
msgstr ""
|
||||
msgstr "Dettagli"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:152
|
||||
#, python-format
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "Salva"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:99
|
||||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
msgstr "La vista calendario ha un campo \"date_delay\" non di tipo float"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:147
|
||||
#, python-format
|
||||
msgid "Today"
|
||||
msgstr ""
|
||||
msgstr "Oggi"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:149
|
||||
#, python-format
|
||||
msgid "Week"
|
||||
msgstr ""
|
||||
msgstr "Settimana"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:161
|
||||
#, python-format
|
||||
msgid "Full day"
|
||||
msgstr ""
|
||||
msgstr "Tutto il giorno"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -72,14 +72,14 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:172
|
||||
#, python-format
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
msgstr "Descrizione"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:158
|
||||
#, python-format
|
||||
msgid "Event will be deleted permanently, are you sure?"
|
||||
msgstr ""
|
||||
msgstr "L'evento sarà eliminato permanentemente, siete sicuri?"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -94,56 +94,56 @@ msgstr " "
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:171
|
||||
#, python-format
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Data"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:468
|
||||
#, python-format
|
||||
msgid "Edit: "
|
||||
msgstr ""
|
||||
msgstr "Modifica: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:148
|
||||
#, python-format
|
||||
msgid "Day"
|
||||
msgstr ""
|
||||
msgstr "Giorno"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:155
|
||||
#, python-format
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Modifica"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:167
|
||||
#, python-format
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
msgstr "Abilitato"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:164
|
||||
#, python-format
|
||||
msgid "Do you want to edit the whole set of repeated events?"
|
||||
msgstr ""
|
||||
msgstr "Volete modificare l'intero set di eventi ricorsivi?"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:80
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:165
|
||||
#, python-format
|
||||
msgid "Repeat event"
|
||||
msgstr ""
|
||||
msgstr "Evento ricorsivo"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -151,56 +151,56 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:178
|
||||
#, python-format
|
||||
msgid "Agenda"
|
||||
msgstr ""
|
||||
msgstr "Agenda"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:160
|
||||
#, python-format
|
||||
msgid "Time period"
|
||||
msgstr ""
|
||||
msgstr "Periodo di tempo"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:156
|
||||
#, python-format
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "Elimina"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:150
|
||||
#, python-format
|
||||
msgid "Month"
|
||||
msgstr ""
|
||||
msgstr "Mese"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:166
|
||||
#, python-format
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
msgstr "Disabilitato"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:433
|
||||
#, python-format
|
||||
msgid "Create: "
|
||||
msgstr ""
|
||||
msgstr "Crea: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:175
|
||||
#, python-format
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
msgstr "Anno"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:153
|
||||
#, python-format
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Annulla"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +214,7 @@ msgstr "Calendario"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "La vista calendario non ha definito l'attributo 'data_start'"
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navigatore"
|
||||
|
|
|
@ -8,35 +8,35 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-02-08 11:19+0000\n"
|
||||
"Last-Translator: drygal <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-10 12:19+0000\n"
|
||||
"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) <grzegorz@openglobe.pl>\n"
|
||||
"Language-Team: Polish <pl@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:151
|
||||
#, python-format
|
||||
msgid "New event"
|
||||
msgstr ""
|
||||
msgstr "Nowe zdarzenie"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:154
|
||||
#, python-format
|
||||
msgid "Details"
|
||||
msgstr ""
|
||||
msgstr "Szczegóły"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:152
|
||||
#, python-format
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "Zapisz"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -50,21 +50,21 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:147
|
||||
#, python-format
|
||||
msgid "Today"
|
||||
msgstr ""
|
||||
msgstr "Dzisiaj"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:149
|
||||
#, python-format
|
||||
msgid "Week"
|
||||
msgstr ""
|
||||
msgstr "Tydzień"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:161
|
||||
#, python-format
|
||||
msgid "Full day"
|
||||
msgstr ""
|
||||
msgstr "Cały dzień"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -72,14 +72,14 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:172
|
||||
#, python-format
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
msgstr "Opis"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:158
|
||||
#, python-format
|
||||
msgid "Event will be deleted permanently, are you sure?"
|
||||
msgstr ""
|
||||
msgstr "Zdarzenie zostanie ostatecznie usunięte"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -94,56 +94,56 @@ msgstr " "
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:171
|
||||
#, python-format
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Data"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:468
|
||||
#, python-format
|
||||
msgid "Edit: "
|
||||
msgstr ""
|
||||
msgstr "Edytowanie: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:148
|
||||
#, python-format
|
||||
msgid "Day"
|
||||
msgstr ""
|
||||
msgstr "Dzień"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:155
|
||||
#, python-format
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Edytuj"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:167
|
||||
#, python-format
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
msgstr "Włączone"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:164
|
||||
#, python-format
|
||||
msgid "Do you want to edit the whole set of repeated events?"
|
||||
msgstr ""
|
||||
msgstr "Chcesz edytować cały zestaw powtarzalnych zdarzeń?"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:80
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtrowanie"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:165
|
||||
#, python-format
|
||||
msgid "Repeat event"
|
||||
msgstr ""
|
||||
msgstr "Powtórz zdarzenie"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -151,56 +151,56 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:178
|
||||
#, python-format
|
||||
msgid "Agenda"
|
||||
msgstr ""
|
||||
msgstr "Plan spotkania"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:160
|
||||
#, python-format
|
||||
msgid "Time period"
|
||||
msgstr ""
|
||||
msgstr "Okres czasu"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:156
|
||||
#, python-format
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "Usuń"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:150
|
||||
#, python-format
|
||||
msgid "Month"
|
||||
msgstr ""
|
||||
msgstr "Miesiąc"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:166
|
||||
#, python-format
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
msgstr "Wyłączone"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:433
|
||||
#, python-format
|
||||
msgid "Create: "
|
||||
msgstr ""
|
||||
msgstr "Utwórz: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:175
|
||||
#, python-format
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
msgstr "Rok"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:153
|
||||
#, python-format
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Anuluj"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +214,7 @@ msgstr "Kalendarz"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "Widok kalendzara nie ma zdefiniowanego atrybutu 'date_start'."
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Nawigator"
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-12-04 12:40+0000\n"
|
||||
"Last-Translator: Andrei Talpa (multibase.pt) <andrei.talpa@multibase.pt>\n"
|
||||
"PO-Revision-Date: 2012-12-07 10:00+0000\n"
|
||||
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
|
||||
"Language-Team: Portuguese <pt@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: 2012-12-05 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16335)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -64,7 +64,7 @@ msgstr "Semana"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:161
|
||||
#, python-format
|
||||
msgid "Full day"
|
||||
msgstr ""
|
||||
msgstr "Dia inteiro"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -79,7 +79,7 @@ msgstr "Descrição"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:158
|
||||
#, python-format
|
||||
msgid "Event will be deleted permanently, are you sure?"
|
||||
msgstr ""
|
||||
msgstr "O evento será eliminado. Confirma?"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -136,7 +136,7 @@ msgstr ""
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:80
|
||||
#, python-format
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -179,7 +179,7 @@ msgstr "Mês"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:166
|
||||
#, python-format
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
msgstr "Inativo"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,21 +8,21 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-03-10 13:17+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2012-12-15 14:02+0000\n"
|
||||
"Last-Translator: Fekete Mihai <mihai@erpsystems.ro>\n"
|
||||
"Language-Team: Romanian <ro@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-16 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
#: code:addons/web_calendar/static/src/js/calendar.js:151
|
||||
#, python-format
|
||||
msgid "New event"
|
||||
msgstr "Un eveniment nou"
|
||||
msgstr "Eveniment nou"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -36,7 +36,7 @@ msgstr "Detalii"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:152
|
||||
#, python-format
|
||||
msgid "Save"
|
||||
msgstr "Salvati"
|
||||
msgstr "Salveaza"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -44,6 +44,7 @@ msgstr "Salvati"
|
|||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
"Vizualizarea Calendar are un tip de 'intarziere_data' ! = stabilizare"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -101,7 +102,7 @@ msgstr "Data"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:468
|
||||
#, python-format
|
||||
msgid "Edit: "
|
||||
msgstr ""
|
||||
msgstr "Editeaza: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -115,7 +116,7 @@ msgstr "Ziua"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:155
|
||||
#, python-format
|
||||
msgid "Edit"
|
||||
msgstr "Editati"
|
||||
msgstr "Editeaza"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -186,7 +187,7 @@ msgstr "Dezactivat(a)"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:433
|
||||
#, python-format
|
||||
msgid "Create: "
|
||||
msgstr ""
|
||||
msgstr "Creează: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +215,7 @@ msgstr "Calendar"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "Vizualizarea Calendar nu a definit atributul 'data_inceput'."
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navigator"
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
|
||||
"PO-Revision-Date: 2012-11-01 18:19+0000\n"
|
||||
"PO-Revision-Date: 2012-12-13 23:20+0000\n"
|
||||
"Last-Translator: Dusan Laznik <laznik@mentis.si>\n"
|
||||
"Language-Team: Slovenian <sl@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: 2012-12-01 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16319)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-14 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16369)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -43,7 +43,7 @@ msgstr "Shrani"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:99
|
||||
#, python-format
|
||||
msgid "Calendar view has a 'date_delay' type != float"
|
||||
msgstr ""
|
||||
msgstr "Končni datum ni pravega tipa"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -101,7 +101,7 @@ msgstr "Datum"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:468
|
||||
#, python-format
|
||||
msgid "Edit: "
|
||||
msgstr ""
|
||||
msgstr "Urejanje: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -186,7 +186,7 @@ msgstr "Onemogočeno"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:433
|
||||
#, python-format
|
||||
msgid "Create: "
|
||||
msgstr ""
|
||||
msgstr "Ustvari: "
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
@ -214,7 +214,7 @@ msgstr "Koledar"
|
|||
#: code:addons/web_calendar/static/src/js/calendar.js:91
|
||||
#, python-format
|
||||
msgid "Calendar view has not defined 'date_start' attribute."
|
||||
msgstr ""
|
||||
msgstr "Začetni datum ni definiran"
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "Navigator"
|
||||
|
|
|
@ -9,18 +9,9 @@
|
|||
}
|
||||
.openerp .oe_calendar {
|
||||
background-color: white;
|
||||
height: 600px;
|
||||
min-height: 600px;
|
||||
border-right: 1px solid #eeeeee;
|
||||
}
|
||||
.openerp .oe_calendar .oe_calendar_table {
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
border-top: 3px solid #eeeeee;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_calendar .oe_calendar_filter {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
@ -30,9 +21,6 @@
|
|||
.openerp .oe_calendar .dhx_cal_navline {
|
||||
z-index: auto;
|
||||
}
|
||||
.openerp .oe_calendar.oe_cal_month .dhx_cal_data {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
.openerp .oe_calendar.oe_cal_month .dhx_cal_data table tr td:last-child div.dhx_month_body {
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
|
|
@ -11,18 +11,9 @@
|
|||
|
||||
.oe_calendar
|
||||
background-color: white
|
||||
height: 600px
|
||||
min-height: 600px
|
||||
border-right: 1px solid #eee
|
||||
|
||||
.oe_calendar_table
|
||||
position: absolute
|
||||
left: 0px
|
||||
right: 0px
|
||||
top: 0px
|
||||
border-top: 3px solid #eee
|
||||
width: 100%
|
||||
overflow: hidden
|
||||
|
||||
.oe_calendar_filter
|
||||
padding: 0 10px
|
||||
|
||||
|
@ -36,7 +27,6 @@
|
|||
z-index: auto
|
||||
|
||||
&.oe_cal_month .dhx_cal_data
|
||||
overflow-y: hidden
|
||||
|
||||
table tr td:last-child div.dhx_month_body
|
||||
padding-right: 5px
|
||||
|
|
|
@ -49,7 +49,9 @@ instance.web_calendar.CalendarView = instance.web.View.extend({
|
|||
this.range_stop = null;
|
||||
this.update_range_dates(Date.today());
|
||||
this.selected_filters = [];
|
||||
this.on('view_loaded', self, self.load_calendar);
|
||||
},
|
||||
view_loading: function(r) {
|
||||
return this.load_calendar(r);
|
||||
},
|
||||
destroy: function() {
|
||||
scheduler.clearAll();
|
||||
|
@ -463,12 +465,12 @@ instance.web_calendar.CalendarView = instance.web.View.extend({
|
|||
});
|
||||
} else {
|
||||
var pop = new instance.web.form.FormOpenPopup(this);
|
||||
var id_for_buggy_addons = this.dataset.ids[index]; // ids could be non numeric
|
||||
pop.show_element(this.dataset.model, id_for_buggy_addons, this.dataset.get_context(), {
|
||||
var id_from_dataset = this.dataset.ids[index]; // dhtmlx scheduler loses id's type
|
||||
pop.show_element(this.dataset.model, id_from_dataset, this.dataset.get_context(), {
|
||||
title: _t("Edit: ") + this.name
|
||||
});
|
||||
pop.on('write_completed', self, function(){
|
||||
self.reload_event(event_id);
|
||||
self.reload_event(id_from_dataset);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
|
|
@ -3,11 +3,6 @@ import openerp
|
|||
class DiagramView(openerp.addons.web.controllers.main.View):
|
||||
_cp_path = "/web_diagram/diagram"
|
||||
|
||||
@openerp.addons.web.http.jsonrequest
|
||||
def load(self, req, model, view_id):
|
||||
fields_view = self.fields_view_get(req, model, view_id, 'diagram')
|
||||
return {'fields_view': fields_view}
|
||||
|
||||
@openerp.addons.web.http.jsonrequest
|
||||
def get_diagram_info(self, req, id, model, node, connector,
|
||||
src_node, des_node, label, **kw):
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-12-04 07:14+0000\n"
|
||||
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-16 11:11+0000\n"
|
||||
"Last-Translator: Felix Schubert <Unknown>\n"
|
||||
"Language-Team: German <de@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: 2012-12-05 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16335)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-17 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -35,7 +35,7 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Löschung dieses Knotens kann nicht widerrufen werden.\n"
|
||||
"Die Löschung dieses Knotens kann nicht widerrufen werden.\n"
|
||||
"Es werden ebenfalls alls verbundenen Vorgänge gelöscht.\n"
|
||||
"\n"
|
||||
"Sind Sie sich sicher?"
|
||||
|
@ -83,7 +83,7 @@ msgstr "%d / %d"
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:337
|
||||
#, python-format
|
||||
msgid "Create:"
|
||||
msgstr "Erzeuge:"
|
||||
msgstr "Anlegen:"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -101,6 +101,6 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Löschung dieses Knotens kann nicht widerrufen werden.\n"
|
||||
"Die Löschung dieses Knotens kann nicht widerrufen werden.\n"
|
||||
"\n"
|
||||
"Sind Sie sich sicher?"
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
# English (Australia) translation for openerp-web
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openerp-web package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-12-16 06:32+0000\n"
|
||||
"Last-Translator: David Bowers <sales@skitzotek.com>\n"
|
||||
"Language-Team: English (Australia) <en_AU@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: 2012-12-17 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:254
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:319
|
||||
#, python-format
|
||||
msgid "Open: "
|
||||
msgstr "Open: "
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:217
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Deleting this node cannot be undone.\n"
|
||||
"It will also delete all connected transitions.\n"
|
||||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Deleting this node cannot be undone.\n"
|
||||
"It will also delete all connected transitions.\n"
|
||||
"\n"
|
||||
"Are you sure?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
|
||||
#, python-format
|
||||
msgid "New Node"
|
||||
msgstr "New Node"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:312
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:331
|
||||
#, python-format
|
||||
msgid "Transition"
|
||||
msgstr "Transition"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:11
|
||||
#, python-format
|
||||
msgid "Diagram"
|
||||
msgstr "Diagram"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:246
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:280
|
||||
#, python-format
|
||||
msgid "Activity"
|
||||
msgstr "Activity"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:422
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:285
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:337
|
||||
#, python-format
|
||||
msgid "Create:"
|
||||
msgstr "Create:"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:187
|
||||
#, python-format
|
||||
msgid "Are you sure?"
|
||||
msgstr "Are you sure?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:235
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Deleting this transition cannot be undone.\n"
|
||||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Deleting this transition cannot be undone.\n"
|
||||
"\n"
|
||||
"Are you sure?"
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2011-10-10 19:24+0000\n"
|
||||
"Last-Translator: Aare Vesi <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-12-17 19:59+0000\n"
|
||||
"Last-Translator: Ahti Hinnov <sipelgas@gmail.com>\n"
|
||||
"Language-Team: Estonian <et@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: 2012-11-25 06:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16293)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-18 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -41,7 +41,7 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
|
||||
#, python-format
|
||||
msgid "New Node"
|
||||
msgstr ""
|
||||
msgstr "Uus sõlm"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -56,7 +56,7 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:11
|
||||
#, python-format
|
||||
msgid "Diagram"
|
||||
msgstr ""
|
||||
msgstr "Diagramm"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -71,7 +71,7 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:422
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -79,14 +79,14 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:337
|
||||
#, python-format
|
||||
msgid "Create:"
|
||||
msgstr ""
|
||||
msgstr "Loo:"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:187
|
||||
#, python-format
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
msgstr "Oled sa kindel?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
# Hungarian translation for openerp-web
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openerp-web package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-12-10 12:17+0000\n"
|
||||
"Last-Translator: krnkris <Unknown>\n"
|
||||
"Language-Team: Hungarian <hu@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: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:254
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:319
|
||||
#, python-format
|
||||
msgid "Open: "
|
||||
msgstr "Megnyitás: "
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:217
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Deleting this node cannot be undone.\n"
|
||||
"It will also delete all connected transitions.\n"
|
||||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Ennek a csomópontnak a törlését nem lehet visszaállítani.\n"
|
||||
"Minden csatlakozott átmenetet is törölni fog.\n"
|
||||
"\n"
|
||||
"Biztos benne?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
|
||||
#, python-format
|
||||
msgid "New Node"
|
||||
msgstr "Új csomópont"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:312
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:331
|
||||
#, python-format
|
||||
msgid "Transition"
|
||||
msgstr "Átmenet"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:11
|
||||
#, python-format
|
||||
msgid "Diagram"
|
||||
msgstr "Diagram"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:246
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:280
|
||||
#, python-format
|
||||
msgid "Activity"
|
||||
msgstr "Tevékenység"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:422
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:285
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:337
|
||||
#, python-format
|
||||
msgid "Create:"
|
||||
msgstr "Létrehoz:"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:187
|
||||
#, python-format
|
||||
msgid "Are you sure?"
|
||||
msgstr "Biztos benne?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
#: code:addons/web_diagram/static/src/js/diagram.js:235
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Deleting this transition cannot be undone.\n"
|
||||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Ennek az átmenetnek a törlését nem lehet visszaállítani.\n"
|
||||
"\n"
|
||||
"Biztos benne ?"
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-02-16 21:55+0000\n"
|
||||
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
|
||||
"PO-Revision-Date: 2012-12-09 22:40+0000\n"
|
||||
"Last-Translator: Sergio Corato <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: 2012-11-25 06:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16293)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -35,6 +35,10 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"La cancellazione di questo nodo è irreversibile. \n"
|
||||
"Saranno cancellate anche tutte le transizioni ad esso correlate.\n"
|
||||
"\n"
|
||||
"Sei sicuro ?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -71,7 +75,7 @@ msgstr "Attività"
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:422
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -86,7 +90,7 @@ msgstr "Crea:"
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:187
|
||||
#, python-format
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
msgstr "Sei sicuro?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -97,3 +101,6 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"La cancellazione di questa transizione è irreversibile.\n"
|
||||
"\n"
|
||||
"Sei sicuro?"
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-02-07 20:03+0000\n"
|
||||
"PO-Revision-Date: 2012-12-10 12:10+0000\n"
|
||||
"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) <grzegorz@openglobe.pl>\n"
|
||||
"Language-Team: Polish <pl@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: 2012-11-25 06:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16293)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16356)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -35,6 +35,10 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Usunięcie węzła nie może być cofnięte.\n"
|
||||
"Zostaną usunięte również powiązanie z nim przejścia.\n"
|
||||
"\n"
|
||||
"Jesteś pewien ?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -86,7 +90,7 @@ msgstr "Utwórz:"
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:187
|
||||
#, python-format
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
msgstr "Jesteś pewien?"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -97,3 +101,6 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Usunięcie węzła nie może być cofnięte.\n"
|
||||
"\n"
|
||||
"Jesteś pewien ?"
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-06-05 19:47+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2012-12-07 09:55+0000\n"
|
||||
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
|
||||
"Language-Team: Portuguese <pt@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: 2012-11-25 06:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16293)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16341)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -75,7 +75,7 @@ msgstr "Atividade"
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:422
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
|
||||
"PO-Revision-Date: 2012-03-19 23:14+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2012-12-14 18:51+0000\n"
|
||||
"Last-Translator: Fekete Mihai <mihai@erpsystems.ro>\n"
|
||||
"Language-Team: Romanian <ro@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: 2012-11-25 06:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16293)\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-15 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16372)\n"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -23,7 +23,7 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:319
|
||||
#, python-format
|
||||
msgid "Open: "
|
||||
msgstr "Deschideti: "
|
||||
msgstr "Deschide: "
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -35,7 +35,7 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Stergerea acestui nod nu poate fi anulata.\n"
|
||||
"Nu se va putea reveni asupra stergerii acestui nod.\n"
|
||||
"Vor fi sterse, de asemenea, toate tranzitiile asociate.\n"
|
||||
"\n"
|
||||
"Sunteti sigur(a) ?"
|
||||
|
@ -45,7 +45,7 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
|
||||
#, python-format
|
||||
msgid "New Node"
|
||||
msgstr "Nod nou"
|
||||
msgstr "Nod Nou"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -75,7 +75,7 @@ msgstr "Activitate"
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:422
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -83,7 +83,7 @@ msgstr ""
|
|||
#: code:addons/web_diagram/static/src/js/diagram.js:337
|
||||
#, python-format
|
||||
msgid "Create:"
|
||||
msgstr "Creati:"
|
||||
msgstr "Creeaza:"
|
||||
|
||||
#. module: web_diagram
|
||||
#. openerp-web
|
||||
|
@ -101,6 +101,6 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure ?"
|
||||
msgstr ""
|
||||
"Stergerea acestei tranzitii nu poate fi anulata.\n"
|
||||
"Nu se va putea reveni asupra stergerii acestei tranzitii.\n"
|
||||
"\n"
|
||||
"Sunteti sigur(a) ?"
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue