[Merge] with Trunk
bzr revid: ggh@tinyerp.com-20130312050346-e2zxslrbynqh01uz
This commit is contained in:
commit
f5422e8533
|
@ -13,8 +13,8 @@ import os
|
|||
import re
|
||||
import simplejson
|
||||
import time
|
||||
import urllib
|
||||
import urllib2
|
||||
import xmlrpclib
|
||||
import zlib
|
||||
from xml.etree import ElementTree
|
||||
from cStringIO import StringIO
|
||||
|
@ -97,7 +97,7 @@ def db_monodb(req):
|
|||
dbs = db_list(req)
|
||||
if len(dbs) == 1:
|
||||
return dbs[0]
|
||||
except xmlrpclib.Fault:
|
||||
except Exception:
|
||||
# ignore access denied
|
||||
pass
|
||||
return False
|
||||
|
@ -294,9 +294,9 @@ def manifest_list(req, extension, mods=None, db=None):
|
|||
if not req.debug:
|
||||
path = '/web/webclient/' + extension
|
||||
if mods is not None:
|
||||
path += '?mods=' + mods
|
||||
path += '?' + urllib.urlencode({'mods': mods})
|
||||
elif db:
|
||||
path += '?db=' + db
|
||||
path += '?' + urllib.urlencode({'db': db})
|
||||
return [path]
|
||||
files = manifest_glob(req, extension, addons=mods, db=db)
|
||||
i_am_diabetic = req.httprequest.environ["QUERY_STRING"].count("no_sugar") >= 1 or \
|
||||
|
@ -684,7 +684,7 @@ class WebClient(openerpweb.Controller):
|
|||
|
||||
@openerpweb.jsonrequest
|
||||
def version_info(self, req):
|
||||
return openerp.service.web_services.RPC_VERSION_1
|
||||
return openerp.service.common.exp_version()
|
||||
|
||||
class Proxy(openerpweb.Controller):
|
||||
_cp_path = '/web/proxy'
|
||||
|
@ -749,10 +749,10 @@ class Database(openerpweb.Controller):
|
|||
|
||||
try:
|
||||
return req.session.proxy("db").drop(password, db)
|
||||
except xmlrpclib.Fault, e:
|
||||
if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
|
||||
return {'error': e.faultCode, 'title': 'Drop Database'}
|
||||
return {'error': _('Could not drop database !'), 'title': _('Drop Database')}
|
||||
except openerp.exceptions.AccessDenied:
|
||||
return {'error': 'AccessDenied', 'title': 'Drop Database'}
|
||||
except Exception:
|
||||
return {'error': _('Could not drop database !'), 'title': _('Drop Database')}
|
||||
|
||||
@openerpweb.httprequest
|
||||
def backup(self, req, backup_db, backup_pwd, token):
|
||||
|
@ -769,8 +769,8 @@ class Database(openerpweb.Controller):
|
|||
('Content-Disposition', content_disposition(filename, req))],
|
||||
{'fileToken': int(token)}
|
||||
)
|
||||
except xmlrpclib.Fault, e:
|
||||
return simplejson.dumps([[],[{'error': e.faultCode, 'title': _('Backup Database')}]])
|
||||
except Exception, e:
|
||||
return simplejson.dumps([[],[{'error': openerp.tools.ustr(e), 'title': _('Backup Database')}]])
|
||||
|
||||
@openerpweb.httprequest
|
||||
def restore(self, req, db_file, restore_pwd, new_db):
|
||||
|
@ -778,9 +778,8 @@ class Database(openerpweb.Controller):
|
|||
data = base64.b64encode(db_file.read())
|
||||
req.session.proxy("db").restore(restore_pwd, new_db, data)
|
||||
return ''
|
||||
except xmlrpclib.Fault, e:
|
||||
if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
|
||||
raise Exception("AccessDenied")
|
||||
except openerp.exceptions.AccessDenied, e:
|
||||
raise Exception("AccessDenied")
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def change_password(self, req, fields):
|
||||
|
@ -789,10 +788,10 @@ class Database(openerpweb.Controller):
|
|||
dict(map(operator.itemgetter('name', 'value'), fields)))
|
||||
try:
|
||||
return req.session.proxy("db").change_admin_password(old_password, new_password)
|
||||
except xmlrpclib.Fault, e:
|
||||
if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
|
||||
return {'error': e.faultCode, 'title': _('Change Password')}
|
||||
return {'error': _('Error, password not changed !'), 'title': _('Change Password')}
|
||||
except openerp.exceptions.AccessDenied:
|
||||
return {'error': 'AccessDenied', 'title': _('Change Password')}
|
||||
except Exception:
|
||||
return {'error': _('Error, password not changed !'), 'title': _('Change Password')}
|
||||
|
||||
class Session(openerpweb.Controller):
|
||||
_cp_path = "/web/session"
|
||||
|
@ -1194,7 +1193,7 @@ class Binary(openerpweb.Controller):
|
|||
|
||||
image_data = base64.b64decode(image_base64)
|
||||
|
||||
except (TypeError, xmlrpclib.Fault):
|
||||
except Exception:
|
||||
image_data = self.placeholder(req)
|
||||
headers.append(('ETag', retag))
|
||||
headers.append(('Content-Length', len(image_data)))
|
||||
|
@ -1311,8 +1310,8 @@ class Binary(openerpweb.Controller):
|
|||
'filename': ufile.filename,
|
||||
'id': attachment_id
|
||||
}
|
||||
except xmlrpclib.Fault, e:
|
||||
args = {'error':e.faultCode }
|
||||
except Exception:
|
||||
args = {'error': "Something horrible happened"}
|
||||
return out % (simplejson.dumps(callback), simplejson.dumps(args))
|
||||
|
||||
@openerpweb.httprequest
|
||||
|
|
|
@ -32,12 +32,12 @@ NOMODULE_TEMPLATE = Template(u"""<!DOCTYPE html>
|
|||
</form>
|
||||
</body>
|
||||
</html>
|
||||
""")
|
||||
""", default_filters=['h'])
|
||||
NOTFOUND = Template(u"""
|
||||
<p>Unable to find the module [${module}], please check that the module
|
||||
name is correct and the module is on OpenERP's path.</p>
|
||||
<a href="/web/tests"><< Back to tests</a>
|
||||
""")
|
||||
""", default_filters=['h'])
|
||||
TESTING = Template(u"""<!DOCTYPE html>
|
||||
<html style="height: 100%">
|
||||
<%def name="to_path(module, p)">/${module}/${p}</%def>
|
||||
|
@ -51,9 +51,9 @@ TESTING = Template(u"""<!DOCTYPE html>
|
|||
<script src="/web/static/lib/qunit/qunit.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var oe_db_info = ${db_info};
|
||||
var oe_db_info = ${db_info | n};
|
||||
// List of modules, each module is preceded by its dependencies
|
||||
var oe_all_dependencies = ${dependencies};
|
||||
var oe_all_dependencies = ${dependencies | n};
|
||||
QUnit.config.testTimeout = 5 * 60 * 1000;
|
||||
</script>
|
||||
</head>
|
||||
|
@ -83,7 +83,7 @@ TESTING = Template(u"""<!DOCTYPE html>
|
|||
% endif
|
||||
% endfor
|
||||
</html>
|
||||
""")
|
||||
""", default_filters=['h'])
|
||||
|
||||
class TestRunnerController(http.Controller):
|
||||
_cp_path = '/web/tests'
|
||||
|
|
|
@ -19,7 +19,6 @@ import time
|
|||
import traceback
|
||||
import urlparse
|
||||
import uuid
|
||||
import xmlrpclib
|
||||
|
||||
import babel.core
|
||||
import simplejson
|
||||
|
@ -194,35 +193,18 @@ class JsonRequest(WebRequest):
|
|||
response['id'] = self.jsonrequest.get('id')
|
||||
response["result"] = method(self, **self.params)
|
||||
except session.AuthenticationError:
|
||||
se = serialize_exception(e)
|
||||
error = {
|
||||
'code': 100,
|
||||
'message': "OpenERP Session Invalid",
|
||||
'data': {
|
||||
'type': 'session_invalid',
|
||||
'debug': traceback.format_exc()
|
||||
}
|
||||
'data': se
|
||||
}
|
||||
except xmlrpclib.Fault, e:
|
||||
except Exception, e:
|
||||
se = serialize_exception(e)
|
||||
error = {
|
||||
'code': 200,
|
||||
'message': "OpenERP Server Error",
|
||||
'data': {
|
||||
'type': 'server_exception',
|
||||
'fault_code': e.faultCode,
|
||||
'debug': "Client %s\nServer %s" % (
|
||||
"".join(traceback.format_exception("", None, sys.exc_traceback)), e.faultString)
|
||||
}
|
||||
}
|
||||
except Exception:
|
||||
logging.getLogger(__name__ + '.JSONRequest.dispatch').exception\
|
||||
("An error occured while handling a json request")
|
||||
error = {
|
||||
'code': 300,
|
||||
'message': "OpenERP WebClient Error",
|
||||
'data': {
|
||||
'type': 'client_exception',
|
||||
'debug': "Client %s" % traceback.format_exc()
|
||||
}
|
||||
'data': se
|
||||
}
|
||||
if error:
|
||||
response["error"] = error
|
||||
|
@ -244,6 +226,36 @@ class JsonRequest(WebRequest):
|
|||
r = werkzeug.wrappers.Response(body, headers=[('Content-Type', mime), ('Content-Length', len(body))])
|
||||
return r
|
||||
|
||||
def serialize_exception(e):
|
||||
tmp = {
|
||||
"name": type(e).__module__ + "." + type(e).__name__ if type(e).__module__ else type(e).__name__,
|
||||
"debug": traceback.format_exc(),
|
||||
"message": u"%s" % e,
|
||||
"arguments": to_jsonable(e.args),
|
||||
}
|
||||
if isinstance(e, openerp.osv.osv.except_osv):
|
||||
tmp["exception_type"] = "except_osv"
|
||||
elif isinstance(e, openerp.exceptions.Warning):
|
||||
tmp["exception_type"] = "warning"
|
||||
elif isinstance(e, openerp.exceptions.AccessError):
|
||||
tmp["exception_type"] = "access_error"
|
||||
elif isinstance(e, openerp.exceptions.AccessDenied):
|
||||
tmp["exception_type"] = "access_denied"
|
||||
return tmp
|
||||
|
||||
def to_jsonable(o):
|
||||
if isinstance(o, str) or isinstance(o,unicode) or isinstance(o, int) or isinstance(o, long) \
|
||||
or isinstance(o, bool) or o is None or isinstance(o, float):
|
||||
return o
|
||||
if isinstance(o, list) or isinstance(o, tuple):
|
||||
return [to_jsonable(x) for x in o]
|
||||
if isinstance(o, dict):
|
||||
tmp = {}
|
||||
for k, v in o.items():
|
||||
tmp[u"%s" % k] = to_jsonable(v)
|
||||
return tmp
|
||||
return u"%s" % o
|
||||
|
||||
def jsonrequest(f):
|
||||
""" Decorator marking the decorated method as being a handler for a
|
||||
JSON-RPC request (the exact request path is specified via the
|
||||
|
@ -274,28 +286,15 @@ class HttpRequest(WebRequest):
|
|||
_logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw)
|
||||
try:
|
||||
r = method(self, **self.params)
|
||||
except xmlrpclib.Fault, e:
|
||||
r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps({
|
||||
except Exception, e:
|
||||
_logger.exception("An exception occured during an http request")
|
||||
se = serialize_exception(e)
|
||||
error = {
|
||||
'code': 200,
|
||||
'message': "OpenERP Server Error",
|
||||
'data': {
|
||||
'type': 'server_exception',
|
||||
'fault_code': e.faultCode,
|
||||
'debug': "Server %s\nClient %s" % (
|
||||
e.faultString, traceback.format_exc())
|
||||
}
|
||||
})))
|
||||
except Exception:
|
||||
logging.getLogger(__name__ + '.HttpRequest.dispatch').exception(
|
||||
"An error occurred while handling a json request")
|
||||
r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps({
|
||||
'code': 300,
|
||||
'message': "OpenERP WebClient Error",
|
||||
'data': {
|
||||
'type': 'client_exception',
|
||||
'debug': "Client %s" % traceback.format_exc()
|
||||
}
|
||||
})))
|
||||
'data': se
|
||||
}
|
||||
r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps(error)))
|
||||
if self.debug or 1:
|
||||
if isinstance(r, (werkzeug.wrappers.BaseResponse, werkzeug.exceptions.HTTPException)):
|
||||
_logger.debug('<-- %s', r)
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
"Language: es\n"
|
||||
|
||||
#. module: web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -29,21 +29,21 @@ msgstr "Oletuskieli:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:602
|
||||
#, python-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr ""
|
||||
msgstr "%d minuuttia sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:630
|
||||
#, python-format
|
||||
msgid "Still loading...<br />Please be patient."
|
||||
msgstr ""
|
||||
msgstr "Ladataan...<br />Olkaa hyvä ja odottakaa."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/search.js:1832
|
||||
#, python-format
|
||||
msgid "%(field)s %(operator)s \"%(value)s\""
|
||||
msgstr ""
|
||||
msgstr "%(field)s %(operator)s \"%(value)s\""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -59,7 +59,7 @@ msgstr "pienempi tai yhtäsuuri kuin"
|
|||
#: code:addons/web/static/src/js/chrome.js:393
|
||||
#, python-format
|
||||
msgid "Please enter your previous password"
|
||||
msgstr ""
|
||||
msgstr "Syötä edellinen salasanasi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -75,42 +75,42 @@ msgstr "Pääsalasana:"
|
|||
#: code:addons/web/static/src/xml/base.xml:274
|
||||
#, python-format
|
||||
msgid "Change Master Password"
|
||||
msgstr ""
|
||||
msgstr "Vaihda pääsalasana"
|
||||
|
||||
#. 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 "Oletko varma, että haluat poistaa tietokannan: %s ?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/search.js:1398
|
||||
#, python-format
|
||||
msgid "Search %(field)s at: %(value)s"
|
||||
msgstr ""
|
||||
msgstr "Hae %(field)s arvoista: %(value)s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:537
|
||||
#, python-format
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "Pääsy evätty"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:5183
|
||||
#, python-format
|
||||
msgid "Uploading error"
|
||||
msgstr ""
|
||||
msgstr "Lähetysvirhe"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:603
|
||||
#, python-format
|
||||
msgid "about an hour ago"
|
||||
msgstr ""
|
||||
msgstr "noin tunti sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -119,14 +119,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:216
|
||||
#, python-format
|
||||
msgid "Backup Database"
|
||||
msgstr ""
|
||||
msgstr "Varmuuskopioi tietokanta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views.js:463
|
||||
#, python-format
|
||||
msgid "%(view_type)s view"
|
||||
msgstr ""
|
||||
msgstr "%(view_type)s näkymä"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -134,7 +134,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/dates.js:53
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid date"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" ei ole kelvollinen päivämäärä"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -148,20 +148,20 @@ msgstr "Tässä on näyte tiedostosta jota ei voitu tuoda:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:601
|
||||
#, python-format
|
||||
msgid "about a minute ago"
|
||||
msgstr ""
|
||||
msgstr "noin minuutti sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1297
|
||||
#, python-format
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
msgstr "Tiedosto"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:826
|
||||
#, python-format
|
||||
msgid "You cannot leave any password empty."
|
||||
msgstr ""
|
||||
msgstr "Et voi jättää salasanaa tyhjäksi."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -192,7 +192,7 @@ msgstr "Valitse"
|
|||
#: code:addons/web/static/src/js/chrome.js:549
|
||||
#, python-format
|
||||
msgid "Database restored successfully"
|
||||
msgstr "Tietokanta palautettu onnistuneesti"
|
||||
msgstr "Tietokanta palautettu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -213,21 +213,21 @@ msgstr "Viimeisin muutospäivämäärä:"
|
|||
#: code:addons/web/static/src/js/search.js:1459
|
||||
#, python-format
|
||||
msgid "M2O search fields do not currently handle multiple default values"
|
||||
msgstr ""
|
||||
msgstr "Monesta yhteen hakukentät eivät salli useita oletusarvoja."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:1227
|
||||
#, python-format
|
||||
msgid "Widget type '%s' is not implemented"
|
||||
msgstr ""
|
||||
msgstr "Pienohjelman tyyppiä '%s' ei ole asennettu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1608
|
||||
#, python-format
|
||||
msgid "Share with all users"
|
||||
msgstr ""
|
||||
msgstr "Jaa kaikkien käyttäjien kanssa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -242,14 +242,14 @@ msgstr "Lomake"
|
|||
#: code:addons/web/static/src/xml/base.xml:1324
|
||||
#, python-format
|
||||
msgid "(no string)"
|
||||
msgstr ""
|
||||
msgstr "(ei merkkijonoa)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:282
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct time"
|
||||
msgstr ""
|
||||
msgstr "'%s' on virheellinen aika"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -270,7 +270,7 @@ msgstr "Uusi salasana:"
|
|||
#: code:addons/web/static/src/xml/base.xml:610
|
||||
#, python-format
|
||||
msgid "Attachment :"
|
||||
msgstr ""
|
||||
msgstr "Liite:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -291,49 +291,49 @@ msgstr "Määrittämätön"
|
|||
#: code:addons/web/static/src/js/view_form.js:4871
|
||||
#, python-format
|
||||
msgid "File Upload"
|
||||
msgstr ""
|
||||
msgstr "Tiedoston lähetys"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:607
|
||||
#, python-format
|
||||
msgid "about a month ago"
|
||||
msgstr ""
|
||||
msgstr "noin kuukausi sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1600
|
||||
#, python-format
|
||||
msgid "Custom Filters"
|
||||
msgstr ""
|
||||
msgstr "Muokattavat suodattimet"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1336
|
||||
#, python-format
|
||||
msgid "Button Type:"
|
||||
msgstr "Napin tyyppi:"
|
||||
msgstr "Painiketyyppi:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:419
|
||||
#, python-format
|
||||
msgid "OpenERP SA Company"
|
||||
msgstr ""
|
||||
msgstr "OpenERP SA yritys"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/search.js:1553
|
||||
#, python-format
|
||||
msgid "Custom Filter"
|
||||
msgstr ""
|
||||
msgstr "Mukautettu suodatin"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:159
|
||||
#, python-format
|
||||
msgid "Duplicate Database"
|
||||
msgstr ""
|
||||
msgstr "Kopioi tietokanta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -355,7 +355,7 @@ msgstr "Vaihda salasana"
|
|||
#: code:addons/web/static/src/js/view_form.js:3411
|
||||
#, python-format
|
||||
msgid "View type '%s' is not supported in One2Many."
|
||||
msgstr ""
|
||||
msgstr "Näkymätyyppiä '%s' ei tueta yhdestä moneen kentissä."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -370,7 +370,7 @@ msgstr "Lataa"
|
|||
#: code:addons/web/static/src/js/formats.js:266
|
||||
#, python-format
|
||||
msgid "'%s' is not a correct datetime"
|
||||
msgstr ""
|
||||
msgstr "'%s' on virheellinen päivämäärä"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -398,20 +398,20 @@ msgstr "Valinta:"
|
|||
#: code:addons/web/static/src/js/view_form.js:871
|
||||
#, python-format
|
||||
msgid "The following fields are invalid:"
|
||||
msgstr ""
|
||||
msgstr "Seuraavat kentät ovat virheellisiä:"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:847
|
||||
#, python-format
|
||||
msgid "Languages"
|
||||
msgstr ""
|
||||
msgstr "Kielet"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1270
|
||||
#, python-format
|
||||
msgid "...Upload in progress..."
|
||||
msgstr ""
|
||||
msgstr "...lähetys käynnissä..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -425,21 +425,21 @@ msgstr "Tuo"
|
|||
#: code:addons/web/static/src/js/chrome.js:543
|
||||
#, python-format
|
||||
msgid "Could not restore the database"
|
||||
msgstr ""
|
||||
msgstr "Tietokantaa ei voitu palauttaa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4851
|
||||
#, python-format
|
||||
msgid "File upload"
|
||||
msgstr ""
|
||||
msgstr "Tiedoston lähetys"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:3804
|
||||
#, python-format
|
||||
msgid "Action Button"
|
||||
msgstr ""
|
||||
msgstr "Toimintopainike"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -447,7 +447,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1467
|
||||
#, python-format
|
||||
msgid "Manage Filters"
|
||||
msgstr "Hallitse Suotimia"
|
||||
msgstr "Hallitse suodattimia"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -461,14 +461,14 @@ msgstr "sisältää"
|
|||
#: code:addons/web/static/src/js/coresetup.js:633
|
||||
#, python-format
|
||||
msgid "Take a minute to get a coffee,<br />because it's loading..."
|
||||
msgstr ""
|
||||
msgstr "Käy vaikka kahvilla,<br />koska tämä lataus kestää hetken..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:413
|
||||
#, python-format
|
||||
msgid "Activate the developer mode"
|
||||
msgstr ""
|
||||
msgstr "Aktivoi kehittäjätila"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -482,14 +482,14 @@ msgstr "Ladataan (%d)"
|
|||
#: code:addons/web/static/src/js/search.js:1114
|
||||
#, python-format
|
||||
msgid "GroupBy"
|
||||
msgstr ""
|
||||
msgstr "Järjestä"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_list.js:687
|
||||
#, python-format
|
||||
msgid "You must select at least one record."
|
||||
msgstr ""
|
||||
msgstr "Sinun täytyy valita vähintään yksi tietue."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -503,7 +503,7 @@ msgstr "Näytä loki (perm_read)"
|
|||
#: code:addons/web/static/src/js/view_form.js:1061
|
||||
#, python-format
|
||||
msgid "Set Default"
|
||||
msgstr "Aseta Oletukseksi"
|
||||
msgstr "Aseta oletukseksi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -517,7 +517,7 @@ msgstr "Suhde:"
|
|||
#: code:addons/web/static/src/js/coresetup.js:600
|
||||
#, python-format
|
||||
msgid "less than a minute ago"
|
||||
msgstr ""
|
||||
msgstr "alle minuutti sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -552,14 +552,14 @@ msgstr "Palautettu"
|
|||
#: code:addons/web/static/src/js/view_list.js:394
|
||||
#, python-format
|
||||
msgid "%d-%d of %d"
|
||||
msgstr ""
|
||||
msgstr "%d-%d %d :sta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:2868
|
||||
#, python-format
|
||||
msgid "Create and Edit..."
|
||||
msgstr ""
|
||||
msgstr "Luo ja muokkaa..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -573,7 +573,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:2346
|
||||
#, python-format
|
||||
msgid "Resource error"
|
||||
msgstr ""
|
||||
msgstr "Resurssivirhe"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -587,21 +587,21 @@ msgstr "ei ole"
|
|||
#: code:addons/web/static/src/xml/base.xml:550
|
||||
#, python-format
|
||||
msgid "Print Workflow"
|
||||
msgstr ""
|
||||
msgstr "Tulosta työnkulku"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:396
|
||||
#, python-format
|
||||
msgid "Please confirm your new password"
|
||||
msgstr ""
|
||||
msgstr "Vahvista uusi salasanasi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1804
|
||||
#, python-format
|
||||
msgid "UTF-8"
|
||||
msgstr ""
|
||||
msgstr "UTF-8"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -674,7 +674,7 @@ msgstr "Näkymä"
|
|||
#: code:addons/web/static/src/xml/base.xml:1466
|
||||
#, python-format
|
||||
msgid "Save Filter"
|
||||
msgstr "Tallenna suodin"
|
||||
msgstr "Tallenna suodatin"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -689,13 +689,14 @@ msgstr "Toiminnon ID:"
|
|||
#, python-format
|
||||
msgid "Your user's preference timezone does not match your browser timezone:"
|
||||
msgstr ""
|
||||
"Käyttäjätietojesi aikavyöhyke ei täsmää selaimesi aikavyöhykkeen kanssa:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:1223
|
||||
#, python-format
|
||||
msgid "Field '%s' specified in view could not be found."
|
||||
msgstr ""
|
||||
msgstr "Näkymässä määriteltyä kenttää '%s' ei löytynyt."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -716,21 +717,21 @@ msgstr "Vanha salasana:"
|
|||
#: code:addons/web/static/src/js/formats.js:113
|
||||
#, python-format
|
||||
msgid "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
|
||||
msgstr ""
|
||||
msgstr "bittiä,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 "Tietokanta on kopioitu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1625
|
||||
#, python-format
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
msgstr "Käytä"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -752,21 +753,21 @@ msgstr "Tallenna nimellä"
|
|||
#: code:addons/web/doc/module/static/src/xml/web_example.xml:3
|
||||
#, python-format
|
||||
msgid "00:00:00"
|
||||
msgstr ""
|
||||
msgstr "00:00:00"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:2317
|
||||
#, python-format
|
||||
msgid "E-mail error"
|
||||
msgstr ""
|
||||
msgstr "Sähköpostivirhe"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:605
|
||||
#, python-format
|
||||
msgid "a day ago"
|
||||
msgstr ""
|
||||
msgstr "päivä sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -780,7 +781,7 @@ msgstr "Onko tiedostossasi otsikot?"
|
|||
#: code:addons/web/static/src/js/view_list.js:327
|
||||
#, python-format
|
||||
msgid "Unlimited"
|
||||
msgstr "Ei rajoitettu"
|
||||
msgstr "Rajoittamaton"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -791,6 +792,9 @@ msgid ""
|
|||
"\n"
|
||||
"Are you sure you want to leave this page ?"
|
||||
msgstr ""
|
||||
"Varoitus, tietuetta on muokattu ja tekemäsi muutokset hylätään.\n"
|
||||
"\n"
|
||||
"Haluatko varmasti poistua tältä sivulta ?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -818,14 +822,14 @@ msgstr "Rajoitin:"
|
|||
#: code:addons/web/static/src/xml/base.xml:462
|
||||
#, python-format
|
||||
msgid "Browser's timezone"
|
||||
msgstr ""
|
||||
msgstr "Selaimen aikavyhöhyke"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1605
|
||||
#, python-format
|
||||
msgid "Filter name"
|
||||
msgstr ""
|
||||
msgstr "Suodattimen nimi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -856,7 +860,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:421
|
||||
#, python-format
|
||||
msgid "OpenERP.com"
|
||||
msgstr ""
|
||||
msgstr "OpenERP.com"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -870,7 +874,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:636
|
||||
#, python-format
|
||||
msgid "Add..."
|
||||
msgstr ""
|
||||
msgstr "Lisää..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -945,14 +949,14 @@ msgstr "Käyttäjänimi"
|
|||
#: code:addons/web/static/src/js/chrome.js:481
|
||||
#, python-format
|
||||
msgid "Duplicating database"
|
||||
msgstr ""
|
||||
msgstr "Tietokantaa kopioidaan"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:563
|
||||
#, python-format
|
||||
msgid "Password has been changed successfully"
|
||||
msgstr ""
|
||||
msgstr "Salasana vaihdettu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -966,7 +970,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:533
|
||||
#, python-format
|
||||
msgid "Debug View#"
|
||||
msgstr ""
|
||||
msgstr "Kehitysnäkymä#"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1014,7 +1018,7 @@ msgstr "Tallenna kenttäluettelo"
|
|||
#: code:addons/web/doc/module/static/src/xml/web_example.xml:5
|
||||
#, python-format
|
||||
msgid "Start"
|
||||
msgstr ""
|
||||
msgstr "Aloita"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1035,14 +1039,14 @@ msgstr "Luontipäivämäärä:"
|
|||
#: code:addons/web/controllers/main.py:835
|
||||
#, python-format
|
||||
msgid "Error, password not changed !"
|
||||
msgstr ""
|
||||
msgstr "Virhe, salasanaa ei muutettu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4850
|
||||
#, python-format
|
||||
msgid "The selected file exceed the maximum file size of %s."
|
||||
msgstr ""
|
||||
msgstr "Tiedoston suurin sallittu koko %s ylitetty."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1050,14 +1054,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1300
|
||||
#, 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 "Salasana vaihdettu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1091,14 +1095,14 @@ msgstr "Varmuuskopioi"
|
|||
#: code:addons/web/static/src/js/dates.js:80
|
||||
#, python-format
|
||||
msgid "'%s' is not a valid time"
|
||||
msgstr ""
|
||||
msgstr "\"%s\" ei ole kelvollinen aika"
|
||||
|
||||
#. 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' ei ole kelvollinen päivämäärä"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1112,14 +1116,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:606
|
||||
#, python-format
|
||||
msgid "%d days ago"
|
||||
msgstr ""
|
||||
msgstr "%d päivää sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1474
|
||||
#, python-format
|
||||
msgid "(Any existing filter with the same name will be replaced)"
|
||||
msgstr "(jo olemassaoleva samanniminen suodin korvataan)"
|
||||
msgstr ""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1166,7 +1170,7 @@ msgstr "Tuntematon operaattori %s toimialueella %s"
|
|||
#: code:addons/web/static/src/js/view_form.js:428
|
||||
#, python-format
|
||||
msgid "%d / %d"
|
||||
msgstr ""
|
||||
msgstr "%d / %d"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1196,7 +1200,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:608
|
||||
#, python-format
|
||||
msgid "%d months ago"
|
||||
msgstr ""
|
||||
msgstr "%d kuukautta sitten"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1217,7 +1221,7 @@ msgstr "Lisää kehittynyt suodin"
|
|||
#: code:addons/web/controllers/main.py:828
|
||||
#, python-format
|
||||
msgid "The new password and its confirmation must be identical."
|
||||
msgstr ""
|
||||
msgstr "Uusi salasana sekä vahvistus tulee olla samat."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1225,14 +1229,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:248
|
||||
#, python-format
|
||||
msgid "Restore Database"
|
||||
msgstr ""
|
||||
msgstr "Palauta tietokanta"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:644
|
||||
#, python-format
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Kirjaudu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1346,28 +1350,28 @@ 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 "Salasanan vahvistus ei täsmää salasanan kanssa"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:441
|
||||
#, python-format
|
||||
msgid "Edit Company data"
|
||||
msgstr ""
|
||||
msgstr "Muokkaa yrityksen tietoja"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:4886
|
||||
#, python-format
|
||||
msgid "Save As..."
|
||||
msgstr ""
|
||||
msgstr "Tallenna nimellä..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:5007
|
||||
#, python-format
|
||||
msgid "Could not display the selected image."
|
||||
msgstr ""
|
||||
msgstr "Valittua kuvaa ei voitu näyttää."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1390,7 +1394,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:394
|
||||
#, python-format
|
||||
msgid "99+"
|
||||
msgstr ""
|
||||
msgstr "99+"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1404,14 +1408,14 @@ msgstr "1. Tuo .CSV tiedosto"
|
|||
#: code:addons/web/static/src/js/chrome.js:644
|
||||
#, python-format
|
||||
msgid "No database selected !"
|
||||
msgstr ""
|
||||
msgstr "Tietokantaa ei valittu !"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/formats.js:180
|
||||
#, python-format
|
||||
msgid "(%d records)"
|
||||
msgstr ""
|
||||
msgstr "(%d tietuetta)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1425,7 +1429,7 @@ msgstr "Vaihda oletusarvo:"
|
|||
#: code:addons/web/static/src/xml/base.xml:171
|
||||
#, python-format
|
||||
msgid "Original database name:"
|
||||
msgstr ""
|
||||
msgstr "Alkuperäinen tietokannan nimi:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1449,7 +1453,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1619
|
||||
#, python-format
|
||||
msgid "Advanced Search"
|
||||
msgstr ""
|
||||
msgstr "Tarkennettu haku"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1496,7 +1500,7 @@ msgstr "Tuonnin valinnat"
|
|||
#: code:addons/web/static/src/js/view_form.js:2936
|
||||
#, python-format
|
||||
msgid "Add %s"
|
||||
msgstr ""
|
||||
msgstr "Lisää %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1534,7 +1538,7 @@ msgstr "CSV tiedosto:"
|
|||
#: code:addons/web/static/src/js/search.js:1741
|
||||
#, python-format
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
msgstr "Lisäasetukset"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -103,7 +103,7 @@ msgstr "Hozzáférés megtagadva"
|
|||
#: code:addons/web/static/src/js/view_form.js:5183
|
||||
#, python-format
|
||||
msgid "Uploading error"
|
||||
msgstr "Feltültési hiba"
|
||||
msgstr "Feltöltési hiba"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,29 +14,29 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:133
|
||||
#, python-format
|
||||
msgid "Default language:"
|
||||
msgstr ""
|
||||
msgstr "Bahasa standar:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:602
|
||||
#, python-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr ""
|
||||
msgstr "%d menit yang lalu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:630
|
||||
#, python-format
|
||||
msgid "Still loading...<br />Please be patient."
|
||||
msgstr ""
|
||||
msgstr "Sedang proses...<br />Harap menunggu."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -52,14 +52,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/search.js:1943
|
||||
#, python-format
|
||||
msgid "less or equal than"
|
||||
msgstr ""
|
||||
msgstr "kurang atau sama dengan"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:393
|
||||
#, python-format
|
||||
msgid "Please enter your previous password"
|
||||
msgstr ""
|
||||
msgstr "Harap masukkan kata sandi anda sebelumnya"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -68,14 +68,14 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:282
|
||||
#, python-format
|
||||
msgid "Master password:"
|
||||
msgstr ""
|
||||
msgstr "Kata sandi utama"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:274
|
||||
#, python-format
|
||||
msgid "Change Master Password"
|
||||
msgstr ""
|
||||
msgstr "Ubah Kata sandi utama"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -96,21 +96,21 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/chrome.js:537
|
||||
#, python-format
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "Akses Ditolak"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/view_form.js:5183
|
||||
#, python-format
|
||||
msgid "Uploading error"
|
||||
msgstr ""
|
||||
msgstr "Proses unggah gagal"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:603
|
||||
#, python-format
|
||||
msgid "about an hour ago"
|
||||
msgstr ""
|
||||
msgstr "Sekitar satu jam yang lalu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -119,7 +119,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:216
|
||||
#, python-format
|
||||
msgid "Backup Database"
|
||||
msgstr ""
|
||||
msgstr "Cadangkan basis data"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -141,34 +141,34 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1837
|
||||
#, python-format
|
||||
msgid "Here is a preview of the file we could not import:"
|
||||
msgstr ""
|
||||
msgstr "Berikut ini adalah pratinjau dari file yang tidak dapat kita impor"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/coresetup.js:601
|
||||
#, python-format
|
||||
msgid "about a minute ago"
|
||||
msgstr ""
|
||||
msgstr "Sekitar satu menit yang lalu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:1297
|
||||
#, python-format
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
msgstr "File"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:826
|
||||
#, python-format
|
||||
msgid "You cannot leave any password empty."
|
||||
msgstr ""
|
||||
msgstr "Anda tidak dapat mengosongkan kata sandi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:680
|
||||
#, python-format
|
||||
msgid "Invalid username or password"
|
||||
msgstr ""
|
||||
msgstr "Nama dan kata sandi tidak valid"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -185,7 +185,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1374
|
||||
#, python-format
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
msgstr "Pilih"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -199,14 +199,14 @@ msgstr "Database berhasil dipulihkan"
|
|||
#: code:addons/web/static/src/xml/base.xml:415
|
||||
#, python-format
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
msgstr "Versi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:570
|
||||
#, python-format
|
||||
msgid "Latest Modification Date:"
|
||||
msgstr ""
|
||||
msgstr "Tanggal modifikasi terakhir:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -227,7 +227,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:1608
|
||||
#, python-format
|
||||
msgid "Share with all users"
|
||||
msgstr ""
|
||||
msgstr "Bagikan dengan semua pengguna"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -235,7 +235,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_form.js:321
|
||||
#, python-format
|
||||
msgid "Form"
|
||||
msgstr ""
|
||||
msgstr "Formulir"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -256,21 +256,21 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/search.js:1297
|
||||
#, python-format
|
||||
msgid "not a valid number"
|
||||
msgstr ""
|
||||
msgstr "bukan nomor yang valid"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:325
|
||||
#, python-format
|
||||
msgid "New Password:"
|
||||
msgstr ""
|
||||
msgstr "Kata Sandi Baru:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:610
|
||||
#, python-format
|
||||
msgid "Attachment :"
|
||||
msgstr ""
|
||||
msgstr "lampiran"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -284,7 +284,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_list.js:1340
|
||||
#, python-format
|
||||
msgid "Undefined"
|
||||
msgstr ""
|
||||
msgstr "Belum terdefinisi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -298,7 +298,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/coresetup.js:607
|
||||
#, python-format
|
||||
msgid "about a month ago"
|
||||
msgstr ""
|
||||
msgstr "Sekitar satu bulan yang lalu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -363,7 +363,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_list.js:2194
|
||||
#, python-format
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
msgstr "Unduh"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -377,7 +377,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/js/view_list.js:417
|
||||
#, python-format
|
||||
msgid "Group"
|
||||
msgstr ""
|
||||
msgstr "Grup"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2612,3 +2612,9 @@ msgstr ""
|
|||
|
||||
#~ msgid "Change password"
|
||||
#~ msgstr "Ubah kata sandi"
|
||||
|
||||
#~ msgid "Import File"
|
||||
#~ msgstr "Impor File"
|
||||
|
||||
#~ msgid "Import Data"
|
||||
#~ msgstr "Impor Data"
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -477,7 +477,7 @@ msgstr "Хөгжүүлэгч горимыг идэвхжүүлэх"
|
|||
#: code:addons/web/static/src/js/chrome.js:324
|
||||
#, python-format
|
||||
msgid "Loading (%d)"
|
||||
msgstr "Ачаалж байна (%d)"
|
||||
msgstr "Ачааллаж байна (%d)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1146,7 +1146,7 @@ msgstr "Цуцлах"
|
|||
#: code:addons/web/static/src/xml/base.xml:9
|
||||
#, python-format
|
||||
msgid "Loading..."
|
||||
msgstr "Ачаалж байна..."
|
||||
msgstr "Ачааллаж байна..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -185,7 +185,7 @@ msgstr "Hoofdwachtwoord"
|
|||
#: code:addons/web/static/src/xml/base.xml:1374
|
||||
#, python-format
|
||||
msgid "Select"
|
||||
msgstr "Selecteren"
|
||||
msgstr "Kies"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -15,8 +15,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -83,14 +83,14 @@ msgstr "Alterar Senha Super Admin"
|
|||
#: code:addons/web/static/src/js/chrome.js:491
|
||||
#, python-format
|
||||
msgid "Do you really want to delete the database: %s ?"
|
||||
msgstr "Você realmente deseja excluir a base de dados: %s ?"
|
||||
msgstr "Você realmente que remover o banco de dados: %s ?"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/search.js:1398
|
||||
#, python-format
|
||||
msgid "Search %(field)s at: %(value)s"
|
||||
msgstr "Procurar %(field)s em: %(value)s"
|
||||
msgstr "Buscar %(field)s por: %(value)s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -120,7 +120,7 @@ msgstr "por volta de uma hora atrás"
|
|||
#: code:addons/web/static/src/xml/base.xml:216
|
||||
#, python-format
|
||||
msgid "Backup Database"
|
||||
msgstr "Cópia de segurança da base de dados"
|
||||
msgstr "Cópia de Segurança do Banco de Dados"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -36,7 +36,7 @@ msgstr "acum %d minute"
|
|||
#: code:addons/web/static/src/js/coresetup.js:630
|
||||
#, python-format
|
||||
msgid "Still loading...<br />Please be patient."
|
||||
msgstr "Inca se incarca...<br />Va rugam sa aveti rabdare."
|
||||
msgstr ""
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -433,7 +433,7 @@ msgstr "Baza de date nu a putut fi restabilita"
|
|||
#: code:addons/web/static/src/js/view_form.js:4851
|
||||
#, python-format
|
||||
msgid "File upload"
|
||||
msgstr "Incarcare fisier"
|
||||
msgstr "Încărcare fișier"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -476,7 +476,7 @@ msgstr "Activeaza modulul programare"
|
|||
#: code:addons/web/static/src/js/chrome.js:324
|
||||
#, python-format
|
||||
msgid "Loading (%d)"
|
||||
msgstr "Se incarca (%d)"
|
||||
msgstr "Se încarcă (%d)"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1149,7 +1149,7 @@ msgstr "Anuleaza"
|
|||
#: code:addons/web/static/src/xml/base.xml:9
|
||||
#, python-format
|
||||
msgid "Loading..."
|
||||
msgstr "Se incarca..."
|
||||
msgstr "Se încarcă..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1320,7 +1320,7 @@ msgstr "Trebuie sa selectati cel putin o inregistrare."
|
|||
#: code:addons/web/static/src/js/coresetup.js:631
|
||||
#, python-format
|
||||
msgid "Don't leave yet,<br />it's still loading..."
|
||||
msgstr "Nu plecati,<br />inca se incarca..."
|
||||
msgstr "Nu plecați,<br />încă se încarcă..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2349,7 +2349,7 @@ msgstr "Copiaza"
|
|||
#: code:addons/web/static/src/xml/base.xml:1391
|
||||
#, python-format
|
||||
msgid "Discard"
|
||||
msgstr "Elimina"
|
||||
msgstr "Renunță"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -400,7 +400,7 @@ msgstr "Выбор:"
|
|||
#: code:addons/web/static/src/js/view_form.js:871
|
||||
#, python-format
|
||||
msgid "The following fields are invalid:"
|
||||
msgstr "Следующие поля заполнены неверны:"
|
||||
msgstr "Следующие поля заполнены неверно:"
|
||||
|
||||
#. module: web
|
||||
#: code:addons/web/controllers/main.py:847
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -89,14 +89,14 @@ msgstr "Gerçekten %s veritabanını SİLMEK istiyor musunuz?"
|
|||
#: code:addons/web/static/src/js/search.js:1398
|
||||
#, python-format
|
||||
msgid "Search %(field)s at: %(value)s"
|
||||
msgstr "Search %(field)s at: %(value)s"
|
||||
msgstr "Armama %(field)s at: %(value)s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/chrome.js:537
|
||||
#, python-format
|
||||
msgid "Access Denied"
|
||||
msgstr "Erişim Reddedildi"
|
||||
msgstr "Erişim Reddedildi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -141,7 +141,7 @@ msgstr "'%s' geçerli bir tarih değil"
|
|||
#: code:addons/web/static/src/xml/base.xml:1837
|
||||
#, python-format
|
||||
msgid "Here is a preview of the file we could not import:"
|
||||
msgstr "İçeaktaramadığımız dosyanın önizlemesi:"
|
||||
msgstr "İçe-aktarılamıyan dosyanın önizlemesi:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -213,8 +213,7 @@ msgstr "Son Değiştirme tarihi:"
|
|||
#: code:addons/web/static/src/js/search.js:1459
|
||||
#, python-format
|
||||
msgid "M2O search fields do not currently handle multiple default values"
|
||||
msgstr ""
|
||||
"Çoktan teke arama alanları henüz çoklu öntanımlı değerleri desteklemiyor"
|
||||
msgstr "M2O arama alanları henüz çoklu öntanımlı değerleri desteklemiyor"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -313,7 +312,7 @@ msgstr "Özel Filtreler"
|
|||
#: code:addons/web/static/src/xml/base.xml:1336
|
||||
#, python-format
|
||||
msgid "Button Type:"
|
||||
msgstr "Buton Tipi:"
|
||||
msgstr "Buton Türü:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -327,7 +326,7 @@ msgstr "OpenERP SA Company"
|
|||
#: code:addons/web/static/src/js/search.js:1553
|
||||
#, python-format
|
||||
msgid "Custom Filter"
|
||||
msgstr "Özel Süzgeç"
|
||||
msgstr "Özel Filtre"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -385,7 +384,7 @@ msgstr "Grup"
|
|||
#: code:addons/web/static/src/xml/base.xml:927
|
||||
#, python-format
|
||||
msgid "Unhandled widget"
|
||||
msgstr "işlenmemiş parçacık"
|
||||
msgstr "İşlenmemiş parçacık"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -440,7 +439,7 @@ msgstr "Dosya yükle"
|
|||
#: code:addons/web/static/src/js/view_form.js:3804
|
||||
#, python-format
|
||||
msgid "Action Button"
|
||||
msgstr "Eylem Butonu"
|
||||
msgstr "İşlem Butonu"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -483,7 +482,7 @@ msgstr "(%d) Yükleniyor"
|
|||
#: code:addons/web/static/src/js/search.js:1114
|
||||
#, python-format
|
||||
msgid "GroupBy"
|
||||
msgstr "Grupla"
|
||||
msgstr "Gruplaİle"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -525,7 +524,7 @@ msgstr "bir dakika önce"
|
|||
#: code:addons/web/static/src/xml/base.xml:851
|
||||
#, python-format
|
||||
msgid "Condition:"
|
||||
msgstr "Durum:"
|
||||
msgstr "Koşul:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -560,7 +559,7 @@ msgstr "%d-%d / %d"
|
|||
#: code:addons/web/static/src/js/view_form.js:2868
|
||||
#, python-format
|
||||
msgid "Create and Edit..."
|
||||
msgstr "Oluştur ve düzenle..."
|
||||
msgstr "Oluştur ve Düzenle..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -616,7 +615,7 @@ msgstr "Daha ayrıntılı bilgi için burayı ziyaret edin"
|
|||
#: code:addons/web/static/src/xml/base.xml:1859
|
||||
#, python-format
|
||||
msgid "Add All Info..."
|
||||
msgstr "Bütün bilgiyi ekle..."
|
||||
msgstr "Bütün Bilgisini Ekle..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -682,7 +681,7 @@ msgstr "Filitreyi Kaydet"
|
|||
#: code:addons/web/static/src/xml/base.xml:1344
|
||||
#, python-format
|
||||
msgid "Action ID:"
|
||||
msgstr "Eylem ID:"
|
||||
msgstr "İşelme ID:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -704,7 +703,7 @@ msgstr "Ekranda tanımlanan '%s' alanı bulunamıyor."
|
|||
#: code:addons/web/static/src/xml/base.xml:1756
|
||||
#, python-format
|
||||
msgid "Saved exports:"
|
||||
msgstr "Kaydedilmiş Dışa Aktarımlar:"
|
||||
msgstr "Kaydedilmiş Dış-Aktarımlar:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -782,7 +781,7 @@ msgstr "Dosyanın başlık satırı varmı ?"
|
|||
#: code:addons/web/static/src/js/view_list.js:327
|
||||
#, python-format
|
||||
msgid "Unlimited"
|
||||
msgstr "Sınırsız"
|
||||
msgstr "Limitsiz"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -799,7 +798,7 @@ msgstr "Uyarı, kayıt değiştirildi, değişiklikleriniz kaybolacaklar."
|
|||
#: code:addons/web/static/src/js/view_form.js:2904
|
||||
#, python-format
|
||||
msgid "Search: "
|
||||
msgstr "Ara: "
|
||||
msgstr "Arama: "
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -834,7 +833,7 @@ msgstr "Filtre adı"
|
|||
#: code:addons/web/static/src/xml/base.xml:1464
|
||||
#, python-format
|
||||
msgid "-- Actions --"
|
||||
msgstr "-- Eylemler --"
|
||||
msgstr "-- İşlemler --"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -908,7 +907,7 @@ msgstr "Saat diliminizi değiştirmek için için tıklayın."
|
|||
#: code:addons/web/static/src/xml/base.xml:966
|
||||
#, python-format
|
||||
msgid "Modifiers:"
|
||||
msgstr "Düzenleyenler"
|
||||
msgstr "Değiştirenler:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -975,7 +974,7 @@ msgstr "Hata Ayıklama Görünümü#"
|
|||
#: code:addons/web/static/src/xml/base.xml:77
|
||||
#, python-format
|
||||
msgid "Log in"
|
||||
msgstr "Giriş yap"
|
||||
msgstr "Giriş"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1070,7 +1069,7 @@ msgstr "Parola Değişti"
|
|||
#: code:addons/web/static/src/xml/base.xml:1431
|
||||
#, python-format
|
||||
msgid "Search"
|
||||
msgstr "Ara"
|
||||
msgstr "Arama"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1186,7 +1185,7 @@ msgstr "Dosya biçimini kontrol edin"
|
|||
#: code:addons/web/static/src/xml/base.xml:1718
|
||||
#, python-format
|
||||
msgid "Name"
|
||||
msgstr "İsim"
|
||||
msgstr "Adı"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1277,7 +1276,7 @@ msgstr "Çıkış Yap"
|
|||
#: code:addons/web/static/src/js/search.js:1090
|
||||
#, python-format
|
||||
msgid "Group by: %s"
|
||||
msgstr "Grupla : %s"
|
||||
msgstr "Grupla ile : %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1429,7 +1428,7 @@ msgstr "(%d kayıt)"
|
|||
#: code:addons/web/static/src/xml/base.xml:970
|
||||
#, python-format
|
||||
msgid "Change default:"
|
||||
msgstr "Varsayılanı değiştir:"
|
||||
msgstr "Öntanılıyı değiştir:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1644,7 +1643,7 @@ msgstr "Boy:"
|
|||
#: code:addons/web/static/src/xml/base.xml:1824
|
||||
#, python-format
|
||||
msgid "--- Don't Import ---"
|
||||
msgstr "--- İçeri Alma ---"
|
||||
msgstr "--- İçeri Aktarma ---"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1716,7 +1715,7 @@ msgstr "Kodlama:"
|
|||
#: code:addons/web/static/src/xml/base.xml:1808
|
||||
#, python-format
|
||||
msgid "Lines to skip"
|
||||
msgstr "atlanacak satırlar"
|
||||
msgstr "Atlanacak satırlar"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1773,14 +1772,14 @@ msgstr "JS Testleri"
|
|||
#: code:addons/web/static/src/xml/base.xml:1750
|
||||
#, python-format
|
||||
msgid "Save as:"
|
||||
msgstr "Save as:"
|
||||
msgstr "Farklı kaydet:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/search.js:927
|
||||
#, python-format
|
||||
msgid "Filter on: %s"
|
||||
msgstr "Filterele: %s"
|
||||
msgstr "Filtrelede: %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1838,14 +1837,14 @@ msgstr "Veri Dışaaktar"
|
|||
#: code:addons/web/static/src/xml/base.xml:962
|
||||
#, python-format
|
||||
msgid "Domain:"
|
||||
msgstr "Alan:"
|
||||
msgstr "Domain:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/xml/base.xml:834
|
||||
#, python-format
|
||||
msgid "Default:"
|
||||
msgstr "Varsayılan:"
|
||||
msgstr "Öntanımlı:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1884,7 +1883,7 @@ msgstr "Yükleniyor ..."
|
|||
#: code:addons/web/static/src/xml/base.xml:1853
|
||||
#, python-format
|
||||
msgid "Name:"
|
||||
msgstr "İsim:"
|
||||
msgstr "Adı:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1898,7 +1897,7 @@ msgstr "Hakkında"
|
|||
#: code:addons/web/static/src/xml/base.xml:1431
|
||||
#, python-format
|
||||
msgid "Search Again"
|
||||
msgstr "Yeniden Ara"
|
||||
msgstr "Yeniden Arama"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1937,7 +1936,7 @@ msgstr ""
|
|||
#: code:addons/web/static/src/xml/base.xml:537
|
||||
#, python-format
|
||||
msgid "Set Defaults"
|
||||
msgstr "Varsayılanları Ayarla"
|
||||
msgstr "Öntanımlı Ayarla"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -1972,7 +1971,7 @@ msgstr "Filtre Adı:"
|
|||
#: code:addons/web/static/src/xml/base.xml:946
|
||||
#, python-format
|
||||
msgid "Type:"
|
||||
msgstr "Tip:"
|
||||
msgstr "Türü:"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2043,7 +2042,7 @@ msgstr "Ekle: "
|
|||
#: code:addons/web/static/src/xml/base.xml:1858
|
||||
#, python-format
|
||||
msgid "Quick Add"
|
||||
msgstr "Hızlı ekle"
|
||||
msgstr "Hızlı Ekle"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2286,7 +2285,7 @@ msgstr "Veritabanlarını Yönet"
|
|||
#: code:addons/web/static/src/js/pyeval.js:765
|
||||
#, python-format
|
||||
msgid "Evaluation Error"
|
||||
msgstr "Değerlendirme hatası"
|
||||
msgstr "Değerlendirme Hatası"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2379,7 +2378,7 @@ msgstr "Yedeklenmiş"
|
|||
#: code:addons/web/static/src/xml/base.xml:1610
|
||||
#, python-format
|
||||
msgid "Use by default"
|
||||
msgstr "Öntanımlı değer olarak kullan"
|
||||
msgstr "Öntanımlı kullan"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2414,7 +2413,7 @@ msgstr "Parçacık:"
|
|||
#: code:addons/web/static/src/xml/base.xml:548
|
||||
#, python-format
|
||||
msgid "Edit Action"
|
||||
msgstr "Eylemi Düzenle"
|
||||
msgstr "İşlemi Düzenle"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2428,7 +2427,7 @@ msgstr "ID:"
|
|||
#: code:addons/web/static/src/xml/base.xml:870
|
||||
#, python-format
|
||||
msgid "Only you"
|
||||
msgstr "sadece sen"
|
||||
msgstr "Sadece sen"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2477,7 +2476,7 @@ msgstr "Veritabanu %s silindi"
|
|||
#: code:addons/web/static/src/xml/base.xml:460
|
||||
#, python-format
|
||||
msgid "User's timezone"
|
||||
msgstr "Kullanıcı saat dilimi"
|
||||
msgstr "Kullanıcı saat-dilimi"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2534,7 +2533,7 @@ msgstr "Kaydet & Kapat"
|
|||
#: code:addons/web/static/src/js/view_form.js:2845
|
||||
#, python-format
|
||||
msgid "Search More..."
|
||||
msgstr "Daha fazla ara..."
|
||||
msgstr "Daha Fazla Ara..."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
@ -2565,7 +2564,7 @@ msgstr "Kaldır"
|
|||
#: code:addons/web/static/src/xml/base.xml:1062
|
||||
#, python-format
|
||||
msgid "Select date"
|
||||
msgstr "Tarihi Seç"
|
||||
msgstr "Tarihi seç"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,6 @@ import logging
|
|||
import time
|
||||
import traceback
|
||||
import sys
|
||||
import xmlrpclib
|
||||
|
||||
import openerp
|
||||
|
||||
|
@ -39,6 +38,7 @@ class Model(object):
|
|||
self.proxy = self.session.proxy('object')
|
||||
|
||||
def __getattr__(self, method):
|
||||
self.session.assert_valid()
|
||||
def proxy(*args, **kw):
|
||||
result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
|
||||
# reorder read
|
||||
|
@ -85,23 +85,7 @@ class OpenERPSession(object):
|
|||
self.jsonp_requests = {} # FIXME use a LRU
|
||||
|
||||
def send(self, service_name, method, *args):
|
||||
code_string = u"warning -- %s\n\n%s"
|
||||
try:
|
||||
return openerp.netsvc.dispatch_rpc(service_name, method, args)
|
||||
except openerp.osv.osv.except_osv, e:
|
||||
raise xmlrpclib.Fault(code_string % (e.name, e.value), '')
|
||||
except openerp.exceptions.Warning, e:
|
||||
raise xmlrpclib.Fault(code_string % ("Warning", e), '')
|
||||
except openerp.exceptions.AccessError, e:
|
||||
raise xmlrpclib.Fault(code_string % ("AccessError", e), '')
|
||||
except openerp.exceptions.AccessDenied, e:
|
||||
raise xmlrpclib.Fault('AccessDenied', openerp.tools.ustr(e))
|
||||
except openerp.exceptions.DeferredException, e:
|
||||
formatted_info = "".join(traceback.format_exception(*e.traceback))
|
||||
raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)
|
||||
except Exception, e:
|
||||
formatted_info = "".join(traceback.format_exception(*(sys.exc_info())))
|
||||
raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)
|
||||
return openerp.netsvc.dispatch_rpc(service_name, method, args)
|
||||
|
||||
def proxy(self, service):
|
||||
return Service(self, service)
|
||||
|
@ -126,8 +110,8 @@ class OpenERPSession(object):
|
|||
if self._uid and not force:
|
||||
return
|
||||
# TODO use authenticate instead of login
|
||||
uid = self.proxy("common").login(self._db, self._login, self._password)
|
||||
if not uid:
|
||||
self._uid = self.proxy("common").login(self._db, self._login, self._password)
|
||||
if not self._uid:
|
||||
raise AuthenticationError("Authentication failure")
|
||||
|
||||
def ensure_valid(self):
|
||||
|
@ -138,7 +122,6 @@ class OpenERPSession(object):
|
|||
self._uid = None
|
||||
|
||||
def execute(self, model, func, *l, **d):
|
||||
self.assert_valid()
|
||||
model = self.model(model)
|
||||
r = getattr(model, func)(*l, **d)
|
||||
return r
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
@charset "UTF-8";
|
||||
@charset "utf-8";
|
||||
@font-face {
|
||||
font-family: "mnmliconsRegular";
|
||||
src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
|
||||
|
@ -1263,7 +1263,7 @@
|
|||
color: white;
|
||||
padding: 2px 4px;
|
||||
margin: 1px 6px 0 0;
|
||||
border: 1px solid lightgrey;
|
||||
border: 1px solid lightGray;
|
||||
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
||||
-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
|
@ -1295,7 +1295,7 @@
|
|||
transform: scale(1.1);
|
||||
}
|
||||
.openerp .oe_secondary_submenu .oe_active {
|
||||
border-top: 1px solid lightgrey;
|
||||
border-top: 1px solid lightGray;
|
||||
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);
|
||||
|
@ -1415,7 +1415,13 @@
|
|||
display: inline-block;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_view_manager {
|
||||
display: table;
|
||||
height: inherit;
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_view_manager .oe_view_manager_body {
|
||||
display: table-row;
|
||||
height: inherit;
|
||||
}
|
||||
.openerp .oe_view_manager .oe_view_manager_view_kanban {
|
||||
|
@ -2251,7 +2257,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;
|
||||
|
@ -2323,6 +2329,7 @@
|
|||
width: 100%;
|
||||
display: inline-block;
|
||||
padding: 2px 2px 2px 0px;
|
||||
vertical-align: top;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field input {
|
||||
margin: 0px;
|
||||
|
@ -2366,7 +2373,6 @@
|
|||
white-space: nowrap;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_boolean {
|
||||
padding-top: 4px;
|
||||
width: auto;
|
||||
}
|
||||
.openerp .oe_form .oe_datepicker_container {
|
||||
|
@ -3088,8 +3094,25 @@
|
|||
color: #333333;
|
||||
}
|
||||
|
||||
@-moz-document url-prefix() {
|
||||
.openerp .oe_view_manager .oe_view_manager_switch li {
|
||||
line-height: 21px;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_search {
|
||||
top: -1px;
|
||||
}
|
||||
.openerp .oe_form_field_many2one .oe_m2o_cm_button {
|
||||
line-height: 18px;
|
||||
}
|
||||
.openerp .oe_secondary_submenu {
|
||||
line-height: 14px;
|
||||
}
|
||||
.openerp .oe_webclient .oe_star_on, .openerp .oe_webclient .oe_star_off {
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.kitten-mode-activated {
|
||||
background-image: url(http://placekitten.com/g/1365/769);
|
||||
background-size: cover;
|
||||
background-attachment: fixed;
|
||||
}
|
||||
|
@ -3142,6 +3165,10 @@ div.ui-widget-overlay {
|
|||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.openerp .db_option_table td {
|
||||
padding-bottom: 10px !important;
|
||||
}
|
||||
|
||||
.openerp_ie .oe_form_field_boolean input {
|
||||
background: white;
|
||||
}
|
||||
|
@ -3308,6 +3335,7 @@ div.ui-widget-overlay {
|
|||
overflow: hidden !important;
|
||||
}
|
||||
}
|
||||
|
||||
.blockUI.blockOverlay {
|
||||
background-color: black;
|
||||
opacity: 0.6;
|
||||
|
|
|
@ -1137,7 +1137,11 @@ $sheet-padding: 16px
|
|||
// }}}
|
||||
// ViewManager common {{{
|
||||
.oe_view_manager
|
||||
display: table
|
||||
height: inherit
|
||||
width: 100%
|
||||
.oe_view_manager_body
|
||||
display: table-row
|
||||
height: inherit
|
||||
.oe_view_manager_view_kanban
|
||||
height: inherit
|
||||
|
@ -1845,6 +1849,7 @@ $sheet-padding: 16px
|
|||
width: 100%
|
||||
display: inline-block
|
||||
padding: 2px 2px 2px 0px
|
||||
vertical-align: top
|
||||
input
|
||||
margin: 0px
|
||||
input[type="text"], input[type="password"], input[type="file"], select
|
||||
|
@ -1872,7 +1877,6 @@ $sheet-padding: 16px
|
|||
.oe_form_field_datetime
|
||||
white-space: nowrap
|
||||
.oe_form_field_boolean
|
||||
padding-top: 4px
|
||||
width: auto
|
||||
.oe_datepicker_container
|
||||
display: none
|
||||
|
@ -2434,9 +2438,22 @@ $sheet-padding: 16px
|
|||
float: right
|
||||
color: #333
|
||||
// }}}
|
||||
@-moz-document url-prefix()
|
||||
.openerp
|
||||
.oe_view_manager .oe_view_manager_switch li
|
||||
line-height: 21px
|
||||
.oe_searchview .oe_searchview_search
|
||||
top: -1px
|
||||
.oe_form_field_many2one .oe_m2o_cm_button
|
||||
line-height: 18px
|
||||
.oe_secondary_submenu
|
||||
line-height: 14px
|
||||
.oe_webclient
|
||||
.oe_star_on, .oe_star_off
|
||||
top: 0px
|
||||
|
||||
// Kitten Mode {{{
|
||||
.kitten-mode-activated
|
||||
background-image: url(http://placekitten.com/g/1365/769)
|
||||
background-size: cover
|
||||
background-attachment: fixed
|
||||
>*
|
||||
|
@ -2478,6 +2495,11 @@ div.ui-widget-overlay
|
|||
@include radius(3px)
|
||||
// }}}
|
||||
|
||||
.openerp
|
||||
.db_option_table
|
||||
td
|
||||
padding-bottom: 10px !important
|
||||
|
||||
// Internet Explorer 9+ specifics {{{
|
||||
.openerp_ie
|
||||
.oe_form_field_boolean input
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Binary file not shown.
After Width: | Height: | Size: 783 B |
|
@ -247,19 +247,17 @@ instance.web.CrashManager = instance.web.Class.extend({
|
|||
if (!this.active) {
|
||||
return;
|
||||
}
|
||||
// yes, exception handling is shitty
|
||||
if (error.code === 300 && error.data && error.data.type == "client_exception" && error.data.debug.match("SessionExpiredException")) {
|
||||
this.show_warning({type: "Session Expired", data: { fault_code: "Your OpenERP session expired. Please refresh the current web page." }});
|
||||
var handler = instance.web.crash_manager_registry.get_object(error.data.name, true);
|
||||
if (handler) {
|
||||
new (handler)(this, error).display();
|
||||
return;
|
||||
};
|
||||
if (error.data.name === "openerp.addons.web.session SessionExpiredException") {
|
||||
this.show_warning({type: "Session Expired", data: { message: "Your OpenERP session expired. Please refresh the current web page." }});
|
||||
return;
|
||||
}
|
||||
if (error.data.fault_code) {
|
||||
var split = ("" + error.data.fault_code).split('\n')[0].split(' -- ');
|
||||
if (split.length > 1) {
|
||||
error.type = split.shift();
|
||||
error.data.fault_code = error.data.fault_code.substr(error.type.length + 4);
|
||||
}
|
||||
}
|
||||
if (error.code === 200 && error.type) {
|
||||
if (error.data.exception_type === "except_osv" || error.data.exception_type === "warning"
|
||||
|| error.data.exception_type === "access_error") {
|
||||
this.show_warning(error);
|
||||
} else {
|
||||
this.show_error(error);
|
||||
|
@ -269,8 +267,11 @@ instance.web.CrashManager = instance.web.Class.extend({
|
|||
if (!this.active) {
|
||||
return;
|
||||
}
|
||||
if (error.data.exception_type === "except_osv") {
|
||||
error = _.extend({}, error, {data: _.extend({}, error.data, {message: error.data.arguments[0] + "\n\n" + error.data.arguments[1]})});
|
||||
}
|
||||
instance.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), {
|
||||
title: "OpenERP " + _.str.capitalize(error.type),
|
||||
title: "OpenERP " + (_.str.capitalize(error.type) || "Warning"),
|
||||
buttons: [
|
||||
{text: _t("Ok"), click: function() { $(this).dialog("close"); }}
|
||||
]
|
||||
|
@ -303,6 +304,57 @@ instance.web.CrashManager = instance.web.Class.extend({
|
|||
},
|
||||
});
|
||||
|
||||
/**
|
||||
An interface to implement to handle exceptions. Register implementation in instance.web.crash_manager_registry.
|
||||
*/
|
||||
instance.web.ExceptionHandler = {
|
||||
/**
|
||||
@param parent The parent.
|
||||
@param error The error object as returned by the JSON-RPC implementation.
|
||||
*/
|
||||
init: function(parent, error) {},
|
||||
/**
|
||||
Called to inform to display the widget, if necessary. A typical way would be to implement
|
||||
this interface in a class extending instance.web.Dialog and simply display the dialog in this
|
||||
method.
|
||||
*/
|
||||
display: function() {},
|
||||
};
|
||||
|
||||
/**
|
||||
The registry to handle exceptions. It associate a fully qualified python exception name with a class implementing
|
||||
instance.web.ExceptionHandler.
|
||||
*/
|
||||
instance.web.crash_manager_registry = new instance.web.Registry();
|
||||
|
||||
/**
|
||||
* Handle redirection warnings, which behave more or less like a regular
|
||||
* warning, with an additional redirection button.
|
||||
*/
|
||||
instance.web.RedirectWarningHandler = instance.web.Dialog.extend(instance.web.ExceptionHandler, {
|
||||
init: function(parent, error) {
|
||||
this._super(parent);
|
||||
this.error = error;
|
||||
},
|
||||
display: function() {
|
||||
error = this.error;
|
||||
error.data.message = error.data.arguments[0];
|
||||
|
||||
instance.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), {
|
||||
title: "OpenERP " + (_.str.capitalize(error.type) || "Warning"),
|
||||
buttons: [
|
||||
{text: _t("Ok"), click: function() { $(this).dialog("close"); }},
|
||||
{text: error.data.arguments[2], click: function() {
|
||||
window.location.href='#action='+error.data.arguments[1];
|
||||
$(this).dialog("close");
|
||||
}}
|
||||
]
|
||||
});
|
||||
this.destroy();
|
||||
}
|
||||
});
|
||||
instance.web.crash_manager_registry.add('openerp.exceptions.RedirectWarning', 'instance.web.RedirectWarningHandler');
|
||||
|
||||
instance.web.Loading = instance.web.Widget.extend({
|
||||
template: _t("Loading"),
|
||||
init: function(parent) {
|
||||
|
@ -650,7 +702,7 @@ instance.web.Login = instance.web.Widget.extend({
|
|||
}
|
||||
},
|
||||
on_db_failed: function (error, event) {
|
||||
if (error.data.fault_code === 'AccessDenied') {
|
||||
if (error.data.name === 'openerp.exceptions.AccessDenied') {
|
||||
event.preventDefault();
|
||||
}
|
||||
},
|
||||
|
@ -1032,7 +1084,7 @@ instance.web.UserMenu = instance.web.Widget.extend({
|
|||
if (!self.session.uid)
|
||||
return;
|
||||
var func = new instance.web.Model("res.users").get_func("read");
|
||||
return func(self.session.uid, ["name", "company_id"]).then(function(res) {
|
||||
return self.alive(func(self.session.uid, ["name", "company_id"])).then(function(res) {
|
||||
var topbar_name = res.name;
|
||||
if(instance.session.debug)
|
||||
topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.session.db);
|
||||
|
@ -1048,6 +1100,9 @@ instance.web.UserMenu = instance.web.Widget.extend({
|
|||
};
|
||||
this.update_promise = this.update_promise.then(fct, fct);
|
||||
},
|
||||
on_menu_help: function() {
|
||||
window.open('http://help.openerp.com', '_blank');
|
||||
},
|
||||
on_menu_logout: function() {
|
||||
this.trigger('user_logout');
|
||||
},
|
||||
|
@ -1161,6 +1216,7 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
return $.when(this._super()).then(function() {
|
||||
if (jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined) {
|
||||
$("body").addClass("kitten-mode-activated");
|
||||
$("body").css("background-image", "url(" + instance.session.origin + "/web/static/src/img/back-enable.jpg" + ")");
|
||||
if ($.blockUI) {
|
||||
$.blockUI.defaults.message = '<img src="http://www.amigrave.com/kitten.gif">';
|
||||
}
|
||||
|
@ -1247,7 +1303,7 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
},
|
||||
logo_edit: function(ev) {
|
||||
var self = this;
|
||||
new instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"]).then(function(res) {
|
||||
new self.alive(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";
|
||||
|
@ -1268,7 +1324,7 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
},
|
||||
check_timezone: function() {
|
||||
var self = this;
|
||||
return new instance.web.Model('res.users').call('read', [[this.session.uid], ['tz_offset']]).then(function(result) {
|
||||
return self.alive(new instance.web.Model('res.users').call('read', [[this.session.uid], ['tz_offset']])).then(function(result) {
|
||||
var user_offset = result[0]['tz_offset'];
|
||||
var offset = -(new Date().getTimezoneOffset());
|
||||
// _.str.sprintf()'s zero front padding is buggy with signed decimals, so doing it manually
|
||||
|
@ -1344,8 +1400,9 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
},
|
||||
on_hashchange: function(event) {
|
||||
var self = this;
|
||||
var state = event.getState(true);
|
||||
if (!_.isEqual(this._current_state, state)) {
|
||||
var stringstate = event.getState(false);
|
||||
if (!_.isEqual(this._current_state, stringstate)) {
|
||||
var state = event.getState(true);
|
||||
if(!state.action && state.menu_id) {
|
||||
self.menu.has_been_loaded.done(function() {
|
||||
self.menu.do_reload().done(function() {
|
||||
|
@ -1357,13 +1414,13 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
this.action_manager.do_load_state(state, !!this._current_state);
|
||||
}
|
||||
}
|
||||
this._current_state = state;
|
||||
this._current_state = stringstate;
|
||||
},
|
||||
do_push_state: function(state) {
|
||||
this.set_title(state.title);
|
||||
delete state.title;
|
||||
var url = '#' + $.param(state);
|
||||
this._current_state = _.clone(state);
|
||||
this._current_state = $.deparam($.param(state), false); // stringify all values
|
||||
$.bbq.pushState(url);
|
||||
this.trigger('state_pushed', state);
|
||||
},
|
||||
|
@ -1373,9 +1430,10 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
.then(function (result) {
|
||||
return self.action_mutex.exec(function() {
|
||||
if (options.needaction) {
|
||||
result.context = new instance.web.CompoundContext(
|
||||
result.context,
|
||||
{search_default_message_unread: true});
|
||||
result.context = new instance.web.CompoundContext(result.context, {
|
||||
search_default_message_unread: true,
|
||||
search_disable_custom_filters: true,
|
||||
});
|
||||
}
|
||||
var completed = $.Deferred();
|
||||
$.when(self.action_manager.do_action(result, {
|
||||
|
|
|
@ -228,6 +228,38 @@ instance.web.ParentedMixin = {
|
|||
isDestroyed : function() {
|
||||
return this.__parentedDestroyed;
|
||||
},
|
||||
/**
|
||||
Utility method to only execute asynchronous actions if the current
|
||||
object has not been destroyed.
|
||||
|
||||
@param {Promise} promise The promise representing the asynchronous action.
|
||||
@param {bool} reject Defaults to false. If true, the returned promise will be
|
||||
rejected with no arguments if the current object is destroyed. If false,
|
||||
the returned promise will never be resolved nor rejected.
|
||||
@returns {Promise} A promise that will mirror the given promise if everything goes
|
||||
fine but will either be rejected with no arguments or never resolved if the
|
||||
current object is destroyed.
|
||||
*/
|
||||
alive: function(promise, reject) {
|
||||
var def = $.Deferred();
|
||||
var self = this;
|
||||
promise.done(function() {
|
||||
if (! self.isDestroyed()) {
|
||||
if (! reject)
|
||||
def.resolve.apply(def, arguments);
|
||||
else
|
||||
def.reject();
|
||||
}
|
||||
}).fail(function() {
|
||||
if (! self.isDestroyed()) {
|
||||
if (! reject)
|
||||
def.reject.apply(def, arguments);
|
||||
else
|
||||
def.reject();
|
||||
}
|
||||
});
|
||||
return def.promise();
|
||||
},
|
||||
/**
|
||||
* Inform the object it should destroy itself, releasing any
|
||||
* resource it could have reserved.
|
||||
|
@ -495,16 +527,7 @@ instance.web.Controller = instance.web.Class.extend(instance.web.PropertiesMixin
|
|||
return false;
|
||||
},
|
||||
rpc: function(url, data, options) {
|
||||
var def = $.Deferred();
|
||||
var self = this;
|
||||
instance.session.rpc(url, data, options).done(function() {
|
||||
if (!self.isDestroyed())
|
||||
def.resolve.apply(def, arguments);
|
||||
}).fail(function() {
|
||||
if (!self.isDestroyed())
|
||||
def.reject.apply(def, arguments);
|
||||
});
|
||||
return def.promise();
|
||||
return this.alive(instance.session.rpc(url, data, options));
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -674,10 +697,10 @@ instance.web.Widget = instance.web.Controller.extend({
|
|||
* Method called after rendering. Mostly used to bind actions, perform asynchronous
|
||||
* calls, etc...
|
||||
*
|
||||
* By convention, the method should return a promise to inform the caller when
|
||||
* this widget has been initialized.
|
||||
* By convention, this method should return an object that can be passed to $.when()
|
||||
* to inform the caller when this widget has been initialized.
|
||||
*
|
||||
* @returns {jQuery.Deferred}
|
||||
* @returns {jQuery.Deferred or any}
|
||||
*/
|
||||
start: function() {
|
||||
return $.when();
|
||||
|
@ -991,7 +1014,7 @@ instance.web.JsonRPC = instance.web.Class.extend(instance.web.PropertiesMixin, {
|
|||
self.trigger('response', response);
|
||||
if (!response.error) {
|
||||
deferred.resolve(response["result"], textStatus, jqXHR);
|
||||
} else if (response.error.data.type === "session_invalid") {
|
||||
} else if (response.error.code === 100) {
|
||||
self.uid = false;
|
||||
} else {
|
||||
deferred.reject(response.error, $.Event());
|
||||
|
|
|
@ -690,7 +690,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
|
|||
return filter.user_id && filter.is_default;
|
||||
});
|
||||
if (personal_filter) {
|
||||
this.custom_filters.enable_filter(personal_filter, true);
|
||||
this.custom_filters.toggle_filter(personal_filter, true);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -698,7 +698,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
|
|||
return !filter.user_id && filter.is_default;
|
||||
});
|
||||
if (global_filter) {
|
||||
this.custom_filters.enable_filter(global_filter, true);
|
||||
this.custom_filters.toggle_filter(global_filter, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1466,12 +1466,15 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({
|
|||
},
|
||||
complete: function (needle) {
|
||||
var self = this;
|
||||
// TODO: context
|
||||
// FIXME: "concurrent" searches (multiple requests, mis-ordered responses)
|
||||
var context = instance.web.pyeval.eval(
|
||||
'contexts', [this.view.dataset.get_context()]);
|
||||
return this.model.call('name_search', [], {
|
||||
name: needle,
|
||||
args: instance.web.pyeval.eval(
|
||||
'domains', this.attrs.domain ? [this.attrs.domain] : [], context),
|
||||
limit: 8,
|
||||
context: {}
|
||||
context: context
|
||||
}).then(function (results) {
|
||||
if (_.isEmpty(results)) { return null; }
|
||||
return [{label: self.attrs.string}].concat(
|
||||
|
@ -1541,6 +1544,9 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
|
|||
})
|
||||
.on('reset', this.proxy('clear_selection'));
|
||||
this.$el.on('submit', 'form', this.proxy('save_current'));
|
||||
this.$el.on('click', 'input[type=checkbox]', function() {
|
||||
$(this).siblings('input[type=checkbox]').prop('checked', false);
|
||||
});
|
||||
this.$el.on('click', 'h4', function () {
|
||||
self.$el.toggleClass('oe_opened');
|
||||
});
|
||||
|
@ -1591,6 +1597,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
|
|||
get_groupby: function () { return [filter.context]; },
|
||||
get_domain: function () { return filter.domain; }
|
||||
},
|
||||
_id: filter['id'],
|
||||
is_custom_filter: true,
|
||||
values: [{label: filter.name, value: null}]
|
||||
};
|
||||
|
@ -1632,10 +1639,18 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
|
|||
}
|
||||
|
||||
$filter.unbind('click').click(function () {
|
||||
self.enable_filter(filter);
|
||||
self.toggle_filter(filter);
|
||||
});
|
||||
},
|
||||
enable_filter: function (filter, preventSearch) {
|
||||
toggle_filter: function (filter, preventSearch) {
|
||||
var current = this.view.query.find(function (facet) {
|
||||
return facet.get('_id') === filter.id;
|
||||
});
|
||||
if (current) {
|
||||
this.view.query.remove(current);
|
||||
this.$filters[this.key_for(filter)].removeClass('oe_selected');
|
||||
return;
|
||||
}
|
||||
this.view.query.reset([this.facet_for(filter)], {
|
||||
preventSearch: preventSearch || false});
|
||||
this.$filters[this.key_for(filter)].addClass('oe_selected');
|
||||
|
@ -1800,6 +1815,7 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
|
|||
template: 'SearchView.extended_search.proposition',
|
||||
events: {
|
||||
'change .searchview_extended_prop_field': 'changed',
|
||||
'change .searchview_extended_prop_op': 'operator_changed',
|
||||
'click .searchview_extended_delete_prop': function (e) {
|
||||
e.stopPropagation();
|
||||
this.getParent().remove_proposition(this);
|
||||
|
@ -1831,6 +1847,17 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
|
|||
this.select_field(_.detect(this.fields, function(x) {return x.name == nval;}));
|
||||
}
|
||||
},
|
||||
operator_changed: function (e) {
|
||||
var $value = this.$('.searchview_extended_prop_value');
|
||||
switch ($(e.target).val()) {
|
||||
case '∃':
|
||||
case '∄':
|
||||
$value.hide();
|
||||
break;
|
||||
default:
|
||||
$value.show();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Selects the provided field object
|
||||
*
|
||||
|
@ -1859,7 +1886,7 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
|
|||
.text(String(operator.text))
|
||||
.appendTo(self.$('.searchview_extended_prop_op'));
|
||||
});
|
||||
var $value_loc = this.$('.searchview_extended_prop_value').empty();
|
||||
var $value_loc = this.$('.searchview_extended_prop_value').show().empty();
|
||||
this.value.appendTo($value_loc);
|
||||
|
||||
},
|
||||
|
@ -1867,19 +1894,12 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
|
|||
if ( this.attrs.selected == null)
|
||||
return null;
|
||||
var field = this.attrs.selected;
|
||||
var op = this.$('.searchview_extended_prop_op')[0];
|
||||
var operator = op.options[op.selectedIndex];
|
||||
var op_select = this.$('.searchview_extended_prop_op')[0];
|
||||
var operator = op_select.options[op_select.selectedIndex];
|
||||
|
||||
return {
|
||||
label: _.str.sprintf(_t('%(field)s %(operator)s "%(value)s"'), {
|
||||
field: field.string,
|
||||
// According to spec, HTMLOptionElement#label should return
|
||||
// HTMLOptionElement#text when not defined/empty, but it does
|
||||
// not in older Webkit (between Safari 5.1.5 and Chrome 17) and
|
||||
// Gecko (pre Firefox 7) browsers, so we need a manual fallback
|
||||
// for those
|
||||
operator: operator.label || operator.text,
|
||||
value: this.value}),
|
||||
value: [field.name, operator.value, this.value.get_value()]
|
||||
label: this.value.get_label(field, operator),
|
||||
value: this.value.get_domain(field, operator),
|
||||
};
|
||||
}
|
||||
});
|
||||
|
@ -1889,6 +1909,37 @@ instance.web.search.ExtendedSearchProposition.Field = instance.web.Widget.extend
|
|||
this._super(parent);
|
||||
this.field = field;
|
||||
},
|
||||
get_label: function (field, operator) {
|
||||
var format;
|
||||
switch (operator.value) {
|
||||
case '∃': case '∄': format = _t('%(field)s %(operator)s'); break;
|
||||
default: format = _t('%(field)s %(operator)s "%(value)s"'); break;
|
||||
}
|
||||
return this.format_label(format, field, operator);
|
||||
},
|
||||
format_label: function (format, field, operator) {
|
||||
return _.str.sprintf(format, {
|
||||
field: field.string,
|
||||
// According to spec, HTMLOptionElement#label should return
|
||||
// HTMLOptionElement#text when not defined/empty, but it does
|
||||
// not in older Webkit (between Safari 5.1.5 and Chrome 17) and
|
||||
// Gecko (pre Firefox 7) browsers, so we need a manual fallback
|
||||
// for those
|
||||
operator: operator.label || operator.text,
|
||||
value: this
|
||||
});
|
||||
},
|
||||
get_domain: function (field, operator) {
|
||||
switch (operator.value) {
|
||||
case '∃': return this.make_domain(field.name, '!=', false);
|
||||
case '∄': return this.make_domain(field.name, '=', false);
|
||||
default: return this.make_domain(
|
||||
field.name, operator.value, this.get_value());
|
||||
}
|
||||
},
|
||||
make_domain: function (field, operator, value) {
|
||||
return [field, operator, value];
|
||||
},
|
||||
/**
|
||||
* Returns a human-readable version of the value, in case the "logical"
|
||||
* and the "semantic" values of a field differ (as for selection fields,
|
||||
|
@ -1908,7 +1959,9 @@ instance.web.search.ExtendedSearchProposition.Char = instance.web.search.Extende
|
|||
{value: "ilike", text: _lt("contains")},
|
||||
{value: "not ilike", text: _lt("doesn't contain")},
|
||||
{value: "=", text: _lt("is equal to")},
|
||||
{value: "!=", text: _lt("is not equal to")}
|
||||
{value: "!=", text: _lt("is not equal to")},
|
||||
{value: "∃", text: _lt("is set")},
|
||||
{value: "∄", text: _lt("is not set")}
|
||||
],
|
||||
get_value: function() {
|
||||
return this.$el.val();
|
||||
|
@ -1922,7 +1975,9 @@ instance.web.search.ExtendedSearchProposition.DateTime = instance.web.search.Ext
|
|||
{value: ">", text: _lt("greater than")},
|
||||
{value: "<", text: _lt("less than")},
|
||||
{value: ">=", text: _lt("greater or equal than")},
|
||||
{value: "<=", text: _lt("less or equal than")}
|
||||
{value: "<=", text: _lt("less or equal than")},
|
||||
{value: "∃", text: _lt("is set")},
|
||||
{value: "∄", text: _lt("is not set")}
|
||||
],
|
||||
/**
|
||||
* Date widgets live in view_form which is not yet loaded when this is
|
||||
|
@ -1956,7 +2011,9 @@ instance.web.search.ExtendedSearchProposition.Integer = instance.web.search.Exte
|
|||
{value: ">", text: _lt("greater than")},
|
||||
{value: "<", text: _lt("less than")},
|
||||
{value: ">=", text: _lt("greater or equal than")},
|
||||
{value: "<=", text: _lt("less or equal than")}
|
||||
{value: "<=", text: _lt("less or equal than")},
|
||||
{value: "∃", text: _lt("is set")},
|
||||
{value: "∄", text: _lt("is not set")}
|
||||
],
|
||||
toString: function () {
|
||||
return this.$el.val();
|
||||
|
@ -1981,7 +2038,9 @@ instance.web.search.ExtendedSearchProposition.Float = instance.web.search.Extend
|
|||
{value: ">", text: _lt("greater than")},
|
||||
{value: "<", text: _lt("less than")},
|
||||
{value: ">=", text: _lt("greater or equal than")},
|
||||
{value: "<=", text: _lt("less or equal than")}
|
||||
{value: "<=", text: _lt("less or equal than")},
|
||||
{value: "∃", text: _lt("is set")},
|
||||
{value: "∄", text: _lt("is not set")}
|
||||
],
|
||||
toString: function () {
|
||||
return this.$el.val();
|
||||
|
@ -1999,7 +2058,9 @@ instance.web.search.ExtendedSearchProposition.Selection = instance.web.search.Ex
|
|||
template: 'SearchView.extended_search.proposition.selection',
|
||||
operators: [
|
||||
{value: "=", text: _lt("is")},
|
||||
{value: "!=", text: _lt("is not")}
|
||||
{value: "!=", text: _lt("is not")},
|
||||
{value: "∃", text: _lt("is set")},
|
||||
{value: "∄", text: _lt("is not set")}
|
||||
],
|
||||
toString: function () {
|
||||
var select = this.$el[0];
|
||||
|
@ -2016,7 +2077,10 @@ instance.web.search.ExtendedSearchProposition.Boolean = instance.web.search.Exte
|
|||
{value: "=", text: _lt("is true")},
|
||||
{value: "!=", text: _lt("is false")}
|
||||
],
|
||||
toString: function () { return ''; },
|
||||
get_label: function (field, operator) {
|
||||
return this.format_label(
|
||||
_t('%(field)s %(operator)s'), field, operator);
|
||||
},
|
||||
get_value: function() {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -72,7 +72,7 @@ openerp.test_support = {
|
|||
}
|
||||
return;
|
||||
}
|
||||
fn(e.data.fault_code);
|
||||
fn(e.data.name);
|
||||
})
|
||||
}
|
||||
};
|
||||
|
|
|
@ -247,13 +247,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
|
||||
do_load_state: function(state, warm) {
|
||||
if (state.id && this.datarecord.id != state.id) {
|
||||
if (!this.dataset.get_id_index(state.id)) {
|
||||
if (this.dataset.get_id_index(state.id) === null) {
|
||||
this.dataset.ids.push(state.id);
|
||||
}
|
||||
this.dataset.select_id(state.id);
|
||||
if (warm) {
|
||||
this.do_show();
|
||||
}
|
||||
this.do_show({ reload: warm });
|
||||
}
|
||||
},
|
||||
/**
|
||||
|
@ -511,9 +509,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
var on_change = widget.node.attrs.on_change;
|
||||
if (on_change) {
|
||||
var change_spec = self.parse_on_change(on_change, widget);
|
||||
var id = [self.datarecord.id == null ? [] : [self.datarecord.id]];
|
||||
def = new instance.web.Model(self.dataset.model).call(
|
||||
change_spec.method, id.concat(change_spec.args));
|
||||
var ids = [];
|
||||
if (self.datarecord.id && !instance.web.BufferedDataSet.virtual_id_regex.test(self.datarecord.id)) {
|
||||
// In case of a o2m virtual id, we should pass an empty ids list
|
||||
ids.push(self.datarecord.id);
|
||||
}
|
||||
def = self.alive(new instance.web.Model(self.dataset.model).call(
|
||||
change_spec.method, [ids].concat(change_spec.args)));
|
||||
} else {
|
||||
def = $.when({});
|
||||
}
|
||||
|
@ -531,9 +533,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
var condition = fieldname + '=' + value_;
|
||||
|
||||
if (value_) {
|
||||
return new instance.web.Model('ir.values').call(
|
||||
return self.alive(new instance.web.Model('ir.values').call(
|
||||
'get_defaults', [self.model, condition]
|
||||
).then(function (results) {
|
||||
)).then(function (results) {
|
||||
if (!results.length) {
|
||||
return response;
|
||||
}
|
||||
|
@ -1191,6 +1193,10 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
|
|||
$('button', doc).each(function() {
|
||||
$(this).attr('data-button-type', $(this).attr('type')).attr('type', 'button');
|
||||
});
|
||||
// IE's html parser is also a css parser. How convenient...
|
||||
$('board', doc).each(function() {
|
||||
$(this).attr('layout', $(this).attr('style'));
|
||||
});
|
||||
return $('<div class="oe_form"/>').append(instance.web.xml_to_str(doc));
|
||||
},
|
||||
render_to: function($target) {
|
||||
|
@ -2327,7 +2333,7 @@ instance.web.form.FieldUrl = instance.web.form.FieldChar.extend({
|
|||
this._super();
|
||||
} else {
|
||||
var tmp = this.get('value');
|
||||
var s = /(\w+):(.+)/.exec(tmp);
|
||||
var s = /(\w+):(.+)|^\.{0,2}\//.exec(tmp);
|
||||
if (!s) {
|
||||
tmp = "http://" + this.get('value');
|
||||
}
|
||||
|
@ -2376,6 +2382,7 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
|
|||
type_of_date: "datetime",
|
||||
events: {
|
||||
'change .oe_datepicker_master': 'change_datetime',
|
||||
'dragstart img.oe_datepicker_trigger': function () { return false; },
|
||||
},
|
||||
init: function(parent) {
|
||||
this._super(parent);
|
||||
|
@ -2395,6 +2402,11 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
|
|||
showButtonPanel: true,
|
||||
firstDay: Date.CultureInfo.firstDayOfWeek
|
||||
});
|
||||
// Some clicks in the datepicker dialog are not stopped by the
|
||||
// datepicker and "bubble through", unexpectedly triggering the bus's
|
||||
// click event. Prevent that.
|
||||
this.picker('widget').click(function (e) { e.stopPropagation(); });
|
||||
|
||||
this.$el.find('img.oe_datepicker_trigger').click(function() {
|
||||
if (self.get("effective_readonly") || self.picker('widget').is(':visible')) {
|
||||
self.$input.focus();
|
||||
|
@ -2957,7 +2969,9 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
|||
case $.ui.keyCode.DOWN:
|
||||
e.stopPropagation();
|
||||
}
|
||||
}
|
||||
},
|
||||
'dragstart .oe_m2o_drop_down_button img': function () { return false; },
|
||||
'dragstart .oe_m2o_cm_button': function () { return false; }
|
||||
},
|
||||
init: function(field_manager, node) {
|
||||
this._super(field_manager, node);
|
||||
|
@ -3047,9 +3061,9 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
|||
this.$input.keydown(input_changed);
|
||||
this.$input.change(input_changed);
|
||||
this.$drop_down.click(function() {
|
||||
self.$input.focus();
|
||||
if (self.$input.autocomplete("widget").is(":visible")) {
|
||||
self.$input.autocomplete("close");
|
||||
self.$input.focus();
|
||||
self.$input.autocomplete("close");
|
||||
} else {
|
||||
if (self.get("value") && ! self.floating) {
|
||||
self.$input.autocomplete("search", "");
|
||||
|
@ -3058,6 +3072,15 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Autocomplete close on dialog content scroll
|
||||
var close_autocomplete = _.debounce(function() {
|
||||
if (self.$input.autocomplete("widget").is(":visible")) {
|
||||
self.$input.autocomplete("close");
|
||||
}
|
||||
}, 50);
|
||||
this.$input.closest(".ui-dialog .ui-dialog-content").on('scroll', this, close_autocomplete);
|
||||
|
||||
self.ed_def = $.Deferred();
|
||||
self.uned_def = $.Deferred();
|
||||
var ed_delay = 200;
|
||||
|
@ -4094,6 +4117,13 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
|
|||
focus: function () {
|
||||
this.$text[0].focus();
|
||||
},
|
||||
set_dimensions: function (height, width) {
|
||||
this._super(height, width);
|
||||
this.$("textarea").css({
|
||||
width: width,
|
||||
minHeight: height
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
|
@ -4450,6 +4480,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
|
|||
* options:
|
||||
* -readonly: only applicable when not in creation mode, default to false
|
||||
* - alternative_form_view
|
||||
* - view_id
|
||||
* - write_function
|
||||
* - read_function
|
||||
* - create_function
|
||||
|
@ -4516,7 +4547,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
|
|||
_.extend(options, {
|
||||
$buttons: this.$buttonpane,
|
||||
});
|
||||
this.view_form = new instance.web.FormView(this, this.dataset, false, options);
|
||||
this.view_form = new instance.web.FormView(this, this.dataset, this.options.view_id || false, options);
|
||||
if (this.options.alternative_form_view) {
|
||||
this.view_form.set_embedded_view(this.options.alternative_form_view);
|
||||
}
|
||||
|
@ -4545,6 +4576,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
|
|||
});
|
||||
var $cbutton = self.$buttonpane.find(".oe_abstractformpopup-form-close");
|
||||
$cbutton.click(function() {
|
||||
self.view_form.trigger('on_button_cancel');
|
||||
self.check_exit();
|
||||
});
|
||||
self.view_form.do_show();
|
||||
|
@ -5014,7 +5046,7 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
|
|||
});
|
||||
|
||||
/**
|
||||
* Widget for (one2many field) to upload one or more file in same time and display in list.
|
||||
* Widget for (many2many field) to upload one or more file in same time and display in list.
|
||||
* The user can delete his files.
|
||||
* Options on attribute ; "blockui" {Boolean} block the UI or not
|
||||
* during the file is uploading
|
||||
|
@ -5028,6 +5060,8 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
if(this.field.type != "many2many" || this.field.relation != 'ir.attachment') {
|
||||
throw _.str.sprintf(_t("The type of the field '%s' must be a many2many field with a relation to 'ir.attachment' model."), this.field.string);
|
||||
}
|
||||
this.data = {};
|
||||
this.set_value([]);
|
||||
this.ds_file = new instance.web.DataSetSearch(this, 'ir.attachment');
|
||||
this.fileupload_id = _.uniqueId('oe_fileupload_temp');
|
||||
$(window).on(this.fileupload_id, _.bind(this.on_file_loaded, this));
|
||||
|
@ -5037,73 +5071,39 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
this.$el.on('change', 'input.oe_form_binary_file', this.on_file_change );
|
||||
},
|
||||
set_value: function(value_) {
|
||||
var value_ = value_ || [];
|
||||
var self = this;
|
||||
var ids = [];
|
||||
_.each(value_, function(command) {
|
||||
if (isNaN(command) && command.id == undefined) {
|
||||
switch (command[0]) {
|
||||
case commands.CREATE:
|
||||
ids = ids.concat(command[2]);
|
||||
return;
|
||||
case commands.REPLACE_WITH:
|
||||
ids = ids.concat(command[2]);
|
||||
return;
|
||||
case commands.UPDATE:
|
||||
ids = ids.concat(command[2]);
|
||||
return;
|
||||
case commands.LINK_TO:
|
||||
ids = ids.concat(command[1]);
|
||||
return;
|
||||
case commands.DELETE:
|
||||
ids = _.filter(ids, function (id) { return id != command[1];});
|
||||
return;
|
||||
case commands.DELETE_ALL:
|
||||
ids = [];
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
ids.push(command);
|
||||
}
|
||||
});
|
||||
this._super( ids );
|
||||
value_ = value_ || [];
|
||||
if (value_.length >= 1 && value_[0] instanceof Array) {
|
||||
value_ = value_[0][2];
|
||||
}
|
||||
this._super(value_);
|
||||
},
|
||||
get_value: function() {
|
||||
return _.map(this.get('value'), function (value) { return commands.link_to( isNaN(value) ? value.id : value ); });
|
||||
var tmp = [commands.replace_with(this.get("value"))];
|
||||
return tmp;
|
||||
},
|
||||
get_file_url: function (attachment) {
|
||||
return this.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: attachment['id']});
|
||||
},
|
||||
read_name_values : function () {
|
||||
var self = this;
|
||||
// select the list of id for a get_name
|
||||
var values = [];
|
||||
_.each(this.get('value'), function (val) {
|
||||
if (typeof val != 'object') {
|
||||
values.push(val);
|
||||
}
|
||||
});
|
||||
// don't reset know values
|
||||
var _value = _.filter(this.get('value'), function (id) { return typeof self.data[id] == 'undefined'; } );
|
||||
// send request for get_name
|
||||
if (values.length) {
|
||||
return this.ds_file.call('read', [values, ['id', 'name', 'datas_fname']]).done(function (datas) {
|
||||
if (_value.length) {
|
||||
return this.ds_file.call('read', [_value, ['id', 'name', 'datas_fname']]).done(function (datas) {
|
||||
_.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;
|
||||
}
|
||||
});
|
||||
self.data[data.id] = data;
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return $.when(this.get('value'));
|
||||
return $.when();
|
||||
}
|
||||
},
|
||||
render_value: function () {
|
||||
var self = this;
|
||||
this.read_name_values().then(function (datas) {
|
||||
this.read_name_values().then(function () {
|
||||
|
||||
var render = $(instance.web.qweb.render('FieldBinaryFileUploader.files', {'widget': self}));
|
||||
render.on('click', '.oe_delete', _.bind(self.on_file_delete, self));
|
||||
|
@ -5121,45 +5121,36 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
var self = this;
|
||||
var $target = $(event.target);
|
||||
if ($target.val() !== '') {
|
||||
|
||||
var filename = $target.val().replace(/.*[\\\/]/,'');
|
||||
|
||||
// if the files is currently uploded, don't send again
|
||||
if( !isNaN(_.find(this.get('value'), function (file) { return (file.filename || file.name) == filename && file.upload; } )) ) {
|
||||
// don't uplode more of one file in same time
|
||||
if (self.data[0] && self.data[0].upload ) {
|
||||
return false;
|
||||
}
|
||||
for (var id in this.get('value')) {
|
||||
// if the files exits, delete the file before upload (if it's a new file)
|
||||
if (self.data[id] && (self.data[id].filename || self.data[id].name) == filename && !self.data[id].no_unlink ) {
|
||||
self.ds_file.unlink([id]);
|
||||
}
|
||||
}
|
||||
|
||||
// block UI or not
|
||||
if(this.node.attrs.blockui>0) {
|
||||
instance.web.blockUI();
|
||||
}
|
||||
|
||||
// if the files exits for this answer, delete the file before upload
|
||||
var files = _.filter(this.get('value'), function (file) {
|
||||
if((file.filename || file.name) == filename) {
|
||||
self.ds_file.unlink([file.id]);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
// TODO : unactivate send on wizard and form
|
||||
|
||||
// submit file
|
||||
this.$('form.oe_form_binary_form').submit();
|
||||
this.$(".oe_fileupload").hide();
|
||||
|
||||
// add file on result
|
||||
files.push({
|
||||
// add file on data result
|
||||
this.data[0] = {
|
||||
'id': 0,
|
||||
'name': filename,
|
||||
'filename': filename,
|
||||
'url': '',
|
||||
'upload': true
|
||||
});
|
||||
|
||||
this.set({'value': files});
|
||||
};
|
||||
}
|
||||
},
|
||||
on_file_loaded: function (event, result) {
|
||||
|
@ -5170,39 +5161,39 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
|
|||
instance.web.unblockUI();
|
||||
}
|
||||
|
||||
// TODO : activate send on wizard and form
|
||||
|
||||
if (result.error || !result.id ) {
|
||||
this.do_warn( _t('Uploading error'), result.error);
|
||||
files = _.filter(files, function (val) { return !val.upload; });
|
||||
delete this.data[0];
|
||||
} 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)
|
||||
};
|
||||
}
|
||||
if (this.data[0] && this.data[0].filename == result.filename && this.data[0].upload) {
|
||||
delete this.data[0];
|
||||
this.data[result.id] = {
|
||||
'id': result.id,
|
||||
'name': result.name,
|
||||
'filename': result.filename,
|
||||
'url': this.get_file_url(result)
|
||||
};
|
||||
} else {
|
||||
this.data[result.id] = {
|
||||
'id': result.id,
|
||||
'name': result.name,
|
||||
'filename': result.filename,
|
||||
'url': this.get_file_url(result)
|
||||
};
|
||||
}
|
||||
var values = _.clone(this.get('value'));
|
||||
values.push(result.id);
|
||||
this.set({'value': values});
|
||||
}
|
||||
|
||||
this.set({'value': files});
|
||||
this.render_value()
|
||||
},
|
||||
on_file_delete: function (event) {
|
||||
event.stopPropagation();
|
||||
var file_id=$(event.target).data("id");
|
||||
if (file_id) {
|
||||
var files=[];
|
||||
for(var i in this.get('value')){
|
||||
if(file_id != this.get('value')[i].id){
|
||||
files.push(this.get('value')[i]);
|
||||
}
|
||||
else if(!this.get('value')[i].no_unlink) {
|
||||
this.ds_file.unlink([file_id]);
|
||||
}
|
||||
var files = _.filter(this.get('value'), function (id) {return id != file_id;});
|
||||
if(!this.data[file_id].no_unlink) {
|
||||
this.ds_file.unlink([file_id]);
|
||||
}
|
||||
this.set({'value': files});
|
||||
}
|
||||
|
@ -5216,8 +5207,20 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
|
|||
this.options.clickable = this.options.clickable || (this.node.attrs || {}).clickable || false;
|
||||
this.options.visible = this.options.visible || (this.node.attrs || {}).statusbar_visible || false;
|
||||
this.set({value: false});
|
||||
this.selection = [];
|
||||
this.set("selection", []);
|
||||
this.selection_dm = new instance.web.DropMisordered();
|
||||
},
|
||||
start: function() {
|
||||
this.field_manager.on("view_content_has_changed", this, this.calc_domain);
|
||||
this.calc_domain();
|
||||
this.on("change:value", this, this.get_selection);
|
||||
this.on("change:evaluated_selection_domain", this, this.get_selection);
|
||||
this.get_selection();
|
||||
this.on("change:selection", this, function() {
|
||||
this.selection = this.get("selection");
|
||||
this.render_value();
|
||||
});
|
||||
if (this.options.clickable) {
|
||||
this.$el.on('click','li',this.on_click_stage);
|
||||
}
|
||||
|
@ -5234,15 +5237,20 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
|
|||
},
|
||||
render_value: function() {
|
||||
var self = this;
|
||||
self.get_selection().done(function() {
|
||||
var content = QWeb.render("FieldStatus.content", {widget: self});
|
||||
self.$el.html(content);
|
||||
var colors = JSON.parse((self.node.attrs || {}).statusbar_colors || "{}");
|
||||
var color = colors[self.get('value')];
|
||||
if (color) {
|
||||
self.$("oe_active").css("color", color);
|
||||
}
|
||||
});
|
||||
var content = QWeb.render("FieldStatus.content", {widget: self});
|
||||
self.$el.html(content);
|
||||
var colors = JSON.parse((self.node.attrs || {}).statusbar_colors || "{}");
|
||||
var color = colors[self.get('value')];
|
||||
if (color) {
|
||||
self.$("oe_active").css("color", color);
|
||||
}
|
||||
},
|
||||
calc_domain: function() {
|
||||
var d = instance.web.pyeval.eval('domain', this.build_domain());
|
||||
domain = ['|', ['id', '=', this.get('value')]].concat(d);
|
||||
if (! _.isEqual(domain, this.get("evaluated_selection_domain"))) {
|
||||
this.set("evaluated_selection_domain", domain);
|
||||
}
|
||||
},
|
||||
/** Get the selection and render it
|
||||
* selection: [[identifier, value_to_display], ...]
|
||||
|
@ -5251,32 +5259,37 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
|
|||
*/
|
||||
get_selection: function() {
|
||||
var self = this;
|
||||
self.selection = [];
|
||||
if (this.field.type == "many2one") {
|
||||
var domain = [];
|
||||
if(!_.isEmpty(this.field.domain) || !_.isEmpty(this.node.attrs.domain)) {
|
||||
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) {
|
||||
for(var i = 0; i < records.length; i++) {
|
||||
self.selection.push([records[i].id, records[i].name]);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// For field type selection filter values according to
|
||||
// statusbar_visible attribute of the field. For example:
|
||||
// statusbar_visible="draft,open".
|
||||
var selection = this.field.selection;
|
||||
for(var i=0; i < selection.length; i++) {
|
||||
var key = selection[i][0];
|
||||
if(key == this.get('value') || !this.options.visible || this.options.visible.indexOf(key) != -1) {
|
||||
this.selection.push(selection[i]);
|
||||
var selection = [];
|
||||
|
||||
var calculation = _.bind(function() {
|
||||
if (this.field.type == "many2one") {
|
||||
var domain = [];
|
||||
var ds = new instance.web.DataSetSearch(this, this.field.relation,
|
||||
self.build_context(), this.get("evaluated_selection_domain"));
|
||||
return ds.read_slice(['name'], {}).then(function (records) {
|
||||
for(var i = 0; i < records.length; i++) {
|
||||
selection.push([records[i].id, records[i].name]);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// For field type selection filter values according to
|
||||
// statusbar_visible attribute of the field. For example:
|
||||
// statusbar_visible="draft,open".
|
||||
var select = this.field.selection;
|
||||
for(var i=0; i < select.length; i++) {
|
||||
var key = select[i][0];
|
||||
if(key == this.get('value') || !this.options.visible || this.options.visible.indexOf(key) != -1) {
|
||||
selection.push(select[i]);
|
||||
}
|
||||
}
|
||||
return $.when();
|
||||
}
|
||||
return $.when();
|
||||
}
|
||||
}, this);
|
||||
this.selection_dm.add(calculation()).then(function () {
|
||||
if (! _.isEqual(selection, self.get("selection"))) {
|
||||
self.set("selection", selection);
|
||||
}
|
||||
});
|
||||
},
|
||||
on_click_stage: function (ev) {
|
||||
var self = this;
|
||||
|
@ -5320,8 +5333,8 @@ instance.web.form.FieldMonetary = instance.web.form.FieldFloat.extend({
|
|||
this.set({"currency_info": null});
|
||||
return;
|
||||
}
|
||||
return this.ci_dm.add(new instance.web.Model("res.currency").query(["symbol", "position"])
|
||||
.filter([["id", "=", self.get("currency")]]).first()).then(function(res) {
|
||||
return this.ci_dm.add(self.alive(new instance.web.Model("res.currency").query(["symbol", "position"])
|
||||
.filter([["id", "=", self.get("currency")]]).first())).then(function(res) {
|
||||
self.set({"currency_info": res});
|
||||
});
|
||||
},
|
||||
|
|
|
@ -1186,7 +1186,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.
|
|||
}
|
||||
});
|
||||
instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.web.ListView.Groups# */{
|
||||
passtrough_events: 'action deleted row_link',
|
||||
passthrough_events: 'action deleted row_link',
|
||||
/**
|
||||
* Grouped display for the ListView. Handles basic DOM events and interacts
|
||||
* with the :js:class:`~DataGroup` bound to it.
|
||||
|
@ -1406,7 +1406,7 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
|
|||
// can have selections spanning multiple links
|
||||
var selection = self.get_selection();
|
||||
$this.trigger(e, [selection.ids, selection.records]);
|
||||
}).bind(this.passtrough_events, function (e) {
|
||||
}).bind(this.passthrough_events, function (e) {
|
||||
// additional positional parameters are provided to trigger as an
|
||||
// Array, following the event type or event object, but are
|
||||
// provided to the .bind event handler as *args.
|
||||
|
@ -2212,7 +2212,7 @@ instance.web.list.Binary = instance.web.list.Column.extend({
|
|||
if (value && value.substr(0, 10).indexOf(' ') == -1) {
|
||||
download_url = "data:application/octet-stream;base64," + value;
|
||||
} else {
|
||||
download_url = this.session.url('/web/binary/saveas', {model: options.model, field: this.id, id: options.id});
|
||||
download_url = instance.session.url('/web/binary/saveas', {model: options.model, field: this.id, id: options.id});
|
||||
if (this.filename) {
|
||||
download_url += '&filename_field=' + this.filename;
|
||||
}
|
||||
|
|
|
@ -132,6 +132,15 @@ openerp.web.list_editable = function (instance) {
|
|||
var self = this;
|
||||
// tree/@editable takes priority on everything else if present.
|
||||
var result = this._super(data, grouped);
|
||||
|
||||
// In case current editor was started previously, also has to run
|
||||
// when toggling from editable to non-editable in case form widgets
|
||||
// have setup global behaviors expecting themselves to exist
|
||||
// somehow.
|
||||
this.editor.destroy();
|
||||
// Editor is not restartable due to formview not being restartable
|
||||
this.editor = this.make_editor();
|
||||
|
||||
if (this.editable()) {
|
||||
this.$el.addClass('oe_list_editable');
|
||||
// FIXME: any hook available to ensure this is only done once?
|
||||
|
@ -143,10 +152,6 @@ openerp.web.list_editable = function (instance) {
|
|||
e.preventDefault();
|
||||
self.cancel_edition();
|
||||
});
|
||||
this.editor.destroy();
|
||||
// Editor is not restartable due to formview not being
|
||||
// restartable
|
||||
this.editor = this.make_editor();
|
||||
var editor_ready = this.editor.prependTo(this.$el)
|
||||
.done(this.proxy('setup_events'));
|
||||
|
||||
|
@ -795,7 +800,7 @@ openerp.web.list_editable = function (instance) {
|
|||
});
|
||||
|
||||
instance.web.ListView.Groups.include(/** @lends instance.web.ListView.Groups# */{
|
||||
passtrough_events: instance.web.ListView.Groups.prototype.passtrough_events + " edit saved",
|
||||
passthrough_events: instance.web.ListView.Groups.prototype.passthrough_events + " edit saved",
|
||||
get_row_for: function (record) {
|
||||
return _(this.children).chain()
|
||||
.invoke('get_row_for', record)
|
||||
|
|
|
@ -190,6 +190,18 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
});
|
||||
state = _.extend(params || {}, state);
|
||||
}
|
||||
if (this.inner_action.context) {
|
||||
var active_id = this.inner_action.context.active_id;
|
||||
if (active_id) {
|
||||
state["active_id"] = active_id;
|
||||
}
|
||||
var active_ids = this.inner_action.context.active_ids;
|
||||
if (active_ids && !(active_ids.length === 1 && active_ids[0] === active_id)) {
|
||||
// We don't push active_ids if it's a single element array containing the active_id
|
||||
// This makes the url shorter in most cases.
|
||||
state["active_ids"] = this.inner_action.context.active_ids.join(',');
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!this.dialog) {
|
||||
this.getParent().do_push_state(state);
|
||||
|
@ -212,8 +224,22 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
} else {
|
||||
var run_action = (!this.inner_widget || !this.inner_widget.action) || this.inner_widget.action.id !== state.action;
|
||||
if (run_action) {
|
||||
var add_context = {};
|
||||
if (state.active_id) {
|
||||
add_context.active_id = state.active_id;
|
||||
}
|
||||
if (state.active_ids) {
|
||||
// The jQuery BBQ plugin does some parsing on values that are valid integers.
|
||||
// It means that if there's only one item, it will do parseInt() on it,
|
||||
// otherwise it will keep the comma seperated list as string.
|
||||
add_context.active_ids = state.active_ids.toString().split(',').map(function(id) {
|
||||
return parseInt(id, 10) || id;
|
||||
});
|
||||
} else if (state.active_id) {
|
||||
add_context.active_ids = [state.active_id];
|
||||
}
|
||||
this.null_action();
|
||||
action_loaded = this.do_action(state.action);
|
||||
action_loaded = this.do_action(state.action, { additional_context: add_context });
|
||||
$.when(action_loaded || null).done(function() {
|
||||
instance.webclient.menu.has_been_loaded.done(function() {
|
||||
if (self.inner_action && self.inner_action.id) {
|
||||
|
@ -249,12 +275,25 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Execute an OpenERP action
|
||||
*
|
||||
* @param {Number|String|Object} Can be either an action id, a client action or an action descriptor.
|
||||
* @param {Object} [options]
|
||||
* @param {Boolean} [options.clear_breadcrumbs=false] Clear the breadcrumbs history list
|
||||
* @param {Function} [options.on_reverse_breadcrumb] Callback to be executed whenever an anterior breadcrumb item is clicked on.
|
||||
* @param {Function} [options.on_close] Callback to be executed when the dialog is closed (only relevant for target=new actions)
|
||||
* @param {Function} [options.action_menu_id] Manually set the menu id on the fly.
|
||||
* @param {Object} [options.additional_context] Additional context to be merged with the action's context.
|
||||
* @return {jQuery.Deferred} Action loaded
|
||||
*/
|
||||
do_action: function(action, options) {
|
||||
options = _.defaults(options || {}, {
|
||||
clear_breadcrumbs: false,
|
||||
on_reverse_breadcrumb: function() {},
|
||||
on_close: function() {},
|
||||
action_menu_id: null,
|
||||
additional_context: {},
|
||||
});
|
||||
if (action === false) {
|
||||
action = { type: 'ir.actions.act_window_close' };
|
||||
|
@ -269,9 +308,13 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
}
|
||||
|
||||
// Ensure context & domain are evaluated and can be manipulated/used
|
||||
if (action.context) {
|
||||
action.context = instance.web.pyeval.eval(
|
||||
'context', action.context);
|
||||
var ncontext = new instance.web.CompoundContext(options.additional_context, action.context || {});
|
||||
action.context = instance.web.pyeval.eval('context', ncontext);
|
||||
if (action.context.active_id || action.context.active_ids) {
|
||||
// Here we assume that when an `active_id` or `active_ids` is used
|
||||
// in the context, we are in a `related` action, so we disable the
|
||||
// searchview's default custom filters.
|
||||
action.context.search_disable_custom_filters = true;
|
||||
}
|
||||
if (action.domain) {
|
||||
action.domain = instance.web.pyeval.eval(
|
||||
|
@ -539,7 +582,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
_.each(_.keys(self.views), function(view_name) {
|
||||
var controller = self.views[view_name].controller;
|
||||
if (controller) {
|
||||
var container = self.$el.find(".oe_view_manager_view_" + view_name + ":first");
|
||||
var container = self.$el.find("> .oe_view_manager_body > .oe_view_manager_view_" + view_name);
|
||||
if (view_name === view_type) {
|
||||
container.show();
|
||||
controller.do_show(view_options || {});
|
||||
|
@ -582,7 +625,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
controller.on('switch_mode', self, this.switch_mode);
|
||||
controller.on('previous_view', self, this.prev_view);
|
||||
|
||||
var container = this.$el.find(".oe_view_manager_view_" + view_type);
|
||||
var container = this.$el.find("> .oe_view_manager_body > .oe_view_manager_view_" + view_type);
|
||||
var view_promise = controller.appendTo(container);
|
||||
this.views[view_type].controller = controller;
|
||||
this.views[view_type].deferred.resolve(view_type);
|
||||
|
@ -597,6 +640,12 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
self.trigger("controller_inited",view_type,controller);
|
||||
});
|
||||
},
|
||||
/**
|
||||
* @returns {Number|Boolean} the view id of the given type, false if not found
|
||||
*/
|
||||
get_view_id: function(view_type) {
|
||||
return this.views[view_type] && this.views[view_type].view_id || false;
|
||||
},
|
||||
set_title: function(title) {
|
||||
this.$el.find('.oe_view_title_text:first').text(title);
|
||||
},
|
||||
|
@ -953,10 +1002,11 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
|
|||
});
|
||||
},
|
||||
do_create_view: function(view_type) {
|
||||
var r = this._super.apply(this, arguments);
|
||||
var view = this.views[view_type].controller;
|
||||
view.set({ 'title': this.action.name });
|
||||
return r;
|
||||
var self = this;
|
||||
return this._super.apply(this, arguments).then(function() {
|
||||
var view = self.views[view_type].controller;
|
||||
view.set({ 'title': self.action.name });
|
||||
});
|
||||
},
|
||||
get_action_manager: function() {
|
||||
var cur = this;
|
||||
|
@ -1270,11 +1320,6 @@ instance.web.View = instance.web.Widget.extend({
|
|||
active_ids: [record_id],
|
||||
active_model: dataset.model
|
||||
});
|
||||
if (("" + action.context).match(/\bactive_id\b/)) {
|
||||
// Special case: when the context is evaluted using
|
||||
// the active_id, we want to disable the custom filters.
|
||||
ncontext.add({ search_disable_custom_filters: true });
|
||||
}
|
||||
}
|
||||
ncontext.add(action.context || {});
|
||||
action.context = ncontext;
|
||||
|
@ -1502,13 +1547,22 @@ instance.web.json_node_to_xml = function(node, human_readable, indent) {
|
|||
}
|
||||
};
|
||||
instance.web.xml_to_str = function(node) {
|
||||
var str = "";
|
||||
if (window.XMLSerializer) {
|
||||
return (new XMLSerializer()).serializeToString(node);
|
||||
str = (new XMLSerializer()).serializeToString(node);
|
||||
} else if (window.ActiveXObject) {
|
||||
return node.xml;
|
||||
str = node.xml;
|
||||
} else {
|
||||
throw new Error(_t("Could not serialize XML"));
|
||||
}
|
||||
// Browsers won't deal with self closing tags except br, hr, input, ...
|
||||
// http://stackoverflow.com/questions/97522/what-are-all-the-valid-self-closing-elements-in-xhtml-as-implemented-by-the-maj
|
||||
//
|
||||
// The following regex is a bit naive but it's ok for the xmlserializer output
|
||||
str = str.replace(/<([a-z]+)([^<>]*)\s*\/\s*>/g, function(match, tag, attrs) {
|
||||
return "<" + tag + attrs + "></" + tag + ">";
|
||||
});
|
||||
return str;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
<td>
|
||||
<p>
|
||||
<t t-js="d">
|
||||
var message = d.message ? d.message : d.error.data.fault_code;
|
||||
var message = d.message ? d.message : d.error.data.message;
|
||||
d.html_error = context.engine.tools.html_escape(message)
|
||||
.replace(/\n/g, '<br/>');
|
||||
</t>
|
||||
|
@ -106,33 +106,44 @@
|
|||
<div class="oe_view_manager_header" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Create Database</span>
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Create a New Database</span>
|
||||
</h2>
|
||||
<button type="submit" class="oe_button oe_highlight db_create">Create</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table align="center" class="db_option_table">
|
||||
<p class="oe_grey" style="margin: 10px">
|
||||
Fill in this form to create an OpenERP database. You can
|
||||
create databases for different companies or for different
|
||||
goals (testing, production). Once the database is created,
|
||||
you will be able to install your first application.
|
||||
</p>
|
||||
<p class="oe_grey" style="margin: 10px">
|
||||
By default, the master password is 'admin' if you did not changed it.
|
||||
</p>
|
||||
<table class="db_option_table" style="margin: 10px">
|
||||
<tr>
|
||||
<td><label for="super_admin_pwd">Master password:</label></td>
|
||||
<td><input type="password" name="super_admin_pwd" class="required" value="admin" /></td>
|
||||
<td>
|
||||
<input type="text" name="super_admin_pwd" class="required" value="admin"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="db_name">New database name:</label></td>
|
||||
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z][a-zA-Z0-9_-]+$" autofocus="true"/></td>
|
||||
<td><label for="db_name">Select a database name:</label></td>
|
||||
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z0-9][a-zA-Z0-9_-]+$" autofocus="true" placeholder="e.g. mycompany"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="demo_data">Load Demonstration data:</label></td>
|
||||
<td><label for="demo_data">Load demonstration data:</label></td>
|
||||
<td class="oe_form_group_cell">
|
||||
<span class="oe_form_field oe_form_field_boolean">
|
||||
<span class="oe_form_field oe_form_field_boolean oe_grey" >
|
||||
<input type="checkbox" name="demo_data" />
|
||||
Check this box to evaluate OpenERP.
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="db_lang">Default language:</label></td>
|
||||
<td class="oe_form_field oe_form_field_selection ">
|
||||
<select name="db_lang" t-if="widget.lang_list">
|
||||
<td class="oe_form_field oe_form_field_selection">
|
||||
<select name="db_lang" t-if="widget.lang_list" class="oe_inline">
|
||||
<t t-foreach="widget.lang_list" t-as="lang">
|
||||
<option t-att-value="lang[0]" t-att-selected="lang[0] === 'en_US' ? 'selected' : undefined">
|
||||
<t t-esc="lang[1]" />
|
||||
|
@ -142,13 +153,17 @@
|
|||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="create_admin_pwd">Admin password:</label></td>
|
||||
<td><label for="create_admin_pwd">Choose a password:</label></td>
|
||||
<td><input type="password" name="create_admin_pwd" class="required" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="create_confirm_pwd">Confirm password:</label></td>
|
||||
<td><input type="password" name="create_confirm_pwd" class="required" equalTo="input[name=create_admin_pwd]"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><button type="submit" class="oe_button oe_highlight db_create">Create Database</button></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<form id="db_duplicate" name="duplicate_db_form" style="display: none;">
|
||||
|
@ -403,8 +418,9 @@
|
|||
<img class="oe_topbar_avatar" t-att-data-default-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
|
||||
<span class="oe_topbar_name"/>
|
||||
<ul class="oe_dropdown_menu">
|
||||
<li><a href="#" data-menu="about">About OpenERP</a></li>
|
||||
<li><a href="#" data-menu="settings">Preferences</a></li>
|
||||
<li><a href="#" data-menu="about">About OpenERP</a></li>
|
||||
<li><a href="#" data-menu="help">Help</a></li>
|
||||
<li><a href="#" data-menu="logout">Log out</a></li>
|
||||
</ul>
|
||||
</span>
|
||||
|
@ -1265,8 +1281,9 @@
|
|||
</t>
|
||||
<t t-name="FieldBinaryFileUploader.files">
|
||||
<div class="oe_attachments">
|
||||
<t t-if="widget.get('value')">
|
||||
<t t-if="!widget.get('effective_readonly')" t-foreach="widget.get('value')" t-as="file">
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<t t-foreach="widget.get('value')" t-as="id">
|
||||
<t t-set="file" t-value="widget.data[id]"/>
|
||||
<div class="oe_attachment">
|
||||
<span t-if="(file.upload or file.percent_loaded<100)" t-attf-title="{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}" t-attf-name="{file.name || file.filename}">
|
||||
<span class="oe_fileuploader_in_process">...Upload in progress...</span>
|
||||
|
@ -1280,7 +1297,10 @@
|
|||
</t>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="widget.get('effective_readonly')" t-foreach="widget.get('value')" t-as="file">
|
||||
</t>
|
||||
<t t-if="widget.get('effective_readonly')">
|
||||
<t t-foreach="widget.get('value')" t-as="id">
|
||||
<t t-set="file" t-value="widget.data[id]"/>
|
||||
<div>
|
||||
<a t-att-href="file.url" t-attf-title="{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}">
|
||||
<t t-raw="file.name || file.filename"/>
|
||||
|
@ -1299,7 +1319,7 @@
|
|||
<span class='oe_attach_label'>File</span>
|
||||
<t t-call="HiddenInputFile">
|
||||
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
|
||||
<t t-set="fileupload_action">/web/binary/upload_attachment</t>
|
||||
<t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
|
||||
<input type="hidden" name="model" t-att-value="widget.view.model"/>
|
||||
<input type="hidden" name="id" value="0"/>
|
||||
<input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
|
||||
|
|
|
@ -318,6 +318,28 @@ openerp.testing.section('defaults', {
|
|||
"facet value should match provided default's selection");
|
||||
});
|
||||
});
|
||||
test("M2O default: value array", {asserts: 2}, function (instance, $s, mock) {
|
||||
var view = {inputs: []}, id = 5;
|
||||
var f = new instance.web.search.ManyToOneField(
|
||||
{attrs: {name: 'dummy', string: 'Dummy'}},
|
||||
{relation: 'dummy.model.name'},
|
||||
view);
|
||||
mock('dummy.model.name:name_get', function (args) {
|
||||
equal(args[0], id);
|
||||
return [[id, "DumDumDum"]];
|
||||
});
|
||||
return f.facet_for_defaults({dummy: [id]})
|
||||
.done(function (facet) {
|
||||
var model = facet;
|
||||
if (!(model instanceof instance.web.search.Facet)) {
|
||||
model = new instance.web.search.Facet(facet);
|
||||
}
|
||||
deepEqual(
|
||||
model.values.toJSON(),
|
||||
[{label: "DumDumDum", value: id}],
|
||||
"should support default as a singleton");
|
||||
});
|
||||
});
|
||||
test("M2O default: value", {asserts: 1}, function (instance, $s, mock) {
|
||||
var view = {inputs: []}, id = 4;
|
||||
var f = new instance.web.search.ManyToOneField(
|
||||
|
@ -330,6 +352,15 @@ openerp.testing.section('defaults', {
|
|||
ok(!facet, "an invalid m2o default should yield a non-facet");
|
||||
});
|
||||
});
|
||||
test("M2O default: values", {rpc: false}, function (instance) {
|
||||
var view = {inputs: []};
|
||||
var f = new instance.web.search.ManyToOneField(
|
||||
{attrs: {name: 'dummy', string: 'Dummy'}},
|
||||
{relation: 'dummy.model.name'},
|
||||
view);
|
||||
raises(function () { f.facet_for_defaults({dummy: [6, 7]}) },
|
||||
"should not accept multiple default values");
|
||||
})
|
||||
});
|
||||
openerp.testing.section('completions', {
|
||||
dependencies: ['web.search'],
|
||||
|
@ -526,7 +557,7 @@ openerp.testing.section('completions', {
|
|||
return [[42, "choice 1"], [43, "choice @"]];
|
||||
});
|
||||
|
||||
var view = {inputs: []};
|
||||
var view = {inputs: [], dataset: {get_context: function () {}}};
|
||||
var f = new instance.web.search.ManyToOneField(
|
||||
{attrs: {string: 'Dummy'}}, {relation: 'dummy.model'}, view);
|
||||
return f.complete("bob")
|
||||
|
@ -555,7 +586,7 @@ openerp.testing.section('completions', {
|
|||
strictEqual(kwargs.name, 'bob');
|
||||
return [];
|
||||
});
|
||||
var view = {inputs: []};
|
||||
var view = {inputs: [], dataset: {get_context: function () {}}};
|
||||
var f = new instance.web.search.ManyToOneField(
|
||||
{attrs: {string: 'Dummy'}}, {relation: 'dummy.model'}, view);
|
||||
return f.complete("bob")
|
||||
|
@ -563,6 +594,26 @@ openerp.testing.section('completions', {
|
|||
ok(!c, "no match should yield no completion");
|
||||
});
|
||||
});
|
||||
test("M2O filtered", {asserts: 2}, function (instance, $s, mock) {
|
||||
mock('dummy.model:name_search', function (args, kwargs) {
|
||||
deepEqual(args, [], "should have no positional arguments");
|
||||
deepEqual(kwargs, {
|
||||
name: 'bob',
|
||||
limit: 8,
|
||||
args: [['foo', '=', 'bar']],
|
||||
context: {flag: 1},
|
||||
}, "should use filtering domain");
|
||||
return [[42, "Match"]];
|
||||
});
|
||||
var view = {
|
||||
inputs: [],
|
||||
dataset: {get_context: function () { return {flag: 1}; }}
|
||||
};
|
||||
var f = new instance.web.search.ManyToOneField(
|
||||
{attrs: {string: 'Dummy', domain: '[["foo", "=", "bar"]]'}},
|
||||
{relation: 'dummy.model'}, view);
|
||||
return f.complete("bob");
|
||||
});
|
||||
});
|
||||
openerp.testing.section('search-serialization', {
|
||||
dependencies: ['web.search'],
|
||||
|
@ -1038,6 +1089,44 @@ openerp.testing.section('saved_filters', {
|
|||
"should not be checked anymore");
|
||||
});
|
||||
});
|
||||
test('toggling', {asserts: 2}, function (instance, $fix, mock) {
|
||||
var view = makeSearchView(instance);
|
||||
mock('ir.filters:get_filters', function () {
|
||||
return [{name: 'filter name', user_id: 42, id: 1}];
|
||||
});
|
||||
|
||||
return view.appendTo($fix)
|
||||
.done(function () {
|
||||
var $row = $fix.find('.oe_searchview_custom li:first').click();
|
||||
equal(view.query.length, 1, "should have one facet");
|
||||
$row.click();
|
||||
equal(view.query.length, 0, "should have removed facet");
|
||||
});
|
||||
});
|
||||
test('replacement', {asserts: 4}, function (instance, $fix, mock) {
|
||||
var view = makeSearchView(instance);
|
||||
mock('ir.filters:get_filters', function () {
|
||||
return [
|
||||
{name: 'f', user_id: 42, id: 1, context: {'private': 1}},
|
||||
{name: 'f', user_id: false, id: 2, context: {'private': 0}}
|
||||
];
|
||||
});
|
||||
return view.appendTo($fix)
|
||||
.done(function () {
|
||||
$fix.find('.oe_searchview_custom li:eq(0)').click();
|
||||
equal(view.query.length, 1, "should have one facet");
|
||||
deepEqual(
|
||||
view.query.at(0).get('field').get_context(),
|
||||
{'private': 1},
|
||||
"should have selected first filter");
|
||||
$fix.find('.oe_searchview_custom li:eq(1)').click();
|
||||
equal(view.query.length, 1, "should have one facet");
|
||||
deepEqual(
|
||||
view.query.at(0).get('field').get_context(),
|
||||
{'private': 0},
|
||||
"should have selected second filter");
|
||||
});
|
||||
});
|
||||
});
|
||||
openerp.testing.section('advanced', {
|
||||
dependencies: ['web.search'],
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: web_calendar
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -15,8 +15,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
"Language: es\n"
|
||||
|
||||
#. module: web_calendar
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16455)\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-07 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16514)\n"
|
||||
|
||||
#. module: web_calendar
|
||||
#. openerp-web
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue