[MERGE] Sync with trunk.

bzr revid: tde@openerp.com-20130305082708-w3iclqp0az3d6zws
This commit is contained in:
Thibault Delavallée
2013-03-05 09:27:08 +01:00
332 changed files with 5106 additions and 1250 deletions
+5 -4
View File
@@ -13,6 +13,7 @@ import os
import re
import simplejson
import time
import urllib
import urllib2
import zlib
from xml.etree import ElementTree
@@ -293,9 +294,9 @@ def manifest_list(req, extension, mods=None, db=None):
if not req.debug:
path = '/web/webclient/' + extension
if mods is not None:
path += '?mods=' + mods
path += '?' + urllib.urlencode({'mods': mods})
elif db:
path += '?db=' + db
path += '?' + urllib.urlencode({'db': db})
return [path]
files = manifest_glob(req, extension, addons=mods, db=db)
i_am_diabetic = req.httprequest.environ["QUERY_STRING"].count("no_sugar") >= 1 or \
@@ -683,7 +684,7 @@ class WebClient(openerpweb.Controller):
@openerpweb.jsonrequest
def version_info(self, req):
return openerp.service.web_services.RPC_VERSION_1
return openerp.service.common.exp_version()
class Proxy(openerpweb.Controller):
_cp_path = '/web/proxy'
@@ -1310,7 +1311,7 @@ class Binary(openerpweb.Controller):
'id': attachment_id
}
except Exception:
args = {'error':e.faultCode }
args = {'error': "Something horrible happened"}
return out % (simplejson.dumps(callback), simplejson.dumps(args))
@openerpweb.httprequest
+5 -5
View File
@@ -32,12 +32,12 @@ NOMODULE_TEMPLATE = Template(u"""<!DOCTYPE html>
</form>
</body>
</html>
""")
""", default_filters=['h'])
NOTFOUND = Template(u"""
<p>Unable to find the module [${module}], please check that the module
name is correct and the module is on OpenERP's path.</p>
<a href="/web/tests">&lt;&lt; Back to tests</a>
""")
""", default_filters=['h'])
TESTING = Template(u"""<!DOCTYPE html>
<html style="height: 100%">
<%def name="to_path(module, p)">/${module}/${p}</%def>
@@ -51,9 +51,9 @@ TESTING = Template(u"""<!DOCTYPE html>
<script src="/web/static/lib/qunit/qunit.js"></script>
<script type="text/javascript">
var oe_db_info = ${db_info};
var oe_db_info = ${db_info | n};
// List of modules, each module is preceded by its dependencies
var oe_all_dependencies = ${dependencies};
var oe_all_dependencies = ${dependencies | n};
QUnit.config.testTimeout = 5 * 60 * 1000;
</script>
</head>
@@ -83,7 +83,7 @@ TESTING = Template(u"""<!DOCTYPE html>
% endif
% endfor
</html>
""")
""", default_filters=['h'])
class TestRunnerController(http.Controller):
_cp_path = '/web/tests'
+2 -1
View File
@@ -286,7 +286,8 @@ class HttpRequest(WebRequest):
_logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw)
try:
r = method(self, **self.params)
except Exception:
except Exception, e:
_logger.exception("An exception occured during an http request")
se = serialize_exception(e)
error = {
'code': 200,
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
"X-Poedit-Language: Czech\n"
#. module: web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
"Language: es\n"
#. module: web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+98 -94
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
@@ -29,21 +29,21 @@ msgstr "Oletuskieli:"
#: code:addons/web/static/src/js/coresetup.js:602
#, python-format
msgid "%d minutes ago"
msgstr ""
msgstr "%d minuuttia sitten"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:630
#, python-format
msgid "Still loading...<br />Please be patient."
msgstr ""
msgstr "Ladataan...<br />Olkaa hyvä ja odottakaa."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/search.js:1832
#, python-format
msgid "%(field)s %(operator)s \"%(value)s\""
msgstr ""
msgstr "%(field)s %(operator)s \"%(value)s\""
#. module: web
#. openerp-web
@@ -59,7 +59,7 @@ msgstr "pienempi tai yhtäsuuri kuin"
#: code:addons/web/static/src/js/chrome.js:393
#, python-format
msgid "Please enter your previous password"
msgstr ""
msgstr "Syötä edellinen salasanasi"
#. module: web
#. openerp-web
@@ -75,42 +75,42 @@ msgstr "Pääsalasana:"
#: code:addons/web/static/src/xml/base.xml:274
#, python-format
msgid "Change Master Password"
msgstr ""
msgstr "Vaihda pääsalasana"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:491
#, python-format
msgid "Do you really want to delete the database: %s ?"
msgstr ""
msgstr "Oletko varma, että haluat poistaa tietokannan: %s ?"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/search.js:1398
#, python-format
msgid "Search %(field)s at: %(value)s"
msgstr ""
msgstr "Hae %(field)s arvoista: %(value)s"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:537
#, python-format
msgid "Access Denied"
msgstr ""
msgstr "Pääsy evätty"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:5183
#, python-format
msgid "Uploading error"
msgstr ""
msgstr "Lähetysvirhe"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:603
#, python-format
msgid "about an hour ago"
msgstr ""
msgstr "noin tunti sitten"
#. module: web
#. openerp-web
@@ -119,14 +119,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:216
#, python-format
msgid "Backup Database"
msgstr ""
msgstr "Varmuuskopioi tietokanta"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views.js:463
#, python-format
msgid "%(view_type)s view"
msgstr ""
msgstr "%(view_type)s näkymä"
#. module: web
#. openerp-web
@@ -134,7 +134,7 @@ msgstr ""
#: code:addons/web/static/src/js/dates.js:53
#, python-format
msgid "'%s' is not a valid date"
msgstr ""
msgstr "\"%s\" ei ole kelvollinen päivämäärä"
#. module: web
#. openerp-web
@@ -148,20 +148,20 @@ msgstr "Tässä on näyte tiedostosta jota ei voitu tuoda:"
#: code:addons/web/static/src/js/coresetup.js:601
#, python-format
msgid "about a minute ago"
msgstr ""
msgstr "noin minuutti sitten"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1297
#, python-format
msgid "File"
msgstr ""
msgstr "Tiedosto"
#. module: web
#: code:addons/web/controllers/main.py:826
#, python-format
msgid "You cannot leave any password empty."
msgstr ""
msgstr "Et voi jättää salasanaa tyhjäksi."
#. module: web
#. openerp-web
@@ -192,7 +192,7 @@ msgstr "Valitse"
#: code:addons/web/static/src/js/chrome.js:549
#, python-format
msgid "Database restored successfully"
msgstr "Tietokanta palautettu onnistuneesti"
msgstr "Tietokanta palautettu"
#. module: web
#. openerp-web
@@ -213,21 +213,21 @@ msgstr "Viimeisin muutospäivämäärä:"
#: code:addons/web/static/src/js/search.js:1459
#, python-format
msgid "M2O search fields do not currently handle multiple default values"
msgstr ""
msgstr "Monesta yhteen hakukentät eivät salli useita oletusarvoja."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:1227
#, python-format
msgid "Widget type '%s' is not implemented"
msgstr ""
msgstr "Pienohjelman tyyppiä '%s' ei ole asennettu"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1608
#, python-format
msgid "Share with all users"
msgstr ""
msgstr "Jaa kaikkien käyttäjien kanssa"
#. module: web
#. openerp-web
@@ -242,14 +242,14 @@ msgstr "Lomake"
#: code:addons/web/static/src/xml/base.xml:1324
#, python-format
msgid "(no string)"
msgstr ""
msgstr "(ei merkkijonoa)"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/formats.js:282
#, python-format
msgid "'%s' is not a correct time"
msgstr ""
msgstr "'%s' on virheellinen aika"
#. module: web
#. openerp-web
@@ -270,7 +270,7 @@ msgstr "Uusi salasana:"
#: code:addons/web/static/src/xml/base.xml:610
#, python-format
msgid "Attachment :"
msgstr ""
msgstr "Liite:"
#. module: web
#. openerp-web
@@ -291,49 +291,49 @@ msgstr "Määrittämätön"
#: code:addons/web/static/src/js/view_form.js:4871
#, python-format
msgid "File Upload"
msgstr ""
msgstr "Tiedoston lähetys"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:607
#, python-format
msgid "about a month ago"
msgstr ""
msgstr "noin kuukausi sitten"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1600
#, python-format
msgid "Custom Filters"
msgstr ""
msgstr "Muokattavat suodattimet"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1336
#, python-format
msgid "Button Type:"
msgstr "Napin tyyppi:"
msgstr "Painiketyyppi:"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:419
#, python-format
msgid "OpenERP SA Company"
msgstr ""
msgstr "OpenERP SA yritys"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/search.js:1553
#, python-format
msgid "Custom Filter"
msgstr ""
msgstr "Mukautettu suodatin"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:159
#, python-format
msgid "Duplicate Database"
msgstr ""
msgstr "Kopioi tietokanta"
#. module: web
#. openerp-web
@@ -355,7 +355,7 @@ msgstr "Vaihda salasana"
#: code:addons/web/static/src/js/view_form.js:3411
#, python-format
msgid "View type '%s' is not supported in One2Many."
msgstr ""
msgstr "Näkymätyyppiä '%s' ei tueta yhdestä moneen kentissä."
#. module: web
#. openerp-web
@@ -370,7 +370,7 @@ msgstr "Lataa"
#: code:addons/web/static/src/js/formats.js:266
#, python-format
msgid "'%s' is not a correct datetime"
msgstr ""
msgstr "'%s' on virheellinen päivämäärä"
#. module: web
#. openerp-web
@@ -398,20 +398,20 @@ msgstr "Valinta:"
#: code:addons/web/static/src/js/view_form.js:871
#, python-format
msgid "The following fields are invalid:"
msgstr ""
msgstr "Seuraavat kentät ovat virheellisiä:"
#. module: web
#: code:addons/web/controllers/main.py:847
#, python-format
msgid "Languages"
msgstr ""
msgstr "Kielet"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1270
#, python-format
msgid "...Upload in progress..."
msgstr ""
msgstr "...lähetys käynnissä..."
#. module: web
#. openerp-web
@@ -425,21 +425,21 @@ msgstr "Tuo"
#: code:addons/web/static/src/js/chrome.js:543
#, python-format
msgid "Could not restore the database"
msgstr ""
msgstr "Tietokantaa ei voitu palauttaa"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4851
#, python-format
msgid "File upload"
msgstr ""
msgstr "Tiedoston lähetys"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:3804
#, python-format
msgid "Action Button"
msgstr ""
msgstr "Toimintopainike"
#. module: web
#. openerp-web
@@ -447,7 +447,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1467
#, python-format
msgid "Manage Filters"
msgstr "Hallitse Suotimia"
msgstr "Hallitse suodattimia"
#. module: web
#. openerp-web
@@ -461,14 +461,14 @@ msgstr "sisältää"
#: code:addons/web/static/src/js/coresetup.js:633
#, python-format
msgid "Take a minute to get a coffee,<br />because it's loading..."
msgstr ""
msgstr "Käy vaikka kahvilla,<br />koska tämä lataus kestää hetken..."
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:413
#, python-format
msgid "Activate the developer mode"
msgstr ""
msgstr "Aktivoi kehittäjätila"
#. module: web
#. openerp-web
@@ -482,14 +482,14 @@ msgstr "Ladataan (%d)"
#: code:addons/web/static/src/js/search.js:1114
#, python-format
msgid "GroupBy"
msgstr ""
msgstr "Järjestä"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_list.js:687
#, python-format
msgid "You must select at least one record."
msgstr ""
msgstr "Sinun täytyy valita vähintään yksi tietue."
#. module: web
#. openerp-web
@@ -503,7 +503,7 @@ msgstr "Näytä loki (perm_read)"
#: code:addons/web/static/src/js/view_form.js:1061
#, python-format
msgid "Set Default"
msgstr "Aseta Oletukseksi"
msgstr "Aseta oletukseksi"
#. module: web
#. openerp-web
@@ -517,7 +517,7 @@ msgstr "Suhde:"
#: code:addons/web/static/src/js/coresetup.js:600
#, python-format
msgid "less than a minute ago"
msgstr ""
msgstr "alle minuutti sitten"
#. module: web
#. openerp-web
@@ -552,14 +552,14 @@ msgstr "Palautettu"
#: code:addons/web/static/src/js/view_list.js:394
#, python-format
msgid "%d-%d of %d"
msgstr ""
msgstr "%d-%d %d :sta"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:2868
#, python-format
msgid "Create and Edit..."
msgstr ""
msgstr "Luo ja muokkaa..."
#. module: web
#. openerp-web
@@ -573,7 +573,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:2346
#, python-format
msgid "Resource error"
msgstr ""
msgstr "Resurssivirhe"
#. module: web
#. openerp-web
@@ -587,21 +587,21 @@ msgstr "ei ole"
#: code:addons/web/static/src/xml/base.xml:550
#, python-format
msgid "Print Workflow"
msgstr ""
msgstr "Tulosta työnkulku"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:396
#, python-format
msgid "Please confirm your new password"
msgstr ""
msgstr "Vahvista uusi salasanasi"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1804
#, python-format
msgid "UTF-8"
msgstr ""
msgstr "UTF-8"
#. module: web
#. openerp-web
@@ -674,7 +674,7 @@ msgstr "Näkymä"
#: code:addons/web/static/src/xml/base.xml:1466
#, python-format
msgid "Save Filter"
msgstr "Tallenna suodin"
msgstr "Tallenna suodatin"
#. module: web
#. openerp-web
@@ -689,13 +689,14 @@ msgstr "Toiminnon ID:"
#, python-format
msgid "Your user's preference timezone does not match your browser timezone:"
msgstr ""
"Käyttäjätietojesi aikavyöhyke ei täsmää selaimesi aikavyöhykkeen kanssa:"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:1223
#, python-format
msgid "Field '%s' specified in view could not be found."
msgstr ""
msgstr "Näkymässä määriteltyä kenttää '%s' ei löytynyt."
#. module: web
#. openerp-web
@@ -716,21 +717,21 @@ msgstr "Vanha salasana:"
#: code:addons/web/static/src/js/formats.js:113
#, python-format
msgid "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
msgstr ""
msgstr "bittiä,kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:481
#, python-format
msgid "The database has been duplicated."
msgstr ""
msgstr "Tietokanta on kopioitu"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1625
#, python-format
msgid "Apply"
msgstr ""
msgstr "Käytä"
#. module: web
#. openerp-web
@@ -752,21 +753,21 @@ msgstr "Tallenna nimellä"
#: code:addons/web/doc/module/static/src/xml/web_example.xml:3
#, python-format
msgid "00:00:00"
msgstr ""
msgstr "00:00:00"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:2317
#, python-format
msgid "E-mail error"
msgstr ""
msgstr "Sähköpostivirhe"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:605
#, python-format
msgid "a day ago"
msgstr ""
msgstr "päivä sitten"
#. module: web
#. openerp-web
@@ -780,7 +781,7 @@ msgstr "Onko tiedostossasi otsikot?"
#: code:addons/web/static/src/js/view_list.js:327
#, python-format
msgid "Unlimited"
msgstr "Ei rajoitettu"
msgstr "Rajoittamaton"
#. module: web
#. openerp-web
@@ -791,6 +792,9 @@ msgid ""
"\n"
"Are you sure you want to leave this page ?"
msgstr ""
"Varoitus, tietuetta on muokattu ja tekemäsi muutokset hylätään.\n"
"\n"
"Haluatko varmasti poistua tältä sivulta ?"
#. module: web
#. openerp-web
@@ -818,14 +822,14 @@ msgstr "Rajoitin:"
#: code:addons/web/static/src/xml/base.xml:462
#, python-format
msgid "Browser's timezone"
msgstr ""
msgstr "Selaimen aikavyhöhyke"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1605
#, python-format
msgid "Filter name"
msgstr ""
msgstr "Suodattimen nimi"
#. module: web
#. openerp-web
@@ -856,7 +860,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:421
#, python-format
msgid "OpenERP.com"
msgstr ""
msgstr "OpenERP.com"
#. module: web
#. openerp-web
@@ -870,7 +874,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:636
#, python-format
msgid "Add..."
msgstr ""
msgstr "Lisää..."
#. module: web
#. openerp-web
@@ -945,14 +949,14 @@ msgstr "Käyttäjänimi"
#: code:addons/web/static/src/js/chrome.js:481
#, python-format
msgid "Duplicating database"
msgstr ""
msgstr "Tietokantaa kopioidaan"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:563
#, python-format
msgid "Password has been changed successfully"
msgstr ""
msgstr "Salasana vaihdettu"
#. module: web
#. openerp-web
@@ -966,7 +970,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:533
#, python-format
msgid "Debug View#"
msgstr ""
msgstr "Kehitysnäkymä#"
#. module: web
#. openerp-web
@@ -1014,7 +1018,7 @@ msgstr "Tallenna kenttäluettelo"
#: code:addons/web/doc/module/static/src/xml/web_example.xml:5
#, python-format
msgid "Start"
msgstr ""
msgstr "Aloita"
#. module: web
#. openerp-web
@@ -1035,14 +1039,14 @@ msgstr "Luontipäivämäärä:"
#: code:addons/web/controllers/main.py:835
#, python-format
msgid "Error, password not changed !"
msgstr ""
msgstr "Virhe, salasanaa ei muutettu"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4850
#, python-format
msgid "The selected file exceed the maximum file size of %s."
msgstr ""
msgstr "Tiedoston suurin sallittu koko %s ylitetty."
#. module: web
#. openerp-web
@@ -1050,14 +1054,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1300
#, python-format
msgid "/web/binary/upload_attachment"
msgstr ""
msgstr "/web/binary/upload_attachment"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:563
#, python-format
msgid "Changed Password"
msgstr ""
msgstr "Salasana vaihdettu"
#. module: web
#. openerp-web
@@ -1091,14 +1095,14 @@ msgstr "Varmuuskopioi"
#: code:addons/web/static/src/js/dates.js:80
#, python-format
msgid "'%s' is not a valid time"
msgstr ""
msgstr "\"%s\" ei ole kelvollinen aika"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/formats.js:274
#, python-format
msgid "'%s' is not a correct date"
msgstr ""
msgstr "'%s' ei ole kelvollinen päivämäärä"
#. module: web
#. openerp-web
@@ -1112,14 +1116,14 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:606
#, python-format
msgid "%d days ago"
msgstr ""
msgstr "%d päivää sitten"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1474
#, python-format
msgid "(Any existing filter with the same name will be replaced)"
msgstr "(jo olemassaoleva samanniminen suodin korvataan)"
msgstr ""
#. module: web
#. openerp-web
@@ -1166,7 +1170,7 @@ msgstr "Tuntematon operaattori %s toimialueella %s"
#: code:addons/web/static/src/js/view_form.js:428
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web
#. openerp-web
@@ -1196,7 +1200,7 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:608
#, python-format
msgid "%d months ago"
msgstr ""
msgstr "%d kuukautta sitten"
#. module: web
#. openerp-web
@@ -1217,7 +1221,7 @@ msgstr "Lisää kehittynyt suodin"
#: code:addons/web/controllers/main.py:828
#, python-format
msgid "The new password and its confirmation must be identical."
msgstr ""
msgstr "Uusi salasana sekä vahvistus tulee olla samat."
#. module: web
#. openerp-web
@@ -1225,14 +1229,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:248
#, python-format
msgid "Restore Database"
msgstr ""
msgstr "Palauta tietokanta"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:644
#, python-format
msgid "Login"
msgstr ""
msgstr "Kirjaudu"
#. module: web
#. openerp-web
@@ -1346,28 +1350,28 @@ msgstr "%(page)d/%(page_count)d"
#: code:addons/web/static/src/js/chrome.js:397
#, python-format
msgid "The confirmation does not match the password"
msgstr ""
msgstr "Salasanan vahvistus ei täsmää salasanan kanssa"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:441
#, python-format
msgid "Edit Company data"
msgstr ""
msgstr "Muokkaa yrityksen tietoja"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4886
#, python-format
msgid "Save As..."
msgstr ""
msgstr "Tallenna nimellä..."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:5007
#, python-format
msgid "Could not display the selected image."
msgstr ""
msgstr "Valittua kuvaa ei voitu näyttää."
#. module: web
#. openerp-web
@@ -1390,7 +1394,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:394
#, python-format
msgid "99+"
msgstr ""
msgstr "99+"
#. module: web
#. openerp-web
@@ -1404,14 +1408,14 @@ msgstr "1. Tuo .CSV tiedosto"
#: code:addons/web/static/src/js/chrome.js:644
#, python-format
msgid "No database selected !"
msgstr ""
msgstr "Tietokantaa ei valittu !"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/formats.js:180
#, python-format
msgid "(%d records)"
msgstr ""
msgstr "(%d tietuetta)"
#. module: web
#. openerp-web
@@ -1425,7 +1429,7 @@ msgstr "Vaihda oletusarvo:"
#: code:addons/web/static/src/xml/base.xml:171
#, python-format
msgid "Original database name:"
msgstr ""
msgstr "Alkuperäinen tietokannan nimi:"
#. module: web
#. openerp-web
@@ -1449,7 +1453,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1619
#, python-format
msgid "Advanced Search"
msgstr ""
msgstr "Tarkennettu haku"
#. module: web
#. openerp-web
@@ -1496,7 +1500,7 @@ msgstr "Tuonnin valinnat"
#: code:addons/web/static/src/js/view_form.js:2936
#, python-format
msgid "Add %s"
msgstr ""
msgstr "Lisää %s"
#. module: web
#. openerp-web
@@ -1534,7 +1538,7 @@ msgstr "CSV tiedosto:"
#: code:addons/web/static/src/js/search.js:1741
#, python-format
msgid "Advanced"
msgstr ""
msgstr "Lisäasetukset"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+3 -3
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
@@ -2349,7 +2349,7 @@ msgstr "Copiaza"
#: code:addons/web/static/src/xml/base.xml:1391
#, python-format
msgid "Discard"
msgstr "Elimina"
msgstr "Renunță"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:44+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:07+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:45+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web
#. openerp-web
+277 -273
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -38,6 +38,7 @@ class Model(object):
self.proxy = self.session.proxy('object')
def __getattr__(self, method):
self.session.assert_valid()
def proxy(*args, **kw):
result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
# reorder read
@@ -109,8 +110,8 @@ class OpenERPSession(object):
if self._uid and not force:
return
# TODO use authenticate instead of login
uid = self.proxy("common").login(self._db, self._login, self._password)
if not uid:
self._uid = self.proxy("common").login(self._db, self._login, self._password)
if not self._uid:
raise AuthenticationError("Authentication failure")
def ensure_valid(self):
@@ -121,7 +122,6 @@ class OpenERPSession(object):
self._uid = None
def execute(self, model, func, *l, **d):
self.assert_valid()
model = self.model(model)
r = getattr(model, func)(*l, **d)
return r
+30 -6
View File
@@ -1,4 +1,4 @@
@charset "UTF-8";
@charset "utf-8";
@font-face {
font-family: "mnmliconsRegular";
src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
@@ -1263,7 +1263,7 @@
color: white;
padding: 2px 4px;
margin: 1px 6px 0 0;
border: 1px solid lightgrey;
border: 1px solid lightGray;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
@@ -1295,7 +1295,7 @@
transform: scale(1.1);
}
.openerp .oe_secondary_submenu .oe_active {
border-top: 1px solid lightgrey;
border-top: 1px solid lightGray;
border-bottom: 1px solid #dedede;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
@@ -1415,7 +1415,13 @@
display: inline-block;
overflow: hidden;
}
.openerp .oe_view_manager {
display: table;
height: inherit;
width: 100%;
}
.openerp .oe_view_manager .oe_view_manager_body {
display: table-row;
height: inherit;
}
.openerp .oe_view_manager .oe_view_manager_view_kanban {
@@ -2251,7 +2257,7 @@
}
.openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
font-size: 80%;
color: darkgreen;
color: darkGreen;
vertical-align: top;
position: relative;
top: -4px;
@@ -2323,6 +2329,7 @@
width: 100%;
display: inline-block;
padding: 2px 2px 2px 0px;
vertical-align: top;
}
.openerp .oe_form .oe_form_field input {
margin: 0px;
@@ -2366,7 +2373,6 @@
white-space: nowrap;
}
.openerp .oe_form .oe_form_field_boolean {
padding-top: 4px;
width: auto;
}
.openerp .oe_form .oe_datepicker_container {
@@ -3088,8 +3094,25 @@
color: #333333;
}
@-moz-document url-prefix() {
.openerp .oe_view_manager .oe_view_manager_switch li {
line-height: 21px;
}
.openerp .oe_searchview .oe_searchview_search {
top: -1px;
}
.openerp .oe_form_field_many2one .oe_m2o_cm_button {
line-height: 18px;
}
.openerp .oe_secondary_submenu {
line-height: 14px;
}
.openerp .oe_webclient .oe_star_on, .openerp .oe_webclient .oe_star_off {
top: 0px;
}
}
.kitten-mode-activated {
background-image: url(http://placekitten.com/g/1365/769);
background-size: cover;
background-attachment: fixed;
}
@@ -3308,6 +3331,7 @@ div.ui-widget-overlay {
overflow: hidden !important;
}
}
.blockUI.blockOverlay {
background-color: black;
opacity: 0.6;
+19 -2
View File
@@ -1137,7 +1137,11 @@ $sheet-padding: 16px
// }}}
// ViewManager common {{{
.oe_view_manager
display: table
height: inherit
width: 100%
.oe_view_manager_body
display: table-row
height: inherit
.oe_view_manager_view_kanban
height: inherit
@@ -1845,6 +1849,7 @@ $sheet-padding: 16px
width: 100%
display: inline-block
padding: 2px 2px 2px 0px
vertical-align: top
input
margin: 0px
input[type="text"], input[type="password"], input[type="file"], select
@@ -1872,7 +1877,6 @@ $sheet-padding: 16px
.oe_form_field_datetime
white-space: nowrap
.oe_form_field_boolean
padding-top: 4px
width: auto
.oe_datepicker_container
display: none
@@ -2434,9 +2438,22 @@ $sheet-padding: 16px
float: right
color: #333
// }}}
@-moz-document url-prefix()
.openerp
.oe_view_manager .oe_view_manager_switch li
line-height: 21px
.oe_searchview .oe_searchview_search
top: -1px
.oe_form_field_many2one .oe_m2o_cm_button
line-height: 18px
.oe_secondary_submenu
line-height: 14px
.oe_webclient
.oe_star_on, .oe_star_off
top: 0px
// Kitten Mode {{{
.kitten-mode-activated
background-image: url(http://placekitten.com/g/1365/769)
background-size: cover
background-attachment: fixed
>*
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

+72 -10
View File
@@ -247,6 +247,11 @@ instance.web.CrashManager = instance.web.Class.extend({
if (!this.active) {
return;
}
var handler = instance.web.crash_manager_registry.get_object(error.data.name, true);
if (handler) {
new (handler)(this, error).display();
return;
};
if (error.data.name === "openerp.addons.web.session SessionExpiredException") {
this.show_warning({type: "Session Expired", data: { message: "Your OpenERP session expired. Please refresh the current web page." }});
return;
@@ -299,6 +304,57 @@ instance.web.CrashManager = instance.web.Class.extend({
},
});
/**
An interface to implement to handle exceptions. Register implementation in instance.web.crash_manager_registry.
*/
instance.web.ExceptionHandler = {
/**
@param parent The parent.
@param error The error object as returned by the JSON-RPC implementation.
*/
init: function(parent, error) {},
/**
Called to inform to display the widget, if necessary. A typical way would be to implement
this interface in a class extending instance.web.Dialog and simply display the dialog in this
method.
*/
display: function() {},
};
/**
The registry to handle exceptions. It associate a fully qualified python exception name with a class implementing
instance.web.ExceptionHandler.
*/
instance.web.crash_manager_registry = new instance.web.Registry();
/**
* Handle redirection warnings, which behave more or less like a regular
* warning, with an additional redirection button.
*/
instance.web.RedirectWarningHandler = instance.web.Dialog.extend(instance.web.ExceptionHandler, {
init: function(parent, error) {
this._super(parent);
this.error = error;
},
display: function() {
error = this.error;
error.data.message = error.data.arguments[0];
instance.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), {
title: "OpenERP " + (_.str.capitalize(error.type) || "Warning"),
buttons: [
{text: _t("Ok"), click: function() { $(this).dialog("close"); }},
{text: error.data.arguments[2], click: function() {
window.location.href='#action='+error.data.arguments[1];
$(this).dialog("close");
}}
]
});
this.destroy();
}
});
instance.web.crash_manager_registry.add('openerp.exceptions.RedirectWarning', 'instance.web.RedirectWarningHandler');
instance.web.Loading = instance.web.Widget.extend({
template: _t("Loading"),
init: function(parent) {
@@ -1028,7 +1084,7 @@ instance.web.UserMenu = instance.web.Widget.extend({
if (!self.session.uid)
return;
var func = new instance.web.Model("res.users").get_func("read");
return func(self.session.uid, ["name", "company_id"]).then(function(res) {
return self.alive(func(self.session.uid, ["name", "company_id"])).then(function(res) {
var topbar_name = res.name;
if(instance.session.debug)
topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.session.db);
@@ -1044,6 +1100,9 @@ instance.web.UserMenu = instance.web.Widget.extend({
};
this.update_promise = this.update_promise.then(fct, fct);
},
on_menu_help: function() {
window.open('http://help.openerp.com', '_blank');
},
on_menu_logout: function() {
this.trigger('user_logout');
},
@@ -1157,6 +1216,7 @@ instance.web.WebClient = instance.web.Client.extend({
return $.when(this._super()).then(function() {
if (jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined) {
$("body").addClass("kitten-mode-activated");
$("body").css("background-image", "url(" + instance.session.origin + "/web/static/src/img/back-enable.jpg" + ")");
if ($.blockUI) {
$.blockUI.defaults.message = '<img src="http://www.amigrave.com/kitten.gif">';
}
@@ -1243,7 +1303,7 @@ instance.web.WebClient = instance.web.Client.extend({
},
logo_edit: function(ev) {
var self = this;
new instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"]).then(function(res) {
new self.alive(instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"])).then(function(res) {
self.rpc("/web/action/load", { action_id: "base.action_res_company_form" }).done(function(result) {
result.res_id = res['company_id'][0];
result.target = "new";
@@ -1264,7 +1324,7 @@ instance.web.WebClient = instance.web.Client.extend({
},
check_timezone: function() {
var self = this;
return new instance.web.Model('res.users').call('read', [[this.session.uid], ['tz_offset']]).then(function(result) {
return self.alive(new instance.web.Model('res.users').call('read', [[this.session.uid], ['tz_offset']])).then(function(result) {
var user_offset = result[0]['tz_offset'];
var offset = -(new Date().getTimezoneOffset());
// _.str.sprintf()'s zero front padding is buggy with signed decimals, so doing it manually
@@ -1340,8 +1400,9 @@ instance.web.WebClient = instance.web.Client.extend({
},
on_hashchange: function(event) {
var self = this;
var state = event.getState(true);
if (!_.isEqual(this._current_state, state)) {
var stringstate = event.getState(false);
if (!_.isEqual(this._current_state, stringstate)) {
var state = event.getState(true);
if(!state.action && state.menu_id) {
self.menu.has_been_loaded.done(function() {
self.menu.do_reload().done(function() {
@@ -1353,13 +1414,13 @@ instance.web.WebClient = instance.web.Client.extend({
this.action_manager.do_load_state(state, !!this._current_state);
}
}
this._current_state = state;
this._current_state = stringstate;
},
do_push_state: function(state) {
this.set_title(state.title);
delete state.title;
var url = '#' + $.param(state);
this._current_state = _.clone(state);
this._current_state = $.deparam($.param(state), false); // stringify all values
$.bbq.pushState(url);
this.trigger('state_pushed', state);
},
@@ -1369,9 +1430,10 @@ instance.web.WebClient = instance.web.Client.extend({
.then(function (result) {
return self.action_mutex.exec(function() {
if (options.needaction) {
result.context = new instance.web.CompoundContext(
result.context,
{search_default_message_unread: true});
result.context = new instance.web.CompoundContext(result.context, {
search_default_message_unread: true,
search_disable_custom_filters: true,
});
}
var completed = $.Deferred();
$.when(self.action_manager.do_action(result, {
+33 -10
View File
@@ -228,6 +228,38 @@ instance.web.ParentedMixin = {
isDestroyed : function() {
return this.__parentedDestroyed;
},
/**
Utility method to only execute asynchronous actions if the current
object has not been destroyed.
@param {Promise} promise The promise representing the asynchronous action.
@param {bool} reject Defaults to false. If true, the returned promise will be
rejected with no arguments if the current object is destroyed. If false,
the returned promise will never be resolved nor rejected.
@returns {Promise} A promise that will mirror the given promise if everything goes
fine but will either be rejected with no arguments or never resolved if the
current object is destroyed.
*/
alive: function(promise, reject) {
var def = $.Deferred();
var self = this;
promise.done(function() {
if (! self.isDestroyed()) {
if (! reject)
def.resolve.apply(def, arguments);
else
def.reject();
}
}).fail(function() {
if (! self.isDestroyed()) {
if (! reject)
def.reject.apply(def, arguments);
else
def.reject();
}
});
return def.promise();
},
/**
* Inform the object it should destroy itself, releasing any
* resource it could have reserved.
@@ -495,16 +527,7 @@ instance.web.Controller = instance.web.Class.extend(instance.web.PropertiesMixin
return false;
},
rpc: function(url, data, options) {
var def = $.Deferred();
var self = this;
instance.session.rpc(url, data, options).done(function() {
if (!self.isDestroyed())
def.resolve.apply(def, arguments);
}).fail(function() {
if (!self.isDestroyed())
def.reject.apply(def, arguments);
});
return def.promise();
return this.alive(instance.session.rpc(url, data, options));
}
});
+89 -25
View File
@@ -690,7 +690,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
return filter.user_id && filter.is_default;
});
if (personal_filter) {
this.custom_filters.enable_filter(personal_filter, true);
this.custom_filters.toggle_filter(personal_filter, true);
return;
}
@@ -698,7 +698,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
return !filter.user_id && filter.is_default;
});
if (global_filter) {
this.custom_filters.enable_filter(global_filter, true);
this.custom_filters.toggle_filter(global_filter, true);
return;
}
}
@@ -1466,12 +1466,15 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({
},
complete: function (needle) {
var self = this;
// TODO: context
// FIXME: "concurrent" searches (multiple requests, mis-ordered responses)
var context = instance.web.pyeval.eval(
'contexts', [this.view.dataset.get_context()]);
return this.model.call('name_search', [], {
name: needle,
args: instance.web.pyeval.eval(
'domains', this.attrs.domain ? [this.attrs.domain] : [], context),
limit: 8,
context: {}
context: context
}).then(function (results) {
if (_.isEmpty(results)) { return null; }
return [{label: self.attrs.string}].concat(
@@ -1541,6 +1544,9 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
})
.on('reset', this.proxy('clear_selection'));
this.$el.on('submit', 'form', this.proxy('save_current'));
this.$el.on('click', 'input[type=checkbox]', function() {
$(this).siblings('input[type=checkbox]').prop('checked', false);
});
this.$el.on('click', 'h4', function () {
self.$el.toggleClass('oe_opened');
});
@@ -1591,6 +1597,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
get_groupby: function () { return [filter.context]; },
get_domain: function () { return filter.domain; }
},
_id: filter['id'],
is_custom_filter: true,
values: [{label: filter.name, value: null}]
};
@@ -1632,10 +1639,18 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
}
$filter.unbind('click').click(function () {
self.enable_filter(filter);
self.toggle_filter(filter);
});
},
enable_filter: function (filter, preventSearch) {
toggle_filter: function (filter, preventSearch) {
var current = this.view.query.find(function (facet) {
return facet.get('_id') === filter.id;
});
if (current) {
this.view.query.remove(current);
this.$filters[this.key_for(filter)].removeClass('oe_selected');
return;
}
this.view.query.reset([this.facet_for(filter)], {
preventSearch: preventSearch || false});
this.$filters[this.key_for(filter)].addClass('oe_selected');
@@ -1800,6 +1815,7 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
template: 'SearchView.extended_search.proposition',
events: {
'change .searchview_extended_prop_field': 'changed',
'change .searchview_extended_prop_op': 'operator_changed',
'click .searchview_extended_delete_prop': function (e) {
e.stopPropagation();
this.getParent().remove_proposition(this);
@@ -1831,6 +1847,17 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
this.select_field(_.detect(this.fields, function(x) {return x.name == nval;}));
}
},
operator_changed: function (e) {
var $value = this.$('.searchview_extended_prop_value');
switch ($(e.target).val()) {
case '∃':
case '∄':
$value.hide();
break;
default:
$value.show();
}
},
/**
* Selects the provided field object
*
@@ -1859,7 +1886,7 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
.text(String(operator.text))
.appendTo(self.$('.searchview_extended_prop_op'));
});
var $value_loc = this.$('.searchview_extended_prop_value').empty();
var $value_loc = this.$('.searchview_extended_prop_value').show().empty();
this.value.appendTo($value_loc);
},
@@ -1867,19 +1894,12 @@ instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @
if ( this.attrs.selected == null)
return null;
var field = this.attrs.selected;
var op = this.$('.searchview_extended_prop_op')[0];
var operator = op.options[op.selectedIndex];
var op_select = this.$('.searchview_extended_prop_op')[0];
var operator = op_select.options[op_select.selectedIndex];
return {
label: _.str.sprintf(_t('%(field)s %(operator)s "%(value)s"'), {
field: field.string,
// According to spec, HTMLOptionElement#label should return
// HTMLOptionElement#text when not defined/empty, but it does
// not in older Webkit (between Safari 5.1.5 and Chrome 17) and
// Gecko (pre Firefox 7) browsers, so we need a manual fallback
// for those
operator: operator.label || operator.text,
value: this.value}),
value: [field.name, operator.value, this.value.get_value()]
label: this.value.get_label(field, operator),
value: this.value.get_domain(field, operator),
};
}
});
@@ -1889,6 +1909,37 @@ instance.web.search.ExtendedSearchProposition.Field = instance.web.Widget.extend
this._super(parent);
this.field = field;
},
get_label: function (field, operator) {
var format;
switch (operator.value) {
case '∃': case '∄': format = _t('%(field)s %(operator)s'); break;
default: format = _t('%(field)s %(operator)s "%(value)s"'); break;
}
return this.format_label(format, field, operator);
},
format_label: function (format, field, operator) {
return _.str.sprintf(format, {
field: field.string,
// According to spec, HTMLOptionElement#label should return
// HTMLOptionElement#text when not defined/empty, but it does
// not in older Webkit (between Safari 5.1.5 and Chrome 17) and
// Gecko (pre Firefox 7) browsers, so we need a manual fallback
// for those
operator: operator.label || operator.text,
value: this
});
},
get_domain: function (field, operator) {
switch (operator.value) {
case '∃': return this.make_domain(field.name, '!=', false);
case '∄': return this.make_domain(field.name, '=', false);
default: return this.make_domain(
field.name, operator.value, this.get_value());
}
},
make_domain: function (field, operator, value) {
return [field, operator, value];
},
/**
* Returns a human-readable version of the value, in case the "logical"
* and the "semantic" values of a field differ (as for selection fields,
@@ -1908,7 +1959,9 @@ instance.web.search.ExtendedSearchProposition.Char = instance.web.search.Extende
{value: "ilike", text: _lt("contains")},
{value: "not ilike", text: _lt("doesn't contain")},
{value: "=", text: _lt("is equal to")},
{value: "!=", text: _lt("is not equal to")}
{value: "!=", text: _lt("is not equal to")},
{value: "∃", text: _lt("is set")},
{value: "∄", text: _lt("is not set")}
],
get_value: function() {
return this.$el.val();
@@ -1922,7 +1975,9 @@ instance.web.search.ExtendedSearchProposition.DateTime = instance.web.search.Ext
{value: ">", text: _lt("greater than")},
{value: "<", text: _lt("less than")},
{value: ">=", text: _lt("greater or equal than")},
{value: "<=", text: _lt("less or equal than")}
{value: "<=", text: _lt("less or equal than")},
{value: "∃", text: _lt("is set")},
{value: "∄", text: _lt("is not set")}
],
/**
* Date widgets live in view_form which is not yet loaded when this is
@@ -1956,7 +2011,9 @@ instance.web.search.ExtendedSearchProposition.Integer = instance.web.search.Exte
{value: ">", text: _lt("greater than")},
{value: "<", text: _lt("less than")},
{value: ">=", text: _lt("greater or equal than")},
{value: "<=", text: _lt("less or equal than")}
{value: "<=", text: _lt("less or equal than")},
{value: "∃", text: _lt("is set")},
{value: "∄", text: _lt("is not set")}
],
toString: function () {
return this.$el.val();
@@ -1981,7 +2038,9 @@ instance.web.search.ExtendedSearchProposition.Float = instance.web.search.Extend
{value: ">", text: _lt("greater than")},
{value: "<", text: _lt("less than")},
{value: ">=", text: _lt("greater or equal than")},
{value: "<=", text: _lt("less or equal than")}
{value: "<=", text: _lt("less or equal than")},
{value: "∃", text: _lt("is set")},
{value: "∄", text: _lt("is not set")}
],
toString: function () {
return this.$el.val();
@@ -1999,7 +2058,9 @@ instance.web.search.ExtendedSearchProposition.Selection = instance.web.search.Ex
template: 'SearchView.extended_search.proposition.selection',
operators: [
{value: "=", text: _lt("is")},
{value: "!=", text: _lt("is not")}
{value: "!=", text: _lt("is not")},
{value: "∃", text: _lt("is set")},
{value: "∄", text: _lt("is not set")}
],
toString: function () {
var select = this.$el[0];
@@ -2016,7 +2077,10 @@ instance.web.search.ExtendedSearchProposition.Boolean = instance.web.search.Exte
{value: "=", text: _lt("is true")},
{value: "!=", text: _lt("is false")}
],
toString: function () { return ''; },
get_label: function (field, operator) {
return this.format_label(
_t('%(field)s %(operator)s'), field, operator);
},
get_value: function() {
return true;
}
+153 -140
View File
@@ -247,13 +247,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
do_load_state: function(state, warm) {
if (state.id && this.datarecord.id != state.id) {
if (!this.dataset.get_id_index(state.id)) {
if (this.dataset.get_id_index(state.id) === null) {
this.dataset.ids.push(state.id);
}
this.dataset.select_id(state.id);
if (warm) {
this.do_show();
}
this.do_show({ reload: warm });
}
},
/**
@@ -511,9 +509,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var on_change = widget.node.attrs.on_change;
if (on_change) {
var change_spec = self.parse_on_change(on_change, widget);
var id = [self.datarecord.id == null ? [] : [self.datarecord.id]];
def = new instance.web.Model(self.dataset.model).call(
change_spec.method, id.concat(change_spec.args));
var ids = [];
if (self.datarecord.id && !instance.web.BufferedDataSet.virtual_id_regex.test(self.datarecord.id)) {
// In case of a o2m virtual id, we should pass an empty ids list
ids.push(self.datarecord.id);
}
def = self.alive(new instance.web.Model(self.dataset.model).call(
change_spec.method, [ids].concat(change_spec.args)));
} else {
def = $.when({});
}
@@ -531,9 +533,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var condition = fieldname + '=' + value_;
if (value_) {
return new instance.web.Model('ir.values').call(
return self.alive(new instance.web.Model('ir.values').call(
'get_defaults', [self.model, condition]
).then(function (results) {
)).then(function (results) {
if (!results.length) {
return response;
}
@@ -1191,6 +1193,10 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
$('button', doc).each(function() {
$(this).attr('data-button-type', $(this).attr('type')).attr('type', 'button');
});
// IE's html parser is also a css parser. How convenient...
$('board', doc).each(function() {
$(this).attr('layout', $(this).attr('style'));
});
return $('<div class="oe_form"/>').append(instance.web.xml_to_str(doc));
},
render_to: function($target) {
@@ -2327,7 +2333,7 @@ instance.web.form.FieldUrl = instance.web.form.FieldChar.extend({
this._super();
} else {
var tmp = this.get('value');
var s = /(\w+):(.+)/.exec(tmp);
var s = /(\w+):(.+)|^\.{0,2}\//.exec(tmp);
if (!s) {
tmp = "http://" + this.get('value');
}
@@ -2376,6 +2382,7 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
type_of_date: "datetime",
events: {
'change .oe_datepicker_master': 'change_datetime',
'dragstart img.oe_datepicker_trigger': function () { return false; },
},
init: function(parent) {
this._super(parent);
@@ -2395,6 +2402,11 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
showButtonPanel: true,
firstDay: Date.CultureInfo.firstDayOfWeek
});
// Some clicks in the datepicker dialog are not stopped by the
// datepicker and "bubble through", unexpectedly triggering the bus's
// click event. Prevent that.
this.picker('widget').click(function (e) { e.stopPropagation(); });
this.$el.find('img.oe_datepicker_trigger').click(function() {
if (self.get("effective_readonly") || self.picker('widget').is(':visible')) {
self.$input.focus();
@@ -2957,7 +2969,9 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
case $.ui.keyCode.DOWN:
e.stopPropagation();
}
}
},
'dragstart .oe_m2o_drop_down_button img': function () { return false; },
'dragstart .oe_m2o_cm_button': function () { return false; }
},
init: function(field_manager, node) {
this._super(field_manager, node);
@@ -3047,9 +3061,9 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
this.$input.keydown(input_changed);
this.$input.change(input_changed);
this.$drop_down.click(function() {
self.$input.focus();
if (self.$input.autocomplete("widget").is(":visible")) {
self.$input.autocomplete("close");
self.$input.focus();
self.$input.autocomplete("close");
} else {
if (self.get("value") && ! self.floating) {
self.$input.autocomplete("search", "");
@@ -3058,6 +3072,15 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
}
}
});
// Autocomplete close on dialog content scroll
var close_autocomplete = _.debounce(function() {
if (self.$input.autocomplete("widget").is(":visible")) {
self.$input.autocomplete("close");
}
}, 50);
this.$input.closest(".ui-dialog .ui-dialog-content").on('scroll', this, close_autocomplete);
self.ed_def = $.Deferred();
self.uned_def = $.Deferred();
var ed_delay = 200;
@@ -4094,6 +4117,13 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
focus: function () {
this.$text[0].focus();
},
set_dimensions: function (height, width) {
this._super(height, width);
this.$("textarea").css({
width: width,
minHeight: height
});
},
});
/**
@@ -4450,6 +4480,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
* options:
* -readonly: only applicable when not in creation mode, default to false
* - alternative_form_view
* - view_id
* - write_function
* - read_function
* - create_function
@@ -4516,7 +4547,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
_.extend(options, {
$buttons: this.$buttonpane,
});
this.view_form = new instance.web.FormView(this, this.dataset, false, options);
this.view_form = new instance.web.FormView(this, this.dataset, this.options.view_id || false, options);
if (this.options.alternative_form_view) {
this.view_form.set_embedded_view(this.options.alternative_form_view);
}
@@ -4545,6 +4576,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
});
var $cbutton = self.$buttonpane.find(".oe_abstractformpopup-form-close");
$cbutton.click(function() {
self.view_form.trigger('on_button_cancel');
self.check_exit();
});
self.view_form.do_show();
@@ -5014,7 +5046,7 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
});
/**
* Widget for (one2many field) to upload one or more file in same time and display in list.
* Widget for (many2many field) to upload one or more file in same time and display in list.
* The user can delete his files.
* Options on attribute ; "blockui" {Boolean} block the UI or not
* during the file is uploading
@@ -5028,6 +5060,8 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
if(this.field.type != "many2many" || this.field.relation != 'ir.attachment') {
throw _.str.sprintf(_t("The type of the field '%s' must be a many2many field with a relation to 'ir.attachment' model."), this.field.string);
}
this.data = {};
this.set_value([]);
this.ds_file = new instance.web.DataSetSearch(this, 'ir.attachment');
this.fileupload_id = _.uniqueId('oe_fileupload_temp');
$(window).on(this.fileupload_id, _.bind(this.on_file_loaded, this));
@@ -5037,73 +5071,39 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
this.$el.on('change', 'input.oe_form_binary_file', this.on_file_change );
},
set_value: function(value_) {
var value_ = value_ || [];
var self = this;
var ids = [];
_.each(value_, function(command) {
if (isNaN(command) && command.id == undefined) {
switch (command[0]) {
case commands.CREATE:
ids = ids.concat(command[2]);
return;
case commands.REPLACE_WITH:
ids = ids.concat(command[2]);
return;
case commands.UPDATE:
ids = ids.concat(command[2]);
return;
case commands.LINK_TO:
ids = ids.concat(command[1]);
return;
case commands.DELETE:
ids = _.filter(ids, function (id) { return id != command[1];});
return;
case commands.DELETE_ALL:
ids = [];
return;
}
} else {
ids.push(command);
}
});
this._super( ids );
value_ = value_ || [];
if (value_.length >= 1 && value_[0] instanceof Array) {
value_ = value_[0][2];
}
this._super(value_);
},
get_value: function() {
return _.map(this.get('value'), function (value) { return commands.link_to( isNaN(value) ? value.id : value ); });
var tmp = [commands.replace_with(this.get("value"))];
return tmp;
},
get_file_url: function (attachment) {
return this.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: attachment['id']});
},
read_name_values : function () {
var self = this;
// select the list of id for a get_name
var values = [];
_.each(this.get('value'), function (val) {
if (typeof val != 'object') {
values.push(val);
}
});
// don't reset know values
var _value = _.filter(this.get('value'), function (id) { return typeof self.data[id] == 'undefined'; } );
// send request for get_name
if (values.length) {
return this.ds_file.call('read', [values, ['id', 'name', 'datas_fname']]).done(function (datas) {
if (_value.length) {
return this.ds_file.call('read', [_value, ['id', 'name', 'datas_fname']]).done(function (datas) {
_.each(datas, function (data) {
data.no_unlink = true;
data.url = self.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: data.id});
_.each(self.get('value'), function (val, key) {
if(val == data.id) {
self.get('value')[key] = data;
}
});
self.data[data.id] = data;
});
});
} else {
return $.when(this.get('value'));
return $.when();
}
},
render_value: function () {
var self = this;
this.read_name_values().then(function (datas) {
this.read_name_values().then(function () {
var render = $(instance.web.qweb.render('FieldBinaryFileUploader.files', {'widget': self}));
render.on('click', '.oe_delete', _.bind(self.on_file_delete, self));
@@ -5121,45 +5121,36 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
var self = this;
var $target = $(event.target);
if ($target.val() !== '') {
var filename = $target.val().replace(/.*[\\\/]/,'');
// if the files is currently uploded, don't send again
if( !isNaN(_.find(this.get('value'), function (file) { return (file.filename || file.name) == filename && file.upload; } )) ) {
// don't uplode more of one file in same time
if (self.data[0] && self.data[0].upload ) {
return false;
}
for (var id in this.get('value')) {
// if the files exits, delete the file before upload (if it's a new file)
if (self.data[id] && (self.data[id].filename || self.data[id].name) == filename && !self.data[id].no_unlink ) {
self.ds_file.unlink([id]);
}
}
// block UI or not
if(this.node.attrs.blockui>0) {
instance.web.blockUI();
}
// if the files exits for this answer, delete the file before upload
var files = _.filter(this.get('value'), function (file) {
if((file.filename || file.name) == filename) {
self.ds_file.unlink([file.id]);
return false;
} else {
return true;
}
});
// TODO : unactivate send on wizard and form
// submit file
this.$('form.oe_form_binary_form').submit();
this.$(".oe_fileupload").hide();
// add file on result
files.push({
// add file on data result
this.data[0] = {
'id': 0,
'name': filename,
'filename': filename,
'url': '',
'upload': true
});
this.set({'value': files});
};
}
},
on_file_loaded: function (event, result) {
@@ -5170,39 +5161,39 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
instance.web.unblockUI();
}
// TODO : activate send on wizard and form
if (result.error || !result.id ) {
this.do_warn( _t('Uploading error'), result.error);
files = _.filter(files, function (val) { return !val.upload; });
delete this.data[0];
} else {
for(var i in files){
if(files[i].filename == result.filename && files[i].upload) {
files[i] = {
'id': result.id,
'name': result.name,
'filename': result.filename,
'url': this.get_file_url(result)
};
}
if (this.data[0] && this.data[0].filename == result.filename && this.data[0].upload) {
delete this.data[0];
this.data[result.id] = {
'id': result.id,
'name': result.name,
'filename': result.filename,
'url': this.get_file_url(result)
};
} else {
this.data[result.id] = {
'id': result.id,
'name': result.name,
'filename': result.filename,
'url': this.get_file_url(result)
};
}
var values = _.clone(this.get('value'));
values.push(result.id);
this.set({'value': values});
}
this.set({'value': files});
this.render_value()
},
on_file_delete: function (event) {
event.stopPropagation();
var file_id=$(event.target).data("id");
if (file_id) {
var files=[];
for(var i in this.get('value')){
if(file_id != this.get('value')[i].id){
files.push(this.get('value')[i]);
}
else if(!this.get('value')[i].no_unlink) {
this.ds_file.unlink([file_id]);
}
var files = _.filter(this.get('value'), function (id) {return id != file_id;});
if(!this.data[file_id].no_unlink) {
this.ds_file.unlink([file_id]);
}
this.set({'value': files});
}
@@ -5216,8 +5207,20 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
this.options.clickable = this.options.clickable || (this.node.attrs || {}).clickable || false;
this.options.visible = this.options.visible || (this.node.attrs || {}).statusbar_visible || false;
this.set({value: false});
this.selection = [];
this.set("selection", []);
this.selection_dm = new instance.web.DropMisordered();
},
start: function() {
this.field_manager.on("view_content_has_changed", this, this.calc_domain);
this.calc_domain();
this.on("change:value", this, this.get_selection);
this.on("change:evaluated_selection_domain", this, this.get_selection);
this.get_selection();
this.on("change:selection", this, function() {
this.selection = this.get("selection");
this.render_value();
});
if (this.options.clickable) {
this.$el.on('click','li',this.on_click_stage);
}
@@ -5234,15 +5237,20 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
},
render_value: function() {
var self = this;
self.get_selection().done(function() {
var content = QWeb.render("FieldStatus.content", {widget: self});
self.$el.html(content);
var colors = JSON.parse((self.node.attrs || {}).statusbar_colors || "{}");
var color = colors[self.get('value')];
if (color) {
self.$("oe_active").css("color", color);
}
});
var content = QWeb.render("FieldStatus.content", {widget: self});
self.$el.html(content);
var colors = JSON.parse((self.node.attrs || {}).statusbar_colors || "{}");
var color = colors[self.get('value')];
if (color) {
self.$("oe_active").css("color", color);
}
},
calc_domain: function() {
var d = instance.web.pyeval.eval('domain', this.build_domain());
domain = ['|', ['id', '=', this.get('value')]].concat(d);
if (! _.isEqual(domain, this.get("evaluated_selection_domain"))) {
this.set("evaluated_selection_domain", domain);
}
},
/** Get the selection and render it
* selection: [[identifier, value_to_display], ...]
@@ -5251,32 +5259,37 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
*/
get_selection: function() {
var self = this;
self.selection = [];
if (this.field.type == "many2one") {
var domain = [];
if(!_.isEmpty(this.field.domain) || !_.isEmpty(this.node.attrs.domain)) {
var d = instance.web.pyeval.eval('domain', self.build_domain());
domain = ['|', ['id', '=', self.get('value')]].concat(d);
}
var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
return ds.read_slice(['name'], {}).then(function (records) {
for(var i = 0; i < records.length; i++) {
self.selection.push([records[i].id, records[i].name]);
}
});
} else {
// For field type selection filter values according to
// statusbar_visible attribute of the field. For example:
// statusbar_visible="draft,open".
var selection = this.field.selection;
for(var i=0; i < selection.length; i++) {
var key = selection[i][0];
if(key == this.get('value') || !this.options.visible || this.options.visible.indexOf(key) != -1) {
this.selection.push(selection[i]);
var selection = [];
var calculation = _.bind(function() {
if (this.field.type == "many2one") {
var domain = [];
var ds = new instance.web.DataSetSearch(this, this.field.relation,
self.build_context(), this.get("evaluated_selection_domain"));
return ds.read_slice(['name'], {}).then(function (records) {
for(var i = 0; i < records.length; i++) {
selection.push([records[i].id, records[i].name]);
}
});
} else {
// For field type selection filter values according to
// statusbar_visible attribute of the field. For example:
// statusbar_visible="draft,open".
var select = this.field.selection;
for(var i=0; i < select.length; i++) {
var key = select[i][0];
if(key == this.get('value') || !this.options.visible || this.options.visible.indexOf(key) != -1) {
selection.push(select[i]);
}
}
return $.when();
}
return $.when();
}
}, this);
this.selection_dm.add(calculation()).then(function () {
if (! _.isEqual(selection, self.get("selection"))) {
self.set("selection", selection);
}
});
},
on_click_stage: function (ev) {
var self = this;
@@ -5320,8 +5333,8 @@ instance.web.form.FieldMonetary = instance.web.form.FieldFloat.extend({
this.set({"currency_info": null});
return;
}
return this.ci_dm.add(new instance.web.Model("res.currency").query(["symbol", "position"])
.filter([["id", "=", self.get("currency")]]).first()).then(function(res) {
return this.ci_dm.add(self.alive(new instance.web.Model("res.currency").query(["symbol", "position"])
.filter([["id", "=", self.get("currency")]]).first())).then(function(res) {
self.set({"currency_info": res});
});
},
+3 -3
View File
@@ -1186,7 +1186,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.
}
});
instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.web.ListView.Groups# */{
passtrough_events: 'action deleted row_link',
passthrough_events: 'action deleted row_link',
/**
* Grouped display for the ListView. Handles basic DOM events and interacts
* with the :js:class:`~DataGroup` bound to it.
@@ -1406,7 +1406,7 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
// can have selections spanning multiple links
var selection = self.get_selection();
$this.trigger(e, [selection.ids, selection.records]);
}).bind(this.passtrough_events, function (e) {
}).bind(this.passthrough_events, function (e) {
// additional positional parameters are provided to trigger as an
// Array, following the event type or event object, but are
// provided to the .bind event handler as *args.
@@ -2212,7 +2212,7 @@ instance.web.list.Binary = instance.web.list.Column.extend({
if (value && value.substr(0, 10).indexOf(' ') == -1) {
download_url = "data:application/octet-stream;base64," + value;
} else {
download_url = this.session.url('/web/binary/saveas', {model: options.model, field: this.id, id: options.id});
download_url = instance.session.url('/web/binary/saveas', {model: options.model, field: this.id, id: options.id});
if (this.filename) {
download_url += '&filename_field=' + this.filename;
}
+10 -5
View File
@@ -132,6 +132,15 @@ openerp.web.list_editable = function (instance) {
var self = this;
// tree/@editable takes priority on everything else if present.
var result = this._super(data, grouped);
// In case current editor was started previously, also has to run
// when toggling from editable to non-editable in case form widgets
// have setup global behaviors expecting themselves to exist
// somehow.
this.editor.destroy();
// Editor is not restartable due to formview not being restartable
this.editor = this.make_editor();
if (this.editable()) {
this.$el.addClass('oe_list_editable');
// FIXME: any hook available to ensure this is only done once?
@@ -143,10 +152,6 @@ openerp.web.list_editable = function (instance) {
e.preventDefault();
self.cancel_edition();
});
this.editor.destroy();
// Editor is not restartable due to formview not being
// restartable
this.editor = this.make_editor();
var editor_ready = this.editor.prependTo(this.$el)
.done(this.proxy('setup_events'));
@@ -795,7 +800,7 @@ openerp.web.list_editable = function (instance) {
});
instance.web.ListView.Groups.include(/** @lends instance.web.ListView.Groups# */{
passtrough_events: instance.web.ListView.Groups.prototype.passtrough_events + " edit saved",
passthrough_events: instance.web.ListView.Groups.prototype.passthrough_events + " edit saved",
get_row_for: function (record) {
return _(this.children).chain()
.invoke('get_row_for', record)
+71 -17
View File
@@ -190,6 +190,18 @@ instance.web.ActionManager = instance.web.Widget.extend({
});
state = _.extend(params || {}, state);
}
if (this.inner_action.context) {
var active_id = this.inner_action.context.active_id;
if (active_id) {
state["active_id"] = active_id;
}
var active_ids = this.inner_action.context.active_ids;
if (active_ids && !(active_ids.length === 1 && active_ids[0] === active_id)) {
// We don't push active_ids if it's a single element array containing the active_id
// This makes the url shorter in most cases.
state["active_ids"] = this.inner_action.context.active_ids.join(',');
}
}
}
if(!this.dialog) {
this.getParent().do_push_state(state);
@@ -212,8 +224,22 @@ instance.web.ActionManager = instance.web.Widget.extend({
} else {
var run_action = (!this.inner_widget || !this.inner_widget.action) || this.inner_widget.action.id !== state.action;
if (run_action) {
var add_context = {};
if (state.active_id) {
add_context.active_id = state.active_id;
}
if (state.active_ids) {
// The jQuery BBQ plugin does some parsing on values that are valid integers.
// It means that if there's only one item, it will do parseInt() on it,
// otherwise it will keep the comma seperated list as string.
add_context.active_ids = state.active_ids.toString().split(',').map(function(id) {
return parseInt(id, 10) || id;
});
} else if (state.active_id) {
add_context.active_ids = [state.active_id];
}
this.null_action();
action_loaded = this.do_action(state.action);
action_loaded = this.do_action(state.action, { additional_context: add_context });
$.when(action_loaded || null).done(function() {
instance.webclient.menu.has_been_loaded.done(function() {
if (self.inner_action && self.inner_action.id) {
@@ -249,12 +275,25 @@ instance.web.ActionManager = instance.web.Widget.extend({
}
});
},
/**
* Execute an OpenERP action
*
* @param {Number|String|Object} Can be either an action id, a client action or an action descriptor.
* @param {Object} [options]
* @param {Boolean} [options.clear_breadcrumbs=false] Clear the breadcrumbs history list
* @param {Function} [options.on_reverse_breadcrumb] Callback to be executed whenever an anterior breadcrumb item is clicked on.
* @param {Function} [options.on_close] Callback to be executed when the dialog is closed (only relevant for target=new actions)
* @param {Function} [options.action_menu_id] Manually set the menu id on the fly.
* @param {Object} [options.additional_context] Additional context to be merged with the action's context.
* @return {jQuery.Deferred} Action loaded
*/
do_action: function(action, options) {
options = _.defaults(options || {}, {
clear_breadcrumbs: false,
on_reverse_breadcrumb: function() {},
on_close: function() {},
action_menu_id: null,
additional_context: {},
});
if (action === false) {
action = { type: 'ir.actions.act_window_close' };
@@ -269,9 +308,13 @@ instance.web.ActionManager = instance.web.Widget.extend({
}
// Ensure context & domain are evaluated and can be manipulated/used
if (action.context) {
action.context = instance.web.pyeval.eval(
'context', action.context);
var ncontext = new instance.web.CompoundContext(options.additional_context, action.context || {});
action.context = instance.web.pyeval.eval('context', ncontext);
if (action.context.active_id || action.context.active_ids) {
// Here we assume that when an `active_id` or `active_ids` is used
// in the context, we are in a `related` action, so we disable the
// searchview's default custom filters.
action.context.search_disable_custom_filters = true;
}
if (action.domain) {
action.domain = instance.web.pyeval.eval(
@@ -539,7 +582,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
_.each(_.keys(self.views), function(view_name) {
var controller = self.views[view_name].controller;
if (controller) {
var container = self.$el.find(".oe_view_manager_view_" + view_name + ":first");
var container = self.$el.find("> .oe_view_manager_body > .oe_view_manager_view_" + view_name);
if (view_name === view_type) {
container.show();
controller.do_show(view_options || {});
@@ -582,7 +625,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
controller.on('switch_mode', self, this.switch_mode);
controller.on('previous_view', self, this.prev_view);
var container = this.$el.find(".oe_view_manager_view_" + view_type);
var container = this.$el.find("> .oe_view_manager_body > .oe_view_manager_view_" + view_type);
var view_promise = controller.appendTo(container);
this.views[view_type].controller = controller;
this.views[view_type].deferred.resolve(view_type);
@@ -597,6 +640,12 @@ instance.web.ViewManager = instance.web.Widget.extend({
self.trigger("controller_inited",view_type,controller);
});
},
/**
* @returns {Number|Boolean} the view id of the given type, false if not found
*/
get_view_id: function(view_type) {
return this.views[view_type] && this.views[view_type].view_id || false;
},
set_title: function(title) {
this.$el.find('.oe_view_title_text:first').text(title);
},
@@ -953,10 +1002,11 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
});
},
do_create_view: function(view_type) {
var r = this._super.apply(this, arguments);
var view = this.views[view_type].controller;
view.set({ 'title': this.action.name });
return r;
var self = this;
return this._super.apply(this, arguments).then(function() {
var view = self.views[view_type].controller;
view.set({ 'title': self.action.name });
});
},
get_action_manager: function() {
var cur = this;
@@ -1270,11 +1320,6 @@ instance.web.View = instance.web.Widget.extend({
active_ids: [record_id],
active_model: dataset.model
});
if (("" + action.context).match(/\bactive_id\b/)) {
// Special case: when the context is evaluted using
// the active_id, we want to disable the custom filters.
ncontext.add({ search_disable_custom_filters: true });
}
}
ncontext.add(action.context || {});
action.context = ncontext;
@@ -1502,13 +1547,22 @@ instance.web.json_node_to_xml = function(node, human_readable, indent) {
}
};
instance.web.xml_to_str = function(node) {
var str = "";
if (window.XMLSerializer) {
return (new XMLSerializer()).serializeToString(node);
str = (new XMLSerializer()).serializeToString(node);
} else if (window.ActiveXObject) {
return node.xml;
str = node.xml;
} else {
throw new Error(_t("Could not serialize XML"));
}
// Browsers won't deal with self closing tags except br, hr, input, ...
// http://stackoverflow.com/questions/97522/what-are-all-the-valid-self-closing-elements-in-xhtml-as-implemented-by-the-maj
//
// The following regex is a bit naive but it's ok for the xmlserializer output
str = str.replace(/<([a-z]+)([^<>]*)\s*\/\s*>/g, function(match, tag, attrs) {
return "<" + tag + attrs + "></" + tag + ">";
});
return str;
};
/**
+11 -6
View File
@@ -119,7 +119,7 @@
</tr>
<tr>
<td><label for="db_name">New database name:</label></td>
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z][a-zA-Z0-9_-]+$" autofocus="true"/></td>
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z0-9][a-zA-Z0-9_-]+$" autofocus="true"/></td>
</tr>
<tr>
<td><label for="demo_data">Load Demonstration data:</label></td>
@@ -403,8 +403,9 @@
<img class="oe_topbar_avatar" t-att-data-default-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
<span class="oe_topbar_name"/>
<ul class="oe_dropdown_menu">
<li><a href="#" data-menu="about">About OpenERP</a></li>
<li><a href="#" data-menu="settings">Preferences</a></li>
<li><a href="#" data-menu="about">About OpenERP</a></li>
<li><a href="#" data-menu="help">Help</a></li>
<li><a href="#" data-menu="logout">Log out</a></li>
</ul>
</span>
@@ -1265,8 +1266,9 @@
</t>
<t t-name="FieldBinaryFileUploader.files">
<div class="oe_attachments">
<t t-if="widget.get('value')">
<t t-if="!widget.get('effective_readonly')" t-foreach="widget.get('value')" t-as="file">
<t t-if="!widget.get('effective_readonly')">
<t t-foreach="widget.get('value')" t-as="id">
<t t-set="file" t-value="widget.data[id]"/>
<div class="oe_attachment">
<span t-if="(file.upload or file.percent_loaded&lt;100)" t-attf-title="{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}" t-attf-name="{file.name || file.filename}">
<span class="oe_fileuploader_in_process">...Upload in progress...</span>
@@ -1280,7 +1282,10 @@
</t>
</div>
</t>
<t t-if="widget.get('effective_readonly')" t-foreach="widget.get('value')" t-as="file">
</t>
<t t-if="widget.get('effective_readonly')">
<t t-foreach="widget.get('value')" t-as="id">
<t t-set="file" t-value="widget.data[id]"/>
<div>
<a t-att-href="file.url" t-attf-title="{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}">
<t t-raw="file.name || file.filename"/>
@@ -1299,7 +1304,7 @@
<span class='oe_attach_label'>File</span>
<t t-call="HiddenInputFile">
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
<t t-set="fileupload_action">/web/binary/upload_attachment</t>
<t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
<input type="hidden" name="model" t-att-value="widget.view.model"/>
<input type="hidden" name="id" value="0"/>
<input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
+91 -2
View File
@@ -318,6 +318,28 @@ openerp.testing.section('defaults', {
"facet value should match provided default's selection");
});
});
test("M2O default: value array", {asserts: 2}, function (instance, $s, mock) {
var view = {inputs: []}, id = 5;
var f = new instance.web.search.ManyToOneField(
{attrs: {name: 'dummy', string: 'Dummy'}},
{relation: 'dummy.model.name'},
view);
mock('dummy.model.name:name_get', function (args) {
equal(args[0], id);
return [[id, "DumDumDum"]];
});
return f.facet_for_defaults({dummy: [id]})
.done(function (facet) {
var model = facet;
if (!(model instanceof instance.web.search.Facet)) {
model = new instance.web.search.Facet(facet);
}
deepEqual(
model.values.toJSON(),
[{label: "DumDumDum", value: id}],
"should support default as a singleton");
});
});
test("M2O default: value", {asserts: 1}, function (instance, $s, mock) {
var view = {inputs: []}, id = 4;
var f = new instance.web.search.ManyToOneField(
@@ -330,6 +352,15 @@ openerp.testing.section('defaults', {
ok(!facet, "an invalid m2o default should yield a non-facet");
});
});
test("M2O default: values", {rpc: false}, function (instance) {
var view = {inputs: []};
var f = new instance.web.search.ManyToOneField(
{attrs: {name: 'dummy', string: 'Dummy'}},
{relation: 'dummy.model.name'},
view);
raises(function () { f.facet_for_defaults({dummy: [6, 7]}) },
"should not accept multiple default values");
})
});
openerp.testing.section('completions', {
dependencies: ['web.search'],
@@ -526,7 +557,7 @@ openerp.testing.section('completions', {
return [[42, "choice 1"], [43, "choice @"]];
});
var view = {inputs: []};
var view = {inputs: [], dataset: {get_context: function () {}}};
var f = new instance.web.search.ManyToOneField(
{attrs: {string: 'Dummy'}}, {relation: 'dummy.model'}, view);
return f.complete("bob")
@@ -555,7 +586,7 @@ openerp.testing.section('completions', {
strictEqual(kwargs.name, 'bob');
return [];
});
var view = {inputs: []};
var view = {inputs: [], dataset: {get_context: function () {}}};
var f = new instance.web.search.ManyToOneField(
{attrs: {string: 'Dummy'}}, {relation: 'dummy.model'}, view);
return f.complete("bob")
@@ -563,6 +594,26 @@ openerp.testing.section('completions', {
ok(!c, "no match should yield no completion");
});
});
test("M2O filtered", {asserts: 2}, function (instance, $s, mock) {
mock('dummy.model:name_search', function (args, kwargs) {
deepEqual(args, [], "should have no positional arguments");
deepEqual(kwargs, {
name: 'bob',
limit: 8,
args: [['foo', '=', 'bar']],
context: {flag: 1},
}, "should use filtering domain");
return [[42, "Match"]];
});
var view = {
inputs: [],
dataset: {get_context: function () { return {flag: 1}; }}
};
var f = new instance.web.search.ManyToOneField(
{attrs: {string: 'Dummy', domain: '[["foo", "=", "bar"]]'}},
{relation: 'dummy.model'}, view);
return f.complete("bob");
});
});
openerp.testing.section('search-serialization', {
dependencies: ['web.search'],
@@ -1038,6 +1089,44 @@ openerp.testing.section('saved_filters', {
"should not be checked anymore");
});
});
test('toggling', {asserts: 2}, function (instance, $fix, mock) {
var view = makeSearchView(instance);
mock('ir.filters:get_filters', function () {
return [{name: 'filter name', user_id: 42, id: 1}];
});
return view.appendTo($fix)
.done(function () {
var $row = $fix.find('.oe_searchview_custom li:first').click();
equal(view.query.length, 1, "should have one facet");
$row.click();
equal(view.query.length, 0, "should have removed facet");
});
});
test('replacement', {asserts: 4}, function (instance, $fix, mock) {
var view = makeSearchView(instance);
mock('ir.filters:get_filters', function () {
return [
{name: 'f', user_id: 42, id: 1, context: {'private': 1}},
{name: 'f', user_id: false, id: 2, context: {'private': 0}}
];
});
return view.appendTo($fix)
.done(function () {
$fix.find('.oe_searchview_custom li:eq(0)').click();
equal(view.query.length, 1, "should have one facet");
deepEqual(
view.query.at(0).get('field').get_context(),
{'private': 1},
"should have selected first filter");
$fix.find('.oe_searchview_custom li:eq(1)').click();
equal(view.query.length, 1, "should have one facet");
deepEqual(
view.query.at(0).get('field').get_context(),
{'private': 0},
"should have selected second filter");
});
});
});
openerp.testing.section('advanced', {
dependencies: ['web.search'],
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
"X-Poedit-Language: Czech\n"
#. module: web_calendar
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
"Language: es\n"
#. module: web_calendar
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:08+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-01-30 04:46+0000\n"
"X-Generator: Launchpad (build 16455)\n"
"X-Launchpad-Export-Date: 2013-02-07 05:09+0000\n"
"X-Generator: Launchpad (build 16477)\n"
#. module: web_calendar
#. openerp-web

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