[MERGE] Sync with 7.0
bzr revid: tde@openerp.com-20130425143852-vslppf235z2dyhjc bzr revid: tde@openerp.com-20130426074512-10d3bsx7f0cki2aj
This commit is contained in:
commit
229bb1333b
File diff suppressed because it is too large
Load Diff
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-server\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
|
||||
"PO-Revision-Date: 2012-12-26 19:26+0000\n"
|
||||
"Last-Translator: Ahti Hinnov <sipelgas@gmail.com>\n"
|
||||
"PO-Revision-Date: 2013-04-25 15:21+0000\n"
|
||||
"Last-Translator: Illimar Saatväli <is@hot.ee>\n"
|
||||
"Language-Team: Estonian <et@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-08 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16523)\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-26 06:23+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
@ -39,7 +39,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
|
||||
|
@ -90,7 +90,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
|
||||
|
@ -106,7 +106,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
|
||||
|
@ -127,7 +127,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
|
||||
|
|
|
@ -8,15 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-server\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
|
||||
"PO-Revision-Date: 2013-04-10 02:40+0000\n"
|
||||
"Last-Translator: Maxime Chambreuil (http://www.savoirfairelinux.com) "
|
||||
"<maxime.chambreuil@savoirfairelinux.com>\n"
|
||||
"PO-Revision-Date: 2013-04-23 13:12+0000\n"
|
||||
"Last-Translator: Christophe Chauvet - http://www.syleam.fr/ <Unknown>\n"
|
||||
"Language-Team: French <fr@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-11 14:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16550)\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-24 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
@ -4954,7 +4953,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
|
||||
|
@ -5641,7 +5640,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
|
||||
|
@ -5934,7 +5933,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
|
||||
|
@ -6111,7 +6110,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
|
||||
|
@ -6152,7 +6151,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
|
||||
|
@ -6227,7 +6226,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
|
||||
|
@ -6304,7 +6303,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
|
||||
|
@ -6515,7 +6514,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
|
||||
|
@ -7052,7 +7051,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
|
||||
|
@ -7309,7 +7308,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
|
||||
|
@ -7319,7 +7318,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
|
||||
|
@ -7459,7 +7458,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
|
||||
|
@ -7595,7 +7594,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
|
||||
|
@ -8149,12 +8148,12 @@ msgstr "ir.cron"
|
|||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_sales_followup
|
||||
msgid "Payment Follow-up"
|
||||
msgstr ""
|
||||
msgstr "Relance de paiement"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.cw
|
||||
msgid "Curaçao"
|
||||
msgstr ""
|
||||
msgstr "Curaçao"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.sequence:0
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-server\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
|
||||
"PO-Revision-Date: 2013-04-16 08:22+0000\n"
|
||||
"Last-Translator: Liron Achdut <liron.achdut@gmail.com>\n"
|
||||
"PO-Revision-Date: 2013-04-21 10:53+0000\n"
|
||||
"Last-Translator: sef <Unknown>\n"
|
||||
"Language-Team: Hebrew <he@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-17 05:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16567)\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-23 06:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
@ -25,6 +25,9 @@ msgid ""
|
|||
"================================================\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"רכיב לכתיבת והדפסת המחאות\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: view:res.partner.bank:0
|
||||
|
@ -53,6 +56,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
|
||||
|
@ -63,12 +68,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
|
||||
|
@ -85,7 +90,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
|
||||
|
@ -95,7 +100,7 @@ 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
|
||||
|
@ -138,7 +143,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
|
||||
|
@ -147,11 +152,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
|
||||
|
@ -160,6 +168,8 @@ msgid ""
|
|||
"specified as a Python expression defining a list of triplets. For example: "
|
||||
"[('color','=','red')]"
|
||||
msgstr ""
|
||||
"הדומיין החלופי להגבלת ערכים אפשריים לשדות יחסים, המוגדר כביטוי של פייטון "
|
||||
"המגדיר רשימה של שלשות. לדוגמא: [('אדום','=','צבע')]"
|
||||
|
||||
#. module: base
|
||||
#: field:res.partner,ref:0
|
||||
|
@ -179,7 +189,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
|
||||
|
@ -200,6 +210,13 @@ msgid ""
|
|||
"revenue\n"
|
||||
"reports."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"הנפקת חשבוניות מתוך הוצאות, רשומות שעות עבודה\n"
|
||||
"========================================================\n"
|
||||
"\n"
|
||||
"רכיב להנפקת חשבוניות על פי הוצאות (שעות עבודה, הוצאות, וכו')\n"
|
||||
"\n"
|
||||
"באפשרותך להגדיר רשימות מחירים בניתוח חשבון, וליצור דוחות רווח צפוי"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_sequence.py:104
|
||||
|
@ -216,12 +233,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
|
||||
|
@ -232,7 +251,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
|
||||
|
@ -274,7 +293,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
|
||||
|
@ -286,6 +305,10 @@ msgid ""
|
|||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"טבלאת חשבונאות ומס צ'יליאני\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale
|
||||
|
@ -297,12 +320,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
|
||||
|
@ -336,6 +359,12 @@ msgid ""
|
|||
" - tree_but_open\n"
|
||||
"For defaults, an optional condition"
|
||||
msgstr ""
|
||||
"לעולות, אחת ממשבצות הפעולה האפשריות:\n"
|
||||
" - לקוח_פעולה_מרובה\n"
|
||||
" - לקוח_הדפסה_מרובה\n"
|
||||
" - לקוח_ פעולה_קשורה\n"
|
||||
" - עץ_אבל_פתוח\n"
|
||||
"לברירות מחדל, תנאי חלופי"
|
||||
|
||||
#. module: base
|
||||
#: sql_constraint:res.lang:0
|
||||
|
@ -382,6 +411,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
|
||||
|
@ -390,6 +427,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
|
||||
|
@ -457,7 +496,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
|
||||
|
@ -479,7 +518,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: field:ir.model.relation,name:0
|
||||
msgid "Relation Name"
|
||||
msgstr ""
|
||||
msgstr "שם היחס"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.rule:0
|
||||
|
@ -534,7 +573,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
|
||||
|
@ -550,6 +589,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
|
||||
|
@ -573,6 +622,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
|
||||
|
@ -627,7 +687,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
|
||||
|
@ -637,7 +697,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
|
||||
|
@ -653,7 +713,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
|
||||
|
@ -666,7 +726,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
|
||||
|
@ -715,22 +775,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
|
||||
|
@ -780,6 +840,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
|
||||
|
@ -805,7 +871,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
|
||||
|
@ -825,7 +891,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
|
||||
|
@ -944,7 +1010,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
|
||||
|
@ -960,6 +1026,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
|
||||
|
@ -980,7 +1047,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: view:res.partner:0
|
||||
msgid "My Partners"
|
||||
msgstr ""
|
||||
msgstr "השותפים שלי"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.zw
|
||||
|
@ -996,7 +1063,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: view:ir.actions.report.xml:0
|
||||
msgid "XML Report"
|
||||
msgstr ""
|
||||
msgstr "דו\"ח XML"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.es
|
||||
|
@ -1012,7 +1079,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: model:ir.model,name:base.model_base_module_upgrade
|
||||
msgid "Module Upgrade"
|
||||
msgstr ""
|
||||
msgstr "שדרוג הרכיב"
|
||||
|
||||
#. module: base
|
||||
#: view:res.bank:0
|
||||
|
@ -1263,6 +1330,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
|
||||
|
@ -1299,7 +1368,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
|
||||
|
@ -2616,7 +2685,7 @@ msgstr "שער נוכחי"
|
|||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
msgid "Greek / Ελληνικά"
|
||||
msgstr ""
|
||||
msgstr "יוונית / Ελληνικά"
|
||||
|
||||
#. module: base
|
||||
#: field:res.company,custom_footer:0
|
||||
|
@ -5707,7 +5776,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
|
||||
|
@ -7958,7 +8027,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
|
||||
|
@ -11094,7 +11163,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
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-server\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
|
||||
"PO-Revision-Date: 2013-04-14 17:36+0000\n"
|
||||
"PO-Revision-Date: 2013-04-24 19:22+0000\n"
|
||||
"Last-Translator: Ayhan KIZILTAN <Unknown>\n"
|
||||
"Language-Team: Turkish <tr@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-15 06:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16564)\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-25 06:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
@ -420,6 +420,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
|
||||
|
@ -428,6 +431,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
|
||||
|
@ -496,6 +501,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
|
||||
|
@ -649,6 +656,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
|
||||
|
@ -790,6 +811,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
|
||||
|
@ -807,6 +854,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
|
||||
|
@ -842,7 +895,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
|
||||
|
@ -3225,7 +3278,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: view:res.company:0
|
||||
msgid "e.g. Global Business Solutions"
|
||||
msgstr ""
|
||||
msgstr "e.g. Global İş Çözümleri"
|
||||
|
||||
#. module: base
|
||||
#: field:res.company,rml_header1:0
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-server\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
|
||||
"PO-Revision-Date: 2013-01-12 11:35+0000\n"
|
||||
"Last-Translator: 盈通 ccdos <ccdos@163.com>\n"
|
||||
"PO-Revision-Date: 2013-04-22 08:15+0000\n"
|
||||
"Last-Translator: Joshua Jan(SHINEIT) <popkar77@gmail.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-03-08 05:23+0000\n"
|
||||
"X-Generator: Launchpad (build 16523)\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-23 06:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
@ -33,7 +33,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: view:res.partner.bank:0
|
||||
msgid "e.g. GEBABEBB"
|
||||
msgstr ""
|
||||
msgstr "例如:GEBABEBB"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
@ -581,6 +581,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
|
||||
|
@ -848,7 +856,7 @@ msgstr ""
|
|||
"\n"
|
||||
"OpenERP Web LinkedIn 模块.\n"
|
||||
"============================\n"
|
||||
"这个模块在OpenERP上提供了一体化的Linke dIn\n"
|
||||
"此模块用于在OpenERP中集成LinkedIn.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
|
@ -875,7 +883,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
|
||||
|
@ -1080,7 +1088,7 @@ msgstr "模块升级"
|
|||
#: view:res.partner.bank:0
|
||||
#: view:res.users:0
|
||||
msgid "ZIP"
|
||||
msgstr ""
|
||||
msgstr "邮政编码"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
|
@ -1114,7 +1122,10 @@ msgid ""
|
|||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"这模块目的是管理员工的考勤 根据执行的签入/签出的动作保存员工帐户的考勤记录。\n"
|
||||
"此模块用于管理员工的考勤.\n"
|
||||
"==================================================\n"
|
||||
"\n"
|
||||
"以员工的登入/退出时间为准,记录员工考勤.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
|
@ -1235,7 +1246,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
|
||||
|
@ -1788,6 +1799,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
|
||||
|
@ -1830,7 +1855,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
|
||||
|
@ -2811,6 +2836,9 @@ msgid ""
|
|||
"==================================\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"美国 - 会计科目\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_url,target:0
|
||||
|
@ -2867,6 +2895,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
|
||||
|
@ -3013,6 +3051,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
|
||||
|
@ -12295,7 +12341,7 @@ msgstr "报表类型"
|
|||
#: view:res.partner.bank:0
|
||||
#: view:res.users:0
|
||||
msgid "State"
|
||||
msgstr "状态"
|
||||
msgstr "省"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
|
@ -14660,7 +14706,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
|
||||
|
|
|
@ -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 ''))
|
||||
|
||||
|
@ -186,12 +189,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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -253,7 +253,7 @@ class res_company(osv.osv):
|
|||
vals.update({'partner_id': partner_id})
|
||||
self.cache_restart(cr)
|
||||
company_id = super(res_company, self).create(cr, uid, vals, context=context)
|
||||
obj_partner.write(cr, uid, partner_id, {'company_id': company_id}, context=context)
|
||||
obj_partner.write(cr, uid, [partner_id], {'company_id': company_id}, context=context)
|
||||
return company_id
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
|
|
|
@ -30,6 +30,7 @@ from openerp import SUPERUSER_ID
|
|||
from openerp import pooler, 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,9 @@ 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')
|
||||
POSTAL_ADDRESS_FIELDS = ADDRESS_FIELDS # deprecated, to remove after 7.0
|
||||
|
||||
class res_partner(osv.osv, format_address):
|
||||
_description = 'Partner'
|
||||
|
@ -193,13 +195,28 @@ class res_partner(osv.osv, format_address):
|
|||
result[obj.id] = obj.image != False
|
||||
return result
|
||||
|
||||
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
|
||||
|
||||
# indirection 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)
|
||||
|
||||
_order = "name"
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=128, required=True, select=True),
|
||||
'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 +281,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')
|
||||
}
|
||||
|
||||
def _default_category(self, cr, uid, context=None):
|
||||
|
@ -302,8 +322,8 @@ class res_partner(osv.osv, format_address):
|
|||
'company_id': lambda self, cr, uid, ctx: self.pool.get('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,
|
||||
}
|
||||
|
||||
|
@ -322,7 +342,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')]}
|
||||
|
@ -332,11 +351,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:
|
||||
|
@ -362,56 +392,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]
|
||||
if vals.get('is_company')==False:
|
||||
vals.update({'child_ids' : [(5,)]})
|
||||
for partner in self.browse(cr, uid, ids, context=context):
|
||||
update_ids = []
|
||||
if partner.is_company:
|
||||
domain_children = [('parent_id', '=', partner.id), ('use_parent_address', '=', True)]
|
||||
update_ids = self.search(cr, uid, domain_children, context=context)
|
||||
elif partner.parent_id:
|
||||
if vals.get('use_parent_address')==True:
|
||||
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)
|
||||
if 'use_parent_address' not in vals and 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_parent_address'):
|
||||
# 1a. Commercial fields: sync if parent changed
|
||||
if update_values.get('parent_id'):
|
||||
self._commercial_sync_from_company(cr, uid, partner, context=context)
|
||||
# 1b. Address fields: sync if parent or use_parent changed *and* both are now set
|
||||
if partner.parent_id and partner.use_parent_address:
|
||||
onchange_vals = self.onchange_address(cr, uid, [partner.id],
|
||||
use_parent_address=partner.use_parent_address,
|
||||
parent_id=partner.parent_id.id,
|
||||
context=context).get('value', {})
|
||||
partner.update_address(onchange_vals)
|
||||
|
||||
# 2. To DOWNSTREAM: sync children
|
||||
if partner.child_ids:
|
||||
# 2a. Commercial Fields: sync if commercial entity
|
||||
if partner.commercial_partner_id == partner:
|
||||
self._commercial_sync_to_children(cr, uid, partner, context=context)
|
||||
# 2b. Address fields: sync if address changed
|
||||
address_fields = self._address_fields(cr, uid, context=context)
|
||||
if any(field in update_values for field in address_fields):
|
||||
domain_children = [('parent_id', '=', partner.id), ('use_parent_address', '=', True)]
|
||||
update_ids = self.search(cr, uid, domain_children, context=context)
|
||||
self.update_address(cr, uid, update_ids, update_values, context=context)
|
||||
|
||||
def _handle_first_contact_creation(self, cr, uid, partner, context=None):
|
||||
""" On creation of first contact for a company (or root) that has no address, assume contact address
|
||||
was meant to be company address """
|
||||
parent = partner.parent_id
|
||||
address_fields = self._address_fields(cr, uid, context=context)
|
||||
if parent and (parent.is_company or not parent.parent_id) and len(parent.child_ids) == 1 and \
|
||||
any(partner[f] for f in address_fields) and not any(parent[f] for f in address_fields):
|
||||
addr_vals = self._update_fields_values(cr, uid, partner, address_fields, context=context)
|
||||
parent.update_address(addr_vals)
|
||||
if not parent.is_company:
|
||||
parent.write({'is_company': True})
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
result = super(res_partner,self).write(cr, uid, ids, vals, context=context)
|
||||
for partner in self.browse(cr, uid, ids, context=context):
|
||||
self._fields_sync(cr, uid, partner, vals, context)
|
||||
return result
|
||||
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
new_id = super(res_partner, self).create(cr, uid, vals, context=context)
|
||||
partner = self.browse(cr, uid, new_id, context=context)
|
||||
self._fields_sync(cr, uid, partner, vals, context)
|
||||
self._handle_first_contact_creation(cr, uid, partner, context)
|
||||
return new_id
|
||||
|
||||
def open_commercial_entity(self, cr, uid, ids, context=None):
|
||||
""" Utility method used to add an "Open Company" button in partner views """
|
||||
partner = self.browse(cr, uid, ids[0], context=context)
|
||||
return {'type': 'ir.actions.act_window',
|
||||
'res_model': 'res.partner',
|
||||
'view_mode': 'form',
|
||||
'res_id': partner.commercial_partner_id.id,
|
||||
'target': 'new',
|
||||
'flags': {'form': {'action_buttons': True}}}
|
||||
|
||||
def open_parent(self, cr, uid, ids, context=None):
|
||||
""" Utility method used to add an "Open Parent" button in partner views """
|
||||
partner = self.browse(cr, uid, ids[0], context=context)
|
||||
return {'type': 'ir.actions.act_window',
|
||||
'res_model': 'res.partner',
|
||||
'view_mode': 'form',
|
||||
'res_id': partner.parent_id.id,
|
||||
'target': 'new',
|
||||
'flags': {'form': {'action_buttons': True}}}
|
||||
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
|
@ -420,8 +528,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')
|
||||
|
@ -460,6 +568,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 = []
|
||||
|
@ -520,25 +637,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):
|
||||
|
@ -580,8 +714,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'] = ''
|
||||
|
|
|
@ -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),('use_parent_address','=',False)]}"/>
|
||||
<label for="use_parent_address" class="oe_edit_only" attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"/>
|
||||
<button name="open_parent" type="object" string="(edit company address)" class="oe_link oe_edit_only"
|
||||
attrs="{'invisible': ['|',('parent_id','=', False),('use_parent_address','=',False)]}"/>
|
||||
<field name="street" placeholder="Street..." attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
<field name="street2" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
<div class="address_format">
|
||||
<field name="city" placeholder="City" style="width: 40%%"/>
|
||||
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/>
|
||||
<field name="zip" placeholder="ZIP" style="width: 20%%"/>
|
||||
<field name="city" placeholder="City" style="width: 40%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
<field name="zip" placeholder="ZIP" style="width: 20%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
</div>
|
||||
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/>
|
||||
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}' attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
</div>
|
||||
<field name="website" widget="url" placeholder="e.g. www.openerp.com"/>
|
||||
</group>
|
||||
|
@ -182,8 +185,8 @@
|
|||
</group>
|
||||
|
||||
<notebook colspan="4">
|
||||
<page string="Contacts" attrs="{'invisible': [('is_company','=',False)]}" autofocus="autofocus">
|
||||
<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>
|
||||
|
|
|
@ -40,6 +40,234 @@ class test_base(common.TransactionCase):
|
|||
self.assertTrue(new_id2 > new_id, 'find_or_create failed - should have created new one again')
|
||||
|
||||
|
||||
def test_20_res_partner_address_sync(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
ghoststep = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
|
||||
{'name': 'GhostStep',
|
||||
'is_company': True,
|
||||
'street': 'Main Street, 10',
|
||||
'phone': '123456789',
|
||||
'email': 'info@ghoststep.com',
|
||||
'vat': 'BE0477472701',
|
||||
'type': 'default'}))
|
||||
p1 = self.res_partner.browse(cr, uid, self.res_partner.name_create(cr, uid, 'Denis Bladesmith <denis.bladesmith@ghoststep.com>')[0])
|
||||
self.assertEqual(p1.type, 'contact', 'Default type must be "contact"')
|
||||
p1phone = '123456789#34'
|
||||
p1.write({'phone': p1phone,
|
||||
'parent_id': ghoststep.id,
|
||||
'use_parent_address': True})
|
||||
p1.refresh()
|
||||
self.assertEqual(p1.street, ghoststep.street, 'Address fields must be synced')
|
||||
self.assertEqual(p1.phone, p1phone, 'Phone should be preserved after address sync')
|
||||
self.assertEqual(p1.type, 'contact', 'Type should be preserved after address sync')
|
||||
self.assertEqual(p1.email, 'denis.bladesmith@ghoststep.com', 'Email should be preserved after sync')
|
||||
|
||||
# turn off sync
|
||||
p1street = 'Different street, 42'
|
||||
p1.write({'street': p1street,
|
||||
'use_parent_address': False})
|
||||
p1.refresh(), ghoststep.refresh()
|
||||
self.assertEqual(p1.street, p1street, 'Address fields must not be synced after turning sync off')
|
||||
self.assertNotEqual(ghoststep.street, p1street, 'Parent address must never be touched')
|
||||
|
||||
# turn on sync again
|
||||
p1.write({'use_parent_address': True})
|
||||
p1.refresh()
|
||||
self.assertEqual(p1.street, ghoststep.street, 'Address fields must be synced again')
|
||||
self.assertEqual(p1.phone, p1phone, 'Phone should be preserved after address sync')
|
||||
self.assertEqual(p1.type, 'contact', 'Type should be preserved after address sync')
|
||||
self.assertEqual(p1.email, 'denis.bladesmith@ghoststep.com', 'Email should be preserved after sync')
|
||||
|
||||
# Modify parent, sync to children
|
||||
ghoststreet = 'South Street, 25'
|
||||
ghoststep.write({'street': ghoststreet})
|
||||
p1.refresh()
|
||||
self.assertEqual(p1.street, ghoststreet, 'Address fields must be synced automatically')
|
||||
self.assertEqual(p1.phone, p1phone, 'Phone should not be synced')
|
||||
self.assertEqual(p1.email, 'denis.bladesmith@ghoststep.com', 'Email should be preserved after sync')
|
||||
|
||||
p1street = 'My Street, 11'
|
||||
p1.write({'street': p1street})
|
||||
ghoststep.refresh()
|
||||
self.assertEqual(ghoststep.street, ghoststreet, 'Touching contact should never alter parent')
|
||||
|
||||
|
||||
def test_30_res_partner_first_contact_sync(self):
|
||||
""" Test initial creation of company/contact pair where contact address gets copied to
|
||||
company """
|
||||
cr, uid = self.cr, self.uid
|
||||
ironshield = self.res_partner.browse(cr, uid, self.res_partner.name_create(cr, uid, 'IronShield')[0])
|
||||
self.assertFalse(ironshield.is_company, 'Partners are not companies by default')
|
||||
self.assertFalse(ironshield.use_parent_address, 'use_parent_address defaults to False')
|
||||
self.assertEqual(ironshield.type, 'contact', 'Default type must be "contact"')
|
||||
ironshield.write({'type': 'default'}) # force default type to double-check sync
|
||||
p1 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
|
||||
{'name': 'Isen Hardearth',
|
||||
'street': 'Strongarm Avenue, 12',
|
||||
'parent_id': ironshield.id}))
|
||||
self.assertEquals(p1.type, 'contact', 'Default type must be "contact", not the copied parent type')
|
||||
ironshield.refresh()
|
||||
self.assertEqual(ironshield.street, p1.street, 'Address fields should be copied to company')
|
||||
self.assertTrue(ironshield.is_company, 'Company flag should be turned on after first contact creation')
|
||||
|
||||
def test_40_res_partner_address_getc(self):
|
||||
""" Test address_get address resolution mechanism: it should first go down through descendants,
|
||||
stopping when encountering another is_copmany entity, then go up, stopping again at the first
|
||||
is_company entity or the root ancestor and if nothing matches, it should use the provided partner
|
||||
itself """
|
||||
cr, uid = self.cr, self.uid
|
||||
elmtree = self.res_partner.browse(cr, uid, self.res_partner.name_create(cr, uid, 'Elmtree')[0])
|
||||
branch1 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Branch 1',
|
||||
'parent_id': elmtree.id,
|
||||
'is_company': True}))
|
||||
leaf10 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 10',
|
||||
'parent_id': branch1.id,
|
||||
'type': 'invoice'}))
|
||||
branch11 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Branch 11',
|
||||
'parent_id': branch1.id,
|
||||
'type': 'other'}))
|
||||
leaf111 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 111',
|
||||
'parent_id': branch11.id,
|
||||
'type': 'delivery'}))
|
||||
branch11.write({'is_company': False}) # force is_company after creating 1rst child
|
||||
branch2 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Branch 2',
|
||||
'parent_id': elmtree.id,
|
||||
'is_company': True}))
|
||||
leaf21 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 21',
|
||||
'parent_id': branch2.id,
|
||||
'type': 'delivery'}))
|
||||
leaf22 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 22',
|
||||
'parent_id': branch2.id}))
|
||||
leaf23 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid, {'name': 'Leaf 23',
|
||||
'parent_id': branch2.id,
|
||||
'type': 'default'}))
|
||||
# go up, stop at branch1
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf111.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf111.id,
|
||||
'invoice': leaf10.id,
|
||||
'contact': branch1.id,
|
||||
'other': branch11.id,
|
||||
'default': leaf111.id}, 'Invalid address resolution')
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [branch11.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf111.id,
|
||||
'invoice': leaf10.id,
|
||||
'contact': branch1.id,
|
||||
'other': branch11.id,
|
||||
'default': branch11.id}, 'Invalid address resolution')
|
||||
|
||||
# go down, stop at at all child companies
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [elmtree.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': elmtree.id,
|
||||
'invoice': elmtree.id,
|
||||
'contact': elmtree.id,
|
||||
'other': elmtree.id,
|
||||
'default': elmtree.id}, 'Invalid address resolution')
|
||||
|
||||
# go down through children
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [branch1.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf111.id,
|
||||
'invoice': leaf10.id,
|
||||
'contact': branch1.id,
|
||||
'other': branch11.id,
|
||||
'default': branch1.id}, 'Invalid address resolution')
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [branch2.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf21.id,
|
||||
'invoice': leaf23.id,
|
||||
'contact': branch2.id,
|
||||
'other': leaf23.id,
|
||||
'default': leaf23.id}, 'Invalid address resolution')
|
||||
|
||||
# go up then down through siblings
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf21.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf21.id,
|
||||
'invoice': leaf23.id,
|
||||
'contact': branch2.id,
|
||||
'other': leaf23.id,
|
||||
'default': leaf23.id
|
||||
}, 'Invalid address resolution, should scan commercial entity ancestor and its descendants')
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf22.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf21.id,
|
||||
'invoice': leaf23.id,
|
||||
'contact': leaf22.id,
|
||||
'other': leaf23.id,
|
||||
'default': leaf23.id}, 'Invalid address resolution, should scan commercial entity ancestor and its descendants')
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf23.id], ['delivery', 'invoice', 'contact', 'other', 'default']),
|
||||
{'delivery': leaf21.id,
|
||||
'invoice': leaf23.id,
|
||||
'contact': branch2.id,
|
||||
'other': leaf23.id,
|
||||
'default': leaf23.id}, 'Invalid address resolution, `default` should only override if no partner with specific type exists')
|
||||
|
||||
# empty adr_pref means only 'default'
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [elmtree.id], []),
|
||||
{'default': elmtree.id}, 'Invalid address resolution, no default means commercial entity ancestor')
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf111.id], []),
|
||||
{'default': leaf111.id}, 'Invalid address resolution, no default means contact itself')
|
||||
branch11.write({'type': 'default'})
|
||||
self.assertEqual(self.res_partner.address_get(cr, uid, [leaf111.id], []),
|
||||
{'default': branch11.id}, 'Invalid address resolution, branch11 should now be default')
|
||||
|
||||
|
||||
def test_50_res_partner_commercial_sync(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
p0 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
|
||||
{'name': 'Sigurd Sunknife',
|
||||
'email': 'ssunknife@gmail.com'}))
|
||||
sunhelm = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
|
||||
{'name': 'Sunhelm',
|
||||
'is_company': True,
|
||||
'street': 'Rainbow Street, 13',
|
||||
'phone': '1122334455',
|
||||
'email': 'info@sunhelm.com',
|
||||
'vat': 'BE0477472701',
|
||||
'child_ids': [(4, p0.id),
|
||||
(0, 0, {'name': 'Alrik Greenthorn',
|
||||
'email': 'agr@sunhelm.com'})],
|
||||
}))
|
||||
p1 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
|
||||
{'name': 'Otto Blackwood',
|
||||
'email': 'otto.blackwood@sunhelm.com',
|
||||
'parent_id': sunhelm.id}))
|
||||
p11 = self.res_partner.browse(cr, uid, self.res_partner.create(cr, uid,
|
||||
{'name': 'Gini Graywool',
|
||||
'email': 'ggr@sunhelm.com',
|
||||
'parent_id': p1.id}))
|
||||
p2 = self.res_partner.browse(cr, uid, self.res_partner.search(cr, uid,
|
||||
[('email', '=', 'agr@sunhelm.com')])[0])
|
||||
|
||||
for p in (p0, p1, p11, p2):
|
||||
p.refresh()
|
||||
self.assertEquals(p.commercial_partner_id, sunhelm, 'Incorrect commercial entity resolution')
|
||||
self.assertEquals(p.vat, sunhelm.vat, 'Commercial fields must be automatically synced')
|
||||
sunhelmvat = 'BE0123456789'
|
||||
sunhelm.write({'vat': sunhelmvat})
|
||||
for p in (p0, p1, p11, p2):
|
||||
p.refresh()
|
||||
self.assertEquals(p.vat, sunhelmvat, 'Commercial fields must be automatically and recursively synced')
|
||||
|
||||
p1vat = 'BE0987654321'
|
||||
p1.write({'vat': p1vat})
|
||||
for p in (sunhelm, p0, p11, p2):
|
||||
p.refresh()
|
||||
self.assertEquals(p.vat, sunhelmvat, 'Sync to children should only work downstream and on commercial entities')
|
||||
|
||||
# promote p1 to commercial entity
|
||||
vals = p1.onchange_type(is_company=True)['value']
|
||||
p1.write(dict(vals, parent_id=sunhelm.id,
|
||||
is_company=True,
|
||||
name='Sunhelm Subsidiary'))
|
||||
p1.refresh()
|
||||
self.assertEquals(p1.vat, p1vat, 'Setting is_company should stop auto-sync of commercial fields')
|
||||
self.assertEquals(p1.commercial_partner_id, p1, 'Incorrect commercial entity resolution after setting is_company')
|
||||
|
||||
# writing on parent should not touch child commercial entities
|
||||
sunhelmvat2 = 'BE0112233445'
|
||||
sunhelm.write({'vat': sunhelmvat2})
|
||||
p1.refresh()
|
||||
self.assertEquals(p1.vat, p1vat, 'Setting is_company should stop auto-sync of commercial fields')
|
||||
p0.refresh()
|
||||
self.assertEquals(p0.vat, sunhelmvat2, 'Commercial fields must be automatically synced')
|
||||
|
||||
class test_partner_recursion(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
|
|
|
@ -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")
|
||||
|
||||
# --------------------------------------------------
|
||||
|
|
|
@ -791,7 +791,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):
|
||||
|
|
|
@ -4792,8 +4792,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:
|
||||
|
@ -4811,6 +4811,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:
|
||||
|
|
|
@ -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/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
|
|
@ -177,7 +177,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)
|
||||
|
||||
def stop(self, graceful=True):
|
||||
if graceful:
|
||||
|
|
Loading…
Reference in New Issue