merge upstream

bzr revid: chs@openerp.com-20121010092351-h1c696eajfv1xfsn
This commit is contained in:
Christophe Simonis 2012-10-10 11:23:51 +02:00
commit f500b17988
287 changed files with 1601 additions and 2849 deletions

View File

@ -1,6 +1,13 @@
OpenERP Web
-----------
The OpenERP Web Client supports the following web browsers:
* Internet Explorer 9+
* Google Chrome 22+
* Firefox 13+
* Any browser using the latest version of Chrome Frame
To build the documentation use:
$ make doc

View File

@ -227,6 +227,8 @@ def module_installed_bypass_session(dbname):
return sorted_modules
def module_boot(req):
return [m for m in req.config.server_wide_modules if m in openerpweb.addons_manifest]
# TODO the following will be enabled once we separate the module code and translation loading
serverside = []
dbside = []
for i in req.config.server_wide_modules:
@ -531,6 +533,20 @@ def parse_context(context, session):
except ValueError:
return common.nonliterals.Context(session, context)
def _local_web_translations(trans_file):
messages = []
try:
with open(trans_file) as t_file:
po = babel.messages.pofile.read_po(t_file)
except Exception:
return
for x in po:
if x.id and x.string and "openerp-web" in x.auto_comments:
messages.append({'id': x.id, 'string': x.string})
return messages
#----------------------------------------------------------
# OpenERP Web web Controllers
#----------------------------------------------------------
@ -552,7 +568,27 @@ html_template = """<!DOCTYPE html>
});
</script>
</head>
<body></body>
<body>
<!--[if lte IE 8]>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
<script>
var test = function() {
CFInstall.check({
mode: "overlay"
});
};
if (window.localStorage && false) {
if (! localStorage.getItem("hasShownGFramePopup")) {
test();
localStorage.setItem("hasShownGFramePopup", true);
}
} else {
test();
}
</script>
<![endif]-->
</body>
</html>
"""
@ -576,6 +612,7 @@ class Home(openerpweb.Controller):
def login(self, req, db, login, key):
return login_and_redirect(req, db, login, key)
class WebClient(openerpweb.Controller):
_cp_path = "/web/webclient"
@ -658,41 +695,53 @@ class WebClient(openerpweb.Controller):
last_modified, checksum)
@openerpweb.jsonrequest
def translations(self, req, mods, lang):
lang_model = req.session.model('res.lang')
ids = lang_model.search([("code", "=", lang)])
if ids:
lang_obj = lang_model.read(ids[0], ["direction", "date_format", "time_format",
"grouping", "decimal_point", "thousands_sep"])
else:
lang_obj = None
def bootstrap_translations(self, req, mods):
""" Load local translations from *.po files, as a temporary solution
until we have established a valid session. This is meant only
for translating the login page and db management chrome, using
the browser's language. """
lang = req.httprequest.accept_languages.best or 'en'
# For performance reasons we only load a single translation, so for
# sub-languages (that should only be partially translated) we load the
# main language PO instead - that should be enough for the login screen.
if '-' in lang: # RFC2616 uses '-' separators for sublanguages
lang = lang.split('-')[0]
if "_" in lang:
separator = "_"
else:
separator = "@"
langs = lang.split(separator)
langs = [separator.join(langs[:x]) for x in range(1, len(langs) + 1)]
transs = {}
translations_per_module = {}
for addon_name in mods:
transl = {"messages":[]}
transs[addon_name] = transl
addons_path = openerpweb.addons_manifest[addon_name]['addons_path']
for l in langs:
f_name = os.path.join(addons_path, addon_name, "i18n", l + ".po")
if not os.path.exists(f_name):
continue
try:
with open(f_name) as t_file:
po = babel.messages.pofile.read_po(t_file)
except Exception:
continue
for x in po:
if x.id and x.string and "openerp-web" in x.auto_comments:
transl["messages"].append({'id': x.id, 'string': x.string})
return {"modules": transs,
"lang_parameters": lang_obj}
f_name = os.path.join(addons_path, addon_name, "i18n", lang + ".po")
if not os.path.exists(f_name):
continue
translations_per_module[addon_name] = {'messages': _local_web_translations(f_name)}
return {"modules": translations_per_module,
"lang_parameters": None}
@openerpweb.jsonrequest
def translations(self, req, mods, lang):
res_lang = req.session.model('res.lang')
ids = res_lang.search([("code", "=", lang)])
lang_params = None
if ids:
lang_params = res_lang.read(ids[0], ["direction", "date_format", "time_format",
"grouping", "decimal_point", "thousands_sep"])
# Regional languages (ll_CC) must inherit/override their parent lang (ll), but this is
# done server-side when the language is loaded, so we only need to load the user's lang.
ir_translation = req.session.model('ir.translation')
translations_per_module = {}
messages = ir_translation.search_read([('module','in',mods),('lang','=',lang),
('comments','like','openerp-web'),('value','!=',False),
('value','!=','')],
['module','src','value','lang'], order='module')
for mod, msg_group in itertools.groupby(messages, key=operator.itemgetter('module')):
translations_per_module.setdefault(mod,{'messages':[]})
translations_per_module[mod]['messages'].extend({'id': m['src'],
'string': m['value']} \
for m in msg_group)
return {"modules": translations_per_module,
"lang_parameters": lang_params}
@openerpweb.jsonrequest
def version_info(self, req):
@ -767,7 +816,7 @@ class Database(openerpweb.Controller):
{'fileToken': int(token)}
)
except xmlrpclib.Fault, e:
return simplejson.dumps([[],[{'error': e.faultCode, 'title': 'backup Database'}]])
return simplejson.dumps([[],[{'error': e.faultCode, 'title': 'backup Database'}]])
@openerpweb.httprequest
def restore(self, req, db_file, restore_pwd, new_db):
@ -1178,8 +1227,8 @@ class DataSet(openerpweb.Controller):
def call_button(self, req, model, method, args, domain_id=None, context_id=None):
action = self.call_common(req, model, method, args, domain_id, context_id)
if isinstance(action, dict) and action.get('type') != '':
return {'result': clean_action(req, action)}
return {'result': False}
return clean_action(req, action)
return False
@openerpweb.jsonrequest
def exec_workflow(self, req, model, id, signal):
@ -1565,13 +1614,6 @@ class Binary(openerpweb.Controller):
class Action(openerpweb.Controller):
_cp_path = "/web/action"
# For most actions, the type attribute and the model name are the same, but
# there are exceptions. This dict is used to remap action type attributes
# to the "real" model name when they differ.
action_mapping = {
"ir.actions.act_url": "ir.actions.url",
}
@openerpweb.jsonrequest
def load(self, req, action_id, do_not_eval=False):
Actions = req.session.model('ir.actions.actions')
@ -1595,11 +1637,10 @@ class Action(openerpweb.Controller):
if action_type == 'ir.actions.report.xml':
ctx.update({'bin_size': True})
ctx.update(context)
action_model = self.action_mapping.get(action_type, action_type)
action = req.session.model(action_model).read([action_id], False, ctx)
action = req.session.model(action_type).read([action_id], False, ctx)
if action:
value = clean_action(req, action[0], do_not_eval)
return {'result': value}
return value
@openerpweb.jsonrequest
def run(self, req, action_id):

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
"X-Poedit-Language: Czech\n"
#. 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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
"Language: es\n"
#. 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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:46+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176

View File

