[MERGE]with main branch
bzr revid: jpr@tinyerp.com-20140319051226-05pee6q8ih606s1i
This commit is contained in:
Vendored
+1
@@ -16,6 +16,7 @@ Depends:
|
||||
python,
|
||||
postgresql-client,
|
||||
python-dateutil,
|
||||
python-decorator,
|
||||
python-docutils,
|
||||
python-feedparser,
|
||||
python-gdata,
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#! /usr/bin/env python2
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
if sys.argv[1] == 'run-tests':
|
||||
sys.exit(0)
|
||||
import openerpcommand.main
|
||||
openerpcommand.main.run()
|
||||
|
||||
@@ -40,6 +40,8 @@ conf['addons_path'] = '../../addons/trunk,../../web/trunk/addons'
|
||||
#----------------------------------------------------------
|
||||
application = openerp.service.wsgi_server.application
|
||||
|
||||
openerp.service.server.load_server_wide_modules()
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Gunicorn
|
||||
#----------------------------------------------------------
|
||||
|
||||
@@ -24,7 +24,6 @@ import workflow
|
||||
import module
|
||||
import res
|
||||
import report
|
||||
import test
|
||||
import tests
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: base
|
||||
@@ -64,7 +64,7 @@ msgstr "Zobrazení architektury"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_sale_stock
|
||||
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
|
||||
msgstr "Nabídky, zakázky, řízení dopravy a fakturace"
|
||||
msgstr "Nabídky, zakázky, řízení dodávek a fakturace"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.sequence,implementation:0
|
||||
@@ -87,8 +87,7 @@ msgid ""
|
||||
"Helps you manage your projects and tasks by tracking them, generating "
|
||||
"plannings, etc..."
|
||||
msgstr ""
|
||||
"Pomůže vám spravovat projekty a úkoly jejich sledováním, generováním plánů, "
|
||||
"apod."
|
||||
"Pomůže vám řídit projekty a úkoly jejich sledováním, generováním plánů, aj."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_point_of_sale
|
||||
@@ -158,7 +157,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: help:res.partner,employee:0
|
||||
msgid "Check this box if this contact is an Employee."
|
||||
msgstr "Zaškrtněte toto pole, pokud je kontakt zaměstnanec."
|
||||
msgstr "Zaškrtněte toto pole, pokud je kontakt zaměstnancem."
|
||||
|
||||
#. module: base
|
||||
#: help:ir.model.fields,domain:0
|
||||
@@ -11056,7 +11055,7 @@ msgstr "Úkoly"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_product_visible_discount
|
||||
msgid "Prices Visible Discounts"
|
||||
msgstr ""
|
||||
msgstr "Zobrazení slevy u ceny"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.attachment,datas:0
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
"X-Poedit-Country: GREECE\n"
|
||||
"X-Poedit-Language: Greek\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
"Language: \n"
|
||||
|
||||
#. module: base
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -9,8 +9,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
||||
"X-Poedit-Language: Persian\n"
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -25,7 +25,7 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Moduuli Šekkien kirjoittamisen ja tulostamiseen.\n"
|
||||
"Moduuli Shekkien kirjoittamisen ja tulostamiseen.\n"
|
||||
"===========================================\n"
|
||||
" "
|
||||
|
||||
@@ -129,7 +129,7 @@ msgstr ""
|
||||
"Moduuli joka lisää valmistajat ja ominaisuudet tuotelomakkeelle.\n"
|
||||
"=========================================================\n"
|
||||
"\n"
|
||||
"Voit net määritellä tuotteelle seuraavat tiedot:\n"
|
||||
"Voit nyt määritellä tuotteelle seuraavat tiedot:\n"
|
||||
"---------------------------------------------------------\n"
|
||||
" * Valmistaja\n"
|
||||
" * Valmistajan tuotenimi\n"
|
||||
@@ -405,6 +405,13 @@ msgid ""
|
||||
"invoices from picking, OpenERP is able to add and compute the shipping "
|
||||
"line.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Sallii toimitustapojen lisäämisen myyntitilauksille ja keräilyyn. \n"
|
||||
"==============================================================\n"
|
||||
"\n"
|
||||
"Voit määritellä oman huolitsijan ja toimitustaulukon hinnoille. Kun laskut "
|
||||
"luodaan \n"
|
||||
"keräilyssä, OpenERP lisää lähetysrivit ja laskee nille hinnat.\n"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_filters.py:80
|
||||
@@ -550,7 +557,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:workflow.transition:0
|
||||
msgid "Workflow Transition"
|
||||
msgstr ""
|
||||
msgstr "Työnkulun eteneminen"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.gf
|
||||
@@ -599,6 +606,20 @@ msgid ""
|
||||
"* Use emails to automatically confirm and send acknowledgements for any "
|
||||
"event registration\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Tapahtumien organisointi ja hallinta.\n"
|
||||
"====================================\n"
|
||||
"\n"
|
||||
"Tapahtumamoduuli mahdollistaa tehokkaan tapahtumien organisoinnin ja niihin "
|
||||
"liittyvien \n"
|
||||
"töiden hallinnan: suunnittelun, rekisteröintien seurannan, osallistumisen "
|
||||
"jne. \n"
|
||||
"\n"
|
||||
"Pääominaisuudet\n"
|
||||
"------------\n"
|
||||
"* Hallitse tapahtumia ja rekisteröintejä\n"
|
||||
"* Käytä sähköpostia automatisoimaan vahvistuksia ja lähettämään kuittaus "
|
||||
"jokaisesta rekisteröitymisestä.\n"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -688,7 +709,7 @@ msgstr "Palau"
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
msgid "Sales & Purchases"
|
||||
msgstr "Myynti ja hankinta"
|
||||
msgstr "Myynnit & Ostot"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.translation:0
|
||||
@@ -1616,6 +1637,11 @@ msgid ""
|
||||
"=============\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Tämä moduuli lisää palautevalikon ja toimii jos Palauteportaali on "
|
||||
"asennettu. \n"
|
||||
"=======================================================================\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,help:base.action_res_partner_bank_account_form
|
||||
@@ -1815,7 +1841,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_project_issue
|
||||
msgid "Portal Issue"
|
||||
msgstr "Porttaaliongelma"
|
||||
msgstr "Portaaliongelma"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_tools
|
||||
@@ -1950,7 +1976,7 @@ msgstr "Alankomaat"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_event
|
||||
msgid "Portal Event"
|
||||
msgstr "Porttaalitapahtuma"
|
||||
msgstr "Portaalitapahtuma"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.translation,state:0
|
||||
@@ -3836,7 +3862,7 @@ msgstr "Raportointi"
|
||||
#: field:res.partner,title:0
|
||||
#: field:res.partner.title,name:0
|
||||
msgid "Title"
|
||||
msgstr "Yhtiömuoto"
|
||||
msgstr "Titteli"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.property,res_id:0
|
||||
@@ -6164,7 +6190,7 @@ msgstr "Ryhmän nimi ei voi alkaa \"-\""
|
||||
#: view:ir.module.module:0
|
||||
#: model:ir.ui.menu,name:base.module_mi
|
||||
msgid "Apps"
|
||||
msgstr "Sovellukset"
|
||||
msgstr "Sovelluskauppa"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.ui.view_sc:0
|
||||
@@ -7726,7 +7752,7 @@ msgstr "Tämä ikkuna"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_anonymous
|
||||
msgid "Anonymous portal"
|
||||
msgstr "Yleinen porttaali"
|
||||
msgstr "Anonyymiportaali"
|
||||
|
||||
#. module: base
|
||||
#: field:base.language.export,format:0
|
||||
@@ -7784,7 +7810,7 @@ msgstr "Salasana"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_claim
|
||||
msgid "Portal Claim"
|
||||
msgstr "Reklmaatioporttaali"
|
||||
msgstr "Palauteportaali"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_pe
|
||||
@@ -7837,7 +7863,7 @@ msgstr "RML sisäinen ylätunniste"
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,search_view_id:0
|
||||
msgid "Search View Ref."
|
||||
msgstr "Hae näytettävä viite"
|
||||
msgstr "Hae näytettävä referenssi"
|
||||
|
||||
#. module: base
|
||||
#: help:res.users,partner_id:0
|
||||
@@ -8029,7 +8055,7 @@ msgstr "Liike- ja analyyttinen kirjanpito"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_project
|
||||
msgid "Portal Project"
|
||||
msgstr "Porttaaliprojekti"
|
||||
msgstr "Portaaliprojekti"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.cc
|
||||
@@ -8538,7 +8564,7 @@ msgstr "Hongkong"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_sale
|
||||
msgid "Portal Sale"
|
||||
msgstr "Myyntiporttaali"
|
||||
msgstr "Myyntiportaali"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.default,ref_id:0
|
||||
@@ -8662,7 +8688,7 @@ msgstr "Alavalikot"
|
||||
#. module: base
|
||||
#: report:ir.module.reference:0
|
||||
msgid "Introspection report on objects"
|
||||
msgstr "Introspektioraportti objekteista"
|
||||
msgstr "Moduulin tekninen opas"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_analytics
|
||||
@@ -8814,7 +8840,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_view_base_module_update
|
||||
msgid "Update Modules List"
|
||||
msgstr "Päivitä lista moduuleista"
|
||||
msgstr "Päivitä moduulilista"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/module/module.py:359
|
||||
@@ -10021,7 +10047,7 @@ msgstr "Kenttien kuvaukset"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_analytic_contract_hr_expense
|
||||
msgid "Contracts Management: hr_expense link"
|
||||
msgstr "Sopimushallint: hr_expense link"
|
||||
msgstr "Sopimushallinat: hr_expense link"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.attachment:0
|
||||
@@ -10138,7 +10164,7 @@ msgstr ""
|
||||
#: view:res.groups:0
|
||||
#: field:res.partner,comment:0
|
||||
msgid "Notes"
|
||||
msgstr "Huomautukset"
|
||||
msgstr "Muistiinpanot"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.config_parameter,value:0
|
||||
@@ -10283,7 +10309,7 @@ msgstr "Väliyksikkö"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_stock
|
||||
msgid "Portal Stock"
|
||||
msgstr "Porttaalivarasto"
|
||||
msgstr "Portaalivarasto"
|
||||
|
||||
#. module: base
|
||||
#: field:workflow.activity,kind:0
|
||||
@@ -10351,7 +10377,7 @@ msgstr "Kohdetietueen ID tietokannassa"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_analytic_analysis
|
||||
msgid "Contracts Management"
|
||||
msgstr "Sopimustenhallinta"
|
||||
msgstr "Sopimushallinta"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -10455,7 +10481,7 @@ msgstr "Moniyritys"
|
||||
#: model:ir.module.category,name:base.module_category_portal
|
||||
#: model:ir.module.module,shortdesc:base.module_portal
|
||||
msgid "Portal"
|
||||
msgstr "Porttaali"
|
||||
msgstr "Portaali"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.translation,state:0
|
||||
@@ -10656,7 +10682,7 @@ msgstr "Tehtävät"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_hr_employees
|
||||
msgid "Portal HR employees"
|
||||
msgstr "Henkilöstöhallinnon työntekijäporttaali"
|
||||
msgstr "Henkilöstöhallinnon työntekijäportaali"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -12137,7 +12163,7 @@ msgstr "Menetelmälle välitettävät argumentit, esim. (uid,...)."
|
||||
#. module: base
|
||||
#: report:ir.module.reference:0
|
||||
msgid "Reference Guide"
|
||||
msgstr "Referenssiopaste"
|
||||
msgstr "Tekninen opas"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_res_partner
|
||||
@@ -12595,7 +12621,7 @@ msgstr "Malediivit"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_crm
|
||||
msgid "Portal CRM"
|
||||
msgstr "CRM-porttaali"
|
||||
msgstr "CRM-portaali"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.next_id_4
|
||||
@@ -13158,7 +13184,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:res.company,company_registry:0
|
||||
msgid "Company Registry"
|
||||
msgstr "Yritysrekisteri"
|
||||
msgstr "Y-tunnus"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.report.xml:0
|
||||
@@ -13471,7 +13497,7 @@ msgstr "Riippuvuudet:"
|
||||
#. module: base
|
||||
#: field:res.company,vat:0
|
||||
msgid "Tax ID"
|
||||
msgstr "Vero ID"
|
||||
msgstr "VAT-numero"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_bank_statement_extensions
|
||||
@@ -13821,7 +13847,7 @@ msgstr "Marokko - Kirjanpito"
|
||||
#: field:res.bank,bic:0
|
||||
#: field:res.partner.bank,bank_bic:0
|
||||
msgid "Bank Identifier Code"
|
||||
msgstr "BIC koodi"
|
||||
msgstr "BIC-koodi"
|
||||
|
||||
#. module: base
|
||||
#: view:base.language.export:0
|
||||
@@ -14878,7 +14904,7 @@ msgstr "Bulgaria / български език"
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_aftersale
|
||||
msgid "After-Sale Services"
|
||||
msgstr "Jälkimarkkinapalvelut"
|
||||
msgstr "Asiakaspalvelut"
|
||||
|
||||
#. module: base
|
||||
#: field:base.language.import,code:0
|
||||
@@ -15482,7 +15508,7 @@ msgstr "Matkapuhelinnumero"
|
||||
#: model:ir.model,name:base.model_res_partner_category
|
||||
#: view:res.partner.category:0
|
||||
msgid "Partner Categories"
|
||||
msgstr "Kumppanien ryhmät"
|
||||
msgstr "Kumppaniryhmät"
|
||||
|
||||
#. module: base
|
||||
#: view:base.module.upgrade:0
|
||||
@@ -15623,7 +15649,7 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,name:base.open_module_tree
|
||||
#: model:ir.ui.menu,name:base.menu_module_tree
|
||||
msgid "Installed Modules"
|
||||
msgstr "Asennetut moduulit"
|
||||
msgstr "Asenna moduulit"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/res/res_users.py:170
|
||||
@@ -15690,7 +15716,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
msgid "Internal Notes"
|
||||
msgstr "Sisäiset huomautukset"
|
||||
msgstr "Sisäiset muistiinpanot"
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.title,name:base.res_partner_title_pvt_ltd
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
"Language: hr\n"
|
||||
|
||||
#. module: base
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -9,8 +9,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -211,6 +211,15 @@ msgid ""
|
||||
"revenue\n"
|
||||
"reports."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Bentuk tagihan anda dari entri Expenses, Timesheet.\n"
|
||||
"========================================================\n"
|
||||
"\n"
|
||||
"Modul untuk menerbitkan tagihan berbasis biaya (sdm, biaya, dsb).\n"
|
||||
"\n"
|
||||
"Anda dapat mendefinisikan daftar harga pada akun analitik, membuat laporan "
|
||||
"anggaran \n"
|
||||
"penghasilan."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_sequence.py:134
|
||||
@@ -299,6 +308,12 @@ msgid ""
|
||||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Lokalisasi skema akunting dan pajak Chili.\n"
|
||||
"==============================================\n"
|
||||
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale
|
||||
@@ -398,6 +413,15 @@ msgid ""
|
||||
"invoices from picking, OpenERP is able to add and compute the shipping "
|
||||
"line.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Mengizinkan anda untuk menambahkan metode deliveri pada order penjualan dan "
|
||||
"pengambilan.\n"
|
||||
"==============================================================\n"
|
||||
"\n"
|
||||
"Anda dapat menentukan carrier sendiri dan metode antar untuk harga tersebut. "
|
||||
"Saat membuat\n"
|
||||
"tagihan dari pengantaran, OpenERP dapat menambah dan menghitung biaya "
|
||||
"pengiriman.\n"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_filters.py:80
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -411,7 +411,7 @@ msgstr "与信限度"
|
||||
#: field:ir.model.data,date_update:0
|
||||
#: field:ir.model.relation,date_update:0
|
||||
msgid "Update Date"
|
||||
msgstr "日付の更新"
|
||||
msgstr "更新日"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_base_action_rule
|
||||
@@ -2295,7 +2295,7 @@ msgstr "メソッド"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_auth_crypt
|
||||
msgid "Password Encryption"
|
||||
msgstr ""
|
||||
msgstr "パスワード暗号化"
|
||||
|
||||
#. module: base
|
||||
#: view:workflow.activity:0
|
||||
@@ -3262,7 +3262,7 @@ msgstr "アルメニア"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_hr_evaluation
|
||||
msgid "Periodical Evaluations, Appraisals, Surveys"
|
||||
msgstr ""
|
||||
msgstr "定期評価、査定、調査"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.ir_property_form
|
||||
@@ -4582,7 +4582,7 @@ msgstr "スペイン語(ホンジュラス)/ Español (HN)"
|
||||
#. module: base
|
||||
#: view:ir.sequence.type:0
|
||||
msgid "Sequence Type"
|
||||
msgstr "順序タイプ"
|
||||
msgstr "付番タイプ"
|
||||
|
||||
#. module: base
|
||||
#: view:base.language.export:0
|
||||
@@ -5141,7 +5141,7 @@ msgstr "銀行口座タイプ"
|
||||
#. module: base
|
||||
#: help:ir.sequence,suffix:0
|
||||
msgid "Suffix value of the record for the sequence"
|
||||
msgstr "順序のためのレコードのサフィックス値"
|
||||
msgstr "この付番定義でレコードに適用するサフィックス値"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.mail_server,smtp_user:0
|
||||
@@ -5588,7 +5588,7 @@ msgstr "起動設定ウィザード"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_mrp
|
||||
msgid "Manufacturing Orders, Bill of Materials, Routing"
|
||||
msgstr ""
|
||||
msgstr "製造オーダ、部品表、工順"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.attachment,name:0
|
||||
@@ -6140,7 +6140,7 @@ msgstr "ショートカット"
|
||||
#. module: base
|
||||
#: field:ir.model.data,date_init:0
|
||||
msgid "Init Date"
|
||||
msgstr "整数データ"
|
||||
msgstr "作成日"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -7630,7 +7630,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: help:ir.sequence,number_next:0
|
||||
msgid "Next number of this sequence"
|
||||
msgstr "この順序の次の番号"
|
||||
msgstr "この付番定義の次の番号"
|
||||
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
@@ -7954,7 +7954,7 @@ msgstr "カスタム項目"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_account_accountant
|
||||
msgid "Financial and Analytic Accounting"
|
||||
msgstr ""
|
||||
msgstr "財務会計、分析会計"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_portal_project
|
||||
@@ -8016,6 +8016,12 @@ msgid ""
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" クリックしてアドレス帳に連絡先を追加してください。\n"
|
||||
" </p><p>\n"
|
||||
" OpenERPは顧客、ディスカッション、商機の履歴、文書など関連するすべての活動の追跡を容易にします。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.bank_account_update
|
||||
@@ -8242,7 +8248,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_hr_recruitment
|
||||
msgid "Jobs, Recruitment, Applications, Job Interviews"
|
||||
msgstr ""
|
||||
msgstr "仕事、求人、応募、面接"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/module/module.py:539
|
||||
@@ -8651,7 +8657,7 @@ msgstr "グループのユーザは自動的にグループを継承します。
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_note
|
||||
msgid "Sticky notes, Collaborative, Memos"
|
||||
msgstr ""
|
||||
msgstr "付箋、コラボレーション、メモ"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_hr_attendance
|
||||
@@ -9789,7 +9795,7 @@ msgstr "ドイツ"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_auth_oauth
|
||||
msgid "OAuth2 Authentication"
|
||||
msgstr ""
|
||||
msgstr "OAuth2認証"
|
||||
|
||||
#. module: base
|
||||
#: view:workflow:0
|
||||
@@ -9985,7 +9991,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_hr_holidays
|
||||
msgid "Holidays, Allocation and Leave Requests"
|
||||
msgstr ""
|
||||
msgstr "休暇割当、申請・承認"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_web_hello
|
||||
@@ -10032,6 +10038,12 @@ msgid ""
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" クリックしてアドレス帳に連絡先を追加してください。\n"
|
||||
" </p><p>\n"
|
||||
" OpenERPは仕入先、ディスカッション、購入の履歴、文書など関連するすべての活動の追跡を容易にします。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.lr
|
||||
@@ -10123,7 +10135,7 @@ msgstr "発注分析計画"
|
||||
#: model:ir.actions.act_window,name:base.ir_sequence_type
|
||||
#: model:ir.ui.menu,name:base.menu_ir_sequence_type
|
||||
msgid "Sequence Codes"
|
||||
msgstr "順序コード"
|
||||
msgstr "付番コード"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -10778,7 +10790,7 @@ msgstr "国の状態"
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.next_id_5
|
||||
msgid "Sequences & Identifiers"
|
||||
msgstr "順序と識別子"
|
||||
msgstr "付番定義とID"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_l10n_th
|
||||
@@ -10913,7 +10925,7 @@ msgstr "連絡先が会社の場合はチェックしてください。チェッ
|
||||
#. module: base
|
||||
#: view:ir.sequence.type:0
|
||||
msgid "Sequences Type"
|
||||
msgstr "順序タイプ"
|
||||
msgstr "付番タイプ"
|
||||
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
@@ -11270,7 +11282,7 @@ msgstr ""
|
||||
#: view:ir.sequence:0
|
||||
#: model:ir.ui.menu,name:base.menu_ir_sequence_form
|
||||
msgid "Sequences"
|
||||
msgstr "順序"
|
||||
msgstr "付番"
|
||||
|
||||
#. module: base
|
||||
#: help:res.lang,code:0
|
||||
@@ -11712,7 +11724,7 @@ msgstr "月:%(month)s"
|
||||
#: field:multi_company.default,sequence:0
|
||||
#: field:res.partner.bank,sequence:0
|
||||
msgid "Sequence"
|
||||
msgstr "順序"
|
||||
msgstr "付番"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tn
|
||||
@@ -12178,7 +12190,7 @@ msgstr "ハード島とマクドナルド諸島"
|
||||
msgid ""
|
||||
"External Key/Identifier that can be used for data integration with third-"
|
||||
"party systems"
|
||||
msgstr "サードパーティのシステムとのデータ統合のために利用する外部キー / 識別子"
|
||||
msgstr "サードパーティシステムとのデータ統合のために利用する外部キー / ID"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,view_id:0
|
||||
@@ -12507,7 +12519,7 @@ msgstr "CRMポータル"
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.next_id_4
|
||||
msgid "Low Level Objects"
|
||||
msgstr "低レベルのオブジェクト"
|
||||
msgstr "低レベルオブジェクト"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.values,model:0
|
||||
@@ -12584,7 +12596,7 @@ msgstr ""
|
||||
#: view:ir.model.data:0
|
||||
#: model:ir.ui.menu,name:base.ir_model_data_menu
|
||||
msgid "External Identifiers"
|
||||
msgstr "外部識別子"
|
||||
msgstr "外部ID"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -12886,7 +12898,7 @@ msgstr "ガボン"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_stock
|
||||
msgid "Inventory, Logistic, Storage"
|
||||
msgstr ""
|
||||
msgstr "在庫、経路、保管場所"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.act_window:0
|
||||
@@ -13602,7 +13614,7 @@ msgstr ""
|
||||
#: view:ir.model.data:0
|
||||
#: field:ir.model.data,name:0
|
||||
msgid "External Identifier"
|
||||
msgstr "外部識別子"
|
||||
msgstr "外部ID"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_audittrail
|
||||
@@ -14036,9 +14048,7 @@ msgid ""
|
||||
"Two sequence object implementations are offered: Standard and 'No gap'. The "
|
||||
"later is slower than the former but forbids any gap in the sequence (while "
|
||||
"they are possible in the former)."
|
||||
msgstr ""
|
||||
"2つのシーケンスオブジェクトの実装が提供されます:標準と\"ギャップなし\"です。後者は前者よりも遅いですが、どんな順序のギャップを禁じます(前者は可能で"
|
||||
"す)。"
|
||||
msgstr "「標準」と「ギャップなし」の2種類の付番定義が可能です。後者の場合、付番ごとにギャップを設けることができません。"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.gn
|
||||
@@ -14237,7 +14247,7 @@ msgstr "かつ"
|
||||
#: help:ir.values,res_id:0
|
||||
msgid ""
|
||||
"Database identifier of the record to which this applies. 0 = for all records"
|
||||
msgstr "これを適用するためのレコードのデータベース識別子。0 = 全てのレコードのため"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: field:ir.model.fields,relation:0
|
||||
@@ -14664,7 +14674,7 @@ msgstr "高度なレポート"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_purchase
|
||||
msgid "Purchase Orders, Receptions, Supplier Invoices"
|
||||
msgstr ""
|
||||
msgstr "発注、入荷、仕入先請求"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_hr_payroll
|
||||
@@ -14891,7 +14901,7 @@ msgstr "クック諸島"
|
||||
#. module: base
|
||||
#: field:ir.model.data,noupdate:0
|
||||
msgid "Non Updatable"
|
||||
msgstr "更新可能でない"
|
||||
msgstr "更新不可"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -15299,7 +15309,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: help:ir.sequence,prefix:0
|
||||
msgid "Prefix value of the record for the sequence"
|
||||
msgstr "順序のためのレコードのプレフィックス値"
|
||||
msgstr "この付番定義でレコードに適用するプレフィックス値"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sc
|
||||
@@ -15341,7 +15351,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:ir.model.data,complete_name:0
|
||||
msgid "Complete ID"
|
||||
msgstr "完了ID"
|
||||
msgstr "完全ID"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_stock
|
||||
@@ -15435,7 +15445,7 @@ msgstr "製造プロセスを管理し、それらのプロセスのレポート
|
||||
#. module: base
|
||||
#: help:ir.sequence,number_increment:0
|
||||
msgid "The next number of the sequence will be incremented by this number"
|
||||
msgstr "順序の次の番号はこの数値だけ増加します。"
|
||||
msgstr "付番毎にこの数値分だけ番号が増加します。"
|
||||
|
||||
#. module: base
|
||||
#: selection:workflow.activity,kind:0
|
||||
@@ -15563,6 +15573,12 @@ msgid ""
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" クリックしてアドレス帳に連絡先を追加してください。\n"
|
||||
" </p><p>\n"
|
||||
" OpenERPは顧客、ディスカッション、商機の履歴、文書など関連するすべての活動の追跡を容易にします。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_2
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -16519,3 +16519,10 @@ msgstr ""
|
||||
#~ msgstr ""
|
||||
#~ "Nevar izveidot dokumentu (%s) ! Pārbaudiet, vai lietotājs pieder kādai no "
|
||||
#~ "šīm grupām: %s."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " "
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -3094,7 +3094,7 @@ msgstr "Моделийн Тойм"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_product_margin
|
||||
msgid "Margins by Products"
|
||||
msgstr "Захалбар Бараагаар"
|
||||
msgstr "Бохир ашиг Бараагаар"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_invoiced
|
||||
@@ -5214,7 +5214,7 @@ msgstr ""
|
||||
" * Дагавар\n"
|
||||
" * Дараагийн Дугаар\n"
|
||||
" * Нэмэгдэх Тоо\n"
|
||||
" * Гүйцээлтийн тоо\n"
|
||||
" * Дугаарлалтын гүйцээлт\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -7400,7 +7400,7 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Энэ модуль нь борлуулалтын захиалга дээр 'Тодотгол' нэмдэг.\n"
|
||||
"Энэ модуль нь борлуулалтын захиалга дээр 'Бохир ашиг' нэмдэг.\n"
|
||||
"=============================================\n"
|
||||
"\n"
|
||||
"Нэгж үнэ, Өртөг үнийг харьцуулан бохир ашгийг харуулдаг.\n"
|
||||
@@ -11017,7 +11017,7 @@ msgstr "Өөриймшүүлсэн"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_margin
|
||||
msgid "Margins in Sales Orders"
|
||||
msgstr "Борлуулалтын захиалгын зөрүү"
|
||||
msgstr "Борлуулалтын захиалгын бохир ашиг"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_purchase
|
||||
@@ -12353,7 +12353,7 @@ msgid ""
|
||||
"you need.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Бараанд борлуулалт, худалдан авалт, тохируулалт зэрэг олон сонирхолтой "
|
||||
"Бараанд борлуулалт, худалдан авалт, бохир ашиг зэрэг олон сонирхолтой "
|
||||
"үзүүлэлтийг тооцолох тайлангийн менюг нэмдэг.\n"
|
||||
"============================================================================="
|
||||
"================================================\n"
|
||||
@@ -13178,7 +13178,7 @@ msgstr "Гүйцэтгэх дараагийн огноо"
|
||||
#. module: base
|
||||
#: field:ir.sequence,padding:0
|
||||
msgid "Number Padding"
|
||||
msgstr "Тоон дугаарын гүйцээлт"
|
||||
msgstr "Дугаарын гүйцээлт"
|
||||
|
||||
#. module: base
|
||||
#: help:multi_company.default,field_id:0
|
||||
@@ -18268,9 +18268,6 @@ msgstr "Бүртгүүлэх"
|
||||
#~ msgid "View Ordering"
|
||||
#~ msgstr "Дэлгэц эрэмблэлт"
|
||||
|
||||
#~ msgid "Number padding"
|
||||
#~ msgstr "Тоон дугаарын урт"
|
||||
|
||||
#~ msgid "Object Identifiers"
|
||||
#~ msgstr "Обьект бүрдүүлбэр"
|
||||
|
||||
@@ -24131,3 +24128,6 @@ msgstr "Бүртгүүлэх"
|
||||
|
||||
#~ msgid "Retro-Planning on Events"
|
||||
#~ msgstr "Үйл явдлын хойноос урагшаа төлөвлөлт"
|
||||
|
||||
#~ msgid "Number padding"
|
||||
#~ msgstr "Тоон дугаарын гүйцээлт"
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -1625,7 +1625,7 @@ msgstr ""
|
||||
#: model:ir.module.category,name:base.module_category_purchase_management
|
||||
#: model:ir.ui.menu,name:base.menu_purchase_root
|
||||
msgid "Purchases"
|
||||
msgstr "Inkoop"
|
||||
msgstr "Inkopen"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.md
|
||||
@@ -13429,7 +13429,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: selection:res.currency,position:0
|
||||
msgid "Before Amount"
|
||||
msgstr "Voormalig bedrag"
|
||||
msgstr "Voor bedrag"
|
||||
|
||||
#. module: base
|
||||
#: field:res.request,act_from:0
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -431,7 +431,8 @@ msgstr ""
|
||||
"\n"
|
||||
"Va permite sa adaugati metode de livrare la comenzile de vanzare si "
|
||||
"ridicare.\n"
|
||||
"==============================================================\n"
|
||||
"============================================================================="
|
||||
"\n"
|
||||
"\n"
|
||||
"Va puteti defini propriile grile de preturi pentru transport si livrare. "
|
||||
"Atunci cand creati \n"
|
||||
@@ -617,7 +618,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Modul pentru definirea obiectului contabilitatii analitice.\n"
|
||||
"=========================================================\n"
|
||||
"===========================================================\n"
|
||||
"\n"
|
||||
"In OpenERP, conturile analitice sunt legate de conturile generale, dar sunt "
|
||||
"tratate\n"
|
||||
@@ -855,7 +856,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Contabilitate si Management Financiar.\n"
|
||||
"====================================\n"
|
||||
"======================================\n"
|
||||
"\n"
|
||||
"Modulul Finante si contabilitate acopera:\n"
|
||||
"--------------------------------------------\n"
|
||||
@@ -899,7 +900,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Meniul pentru Marketing.\n"
|
||||
"=======================\n"
|
||||
"========================\n"
|
||||
"\n"
|
||||
"Contine programul de instalare pentru modulele legate de marketing.\n"
|
||||
" "
|
||||
@@ -915,7 +916,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Modulul OpenERP Web LinkedIn.\n"
|
||||
"============================\n"
|
||||
"=============================\n"
|
||||
"Acest modul asigura Integrarea lui LinkedIn in OpenERP.\n"
|
||||
" "
|
||||
|
||||
@@ -1072,7 +1073,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Gestioneaza concediile si cererile de alocare\n"
|
||||
"=====================================\n"
|
||||
"=============================================\n"
|
||||
"\n"
|
||||
"Aceasta aplicatie controleaza programul de concedii al companiei "
|
||||
"dumneavoastra. Le permite angajatilor sa solicite concedii. Astfel, "
|
||||
@@ -1331,7 +1332,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Managementul general OpenERP al Relatiilor cu Clientii\n"
|
||||
" ====================================================\n"
|
||||
"======================================================\n"
|
||||
" \n"
|
||||
"Aceasta aplicatie permite unui grup de oameni sa gestioneze in mod "
|
||||
"inteligent si eficient piste, oportunitati, intalniri si apeluri "
|
||||
@@ -1356,7 +1357,7 @@ msgstr ""
|
||||
" \n"
|
||||
"\n"
|
||||
"Tabloul de bord pentru MRC va include:\n"
|
||||
" -------------------------------\n"
|
||||
"--------------------------------------\n"
|
||||
" * Veniturile Planificate dupa Etapa si Utilizator (grafic)\n"
|
||||
" * Oportunitati dupa Etapa (grafic)\n"
|
||||
|
||||
@@ -2011,7 +2012,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Modulul de baza pentru gestionarea pranzului.\n"
|
||||
"================================\n"
|
||||
"=============================================\n"
|
||||
"\n"
|
||||
"Multe companii comanda sandwich-uri, pizza si alte mancaruri de la "
|
||||
"furnizorii obisnuiti, pentru angajatii lor pentru a le oferi mai multe "
|
||||
@@ -2250,7 +2251,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Drepturi de acces contabile\n"
|
||||
"========================\n"
|
||||
"===========================\n"
|
||||
"Ii ofera utilizatorului Administrator acces la toate caracteristicile "
|
||||
"contabile, precum elemente ale jurnalului si planul de conturi.\n"
|
||||
"\n"
|
||||
@@ -2444,7 +2445,8 @@ msgstr ""
|
||||
"\n"
|
||||
"Sincronizarea inregistrarilor sarcinilor proiectului cu inregistrarile fisei "
|
||||
"de pontaj.\n"
|
||||
"====================================================================\n"
|
||||
"============================================================================="
|
||||
"==========\n"
|
||||
"\n"
|
||||
"Acest modul va permite sa transferati inregistrarile sub sarcini definite "
|
||||
"pentru Managementul\n"
|
||||
@@ -2778,7 +2780,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Inregistreaza si valideaza fisele de pontaj si prezenta cu usurinta\n"
|
||||
"=====================================================\n"
|
||||
"===================================================================\n"
|
||||
"\n"
|
||||
"Aceasta aplicatie ofera un ecran nou care va permite sa gestionati atat "
|
||||
"prezenta (La intrare/La iesire) cat si inregistrare muncii (fisa de pontaj) "
|
||||
@@ -2874,7 +2876,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Permite anonimilor sa Acceseze Portalul.\n"
|
||||
"=================================\n"
|
||||
"========================================\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -3021,7 +3023,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Managementul Serviciului de asistenta tehnica.\n"
|
||||
"===================================\n"
|
||||
"==============================================\n"
|
||||
"\n"
|
||||
"La fel ca si inregistrarea si prelucrarea reclamatiilor, Serviciul de "
|
||||
"Asistenta tehnica este un instrument\n"
|
||||
@@ -3095,7 +3097,8 @@ msgstr ""
|
||||
"\n"
|
||||
"Acesta este modulul de baza pentru gestionarea produselor si a listelor de "
|
||||
"preturi in OpenERP.\n"
|
||||
"========================================================================\n"
|
||||
"============================================================================="
|
||||
"=================\n"
|
||||
"\n"
|
||||
"Produsele accepta variante, diferite metode de stabilire a pretului, "
|
||||
"informatii referitoare la furnizori,\n"
|
||||
@@ -3103,7 +3106,7 @@ msgstr ""
|
||||
"proprietati.\n"
|
||||
"\n"
|
||||
"Listele de preturi accepta:\n"
|
||||
"--------------------\n"
|
||||
"---------------------------\n"
|
||||
" * Niveluri multiple de reducere (dupa produs, categorie, cantitati)\n"
|
||||
" * Calculeaza pretul pe baza unor criterii diferite:\n"
|
||||
" * Alte liste de preturi\n"
|
||||
@@ -3134,11 +3137,10 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Configureaza valorile implicite pentru conturile dumneavoastra analitice.\n"
|
||||
"==============================================\n"
|
||||
"=========================================================================\n"
|
||||
"\n"
|
||||
"Permite selectarea automata a conturilor analitice pe baza criteriilor:\n"
|
||||
"-----------------------------------------------------------------------------"
|
||||
"------\n"
|
||||
"-----------------------------------------------------------------------\n"
|
||||
" * Produs \n"
|
||||
" * Partener\n"
|
||||
" * Utilizator\n"
|
||||
@@ -3216,7 +3218,8 @@ msgstr ""
|
||||
"\n"
|
||||
"Modulul de baza pentru gestionarea distribuirii analitice si a comenzilor de "
|
||||
"vanzare.\n"
|
||||
"==========================================================================\n"
|
||||
"============================================================================="
|
||||
"========\n"
|
||||
"\n"
|
||||
"Folosind acest modul veti putea lega conturile analitice de comenzile de "
|
||||
"vanzare.\n"
|
||||
@@ -3292,7 +3295,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Acesta este un sistem complet de gestionare a documentelor.\n"
|
||||
"==============================================\n"
|
||||
"===========================================================\n"
|
||||
" * Autentificare Utilizator\n"
|
||||
" * Indexare Documente:- fisierele .pptx si .docx nu sunt acceptate in "
|
||||
"platforma Windows.\n"
|
||||
@@ -3351,8 +3354,8 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Gestiunea cotarilor si a comenzilor de vanzare\n"
|
||||
" ==================================\n"
|
||||
"Gestionare cotațiilor și a comenzilor de vânzare\n"
|
||||
"================================================\n"
|
||||
"\n"
|
||||
"Aceasta aplicatie va permite sa va gestionati obiectivele de vanzari intr-un "
|
||||
"mod efectiv si eficient, tinand evidenta tuturor comenzilor de vanzare si "
|
||||
@@ -3363,7 +3366,7 @@ msgstr ""
|
||||
"* **Cotare** -> **Comanda de vanzare** -> **Factura**\n"
|
||||
"\n"
|
||||
"Preferinte (numai daca este instalat si modulul Gestionarea Depozitului)\n"
|
||||
"-----------------------------------------------------\n"
|
||||
"------------------------------------------------------------------------\n"
|
||||
"\n"
|
||||
"Daca ati instalat si Gestionarea Depozitului, puteti efectua urmatoarele:\n"
|
||||
"\n"
|
||||
@@ -3382,7 +3385,7 @@ msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
"Tabloul de bord pentru Managerul de Vanzari va include\n"
|
||||
"------------------------------------------------\n"
|
||||
"------------------------------------------------------\n"
|
||||
"* Cotatiile mele\n"
|
||||
"* Cifra de afaceri lunara (Grafic)\n"
|
||||
" "
|
||||
@@ -3414,7 +3417,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Modul pentru atasarea unui document google oricarui model.\n"
|
||||
"================================================\n"
|
||||
"==========================================================\n"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_fields.py:333
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
@@ -25,6 +25,9 @@ msgid ""
|
||||
"================================================\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"โมดูลสำหรับการเขียน และพิมพ์เช็ค\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-02-04 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16916)\n"
|
||||
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16963)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
||||
@@ -24,6 +24,8 @@ import logging
|
||||
import operator
|
||||
import os
|
||||
import time
|
||||
import datetime
|
||||
import dateutil
|
||||
|
||||
import openerp
|
||||
from openerp import SUPERUSER_ID
|
||||
@@ -133,35 +135,42 @@ class ir_actions_report_xml(osv.osv):
|
||||
_sequence = 'ir_actions_id_seq'
|
||||
_order = 'name'
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True, translate=True),
|
||||
'model': fields.char('Object', size=64, required=True),
|
||||
'type': fields.char('Action Type', size=32, required=True),
|
||||
'report_name': fields.char('Service Name', size=64, required=True),
|
||||
'usage': fields.char('Action Usage', size=32),
|
||||
'report_type': fields.char('Report Type', size=32, required=True, help="Report Type, e.g. pdf, html, raw, sxw, odt, html2html, mako2html, ..."),
|
||||
'name': fields.char('Name', size=64, required=True, translate=True),
|
||||
|
||||
'model': fields.char('Model', required=True),
|
||||
'report_type': fields.selection([('qweb-pdf', 'PDF'),
|
||||
('qweb-html', 'HTML'),
|
||||
('other', 'Other'),
|
||||
('pdf', 'RML pdf (deprecated)'),
|
||||
('sxw', 'RML sxw (deprecated)'),
|
||||
('webkit', 'Webkit (deprecated)'),
|
||||
], 'Report Type', required=True, help="PDF will use wkhtmltopdf to render html to pdf, HTML will directly show html, Other will force download the controller output keeping the MIME type."),
|
||||
'report_name': fields.char('Controller Name', required=True, help="URL of the report will be /report/<controller name>/<ids>, the default controller also use this field to get the name of the qweb ir.ui.view to render. For RML reports, this is the LocalService name."),
|
||||
'groups_id': fields.many2many('res.groups', 'res_groups_report_rel', 'uid', 'gid', 'Groups'),
|
||||
|
||||
# options
|
||||
'multi': fields.boolean('On Multiple Doc.', help="If set to true, the action will not be displayed on the right toolbar of a form view."),
|
||||
'attachment': fields.char('Save as Attachment Prefix', size=128, help='This is the filename of the attachment used to store the printing result. Keep empty to not save the printed reports. You can use a python expression with the object and time variables.'),
|
||||
'attachment_use': fields.boolean('Reload from Attachment', help='If you check this, then the second time the user prints with same attachment name, it returns the previous report.'),
|
||||
'attachment': fields.char('Save as Attachment Prefix', size=128, help='This is the filename of the attachment used to store the printing result. Keep empty to not save the printed reports. You can use a python expression with the object and time variables.'),
|
||||
|
||||
# Deprecated rml stuff
|
||||
'usage': fields.char('Action Usage', size=32),
|
||||
'header': fields.boolean('Add RML Header', help="Add or not the corporate RML header"),
|
||||
'parser': fields.char('Parser Class'),
|
||||
'auto': fields.boolean('Custom Python Parser'),
|
||||
|
||||
'header': fields.boolean('Add RML Header', help="Add or not the corporate RML header"),
|
||||
'report_xsl': fields.char('XSL Path'),
|
||||
'report_xml': fields.char('XML Path'),
|
||||
|
||||
'report_xsl': fields.char('XSL Path', size=256),
|
||||
'report_xml': fields.char('XML Path', size=256, help=''),
|
||||
|
||||
# Pending deprecation... to be replaced by report_file as this object will become the default report object (not so specific to RML anymore)
|
||||
'report_rml': fields.char('Main Report File Path', size=256, help="The path to the main report file (depending on Report Type) or NULL if the content is in another data field"),
|
||||
# temporary related field as report_rml is pending deprecation - this field will replace report_rml after v6.0
|
||||
'report_file': fields.related('report_rml', type="char", size=256, required=False, readonly=False, string='Report File', help="The path to the main report file (depending on Report Type) or NULL if the content is in another field", store=True),
|
||||
'report_rml': fields.char('Main Report File Path', help="The path to the main report file (depending on Report Type) or NULL if the content is in another data field"),
|
||||
'report_file': fields.related('report_rml', type="char", required=False, readonly=False, string='Report File', help="The path to the main report file (depending on Report Type) or NULL if the content is in another field", store=True),
|
||||
|
||||
'report_sxw': fields.function(_report_sxw, type='char', string='SXW Path'),
|
||||
'report_sxw_content_data': fields.binary('SXW Content'),
|
||||
'report_rml_content_data': fields.binary('RML Content'),
|
||||
'report_sxw_content': fields.function(_report_content, fnct_inv=_report_content_inv, type='binary', string='SXW Content',),
|
||||
'report_rml_content': fields.function(_report_content, fnct_inv=_report_content_inv, type='binary', string='RML Content'),
|
||||
|
||||
'parser': fields.char('Parser Class'),
|
||||
}
|
||||
_defaults = {
|
||||
'type': 'ir.actions.report.xml',
|
||||
@@ -268,7 +277,7 @@ class ir_actions_act_window(osv.osv):
|
||||
'filter': fields.boolean('Filter'),
|
||||
'auto_search':fields.boolean('Auto Search'),
|
||||
'search_view' : fields.function(_search_view, type='text', string='Search View'),
|
||||
'multi': fields.boolean('Action on Multiple Doc.', help="If set to true, the action will not be displayed on the right toolbar of a form view"),
|
||||
'multi': fields.boolean('Restrict to lists', help="If checked and the action is bound to a model, it will only appear in the More menu on list views"),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
@@ -550,6 +559,7 @@ class ir_actions_server(osv.osv):
|
||||
# - uid: current user id
|
||||
# - context: current context
|
||||
# - time: Python time module
|
||||
# - workflow: Workflow engine
|
||||
# If you plan to return an action, assign: action = {...}""",
|
||||
'use_relational_model': 'base',
|
||||
'use_create': 'new',
|
||||
@@ -928,9 +938,13 @@ class ir_actions_server(osv.osv):
|
||||
'obj': obj,
|
||||
'pool': self.pool,
|
||||
'time': time,
|
||||
'datetime': datetime,
|
||||
'dateutil': dateutil,
|
||||
'cr': cr,
|
||||
'uid': uid,
|
||||
'user': user,
|
||||
'context': context,
|
||||
'workflow': workflow
|
||||
}
|
||||
|
||||
def run(self, cr, uid, ids, context=None):
|
||||
@@ -955,7 +969,6 @@ class ir_actions_server(osv.osv):
|
||||
if context is None:
|
||||
context = {}
|
||||
res = False
|
||||
active_ids = context.get('active_ids', [context.get('active_id')])
|
||||
for action in self.browse(cr, uid, ids, context):
|
||||
eval_context = self._get_eval_context(cr, uid, action, context=context)
|
||||
condition = action.condition
|
||||
@@ -963,9 +976,7 @@ class ir_actions_server(osv.osv):
|
||||
# Void (aka False) conditions are considered as True
|
||||
condition = True
|
||||
if hasattr(self, 'run_action_%s_multi' % action.state):
|
||||
# set active_ids in context only needed if one active_id
|
||||
run_context = dict(context, active_ids=active_ids)
|
||||
eval_context["context"] = run_context
|
||||
run_context = eval_context['context']
|
||||
expr = eval(str(condition), eval_context)
|
||||
if not expr:
|
||||
continue
|
||||
@@ -975,6 +986,8 @@ class ir_actions_server(osv.osv):
|
||||
|
||||
elif hasattr(self, 'run_action_%s' % action.state):
|
||||
func = getattr(self, 'run_action_%s' % action.state)
|
||||
active_id = context.get('active_id')
|
||||
active_ids = context.get('active_ids', [active_id] if active_id else [])
|
||||
for active_id in active_ids:
|
||||
# run context dedicated to a particular active_id
|
||||
run_context = dict(context, active_ids=[active_id], active_id=active_id)
|
||||
|
||||
@@ -57,39 +57,35 @@
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="report_name"/>
|
||||
<field name="model"/>
|
||||
<field name="report_type"/>
|
||||
<field name="report_name"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="usage"/>
|
||||
<field name="report_type"/>
|
||||
<field name="report_file"/>
|
||||
<field name="multi"/>
|
||||
<field name="attachment_use"/>
|
||||
<field name="attachment"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Other Configuration">
|
||||
<page string="Security">
|
||||
<field name="groups_id"/>
|
||||
</page>
|
||||
<page string="RML Configuration" attrs="{'invisible':[('report_type','not in',['pdf','sxw'])]}">
|
||||
<group>
|
||||
<group string="RML Report">
|
||||
<field name="header"/>
|
||||
<field name="report_file"/>
|
||||
<field name="auto"/>
|
||||
<field name="parser"/>
|
||||
<field name="usage"/>
|
||||
</group>
|
||||
<group string="XML Report">
|
||||
<field name="report_xsl"/>
|
||||
<field name="report_xml"/>
|
||||
</group>
|
||||
<group string="Attachments">
|
||||
<field name="attachment"/>
|
||||
<field name="attachment_use"/>
|
||||
</group>
|
||||
<group string="Miscellaneous">
|
||||
<field name="multi"/>
|
||||
<field name="auto"/>
|
||||
<field name="parser"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Security">
|
||||
<field name="groups_id"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
@@ -117,7 +113,8 @@
|
||||
filter_domain="['|', '|', '|', '|', ('name','ilike',self), ('model','ilike',self), ('type','ilike',self), ('report_name','ilike',self), ('report_type','ilike',self)]"
|
||||
string="Report"/>
|
||||
<group expand="0" string="Group By" colspan="4">
|
||||
<filter string="Report Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'report_type'}"/>
|
||||
<filter string="Report Type" domain="[]" context="{'group_by':'report_type'}"/>
|
||||
<filter string="Report Model" domain="[]" context="{'group_by':'model'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
@@ -180,6 +177,7 @@
|
||||
<field name="auto_refresh"/>
|
||||
<field name="auto_search"/>
|
||||
<field name="filter"/>
|
||||
<field name="multi"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Help">
|
||||
@@ -411,6 +409,7 @@
|
||||
<li>cr: database cursor</li>
|
||||
<li>uid: current user id</li>
|
||||
<li>context: current context</li>
|
||||
<li>workflow: Workflow engine</li>
|
||||
</ul>
|
||||
<div>
|
||||
<p>Example of condition expression using Python</p>
|
||||
|
||||
@@ -64,19 +64,37 @@ class ir_attachment(osv.osv):
|
||||
data[attachment.id] = False
|
||||
return data
|
||||
|
||||
def _storage(self, cr, uid, context=None):
|
||||
return self.pool['ir.config_parameter'].get_param(cr, SUPERUSER_ID, 'ir_attachment.location', 'file')
|
||||
|
||||
@tools.ormcache()
|
||||
def _filestore(self, cr, uid, context=None):
|
||||
return os.path.join(tools.config['data_dir'], 'filestore', cr.dbname)
|
||||
|
||||
# 'data' field implementation
|
||||
def _full_path(self, cr, uid, location, path):
|
||||
# location = 'file:filestore'
|
||||
assert location.startswith('file:'), "Unhandled filestore location %s" % location
|
||||
location = location[5:]
|
||||
|
||||
# sanitize location name and path
|
||||
location = re.sub('[.]','',location)
|
||||
location = location.strip('/\\')
|
||||
|
||||
path = re.sub('[.]','',path)
|
||||
# sanitize ath
|
||||
path = re.sub('[.]', '', path)
|
||||
path = path.strip('/\\')
|
||||
return os.path.join(tools.config['root_path'], location, cr.dbname, path)
|
||||
return os.path.join(self._filestore(cr, uid), path)
|
||||
|
||||
def _get_path(self, cr, uid, location, bin_data):
|
||||
sha = hashlib.sha1(bin_data).hexdigest()
|
||||
|
||||
# retro compatibility
|
||||
fname = sha[:3] + '/' + sha
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
if os.path.isfile(full_path):
|
||||
return fname, full_path # keep existing path
|
||||
|
||||
# scatter files across 256 dirs
|
||||
# we use '/' in the db (even on windows)
|
||||
fname = sha[:2] + '/' + sha
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
dirname = os.path.dirname(full_path)
|
||||
if not os.path.isdir(dirname):
|
||||
os.makedirs(dirname)
|
||||
return fname, full_path
|
||||
|
||||
def _file_read(self, cr, uid, location, fname, bin_size=False):
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
@@ -92,18 +110,13 @@ class ir_attachment(osv.osv):
|
||||
|
||||
def _file_write(self, cr, uid, location, value):
|
||||
bin_value = value.decode('base64')
|
||||
fname = hashlib.sha1(bin_value).hexdigest()
|
||||
# scatter files across 1024 dirs
|
||||
# we use '/' in the db (even on windows)
|
||||
fname = fname[:3] + '/' + fname
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
try:
|
||||
dirname = os.path.dirname(full_path)
|
||||
if not os.path.isdir(dirname):
|
||||
os.makedirs(dirname)
|
||||
open(full_path,'wb').write(bin_value)
|
||||
except IOError:
|
||||
_logger.error("_file_write writing %s",full_path)
|
||||
fname, full_path = self._get_path(cr, uid, location, bin_value)
|
||||
if not os.path.exists(full_path):
|
||||
try:
|
||||
with open(full_path, 'wb') as fp:
|
||||
fp.write(bin_value)
|
||||
except IOError:
|
||||
_logger.error("_file_write writing %s", full_path)
|
||||
return fname
|
||||
|
||||
def _file_delete(self, cr, uid, location, fname):
|
||||
@@ -122,10 +135,10 @@ class ir_attachment(osv.osv):
|
||||
if context is None:
|
||||
context = {}
|
||||
result = {}
|
||||
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
|
||||
location = self._storage(cr, uid, context)
|
||||
bin_size = context.get('bin_size')
|
||||
for attach in self.browse(cr, uid, ids, context=context):
|
||||
if location and attach.store_fname:
|
||||
if location != 'db' and attach.store_fname:
|
||||
result[attach.id] = self._file_read(cr, uid, location, attach.store_fname, bin_size)
|
||||
else:
|
||||
result[attach.id] = attach.db_datas
|
||||
@@ -137,9 +150,9 @@ class ir_attachment(osv.osv):
|
||||
return True
|
||||
if context is None:
|
||||
context = {}
|
||||
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
|
||||
location = self._storage(cr, uid, context)
|
||||
file_size = len(value.decode('base64'))
|
||||
if location:
|
||||
if location != 'db':
|
||||
attach = self.browse(cr, uid, id, context=context)
|
||||
if attach.store_fname:
|
||||
self._file_delete(cr, uid, location, attach.store_fname)
|
||||
@@ -285,8 +298,8 @@ class ir_attachment(osv.osv):
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
self.check(cr, uid, ids, 'unlink', context=context)
|
||||
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
|
||||
if location:
|
||||
location = self._storage(cr, uid, context)
|
||||
if location != 'db':
|
||||
for attach in self.browse(cr, uid, ids, context=context):
|
||||
if attach.store_fname:
|
||||
self._file_delete(cr, uid, location, attach.store_fname)
|
||||
@@ -303,4 +316,3 @@ class ir_attachment(osv.osv):
|
||||
cr, uid, 'base', 'action_attachment', context=context)
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -225,12 +225,21 @@ class ir_cron(osv.osv):
|
||||
lock_cr = db.cursor()
|
||||
try:
|
||||
# Try to grab an exclusive lock on the job row from within the task transaction
|
||||
# Restrict to the same conditions as for the search since the job may have already
|
||||
# been run by an other thread when cron is running in multi thread
|
||||
lock_cr.execute("""SELECT *
|
||||
FROM ir_cron
|
||||
WHERE id=%s
|
||||
WHERE numbercall != 0
|
||||
AND active
|
||||
AND nextcall <= (now() at time zone 'UTC')
|
||||
AND id=%s
|
||||
FOR UPDATE NOWAIT""",
|
||||
(job['id'],), log_exceptions=False)
|
||||
|
||||
locked_job = lock_cr.fetchone()
|
||||
if not locked_job:
|
||||
# job was already executed by another parallel process/thread, skipping it.
|
||||
continue
|
||||
# Got the lock on the job row, run its code
|
||||
_logger.debug('Starting job `%s`.', job['name'])
|
||||
job_cr = db.cursor()
|
||||
|
||||
@@ -53,8 +53,8 @@ class ir_http(osv.AbstractModel):
|
||||
def _get_converters(self):
|
||||
return {'model': ModelConverter, 'models': ModelsConverter}
|
||||
|
||||
def _find_handler(self):
|
||||
return self.routing_map().bind_to_environ(request.httprequest.environ).match()
|
||||
def _find_handler(self, return_rule=False):
|
||||
return self.routing_map().bind_to_environ(request.httprequest.environ).match(return_rule=return_rule)
|
||||
|
||||
def _auth_method_user(self):
|
||||
request.uid = request.session.uid
|
||||
@@ -77,7 +77,9 @@ class ir_http(osv.AbstractModel):
|
||||
# what if error in security.check()
|
||||
# -> res_users.check()
|
||||
# -> res_users.check_credentials()
|
||||
except Exception:
|
||||
except (openerp.exceptions.AccessDenied, openerp.http.SessionExpiredException):
|
||||
# All other exceptions mean undetermined status (e.g. connection pool full),
|
||||
# let them bubble up
|
||||
request.session.logout()
|
||||
getattr(self, "_auth_method_%s" % auth_method)()
|
||||
return auth_method
|
||||
@@ -89,7 +91,8 @@ class ir_http(osv.AbstractModel):
|
||||
def _dispatch(self):
|
||||
# locate the controller method
|
||||
try:
|
||||
func, arguments = self._find_handler()
|
||||
rule, arguments = self._find_handler(return_rule=True)
|
||||
func = rule.endpoint
|
||||
except werkzeug.exceptions.NotFound, e:
|
||||
return self._handle_exception(e)
|
||||
|
||||
@@ -102,7 +105,7 @@ class ir_http(osv.AbstractModel):
|
||||
convert_exception_to(
|
||||
werkzeug.exceptions.Forbidden))
|
||||
|
||||
processing = self._postprocess_args(arguments)
|
||||
processing = self._postprocess_args(arguments, rule)
|
||||
if processing:
|
||||
return processing
|
||||
|
||||
@@ -118,7 +121,7 @@ class ir_http(osv.AbstractModel):
|
||||
|
||||
return result
|
||||
|
||||
def _postprocess_args(self, arguments):
|
||||
def _postprocess_args(self, arguments, rule):
|
||||
""" post process arg to set uid on browse records """
|
||||
for arg in arguments.itervalues():
|
||||
if isinstance(arg, orm.browse_record) and arg._uid is UID_PLACEHOLDER:
|
||||
@@ -135,6 +138,8 @@ class ir_http(osv.AbstractModel):
|
||||
m = request.registry.get('ir.module.module')
|
||||
ids = m.search(cr, openerp.SUPERUSER_ID, [('state', '=', 'installed'), ('name', '!=', 'web')], context=request.context)
|
||||
installed = set(x['name'] for x in m.read(cr, 1, ids, ['name'], context=request.context))
|
||||
if openerp.tools.config['test_enable']:
|
||||
installed.add(openerp.modules.module.current_test)
|
||||
mods = [''] + openerp.conf.server_wide_modules + sorted(installed)
|
||||
self._routing_map = http.routing_map(mods, False, converters=self._get_converters())
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ from openerp.osv.orm import Model, browse_null
|
||||
from openerp.tools.safe_eval import safe_eval as eval
|
||||
from openerp.tools import config
|
||||
from openerp.tools.translate import _
|
||||
from openerp.osv.orm import except_orm, browse_record
|
||||
from openerp.osv.orm import except_orm, browse_record, MAGIC_COLUMNS
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -302,6 +302,8 @@ class ir_model_fields(osv.osv):
|
||||
|
||||
def _drop_column(self, cr, uid, ids, context=None):
|
||||
for field in self.browse(cr, uid, ids, context):
|
||||
if field.name in MAGIC_COLUMNS:
|
||||
continue
|
||||
model = self.pool[field.model]
|
||||
cr.execute('select relkind from pg_class where relname=%s', (model._table,))
|
||||
result = cr.fetchone()
|
||||
@@ -1117,6 +1119,10 @@ class ir_model_data(osv.osv):
|
||||
# Don't remove the LOG_ACCESS_COLUMNS unless _log_access
|
||||
# has been turned off on the model.
|
||||
field = self.pool[model].browse(cr, uid, [res_id], context=context)[0]
|
||||
if not field.exists():
|
||||
_logger.info('Deleting orphan external_ids %s', external_ids)
|
||||
self.unlink(cr, uid, external_ids)
|
||||
continue
|
||||
if field.name in openerp.osv.orm.LOG_ACCESS_COLUMNS and self.pool[field.model]._log_access:
|
||||
continue
|
||||
if field.name == 'id':
|
||||
|
||||
@@ -32,7 +32,7 @@ class QWebException(Exception):
|
||||
class QWebTemplateNotFound(QWebException):
|
||||
pass
|
||||
|
||||
def convert_to_qweb_exception(etype=None, **kw):
|
||||
def raise_qweb_exception(etype=None, **kw):
|
||||
if etype is None:
|
||||
etype = QWebException
|
||||
orig_type, original, tb = sys.exc_info()
|
||||
@@ -43,7 +43,7 @@ def convert_to_qweb_exception(etype=None, **kw):
|
||||
e.qweb[k] = v
|
||||
# Will use `raise foo from bar` in python 3 and rename cause to __cause__
|
||||
e.qweb['cause'] = original
|
||||
return e
|
||||
raise
|
||||
|
||||
class QWebContext(dict):
|
||||
def __init__(self, cr, uid, data, loader=None, templates=None, context=None):
|
||||
@@ -166,7 +166,7 @@ class QWeb(orm.AbstractModel):
|
||||
try:
|
||||
xml_doc = qwebcontext.loader(name)
|
||||
except ValueError:
|
||||
raise convert_to_qweb_exception(QWebTemplateNotFound, message="Loader could not find template %r" % name, template=origin_template)
|
||||
raise_qweb_exception(QWebTemplateNotFound, message="Loader could not find template %r" % name, template=origin_template)
|
||||
self.load_document(xml_doc, qwebcontext=qwebcontext)
|
||||
|
||||
if name in qwebcontext.templates:
|
||||
@@ -179,7 +179,7 @@ class QWeb(orm.AbstractModel):
|
||||
return qwebcontext.safe_eval(expr)
|
||||
except Exception:
|
||||
template = qwebcontext.get('__template__')
|
||||
raise convert_to_qweb_exception(message="Could not evaluate expression %r" % expr, expression=expr, template=template)
|
||||
raise_qweb_exception(message="Could not evaluate expression %r" % expr, expression=expr, template=template)
|
||||
|
||||
def eval_object(self, expr, qwebcontext):
|
||||
return self.eval(expr, qwebcontext)
|
||||
@@ -207,7 +207,7 @@ class QWeb(orm.AbstractModel):
|
||||
return str(expr % qwebcontext)
|
||||
except Exception:
|
||||
template = qwebcontext.get('__template__')
|
||||
raise convert_to_qweb_exception(message="Format error for expression %r" % expr, expression=expr, template=template)
|
||||
raise_qweb_exception(message="Format error for expression %r" % expr, expression=expr, template=template)
|
||||
|
||||
def eval_bool(self, expr, qwebcontext):
|
||||
return int(bool(self.eval(expr, qwebcontext)))
|
||||
@@ -292,7 +292,7 @@ class QWeb(orm.AbstractModel):
|
||||
raise
|
||||
except Exception:
|
||||
template = qwebcontext.get('__template__')
|
||||
raise convert_to_qweb_exception(message="Could not render element %r" % element.nodeName, node=element, template=template)
|
||||
raise_qweb_exception(message="Could not render element %r" % element.nodeName, node=element, template=template)
|
||||
name = str(element.nodeName)
|
||||
inner = "".join(g_inner)
|
||||
trim = template_attributes.get("trim", 0)
|
||||
@@ -488,7 +488,6 @@ class FieldConverter(osv.AbstractModel):
|
||||
A default configuration key is ``widget`` which can override the
|
||||
field's own ``_type``.
|
||||
"""
|
||||
content = None
|
||||
try:
|
||||
content = self.record_to_html(
|
||||
cr, uid, field_name, record,
|
||||
@@ -503,12 +502,14 @@ class FieldConverter(osv.AbstractModel):
|
||||
field_name, record._model._name, exc_info=True)
|
||||
content = None
|
||||
|
||||
g_att += ''.join(
|
||||
' %s="%s"' % (name, werkzeug.utils.escape(value))
|
||||
for name, value in self.attributes(
|
||||
cr, uid, field_name, record, options,
|
||||
source_element, g_att, t_att, qweb_context)
|
||||
)
|
||||
if context and context.get('inherit_branding'):
|
||||
# add branding attributes
|
||||
g_att += ''.join(
|
||||
' %s="%s"' % (name, werkzeug.utils.escape(value))
|
||||
for name, value in self.attributes(
|
||||
cr, uid, field_name, record, options,
|
||||
source_element, g_att, t_att, qweb_context)
|
||||
)
|
||||
|
||||
return self.render_element(cr, uid, source_element, t_att, g_att,
|
||||
qweb_context, content)
|
||||
@@ -611,6 +612,9 @@ class DateTimeConverter(osv.AbstractModel):
|
||||
strftime_pattern = (u"%s %s" % (lang.date_format, lang.time_format))
|
||||
pattern = openerp.tools.posix_to_ldml(strftime_pattern, locale=locale)
|
||||
|
||||
if options and options.get('hide_seconds'):
|
||||
pattern = pattern.replace(":ss", "").replace(":s", "")
|
||||
|
||||
return babel.dates.format_datetime(value, format=pattern, locale=locale)
|
||||
|
||||
class TextConverter(osv.AbstractModel):
|
||||
|
||||
@@ -20,15 +20,19 @@
|
||||
##############################################################################
|
||||
import collections
|
||||
import copy
|
||||
import fnmatch
|
||||
import logging
|
||||
from lxml import etree
|
||||
from operator import itemgetter
|
||||
import os
|
||||
import simplejson
|
||||
import werkzeug
|
||||
|
||||
import HTMLParser
|
||||
|
||||
import openerp
|
||||
from openerp import tools
|
||||
from openerp.http import request
|
||||
from openerp.osv import fields, osv, orm
|
||||
from openerp.tools import graph, SKIPPED_ELEMENT_TYPES
|
||||
from openerp.tools.safe_eval import safe_eval as eval
|
||||
@@ -40,6 +44,17 @@ _logger = logging.getLogger(__name__)
|
||||
|
||||
MOVABLE_BRANDING = ['data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-xpath']
|
||||
|
||||
def keep_query(*args, **kw):
|
||||
if not args and not kw:
|
||||
args = ('*',)
|
||||
params = kw.copy()
|
||||
query_params = frozenset(werkzeug.url_decode(request.httprequest.query_string).keys())
|
||||
for keep_param in args:
|
||||
for param in fnmatch.filter(query_params, keep_param):
|
||||
if param not in params and param in request.params:
|
||||
params[param] = request.params[param]
|
||||
return werkzeug.urls.url_encode(params)
|
||||
|
||||
class view_custom(osv.osv):
|
||||
_name = 'ir.ui.view.custom'
|
||||
_order = 'create_date desc' # search(limit=1) should return the last customization
|
||||
@@ -301,14 +316,14 @@ class view(osv.osv):
|
||||
return node
|
||||
return None
|
||||
|
||||
def inherit_branding(self, specs_tree, view_id, source_id):
|
||||
def inherit_branding(self, specs_tree, view_id, root_id):
|
||||
for node in specs_tree.iterchildren(tag=etree.Element):
|
||||
xpath = node.getroottree().getpath(node)
|
||||
if node.tag == 'data' or node.tag == 'xpath':
|
||||
self.inherit_branding(node, view_id, source_id)
|
||||
self.inherit_branding(node, view_id, root_id)
|
||||
else:
|
||||
node.set('data-oe-id', str(view_id))
|
||||
node.set('data-oe-source-id', str(source_id))
|
||||
node.set('data-oe-source-id', str(root_id))
|
||||
node.set('data-oe-xpath', xpath)
|
||||
node.set('data-oe-model', 'ir.ui.view')
|
||||
node.set('data-oe-field', 'arch')
|
||||
@@ -382,7 +397,7 @@ class view(osv.osv):
|
||||
|
||||
return source
|
||||
|
||||
def apply_view_inheritance(self, cr, uid, source, source_id, model, context=None):
|
||||
def apply_view_inheritance(self, cr, uid, source, source_id, model, root_id=None, context=None):
|
||||
""" Apply all the (directly and indirectly) inheriting views.
|
||||
|
||||
:param source: a parent architecture to modify (with parent modifications already applied)
|
||||
@@ -393,13 +408,15 @@ class view(osv.osv):
|
||||
:return: a modified source where all the modifying architecture are applied
|
||||
"""
|
||||
if context is None: context = {}
|
||||
if root_id is None:
|
||||
root_id = source_id
|
||||
sql_inherit = self.pool.get('ir.ui.view').get_inheriting_views_arch(cr, uid, source_id, model, context=context)
|
||||
for (specs, view_id) in sql_inherit:
|
||||
specs_tree = etree.fromstring(specs.encode('utf-8'))
|
||||
if context.get('inherit_branding'):
|
||||
self.inherit_branding(specs_tree, view_id, source_id)
|
||||
self.inherit_branding(specs_tree, view_id, root_id)
|
||||
source = self.apply_inheritance_specs(cr, uid, source, specs_tree, view_id, context=context)
|
||||
source = self.apply_view_inheritance(cr, uid, source, view_id, model, context=context)
|
||||
source = self.apply_view_inheritance(cr, uid, source, view_id, model, root_id=root_id, context=context)
|
||||
return source
|
||||
|
||||
def read_combined(self, cr, uid, view_id, fields=None, context=None):
|
||||
@@ -542,7 +559,7 @@ class view(osv.osv):
|
||||
if f.tag in ('form', 'tree', 'graph', 'kanban', 'calendar'):
|
||||
node.remove(f)
|
||||
ctx = context.copy()
|
||||
ctx['base_model_name'] = Model
|
||||
ctx['base_model_name'] = model
|
||||
xarch, xfields = self.postprocess_and_fields(cr, user, column._obj or None, f, view_id, ctx)
|
||||
views[str(f.tag)] = {
|
||||
'arch': xarch,
|
||||
@@ -711,9 +728,26 @@ class view(osv.osv):
|
||||
def clear_cache(self):
|
||||
self.read_template.clear_cache(self)
|
||||
|
||||
def _contains_branded(self, node):
|
||||
return node.tag == 't'\
|
||||
or 't-raw' in node.attrib\
|
||||
or any(self.is_node_branded(child) for child in node.iterdescendants())
|
||||
|
||||
def _pop_view_branding(self, element):
|
||||
distributed_branding = dict(
|
||||
(attribute, element.attrib.pop(attribute))
|
||||
for attribute in MOVABLE_BRANDING
|
||||
if element.get(attribute))
|
||||
return distributed_branding
|
||||
|
||||
def distribute_branding(self, e, branding=None, parent_xpath='',
|
||||
index_map=misc.ConstantMapping(1)):
|
||||
if e.get('t-ignore') or e.tag == 'head':
|
||||
# remove any view branding possibly injected by inheritance
|
||||
attrs = set(MOVABLE_BRANDING)
|
||||
for descendant in e.iterdescendants(tag=etree.Element):
|
||||
if not attrs.intersection(descendant.attrib): continue
|
||||
self._pop_view_branding(descendant)
|
||||
# TODO: find a better name and check if we have a string to boolean helper
|
||||
return
|
||||
|
||||
@@ -725,25 +759,30 @@ class view(osv.osv):
|
||||
e.set('data-oe-xpath', node_path)
|
||||
if not e.get('data-oe-model'): return
|
||||
|
||||
# if a branded element contains branded elements distribute own
|
||||
# branding to children unless it's t-raw, then just remove branding
|
||||
# on current element
|
||||
if e.tag == 't' or 't-raw' in e.attrib or \
|
||||
any(self.is_node_branded(child) for child in e.iterdescendants()):
|
||||
distributed_branding = dict(
|
||||
(attribute, e.attrib.pop(attribute))
|
||||
for attribute in MOVABLE_BRANDING
|
||||
if e.get(attribute))
|
||||
if set(('t-esc', 't-escf', 't-raw', 't-rawf')).intersection(e.attrib):
|
||||
# nodes which fully generate their content and have no reason to
|
||||
# be branded because they can not sensibly be edited
|
||||
self._pop_view_branding(e)
|
||||
elif self._contains_branded(e):
|
||||
# if a branded element contains branded elements distribute own
|
||||
# branding to children unless it's t-raw, then just remove branding
|
||||
# on current element
|
||||
distributed_branding = self._pop_view_branding(e)
|
||||
|
||||
if 't-raw' not in e.attrib:
|
||||
# TODO: collections.Counter if remove p2.6 compat
|
||||
# running index by tag type, for XPath query generation
|
||||
indexes = collections.defaultdict(lambda: 0)
|
||||
for child in e.iterchildren(tag=etree.Element):
|
||||
indexes[child.tag] += 1
|
||||
self.distribute_branding(child, distributed_branding,
|
||||
parent_xpath=node_path,
|
||||
index_map=indexes)
|
||||
if child.get('data-oe-xpath'):
|
||||
# injected by view inheritance, skip otherwise
|
||||
# generated xpath is incorrect
|
||||
self.distribute_branding(child)
|
||||
else:
|
||||
indexes[child.tag] += 1
|
||||
self.distribute_branding(
|
||||
child, distributed_branding,
|
||||
parent_xpath=node_path, index_map=indexes)
|
||||
|
||||
def is_node_branded(self, node):
|
||||
""" Finds out whether a node is branded or qweb-active (bears a
|
||||
@@ -805,10 +844,20 @@ class view(osv.osv):
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
if values is None:
|
||||
values = dict()
|
||||
qcontext = dict(
|
||||
keep_query=keep_query,
|
||||
request=request,
|
||||
json=simplejson,
|
||||
quote_plus=werkzeug.url_quote_plus,
|
||||
)
|
||||
qcontext.update(values)
|
||||
|
||||
def loader(name):
|
||||
return self.read_template(cr, uid, name, context=context)
|
||||
|
||||
return self.pool[engine].render(cr, uid, tname, values, loader=loader, context=context)
|
||||
return self.pool[engine].render(cr, uid, tname, qcontext, loader=loader, context=context)
|
||||
|
||||
#------------------------------------------------------
|
||||
# Misc
|
||||
|
||||
@@ -394,17 +394,16 @@ class ir_values(osv.osv):
|
||||
for action in cr.dictfetchall():
|
||||
if not action['value']:
|
||||
continue # skip if undefined
|
||||
action_model,id = action['value'].split(',')
|
||||
fields = [
|
||||
field
|
||||
for field in self.pool[action_model]._all_columns
|
||||
if field not in EXCLUDED_FIELDS]
|
||||
action_model_name, action_id = action['value'].split(',')
|
||||
action_model = self.pool.get(action_model_name)
|
||||
if not action_model:
|
||||
continue # unknow model? skip it
|
||||
fields = [field for field in action_model._all_columns if field not in EXCLUDED_FIELDS]
|
||||
# FIXME: needs cleanup
|
||||
try:
|
||||
action_def = self.pool[action_model].read(cr, uid, int(id), fields, context)
|
||||
action_def = action_model.read(cr, uid, int(action_id), fields, context)
|
||||
if action_def:
|
||||
if action_model in ('ir.actions.report.xml','ir.actions.act_window',
|
||||
'ir.actions.wizard'):
|
||||
if action_model_name in ('ir.actions.report.xml', 'ir.actions.act_window'):
|
||||
groups = action_def.get('groups_id')
|
||||
if groups:
|
||||
cr.execute('SELECT 1 FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',
|
||||
|
||||
@@ -41,8 +41,9 @@ except ImportError:
|
||||
from StringIO import StringIO # NOQA
|
||||
|
||||
import openerp
|
||||
from openerp import modules, tools, addons
|
||||
from openerp import modules, tools
|
||||
from openerp.modules.db import create_categories
|
||||
from openerp.modules import get_module_resource
|
||||
from openerp.tools.parse_version import parse_version
|
||||
from openerp.tools.translate import _
|
||||
from openerp.osv import fields, osv, orm
|
||||
@@ -162,7 +163,7 @@ class module(osv.osv):
|
||||
def _get_desc(self, cr, uid, ids, field_name=None, arg=None, context=None):
|
||||
res = dict.fromkeys(ids, '')
|
||||
for module in self.browse(cr, uid, ids, context=context):
|
||||
path = addons.get_module_resource(module.name, 'static/description/index.html')
|
||||
path = get_module_resource(module.name, 'static/description/index.html')
|
||||
if path:
|
||||
with tools.file_open(path, 'rb') as desc_file:
|
||||
doc = desc_file.read()
|
||||
@@ -241,7 +242,7 @@ class module(osv.osv):
|
||||
def _get_icon_image(self, cr, uid, ids, field_name=None, arg=None, context=None):
|
||||
res = dict.fromkeys(ids, '')
|
||||
for module in self.browse(cr, uid, ids, context=context):
|
||||
path = addons.get_module_resource(module.name, 'static', 'description', 'icon.png')
|
||||
path = get_module_resource(module.name, 'static', 'description', 'icon.png')
|
||||
if path:
|
||||
image_file = tools.file_open(path, 'rb')
|
||||
try:
|
||||
|
||||
@@ -28,8 +28,6 @@ from openerp import tools
|
||||
from openerp.osv import osv, fields
|
||||
from openerp.tools.translate import _
|
||||
|
||||
ADDONS_PATH = tools.config['addons_path'].split(",")[-1]
|
||||
|
||||
class base_module_import(osv.osv_memory):
|
||||
""" Import Module """
|
||||
|
||||
|
||||
@@ -124,7 +124,8 @@ class res_company(osv.osv):
|
||||
'rml_footer': fields.text('Report Footer', help="Footer text displayed at the bottom of all reports."),
|
||||
'rml_footer_readonly': fields.related('rml_footer', type='text', string='Report Footer', readonly=True),
|
||||
'custom_footer': fields.boolean('Custom Footer', help="Check this to define the report footer manually. Otherwise it will be filled in automatically."),
|
||||
'font': fields.many2one('res.font', string="Font",help="Set the font into the report header, it will be used as default font in the RML reports of the user company"),
|
||||
'font': fields.many2one('res.font', string="Font", domain=[('mode', 'in', ('Normal', 'Regular', 'all', 'Book'))],
|
||||
help="Set the font into the report header, it will be used as default font in the RML reports of the user company"),
|
||||
'logo': fields.related('partner_id', 'image', string="Logo", type="binary"),
|
||||
'logo_web': fields.function(_get_logo_web, string="Logo Web", type="binary", store={
|
||||
'res.company': (lambda s, c, u, i, x: i, ['partner_id'], 10),
|
||||
@@ -147,7 +148,7 @@ class res_company(osv.osv):
|
||||
'website': fields.related('partner_id', 'website', string="Website", type="char", size=64),
|
||||
'vat': fields.related('partner_id', 'vat', string="Tax ID", type="char", size=32),
|
||||
'company_registry': fields.char('Company Registry', size=64),
|
||||
'paper_format': fields.selection([('a4', 'A4'), ('us_letter', 'US Letter')], "Paper Format", required=True),
|
||||
'rml_paper_format': fields.selection([('a4', 'A4'), ('us_letter', 'US Letter')], "Paper Format", required=True, oldname='paper_format'),
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', 'The company name must be unique !')
|
||||
@@ -207,20 +208,19 @@ class res_company(osv.osv):
|
||||
res['value'] = {'currency_id': currency_id}
|
||||
return res
|
||||
|
||||
def _search(self, cr, uid, args, offset=0, limit=None, order=None,
|
||||
context=None, count=False, access_rights_uid=None):
|
||||
def name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=100):
|
||||
if context is None:
|
||||
context = {}
|
||||
if context.get('user_preference'):
|
||||
if context.pop('user_preference', None):
|
||||
# We browse as superuser. Otherwise, the user would be able to
|
||||
# select only the currently visible companies (according to rules,
|
||||
# which are probably to allow to see the child companies) even if
|
||||
# she belongs to some other companies.
|
||||
user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context)
|
||||
cmp_ids = list(set([user.company_id.id] + [cmp.id for cmp in user.company_ids]))
|
||||
return cmp_ids
|
||||
return super(res_company, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
|
||||
context=context, count=count, access_rights_uid=access_rights_uid)
|
||||
uid = SUPERUSER_ID
|
||||
args = (args or []) + [('id', 'in', cmp_ids)]
|
||||
return super(res_company, self).name_search(cr, uid, name=name, args=args, operator=operator, context=context, limit=limit)
|
||||
|
||||
def _company_default_get(self, cr, uid, object=False, field=False, context=None):
|
||||
"""
|
||||
@@ -388,8 +388,8 @@ class res_company(osv.osv):
|
||||
_header_a4 = _header_main % ('21.7cm', '27.7cm', '27.7cm', '27.7cm', '27.8cm', '27.3cm', '25.3cm', '25.0cm', '25.0cm', '24.6cm', '24.6cm', '24.5cm', '24.5cm')
|
||||
_header_letter = _header_main % ('20cm', '26.0cm', '26.0cm', '26.0cm', '26.1cm', '25.6cm', '23.6cm', '23.3cm', '23.3cm', '22.9cm', '22.9cm', '22.8cm', '22.8cm')
|
||||
|
||||
def onchange_paper_format(self, cr, uid, ids, paper_format, context=None):
|
||||
if paper_format == 'us_letter':
|
||||
def onchange_rml_paper_format(self, cr, uid, ids, rml_paper_format, context=None):
|
||||
if rml_paper_format == 'us_letter':
|
||||
return {'value': {'rml_header': self._header_letter}}
|
||||
return {'value': {'rml_header': self._header_a4}}
|
||||
|
||||
@@ -398,7 +398,7 @@ class res_company(osv.osv):
|
||||
|
||||
_defaults = {
|
||||
'currency_id': _get_euro,
|
||||
'paper_format': 'a4',
|
||||
'rml_paper_format': 'a4',
|
||||
'rml_header':_get_header,
|
||||
'rml_header2': _header2,
|
||||
'rml_header3': _header3,
|
||||
|
||||
@@ -23,9 +23,6 @@
|
||||
<div>
|
||||
<field name="logo" widget="image" class="oe_avatar oe_left"/>
|
||||
</div>
|
||||
<div class="oe_right oe_button_box" name="button_box">
|
||||
<button name="%(preview_report)d" string="Preview Header/Footer" type="action"/>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<h1>
|
||||
@@ -75,29 +72,6 @@
|
||||
<field name="bank_ids" nolabel="1" context="{'default_company_id': active_id, 'footer_hide': False}"
|
||||
on_change="onchange_footer(custom_footer, phone, fax, email, website, vat, company_registry, bank_ids)"/>
|
||||
</group>
|
||||
<group string="Report Footer Configuration">
|
||||
<field name="paper_format" on_change="onchange_paper_format(paper_format)"/>
|
||||
<field name="custom_footer" on_change="onchange_footer(custom_footer, phone, fax, email, website, vat, company_registry, bank_ids)"/>
|
||||
<field name="rml_footer" attrs="{'invisible': [('custom_footer','=',False)]}"/>
|
||||
<field name="rml_footer_readonly" attrs="{'invisible': [('custom_footer','=',True)]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<label for="font" />
|
||||
<div>
|
||||
<div>
|
||||
<field name="font" class="oe_inline" colspan="2" on_change="onchange_font_name(font, rml_header, rml_header2, rml_header3)" domain="[('mode', 'in', ('normal', 'regular', 'all', 'book'))]" />
|
||||
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link" colspan="1"/>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Header/Footer" groups="base.group_no_one">
|
||||
<label for="rml_header"/>
|
||||
<field name="rml_header"/>
|
||||
<label for="rml_header2"/>
|
||||
<field name="rml_header2"/>
|
||||
<label for="rml_header3"/>
|
||||
<field name="rml_header3"/>
|
||||
</page>
|
||||
<page string="Configuration">
|
||||
<group>
|
||||
@@ -106,6 +80,34 @@
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Reports Configuration">
|
||||
<group string="Footer Configuration">
|
||||
<field name="custom_footer" on_change="onchange_footer(custom_footer, phone, fax, email, website, vat, company_registry, bank_ids)"/>
|
||||
<field name="rml_footer" attrs="{'invisible': [('custom_footer','=',False)]}"/>
|
||||
<field name="rml_footer_readonly" attrs="{'invisible': [('custom_footer','=',True)]}"/>
|
||||
</group>
|
||||
<group string="RML Configuration">
|
||||
<field name="rml_paper_format" on_change="onchange_rml_paper_format(rml_paper_format)"/>
|
||||
</group>
|
||||
<group>
|
||||
<label for="font" />
|
||||
<div>
|
||||
<div>
|
||||
<field name="font" class="oe_inline" colspan="2" on_change="onchange_font_name(font, rml_header, rml_header2, rml_header3)" />
|
||||
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link" colspan="1"/>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
<div class="oe_right oe_button_box" name="button_box" groups="base.group_no_one" >
|
||||
<button name="%(preview_report)d" string="Preview Header/Footer" type="action"/>
|
||||
</div>
|
||||
<label for="rml_header" groups="base.group_no_one" />
|
||||
<field name="rml_header" groups="base.group_no_one" />
|
||||
<label for="rml_header2" groups="base.group_no_one" />
|
||||
<field name="rml_header2" groups="base.group_no_one" />
|
||||
<label for="rml_header3" groups="base.group_no_one" />
|
||||
<field name="rml_header3" groups="base.group_no_one" />
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
|
||||
@@ -209,6 +209,7 @@ class res_partner(osv.osv, format_address):
|
||||
context = dict(context or {})
|
||||
context.pop('show_address', None)
|
||||
context.pop('show_address_only', None)
|
||||
context.pop('show_email', None)
|
||||
return dict(self.name_get(cr, uid, ids, context=context))
|
||||
|
||||
# indirections to avoid passing a copy of the overridable method when declaring the function field
|
||||
@@ -349,6 +350,7 @@ class res_partner(osv.osv, format_address):
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
default['user_ids'] = False
|
||||
name = self.read(cr, uid, [id], ['name'], context)[0]['name']
|
||||
default.update({'name': _('%s (copy)') % name})
|
||||
return super(res_partner, self).copy(cr, uid, id, default, context)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
|
||||
# Copyright (C) 2010-2013 OpenERP s.a. (<http://openerp.com>).
|
||||
# Copyright (C) 2010-2014 OpenERP s.a. (<http://openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
@@ -169,8 +169,9 @@ class res_users(osv.osv):
|
||||
}
|
||||
|
||||
def on_change_login(self, cr, uid, ids, login, context=None):
|
||||
v = {'email': login} if tools.single_email_re.match(login) else {}
|
||||
return {'value': v}
|
||||
if login and tools.single_email_re.match(login):
|
||||
return {'value': {'email': login}}
|
||||
return {}
|
||||
|
||||
def onchange_state(self, cr, uid, ids, state_id, context=None):
|
||||
partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)]
|
||||
@@ -899,16 +900,22 @@ class change_password_wizard(osv.TransientModel):
|
||||
}))
|
||||
return {'user_ids': res}
|
||||
|
||||
|
||||
def change_password_button(self, cr, uid, id, context=None):
|
||||
wizard = self.browse(cr, uid, id, context=context)[0]
|
||||
user_ids = []
|
||||
for user in wizard.user_ids:
|
||||
user_ids.append(user.id)
|
||||
self.pool.get('change.password.user').change_password_button(cr, uid, user_ids, context=context)
|
||||
return {
|
||||
'type': 'ir.actions.act_window_close',
|
||||
}
|
||||
need_reload = any(uid == user.user_id.id for user in wizard.user_ids)
|
||||
line_ids = [user.id for user in wizard.user_ids]
|
||||
|
||||
self.pool.get('change.password.user').change_password_button(cr, uid, line_ids, context=context)
|
||||
# don't keep temporary password copies in the database longer than necessary
|
||||
self.pool.get('change.password.user').write(cr, uid, line_ids, {'new_passwd': False}, context=context)
|
||||
|
||||
if need_reload:
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'reload'
|
||||
}
|
||||
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
class change_password_user(osv.TransientModel):
|
||||
"""
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
<field name="model">res.users</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Users">
|
||||
<field name="name" filter_domain="['|', '|', ('name','ilike',self), ('login','ilike',self), ('email,'ilike',self)]" string="User"/>
|
||||
<field name="name" filter_domain="['|', '|', ('name','ilike',self), ('login','ilike',self), ('email','ilike',self)]" string="User"/>
|
||||
<field name="company_ids" string="Company" groups="base.group_multi_company"/>
|
||||
</search>
|
||||
</field>
|
||||
@@ -282,7 +282,7 @@
|
||||
<group name="preferences" col="4">
|
||||
<field name="lang" readonly="0"/>
|
||||
<field name="tz" readonly="0"/>
|
||||
<field name="company_id" widget="selection" readonly="0"
|
||||
<field name="company_id" options="{'no_create': True}" readonly="0"
|
||||
groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group string="Email Preferences">
|
||||
|
||||
@@ -20,7 +20,6 @@ import test_res_config
|
||||
import test_res_lang
|
||||
import test_search
|
||||
import test_translate
|
||||
import test_ui
|
||||
#import test_uninstall
|
||||
import test_view_validation
|
||||
import test_views
|
||||
|
||||
@@ -9,6 +9,7 @@ class test_base(common.TransactionCase):
|
||||
super(test_base,self).setUp()
|
||||
self.res_partner = self.registry('res.partner')
|
||||
self.res_users = self.registry('res.users')
|
||||
self.res_partner_title = self.registry('res.partner.title')
|
||||
|
||||
# samples use effective TLDs from the Mozilla public suffix
|
||||
# list at http://publicsuffix.org
|
||||
@@ -285,18 +286,99 @@ class test_base(common.TransactionCase):
|
||||
|
||||
def test_60_read_group(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
for user_data in [
|
||||
{'name': 'Alice', 'login': 'alice', 'color': 1, 'function': 'Friend'},
|
||||
{'name': 'Bob', 'login': 'bob', 'color': 2, 'function': 'Friend'},
|
||||
{'name': 'Eve', 'login': 'eve', 'color': 3, 'function': 'Eavesdropper'},
|
||||
]:
|
||||
self.res_users.create(cr, uid, user_data)
|
||||
title_sir = self.res_partner_title.create(cr, uid, {'name': 'Sir', 'domain': 'contact'})
|
||||
title_lady = self.res_partner_title.create(cr, uid, {'name': 'Lady', 'domain': 'contact'})
|
||||
test_users = [
|
||||
{'name': 'Alice', 'login': 'alice', 'color': 1, 'function': 'Friend', 'date': '2015-03-28', 'title': title_lady},
|
||||
{'name': 'Alice', 'login': 'alice2', 'color': 0, 'function': 'Friend', 'date': '2015-01-28', 'title': title_lady},
|
||||
{'name': 'Bob', 'login': 'bob', 'color': 2, 'function': 'Friend', 'date': '2015-03-02', 'title': title_sir},
|
||||
{'name': 'Eve', 'login': 'eve', 'color': 3, 'function': 'Eavesdropper', 'date': '2015-03-20', 'title': title_lady},
|
||||
{'name': 'Nab', 'login': 'nab', 'color': -3, 'function': '5$ Wrench', 'date': '2014-09-10', 'title': title_sir},
|
||||
{'name': 'Nab', 'login': 'nab-she', 'color': 6, 'function': '5$ Wrench', 'date': '2014-01-02', 'title': title_lady},
|
||||
]
|
||||
ids = [self.res_users.create(cr, uid, u) for u in test_users]
|
||||
domain = [('id', 'in', ids)]
|
||||
|
||||
groups_data = self.res_users.read_group(cr, uid, domain=[('login', 'in', ('alice', 'bob', 'eve'))], fields=['name', 'color', 'function'], groupby='function')
|
||||
self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
|
||||
# group on local char field without domain and without active_test (-> empty WHERE clause)
|
||||
groups_data = self.res_users.read_group(cr, uid, [], fields=['login'], groupby=['login'], orderby='login DESC', context={'active_test': False})
|
||||
self.assertGreater(len(groups_data), 6, "Incorrect number of results when grouping on a field")
|
||||
|
||||
# group on local char field with limit
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['login'], groupby=['login'], orderby='login DESC', limit=3, offset=3)
|
||||
self.assertEqual(len(groups_data), 3, "Incorrect number of results when grouping on a field with limit")
|
||||
self.assertEqual(['bob', 'alice2', 'alice'], [g['login'] for g in groups_data], 'Result mismatch')
|
||||
|
||||
# group on inherited char field, aggregate on int field (second groupby ignored on purpose)
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color', 'function'], groupby=['function', 'login'])
|
||||
self.assertEqual(len(groups_data), 3, "Incorrect number of results when grouping on a field")
|
||||
self.assertEqual(['5$ Wrench', 'Eavesdropper', 'Friend'], [g['function'] for g in groups_data], 'incorrect read_group order')
|
||||
for group_data in groups_data:
|
||||
self.assertIn('color', group_data, "Aggregated data for the column 'color' is not present in read_group return values")
|
||||
self.assertEqual(group_data['color'], 3, "Incorrect sum for aggregated data for the column 'color'")
|
||||
self.assertIn('color', group_data, "Aggregated data for the column 'color' is not present in read_group return values")
|
||||
self.assertEqual(group_data['color'], 3, "Incorrect sum for aggregated data for the column 'color'")
|
||||
|
||||
# group on inherited char field, reverse order
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color'], groupby='name', orderby='name DESC')
|
||||
self.assertEqual(['Nab', 'Eve', 'Bob', 'Alice'], [g['name'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
|
||||
# group on int field, default ordering
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['color'], groupby='color')
|
||||
self.assertEqual([-3, 0, 1, 2, 3, 6], [g['color'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
|
||||
# multi group, second level is int field, should still be summed in first level grouping
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color'], groupby=['name', 'color'], orderby='name DESC')
|
||||
self.assertEqual(['Nab', 'Eve', 'Bob', 'Alice'], [g['name'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([3, 3, 2, 1], [g['color'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
|
||||
# group on inherited char field, multiple orders with directions
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['name', 'color'], groupby='name', orderby='color DESC, name')
|
||||
self.assertEqual(len(groups_data), 4, "Incorrect number of results when grouping on a field")
|
||||
self.assertEqual(['Eve', 'Nab', 'Bob', 'Alice'], [g['name'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([1, 2, 1, 2], [g['name_count'] for g in groups_data], 'Incorrect number of results')
|
||||
|
||||
# group on inherited date column (res_partner.date) -> Year-Month, default ordering
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'date'], groupby=['date'])
|
||||
self.assertEqual(len(groups_data), 4, "Incorrect number of results when grouping on a field")
|
||||
self.assertEqual(['January 2014', 'September 2014', 'January 2015', 'March 2015'], [g['date'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([1, 1, 1, 3], [g['date_count'] for g in groups_data], 'Incorrect number of results')
|
||||
|
||||
# group on inherited date column (res_partner.date) -> Year-Month, custom order
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'date'], groupby=['date'], orderby='date DESC')
|
||||
self.assertEqual(len(groups_data), 4, "Incorrect number of results when grouping on a field")
|
||||
self.assertEqual(['March 2015', 'January 2015', 'September 2014', 'January 2014'], [g['date'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([3, 1, 1, 1], [g['date_count'] for g in groups_data], 'Incorrect number of results')
|
||||
|
||||
# group on inherited many2one (res_partner.title), default order
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'title'], groupby=['title'])
|
||||
self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
|
||||
# m2o is returned as a (id, label) pair
|
||||
self.assertEqual([(title_lady, 'Lady'), (title_sir, 'Sir')], [g['title'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([4, 2], [g['title_count'] for g in groups_data], 'Incorrect number of results')
|
||||
self.assertEqual([10, -1], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
|
||||
|
||||
# group on inherited many2one (res_partner.title), reversed natural order
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'title'], groupby=['title'], orderby="title desc")
|
||||
self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
|
||||
# m2o is returned as a (id, label) pair
|
||||
self.assertEqual([(title_sir, 'Sir'), (title_lady, 'Lady')], [g['title'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([2, 4], [g['title_count'] for g in groups_data], 'Incorrect number of results')
|
||||
self.assertEqual([-1, 10], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
|
||||
|
||||
# group on inherited many2one (res_partner.title), multiple orders with m2o in second position
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'title'], groupby=['title'], orderby="color desc, title desc")
|
||||
self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
|
||||
# m2o is returned as a (id, label) pair
|
||||
self.assertEqual([(title_lady, 'Lady'), (title_sir, 'Sir')], [g['title'] for g in groups_data], 'Incorrect ordering of the result')
|
||||
self.assertEqual([4, 2], [g['title_count'] for g in groups_data], 'Incorrect number of results')
|
||||
self.assertEqual([10, -1], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
|
||||
|
||||
# group on inherited many2one (res_partner.title), ordered by other inherited field (color)
|
||||
groups_data = self.res_users.read_group(cr, uid, domain, fields=['function', 'color', 'title'], groupby=['title'], orderby='color')
|
||||
self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field")
|
||||
# m2o is returned as a (id, label) pair
|
||||
self.assertEqual([(title_sir, 'Sir'), (title_lady, 'Lady')], [g['title'] for g in groups_data], 'Incorrect ordering of the list')
|
||||
self.assertEqual([2, 4], [g['title_count'] for g in groups_data], 'Incorrect number of results')
|
||||
self.assertEqual([-1, 10], [g['color'] for g in groups_data], 'Incorrect aggregation of int column')
|
||||
|
||||
|
||||
class test_partner_recursion(common.TransactionCase):
|
||||
|
||||
@@ -375,6 +457,59 @@ class test_translation(common.TransactionCase):
|
||||
fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_FR'})
|
||||
self.assertEqual(fr_context_cat.name, 'Clients (copie)', "Did not used default value for translated value")
|
||||
|
||||
test_state = None
|
||||
#: Stores state information across multiple test classes
|
||||
def setUpModule():
|
||||
global test_state
|
||||
test_state = {}
|
||||
def tearDownModule():
|
||||
global test_state
|
||||
test_state = None
|
||||
|
||||
class TestPhaseInstall00(unittest2.TestCase):
|
||||
"""
|
||||
WARNING: Relies on tests being run in alphabetical order
|
||||
"""
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.state = None
|
||||
|
||||
def test_00_setup(self):
|
||||
type(self).state = 'init'
|
||||
|
||||
@common.at_install(False)
|
||||
def test_01_no_install(self):
|
||||
type(self).state = 'error'
|
||||
|
||||
def test_02_check(self):
|
||||
self.assertEqual(
|
||||
self.state, 'init',
|
||||
"Testcase state should not have been transitioned from 00")
|
||||
|
||||
class TestPhaseInstall01(unittest2.TestCase):
|
||||
at_install = False
|
||||
|
||||
def test_default_norun(self):
|
||||
self.fail("An unmarket test in a non-at-install case should not run")
|
||||
|
||||
@common.at_install(True)
|
||||
def test_set_run(self):
|
||||
test_state['set_at_install'] = True
|
||||
|
||||
class TestPhaseInstall02(unittest2.TestCase):
|
||||
"""
|
||||
Can't put the check for test_set_run in the same class: if
|
||||
@common.at_install does not work for test_set_run, it won't work for
|
||||
the other one either. Thus move checking of whether test_set_run has
|
||||
correctly run indeed to a separate class.
|
||||
|
||||
Warning: relies on *classes* being run in alphabetical order in test
|
||||
modules
|
||||
"""
|
||||
def test_check_state(self):
|
||||
self.assertTrue(
|
||||
test_state.get('set_at_install'),
|
||||
"The flag should be set if local overriding of runstate")
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
||||
|
||||
@@ -120,4 +120,110 @@ class TestRelatedField(common.TransactionCase):
|
||||
# restore res.partner fields
|
||||
self.partner._columns = old_columns
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
class TestPropertyField(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestPropertyField, self).setUp()
|
||||
self.user = self.registry('res.users')
|
||||
self.partner = self.registry('res.partner')
|
||||
self.company = self.registry('res.company')
|
||||
self.country = self.registry('res.country')
|
||||
self.property = self.registry('ir.property')
|
||||
self.imd = self.registry('ir.model.data')
|
||||
|
||||
def test_1_property_multicompany(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
|
||||
parent_company_id = self.imd.get_object_reference(cr, uid, 'base', 'main_company')[1]
|
||||
country_be = self.imd.get_object_reference(cr, uid, 'base', 'be')[1]
|
||||
country_fr = self.imd.get_object_reference(cr, uid, 'base', 'fr')[1]
|
||||
group_partner_manager = self.imd.get_object_reference(cr, uid, 'base', 'group_partner_manager')[1]
|
||||
group_multi_company = self.imd.get_object_reference(cr, uid, 'base', 'group_multi_company')[1]
|
||||
|
||||
sub_company = self.company.create(cr, uid, {'name': 'MegaCorp', 'parent_id': parent_company_id})
|
||||
alice = self.user.create(cr, uid, {'name': 'Alice',
|
||||
'login':'alice',
|
||||
'email':'alice@youcompany.com',
|
||||
'company_id':parent_company_id,
|
||||
'company_ids':[(6, 0, [parent_company_id, sub_company])],
|
||||
'country_id':country_be,
|
||||
'groups_id': [(6, 0, [group_partner_manager, group_multi_company])]
|
||||
})
|
||||
bob = self.user.create(cr, uid, {'name': 'Bob',
|
||||
'login':'bob',
|
||||
'email':'bob@megacorp.com',
|
||||
'company_id':sub_company,
|
||||
'company_ids':[(6, 0, [parent_company_id, sub_company])],
|
||||
'country_id':country_fr,
|
||||
'groups_id': [(6, 0, [group_partner_manager, group_multi_company])]
|
||||
})
|
||||
|
||||
self.partner._columns = dict(self.partner._columns)
|
||||
self.partner._columns.update({
|
||||
'property_country': fields.property(type='many2one', relation="res.country", string="Country by company"),
|
||||
})
|
||||
self.partner._all_columns.update({
|
||||
'property_country': fields.column_info('property_country', self.partner._columns['property_country'], None, None, None),
|
||||
})
|
||||
self.partner._field_create(cr)
|
||||
|
||||
partner_id = self.partner.create(cr, alice, {
|
||||
'name': 'An International Partner',
|
||||
'email': 'partner@example.com',
|
||||
'company_id': parent_company_id,
|
||||
})
|
||||
self.partner.write(cr, bob, [partner_id], {'property_country': country_fr})
|
||||
self.assertEqual(self.partner.browse(cr, bob, partner_id).property_country.id, country_fr, "Bob does not see the value he has set on the property field")
|
||||
|
||||
self.partner.write(cr, alice, [partner_id], {'property_country': country_be})
|
||||
self.assertEqual(self.partner.browse(cr, alice, partner_id).property_country.id, country_be, "Alice does not see the value he has set on the property field")
|
||||
self.assertEqual(self.partner.browse(cr, bob, partner_id).property_country.id, country_fr, "Changes made by Alice have overwritten Bob's value")
|
||||
|
||||
|
||||
class TestHtmlField(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestHtmlField, self).setUp()
|
||||
self.partner = self.registry('res.partner')
|
||||
|
||||
def test_00_sanitize(self):
|
||||
cr, uid, context = self.cr, self.uid, {}
|
||||
old_columns = self.partner._columns
|
||||
self.partner._columns = dict(old_columns)
|
||||
self.partner._columns.update({
|
||||
'comment': fields.html('Secure Html', sanitize=False),
|
||||
})
|
||||
some_ugly_html = """<p>Oops this should maybe be sanitized
|
||||
% if object.some_field and not object.oriented:
|
||||
<table>
|
||||
% if object.other_field:
|
||||
<tr>
|
||||
${object.mako_thing}
|
||||
<td>
|
||||
</tr>
|
||||
% endif
|
||||
<tr>
|
||||
%if object.dummy_field:
|
||||
<p>Youpie</p>
|
||||
%endif"""
|
||||
|
||||
pid = self.partner.create(cr, uid, {
|
||||
'name': 'Raoul Poilvache',
|
||||
'comment': some_ugly_html,
|
||||
}, context=context)
|
||||
partner = self.partner.browse(cr, uid, pid, context=context)
|
||||
self.assertEqual(partner.comment, some_ugly_html, 'Error in HTML field: content was sanitized but field has sanitize=False')
|
||||
|
||||
self.partner._columns.update({
|
||||
'comment': fields.html('Unsecure Html', sanitize=True),
|
||||
})
|
||||
self.partner.write(cr, uid, [pid], {
|
||||
'comment': some_ugly_html,
|
||||
}, context=context)
|
||||
partner = self.partner.browse(cr, uid, pid, context=context)
|
||||
# sanitize should have closed tags left open in the original html
|
||||
self.assertIn('</table>', partner.comment, 'Error in HTML field: content does not seem to have been sanitized despise sanitize=True')
|
||||
self.assertIn('</td>', partner.comment, 'Error in HTML field: content does not seem to have been sanitized despise sanitize=True')
|
||||
|
||||
self.partner._columns = old_columns
|
||||
|
||||
@@ -97,7 +97,8 @@ class TestServerActions(TestServerActionsBase):
|
||||
self.ir_actions_server.write(cr, uid, self.act_id, {
|
||||
'state': 'code',
|
||||
'code': """partner_name = obj.name + '_code'
|
||||
self.pool["res.partner"].create(cr, uid, {"name": partner_name}, context=context)"""
|
||||
self.pool["res.partner"].create(cr, uid, {"name": partner_name}, context=context)
|
||||
workflow"""
|
||||
})
|
||||
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
|
||||
self.assertFalse(run_res, 'ir_actions_server: code server action correctly finished should return False')
|
||||
|
||||
@@ -1,89 +1,92 @@
|
||||
import hashlib
|
||||
import os
|
||||
|
||||
import unittest2
|
||||
|
||||
import openerp
|
||||
import openerp.tests.common
|
||||
|
||||
class test_ir_attachment(openerp.tests.common.TransactionCase):
|
||||
HASH_SPLIT = 2 # FIXME: testing implementations detail is not a good idea
|
||||
|
||||
def test_00_attachment_flow(self):
|
||||
class test_ir_attachment(openerp.tests.common.TransactionCase):
|
||||
def setUp(self):
|
||||
super(test_ir_attachment, self).setUp()
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
root_path = openerp.tools.config['root_path']
|
||||
ira = registry('ir.attachment')
|
||||
self.ira = registry('ir.attachment')
|
||||
self.filestore = self.ira._filestore(cr, uid)
|
||||
|
||||
# Blob1
|
||||
blob1 = 'blob1'
|
||||
blob1_b64 = blob1.encode('base64')
|
||||
blob1_hash = hashlib.sha1(blob1).hexdigest()
|
||||
blob1_fname = blob1_hash[:3] + '/' + blob1_hash
|
||||
self.blob1 = 'blob1'
|
||||
self.blob1_b64 = self.blob1.encode('base64')
|
||||
blob1_hash = hashlib.sha1(self.blob1).hexdigest()
|
||||
self.blob1_fname = blob1_hash[:HASH_SPLIT] + '/' + blob1_hash
|
||||
|
||||
# Blob2
|
||||
blob2 = 'blob2'
|
||||
blob2_b64 = blob2.encode('base64')
|
||||
blob2_hash = hashlib.sha1(blob2).hexdigest()
|
||||
blob2_fname = blob2_hash[:3] + '/' + blob2_hash
|
||||
self.blob2_b64 = blob2.encode('base64')
|
||||
|
||||
def test_01_store_in_db(self):
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
|
||||
# force storing in database
|
||||
registry('ir.config_parameter').set_param(cr, uid, 'ir_attachment.location', 'db')
|
||||
|
||||
# 'ir_attachment.location' is undefined test database storage
|
||||
a1 = ira.create(cr, uid, {'name': 'a1', 'datas': blob1_b64})
|
||||
a1_read = ira.read(cr, uid, [a1], ['datas'])
|
||||
self.assertEqual(a1_read[0]['datas'], blob1_b64)
|
||||
a1 = self.ira.create(cr, uid, {'name': 'a1', 'datas': self.blob1_b64})
|
||||
a1_read = self.ira.read(cr, uid, [a1], ['datas'])
|
||||
self.assertEqual(a1_read[0]['datas'], self.blob1_b64)
|
||||
|
||||
cr.execute("select id,db_datas from ir_attachment where id = %s", (a1,) )
|
||||
a1_db_datas = str(cr.fetchall()[0][1])
|
||||
self.assertEqual(a1_db_datas, blob1_b64)
|
||||
a1_db_datas = self.ira.browse(cr, uid, a1).db_datas
|
||||
self.assertEqual(a1_db_datas, self.blob1_b64)
|
||||
|
||||
# define a location for filestore
|
||||
registry('ir.config_parameter').set_param(cr, uid, 'ir_attachment.location', 'file:///filestore')
|
||||
def test_02_store_on_disk(self):
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
|
||||
# Test file storage
|
||||
a2 = ira.create(cr, uid, {'name': 'a2', 'datas': blob1_b64})
|
||||
a2_read = ira.read(cr, uid, [a2], ['datas'])
|
||||
self.assertEqual(a2_read[0]['datas'], blob1_b64)
|
||||
a2 = self.ira.create(cr, uid, {'name': 'a2', 'datas': self.blob1_b64})
|
||||
a2_store_fname = self.ira.browse(cr, uid, a2).store_fname
|
||||
|
||||
cr.execute("select id,store_fname from ir_attachment where id = %s", (a2,) )
|
||||
a2_store_fname = cr.fetchall()[0][1]
|
||||
self.assertEqual(a2_store_fname, blob1_fname)
|
||||
self.assertEqual(a2_store_fname, self.blob1_fname)
|
||||
self.assertTrue(os.path.isfile(os.path.join(self.filestore, a2_store_fname)))
|
||||
|
||||
a2_fn = os.path.join(root_path, 'filestore', cr.dbname, blob1_hash[:3], blob1_hash)
|
||||
fc = file(a2_fn).read()
|
||||
self.assertEqual(fc, blob1)
|
||||
def test_03_no_duplication(self):
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
|
||||
# create a3 with same blob
|
||||
a3 = ira.create(cr, uid, {'name': 'a3', 'datas': blob1_b64})
|
||||
a3_read = ira.read(cr, uid, [a3], ['datas'])
|
||||
self.assertEqual(a3_read[0]['datas'], blob1_b64)
|
||||
a2 = self.ira.create(cr, uid, {'name': 'a2', 'datas': self.blob1_b64})
|
||||
a2_store_fname = self.ira.browse(cr, uid, a2).store_fname
|
||||
|
||||
a3 = self.ira.create(cr, uid, {'name': 'a3', 'datas': self.blob1_b64})
|
||||
a3_store_fname = self.ira.browse(cr, uid, a3).store_fname
|
||||
|
||||
cr.execute("select id,store_fname from ir_attachment where id = %s", (a3,) )
|
||||
a3_store_fname = cr.fetchall()[0][1]
|
||||
self.assertEqual(a3_store_fname, a2_store_fname)
|
||||
|
||||
# create a4 blob2
|
||||
a4 = ira.create(cr, uid, {'name': 'a4', 'datas': blob2_b64})
|
||||
a4_read = ira.read(cr, uid, [a4], ['datas'])
|
||||
self.assertEqual(a4_read[0]['datas'], blob2_b64)
|
||||
def test_04_keep_file(self):
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
|
||||
a4_fn = os.path.join(root_path, 'filestore', cr.dbname, blob2_hash[:3], blob2_hash)
|
||||
self.assertTrue(os.path.isfile(a4_fn))
|
||||
a2 = self.ira.create(cr, uid, {'name': 'a2', 'datas': self.blob1_b64})
|
||||
a3 = self.ira.create(cr, uid, {'name': 'a3', 'datas': self.blob1_b64})
|
||||
|
||||
# delete a3 but file stays
|
||||
ira.unlink(cr, uid, [a3])
|
||||
a2_store_fname = self.ira.browse(cr, uid, a2).store_fname
|
||||
a2_fn = os.path.join(self.filestore, a2_store_fname)
|
||||
|
||||
self.ira.unlink(cr, uid, [a3])
|
||||
self.assertTrue(os.path.isfile(a2_fn))
|
||||
|
||||
# delete a2 it is unlinked
|
||||
ira.unlink(cr, uid, [a2])
|
||||
self.ira.unlink(cr, uid, [a2])
|
||||
self.assertFalse(os.path.isfile(a2_fn))
|
||||
|
||||
# update a4 blob2 by blob1
|
||||
ira.write(cr, uid, [a4], {'datas': blob1_b64})
|
||||
a4_read = ira.read(cr, uid, [a4], ['datas'])
|
||||
self.assertEqual(a4_read[0]['datas'], blob1_b64)
|
||||
def test_05_change_data_change_file(self):
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
|
||||
a2 = self.ira.create(cr, uid, {'name': 'a2', 'datas': self.blob1_b64})
|
||||
a2_store_fname = self.ira.browse(cr, uid, a2).store_fname
|
||||
a2_fn = os.path.join(self.filestore, a2_store_fname)
|
||||
|
||||
# file of a4 disapear and a2 reappear
|
||||
self.assertFalse(os.path.isfile(a4_fn))
|
||||
self.assertTrue(os.path.isfile(a2_fn))
|
||||
|
||||
# everybody applause
|
||||
self.ira.write(cr, uid, [a2], {'datas': self.blob2_b64})
|
||||
self.assertFalse(os.path.isfile(a2_fn))
|
||||
|
||||
new_a2_store_fname = self.ira.browse(cr, uid, a2).store_fname
|
||||
self.assertNotEqual(a2_store_fname, new_a2_store_fname)
|
||||
|
||||
new_a2_fn = os.path.join(self.filestore, new_a2_store_fname)
|
||||
self.assertTrue(os.path.isfile(new_a2_fn))
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
# OPENERP_DATABASE=yy PYTHONPATH=../:. unit2 test_ir_sequence
|
||||
# This assume an existing database.
|
||||
import psycopg2
|
||||
import psycopg2.errorcodes
|
||||
import unittest2
|
||||
|
||||
import openerp
|
||||
@@ -111,11 +112,11 @@ class test_ir_sequence_no_gap(unittest2.TestCase):
|
||||
cr0 = cursor()
|
||||
cr1 = cursor()
|
||||
cr1._default_log_exceptions = False # Prevent logging a traceback
|
||||
msg_re = '^could not obtain lock on row in relation "ir_sequence"$'
|
||||
with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re):
|
||||
with self.assertRaises(psycopg2.OperationalError) as e:
|
||||
n0 = registry('ir.sequence').next_by_code(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
assert n0
|
||||
n1 = registry('ir.sequence').next_by_code(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
self.assertEqual(e.exception.pgcode, psycopg2.errorcodes.LOCK_NOT_AVAILABLE, msg="postgresql returned an incorrect errcode")
|
||||
cr0.close()
|
||||
cr1.close()
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ class TestQWebTField(common.TransactionCase):
|
||||
self.engine = self.registry('ir.qweb')
|
||||
|
||||
def context(self, values):
|
||||
return ir_qweb.QWebContext(self.cr, self.uid, values)
|
||||
return ir_qweb.QWebContext(
|
||||
self.cr, self.uid, values, context={'inherit_branding': True})
|
||||
|
||||
def test_trivial(self):
|
||||
field = document.createElement('span')
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
|
||||
import openerp
|
||||
|
||||
class TestUi(openerp.tests.HttpCase):
|
||||
def test_js(self):
|
||||
self.phantom_js('/',"console.log('ok')","console", login=None)
|
||||
|
||||
def test_jsfile(self):
|
||||
self.phantom_jsfile(os.path.join(os.path.dirname(__file__), 'test_ui_hello.js'))
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -1,5 +0,0 @@
|
||||
console.log("hello from test_phantom_hello.js");
|
||||
console.log("ok");
|
||||
// For a failure use:
|
||||
//console.log("error");
|
||||
phantom.exit();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user