[Merge]Merge with openobject-server

bzr revid: vja@tinyerp.com-20130515095510-rrl5xeen0a1oxzvu
This commit is contained in:
Vishmita Jadeja (openerp) 2013-05-15 15:25:10 +05:30
commit fa9abf91f7
98 changed files with 17453 additions and 1147 deletions

View File

@ -19,7 +19,7 @@
#
##############################################################################
""" OpenERP core library.
""" OpenERP core library..
"""

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

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

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

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

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

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

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

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

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

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"

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

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

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

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

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

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

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

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

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

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

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

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"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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):

View File

@ -155,12 +155,51 @@ class ir_translation(osv.osv):
lang_data = lang_model.read(cr, uid, lang_ids, ['code', 'name'], context=context)
return [(d['code'], d['name']) for d in lang_data]
def _get_src(self, cr, uid, ids, name, arg, context=None):
''' Get source name for the translation. If object type is model then
return the value store in db. Otherwise return value store in src field
'''
if context is None:
context = {}
res = {}
for record in self.browse(cr, uid, ids, context=context):
if record.type != 'model':
res[record.id] = record.src
else:
model_name, field = record.name.split(',')
model = self.pool.get(model_name)
#We need to take the context without the language information, because we want to read the
#value store in db and not on the one associate with current language.
context_wo_lang = context.copy()
context_wo_lang.pop('lang', None)
res[record.id] = model.read(cr, uid, record.res_id, [field], context=context_wo_lang)[field]
return res
def _set_src(self, cr, uid, id, name, value, args, context=None):
''' When changing source term of a translation, change its value in db for
the associated object, and the src field
'''
if context is None:
context = {}
record = self.browse(cr, uid, id, context=context)
if value and record.type == 'model':
model_name, field = record.name.split(',')
model = self.pool.get(model_name)
#We need to take the context without the language information, because we want to write on the
#value store in db and not on the one associate with current language.
#Also not removing lang from context trigger an error when lang is different
context_wo_lang = context.copy()
context_wo_lang.pop('lang', None)
model.write(cr, uid, record.res_id, {field: value}, context=context_wo_lang)
return self.write(cr, uid, id, {'src': value}, context=context)
_columns = {
'name': fields.char('Translated field', required=True),
'res_id': fields.integer('Record ID', select=True),
'lang': fields.selection(_get_language, string='Language'),
'type': fields.selection(TRANSLATION_TYPE, string='Type', select=True),
'src': fields.text('Source'),
'src': fields.text('Old source'),
'source': fields.function(_get_src, fnct_inv=_set_src, type='text', string='Source'),
'value': fields.text('Translation Value'),
'module': fields.char('Module', help="Module this term belongs to", select=True),
@ -300,7 +339,7 @@ class ir_translation(osv.osv):
return trad
def create(self, cr, uid, vals, context=None):
if not context:
if context is None:
context = {}
ids = super(ir_translation, self).create(cr, uid, vals, context=context)
self._get_source.clear_cache(self, uid, vals.get('name',0), vals.get('type',0), vals.get('lang',0), vals.get('src',0))
@ -308,7 +347,7 @@ class ir_translation(osv.osv):
return ids
def write(self, cursor, user, ids, vals, context=None):
if not context:
if context is None:
context = {}
if isinstance(ids, (int, long)):
ids = [ids]
@ -323,7 +362,7 @@ class ir_translation(osv.osv):
return result
def unlink(self, cursor, user, ids, context=None):
if not context:
if context is None:
context = {}
if isinstance(ids, (int, long)):
ids = [ids]

View File

@ -14,7 +14,7 @@
domain="[('comments', 'like', 'openerp-web')]"/>
<field name="name" operator="="/>
<field name="lang"/>
<field name="src"/>
<field name="source"/>
<field name="value"/>
</search>
</field>
@ -38,7 +38,7 @@
<field name="res_id"/>
</group>
<group string="Source Term">
<field name="src" nolabel="1" height="400"/>
<field name="source" nolabel="1" height="400"/>
</group>
<group string="Translation">
<field name="value" nolabel="1" height="400"/>
@ -55,7 +55,7 @@
<field name="model">ir.translation</field>
<field name="arch" type="xml">
<tree string="Translations" editable="top">
<field name="src"/>
<field name="source"/>
<field name="value"/>
<field name="name"/>
<field name="lang"/>

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:

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 {}

View File

@ -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>

View File

@ -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',

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)

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
@ -257,7 +257,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):

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)

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,50 +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'):
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))
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_company_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 = {}
@ -410,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')
@ -450,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 = []
@ -510,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):
@ -570,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'] = ''

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}"
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)]}"/>
<label for="use_parent_address" class="oe_edit_only" attrs="{'invisible': [('parent_id','=', 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>

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);

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,251 @@ 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')
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()

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")
# --------------------------------------------------

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)

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):

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

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]))

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/>.
#
##############################################################################

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

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
#
##############################################################################

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:

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:

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)

View File

@ -42,6 +42,8 @@ def get_addons_from_paths(paths, exclude):
if os.path.exists(p):
names = list(set(os.listdir(p)))
names = filter(lambda a: not (a.startswith('.') or a in exclude), names)
names = filter(lambda a: os.path.isdir(os.path.join(p, a)), names)
names = filter(lambda a: os.path.exists(os.path.join(p, a, '__openerp__.py')), names)
module_names.extend(names)
else:
print "The addons path `%s` doesn't exist." % p

View File

@ -120,6 +120,8 @@ setuptools.setup(
'docutils',
'feedparser',
'gdata',
'gevent',
'gevent-psycopg2',
'Jinja2',
'lxml', # windows binary http://www.lfd.uci.edu/~gohlke/pythonlibs/
'mako',