[Merge] with Trunk

bzr revid: ggh@tinyerp.com-20130312050346-e2zxslrbynqh01uz
This commit is contained in:
ggh-openerp 2013-03-12 10:33:46 +05:30
commit f5422e8533
338 changed files with 8377 additions and 1450 deletions

View File

@ -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

View File

@ -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">&lt;&lt; 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'

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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

2612
addons/web/i18n/ko.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

2602
addons/web/i18n/lv.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 "Eriim 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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, {

View File

@ -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());

View File

@ -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;
}

View File

@ -72,7 +72,7 @@ openerp.test_support = {
}
return;
}
fn(e.data.fault_code);
fn(e.data.name);
})
}
};

View File

@ -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});
});
},

View File

@ -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;
}

View File

@ -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)

View File

@ -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;
};
/**

View File

@ -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&lt;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"/>

View File

@ -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'],

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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