@ -68,10 +68,13 @@
background-color: #f0f0f0;
}
.openerp thead th {
border-right: 1px dotted #afafb6;
border-left: 1px solid #dfdfdf;
}
.openerp thead th:last-child {
border-right: none;
.openerp thead th:first-child {
border-left: none;
}
.openerp thead th.null {
border-left: none;
}
.openerp th, .openerp td {
padding: 0;
@ -515,6 +518,12 @@
.openerp .oe_webclient .oe_star_on {
color: gold;
}
.openerp p.oe_grey {
max-width: 650px;
}
.openerp .oe_grey {
color: #aaaaaa;
}
.openerp .oe_tag {
border: 1px solid #afafb6;
font-size: 11px;
@ -1081,9 +1090,8 @@
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
}
.openerp .oe_menu > li > .oe_active {
background: rgba(0, 0, 0, 0.2);
background: rgba(0, 0, 0, 0.3);
text-shadow: black 0px 0px 3px;
font-weight: bold;
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
@ -1843,6 +1851,13 @@
margin: 0;
white-space: nowrap;
}
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or {
visibility: hidden;
}
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or {
opacity: 0.5;
margin-left: -14px;
}
.openerp .oe_searchview .oe_searchview_drawer .oe_opened h4:before {
content: "▾ ";
position: relative;
@ -2028,49 +2043,47 @@
display: inline-block;
float: right;
}
.openerp .oe_form header .oe_form_button {
.openerp .oe_form header .oe_button {
margin: 3px 2px 1px;
}
.openerp .oe_form header .oe_button:first-child {
margin-left: 6px;
}
.openerp .oe_form header .oe_tags {
margin: 5px 0 0 5px;
width: 400px;
padding-bottom: 0;
}
.openerp .oe_form div.oe_chatter {
.openerp .oe_form header .oe_tags div.oe_chatter {
min-width: 650px;
max-width: 860px;
margin: 0 auto;
padding: 16px 0 48px;
}
.openerp .oe_form .oe_grey {
color: #aaaaaa;
max-width: 650px;
margin: 0 0 10px 0;
}
.openerp .oe_form div.oe_form_configuration p, .openerp .oe_form div.oe_form_configuration ul, .openerp .oe_form div.oe_form_configuration ol {
.openerp .oe_form header .oe_tags div.oe_form_configuration p, .openerp .oe_form header .oe_tags div.oe_form_configuration ul, .openerp .oe_form header .oe_tags div.oe_form_configuration ol {
color: #aaaaaa;
max-width: 650px;
}
.openerp .oe_form div.oe_form_configuration label {
.openerp .oe_form header .oe_tags div.oe_form_configuration label {
min-width: 150px;
}
.openerp .oe_form div.oe_form_configuration .oe_form_group_cell_label {
.openerp .oe_form header .oe_tags div.oe_form_configuration .oe_form_group_cell_label {
padding: 1px 0;
}
.openerp .oe_form div.oe_form_configuration .oe_form_group_cell div div {
.openerp .oe_form header .oe_tags div.oe_form_configuration .oe_form_group_cell div div {
padding: 1px 0;
}
.openerp .oe_form .oe_subtotal_footer {
.openerp .oe_form header .oe_tags .oe_subtotal_footer {
width: 1% !important;
}
.openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell {
.openerp .oe_form header .oe_tags .oe_subtotal_footer td.oe_form_group_cell {
text-align: right;
padding: 0 !important;
}
.openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell_label {
.openerp .oe_form header .oe_tags .oe_subtotal_footer td.oe_form_group_cell_label {
border-right: none;
}
.openerp .oe_form .oe_subtotal_footer .oe_subtotal_footer_separator {
.openerp .oe_form header .oe_tags .oe_subtotal_footer .oe_subtotal_footer_separator {
width: 108px;
border-top: 1px solid #cacaca;
margin-top: 4px;
@ -2078,14 +2091,14 @@
font-weight: bold;
font-size: 18px;
}
.openerp .oe_form .oe_subtotal_footer label:after {
.openerp .oe_form header .oe_tags .oe_subtotal_footer label:after {
content: ":";
}
.openerp .oe_form .oe_subtotal_footer label.oe_subtotal_footer_separator {
.openerp .oe_form header .oe_tags .oe_subtotal_footer label.oe_subtotal_footer_separator {
font-weight: bold !important;
padding: 2px 11px 2px 0px !important;
}
.openerp .oe_form .oe_subtotal_footer label.oe_form_label_help {
.openerp .oe_form header .oe_tags .oe_subtotal_footer label.oe_form_label_help {
font-weight: normal;
}
.openerp .oe_form .oe_form_button {
@ -2206,16 +2219,12 @@
min-width: 60px;
color: #1f1f1f;
}
.openerp .oe_form textarea {
height: 32px;
}
.openerp .oe_form input[readonly], .openerp .oe_form select[readonly], .openerp .oe_form textarea[readonly], .openerp .oe_form input[disabled], .openerp .oe_form select[disabled] {
background: #e5e5e5 !important;
color: #666666;
}
.openerp .oe_form textarea[disabled] {
border: none;
border-left: 8px solid #eeeeee;
padding-left: 8px;
-moz-box-shadow: none;
-webkit-box-shadow: none;
@ -2224,6 +2233,9 @@
-webkit-border-radius: 0px;
border-radius: 0px;
}
.openerp .oe_form textarea.oe_inline[disabled] {
border-left: 8px solid #eeeeee;
}
.openerp .oe_form .oe_form_field_url button img {
vertical-align: top;
}
@ -2241,7 +2253,7 @@
.openerp .oe_form .oe_datepicker_root {
display: inline-block;
}
.openerp .oe_form .oe_form_required input, .openerp .oe_form .oe_form_required select, .openerp .oe_form .oe_form_required textarea {
.openerp .oe_form .oe_form_required input:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required select:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required textarea:not([disabled]):not([readonly]) {
background-color: #d2d2ff !important;
}
.openerp .oe_form .oe_form_invalid input, .openerp .oe_form .oe_form_invalid select, .openerp .oe_form .oe_form_invalid textarea {
@ -2279,7 +2291,7 @@
position: relative;
overflow: hidden;
}
.openerp .oe_form .oe_form_field_html {
.openerp .oe_form .oe_form_embedded_html {
position: relative;
width: 600px;
margin-left: 130px;
@ -2287,16 +2299,16 @@
margin-bottom: 32px;
text-align: justify;
}
.openerp .oe_form_editable .oe_form .oe_form_field_integer {
.openerp .oe_form_editable .oe_form .oe_form_field_integer input {
width: 6em !important;
}
.openerp .oe_form_editable .oe_form .oe_form_field_float {
.openerp .oe_form_editable .oe_form .oe_form_field_float input {
width: 7em !important;
}
.openerp .oe_form_editable .oe_form .oe_form_field_date {
.openerp .oe_form_editable .oe_form .oe_form_field_date input {
width: 7.5em !important;
}
.openerp .oe_form_editable .oe_form .oe_form_field_datetime {
.openerp .oe_form_editable .oe_form .oe_form_field_datetime input {
width: 11.5em !important;
}
.openerp .oe_hidden_input_file {

View File

@ -180,9 +180,11 @@ $sheet-max-width: 860px
font-weight: bold
background-color: #f0f0f0
th
border-right: 1px dotted $tag-border
&:last-child
border-right: none
border-left: 1px solid #dfdfdf
&:first-child
border-left: none
&.null
border-left: none
th, td
padding: 0
text-align: left
@ -450,7 +452,13 @@ $sheet-max-width: 860px
text-decoration: none
.oe_star_on
color: gold
p.oe_grey
max-width: 650px
.oe_grey
color: #aaa
// }}}
// Tags (for many2many tags, among others) {{{
.oe_tag
border: 1px solid $tag-border
@ -809,7 +817,7 @@ $sheet-max-width: 860px
vertical-align: top
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
@include transition(all 0.2s ease-out)
&:hover,
&:hover
background: rgba(0,0,0,0.2)
text-shadow: black 0px 0px 3px
color: white
@ -869,15 +877,14 @@ $sheet-max-width: 860px
vertical-align: top
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
@include transition(all 0.2s ease-out)
&:hover,
&:hover
background: rgba(0,0,0,0.2)
text-shadow: black 0px 0px 3px
color: white
@include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset)
> .oe_active
background: rgba(0,0,0,0.2)
background: rgba(0,0,0,0.30)
text-shadow: black 0px 0px 3px
font-weight: bold
@include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset)
.oe_user_menu
@ -1466,6 +1473,11 @@ $sheet-max-width: 860px
list-style: none
margin: 0
white-space: nowrap
&:first-child .searchview_extended_prop_or
visibility: hidden
.searchview_extended_prop_or
opacity: 0.5
margin-left: -14px
.oe_opened
h4:before
content: ""
@ -1593,33 +1605,32 @@ $sheet-max-width: 860px
.oe_notebook_page
padding: 0 16px
// }}}
// FormView.header {{{
.oe_form header
position: relative
border-bottom: 1px solid #cacaca
padding-left: 2px
@include vertical-gradient(#fcfcfc, #dedede)
> span
margin-left: 4px
ul
display: inline-block
float: right
.oe_button,
margin: 3px 2px 1px
&:first-child
margin-left: 6px
// }}}
// FormView.custom tags and classes {{{
.oe_form
header
position: relative
border-bottom: 1px solid #cacaca
padding-left: 2px
@include vertical-gradient(#fcfcfc, #dedede)
> span
margin-left: 4px
ul
display: inline-block
float: right
.oe_form_button
margin: 3px 2px 1px
.oe_tags
margin: 5px 0 0 5px
width: 400px
padding-bottom: 0
.oe_form header .oe_tags
margin: 5px 0 0 5px
width: 400px
padding-bottom: 0
div.oe_chatter
min-width: 650px
max-width: $sheet-max-width
margin: 0 auto
padding: 16px 0 48px
.oe_grey
color: #aaa
max-width: 650px
margin: 0 0 10px 0
div.oe_form_configuration
p, ul, ol
color: #aaa
@ -1750,17 +1761,16 @@ $sheet-max-width: 860px
background: white
min-width: 60px
color: #1f1f1f
textarea
height: 32px
input[readonly], select[readonly], textarea[readonly], input[disabled], select[disabled]
background: #E5E5E5 !important
color: #666
textarea[disabled]
border: none
border-left: 8px solid #eee
padding-left: 8px
@include box-shadow(none)
@include radius(0px)
textarea.oe_inline[disabled]
border-left: 8px solid #eee
.oe_form_field_url button img
vertical-align: top
.oe_form_field_date,
@ -1773,8 +1783,8 @@ $sheet-max-width: 860px
display: none
.oe_datepicker_root
display: inline-block
.oe_form_required
input, select, textarea
.oe_form_required
input:not([disabled]):not([readonly]), select:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly])
background-color: #D2D2FF !important
.oe_form_invalid
input, select, textarea
@ -1805,7 +1815,7 @@ $sheet-max-width: 860px
> div
position: relative
overflow: hidden
.oe_form_field_html
.oe_form_embedded_html
position: relative
width: 600px
margin-left: 130px
@ -1815,13 +1825,13 @@ $sheet-max-width: 860px
.oe_form_editable
.oe_form
.oe_form_field_integer
.oe_form_field_integer input
width: 6em !important
.oe_form_field_float
.oe_form_field_float input
width: 7em !important
.oe_form_field_date
.oe_form_field_date input
width: 7.5em !important
.oe_form_field_datetime
.oe_form_field_datetime input
width: 11.5em !important
// }}}
// FormView.fields_binary {{{

View File

@ -146,8 +146,8 @@ instance.web.Dialog = instance.web.Widget.extend({
this.$buttons = $('<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" />');
this.$el.dialog("widget").append(this.$buttons);
}
var res = this.start();
this.dialog_inited = true;
var res = this.start();
return res;
},
close: function() {
@ -392,7 +392,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
do_create: function(form) {
var self = this;
var fields = $(form).serializeArray();
self.rpc("/web/database/create", {'fields': fields}, function(result) {
self.rpc("/web/database/create", {'fields': fields}).then(function(result) {
var form_obj = self.to_object(fields);
var client_action = {
type: 'ir.actions.client',
@ -418,7 +418,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
if (!db || !confirm("Do you really want to delete the database: " + db + " ?")) {
return;
}
self.rpc("/web/database/drop", {'fields': fields}, function(result) {
self.rpc("/web/database/drop", {'fields': fields}).then(function(result) {
if (result.error) {
self.display_error(result);
return;
@ -481,7 +481,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
var self = this;
self.rpc("/web/database/change_password", {
'fields': $(form).serializeArray()
}, function(result) {
}).then(function(result) {
if (result.error) {
self.display_error(result);
return;
@ -614,39 +614,32 @@ instance.web.client_actions.add("login", "instance.web.Login");
* Client action to reload the whole interface.
* If params has an entry 'menu_id', it opens the given menu entry.
*/
instance.web.Reload = instance.web.Widget.extend({
init: function(parent, params) {
this._super(parent);
this.menu_id = (params && params.menu_id) || false;
},
start: function() {
var l = window.location;
instance.web.Reload = function(parent, params) {
var menu_id = (params && params.menu_id) || false;
var l = window.location;
var sobj = $.deparam(l.search.substr(1));
sobj.ts = new Date().getTime();
var search = '?' + $.param(sobj);
var sobj = $.deparam(l.search.substr(1));
sobj.ts = new Date().getTime();
var search = '?' + $.param(sobj);
var hash = l.hash;
if (this.menu_id) {
hash = "#menu_id=" + this.menu_id;
}
var url = l.protocol + "//" + l.host + l.pathname + search + hash;
window.location = url;
var hash = l.hash;
if (menu_id) {
hash = "#menu_id=" + menu_id;
}
});
var url = l.protocol + "//" + l.host + l.pathname + search + hash;
window.location = url;
};
instance.web.client_actions.add("reload", "instance.web.Reload");
/**
* Client action to go back in breadcrumb history.
* If can't go back in history stack, will go back to home.
*/
instance.web.HistoryBack = instance.web.Widget.extend({
init: function(parent, params) {
if (!parent.history_back()) {
window.location = '/' + (window.location.search || '');
}
instance.web.HistoryBack = function(parent, params) {
if (!parent.history_back()) {
window.location = '/' + (window.location.search || '');
}
});
};
instance.web.client_actions.add("history_back", "instance.web.HistoryBack");
/**
@ -667,7 +660,7 @@ instance.web.ChangePassword = instance.web.Widget.extend({
submitHandler: function (form) {
self.rpc("/web/session/change_password",{
'fields': $(form).serializeArray()
}, function(result) {
}).then(function(result) {
if (result.error) {
self.display_error(result);
return;
@ -893,8 +886,8 @@ instance.web.UserMenu = instance.web.Widget.extend({
var self = this;
if (!this.getParent().has_uncommitted_changes()) {
self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }, function(result) {
result.result.res_id = instance.session.uid;
self.getParent().action_manager.do_action(result.result);
result.res_id = instance.session.uid;
self.getParent().action_manager.do_action(result);
});
}
},
@ -1128,7 +1121,7 @@ instance.web.WebClient = instance.web.Client.extend({
var self = this;
return this.rpc("/web/action/load", { action_id: options.action_id })
.pipe(function (result) {
var action = result.result;
var action = result;
if (options.needaction) {
action.context.search_default_needaction_pending = true;
}
@ -1137,15 +1130,6 @@ instance.web.WebClient = instance.web.Client.extend({
});
});
},
do_action: function(action) {
var self = this;
// TODO replace by client action menuclick
if(action.menu_id) {
this.do_reload().then(function () {
self.menu.menu_click(action.menu_id);
});
}
},
set_content_full_screen: function(fullscreen) {
if (fullscreen) {
$(".oe_webclient", this.$el).addClass("oe_content_full_screen");
@ -1185,7 +1169,7 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
return;
}
return self.rpc("/web/action/load", { action_id: self.action_id }, function(result) {
var action = result.result;
var action = result;
action.flags = _.extend({
//views_switcher : false,
search_view : false,

View File

@ -820,9 +820,10 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
* the action manager can be found amongst the ancestors of the current widget.
* If that's not the case this method will simply return `false`.
*/
do_action: function(action, on_finished) {
if (this.getParent()) {
return this.getParent().do_action(action, on_finished);
do_action: function() {
var parent = this.getParent();
if (parent) {
return parent.do_action.apply(parent, arguments);
}
return false;
},
@ -841,7 +842,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
rpc: function(url, data, success, error) {
var def = $.Deferred().then(success, error);
var self = this;
instance.session.rpc(url, data). then(function() {
instance.session.rpc(url, data).then(function() {
if (!self.isDestroyed())
def.resolve.apply(def, arguments);
}, function() {
@ -1299,7 +1300,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
* @param {Function} error_callback function to execute on RPC call failure
* @returns {jQuery.Deferred} jquery-provided ajax deferred
*/
rpc: function(url, params, success_callback, error_callback) {
rpc: function(url, params) {
var self = this;
// url can be an $.ajax option object
if (_.isString(url)) {
@ -1316,8 +1317,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
};
var deferred = $.Deferred();
this.trigger('request', url, payload);
var aborter = params.aborter;
delete params.aborter;
var request = this.rpc_function(url, payload).then(
function (response, textStatus, jqXHR) {
self.trigger('response', response);
@ -1341,16 +1340,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
};
deferred.reject(error, $.Event());
});
if (aborter) {
aborter.abort_last = function () {
if (!(request.isResolved() || request.isRejected())) {
deferred.fail(function (error, event) {
event.preventDefault();
});
request.abort();
}
};
}
// Allow deferred user to disable on_rpc_error in fail
deferred.fail(function() {
deferred.fail(function(error, event) {
@ -1358,7 +1347,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
self.on_rpc_error(error, event);
}
});
}).then(success_callback, error_callback).promise();
});
return deferred;
},
/**

View File

@ -19,9 +19,9 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
this.name = instance._session_id;
this.qweb_mutex = new $.Mutex();
},
rpc: function(url, params, success_callback, error_callback) {
rpc: function(url, params) {
params.session_id = this.session_id;
return this._super(url, params, success_callback, error_callback);
return this._super(url, params);
},
/**
* Setup a sessionm
@ -57,7 +57,12 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
if(self.session_is_valid()) {
return deferred.pipe(function() { return self.load_modules(); });
}
return deferred;
return $.when(
deferred,
self.rpc('/web/webclient/bootstrap_translations', {mods: instance._modules}).pipe(function(trans) {
instance.web._t.database.set_bundle(trans);
})
);
});
},
/**
@ -537,13 +542,9 @@ instance.web.qweb.preprocess_node = function() {
if (translation && translation.value === 'off') {
return;
}
var ts = _.str.trim(this.node.data);
if (ts.length === 0) {
return;
}
var tr = instance.web._t(ts);
if (tr !== ts) {
this.node.data = tr;
var match = /^(\s*)(.+?)(\s*)$/.exec(this.node.data);
if (match) {
this.node.data = match[1] + instance.web._t(match[2]) + match[3];
}
break;
case 1:
@ -600,8 +601,7 @@ var messages_by_seconds = function() {
[120, _t("Don't leave yet,<br />it's still loading...")],
[300, _t("You may not believe it,<br />but the application is actually loading...")],
[420, _t("Take a minute to get a coffee,<br />because it's loading...")],
[600, _t("It's loading...<br />By the way, did you tried the kitten mode?")],
[3600, _t("Maybe you should consider pressing F5...")],
[3600, _t("Maybe you should consider reloading the application by pressing F5...")],
];
};

View File

@ -349,85 +349,6 @@ instance.web.Model = instance.web.Class.extend({
},
});
instance.web.Traverser = instance.web.Class.extend({
/**
* @constructs instance.web.Traverser
* @extends instance.web.Class
*
* @param {instance.web.Model} model instance this traverser is bound to
*/
init: function (model) {
this._model = model;
this._index = 0;
},
/**
* Gets and sets the current index
*
* @param {Number} [idx]
* @returns {Number} current index
*/
index: function (idx) {
if (idx) { this._index = idx; }
return this._index;
},
/**
* Returns the model this traverser is currently bound to
*
* @returns {openerp.web.Model}
*/
model: function () {
return this._model;
},
/**
* Fetches the size of the backing model's match
*
* @returns {Deferred<Number>} deferred count
*/
size: function () {
return this._model.query().count();
},
/**
* Record at the current index for the collection, fails if there is no
* record at the current index.
*
* @returns {Deferred<>}
*/
current: function (fields) {
return this._model.query(fields).first().pipe(function (record) {
if (record == null) {
return $.Deferred()
.reject('No record at index' + this._index)
.promise();
}
return record;
});
},
next: function (fields) {
var self = this;
this._index++;
return this.size().pipe(function (s) {
if (self._index >= s) {
self._index = 0;
}
return self.current(fields);
});
},
previous: function (fields) {
var self = this;
this._index--;
if (this._index < 0) {
return this.size().pipe(function (s) {
self._index = s-1;
return self.current(fields);
});
}
return this.current(fields);
}
});
instance.web.DataGroup = instance.web.CallbackEnabled.extend({
/**
* Management interface between views and grouped collections of OpenERP
@ -513,8 +434,7 @@ instance.web.StaticDataGroup = instance.web.DataGroup.extend({
instance.web.DataSet = instance.web.CallbackEnabled.extend({
/**
* DateaManagement interface between views and the collection of selected
* OpenERP records (represents the view's state?)
* Collection of OpenERP records, used to share records and the current selection between views.
*
* @constructs instance.web.DataSet
* @extends instance.web.CallbackEnabled
@ -631,13 +551,10 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
* Creates a new record in db
*
* @param {Object} data field values to set on the new record
* @param {Function} callback function called with operation result
* @param {Function} error_callback function called in case of creation error
* @returns {$.Deferred}
*/
create: function(data) {
return this._model.call('create', [data], {context: this._model.context()})
.pipe(function (r) { return {result: r}; });
return this._model.call('create', [data], {context: this._model.context()});
},
/**
* Saves the provided data in an existing db record
@ -648,19 +565,14 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
* @param {Function} error_callback function called in case of write error
* @returns {$.Deferred}
*/
write: function (id, data, options, callback, error_callback) {
write: function (id, data, options) {
options = options || {};
return this._model.call('write',
[[id], data], {context: this._model.context(options.context)})
.pipe(function (r) { return {result: r}})
.then(callback, error_callback);
return this._model.call('write', [[id], data], {context: this._model.context(options.context)});
},
/**
* Deletes an existing record from the database
*
* @param {Number|String} ids identifier of the record to delete
* @param {Function} callback function called with operation result
* @param {Function} error_callback function called in case of deletion error
*/
unlink: function(ids) {
return this._model.call('unlink', [ids], {context: this._model.context()});
@ -674,36 +586,14 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
* @param {Function} error_callback
* @returns {$.Deferred}
*/
call: function (method, args, callback, error_callback) {
return this._model.call(method, args).then(callback, error_callback);
},
/**
* Calls an arbitrary method, with more crazy
*
* @param {String} method
* @param {Array} [args]
* @param {Number} [domain_index] index of a domain to evaluate in the args array
* @param {Number} [context_index] index of a context to evaluate in the args array
* @param {Function} callback
* @param {Function} error_callback
* @returns {$.Deferred}
*/
call_and_eval: function (method, args, domain_index, context_index) {
return instance.session.rpc('/web/dataset/call', {
model: this.model,
method: method,
domain_id: domain_index == undefined ? null : domain_index,
context_id: context_index == undefined ? null : context_index,
args: args || []
});
call: function (method, args) {
return this._model.call(method, args);
},
/**
* Calls a button method, usually returning some sort of action
*
* @param {String} method
* @param {Array} [args]
* @param {Function} callback
* @param {Function} error_callback
* @returns {$.Deferred}
*/
call_button: function (method, args) {
@ -713,7 +603,6 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
* Fetches the "readable name" for records, based on intrinsic rules
*
* @param {Array} ids
* @param {Function} callback
* @returns {$.Deferred}
*/
name_get: function(ids) {
@ -739,7 +628,6 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
},
/**
* @param name
* @param callback
*/
name_create: function(name) {
return this._model.call('name_create', [name], {context: this._model.context()});
@ -799,6 +687,7 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
});
},
});
instance.web.DataSetStatic = instance.web.DataSet.extend({
init: function(parent, model, context, ids) {
this._super(parent, model, context);
@ -829,6 +718,7 @@ instance.web.DataSetStatic = instance.web.DataSet.extend({
this.set_ids(_.without.apply(null, [this.ids].concat(ids)));
}
});
instance.web.DataSetSearch = instance.web.DataSet.extend({
/**
* @constructs instance.web.DataSetSearch
@ -897,6 +787,7 @@ instance.web.DataSetSearch = instance.web.DataSet.extend({
return this._super();
}
});
instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
virtual_id_prefix: "one2many_v_id_",
debug_mode: true,
@ -916,9 +807,9 @@ instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
defaults: this.last_default_get};
this.to_create.push(_.extend(_.clone(cached), {values: _.clone(cached.values)}));
this.cache.push(cached);
return $.Deferred().resolve({result: cached.id}).promise();
return $.Deferred().resolve(cached.id).promise();
},
write: function (id, data, options, callback) {
write: function (id, data, options) {
var self = this;
var record = _.detect(this.to_create, function(x) {return x.id === id;});
record = record || _.detect(this.to_write, function(x) {return x.id === id;});
@ -944,9 +835,7 @@ instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
$.extend(cached.values, record.values);
if (dirty)
this.on_change();
var to_return = $.Deferred().then(callback);
to_return.resolve({result: true});
return to_return.promise();
return $.Deferred().resolve(true).promise();
},
unlink: function(ids, callback, error_callback) {
var self = this;
@ -970,7 +859,8 @@ instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
this.cache = [];
this.delete_all = false;
},
on_change: function() {},
on_change: function() {
},
read_ids: function (ids, fields, options) {
var self = this;
var to_get = [];
@ -1092,9 +982,9 @@ instance.web.ProxyDataSet = instance.web.DataSetSearch.extend({
return this._super.apply(this, arguments);
}
},
write: function (id, data, options, callback, error_callback) {
write: function (id, data, options) {
if (this.write_function) {
return this.write_function(id, data, options, this._super).then(callback, error_callback);
return this.write_function(id, data, options, this._super);
} else {
return this._super.apply(this, arguments);
}

View File

@ -5,7 +5,15 @@ instance.web.DataExport = instance.web.Dialog.extend({
template: 'ExportTreeView',
dialog_title: {toString: function () { return _t("Export Data"); }},
init: function(parent, dataset) {
this._super(parent);
var self = this;
options = {
buttons : [
{text: _t("Close"), click: function() { self.close(); }},
{text: _t("Export To File"), click: function() { self.on_click_export_data(); }}
],
close: function(event, ui){ self.close();}
}
this._super(parent, options);
this.records = {};
this.dataset = dataset;
this.exports = new instance.web.DataSetSearch(
@ -14,13 +22,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
start: function() {
var self = this;
this._super.apply(this, arguments);
this.open({
buttons : [
{text: _t("Close"), click: function() { self.close(); }},
{text: _t("Export To File"), click: function() { self.on_click_export_data(); }}
],
close: function(event, ui){ self.close();}
});
this.open();
self.$el.removeClass('ui-dialog-content ui-widget-content');
self.$el.find('#add_field').click(function() {
if ($('#field-tree-structure tr.ui-selected')) {
@ -49,7 +51,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
self.rpc("/web/export/get_fields", {
model: self.dataset.model,
import_compat: Boolean(import_comp)
}, function (records) {
}).then(function (records) {
got_fields.resolve();
self.on_show_data(records);
});
@ -57,7 +59,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
return $.when(
got_fields,
this.rpc('/web/export/formats', {}, this.do_setup_export_formats),
this.rpc('/web/export/formats', {}).then(this.do_setup_export_formats),
this.show_exports_list());
},
do_setup_export_formats: function (formats) {
@ -91,7 +93,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
self.$el.find('#fields_list option').remove();
var export_id = self.$el.find('#saved_export_list option:selected').val();
if (export_id) {
self.rpc('/web/export/namelist', {'model': self.dataset.model, export_id: parseInt(export_id)}, self.do_load_export_field);
self.rpc('/web/export/namelist', {'model': self.dataset.model, export_id: parseInt(export_id)}).then(self.do_load_export_field);
}
});
self.$el.find('#delete_export_list').click(function() {
@ -181,7 +183,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
import_compat: Boolean(import_comp),
parent_field_type : record['field_type'],
exclude: exclude_fields
}, function(results) {
}).then(function(results) {
record.loaded = true;
self.on_show_data(results, record.id);
});

View File

@ -1494,7 +1494,7 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({
return $.when(facet_from(this, value));
}
assert(value.length <= 1,
_("M2O search fields do not currently handle multiple default values"));
_t("M2O search fields do not currently handle multiple default values"));
// there are many cases of {search_default_$m2ofield: [id]}, need
// to handle this as if it were a single value.
value = value[0];
@ -1578,7 +1578,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
$filter.unbind('click').click(function () {
self.view.query.reset([{
category: _("Custom Filter"),
category: _t("Custom Filter"),
icon: 'M',
field: {
get_context: function () { return filter.context; },
@ -1693,7 +1693,7 @@ instance.web.search.Advanced = instance.web.search.Input.extend({
});
return $.when(
this._super(),
this.rpc("/web/searchview/fields_get", {model: this.view.model}, function(data) {
this.rpc("/web/searchview/fields_get", {model: this.view.model}).then(function(data) {
self.fields = _.extend({
id: { string: 'ID', type: 'id' }
}, data.fields);

View File

@ -30,7 +30,7 @@ instance.web.form.FieldManagerMixin = {
/**
* Must return the asked field as in fields_get.
*/
get_field: function(field_name) {},
get_field_desc: function(field_name) {},
/**
* Returns the current value of a field present in the view. See the get_value() method
* method in FieldInterface for further information.
@ -44,6 +44,21 @@ instance.web.form.FieldManagerMixin = {
@return (Deferred) Is resolved after all the values are setted.
*/
set_values: function(values) {},
/**
Computes an OpenERP domain.
@param (list) expression An OpenERP domain.
@return (boolean) The computed value of the domain.
*/
compute_domain: function(expression) {},
/**
Builds an evaluation context for the resolution of the fields' contexts. Please note
the field are only supposed to use this context to evualuate their own, they should not
extend it.
@return (CompoundContext) An OpenERP context.
*/
build_eval_context: function() {},
};
instance.web.views.add('form', 'instance.web.FormView');
@ -831,10 +846,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}
if (form_invalid) {
self.set({'display_invalid_fields': true});
for (var g in self.fields) {
if (!self.fields.hasOwnProperty(g)) { continue; }
self.fields[g]._check_css_flags();
}
first_invalid_field.focus();
self.on_invalid();
return $.Deferred().reject();
@ -881,7 +892,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
* @param {Object} r result of the write function.
*/
on_saved: function(r) {
if (!r.result) {
if (!r) {
// should not happen in the server, but may happen for internal purpose
return $.Deferred().reject();
} else {
@ -904,11 +915,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
* at the beginning of the dataset instead of the end
*/
on_created: function(r, prepend_on_create) {
if (!r.result) {
if (!r) {
// should not happen in the server, but may happen for internal purpose
return $.Deferred().reject();
} else {
this.datarecord.id = r.result;
this.datarecord.id = r;
if (!prepend_on_create) {
this.dataset.alter_ids(this.dataset.ids.concat([this.datarecord.id]));
this.dataset.index = this.dataset.ids.length - 1;
@ -1085,7 +1096,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
field.on('focused', null, this.proxy('widgetFocused'))
.on('blurred', null, this.proxy('widgetBlurred'));
if (this.get_field(name).translate) {
if (this.get_field_desc(name).translate) {
this.translatable_fields.push(field);
}
field.on('changed_value', this, function() {
@ -1103,12 +1114,34 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}
});
},
get_field: function(field_name) {
get_field_desc: function(field_name) {
return this.fields_view.fields[field_name];
},
get_field_value: function(field_name) {
return this.fields[field_name].get_value();
},
compute_domain: function(expression) {
return instance.web.form.compute_domain(expression, this.fields);
},
_build_view_fields_values: function(blacklist) {
var a_dataset = this.dataset;
var fields_values = this.get_fields_values(blacklist);
var active_id = a_dataset.ids[a_dataset.index];
_.extend(fields_values, {
active_id: active_id || false,
active_ids: active_id ? [active_id] : [],
active_model: a_dataset.model,
parent: {}
});
if (a_dataset.parent_view) {
fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
}
return fields_values;
},
build_eval_context: function(blacklist) {
var a_dataset = this.dataset;
return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
},
});
/**
@ -1175,7 +1208,7 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
this.$form.appendTo(this.$target);
_.each(this.fields_to_init, function($elem) {
var ws = _.map(this.fields_to_init, function($elem) {
var name = $elem.attr("name");
if (!self.fvg.fields[name]) {
throw new Error("Field '" + name + "' specified in view could not be found.");
@ -1191,7 +1224,10 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
}
self.alter_field(w);
self.view.register_field(w, $elem.attr("name"));
w.replace($elem);
return [w, $elem];
});
_.each(ws, function(w) {
w[0].replace(w[1]);
});
_.each(this.tags_to_init, function($elem) {
var tag_name = $elem[0].tagName.toLowerCase();
@ -1528,6 +1564,52 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
},
});
/**
Welcome.
If you read this documentation, it probably means that you were asked to use a form view widget outside of
a form view. Before going further, you must understand that those fields were never really created for
that usage. Don't think that this class will hold the answer to all your problems, at best it will allow
you to hack the system with more style.
*/
instance.web.form.DefaultFieldManager = instance.web.Widget.extend({
init: function(parent, eval_context) {
this._super(parent);
this.field_descs = {};
this.eval_context = eval_context || {};
this.set({
display_invalid_fields: false,
actual_mode: 'create',
});
},
get_field_desc: function(field_name) {
if (this.field_descs[field_name] === undefined) {
this.field_descs[field_name] = {
string: field_name,
};
}
return this.field_descs[field_name];
},
extend_field_desc: function(fields) {
var self = this;
_.each(fields, function(v, k) {
_.extend(self.get_field_desc(k), v);
});
},
get_field_value: function(field_name) {
return false;
},
set_values: function(values) {
// nothing
},
compute_domain: function(expression) {
return instance.web.form.compute_domain(expression, {});
},
build_eval_context: function() {
return new instance.web.CompoundContext(this.eval_context);
},
});
instance.web.form.FormDialog = instance.web.Dialog.extend({
init: function(parent, options, view_id, dataset) {
this._super(parent, options);
@ -1641,9 +1723,7 @@ instance.web.form.InvisibilityChangerMixin = {
this._ic_invisible_modifier = invisible_domain;
this._ic_field_manager.on("view_content_has_changed", this, function() {
var result = self._ic_invisible_modifier === undefined ? false :
instance.web.form.compute_domain(
self._ic_invisible_modifier,
self._ic_field_manager.fields);
self._ic_field_manager.compute_domain(self._ic_invisible_modifier);
self.set({"invisible": result});
});
this.set({invisible: this._ic_invisible_modifier === true, force_invisible: false});
@ -1694,19 +1774,22 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
*/
init: function(field_manager, node) {
this._super(field_manager);
this.view = field_manager;
this.field_manager = field_manager;
if (this.field_manager instanceof instance.web.FormView)
this.view = this.field_manager;
this.node = node;
this.modifiers = JSON.parse(this.node.attrs.modifiers || '{}');
instance.web.form.InvisibilityChangerMixin.init.call(this, this.field_manager, this.modifiers.invisible);
this.field_manager.on("view_content_has_changed", this, this.process_modifiers);
this.set({required: this.modifiers['required'] === true});
this.set({
required: false,
readonly: false,
});
// some events to make the property "effective_readonly" sync automatically with "readonly" and
// "mode" on field_manager
var self = this;
this.set({"readonly": this.modifiers['readonly'] === true});
var test_effective_readonly = function() {
self.set({"effective_readonly": self.get("readonly") || self.field_manager.get("actual_mode") === "view"});
};
@ -1715,6 +1798,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
test_effective_readonly.call(this);
},
renderElement: function() {
this.process_modifiers();
this._super();
this.$el.addClass(this.node.attrs["class"] || "");
},
@ -1737,12 +1821,11 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
});
},
process_modifiers: function() {
var compute_domain = instance.web.form.compute_domain;
var to_set = {};
for (var a in this.modifiers) {
if (!this.modifiers.hasOwnProperty(a)) { continue; }
if (!_.include(["invisible"], a)) {
var val = compute_domain(this.modifiers[a], this.view.fields);
var val = this.field_manager.compute_domain(this.modifiers[a]);
to_set[a] = val;
}
}
@ -1771,25 +1854,6 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
}, options || {});
$(trigger).tipsy(options);
},
_build_view_fields_values: function(blacklist) {
var a_dataset = this.view.dataset;
var fields_values = this.view.get_fields_values(blacklist);
var active_id = a_dataset.ids[a_dataset.index];
_.extend(fields_values, {
active_id: active_id || false,
active_ids: active_id ? [active_id] : [],
active_model: a_dataset.model,
parent: {}
});
if (a_dataset.parent_view) {
fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
}
return fields_values;
},
_build_eval_context: function(blacklist) {
var a_dataset = this.view.dataset;
return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
},
/**
* Builds a new context usable for operations related to fields by merging
* the fields'context with the action's context.
@ -1802,7 +1866,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
}
if (v_context.__ref || true) { //TODO: remove true
var fields_values = this._build_eval_context(blacklist);
var fields_values = this.field_manager.build_eval_context(blacklist);
v_context = new instance.web.CompoundContext(v_context).set_eval_context(fields_values);
}
return v_context;
@ -1813,7 +1877,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
// if there is a domain on the node, overrides the model's domain
var final_domain = n_domain !== null ? n_domain : f_domain;
if (!(final_domain instanceof Array) || true) { //TODO: remove true
var fields_values = this._build_eval_context();
var fields_values = this.field_manager.build_eval_context();
final_domain = new instance.web.CompoundDomain(final_domain).set_eval_context(fields_values);
}
return final_domain;
@ -2001,10 +2065,14 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
var self = this
this._super(field_manager, node);
this.name = this.node.attrs.name;
this.field = this.field_manager.get_field(this.name);
this.field = this.field_manager.get_field_desc(this.name);
this.widget = this.node.attrs.widget;
this.string = this.node.attrs.string || this.field.string || this.name;
this.options = JSON.parse(this.node.attrs.options || '{}');
try {
this.options = JSON.parse(this.node.attrs.options || '{}');
} catch (e) {
throw new Error(_.str.sprintf(_t("Widget options for field '%s' are not valid JSON."), this.name));
}
this.set({'value': false});
this.on("change:value", this, function() {
@ -2015,11 +2083,11 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
renderElement: function() {
var self = this;
this._super();
if (this.field.translate) {
if (this.field.translate && this.view) {
this.$el.addClass('oe_form_field_translatable');
this.$el.find('.oe_field_translate').click(this.on_translate);
}
this.$label = this.view.$el.find('label[for=' + this.id_for_label + ']');
this.$label = this.view ? this.view.$el.find('label[for=' + this.id_for_label + ']') : $();
if (instance.session.debug) {
this.do_attach_tooltip(this, this.$label[0] || this.$el);
this.$label.off('dblclick').on('dblclick', function() {
@ -2034,6 +2102,8 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
this._set_required();
}
this._check_visibility();
this.field_manager.off("change:display_invalid_fields", this, this._check_css_flags);
this.field_manager.on("change:display_invalid_fields", this, this._check_css_flags);
this._check_css_flags();
},
/**
@ -2081,7 +2151,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
var self = this;
var trans = new instance.web.DataSet(this, 'ir.translation');
return trans.call_button('translate_fields', [this.view.dataset.model, this.view.datarecord.id, this.name, this.view.dataset.get_context()]).then(function(r) {
self.do_action(r.result);
self.do_action(r);
});
},
});
@ -2099,11 +2169,12 @@ instance.web.form.ReinitializeWidgetMixin = {
this.initialize_field();
},
initialize_field: function() {
this.on("change:effective_readonly", this, function() {
this.destroy_content();
this.renderElement();
this.initialize_content();
});
this.on("change:effective_readonly", this, this.reinitialize);
this.initialize_content();
},
reinitialize: function() {
this.destroy_content();
this.renderElement();
this.initialize_content();
},
/**
@ -2124,9 +2195,10 @@ instance.web.form.ReinitializeWidgetMixin = {
instance.web.form.ReinitializeFieldMixin = _.extend({}, instance.web.form.ReinitializeWidgetMixin, {
initialize_field: function() {
instance.web.form.ReinitializeWidgetMixin.initialize_field.call(this);
this.on("change:effective_readonly", this, function() {
this.render_value();
});
this.render_value();
},
reinitialize: function() {
instance.web.form.ReinitializeWidgetMixin.reinitialize.call(this);
this.render_value();
},
/**
@ -2146,7 +2218,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
var self = this;
var $input = this.$el.find('input');
$input.change(function() {
self.set({'value': instance.web.parse_value($input.val(), self)});
self.set({'value': self.parse_value($input.val())});
});
this.setupFocus($input);
},
@ -2155,20 +2227,20 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
this.render_value();
},
render_value: function() {
var show_value = instance.web.format_value(this.get('value'), this, '');
var show_value = this.format_value(this.get('value'), '');
if (!this.get("effective_readonly")) {
this.$el.find('input').val(show_value);
} else {
if (this.password) {
show_value = new Array(show_value.length + 1).join('*');
}
this.$el.text(show_value);
this.$(".oe_form_char_content").text(show_value);
}
},
is_syntax_valid: function() {
if (!this.get("effective_readonly")) {
try {
var value_ = instance.web.parse_value(this.$el.find('input').val(), this, '');
var value_ = this.parse_value(this.$el.find('input').val(), '');
return true;
} catch(e) {
return false;
@ -2176,6 +2248,12 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
}
return true;
},
parse_value: function(val, def) {
return instance.web.parse_value(val, this, def);
},
format_value: function(val, def) {
return instance.web.format_value(val, this, def);
},
is_false: function() {
return this.get('value') === '' || this._super();
},
@ -2884,7 +2962,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.focus();
return;
}
var pop = new instance.web.form.FormOpenPopup(self.view);
var pop = new instance.web.form.FormOpenPopup(self);
pop.show_element(
self.field.relation,
self.get("value"),
@ -2893,7 +2971,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
title: _t("Open: ") + self.string
}
);
pop.on_write_completed.add_last(function() {
pop.on('on_write_complete', self, function(){
self.display_value = {};
self.render_value();
self.focus();
@ -3479,12 +3557,12 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({
}
var self = this;
var id = self.o2m.dataset.index !== null ? self.o2m.dataset.ids[self.o2m.dataset.index] : null;
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
var pop = new instance.web.form.FormOpenPopup(this);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.o2m.string,
create_function: function(data) {
return self.o2m.dataset.create(data).then(function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r]));
self.o2m.dataset.on_change();
});
},
@ -3574,7 +3652,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
create_function: function(data, callback, error_callback) {
return self.o2m.dataset.create(data).then(function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r]));
self.o2m.dataset.on_change();
}).then(callback, error_callback);
},
@ -3595,11 +3673,11 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
},
do_activate_record: function(index, id) {
var self = this;
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
var pop = new instance.web.form.FormOpenPopup(self);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.o2m.string,
write_function: function(id, data) {
return self.o2m.dataset.write(id, data, {}, function(r) {
return self.o2m.dataset.write(id, data, {}).then(function() {
self.o2m.reload_current_view();
});
},
@ -3623,7 +3701,10 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
var parent_form = this.o2m.view;
var self = this;
this.ensure_saved().pipe(function () {
return parent_form.do_save();
if (parent_form)
return parent_form.do_save();
else
return $.when();
}).then(function () {
self.handle_button(name, id, callback);
});
@ -3879,7 +3960,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
},
render_value: function() {
var self = this;
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context());
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context());
var values = self.get("value")
var handle_names = function(data) {
var indexed = {};
@ -3914,6 +3995,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
disable_utility_classes: true,
init: function(field_manager, node) {
this._super(field_manager, node);
this.set({"value": []});
this.is_loaded = $.Deferred();
this.initial_is_loaded = this.is_loaded;
this.is_setted = $.Deferred();
@ -4038,9 +4120,7 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in
title: _t("Open: ") + this.m2m_field.string,
readonly: this.getParent().get("effective_readonly")
});
pop.on_write_completed.add_last(function() {
self.reload_content();
});
pop.on('on_write_complete', self, self.reload_content);
}
});
@ -4149,7 +4229,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
});
} else {
var id = self.dataset.ids[self.dataset.index];
var pop = new instance.web.form.FormOpenPopup(self.view);
var pop = new instance.web.form.FormOpenPopup(this);
pop.show_element(self.field.relation, id, self.build_context(), {
title: _t("Open: ") + self.string,
write_function: function(id, data, options) {
@ -4282,12 +4362,14 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
this.dataset.create_function = function(data, sup) {
var fct = self.options.create_function || sup;
return fct.call(this, data).then(function(r) {
self.created_elements.push(r.result);
self.created_elements.push(r);
});
};
this.dataset.write_function = function(id, data, options, sup) {
var fct = self.options.write_function || sup;
return fct.call(this, id, data, options).then(self.on_write_completed);
return fct.call(this, id, data, options).then(function() {
self.trigger('on_write_complete');
});
};
this.dataset.parent_view = this.options.parent_view;
this.dataset.child_name = this.options.child_name;
@ -4307,7 +4389,6 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
this.$buttonpane = dialog.$el.dialog("widget").find(".ui-dialog-buttonpane").html("");
this.start();
},
on_write_completed: function() {},
setup_form_view: function() {
var self = this;
if (this.row_id) {
@ -4417,7 +4498,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
self.rpc('/web/session/eval_domain_and_context', {
domains: [],
contexts: [this.context]
}, function (results) {
}).then(function (results) {
var search_defaults = {};
_.each(results.context, function (value_, key) {
var match = /^search_default_(.*)$/.exec(key);
@ -4485,7 +4566,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
domains: domains || [],
contexts: contexts || [],
group_by_seq: groupbys || []
}, function (results) {
}).then(function (results) {
self.view_list.do_search(results.domain, results.context, results.group_by);
});
},
@ -4540,22 +4621,28 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
}
},
destroy_content: function() {
if (this.selection) {
this.selection.destroy();
this.selection = undefined;
}
if (this.m2o) {
this.m2o.destroy();
this.m2o = undefined;
if (this.fm) {
this.fm.destroy();
}
},
initialize_content: function() {
var self = this;
this.selection = new instance.web.form.FieldSelection(this, { attrs: {
var fm = new instance.web.form.DefaultFieldManager(this);
this.fm = fm;
fm.extend_field_desc({
"selection": {
selection: this.field_manager.get_field_desc(this.name).selection,
type: "selection",
},
"m2o": {
relation: null,
type: "many2one",
},
});
this.selection = new instance.web.form.FieldSelection(fm, { attrs: {
name: 'selection',
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
}});
this.selection.view = this.view;
this.selection.on("change:value", this, this.on_selection_changed);
this.selection.setElement(this.$(".oe_form_view_reference_selection"));
this.selection.renderElement();
@ -4564,11 +4651,10 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
.on('focused', null, function () {self.trigger('focused')})
.on('blurred', null, function () {self.trigger('blurred')});
this.m2o = new instance.web.form.FieldMany2One(this, { attrs: {
this.m2o = new instance.web.form.FieldMany2One(fm, { attrs: {
name: 'm2o',
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
}});
this.m2o.view = this.view;
this.m2o.on("change:value", this, this.data_changed);
this.m2o.setElement(this.$(".oe_form_view_reference_m2o"));
this.m2o.renderElement();
@ -4608,20 +4694,6 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
this.set({'value': false});
}
},
get_field: function(name) {
if (name === "selection") {
return {
selection: this.view.fields_view.fields[this.name].selection,
type: "selection",
};
} else if (name === "m2o") {
return {
relation: null,
type: "many2one",
};
}
throw Exception("Should not happen");
},
});
instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
@ -4709,9 +4781,10 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
},
set_filename: function(value) {
var filename = this.node.attrs.filename;
if (this.view.fields[filename]) {
this.view.fields[filename].set_value(value);
this.view.fields[filename].on_ui_change();
if (filename) {
var tmp = {};
tmp[filename] = value;
this.field_manager.set_values(tmp);
}
},
on_clear: function() {
@ -4753,7 +4826,9 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
} else {
this.$el.find('a').show(!!this.get('value'));
if (this.get('value')) {
var show_value = _t("Download") + " " + (this.view.datarecord[this.node.attrs.filename] || '');
var show_value = _t("Download")
if (this.view)
show_value += " " + (this.view.datarecord[this.node.attrs.filename] || '');
this.$el.find('a').text(show_value);
}
}
@ -4765,12 +4840,6 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
this.$el.find('input').eq(0).val(show_value);
this.set_filename(name);
},
set_filename: function(value_) {
var filename = this.node.attrs.filename;
if (this.view.fields[filename]) {
this.view.fields[filename].set({value: value_});
}
},
on_clear: function() {
this._super.apply(this, arguments);
this.$el.find('input').eq(0).val('');
@ -4819,10 +4888,12 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
this.set({'value': file_base64});
this.binary_value = true;
this.render_value();
this.set_filename(name);
},
on_clear: function() {
this._super.apply(this, arguments);
this.render_value();
this.set_filename('');
}
});
@ -4930,6 +5001,44 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
},
});
instance.web.form.FieldMonetary = instance.web.form.FieldFloat.extend({
template: "FieldMonetary",
init: function() {
this._super.apply(this, arguments);
this.set({"currency": false});
if (this.options.currency_field) {
this.field_manager.on("field_changed:" + this.options.currency_field, this, function() {
this.set({"currency": this.field_manager.get_field_value(this.options.currency_field)});
});
}
this.on("change:currency", this, this.get_currency_info);
this.get_currency_info();
this.ci_dm = new instance.web.DropMisordered();
},
start: function() {
var tmp = this._super();
this.on("change:currency_info", this, this.reinitialize);
return tmp;
},
get_currency_info: function() {
var self = this;
if (this.get("currency") === false) {
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()).pipe(function(res) {
self.set({"currency_info": res});
});
},
parse_value: function(val, def) {
return instance.web.parse_value(val, {type: "float"}, def);
},
format_value: function(val, def) {
return instance.web.format_value(val, {type: "float"}, def);
},
});
/**
* Registry of form fields, called by :js:`instance.web.FormView`.
*
@ -4960,7 +5069,8 @@ instance.web.form.widgets = new instance.web.Registry({
'progressbar': 'instance.web.form.FieldProgressBar',
'image': 'instance.web.form.FieldBinaryImage',
'binary': 'instance.web.form.FieldBinaryFile',
'statusbar': 'instance.web.form.FieldStatus'
'statusbar': 'instance.web.form.FieldStatus',
'monetary': 'instance.web.form.FieldMonetary',
});
/**

View File

@ -482,7 +482,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
view_type: "tree",
context: this.dataset.get_context(context),
toolbar: !!this.options.$sidebar
}, callback);
}).then(callback);
}
},
/**

View File

@ -45,7 +45,7 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie
view_type: "tree",
toolbar: this.view_manager ? !!this.view_manager.sidebar : false,
context: this.dataset.get_context()
}, this.on_loaded);
}).then(this.on_loaded);
},
/**
* Returns the list of fields needed to correctly read objects.

View File

@ -99,6 +99,10 @@ instance.web.ActionManager = instance.web.Widget.extend({
this.select_breadcrumb(index, subindex);
},
select_breadcrumb: function(index, subindex) {
var next_item = this.breadcrumbs[index + 1];
if (next_item && next_item.on_reverse_breadcrumb) {
next_item.on_reverse_breadcrumb(this.breadcrumbs[index].widget);
}
for (var i = this.breadcrumbs.length - 1; i >= 0; i--) {
if (i > index) {
if (this.remove_breadcrumb(i) === false) {
@ -220,14 +224,14 @@ instance.web.ActionManager = instance.web.Widget.extend({
}
});
},
do_action: function(action, on_close, clear_breadcrumbs) {
do_action: function(action, on_close, clear_breadcrumbs, on_reverse_breadcrumb) {
if (_.isString(action) && instance.web.client_actions.contains(action)) {
var action_client = { type: "ir.actions.client", tag: action };
return this.do_action(action_client, on_close, clear_breadcrumbs);
return this.do_action(action_client, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
} else if (_.isNumber(action) || _.isString(action)) {
var self = this;
return self.rpc("/web/action/load", { action_id: action }).pipe(function(result) {
return self.do_action(result.result, on_close, clear_breadcrumbs);
return self.do_action(result, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
});
}
if (!action.type) {
@ -249,77 +253,94 @@ instance.web.ActionManager = instance.web.Widget.extend({
console.error("Action manager can't handle action of type " + action.type, action);
return $.Deferred().reject();
}
return this[type](action, on_close, clear_breadcrumbs);
return this[type](action, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
},
null_action: function() {
this.dialog_stop();
this.clear_breadcrumbs();
},
ir_actions_common: function(action, on_close, clear_breadcrumbs) {
var self = this, klass, widget, post_process;
if (this.inner_widget && (action.type === 'ir.actions.client' || action.target !== 'new')) {
/**
*
* @param {Object} executor
* @param {Object} executor.action original action
* @param {Function<instance.web.Widget>} executor.widget function used to fetch the widget instance
* @param {String} executor.klass CSS class to add on the dialog root, if action.target=new
* @param {Function<instance.web.Widget, undefined>} executor.post_process cleanup called after a widget has been added as inner_widget
* @param on_close
* @param clear_breadcrumbs
* @return {*}
*/
ir_actions_common: function(executor, on_close, clear_breadcrumbs) {
if (this.inner_widget && executor.action.target !== 'new') {
if (this.getParent().has_uncommitted_changes()) {
return $.Deferred().reject();
} else if (clear_breadcrumbs) {
this.clear_breadcrumbs();
}
}
if (action.type === 'ir.actions.client') {
var ClientWidget = instance.web.client_actions.get_object(action.tag);
widget = new ClientWidget(this, action.params);
klass = 'oe_act_client';
post_process = function() {
self.push_breadcrumb({
widget: widget,
title: action.name
});
if (action.tag !== 'reload') {
self.do_push_state({});
}
};
} else {
widget = new instance.web.ViewManagerAction(this, action);
klass = 'oe_act_window';
post_process = widget.proxy('add_breadcrumb');
}
if (action.target === 'new') {
var widget = executor.widget();
if (executor.action.target === 'new') {
if (this.dialog === null) {
// These buttons will be overwrited by <footer> if any
this.dialog = new instance.web.Dialog(this, {
buttons: { "Close": function() { $(this).dialog("close"); }},
dialogClass: klass
dialogClass: executor.klass
});
if(on_close)
this.dialog.on_close.add(on_close);
} else {
this.dialog_widget.destroy();
}
this.dialog.dialog_title = action.name;
this.dialog.dialog_title = executor.action.name;
this.dialog_widget = widget;
this.dialog_widget.appendTo(this.dialog.$el);
var initialized = this.dialog_widget.appendTo(this.dialog.$el);
this.dialog.open();
return initialized;
} else {
this.dialog_stop();
this.inner_action = action;
this.inner_action = executor.action;
this.inner_widget = widget;
post_process();
this.inner_widget.appendTo(this.$el);
executor.post_process(widget);
return this.inner_widget.appendTo(this.$el);
}
},
ir_actions_act_window: function (action, on_close, clear_breadcrumbs) {
ir_actions_act_window: function (action, on_close, clear_breadcrumbs, on_reverse_breadcrumb) {
var self = this;
if (action.target !== 'new') {
if(action.menu_id) {
this.dialog_stop();
return this.getParent().do_action(action, function () {
instance.webclient.menu.open_menu(action.menu_id);
}, clear_breadcrumbs);
}
}
return this.ir_actions_common(action, on_close, clear_breadcrumbs);
return this.ir_actions_common({
widget: function () { return new instance.web.ViewManagerAction(self, action); },
action: action,
klass: 'oe_act_window',
post_process: function (widget) { widget.add_breadcrumb(on_reverse_breadcrumb); }
}, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
},
ir_actions_client: function (action, on_close, clear_breadcrumbs) {
return this.ir_actions_common(action, on_close, clear_breadcrumbs);
ir_actions_client: function (action, on_close, clear_breadcrumbs, on_reverse_breadcrumb) {
var self = this;
var ClientWidget = instance.web.client_actions.get_object(action.tag);
if (!(ClientWidget.prototype instanceof instance.web.Widget)) {
var next;
if (next = ClientWidget(this, action.params)) {
return this.do_action(next, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
}
return $.when();
}
return this.ir_actions_common({
widget: function () { return new ClientWidget(self, action.params); },
action: action,
klass: 'oe_act_client',
post_process: function(widget) {
self.push_breadcrumb({
widget: widget,
title: action.name,
on_reverse_breadcrumb: on_reverse_breadcrumb,
});
if (action.tag !== 'reload') {
self.do_push_state({});
}
}
}, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
},
ir_actions_act_window_close: function (action, on_closed) {
if (!this.dialog && on_closed) {
@ -327,13 +348,13 @@ instance.web.ActionManager = instance.web.Widget.extend({
}
this.dialog_stop();
},
ir_actions_server: function (action, on_closed, clear_breadcrumbs) {
ir_actions_server: function (action, on_closed, clear_breadcrumbs, on_reverse_breadcrumb) {
var self = this;
this.rpc('/web/action/run', {
action_id: action.id,
context: action.context || {}
}).then(function (action) {
self.do_action(action, on_closed, clear_breadcrumbs)
self.do_action(action, on_closed, clear_breadcrumbs, on_reverse_breadcrumb)
});
},
ir_actions_report_xml: function(action, on_closed) {
@ -528,7 +549,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
set_title: function(title) {
this.$el.find('.oe_view_title_text:first').text(title);
},
add_breadcrumb: function() {
add_breadcrumb: function(on_reverse_breadcrumb) {
var self = this;
var views = [this.active_view || this.views_src[0].view_type];
this.on_mode_switch.add(function(mode) {
@ -573,7 +594,8 @@ instance.web.ViewManager = instance.web.Widget.extend({
titles.pop();
}
return titles;
}
},
on_reverse_breadcrumb: on_reverse_breadcrumb,
});
},
/**
@ -632,7 +654,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
domains: [this.action.domain || []].concat(domains || []),
contexts: [action_context].concat(contexts || []),
group_by_seq: groupbys || []
}, function (results) {
}).then(function (results) {
self.dataset._model = new instance.web.Model(
self.dataset.model, results.context, results.domain);
var groupby = results.group_by.length
@ -791,13 +813,11 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
});
break;
case 'fields':
this.dataset.call_and_eval(
'fields_get', [false, {}], null, 1).then(function (fields) {
this.dataset.call('fields_get', [false, {}]).then(function (fields) {
var $root = $('<dl>');
_(fields).each(function (attributes, name) {
$root.append($('<dt>').append($('<h4>').text(name)));
var $attrs = $('<dl>').appendTo(
$('<dd>').appendTo($root));
var $attrs = $('<dl>').appendTo($('<dd>').appendTo($root));
_(attributes).each(function (def, name) {
if (def instanceof Object) {
def = JSON.stringify(def);
@ -1038,12 +1058,12 @@ instance.web.Sidebar = instance.web.Widget.extend({
self.rpc("/web/action/load", {
action_id: item.action.id,
context: additional_context
}, function(result) {
result.result.context = _.extend(result.result.context || {},
}).then(function(result) {
result.context = _.extend(result.context || {},
additional_context);
result.result.flags = result.result.flags || {};
result.result.flags.new_window = true;
self.do_action(result.result, function () {
result.flags = result.flags || {};
result.flags.new_window = true;
self.do_action(result, function () {
// reload view
self.getParent().reload();
});
@ -1174,7 +1194,7 @@ instance.web.View = instance.web.Widget.extend({
var context = new instance.web.CompoundContext(dataset.get_context(), action_data.context || {});
var handler = function (r) {
var action = r.result;
var action = r;
if (action && action.constructor == Object) {
var ncontext = new instance.web.CompoundContext(context);
if (record_id) {
@ -1201,7 +1221,7 @@ instance.web.View = instance.web.Widget.extend({
};
if (action_data.special) {
return handler({result: {"type":"ir.actions.act_window_close"}});
return handler({"type":"ir.actions.act_window_close"});
} else if (action_data.type=="object") {
var args = [[record_id]], additional_args = [];
if (action_data.args) {
@ -1217,7 +1237,7 @@ instance.web.View = instance.web.Widget.extend({
args.push(context);
return dataset.call_button(action_data.name, args).then(handler);
} else if (action_data.type=="action") {
return this.rpc('/web/action/load', { action_id: action_data.name, context: context, do_not_eval: true}, handler);
return this.rpc('/web/action/load', { action_id: action_data.name, context: context, do_not_eval: true}).then(handler);
} else {
return dataset.exec_workflow(record_id, action_data.name).then(handler);
}

View File

@ -407,7 +407,7 @@
<a class="oe_logo" href="#"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
<div class="oe_secondary_menus_container"/>
<div class="oe_footer">
Powered by <a href="http://www.openerp.com" target="_blank"><span>Open</span>ERP</a>
Powered by <a href="http://www.openerp.com" target="_blank"><span>OpenERP</span></a>
</div>
</td>
<td class="oe_application">
@ -916,7 +916,7 @@
</t>
<t t-name="FieldChar">
<span t-att-class="'oe_form_field '+widget.widget_class" t-att-style="widget.node.attrs.style">
<t t-if="!widget.get('effective_readonly')">
<t t-if="!widget.get('effective_readonly')">
<input t-att-type="widget.password ? 'password' : 'text'"
t-att-id="widget.id_for_label"
t-att-tabindex="widget.node.attrs.tabindex"
@ -925,6 +925,9 @@
t-att-maxlength="widget.field.size"
/><img class="oe_field_translate oe_input_icon" t-if="widget.field.translate" t-att-src='_s + "/web/static/src/img/icons/terp-translate.png"' width="16" height="16" border="0"/>
</t>
<t t-if="widget.get('effective_readonly')">
<span class="oe_form_char_content"></span>
</t>
</span>
</t>
<t t-name="FieldEmail">
@ -1122,7 +1125,7 @@
<td>
<t t-call="HiddenInputFile">
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
<t t-set="fileupload_style">width: 83px;</t>
<t t-set="fileupload_style" t-translation="off">width: 83px;</t>
<button class="oe_button oe_field_button" type="button">
<img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
<span>Select</span>
@ -1485,6 +1488,7 @@
</div>
<t t-name="SearchView.extended_search.proposition">
<li>
<span class="searchview_extended_prop_or">or</span>
<select class="searchview_extended_prop_field">
<t t-foreach="widget.attrs.fields" t-as="field">
<option t-att="{'selected': field === widget.attrs.selected ? 'selected' : null}"
@ -1716,4 +1720,16 @@
<button class="oe_form_m2o_sc_button oe_button">Add All Info...</button>
<button class="oe_form_m2o_cancel_button oe_button">Cancel</button>
</t>
<t t-name="FieldMonetary" t-extend="FieldChar">
<t t-jquery="t:first" t-operation="before">
<t t-if="widget.get('currency_info') and widget.get('currency_info').position === 'before'">
<t t-esc="widget.get('currency_info').symbol"/>
</t>
</t>
<t t-jquery="t:last" t-operation="after">
<t t-if="widget.get('currency_info') and widget.get('currency_info').position === 'after'">
<t t-esc="widget.get('currency_info').symbol"/>
</t>
</t>
</t>
</templates>

View File

@ -82,14 +82,14 @@ $(document).ready(function () {
});
t.test('call', function (openerp) {
var ds = new openerp.web.DataSet({session: openerp.session}, 'mod');
t.expect(ds.call('frob', ['a', 'b', 42]), function (r) {
t.expect(ds.call('frob', ['a', 'b', 42]).then(function (r) {
strictEqual(r.method, 'frob');
strictEqual(r.args.length, 3);
deepEqual(r.args, ['a', 'b', 42]);
ok(_.isEmpty(r.kwargs));
});
}));
});
t.test('name_get').then(function (openerp) {
var ds = new openerp.web.DataSet({session: openerp.session}, 'mod');

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
"X-Poedit-Language: Czech\n"
#. 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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
"Language: es\n"
#. 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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -0,0 +1,144 @@
# Persian translation for openerp-web
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openerp-web package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-07-02 09:06+0200\n"
"PO-Revision-Date: 2012-10-03 10:24+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Persian <fa@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-04 05:33+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11
msgid "Calendar"
msgstr "تقویم"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:70
msgid "Filter"
msgstr "فیلتر"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:144
msgid "Today"
msgstr "امروز"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:145
msgid "Day"
msgstr "روز"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:146
msgid "Week"
msgstr "هفته"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:147
msgid "Month"
msgstr "ماه"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:148
msgid "New event"
msgstr "رویداد جدید"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:149
msgid "Save"
msgstr "ذخیره"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:150
msgid "Cancel"
msgstr "لغو کردن"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:151
msgid "Details"
msgstr "جزئیات "
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:152
msgid "Edit"
msgstr "ویرایش"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:153
msgid "Delete"
msgstr "حذف"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:155
msgid "Event will be deleted permanently, are you sure?"
msgstr "رویداد حذف خواهد شد. آیا مطمئن هستید؟"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:156
#: addons/web_calendar/static/src/js/calendar.js:169
msgid "Description"
msgstr "توضیحات"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:157
msgid "Time period"
msgstr "بازه زمانی"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:158
msgid "Full day"
msgstr "تمام روز"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:161
msgid "Do you want to edit the whole set of repeated events?"
msgstr "آیا میخواهید مجموعه کامل رویدادهای تکراری را ویرایش کنید؟"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:162
msgid "Repeat event"
msgstr "تکرار رویداد"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:163
msgid "Disabled"
msgstr "غیرفعال"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:164
msgid "Enabled"
msgstr "فعال"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:167
#: addons/web_calendar/static/src/js/calendar.js:175
msgid "Agenda"
msgstr "دستور کار"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:168
msgid "Date"
msgstr "تاریخ"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:172
msgid "Year"
msgstr "سال"
#. openerp-web
#: addons/web_calendar/static/src/xml/web_calendar.xml:5
#: addons/web_calendar/static/src/xml/web_calendar.xml:6
msgid "&nbsp;"
msgstr ""
#~ msgid "Navigator"
#~ msgstr "هدایتگر"

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

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: 2012-09-28 04:47+0000\n"
"X-Generator: Launchpad (build 16043)\n"
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
"X-Generator: Launchpad (build 16061)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

Some files were not shown because too many files have changed in this diff Show More