[MERGE]with main branch

bzr revid: jpr@tinyerp.com-20140319051226-05pee6q8ih606s1i
This commit is contained in:
Jitendra Prajapati (OpenERP)
2014-03-19 10:42:26 +05:30
128 changed files with 2566 additions and 1121 deletions
+1
View File
@@ -16,6 +16,7 @@ Depends:
python,
postgresql-client,
python-dateutil,
python-decorator,
python-docutils,
python-feedparser,
python-gdata,
+3
View File
@@ -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()
+2
View File
@@ -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
#----------------------------------------------------------
-1
View File
@@ -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:
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+6 -7
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+58 -32
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+26 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+50 -34
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+9 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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"
#~ " "
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+11 -11
View File
@@ -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 "Тоон дугаарын гүйцээлт"
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+4 -4
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+31 -28
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+5 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+2 -2
View File
@@ -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
+34 -21
View File
@@ -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)
+17 -18
View File
@@ -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>
+41 -29
View File
@@ -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:
+10 -1
View File
@@ -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()
+11 -6
View File
@@ -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())
+7 -1
View File
@@ -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':
+17 -13
View File
@@ -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):
+70 -21
View File
@@ -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
+7 -8
View File
@@ -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',
+4 -3
View File
@@ -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 """
+11 -11
View File
@@ -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,
+28 -26
View File
@@ -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>
+2
View File
@@ -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)
+18 -11
View File
@@ -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):
"""
+2 -2
View File
@@ -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">
-1
View File
@@ -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
+145 -10
View File
@@ -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()
+107 -1
View File
@@ -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
+2 -1
View File
@@ -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')
+56 -53
View File
@@ -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()
+2 -1
View File
@@ -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')
-13
View File
@@ -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