[MERGE] with trunk.

bzr revid: nco@tinyerp.com-20130422050242-md9rj6bqpu0n78m1
bzr revid: nco@tinyerp.com-20130523044625-vwbcktuz9dsswnv6
This commit is contained in:
Nimesh Contractor (OpenERP)
2013-05-23 10:16:25 +05:30
104 changed files with 17483 additions and 1202 deletions
+1 -1
View File
@@ -19,7 +19,7 @@
#
##############################################################################
""" OpenERP core library.
""" OpenERP core library..
"""
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:11+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:13+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:42+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:42+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:13+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:42+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:13+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:42+0000\n"
"X-Generator: Launchpad (build 16598)\n"
"X-Poedit-Language: Czech\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: 2013-04-10 05:13+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:42+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
File diff suppressed because it is too large Load Diff
+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: 2013-04-10 05:14+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:50+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:48+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:50+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:51+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:50+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:21+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:51+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:21+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:51+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+6 -6
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: 2013-04-10 05:13+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:43+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -33,7 +33,7 @@ msgstr "Saint Helena"
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
msgstr ""
msgstr "Muu Konfiguratsioon"
#. module: base
#: selection:ir.property,type:0
@@ -84,7 +84,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Puutetundlik liides kauplustele"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
@@ -100,7 +100,7 @@ msgstr ""
#. module: base
#: view:ir.module.module:0
msgid "Created Views"
msgstr "Loodud vaated"
msgstr "Loodud Vaated"
#. module: base
#: model:ir.module.module,description:base.module_product_manufacturer
@@ -121,7 +121,7 @@ msgstr ""
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Täiendavad argumendid"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:17+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:46+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:21+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:51+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:14+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:43+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+36 -23
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: 2013-04-10 05:14+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:43+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -4933,7 +4933,7 @@ msgstr "Nauru"
#: code:addons/base/res/res_company.py:166
#, python-format
msgid "Reg"
msgstr ""
msgstr "Reg"
#. module: base
#: model:ir.model,name:base.model_ir_property
@@ -5620,7 +5620,7 @@ msgstr "Charger une traduction"
#. module: base
#: field:ir.module.module,latest_version:0
msgid "Installed Version"
msgstr ""
msgstr "Version installée"
#. module: base
#: model:ir.module.module,description:base.module_account_test
@@ -5913,7 +5913,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.ps
msgid "Palestinian Territory, Occupied"
msgstr ""
msgstr "Territoire palestinien, occupé"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ch
@@ -6090,7 +6090,7 @@ msgstr "Workflows"
#. module: base
#: model:ir.ui.menu,name:base.next_id_73
msgid "Purchase"
msgstr ""
msgstr "Achat"
#. module: base
#: selection:base.language.install,lang:0
@@ -6131,7 +6131,7 @@ msgstr "L'objet de la base de données auquel cet attachement sera attaché"
#: code:addons/base/ir/ir_fields.py:327
#, python-format
msgid "name"
msgstr ""
msgstr "nom"
#. module: base
#: model:ir.module.module,description:base.module_mrp_operations
@@ -6206,7 +6206,7 @@ msgstr "Ignorer"
#. module: base
#: model:ir.module.module,shortdesc:base.module_event_sale
msgid "Events Sales"
msgstr ""
msgstr "Événements des ventes"
#. module: base
#: model:res.country,name:base.ls
@@ -6283,7 +6283,7 @@ msgstr "Mettre NULL"
#. module: base
#: view:res.users:0
msgid "Save"
msgstr ""
msgstr "Sauvegarder"
#. module: base
#: field:ir.actions.report.xml,report_xml:0
@@ -6494,7 +6494,7 @@ msgstr "Taux"
#. module: base
#: model:ir.module.module,shortdesc:base.module_email_template
msgid "Email Templates"
msgstr ""
msgstr "Modèles de courriels"
#. module: base
#: model:res.country,name:base.sy
@@ -7031,7 +7031,7 @@ msgstr "Configuration de la précision décimale"
#: model:ir.model,name:base.model_ir_actions_act_url
#: selection:ir.ui.menu,action:0
msgid "ir.actions.act_url"
msgstr ""
msgstr "ir.actions.act_url"
#. module: base
#: model:ir.ui.menu,name:base.menu_translation_app
@@ -7288,7 +7288,7 @@ msgstr "titre"
#: code:addons/base/ir/ir_fields.py:146
#, python-format
msgid "true"
msgstr ""
msgstr "vrai"
#. module: base
#: model:ir.model,name:base.model_base_language_install
@@ -7298,7 +7298,7 @@ msgstr "Installation de langue"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_11
msgid "Services"
msgstr ""
msgstr "Services"
#. module: base
#: view:ir.translation:0
@@ -7438,7 +7438,7 @@ msgstr ""
#: code:addons/base/ir/workflow/workflow.py:99
#, python-format
msgid "Operation forbidden"
msgstr ""
msgstr "Opération interdite"
#. module: base
#: view:ir.actions.server:0
@@ -7569,7 +7569,7 @@ msgstr "Sans catégorie"
#. module: base
#: view:res.partner:0
msgid "Phone:"
msgstr ""
msgstr "Téléphone:"
#. module: base
#: field:res.partner,is_company:0
@@ -8116,7 +8116,7 @@ msgstr "ir.cron"
#. module: base
#: model:res.country,name:base.cw
msgid "Curaçao"
msgstr ""
msgstr "Curaçao"
#. module: base
#: view:ir.sequence:0
@@ -8658,7 +8658,7 @@ msgstr "Somalie"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_doctor
msgid "Dr."
msgstr ""
msgstr "Dr."
#. module: base
#: model:res.groups,name:base.group_user
@@ -8765,7 +8765,7 @@ msgstr "Territoire britannique de l'océan Indien"
#. module: base
#: model:ir.actions.server,name:base.action_server_module_immediate_install
msgid "Module Immediate Install"
msgstr ""
msgstr "Installation immédiate du module"
#. module: base
#: view:ir.actions.server:0
@@ -8961,7 +8961,7 @@ msgstr "Îles Mariannes du Nord"
#. module: base
#: field:change.password.user,user_login:0
msgid "User Login"
msgstr ""
msgstr "Identifiant"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hn
@@ -9040,7 +9040,7 @@ msgstr ""
#. module: base
#: model:res.partner.category,name:base.res_partner_category_14
msgid "Manufacturer"
msgstr ""
msgstr "Fabricant"
#. module: base
#: help:res.users,company_id:0
@@ -9876,7 +9876,7 @@ msgstr "Finlande"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_shortcuts
msgid "Web Shortcuts"
msgstr ""
msgstr "Raccourcis Web"
#. module: base
#: view:res.partner:0
@@ -9919,7 +9919,7 @@ msgstr "Comptabilité analytique"
#. module: base
#: model:ir.model,name:base.model_ir_model_constraint
msgid "ir.model.constraint"
msgstr ""
msgstr "ir.model.constraint"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_graph
@@ -10834,7 +10834,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_warehouse_management
msgid "Warehouse"
msgstr ""
msgstr "Entrepôt"
#. module: base
#: field:ir.exports,resource:0
@@ -10935,6 +10935,19 @@ msgid ""
"Thank you in advance for your cooperation.\n"
"Best Regards,"
msgstr ""
"Madame, Monsieur,\n"
"\n"
"D'après nos relevés, il semble que nous sommes encore en attente à ce jour "
"de paiements de votre part, dont les détails sont indiqués ci-dessous.\n"
"Si ces sommes ont déjà été réglées, vous pouvez ignorer ce rappel. Dans le "
"cas contraire, nous vous remercions de bien vouloir nous faire parvenir "
"votre règlement.\n"
"Si vous avez d'autres questions concernant votre compte, vous pouvez nous "
"contacter directement.\n"
"\n"
"En vous remerciant par avance.\n"
"\n"
"Cordialement,"
#. module: base
#: view:ir.module.category:0
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:14+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:43+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+107 -38
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -25,11 +25,14 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"רכיב לכתיבת והדפסת המחאות\n"
" "
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena"
msgstr "סנט הלנה"
msgstr "סיינט הלנה"
#. module: base
#: view:ir.actions.report.xml:0
@@ -48,6 +51,8 @@ msgid ""
"The second argument of the many2many field %s must be a SQL table !You used "
"%s, which is not a valid SQL table name."
msgstr ""
"הארגומנט השני של השדה many2many %s חייב להיות טבלת SQL! השתמשת ב-%s, שאינו "
"שם תקף של טבלת SQL."
#. module: base
#: field:ir.ui.view,arch:0
@@ -58,12 +63,12 @@ msgstr "הצג ארכיטקטורה"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "ניהול הצעות מחיר, הזמנות, תעודות משלוח וחשבוניות"
#. module: base
#: selection:ir.sequence,implementation:0
msgid "No gap"
msgstr ""
msgstr "ללא פער"
#. module: base
#: selection:base.language.install,lang:0
@@ -80,7 +85,7 @@ msgstr "Spanish (PY) / ספרדית (PY)"
msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr ""
msgstr "עזרה בניהול פרויקטים ומשימות על ידי מעקב, יצירת תכנונים ועוד ..."
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
@@ -90,13 +95,13 @@ msgstr "ממשק מסך מגע לחנויות"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "משכורות הודיות"
#. module: base
#: help:ir.cron,model:0
msgid ""
"Model name on which the method to be called is located, e.g. 'res.partner'."
msgstr ""
msgstr "שם המודול שבו נמצאת המתודה שלה קוראים, למשל: 'res.partner'."
#. module: base
#: view:ir.module.module:0
@@ -133,7 +138,7 @@ msgstr ""
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "טיעונים\\משתנים משלימים"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@@ -142,11 +147,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"רכיב זה מוסיף משתמש גוגל in res user.\n"
"========================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "נא לסמן את התיבה אם אשת\\איש קשר זו עובד\\ת בחברה"
#. module: base
#: help:ir.model.fields,domain:0
@@ -155,6 +163,8 @@ msgid ""
"specified as a Python expression defining a list of triplets. For example: "
"[('color','=','red')]"
msgstr ""
"הדומיין החלופי להגבלת ערכים אפשריים לשדות יחסים, המוגדר כביטוי של פייטון "
"המגדיר רשימה של שלשות. לדוגמא: [('אדום','=','צבע')]"
#. module: base
#: field:res.partner,ref:0
@@ -174,7 +184,7 @@ msgstr "חלון מטרה"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "נתיב קובץ לדוח ראשי"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@@ -195,6 +205,13 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"הנפקת חשבוניות מתוך הוצאות, רשומות שעות עבודה\n"
"========================================================\n"
"\n"
"רכיב להנפקת חשבוניות על פי הוצאות (שעות עבודה, הוצאות, וכו')\n"
"\n"
"באפשרותך להגדיר רשימות מחירים בניתוח חשבון, וליצור דוחות רווח צפוי"
#. module: base
#: code:addons/base/ir/ir_sequence.py:104
@@ -211,12 +228,14 @@ msgid ""
"Properties of base fields cannot be altered in this manner! Please modify "
"them through Python code, preferably through a custom addon!"
msgstr ""
"לא ניתן לשנות את תכונות הבסיס באופן זה ! נא לשנות אותם ברמת הקוד, רצוי "
"באמצעות תוסף ייעודי"
#. module: base
#: code:addons/osv.py:151
#, python-format
msgid "Constraint Error"
msgstr ""
msgstr "שגיאת אילוץ"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_custom
@@ -227,7 +246,7 @@ msgstr "ir.ui.view.custom"
#: code:addons/base/ir/ir_model.py:375
#, python-format
msgid "Renaming sparse field \"%s\" is not allowed"
msgstr ""
msgstr "אין אישור לשינוי שם שדה \"%s\""
#. module: base
#: model:res.country,name:base.sz
@@ -269,7 +288,7 @@ msgstr ""
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "ריבוי מטבעות"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@@ -281,6 +300,10 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"טבלאת חשבונאות ומס צ'יליאני\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@@ -292,12 +315,12 @@ msgstr "ניהול מכירות"
msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
msgstr "המשתמש הפנימי האחראי לתקשורת עם איש קשר זה, אם קיים."
#. module: base
#: view:res.partner:0
msgid "Search Partner"
msgstr ""
msgstr "חפש שותף (ספק/לקוח)"
#. module: base
#: field:ir.module.category,module_nr:0
@@ -331,6 +354,12 @@ msgid ""
" - tree_but_open\n"
"For defaults, an optional condition"
msgstr ""
"לעולות, אחת ממשבצות הפעולה האפשריות:\n"
" - לקוח_פעולה_מרובה\n"
" - לקוח_הדפסה_מרובה\n"
" - לקוח_ פעולה_קשורה\n"
" - עץ_אבל_פתוח\n"
"לברירות מחדל, תנאי חלופי"
#. module: base
#: sql_constraint:res.lang:0
@@ -377,6 +406,14 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
"\n"
"מאפשר הוספת שיטות משלוח להזמנה ובחירתן\n"
"==============================================================\n"
"\n"
"You can define your own carrier and delivery grids for prices. When creating "
"\n"
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
@@ -385,6 +422,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"כבר הוגדר מסנן משותף כברירת מחדל עבור %(model)s, יש למחוק או לשנות אותו לפני "
"בחירת מסנן ברירת מחדל חדש"
#. module: base
#: code:addons/orm.py:2649
@@ -452,7 +491,7 @@ msgstr "קבוצה"
msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
msgstr "פורמט תאריך\\שעה לא תקין. נא להיעזר בהנחיות המוצגות בעריכת שפה."
#. module: base
#: code:addons/orm.py:4153
@@ -474,7 +513,7 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "שם היחס"
#. module: base
#: view:ir.rule:0
@@ -529,7 +568,7 @@ msgstr "הגויאנה הצרפתית"
#. module: base
#: model:ir.module.module,summary:base.module_hr
msgid "Jobs, Departments, Employees Details"
msgstr "עבודות, מחלקות, פרטי עובדים"
msgstr "משרות, מחלקות, פרטי עובדים"
#. module: base
#: model:ir.module.module,description:base.module_analytic
@@ -545,6 +584,16 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"רכיב להגדרת עצמים לחישובי עלות (Analytic Accounts).\n"
"===============================================\n"
"\n"
"In OpenERP, analytic accounts are linked to general accounts but are "
"treated\n"
"totally independently. So, you can enter various different analytic "
"operations\n"
"that have no counterpart in the general financial accounts.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
@@ -568,6 +617,17 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"ארגון וניהול אירועים\n"
"======================================\n"
"\n"
"רכיב האירועים מאפשר את ניהול כל המשימות המשוייכות לאירוע בצורה יעילה: תכנון, "
"ניהול הרשמות, הגעה וכו'.\n"
"\n"
"תכונות עיקריות\n"
"------------\n"
"* ניהול אירועים והרשמות לאירועים\n"
"* שליחה אוטומטית של בקשות אישור הגעה בדוא\"ל\n"
#. module: base
#: selection:base.language.install,lang:0
@@ -622,7 +682,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (VE) / Español (VE)"
msgstr ""
msgstr "ספרדית(VE) / Español (VE)"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice
@@ -632,7 +692,7 @@ msgstr "חשבונית על גליון שעות"
#. module: base
#: view:base.module.upgrade:0
msgid "Your system will be updated."
msgstr ""
msgstr "המערכת תעודכן"
#. module: base
#: field:ir.actions.todo,note:0
@@ -648,7 +708,7 @@ msgstr "שם מדינה"
#. module: base
#: model:res.country,name:base.co
msgid "Colombia"
msgstr "Colombia"
msgstr "קולומביה"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_mister
@@ -661,7 +721,7 @@ msgid ""
"The ISO country code in two chars.\n"
"You can use this field for quick search."
msgstr ""
"צופן ה-ISO בשתי אותיות.\n"
"קוד מדינה ISO בשתי אותיות.\n"
"ניתן להשתמש בשדה זה לחיפוש מהיר."
#. module: base
@@ -705,22 +765,22 @@ msgstr "שדות מותאמים אישית חייבים להתחיל ב 'x_' !"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_mx
msgid "Mexico - Accounting"
msgstr ""
msgstr "מקסיקו - חשבונאות"
#. module: base
#: help:ir.actions.server,action_id:0
msgid "Select the Action Window, Report, Wizard to be executed."
msgstr "בחר בחלון הפעלה,דוח,אשף שתרצה לבצע."
msgstr "בחלון ההפעלה ניתן להפעיל אשף או דו\"ח להפעלה ."
#. module: base
#: sql_constraint:ir.config_parameter:0
msgid "Key must be unique."
msgstr ""
msgstr "יש לבחור מפתח ייחודי"
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_outlook
msgid "Outlook Plug-In"
msgstr ""
msgstr "תוסף Outlook"
#. module: base
#: model:ir.module.module,description:base.module_account
@@ -770,6 +830,12 @@ msgid ""
"Contains the installer for marketing-related modules.\n"
" "
msgstr ""
"\n"
"רכיב שיווק.\n"
"===================\n"
"\n"
"מכיל את ההתקנות לרכיבי שיווק.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_web_linkedin
@@ -795,7 +861,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.jo
msgid "Jordan"
msgstr "Jordan"
msgstr "ירדן"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
@@ -815,7 +881,7 @@ msgstr "ir.ui.view"
#. module: base
#: model:res.country,name:base.er
msgid "Eritrea"
msgstr "Eritrea"
msgstr "אריתריאה"
#. module: base
#: sql_constraint:res.company:0
@@ -934,7 +1000,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_crm_config_opportunity
msgid "Opportunities"
msgstr ""
msgstr "הזדמנויות"
#. module: base
#: model:ir.model,name:base.model_base_language_export
@@ -950,6 +1016,7 @@ msgstr "Papua New Guinea"
#: help:ir.actions.report.xml,report_type:0
msgid "Report Type, e.g. pdf, html, raw, sxw, odt, html2html, mako2html, ..."
msgstr ""
"סוג (פורמט) הדו\"ח, כגון: pdf, html, raw, sxw, odt, html2html, mako2html..."
#. module: base
#: model:ir.module.module,shortdesc:base.module_document_webdav
@@ -970,7 +1037,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "My Partners"
msgstr ""
msgstr "השותפים שלי"
#. module: base
#: model:res.country,name:base.zw
@@ -986,7 +1053,7 @@ msgstr ""
#. module: base
#: view:ir.actions.report.xml:0
msgid "XML Report"
msgstr ""
msgstr "דו\"ח XML"
#. module: base
#: model:res.country,name:base.es
@@ -1002,7 +1069,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
msgstr "שדרוג הרכיב"
#. module: base
#: selection:base.language.install,lang:0
@@ -1244,6 +1311,8 @@ msgid ""
"Language with code \"%s\" is not defined in your system !\n"
"Define it through the Administration menu."
msgstr ""
"שפה עם קוד \"%s\" אינה מוגדרת במערכת שלך!\n"
"הגדר אותה באמצעות תפריט הניהול."
#. module: base
#: model:res.country,name:base.gu
@@ -1280,7 +1349,7 @@ msgstr "מדומה"
#. module: base
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML לא בתוקף להצגת ארכיטקטורה"
msgstr "XML לא חוקי להצגת ארכיטקטורה"
#. module: base
#: model:res.country,name:base.ky
@@ -2597,7 +2666,7 @@ msgstr "שער נוכחי"
#. module: base
#: selection:base.language.install,lang:0
msgid "Greek / Ελληνικά"
msgstr ""
msgstr "יוונית / Ελληνικά"
#. module: base
#: field:res.company,custom_footer:0
@@ -5688,7 +5757,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_base_language_import
msgid "Language Import"
msgstr ""
msgstr "ייבוא שפה"
#. module: base
#: help:workflow.transition,act_from:0
@@ -7906,7 +7975,7 @@ msgstr ""
#: code:addons/base/res/res_users.py:473
#, python-format
msgid "Setting empty passwords is not allowed for security reasons!"
msgstr ""
msgstr "לא ניתן להגדיר סיסמה ריקה מטעמי אבטחה !"
#. module: base
#: help:ir.mail_server,smtp_pass:0
@@ -11018,7 +11087,7 @@ msgstr "הערה"
#: field:ir.rule,domain_force:0
#: field:res.partner.title,domain:0
msgid "Domain"
msgstr "מתחם"
msgstr "שם-מתחם (דומיין)"
#. module: base
#: code:addons/base/ir/ir_fields.py:166
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:47+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:44+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:15+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:45+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:16+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:45+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:14+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:43+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:16+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:45+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:16+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:45+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:16+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:45+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:16+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:46+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:16+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:46+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:17+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:46+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:13+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:42+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:50+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:17+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:46+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:17+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:47+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+6 -6
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: 2013-04-10 05:17+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:47+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -1611,7 +1611,7 @@ msgstr "Uganda"
#. module: base
#: field:ir.model.access,perm_unlink:0
msgid "Delete Access"
msgstr "Ștergeti accesul"
msgstr "Acces Ștergere"
#. module: base
#: model:res.country,name:base.ne
@@ -8839,7 +8839,7 @@ msgstr ""
#. module: base
#: field:ir.model.access,perm_create:0
msgid "Create Access"
msgstr "Creeaza Acces"
msgstr "Acces Creare"
#. module: base
#: model:ir.module.module,description:base.module_hr_timesheet
@@ -8914,7 +8914,7 @@ msgstr "Modul de Instalare Imediata"
#. module: base
#: view:ir.actions.server:0
msgid "Field Mapping"
msgstr "Mapare camp"
msgstr "Mapare câmp"
#. module: base
#: field:ir.model.fields,ttype:0
@@ -11687,7 +11687,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin
msgid "CRM Plugins"
msgstr "Aplicatie MRC"
msgstr "Aplicație MRC"
#. module: base
#: model:ir.actions.act_window,name:base.action_model_model
+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: 2013-04-10 05:17+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:47+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -25,7 +25,7 @@ msgid ""
" "
msgstr ""
"\n"
"Модуль для проверки написания и проверки печати.\n"
"Модуль для составления и распечатки квитанций.\n"
"================================================\n"
" "
@@ -15165,7 +15165,7 @@ msgstr "Лимит"
#. module: base
#: model:res.groups,name:base.group_hr_user
msgid "Officer"
msgstr "Сотрудник"
msgstr "Кадровик"
#. module: base
#: code:addons/orm.py:787
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:47+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:48+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:12+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:41+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:47+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:21+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:51+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:48+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:18+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:48+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:48+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+179 -39
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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:48+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -140,7 +140,7 @@ msgstr ""
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr "Tedarik argümanlar"
msgstr "Tedarik argümanları"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@@ -396,6 +396,14 @@ msgid ""
"document and Wiki based Hidden.\n"
" "
msgstr ""
"\n"
"Bilgi Birikimi-Gizli tabanlı kurucusu.\n"
"=====================================\n"
"\n"
"Bilgi Birikimi Uygulama Yapılandırmasını belgeyi ve Wiki tabanlı Gizli "
"modülünü kurduğunuz\n"
"yerden yapmanızı sağlar.\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
@@ -414,6 +422,9 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
"\n"
"Teslimat yöntemlerin de satış siparişleri eklemek ve toplama için izin "
"verir\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
@@ -422,6 +433,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Zaten %(model)s için varsayılan bir paylaşımlı süzgeç var, yeni bir "
"varsayılan ayarlamadan önce onu silin ya da değiştirin"
#. module: base
#: code:addons/orm.py:2649
@@ -490,6 +503,8 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Geçersiz tarih/zaman yönergesi belirlenmiş. Lütfen bir dil düzenlerken "
"görüntülenen izin verilen yönerge listesine bakın."
#. module: base
#: code:addons/orm.py:4153
@@ -643,6 +658,20 @@ msgid ""
" A + B + C -> D + E\n"
" "
msgstr ""
"\n"
"Bu modül, bir üretim emrinden birçok ürün üretmenizi sağlar.\n"
"==============================================================\n"
"\n"
"Ürün ağaçlarında yan ürünler tanımlayabilirsiniz.\n"
"\n"
"Bu modül olmadan:\n"
"--------------------\n"
" A + B + C -> D\n"
"\n"
"Bu modül ile:\n"
"-----------------\n"
" A + B + C -> D + E\n"
" "
#. module: base
#: selection:base.language.install,lang:0
@@ -779,6 +808,32 @@ msgid ""
"module named account_voucher.\n"
" "
msgstr ""
"\n"
"Muhasebe ve Mali Yönetim.\n"
"==============================\n"
"\n"
"Mali ve muhasebe modülünün içeriği:\n"
"--------------------------------------------\n"
" * Genel Muhasebe\n"
" * Maliyet/Analitik muhasebe\n"
" * Üçüncü parti muhasebesi\n"
" * Vergi yönetimi\n"
" * Bütçeler\n"
" * Müşteri ve Tedarikçi Faturaları\n"
" * Banka hesap özetleri\n"
" * İş Ortağına göre Uzlaşma işlemi\n"
"\n"
"Hesaplar için aşağıdakileri içeren bir pano oluşturur:\n"
"--------------------------------------------------\n"
" * Onaylanacak Müşteri Faturası listesi\n"
" * Firma İncelemesi\n"
" * Hazine Grafiği\n"
"\n"
"Büyük defterin bakım işlemleri gibi işler tanımlı mali günlükler yoluyla "
"yapılır (kalem hareket kaydı ya da gruplama günlükler yoluyla yapılır) \n"
"belirli mali yıl için ve fişlerin hazırlanması için account_voucher adlı bir "
"modül vardır.\n"
" "
#. module: base
#: view:ir.model:0
@@ -796,6 +851,12 @@ msgid ""
"Contains the installer for marketing-related modules.\n"
" "
msgstr ""
"\n"
"Pazarlama Menüsü.\n"
"===================\n"
"\n"
"Pazarlama-ilişkili modülleri kurar.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_web_linkedin
@@ -831,7 +892,7 @@ msgstr "Ürdün"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
msgid "Croatia - RRIF 2012 COA"
msgstr ""
msgstr "Hırvatistan - RRIF 2012 COA"
#. module: base
#: help:ir.cron,nextcall:0
@@ -1016,7 +1077,7 @@ msgstr "Zimbabve"
#: help:ir.model.constraint,type:0
msgid ""
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
msgstr ""
msgstr "Kısıt türleri: 'f' yabancı anahtar için, 'u' diğer kısıtlar için."
#. module: base
#: view:ir.actions.report.xml:0
@@ -1838,6 +1899,10 @@ msgid ""
"Launch Manually Once: after having been launched manually, it sets "
"automatically to Done."
msgstr ""
"Elle: Elle çalıştırılan.\n"
"Otomatik: Sistem yeniden yapılandırıldığında çalışır.\n"
"Bir Kez Elle Çalıştır: elle çalıştırıldıktan sonra, otomatik olarak Yapıldı "
"olarak ayarlanır."
#. module: base
#: field:res.partner,image_small:0
@@ -2214,6 +2279,7 @@ msgstr ""
#: view:base.language.export:0
msgid "PO(T) format: you should edit it with a PO editor such as"
msgstr ""
"PO(T) biçimi: PO düzenleyici ile düzenlemeniz gerekebilir, örnek olarak"
#. module: base
#: model:ir.ui.menu,name:base.menu_administration
@@ -2325,6 +2391,8 @@ msgid ""
"Appears by default on the top right corner of your printed documents (report "
"header)."
msgstr ""
"Varsayılan olarak basılı belgelerinizin üst sağ köşesinde belirir (rapor "
"başlığı)."
#. module: base
#: field:base.module.update,update:0
@@ -2339,7 +2407,7 @@ msgstr "Yöntem"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_crypt
msgid "Password Encryption"
msgstr ""
msgstr "Parola Şifreleme"
#. module: base
#: view:workflow.activity:0
@@ -2443,6 +2511,10 @@ msgid ""
"=================================\n"
" "
msgstr ""
"\n"
"Portala isimsiz Erişim sağlar.\n"
"=================================\n"
" "
#. module: base
#: model:res.country,name:base.ge
@@ -2697,6 +2769,10 @@ msgid ""
"==================================\n"
" "
msgstr ""
"\n"
"Birleşik Devletler - Hesap Planı.\n"
"==================================\n"
" "
#. module: base
#: field:ir.actions.act_url,target:0
@@ -2711,7 +2787,7 @@ msgstr "Anguilla"
#. module: base
#: model:ir.actions.report.xml,name:base.report_ir_model_overview
msgid "Model Overview"
msgstr ""
msgstr "Model Gözden Geçirme"
#. module: base
#: model:ir.module.module,shortdesc:base.module_product_margin
@@ -3029,7 +3105,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:174
#, python-format
msgid "'%s' does not seem to be an integer for field '%%(field)s'"
msgstr ""
msgstr "'%s' bu alan '%%(field)s' için bir tamsayı olarak görünmüyor"
#. module: base
#: model:ir.module.category,description:base.module_category_report_designer
@@ -3090,7 +3166,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_linkedin
msgid "LinkedIn Integration"
msgstr ""
msgstr "Linkedin Entegrasyonu"
#. module: base
#: code:addons/orm.py:2021
@@ -3116,7 +3192,7 @@ msgstr "Hata!"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_rib
msgid "French RIB Bank Details"
msgstr ""
msgstr "Fransa RIB Banka Ayrıntıları"
#. module: base
#: view:res.lang:0
@@ -3139,6 +3215,8 @@ msgid ""
"the user will have an access to the sales configuration as well as statistic "
"reports."
msgstr ""
"kullanıcı hem satış yapılandırmasına hem de istatistik raporlarına erişim "
"yapabilecektir."
#. module: base
#: model:res.country,name:base.nz
@@ -3223,6 +3301,8 @@ msgid ""
"the user will have an access to the human resources configuration as well as "
"statistic reports."
msgstr ""
"kullanıcı hem insan kaynakları yapılandırmasına hem de istatistik "
"raporlarına erişecektir."
#. module: base
#: model:ir.module.module,description:base.module_l10n_pl
@@ -3244,7 +3324,7 @@ msgstr ""
#. module: base
#: field:ir.actions.client,params_store:0
msgid "Params storage"
msgstr ""
msgstr "Değişke depolama"
#. module: base
#: code:addons/base/module/module.py:525
@@ -3636,6 +3716,8 @@ msgstr "Malta"
msgid ""
"Only users with the following access level are currently allowed to do that"
msgstr ""
"Bunu yalnızca aşağıdaki erişim izni düzeylerine sahip kullanıcılar "
"yapabilecektir"
#. module: base
#: field:ir.actions.server,fields_lines:0
@@ -3794,7 +3876,7 @@ msgstr "Sağdan Sola"
#. module: base
#: model:res.country,name:base.sx
msgid "Sint Maarten (Dutch part)"
msgstr ""
msgstr "Sint Maarten (Hollanda bölümü)"
#. module: base
#: view:ir.actions.act_window:0
@@ -3987,11 +4069,22 @@ msgid ""
"If you need to manage your meetings, you should install the CRM module.\n"
" "
msgstr ""
"\n"
"Bu bir tam-özellikli takvim sistemidir.\n"
"========================================\n"
"\n"
"Bunları destekler:\n"
"------------\n"
" - Takvim etkinlikleri\n"
" - Yinelenen etkinlikler\n"
"\n"
"Toplantılarınızı yönetmek istiyorsanız, CRM modülünü kurmalısınız.\n"
" "
#. module: base
#: model:res.country,name:base.je
msgid "Jersey"
msgstr ""
msgstr "Jersey"
#. module: base
#: model:ir.model,name:base.model_ir_translation
@@ -4225,7 +4318,7 @@ msgstr "Ltd."
#. module: base
#: model:ir.actions.server,name:base.action_run_ir_action_todo
msgid "Run Remaining Action Todo"
msgstr ""
msgstr "Kalan Yapılacak Eylemleri Çalıştır"
#. module: base
#: field:res.partner,ean13:0
@@ -4473,7 +4566,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_sale
msgid "Quotations, Sales Orders, Invoicing"
msgstr ""
msgstr "Teklifler, Satış Siparişleri, Faturalama"
#. module: base
#: field:res.partner,parent_id:0
@@ -4571,7 +4664,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_project_timesheet
msgid "Bill Time on Tasks"
msgstr ""
msgstr "Görevlerin Faturalama Süresi"
#. module: base
#: model:ir.module.category,name:base.module_category_marketing
@@ -4594,6 +4687,10 @@ msgid ""
"==========================\n"
"\n"
msgstr ""
"\n"
"OpenERP Web Takvim görünümü.\n"
"==========================\n"
"\n"
#. module: base
#: selection:base.language.install,lang:0
@@ -4774,7 +4871,7 @@ msgstr "Ekvatoral Gine"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_api
msgid "OpenERP Web API"
msgstr ""
msgstr "OpenERP Web API"
#. module: base
#: model:ir.module.module,description:base.module_l10n_fr_rib
@@ -4967,7 +5064,7 @@ msgid ""
"object.partner_id.name ]]`"
msgstr ""
"E-posta içeriği, Mesajın içinde çift parantez içine alınmış ifadeler "
"içerebilir ör. `Sevgili [[object.partner_id.name]]`"
"içerebilir ör. `Sayın [[object.partner_id.name]]`"
#. module: base
#: model:ir.actions.act_window,name:base.action_workflow_form
@@ -5009,12 +5106,12 @@ msgstr "Endüstrilere Özel Uygulamalar"
#. module: base
#: model:ir.module.module,shortdesc:base.module_google_docs
msgid "Google Docs integration"
msgstr ""
msgstr "Google Docs entegrasyonu"
#. module: base
#: help:ir.attachment,res_model:0
msgid "The database object this attachment will be attached to"
msgstr ""
msgstr "Bu ekin ekleneceği veritabanı nesnesi"
#. module: base
#: code:addons/base/ir/ir_fields.py:327
@@ -5076,12 +5173,12 @@ msgstr "Lesoto"
#. module: base
#: view:base.language.export:0
msgid ", or your preferred text editor"
msgstr ""
msgstr ", ya da yeğlediğiniz metin düzenleyicisi"
#. module: base
#: model:ir.module.module,shortdesc:base.module_crm_partner_assign
msgid "Partners Geo-Localization"
msgstr ""
msgstr "İş Ortağı Coğ-Yerelleştirmesi"
#. module: base
#: model:res.country,name:base.ke
@@ -5209,6 +5306,18 @@ msgid ""
" \n"
"%(country_code)s: the code of the country"
msgstr ""
"Burada, bu ülkeye ait olağan adres biçimin belirtebilirsiniz.\n"
"\n"
"Bütün adres alanlarında python-tarzı cümle biçimi kullanabilirsiniz "
"(örneğin, 'cadde' alanını göstermek için '%(street)s' etiketini kullanın\n"
" \n"
"%(state_name)s: bölge adı\n"
" \n"
"%(state_code)s: bölge kodu\n"
" \n"
"%(country_name)s: ülke adı\n"
" \n"
"%(country_code)s: ülke kodu"
#. module: base
#: model:res.country,name:base.mu
@@ -5241,7 +5350,7 @@ msgstr "Portekizce / Português"
#: code:addons/base/ir/ir_model.py:373
#, python-format
msgid "Changing the storing system for field \"%s\" is not allowed."
msgstr ""
msgstr "\"%s\" alanı için depolama sistemini değiştirmeye izin verilmez."
#. module: base
#: help:res.partner.bank,company_id:0
@@ -5252,7 +5361,7 @@ msgstr "Sadece eğer bu banka hesapları şirketinize ait ise"
#: code:addons/base/ir/ir_fields.py:337
#, python-format
msgid "Unknown sub-field '%s'"
msgstr ""
msgstr "Bilinmeyen alt-alan '%s'"
#. module: base
#: model:res.country,name:base.za
@@ -5291,6 +5400,12 @@ msgid ""
"Collects web application usage with Google Analytics.\n"
" "
msgstr ""
"\n"
"Google Analytics.\n"
"=================\n"
"\n"
"Google Analytics ile web uygulama kullanımını toplar.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_recruitment
@@ -5367,6 +5482,10 @@ msgid ""
"================\n"
"\n"
msgstr ""
"\n"
"Openerp Web API.\n"
"================\n"
"\n"
#. module: base
#: selection:res.request,state:0
@@ -5385,7 +5504,7 @@ msgstr "Tarih"
#. module: base
#: model:ir.module.module,shortdesc:base.module_event_moodle
msgid "Event Moodle"
msgstr ""
msgstr "Moodle Etkinliği"
#. module: base
#: model:ir.module.module,description:base.module_email_template
@@ -5514,7 +5633,7 @@ msgstr ""
#. module: base
#: help:ir.actions.client,res_model:0
msgid "Optional model, mostly used for needactions."
msgstr ""
msgstr "Seçmel model, genelde gereksinim duyulan eylemler için kullanılır."
#. module: base
#: code:addons/base/module/module.py:306
@@ -5769,6 +5888,9 @@ msgid ""
" <p>You should try others search criteria.</p>\n"
" "
msgstr ""
"<p><b>Hiç modül bulunamadı!</b></p>\n"
" <p>Farklı arama kriteri kullanabilirsiniz.</p>\n"
" "
#. module: base
#: model:ir.model,name:base.model_ir_module_module
@@ -6014,6 +6136,10 @@ msgid ""
"===============================================\n"
" "
msgstr ""
"\n"
"Kullanıcıların kaydolmasını ve parola sıfırlamasını sağlar\n"
"===============================================\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_usability
@@ -6105,6 +6231,12 @@ msgid ""
"Allows users to create custom dashboard.\n"
" "
msgstr ""
"\n"
"Kullanıcının özel pano oluşturmasını sağlar.\n"
"========================================\n"
"\n"
"Kullanıcıların özel pano oluşturmasına izin verir.\n"
" "
#. module: base
#: model:ir.actions.act_window,name:base.ir_access_act
@@ -6123,6 +6255,8 @@ msgid ""
"How many times the method is called,\n"
"a negative number indicates no limit."
msgstr ""
"Yöntemin ne kadar çalıştırılacağını belirtir,\n"
"eksi sayı sınırsız olduğunu belirtir."
#. module: base
#: field:res.partner.bank.type.field,bank_type_id:0
@@ -6239,18 +6373,22 @@ msgid ""
"========================\n"
"\n"
msgstr ""
"\n"
"OpenERP Web kanban görünümü.\n"
"========================\n"
"\n"
#. module: base
#: code:addons/base/ir/ir_fields.py:182
#, python-format
msgid "'%s' does not seem to be a number for field '%%(field)s'"
msgstr ""
msgstr "'%s' bu '%%(field)s' alanı için bir sayı olarak görünmüyor"
#. module: base
#: help:res.country.state,name:0
msgid ""
"Administrative divisions of a country. E.g. Fed. State, Departement, Canton"
msgstr ""
msgstr "Bir ülkenin idari bölümleri. örn. Eyalet, Bölge, Kanton"
#. module: base
#: view:res.partner.bank:0
@@ -6414,7 +6552,7 @@ msgstr "Günlük Kaydı İptal"
#. module: base
#: field:res.partner,tz_offset:0
msgid "Timezone offset"
msgstr ""
msgstr "Zaman dilimi sapması"
#. module: base
#: model:ir.module.module,description:base.module_marketing_campaign
@@ -8027,12 +8165,12 @@ msgstr "Firma Banka Hesapları"
#: code:addons/base/res/res_users.py:473
#, python-format
msgid "Setting empty passwords is not allowed for security reasons!"
msgstr "Güvenlik sebebiyle boş şifrelere izin verilmemektedir!"
msgstr "Güvenlik nedeniyle boş parolalara izin verilmemektedir!"
#. module: base
#: help:ir.mail_server,smtp_pass:0
msgid "Optional password for SMTP authentication"
msgstr "SMTP kimlik doğrulaması için şifre (opsiyonel)"
msgstr "SMTP kimlik doğrulaması için seçmeli parola"
#. module: base
#: code:addons/base/ir/ir_model.py:728
@@ -11036,7 +11174,7 @@ msgstr ""
#. module: base
#: field:ir.attachment,res_model:0
msgid "Resource Model"
msgstr "Kayanak Model"
msgstr "Kaynak Model"
#. module: base
#: code:addons/custom.py:555
@@ -12416,7 +12554,7 @@ msgstr "Bordro Muhasebesi"
#. module: base
#: view:res.users:0
msgid "Change password"
msgstr "Şifreyi değiştir"
msgstr "Parolayı değiştir"
#. module: base
#: model:res.country,name:base.sr
@@ -12471,7 +12609,7 @@ msgstr "Adres Biçimi"
#. module: base
#: model:ir.model,name:base.model_change_password_user
msgid "Change Password Wizard User"
msgstr ""
msgstr "Parola Değiştirme Sihirbazı Kullanıcısı"
#. module: base
#: model:res.groups,name:base.group_no_one
@@ -12769,7 +12907,7 @@ msgstr ""
#. module: base
#: selection:base.language.export,state:0
msgid "choose"
msgstr "seçme"
msgstr "seç"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:445
@@ -12898,7 +13036,7 @@ msgstr "Kıbrıs"
#. module: base
#: field:res.users,new_password:0
msgid "Set Password"
msgstr "Parola Ayarlama"
msgstr "Parola Ayarla"
#. module: base
#: field:ir.actions.server,subject:0
@@ -14107,7 +14245,7 @@ msgstr "Tayland"
#. module: base
#: model:ir.model,name:base.model_change_password_wizard
msgid "Change Password Wizard"
msgstr ""
msgstr "Parola Değiştirme Sihirbazı"
#. module: base
#: model:ir.module.module,summary:base.module_account_voucher
@@ -14388,7 +14526,7 @@ msgstr "Planlanmış Güncellemeleri Uygula"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_journal
msgid "Invoicing Journals"
msgstr "Faturalama Yevmiye Defterleri"
msgstr "Faturalama Günlükleri"
#. module: base
#: help:ir.ui.view,groups_id:0
@@ -14543,7 +14681,7 @@ msgstr "Erişim"
#: field:res.partner,vat:0
#, python-format
msgid "TIN"
msgstr "V.No"
msgstr "Vergi N°"
#. module: base
#: model:res.country,name:base.aw
@@ -14860,6 +14998,8 @@ msgid ""
"Helps you handle your accounting needs, if you are not an accountant, we "
"suggest you to install only the Invoicing."
msgstr ""
"Muhasebe gereksinimlerinizi yürütmenizi sağlar, muhasebeci değilseniz "
"yalnızca Faturalamayı kurmanızı öneririz."
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_thunderbird
+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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+55 -9
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: 2013-04-10 05:21+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:51+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -575,6 +575,14 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"用于定义财务分析项目的模块。\n"
"================================================\n"
"\n"
"在OpenERP中,财务分析虽与常规财务相连,但却是\n"
"完全独立的。因此,可以使用许多不同的分析操作,\n"
"即使在常规财务会计模块中没有对应功能。\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
@@ -837,7 +845,7 @@ msgstr ""
"\n"
"OpenERP Web LinkedIn 模块.\n"
"============================\n"
"这个模块在OpenERP上提供了一体化的Linke dIn\n"
"此模块用于在OpenERP中集成LinkedIn.\n"
" "
#. module: base
@@ -864,7 +872,7 @@ msgstr ""
#. module: base
#: help:ir.cron,nextcall:0
msgid "Next planned execution date for this job."
msgstr "此任务的下一次执行时间"
msgstr "该任务的下次执行日期"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view
@@ -1094,7 +1102,10 @@ msgid ""
" "
msgstr ""
"\n"
"这模块目的是管理员工的考勤 根据执行的签入/签出的动作保存员工帐户的考勤记录。\n"
"此模块用于管理员工的考勤.\n"
"==================================================\n"
"\n"
"以员工的登入/退出时间为准,记录员工考勤.\n"
" "
#. module: base
@@ -1215,7 +1226,7 @@ msgstr "TGZ 压缩包"
#: view:res.groups:0
msgid ""
"Users added to this group are automatically added in the following groups."
msgstr "若有用户添加至本组时自动将用户添加到下面的组。"
msgstr "加入本群组的用户也将自动加入以下群组."
#. module: base
#: code:addons/base/ir/ir_model.py:733
@@ -1768,6 +1779,20 @@ msgid ""
"in their pockets, this module is essential.\n"
" "
msgstr ""
"\n"
"管理午餐的基本模块\n"
"================================\n"
"\n"
"许多公司为给员工提供便利,会从熟悉的餐厅为其员工预定象三明治、披萨饼或其它形式的午餐。\n"
"\n"
"然而公司内部的午餐预定需要适当的管理,尤其是当员工和餐厅数量比较多的情况下。\n"
"\n"
"我们开发的“午餐订购”模块会使这个管理工作变得简单,并给员工提供了更多的工具盒便利。 \n"
"\n"
"除了提供完备的餐食和餐厅管理,本模块还可以根据员工的喜好提供快速订餐选项和显示提示信息。 \n"
"\n"
"如果想节省员工的时间,避免他们总是要准备很多零钱,这个模块就是必须的。\n"
" "
#. module: base
#: view:wizard.ir.model.menu.create:0
@@ -1810,7 +1835,7 @@ msgstr "该业务伙伴或者公司的网站"
msgid ""
"If you check this box, your customized translations will be overwritten and "
"replaced by the official ones."
msgstr "如果勾上这个勾,数据库中的翻译将被服务器上的po文件中的翻译覆盖"
msgstr "如果选定,则定制翻译会被系统翻译覆盖替换。"
#. module: base
#: model:ir.actions.act_window,name:base.ir_action_report_xml
@@ -2791,6 +2816,9 @@ msgid ""
"==================================\n"
" "
msgstr ""
"\n"
"美国 - 会计科目\n"
" "
#. module: base
#: field:ir.actions.act_url,target:0
@@ -2847,6 +2875,16 @@ msgid ""
" * Files by Partner (graph)\n"
" * Files Size by Month (graph)\n"
msgstr ""
"\n"
"这是一个完整的文档管理系统。\n"
"================================================\n"
" * 用户身份验证\n"
" * 文档索引:在Windows平台上不支持pptx和docx格式文件。\n"
" * 文档面板包含:\n"
" * 新文件列表\n"
" * 按资源类型的文件图表\n"
" * 按合作者的文件图表\n"
" * 按月的文件大小图表\n"
#. module: base
#: view:ir.actions.report.xml:0
@@ -2998,6 +3036,14 @@ msgid ""
"This module is currently not compatible with the ``user_ldap`` module and\n"
"will disable LDAP authentication completely if installed at the same time.\n"
msgstr ""
"\n"
"加密密码\n"
"===================\n"
"\n"
"LDAP身份验证的内部功能:\n"
"-------------------------------\n"
"当前该模块与``user_ldap``模块并不兼容\n"
"如果二者同时安装,会禁用LDAP身份验证。\n"
#. module: base
#: model:res.groups,name:base.group_hr_manager
@@ -12206,7 +12252,7 @@ msgstr "报表类型"
#: view:res.partner.bank:0
#: view:res.users:0
msgid "State"
msgstr "状态"
msgstr "省"
#. module: base
#: selection:base.language.install,lang:0
@@ -14559,7 +14605,7 @@ msgstr "源模型"
#. module: base
#: view:ir.sequence:0
msgid "Day of the Week (0:Monday): %(weekday)s"
msgstr ""
msgstr "一周的第几天 (0:星期一):%(weekday)s"
#. module: base
#: code:addons/base/module/wizard/base_module_upgrade.py:84
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-10 05:19+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:49+0000\n"
"X-Generator: Launchpad (build 16598)\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: 2013-04-10 05:20+0000\n"
"X-Generator: Launchpad (build 16550)\n"
"X-Launchpad-Export-Date: 2013-05-10 05:50+0000\n"
"X-Generator: Launchpad (build 16598)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+14 -6
View File
@@ -31,9 +31,12 @@ from openerp.osv import fields, osv
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools.translate import _
from openerp.modules import load_information_from_description_file
_logger = logging.getLogger(__name__)
BASE_VERSION = load_information_from_description_file('base')['version']
def str2tuple(s):
return eval('tuple(%s)' % (s or ''))
@@ -195,12 +198,17 @@ class ir_cron(osv.osv):
cr = db.cursor()
jobs = []
try:
# Careful to compare timestamps with 'UTC' - everything is UTC as of v6.1.
cr.execute("""SELECT * FROM ir_cron
WHERE numbercall != 0
AND active AND nextcall <= (now() at time zone 'UTC')
ORDER BY priority""")
jobs = cr.dictfetchall()
# Make sure the database we poll has the same version as the code of base
cr.execute("SELECT 1 FROM ir_module_module WHERE name=%s AND latest_version=%s", ('base', BASE_VERSION))
if cr.fetchone():
# Careful to compare timestamps with 'UTC' - everything is UTC as of v6.1.
cr.execute("""SELECT * FROM ir_cron
WHERE numbercall != 0
AND active AND nextcall <= (now() at time zone 'UTC')
ORDER BY priority""")
jobs = cr.dictfetchall()
else:
_logger.warning('Skipping database %s as its base version is not %s.', db_name, BASE_VERSION)
except psycopg2.ProgrammingError, e:
if e.pgcode == '42P01':
# Class 42 — Syntax Error or Access Rule Violation; 42P01: undefined_table
+13
View File
@@ -863,11 +863,24 @@ class ir_model_data(osv.osv):
def get_object_reference(self, cr, uid, module, xml_id):
"""Returns (model, res_id) corresponding to a given module and xml_id (cached) or raise ValueError if not found"""
data_id = self._get_id(cr, uid, module, xml_id)
#assuming data_id is not False, as it was checked upstream
res = self.read(cr, uid, data_id, ['model', 'res_id'])
if not res['res_id']:
raise ValueError('No such external ID currently defined in the system: %s.%s' % (module, xml_id))
return res['model'], res['res_id']
def check_object_reference(self, cr, uid, module, xml_id, raise_on_access_error=False):
"""Returns (model, res_id) corresponding to a given module and xml_id (cached), if and only if the user has the necessary access rights
to see that object, otherwise raise a ValueError if raise_on_access_error is True or returns a tuple (model found, False)"""
model, res_id = self.get_object_reference(cr, uid, module, xml_id)
#search on id found in result to check if current user has read access right
check_right = self.pool.get(model).search(cr, uid, [('id', '=', res_id)])
if check_right:
return model, res_id
if raise_on_access_error:
raise ValueError('Not enough access rights on the external ID: %s.%s' % (module, xml_id))
return model, False
def get_object(self, cr, uid, module, xml_id, context=None):
"""Returns a browsable record for the given module name and xml_id or raise ValueError if not found"""
res_model, res_id = self.get_object_reference(cr, uid, module, xml_id)
+3 -3
View File
@@ -217,7 +217,7 @@ class ir_sequence(openerp.osv.osv.osv):
def next_by_id(self, cr, uid, sequence_id, context=None):
""" Draw an interpolated string using the specified sequence."""
self.check_access_rights(cr, uid, 'read')
company_ids = self.pool.get('res.company').search(cr, uid, [], order='company_id', context=context) + [False]
company_ids = self.pool.get('res.company').search(cr, uid, [], context=context) + [False]
ids = self.search(cr, uid, ['&',('id','=', sequence_id),('company_id','in',company_ids)])
return self._next(cr, uid, ids, context)
@@ -234,8 +234,8 @@ class ir_sequence(openerp.osv.osv.osv):
specific company will get higher priority.
"""
self.check_access_rights(cr, uid, 'read')
company_ids = self.pool.get('res.company').search(cr, uid, [], order='company_id', context=context) + [False]
ids = self.search(cr, uid, ['&',('code','=', sequence_code),('company_id','in',company_ids)])
company_ids = self.pool.get('res.company').search(cr, uid, [], context=context) + [False]
ids = self.search(cr, uid, ['&', ('code', '=', sequence_code), ('company_id', 'in', company_ids)])
return self._next(cr, uid, ids, context)
def get_id(self, cr, uid, sequence_code_or_id, code_or_id='id', context=None):
+25
View File
@@ -299,8 +299,33 @@ class ir_ui_menu(osv.osv):
- the needaction counter of the related action, taking into account
the action domain
"""
if context is None:
context = {}
res = {}
menu_ids = set()
for menu in self.browse(cr, uid, ids, context=context):
menu_ids.add(menu.id)
ctx = None
if menu.action and menu.action.type in ('ir.actions.act_window', 'ir.actions.client') and menu.action.context:
try:
# use magical UnquoteEvalContext to ignore undefined client-side variables such as `active_id`
eval_ctx = tools.UnquoteEvalContext(**context)
ctx = eval(menu.action.context, locals_dict=eval_ctx, nocopy=True) or None
except Exception:
# if the eval still fails for some reason, we'll simply skip this menu
pass
menu_ref = ctx and ctx.get('needaction_menu_ref')
if menu_ref:
if not isinstance(menu_ref, list):
menu_ref = [menu_ref]
model_data_obj = self.pool.get('ir.model.data')
for menu_data in menu_ref:
model, id = model_data_obj.get_object_reference(cr, uid, menu_data.split('.')[0], menu_data.split('.')[1])
if (model == 'ir.ui.menu'):
menu_ids.add(id)
menu_ids = list(menu_ids)
for menu in self.browse(cr, uid, menu_ids, context=context):
res[menu.id] = {
'needaction_enabled': False,
'needaction_counter': False,
+1 -1
View File
@@ -100,7 +100,7 @@ class view(osv.osv):
else:
inferred_type = etree.fromstring(values['arch'].encode('utf8')).tag
values['name'] = "%s %s" % (values['model'], inferred_type)
return super(osv.osv, self).create(cr, uid, values, context)
return super(view, self).create(cr, uid, values, context)
def _relaxng(self):
if not self._relaxng_validator:
+1
View File
@@ -472,6 +472,7 @@ class module(osv.osv):
function(cr, uid, ids, context=context)
cr.commit()
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
registry = openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True)
config = registry['res.config'].next(cr, uid, [], context=context) or {}
@@ -246,7 +246,7 @@
</para>
</section>
<section>
<para style="P1">[[ repeatIn(findflds(object.model), 'field') ]]</para>
<para style="P1">[[ repeatIn(findflds(object.model, module.name), 'field') ]]</para>
<blockTable colWidths="113.0,397.0" repeatRows="1" style="Table2">
<tr>
<td>
@@ -64,17 +64,24 @@ class ir_module_reference_print(report_sxw.rml_parse):
return res
def _object_find(self, module):
ids2 = self.pool.get('ir.model.data').search(self.cr, self.uid, [('module','=',module), ('model','=','ir.model')])
ids2 = self.pool['ir.model.data'].search(self.cr, self.uid, [('module','=',module), ('model','=','ir.model')])
ids = []
for mod in self.pool.get('ir.model.data').browse(self.cr, self.uid, ids2):
for mod in self.pool['ir.model.data'].browse(self.cr, self.uid, ids2):
ids.append(mod.res_id)
modobj = self.pool.get('ir.model')
modobj = self.pool['ir.model']
return modobj.browse(self.cr, self.uid, ids)
def _fields_find(self, obj):
def _fields_find(self, obj, module):
res = []
data_obj = self.pool['ir.model.data']
modobj = self.pool[obj]
res = modobj.fields_get(self.cr, self.uid).items()
res.sort()
fname_wildcard = 'field_' + modobj._name.replace('.', '_') + '_%'
module_fields_ids = data_obj.search(self.cr, self.uid, [('model', '=', 'ir.model.fields'), ('module', '=', module), ('name', 'like', fname_wildcard)])
if module_fields_ids:
module_fields_res_ids = [x['res_id'] for x in data_obj.read(self.cr, self.uid, module_fields_ids, ['res_id'])]
module_fields_names = [x['name'] for x in self.pool['ir.model.fields'].read(self.cr, self.uid, module_fields_res_ids, ['name'])]
res = modobj.fields_get(self.cr, self.uid, allfields=module_fields_names).items()
res.sort()
return res
report_sxw.report_sxw('report.ir.module.reference', 'ir.module.module',
+2 -2
View File
@@ -158,8 +158,8 @@ class res_partner_bank(osv.osv):
'name': '/'
}
def fields_get(self, cr, uid, fields=None, context=None):
res = super(res_partner_bank, self).fields_get(cr, uid, fields, context)
def fields_get(self, cr, uid, allfields=None, context=None):
res = super(res_partner_bank, self).fields_get(cr, uid, allfields=allfields, context=context)
bank_type_obj = self.pool.get('res.partner.bank.type')
type_ids = bank_type_obj.search(cr, uid, [])
types = bank_type_obj.browse(cr, uid, type_ids)
+2 -2
View File
@@ -97,7 +97,7 @@ class res_company(osv.osv):
address_data = part_obj.address_get(cr, uid, [company.partner_id.id], adr_pref=['default'])
address = address_data['default']
if address:
part_obj.write(cr, uid, [address], {name: value or False})
part_obj.write(cr, uid, [address], {name: value or False}, context=context)
else:
part_obj.create(cr, uid, {name: value or False, 'parent_id': company.partner_id.id}, context=context)
return True
@@ -253,7 +253,7 @@ class res_company(osv.osv):
vals.update({'partner_id': partner_id})
self.cache_restart(cr)
company_id = super(res_company, self).create(cr, uid, vals, context=context)
obj_partner.write(cr, uid, partner_id, {'company_id': company_id}, context=context)
obj_partner.write(cr, uid, [partner_id], {'company_id': company_id}, context=context)
return company_id
def write(self, cr, uid, ids, values, context=None):
+48 -28
View File
@@ -31,6 +31,37 @@ from openerp import exceptions
_logger = logging.getLogger(__name__)
class res_config_module_installation_mixin(object):
def _install_modules(self, cr, uid, modules, context):
"""Install the requested modules.
return the next action to execute
modules is a list of tuples
(mod_name, browse_record | None)
"""
ir_module = self.pool.get('ir.module.module')
to_install_ids = []
to_install_missing_names = []
for name, module in modules:
if not module:
to_install_missing_names.append(name)
elif module.state == 'uninstalled':
to_install_ids.append(module.id)
if to_install_ids:
ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
if to_install_missing_names:
return {
'type': 'ir.actions.client',
'tag': 'apps',
'params': {'modules': to_install_missing_names},
}
return None
class res_config_configurable(osv.osv_memory):
''' Base classes for new-style configuration items
@@ -155,7 +186,7 @@ class res_config_configurable(osv.osv_memory):
res_config_configurable()
class res_config_installer(osv.osv_memory):
class res_config_installer(osv.osv_memory, res_config_module_installation_mixin):
""" New-style configuration base specialized for addons selection
and installation.
@@ -353,17 +384,18 @@ class res_config_installer(osv.osv_memory):
return fields
def execute(self, cr, uid, ids, context=None):
modules = self.pool['ir.module.module']
to_install = list(self.modules_to_install(
cr, uid, ids, context=context))
_logger.info('Selecting addons %s to install', to_install)
modules.state_update(
cr, uid,
modules.search(cr, uid, [('name','in',to_install)]),
'to install', ['uninstalled'], context=context)
cr.commit()
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True)
ir_module = self.pool.get('ir.module.module')
modules = []
for name in to_install:
mod_ids = ir_module.search(cr, uid, [('name', '=', name)])
record = ir_module.browse(cr, uid, mod_ids[0], context) if mod_ids else None
modules.append((name, record))
return self._install_modules(cr, uid, modules, context=context)
res_config_installer()
@@ -404,8 +436,7 @@ class ir_actions_configuration_wizard(osv.osv_memory):
ir_actions_configuration_wizard()
class res_config_settings(osv.osv_memory):
class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
""" Base configuration wizard for application settings. It provides support for setting
default values, assigning groups to employee users, and installing modules.
To make such a 'settings' wizard, define a model like::
@@ -529,33 +560,22 @@ class res_config_settings(osv.osv_memory):
getattr(self, method)(cr, uid, ids, context)
# module fields: install/uninstall the selected modules
to_install_missing_names = []
to_install = []
to_uninstall_ids = []
to_install_ids = []
lm = len('module_')
for name, module in classified['module']:
if config[name]:
if not module:
# missing module, will be provided by apps.openerp.com
to_install_missing_names.append(name[lm:])
elif module.state == 'uninstalled':
# local module, to be installed
to_install_ids.append(module.id)
to_install.append((name[lm:], module))
else:
if module and module.state in ('installed', 'to upgrade'):
to_uninstall_ids.append(module.id)
if to_uninstall_ids:
ir_module.button_immediate_uninstall(cr, uid, to_uninstall_ids, context=context)
if to_install_ids:
ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
if to_install_missing_names:
return {
'type': 'ir.actions.client',
'tag': 'apps',
'params': {'modules': to_install_missing_names},
}
action = self._install_modules(cr, uid, to_install, context=context)
if action:
return action
# After the uninstall/install calls, the self.pool is no longer valid.
# So we reach into the RegistryManager directly.
@@ -603,7 +623,7 @@ class res_config_settings(osv.osv_memory):
structured as follows: module_name.menuitem_xml_id (e.g.: "base.menu_sale_config")
:return tuple:
- t[0]: string: full path to the menuitem (e.g.: "Settings/Configuration/Sales")
- t[1]: long: id of the menuitem's action
- t[1]: int or long: id of the menuitem's action
"""
module_name, menu_xml_id = menu_xml_id.split('.')
dummy, menu_id = self.pool['ir.model.data'].get_object_reference(cr, uid, module_name, menu_xml_id)
+4
View File
@@ -30,7 +30,11 @@ from openerp.tools.translate import _
CURRENCY_DISPLAY_PATTERN = re.compile(r'(\w+)\s*(?:\((.*)\))?')
class res_currency(osv.osv):
def _current_rate(self, cr, uid, ids, name, arg, context=None):
return self._get_current_rate(cr, uid, ids, name, arg, context=context)
def _get_current_rate(self, cr, uid, ids, name, arg, context=None):
if context is None:
context = {}
res = {}
+226 -74
View File
@@ -30,6 +30,7 @@ from openerp import SUPERUSER_ID
from openerp import tools
from openerp.osv import osv, fields
from openerp.tools.translate import _
from openerp.tools.yaml_import import is_comment
class format_address(object):
def fields_view_get_address(self, cr, uid, arch, context={}):
@@ -159,8 +160,8 @@ def _lang_get(self, cr, uid, context=None):
res = lang_pool.read(cr, uid, ids, ['code', 'name'], context)
return [(r['code'], r['name']) for r in res]
POSTAL_ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id')
ADDRESS_FIELDS = POSTAL_ADDRESS_FIELDS + ('email', 'phone', 'fax', 'mobile', 'website', 'ref', 'lang')
# fields copy if 'use_parent_address' is checked
ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id')
class res_partner(osv.osv, format_address):
_description = 'Partner'
@@ -193,13 +194,42 @@ class res_partner(osv.osv, format_address):
result[obj.id] = obj.image != False
return result
_order = "name"
def _commercial_partner_compute(self, cr, uid, ids, name, args, context=None):
""" Returns the partner that is considered the commercial
entity of this partner. The commercial entity holds the master data
for all commercial fields (see :py:meth:`~_commercial_fields`) """
result = dict.fromkeys(ids, False)
for partner in self.browse(cr, uid, ids, context=context):
current_partner = partner
while not current_partner.is_company and current_partner.parent_id:
current_partner = current_partner.parent_id
result[partner.id] = current_partner.id
return result
def _display_name_compute(self, cr, uid, ids, name, args, context=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
_commercial_partner_id = lambda self, *args, **kwargs: self._commercial_partner_compute(*args, **kwargs)
_display_name = lambda self, *args, **kwargs: self._display_name_compute(*args, **kwargs)
_commercial_partner_store_triggers = {
'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)]),
['parent_id', 'is_company'], 10)
}
_display_name_store_triggers = {
'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)]),
['parent_id', 'is_company', 'name'], 10)
}
_order = "display_name"
_columns = {
'name': fields.char('Name', size=128, required=True, select=True),
'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers),
'date': fields.date('Date', select=1),
'title': fields.many2one('res.partner.title', 'Title'),
'parent_id': fields.many2one('res.partner', 'Related Company'),
'child_ids': fields.one2many('res.partner', 'parent_id', 'Contacts'),
'child_ids': fields.one2many('res.partner', 'parent_id', 'Contacts', domain=[('active','=',True)]), # force "active_test" domain to bypass _search() override
'ref': fields.char('Reference', size=64, select=1),
'lang': fields.selection(_lang_get, 'Language',
help="If the selected language is loaded in the system, all documents related to this contact will be printed in this language. If not, it will be English."),
@@ -264,6 +294,9 @@ class res_partner(osv.osv, format_address):
'color': fields.integer('Color Index'),
'user_ids': fields.one2many('res.users', 'partner_id', 'Users'),
'contact_address': fields.function(_address_display, type='char', string='Complete Address'),
# technical field used for managing commercial fields
'commercial_partner_id': fields.function(_commercial_partner_id, type='many2one', relation='res.partner', string='Commercial Entity', store=_commercial_partner_store_triggers)
}
def _default_category(self, cr, uid, context=None):
@@ -302,11 +335,15 @@ class res_partner(osv.osv, format_address):
'company_id': lambda self, cr, uid, ctx: self.pool['res.company']._company_default_get(cr, uid, 'res.partner', context=ctx),
'color': 0,
'is_company': False,
'type': 'default',
'use_parent_address': True,
'type': 'contact', # type 'default' is wildcard and thus inappropriate
'use_parent_address': False,
'image': False,
}
_constraints = [
(osv.osv._check_recursion, 'You cannot create recursive Partner hierarchies.', ['parent_id']),
]
def copy(self, cr, uid, id, default=None, context=None):
if default is None:
default = {}
@@ -318,7 +355,6 @@ class res_partner(osv.osv, format_address):
value = {}
value['title'] = False
if is_company:
value['parent_id'] = False
domain = {'title': [('domain', '=', 'partner')]}
else:
domain = {'title': [('domain', '=', 'contact')]}
@@ -328,11 +364,22 @@ class res_partner(osv.osv, format_address):
def value_or_id(val):
""" return val or val.id if val is a browse record """
return val if isinstance(val, (bool, int, long, float, basestring)) else val.id
if use_parent_address and parent_id:
result = {}
if parent_id:
if ids:
partner = self.browse(cr, uid, ids[0], context=context)
if partner.parent_id and partner.parent_id.id != parent_id:
result['warning'] = {'title': _('Warning'),
'message': _('Changing the company of a contact should only be done if it '
'was never correctly set. If an existing contact starts working for a new '
'company then a new contact should be created under that new '
'company. You can use the "Discard" button to abandon this change.')}
parent = self.browse(cr, uid, parent_id, context=context)
return {'value': dict((key, value_or_id(parent[key])) for key in ADDRESS_FIELDS)}
return {}
address_fields = self._address_fields(cr, uid, context=context)
result['value'] = dict((key, value_or_id(parent[key])) for key in address_fields)
else:
result['value'] = {'use_parent_address': False}
return result
def onchange_state(self, cr, uid, ids, state_id, context=None):
if state_id:
@@ -358,54 +405,134 @@ class res_partner(osv.osv, format_address):
# _constraints = [(_check_ean_key, 'Error: Invalid ean code', ['ean13'])]
def write(self, cr, uid, ids, vals, context=None):
# Update parent and siblings or children records
if isinstance(ids, (int, long)):
ids = [ids]
for partner in self.browse(cr, uid, ids, context=context):
update_ids = []
if partner.is_company:
domain_children = [('parent_id', 'child_of', partner.id), ('use_parent_address', '=', True)]
update_ids = self.search(cr, uid, domain_children, context=context)
elif partner.parent_id and vals.get('use_parent_address', partner.use_parent_address):
domain_siblings = [('parent_id', '=', partner.parent_id.id), ('use_parent_address', '=', True)]
update_ids = [partner.parent_id.id] + self.search(cr, uid, domain_siblings, context=context)
self.update_address(cr, uid, update_ids, vals, context)
return super(res_partner,self).write(cr, uid, ids, vals, context=context)
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
# Update parent and siblings records
if vals.get('parent_id'):
is_supplier = self.browse(cr, uid, vals.get('parent_id'), context=context).supplier
if 'use_parent_address' in vals:
use_parent_address = vals['use_parent_address']
def _update_fields_values(self, cr, uid, partner, fields, context=None):
""" Returns dict of write() values for synchronizing ``fields`` """
values = {}
for field in fields:
column = self._all_columns[field].column
if column._type == 'one2many':
raise AssertionError('One2Many fields cannot be synchronized as part of `commercial_fields` or `address fields`')
if column._type == 'many2one':
values[field] = partner[field].id if partner[field] else False
elif column._type == 'many2many':
values[field] = [(6,0,[r.id for r in partner[field] or []])]
else:
use_parent_address = self.default_get(cr, uid, ['use_parent_address'], context=context)['use_parent_address']
values[field] = partner[field]
return values
if use_parent_address:
domain_siblings = [('parent_id', '=', vals['parent_id']), ('use_parent_address', '=', True)]
update_ids = [vals['parent_id']] + self.search(cr, uid, domain_siblings, context=context)
self.update_address(cr, uid, update_ids, vals, context)
# add missing address keys
onchange_values = self.onchange_address(cr, uid, [], use_parent_address,
vals['parent_id'], context=context).get('value') or {}
vals.update(dict((key, value)
for key, value in onchange_values.iteritems()
if key in ADDRESS_FIELDS and key not in vals))
if is_supplier:
vals.update({'supplier': 1,'customer': 0})
return super(res_partner, self).create(cr, uid, vals, context=context)
def _address_fields(self, cr, uid, context=None):
""" Returns the list of address fields that are synced from the parent
when the `use_parent_address` flag is set. """
return list(ADDRESS_FIELDS)
def update_address(self, cr, uid, ids, vals, context=None):
addr_vals = dict((key, vals[key]) for key in POSTAL_ADDRESS_FIELDS if key in vals)
address_fields = self._address_fields(cr, uid, context=context)
addr_vals = dict((key, vals[key]) for key in address_fields if key in vals)
if addr_vals:
return super(res_partner, self).write(cr, uid, ids, addr_vals, context)
def _commercial_fields(self, cr, uid, context=None):
""" Returns the list of fields that are managed by the commercial entity
to which a partner belongs. These fields are meant to be hidden on
partners that aren't `commercial entities` themselves, and will be
delegated to the parent `commercial entity`. The list is meant to be
extended by inheriting classes. """
return ['vat']
def _commercial_sync_from_company(self, cr, uid, partner, context=None):
""" Handle sync of commercial fields when a new parent commercial entity is set,
as if they were related fields """
if partner.commercial_partner_id != partner:
commercial_fields = self._commercial_fields(cr, uid, context=context)
sync_vals = self._update_fields_values(cr, uid, partner.commercial_partner_id,
commercial_fields, context=context)
partner.write(sync_vals)
def _commercial_sync_to_children(self, cr, uid, partner, context=None):
""" Handle sync of commercial fields to descendants """
commercial_fields = self._commercial_fields(cr, uid, context=context)
sync_vals = self._update_fields_values(cr, uid, partner.commercial_partner_id,
commercial_fields, context=context)
sync_children = [c for c in partner.child_ids if not c.is_company]
for child in sync_children:
self._commercial_sync_to_children(cr, uid, child, context=context)
return self.write(cr, uid, [c.id for c in sync_children], sync_vals, context=context)
def _fields_sync(self, cr, uid, partner, update_values, context=None):
""" Sync commercial fields and address fields from company and to children after create/update,
just as if those were all modeled as fields.related to the parent """
# 1. From UPSTREAM: sync from parent
if update_values.get('parent_id') or update_values.get('use_parent_address'):
# 1a. Commercial fields: sync if parent changed
if update_values.get('parent_id'):
self._commercial_sync_from_company(cr, uid, partner, context=context)
# 1b. Address fields: sync if parent or use_parent changed *and* both are now set
if partner.parent_id and partner.use_parent_address:
onchange_vals = self.onchange_address(cr, uid, [partner.id],
use_parent_address=partner.use_parent_address,
parent_id=partner.parent_id.id,
context=context).get('value', {})
partner.update_address(onchange_vals)
# 2. To DOWNSTREAM: sync children
if partner.child_ids:
# 2a. Commercial Fields: sync if commercial entity
if partner.commercial_partner_id == partner:
self._commercial_sync_to_children(cr, uid, partner, context=context)
# 2b. Address fields: sync if address changed
address_fields = self._address_fields(cr, uid, context=context)
if any(field in update_values for field in address_fields):
domain_children = [('parent_id', '=', partner.id), ('use_parent_address', '=', True)]
update_ids = self.search(cr, uid, domain_children, context=context)
self.update_address(cr, uid, update_ids, update_values, context=context)
def _handle_first_contact_creation(self, cr, uid, partner, context=None):
""" On creation of first contact for a company (or root) that has no address, assume contact address
was meant to be company address """
parent = partner.parent_id
address_fields = self._address_fields(cr, uid, context=context)
if parent and (parent.is_company or not parent.parent_id) and len(parent.child_ids) == 1 and \
any(partner[f] for f in address_fields) and not any(parent[f] for f in address_fields):
addr_vals = self._update_fields_values(cr, uid, partner, address_fields, context=context)
parent.update_address(addr_vals)
if not parent.is_company:
parent.write({'is_company': True})
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
result = super(res_partner,self).write(cr, uid, ids, vals, context=context)
for partner in self.browse(cr, uid, ids, context=context):
self._fields_sync(cr, uid, partner, vals, context)
return result
def create(self, cr, uid, vals, context=None):
new_id = super(res_partner, self).create(cr, uid, vals, context=context)
partner = self.browse(cr, uid, new_id, context=context)
self._fields_sync(cr, uid, partner, vals, context)
self._handle_first_contact_creation(cr, uid, partner, context)
return new_id
def open_commercial_entity(self, cr, uid, ids, context=None):
""" Utility method used to add an "Open Company" button in partner views """
partner = self.browse(cr, uid, ids[0], context=context)
return {'type': 'ir.actions.act_window',
'res_model': 'res.partner',
'view_mode': 'form',
'res_id': partner.commercial_partner_id.id,
'target': 'new',
'flags': {'form': {'action_buttons': True}}}
def open_parent(self, cr, uid, ids, context=None):
""" Utility method used to add an "Open Parent" button in partner views """
partner = self.browse(cr, uid, ids[0], context=context)
return {'type': 'ir.actions.act_window',
'res_model': 'res.partner',
'view_mode': 'form',
'res_id': partner.parent_id.id,
'target': 'new',
'flags': {'form': {'action_buttons': True}}}
def name_get(self, cr, uid, ids, context=None):
if context is None:
context = {}
@@ -414,8 +541,8 @@ class res_partner(osv.osv, format_address):
res = []
for record in self.browse(cr, uid, ids, context=context):
name = record.name
if record.parent_id:
name = "%s (%s)" % (name, record.parent_id.name)
if record.parent_id and not record.is_company:
name = "%s, %s" % (record.parent_id.name, name)
if context.get('show_address'):
name = name + "\n" + self._display_address(cr, uid, record, without_company=True, context=context)
name = name.replace('\n\n','\n')
@@ -454,6 +581,15 @@ class res_partner(osv.osv, format_address):
rec_id = self.create(cr, uid, {self._rec_name: name or email, 'email': email or False}, context=context)
return self.name_get(cr, uid, [rec_id], context)[0]
def _search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False, access_rights_uid=None):
""" Override search() to always show inactive children when searching via ``child_of`` operator. The ORM will
always call search() with a simple domain of the form [('parent_id', 'in', [ids])]. """
# a special ``domain`` is set on the ``child_ids`` o2m to bypass this logic, as it uses similar domain expressions
if len(args) == 1 and len(args[0]) == 3 and args[0][:2] == ('parent_id','in'):
context = dict(context or {}, active_test=False)
return super(res_partner, self)._search(cr, user, args, offset=offset, limit=limit, order=order, context=context,
count=count, access_rights_uid=access_rights_uid)
def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
if not args:
args = []
@@ -514,25 +650,42 @@ class res_partner(osv.osv, format_address):
ids = ids[16:]
return True
def address_get(self, cr, uid, ids, adr_pref=None):
if adr_pref is None:
adr_pref = ['default']
def address_get(self, cr, uid, ids, adr_pref=None, context=None):
""" Find contacts/addresses of the right type(s) by doing a depth-first-search
through descendants within company boundaries (stop at entities flagged ``is_company``)
then continuing the search at the ancestors that are within the same company boundaries.
Defaults to partners of type ``'default'`` when the exact type is not found, or to the
provided partner itself if no type ``'default'`` is found either. """
adr_pref = set(adr_pref or [])
if 'default' not in adr_pref:
adr_pref.add('default')
result = {}
# retrieve addresses from the partner itself and its children
res = []
# need to fix the ids ,It get False value in list like ids[False]
if ids and ids[0]!=False:
for p in self.browse(cr, uid, ids):
res.append((p.type, p.id))
res.extend((c.type, c.id) for c in p.child_ids)
address_dict = dict(reversed(res))
# get the id of the (first) default address if there is one,
# otherwise get the id of the first address in the list
default_address = False
if res:
default_address = address_dict.get('default', res[0][1])
for adr in adr_pref:
result[adr] = address_dict.get(adr, default_address)
visited = set()
for partner in self.browse(cr, uid, filter(None, ids), context=context):
current_partner = partner
while current_partner:
to_scan = [current_partner]
# Scan descendants, DFS
while to_scan:
record = to_scan.pop(0)
visited.add(record)
if record.type in adr_pref and not result.get(record.type):
result[record.type] = record.id
if len(result) == len(adr_pref):
return result
to_scan = [c for c in record.child_ids
if c not in visited
if not c.is_company] + to_scan
# Continue scanning at ancestor if current_partner is not a commercial entity
if current_partner.is_company or not current_partner.parent_id:
break
current_partner = current_partner.parent_id
# default to type 'default' or the partner itself
default = result.get('default', partner.id)
for adr_type in adr_pref:
result[adr_type] = result.get(adr_type) or default
return result
def view_header_get(self, cr, uid, view_id, view_type, context):
@@ -574,8 +727,7 @@ class res_partner(osv.osv, format_address):
'country_name': address.country_id and address.country_id.name or '',
'company_name': address.parent_id and address.parent_id.name or '',
}
address_field = ['title', 'street', 'street2', 'zip', 'city']
for field in address_field :
for field in self._address_fields(cr, uid, context=context):
args[field] = getattr(address, field) or ''
if without_company:
args['company_name'] = ''
+48 -21
View File
@@ -77,7 +77,7 @@
<field eval="8" name="priority"/>
<field name="arch" type="xml">
<tree string="Contacts">
<field name="name"/>
<field name="display_name"/>
<field name="function" invisible="1"/>
<field name="phone"/>
<field name="email"/>
@@ -138,8 +138,8 @@
</h1>
<field name="parent_id"
placeholder="Company"
domain="[('is_company', '=', True)]" context="{'default_is_company': True,'default_supplier': supplier,'default_customer': customer}"
attrs="{'invisible': [('is_company','=', True)]}"
domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'default_supplier': supplier}"
attrs="{'invisible': [('is_company','=', True),('parent_id', '=', False)]}"
on_change="onchange_address(use_parent_address, parent_id)"/>
<field name="category_id" widget="many2many_tags" placeholder="Tags..."/>
</div>
@@ -151,21 +151,24 @@
<div attrs="{'invisible': [('parent_id','=', False)]}" name="div_type">
<field class="oe_inline"
name="type"/>
<label for="use_parent_address" class="oe_edit_only"/>
<field name="use_parent_address" class="oe_edit_only oe_inline"
on_change="onchange_address(use_parent_address, parent_id)"/>
</div>
<label for="street" string="Address"/>
<div>
<field name="street" placeholder="Street..."/>
<field name="street2"/>
<field name="use_parent_address" class="oe_edit_only oe_inline"
on_change="onchange_address(use_parent_address, parent_id)"
attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"/>
<label for="use_parent_address" class="oe_edit_only" attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"/>
<button name="open_parent" type="object" string="(edit company address)" class="oe_link oe_edit_only"
attrs="{'invisible': ['|',('parent_id','=', False),('use_parent_address','=',False)]}"/>
<field name="street" placeholder="Street..." attrs="{'readonly': [('use_parent_address','=',True)]}"/>
<field name="street2" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
<div class="address_format">
<field name="city" placeholder="City" style="width: 40%%"/>
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/>
<field name="zip" placeholder="ZIP" style="width: 20%%"/>
<field name="city" placeholder="City" style="width: 40%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
<field name="zip" placeholder="ZIP" style="width: 20%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
</div>
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/>
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}' attrs="{'readonly': [('use_parent_address','=',True)]}"/>
</div>
<field name="website" widget="url" placeholder="e.g. www.openerp.com"/>
</group>
@@ -182,8 +185,8 @@
</group>
<notebook colspan="4">
<page string="Contacts" attrs="{'invisible': [('is_company','=',False)]}">
<field name="child_ids" context="{'default_parent_id': active_id}" mode="kanban">
<page string="Contacts" attrs="{'invisible': [('is_company','=',False), ('child_ids', '=', [])]}" autofocus="autofocus">
<field name="child_ids" mode="kanban" context="{'default_parent_id': active_id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier}">
<kanban>
<field name="color"/>
<field name="name"/>
@@ -249,17 +252,41 @@
</templates>
</kanban>
<form string="Contact" version="7.0">
<field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
<div class="oe_title">
<sheet>
<field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name" style="width: 70%%"/></h1>
<field name="category_id" widget="many2many_tags" placeholder="Tags..." style="width: 70%%"/>
</div>
<group>
<field name="name"/>
<field name="category_id" widget="many2many_tags" placeholder="Tags..."/>
<field name="function" placeholder="e.g. Sales Director"/>
<field name="email"/>
<field name="phone"/>
<field name="mobile"/>
</group>
</div>
<div>
<field name="use_parent_address"/><label for="use_parent_address"/>
</div>
<group>
<label for="type"/>
<div name="div_type">
<field class="oe_inline" name="type"/>
</div>
<label for="street" string="Address" attrs="{'invisible': [('use_parent_address','=', True)]}"/>
<div attrs="{'invisible': [('use_parent_address','=', True)]}" name="div_address">
<field name="street" placeholder="Street..."/>
<field name="street2"/>
<div class="address_format">
<field name="city" placeholder="City" style="width: 40%%"/>
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/>
<field name="zip" placeholder="ZIP" style="width: 20%%"/>
</div>
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/>
</div>
</group>
<field name="supplier" invisible="True"/>
</sheet>
</form>
</field>
</page>
@@ -330,7 +357,7 @@
<field name="arch" type="xml">
<kanban>
<field name="color"/>
<field name="name"/>
<field name="display_name"/>
<field name="title"/>
<field name="email"/>
<field name="parent_id"/>
@@ -363,7 +390,7 @@
</t>
</a>
<div class="oe_kanban_details">
<h4 class="oe_partner_heading"><a type="open"><field name="name"/></a></h4>
<h4 class="oe_partner_heading"><a type="open"><field name="display_name"/></a></h4>
<div class="oe_kanban_partner_categories"/>
<div class="oe_kanban_partner_links"/>
<ul>
+1 -1
View File
@@ -44,7 +44,7 @@ openerp.base = function(instance) {
} else {
sessionStorage.removeItem('apps.login');
sessionStorage.removeItem('apps.access_token');
client.bind_crendentials(client.dbname, 'anonymous', 'anonymous');
client.bind_credentials(client.dbname, 'anonymous', 'anonymous');
client.authenticate().then(
function() { /* done */
d.resolve(client);
+265
View File
@@ -1,6 +1,7 @@
import unittest2
import openerp.tests.common as common
from openerp.osv.orm import except_orm
class test_base(common.TransactionCase):
@@ -39,5 +40,269 @@ class test_base(common.TransactionCase):
self.assertTrue(new_id2 > new_id, 'find_or_create failed - should have created new one again')
def test_20_res_partner_address_sync(self):
cr, uid = self.cr, self.uid
ghoststep = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
{'name': 'GhostStep',
'is_company': True,
'street': 'Main Street, 10',
'phone': '123456789',
'email': 'info@ghoststep.com',
'vat': 'BE0477472701',
'type': 'default'}))
p1 = self.res_partner.browse(cr, uid, self.res_partner.name_create(cr, uid, 'Denis Bladesmith <denis.bladesmith@ghoststep.com>')[0])
self.assertEqual(p1.type, 'contact', 'Default type must be "contact"')
p1phone = '123456789#34'
p1.write({'phone': p1phone,
'parent_id': ghoststep.id,
'use_parent_address': True})
p1.refresh()
self.assertEqual(p1.street, ghoststep.street, 'Address fields must be synced')
self.assertEqual(p1.phone, p1phone, 'Phone should be preserved after address sync')
self.assertEqual(p1.type, 'contact', 'Type should be preserved after address sync')
self.assertEqual(p1.email, 'denis.bladesmith@ghoststep.com', 'Email should be preserved after sync')
# turn off sync
p1street = 'Different street, 42'
p1.write({'street': p1street,
'use_parent_address': False})
p1.refresh(), ghoststep.refresh()
self.assertEqual(p1.street, p1street, 'Address fields must not be synced after turning sync off')
self.assertNotEqual(ghoststep.street, p1street, 'Parent address must never be touched')
# turn on sync again
p1.write({'use_parent_address': True})
p1.refresh()
self.assertEqual(p1.street, ghoststep.street, 'Address fields must be synced again')
self.assertEqual(p1.phone, p1phone, 'Phone should be preserved after address sync')
self.assertEqual(p1.type, 'contact', 'Type should be preserved after address sync')
self.assertEqual(p1.email, 'denis.bladesmith@ghoststep.com', 'Email should be preserved after sync')
# Modify parent, sync to children
ghoststreet = 'South Street, 25'
ghoststep.write({'street': ghoststreet})
p1.refresh()
self.assertEqual(p1.street, ghoststreet, 'Address fields must be synced automatically')
self.assertEqual(p1.phone, p1phone, 'Phone should not be synced')
self.assertEqual(p1.email, 'denis.bladesmith@ghoststep.com', 'Email should be preserved after sync')
p1street = 'My Street, 11'
p1.write({'street': p1street})
ghoststep.refresh()
self.assertEqual(ghoststep.street, ghoststreet, 'Touching contact should never alter parent')
def test_30_res_partner_first_contact_sync(self):
""" Test initial creation of company/contact pair where contact address gets copied to
company """
cr, uid = self.cr, self.uid
ironshield = self.res_partner.browse(cr, uid, self.res_partner.name_create(cr, uid, 'IronShield')[0])
self.assertFalse(ironshield.is_company, 'Partners are not companies by default')
self.assertFalse(ironshield.use_parent_address, 'use_parent_address defaults to False')
self.assertEqual(ironshield.type, 'contact', 'Default type must be "contact"')
ironshield.write({'type': 'default'}) # force default type to double-check sync
p1 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
{'name': 'Isen Hardearth',
'street': 'Strongarm Avenue, 12',
'parent_id': ironshield.id}))
self.assertEquals(p1.type, 'contact', 'Default type must be "contact", not the copied parent type')
ironshield.refresh()
self.assertEqual(ironshield.street, p1.street, 'Address fields should be copied to company')
self.assertTrue(ironshield.is_company, 'Company flag should be turned on after first contact creation')
def test_40_res_partner_address_getc(self):
""" Test address_get address resolution mechanism: it should first go down through descendants,
stopping when encountering another is_copmany entity, then go up, stopping again at the first
is_company entity or the root ancestor and if nothing matches, it should use the provided partner
itself """
cr, uid = self.cr, self.uid
elmtree = self.res_partner.browse(cr, uid, self.res_partner.name_create(cr, uid, 'Elmtree')[0])
branch1 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Branch 1',
'parent_id': elmtree.id,
'is_company': True}))
leaf10 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 10',
'parent_id': branch1.id,
'type': 'invoice'}))
branch11 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Branch 11',
'parent_id': branch1.id,
'type': 'other'}))
leaf111 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 111',
'parent_id': branch11.id,
'type': 'delivery'}))
branch11.write({'is_company': False}) # force is_company after creating 1rst child
branch2 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Branch 2',
'parent_id': elmtree.id,
'is_company': True}))
leaf21 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 21',
'parent_id': branch2.id,
'type': 'delivery'}))
leaf22 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 22',
'parent_id': branch2.id}))
leaf23 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 23',
'parent_id': branch2.id,
'type': 'default'}))
# go up, stop at branch1
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf111.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf111.id,
'invoice': leaf10.id,
'contact': branch1.id,
'other': branch11.id,
'default': leaf111.id}, 'Invalid address resolution')
self.assertEqual(self.res_partner.address_get(cr, uid, [branch11.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf111.id,
'invoice': leaf10.id,
'contact': branch1.id,
'other': branch11.id,
'default': branch11.id}, 'Invalid address resolution')
# go down, stop at at all child companies
self.assertEqual(self.res_partner.address_get(cr, uid, [elmtree.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': elmtree.id,
'invoice': elmtree.id,
'contact': elmtree.id,
'other': elmtree.id,
'default': elmtree.id}, 'Invalid address resolution')
# go down through children
self.assertEqual(self.res_partner.address_get(cr, uid, [branch1.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf111.id,
'invoice': leaf10.id,
'contact': branch1.id,
'other': branch11.id,
'default': branch1.id}, 'Invalid address resolution')
self.assertEqual(self.res_partner.address_get(cr, uid, [branch2.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf21.id,
'invoice': leaf23.id,
'contact': branch2.id,
'other': leaf23.id,
'default': leaf23.id}, 'Invalid address resolution')
# go up then down through siblings
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf21.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf21.id,
'invoice': leaf23.id,
'contact': branch2.id,
'other': leaf23.id,
'default': leaf23.id
}, 'Invalid address resolution, should scan commercial entity ancestor and its descendants')
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf22.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf21.id,
'invoice': leaf23.id,
'contact': leaf22.id,
'other': leaf23.id,
'default': leaf23.id}, 'Invalid address resolution, should scan commercial entity ancestor and its descendants')
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf23.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
{'delivery': leaf21.id,
'invoice': leaf23.id,
'contact': branch2.id,
'other': leaf23.id,
'default': leaf23.id}, 'Invalid address resolution, `default` should only override if no partner with specific type exists')
# empty adr_pref means only 'default'
self.assertEqual(self.res_partner.address_get(cr, uid, [elmtree.id], []),
{'default': elmtree.id}, 'Invalid address resolution, no default means commercial entity ancestor')
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf111.id], []),
{'default': leaf111.id}, 'Invalid address resolution, no default means contact itself')
branch11.write({'type': 'default'})
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf111.id], []),
{'default': branch11.id}, 'Invalid address resolution, branch11 should now be default')
def test_50_res_partner_commercial_sync(self):
cr, uid = self.cr, self.uid
p0 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
{'name': 'Sigurd Sunknife',
'email': 'ssunknife@gmail.com'}))
sunhelm = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
{'name': 'Sunhelm',
'is_company': True,
'street': 'Rainbow Street, 13',
'phone': '1122334455',
'email': 'info@sunhelm.com',
'vat': 'BE0477472701',
'child_ids': [(4, p0.id),
(0, 0, {'name': 'Alrik Greenthorn',
'email': 'agr@sunhelm.com'})],
}))
p1 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
{'name': 'Otto Blackwood',
'email': 'otto.blackwood@sunhelm.com',
'parent_id': sunhelm.id}))
p11 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
{'name': 'Gini Graywool',
'email': 'ggr@sunhelm.com',
'parent_id': p1.id}))
p2 = self.res_partner.browse(cr, uid, self.res_partner.search(cr, uid,
[('email', '=', 'agr@sunhelm.com')])[0])
for p in (p0, p1, p11, p2):
p.refresh()
self.assertEquals(p.commercial_partner_id, sunhelm, 'Incorrect commercial entity resolution')
self.assertEquals(p.vat, sunhelm.vat, 'Commercial fields must be automatically synced')
sunhelmvat = 'BE0123456789'
sunhelm.write({'vat': sunhelmvat})
for p in (p0, p1, p11, p2):
p.refresh()
self.assertEquals(p.vat, sunhelmvat, 'Commercial fields must be automatically and recursively synced')
p1vat = 'BE0987654321'
p1.write({'vat': p1vat})
for p in (sunhelm, p0, p11, p2):
p.refresh()
self.assertEquals(p.vat, sunhelmvat, 'Sync to children should only work downstream and on commercial entities')
# promote p1 to commercial entity
vals = p1.onchange_type(is_company=True)['value']
p1.write(dict(vals, parent_id=sunhelm.id,
is_company=True,
name='Sunhelm Subsidiary'))
p1.refresh()
self.assertEquals(p1.vat, p1vat, 'Setting is_company should stop auto-sync of commercial fields')
self.assertEquals(p1.commercial_partner_id, p1, 'Incorrect commercial entity resolution after setting is_company')
# writing on parent should not touch child commercial entities
sunhelmvat2 = 'BE0112233445'
sunhelm.write({'vat': sunhelmvat2})
p1.refresh()
self.assertEquals(p1.vat, p1vat, 'Setting is_company should stop auto-sync of commercial fields')
p0.refresh()
self.assertEquals(p0.vat, sunhelmvat2, 'Commercial fields must be automatically synced')
class test_partner_recursion(common.TransactionCase):
def setUp(self):
super(test_partner_recursion,self).setUp()
self.res_partner = self.registry('res.partner')
cr, uid = self.cr, self.uid
self.p1 = self.res_partner.name_create(cr, uid, 'Elmtree')[0]
self.p2 = self.res_partner.create(cr, uid, {'name': 'Elmtree Child 1', 'parent_id': self.p1})
self.p3 = self.res_partner.create(cr, uid, {'name': 'Elmtree Grand-Child 1.1', 'parent_id': self.p2})
# split 101, 102, 103 tests to force SQL rollback between them
def test_101_res_partner_recursion(self):
cr, uid, p1, p3 = self.cr, self.uid, self.p1, self.p3
self.assertRaises(except_orm, self.res_partner.write, cr, uid, [p1], {'parent_id': p3})
def test_102_res_partner_recursion(self):
cr, uid, p2, p3 = self.cr, self.uid, self.p2, self.p3
self.assertRaises(except_orm, self.res_partner.write, cr, uid, [p2], {'parent_id': p3})
def test_103_res_partner_recursion(self):
cr, uid, p3 = self.cr, self.uid, self.p3
self.assertRaises(except_orm, self.res_partner.write, cr, uid, [p3], {'parent_id': p3})
def test_104_res_partner_recursion_indirect_cycle(self):
""" Indirect hacky write to create cycle in children """
cr, uid, p2, p3 = self.cr, self.uid, self.p2, self.p3
p3b = self.res_partner.create(cr, uid, {'name': 'Elmtree Grand-Child 1.2', 'parent_id': self.p2})
self.assertRaises(except_orm, self.res_partner.write, cr, uid, [p2],
{'child_ids': [(1, p3, {'parent_id': p3b}), (1, p3b, {'parent_id': p3})]})
def test_110_res_partner_recursion_multi_update(self):
""" multi-write on several partners in same hierarchy must not trigger a false cycle detection """
cr, uid, p1, p2, p3 = self.cr, self.uid, self.p1, self.p2, self.p3
self.assertTrue(self.res_partner.write(cr, uid, [p1,p2,p3], {'phone': '123456'}))
if __name__ == '__main__':
unittest2.main()
+1 -1
View File
@@ -263,7 +263,7 @@ class test_expression(common.TransactionCase):
"_auto_join on: ('child_ids.bank_ids.id', 'in', [..]) query incorrect join condition")
self.assertIn('"res_partner__child_ids"."id"="res_partner__child_ids__bank_ids"."partner_id"', sql_query[1],
"_auto_join on: ('child_ids.bank_ids.id', 'in', [..]) query incorrect join condition")
self.assertEqual(set([b_aa, b_ba]), set(sql_query[2]),
self.assertEqual(set([b_aa, b_ba]), set(sql_query[2][-2:]),
"_auto_join on: ('child_ids.bank_ids.id', 'in', [..]) query incorrect parameter")
# --------------------------------------------------
+1 -1
View File
@@ -42,7 +42,7 @@ class test_res_config(common.TransactionCase):
self.assertIsInstance(res, tuple)
self.assertEqual(len(res), 2, "The result should contain 2 elements")
self.assertIsInstance(res[0], basestring)
self.assertIsInstance(res[1], long)
self.assertIsInstance(res[1], (int, long))
# Check returned values
self.assertEqual(res[0], self.expected_path)
+6 -2
View File
@@ -98,6 +98,8 @@ def preload_registry(dbname):
openerp.modules.registry.RegistryManager.new(dbname, update_module=update_module)
except Exception:
_logger.exception('Failed to initialize database `%s`.', dbname)
return False
return True
def run_test_file(dbname, test_file):
""" Preload a registry, possibly run a test file, and start the cron."""
@@ -261,12 +263,14 @@ def main(args):
else:
openerp.service.start_services()
rc = 0
if config['db_name']:
for dbname in config['db_name'].split(','):
preload_registry(dbname)
if not preload_registry(dbname):
rc += 1
if config["stop_after_init"]:
sys.exit(0)
sys.exit(rc)
_logger.info('OpenERP server is running, waiting for connections...')
quit_on_signals()
+1 -4
View File
@@ -96,10 +96,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
"""
for filename in package.data[kind]:
if kind == 'test':
_test_logger.info("module %s: loading %s", module_name, filename)
else:
_logger.info("module %s: loading %s", module_name, filename)
_logger.info("module %s: loading %s", module_name, filename)
_, ext = os.path.splitext(filename)
pathname = os.path.join(module_name, filename)
fp = tools.file_open(pathname)
+17 -31
View File
@@ -3,7 +3,7 @@
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
# Copyright (C) 2010-2013 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
@@ -22,31 +22,15 @@
""" Modules migration handling. """
import os, sys, imp
import imp
import logging
import os
from os.path import join as opj
import itertools
import zipimport
import openerp
import openerp.osv as osv
import openerp.tools as tools
import openerp.tools.osutil as osutil
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools.translate import _
import zipfile
import openerp.release as release
import openerp.tools as tools
import re
import base64
from zipfile import PyZipFile, ZIP_DEFLATED
from cStringIO import StringIO
import logging
import openerp.modules.db
import openerp.modules.graph
_logger = logging.getLogger(__name__)
@@ -100,9 +84,10 @@ class MigrationManager(object):
def migrate_module(self, pkg, stage):
assert stage in ('pre', 'post')
stageformat = {'pre': '[>%s]',
'post': '[%s>]',
}
stageformat = {
'pre': '[>%s]',
'post': '[%s>]',
}
if not (hasattr(pkg, 'update') or pkg.state == 'to upgrade'):
return
@@ -129,9 +114,10 @@ class MigrationManager(object):
m = self.migrations[pkg.name]
lst = []
mapping = {'module': opj(pkg.name, 'migrations'),
'maintenance': opj('base', 'maintenance', 'migrations', pkg.name),
}
mapping = {
'module': opj(pkg.name, 'migrations'),
'maintenance': opj('base', 'maintenance', 'migrations', pkg.name),
}
for x in mapping.keys():
if version in m[x]:
@@ -180,14 +166,14 @@ class MigrationManager(object):
try:
mod = imp.load_source(name, pyfile, fp2)
_logger.info('module %(addon)s: Running migration %(version)s %(name)s' % mergedict({'name': mod.__name__}, strfmt))
mod.migrate(self.cr, pkg.installed_version)
migrate = mod.migrate
except ImportError:
_logger.error('module %(addon)s: Unable to load %(stage)s-migration file %(file)s' % mergedict({'file': pyfile}, strfmt))
_logger.exception('module %(addon)s: Unable to load %(stage)s-migration file %(file)s' % mergedict({'file': pyfile}, strfmt))
raise
except AttributeError:
_logger.error('module %(addon)s: Each %(stage)s-migration file must have a "migrate(cr, installed_version)" function' % strfmt)
except:
raise
else:
migrate(self.cr, pkg.installed_version)
finally:
if fp:
fp.close()
+1 -1
View File
@@ -790,7 +790,7 @@ class expression(object):
leaf.add_join_context(next_model, working_model._inherits[next_model._name], 'id', working_model._inherits[next_model._name])
push(leaf)
elif not field and left == 'id' and operator == 'child_of':
elif left == 'id' and operator == 'child_of':
ids2 = to_ids(right, working_model, context)
dom = child_of_domain(left, ids2, working_model)
for dom_leaf in reversed(dom):
+14 -14
View File
@@ -4817,8 +4817,8 @@ class BaseModel(object):
order_field = order_split[0].strip()
order_direction = order_split[1].strip() if len(order_split) == 2 else ''
inner_clause = None
if order_field == 'id':
order_by_elements.append('"%s"."id" %s' % (self._table, order_direction))
if order_field == 'id' or (self._log_access and order_field in LOG_ACCESS_COLUMNS.keys()):
order_by_elements.append('"%s"."%s" %s' % (self._table, order_field, order_direction))
elif order_field in self._columns:
order_column = self._columns[order_field]
if order_column._classic_read:
@@ -4836,6 +4836,8 @@ class BaseModel(object):
inner_clause = self._generate_m2o_order_by(order_field, query)
else:
continue # ignore non-readable or "non-joinable" fields
else:
raise ValueError( _("Sorting field %s not found on model %s") %( order_field, self._name))
if inner_clause:
if isinstance(inner_clause, list):
for clause in inner_clause:
@@ -5092,20 +5094,18 @@ class BaseModel(object):
:param parent: optional parent field name (default: ``self._parent_name = parent_id``)
:return: **True** if the operation can proceed safely, or **False** if an infinite loop is detected.
"""
if not parent:
parent = self._parent_name
ids_parent = ids[:]
query = 'SELECT distinct "%s" FROM "%s" WHERE id IN %%s' % (parent, self._table)
while ids_parent:
ids_parent2 = []
for i in range(0, len(ids), cr.IN_MAX):
sub_ids_parent = ids_parent[i:i+cr.IN_MAX]
cr.execute(query, (tuple(sub_ids_parent),))
ids_parent2.extend(filter(None, map(lambda x: x[0], cr.fetchall())))
ids_parent = ids_parent2
for i in ids_parent:
if i in ids:
# must ignore 'active' flag, ir.rules, etc. => direct SQL query
query = 'SELECT "%s" FROM "%s" WHERE id = %%s' % (parent, self._table)
for id in ids:
current_id = id
while current_id is not None:
cr.execute(query, (current_id,))
result = cr.fetchone()
current_id = result[0] if result else None
if current_id == id:
return False
return True
+1 -1
View File
@@ -30,7 +30,7 @@ RELEASE_LEVELS_DISPLAY = {ALPHA: ALPHA,
# properly comparable using normal operarors, for example:
# (6,1,0,'beta',0) < (6,1,0,'candidate',1) < (6,1,0,'candidate',2)
# (6,1,0,'candidate',2) < (6,1,0,'final',0) < (6,1,2,'final',0)
version_info = (7, 0, 0, FINAL, 0)
version_info = (8, 0, 0, ALPHA, 1)
version = '.'.join(map(str, version_info[:2])) + RELEASE_LEVELS_DISPLAY[version_info[3]] + str(version_info[4] or '')
serie = major_version = '.'.join(map(str, version_info[:2]))
+2 -2
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+3 -18
View File
@@ -1,25 +1,8 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright (C) 2005, Fabien Pinckaers, UCL, FSA
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -34,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
##############################################################################
import sys
import cStringIO
+14 -13
View File
@@ -1,21 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
# Copyright (C) 2005, Fabien Pinckaers, UCL, FSA
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
##############################################################################
+8 -4
View File
@@ -435,7 +435,7 @@ class _rml_canvas(object):
self.canvas.circle(x_cen=utils.unit_get(node.get('x')), y_cen=utils.unit_get(node.get('y')), r=utils.unit_get(node.get('radius')), **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
def _place(self, node):
flows = _rml_flowable(self.doc, self.localcontext, images=self.images, path=self.path, title=self.title).render(node)
flows = _rml_flowable(self.doc, self.localcontext, images=self.images, path=self.path, title=self.title, canvas=self.canvas).render(node)
infos = utils.attr_get(node, ['x','y','width','height'])
infos['y']+=infos['height']
@@ -616,7 +616,7 @@ class _rml_Illustration(platypus.flowables.Flowable):
drw.render(self.canv, None)
class _rml_flowable(object):
def __init__(self, doc, localcontext, images=None, path='.', title=None):
def __init__(self, doc, localcontext, images=None, path='.', title=None, canvas=None):
if images is None:
images = {}
self.localcontext = localcontext
@@ -625,6 +625,7 @@ class _rml_flowable(object):
self.images = images
self.path = path
self.title = title
self.canvas = canvas
def _textual(self, node):
rc1 = utils._process_text(self, node.text or '')
@@ -634,7 +635,10 @@ class _rml_flowable(object):
if key in ('rml_except', 'rml_loop', 'rml_tag'):
del txt_n.attrib[key]
if not n.tag == 'bullet':
txt_n.text = utils.xml2str(self._textual(n))
if n.tag == 'pageNumber':
txt_n.text = self.canvas and str(self.canvas.getPageNumber()) or ''
else:
txt_n.text = utils.xml2str(self._textual(n))
txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
rc1 += etree.tostring(txt_n)
return rc1
@@ -983,7 +987,7 @@ class _rml_template(object):
if self.localcontext and not self.localcontext.get('internal_header',False):
del self.localcontext['internal_header']
fis = []
r = _rml_flowable(self.doc,self.localcontext, images=self.images, path=self.path, title=self.title)
r = _rml_flowable(self.doc,self.localcontext, images=self.images, path=self.path, title=self.title, canvas=None)
story_cnt = 0
for node_story in node_stories:
if story_cnt > 0:
+3 -19
View File
@@ -1,26 +1,8 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# trml2pdf - An RML to PDF converter
# Copyright (C) 2003, Fabien Pinckaers, UCL, FSA
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -35,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
##############################################################################
import copy
import locale
+17 -3
View File
@@ -182,7 +182,7 @@ class Multicorn(object):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.setblocking(0)
self.socket.bind(self.address)
self.socket.listen(8)
self.socket.listen(8*self.population)
# long polling socket
self.long_polling_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.long_polling_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@@ -241,6 +241,9 @@ class Worker(object):
self.request_max = multi.limit_request
self.request_count = 0
def setproctitle(self, title=""):
setproctitle('openerp: %s %s %s' % (self.__class__.__name__, self.pid, title))
def close(self):
os.close(self.watchdog_pipe[0])
os.close(self.watchdog_pipe[1])
@@ -290,7 +293,7 @@ class Worker(object):
def start(self):
self.pid = os.getpid()
setproctitle('openerp: %s %s' % (self.__class__.__name__, self.pid))
self.setproctitle()
_logger.info("Worker %s (%s) alive", self.__class__.__name__, self.pid)
# Reseed the random number generator
random.seed()
@@ -370,7 +373,16 @@ class WorkerLongPolling(Worker):
Worker.start(self)
from gevent.wsgi import WSGIServer
self.server = WSGIServer(self.multi.long_polling_socket, self.multi.app)
self.server.serve_forever()
self.server.start()
def stop(self):
self.server.stop()
def sleep(self):
time.sleep(1)
def process_work(self):
pass
class WorkerBaseWSGIServer(werkzeug.serving.BaseWSGIServer):
""" werkzeug WSGI Server patched to allow using an external listen socket
@@ -413,6 +425,7 @@ class WorkerCron(Worker):
if len(db_names):
self.db_index = (self.db_index + 1) % len(db_names)
db_name = db_names[self.db_index]
self.setproctitle(db_name)
if rpc_request_flag:
start_time = time.time()
start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info()
@@ -422,6 +435,7 @@ class WorkerCron(Worker):
import openerp.addons.base as base
acquired = base.ir.ir_cron.ir_cron._acquire_job(db_name)
if not acquired:
openerp.modules.registry.RegistryManager.delete(db_name)
break
# dont keep cursors in multi database mode
if len(db_names) > 1:
+1 -1
View File
@@ -489,7 +489,7 @@ form: module.record_id""" % (xml_id,)
if rec.get('target'):
res['target'] = rec.get('target','')
if rec.get('multi'):
res['multi'] = rec.get('multi', False)
res['multi'] = eval(rec.get('multi', 'False'))
id = self.pool['ir.model.data']._update(cr, self.uid, 'ir.actions.act_window', self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
self.idref[xml_id] = int(id)

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