[MERGE]: Merge with lp:openobject-server

bzr revid: atp@tinyerp.com-20120316042909-gb2e5cmrilyyhsef
bzr revid: atp@tinyerp.com-20120320050251-bgk9xhsfmb1fws1p
This commit is contained in:
Atul Patel (OpenERP) 2012-03-20 10:32:51 +05:30
commit 258722cc1c
23 changed files with 15767 additions and 338 deletions

View File

@ -1,23 +1,18 @@
*.pyc
.*.swp .*.swp
.bzrignore .bzrignore
.idea
.project
.pydevproject
.ropeproject
.settings
.DS_Store
openerp/addons/* openerp/addons/*
openerp/filestore* openerp/filestore*
.Python .Python
include
lib
bin/activate
bin/activate_this.py
bin/easy_install
bin/easy_install-2.6
bin/pip
bin/python
bin/python2.6
*.pyc *.pyc
*.pyo *.pyo
bin/*
build/ build/
bin/yolk include/
bin/pil*.py lib/
.project share/
.pydevproject
.settings

View File

@ -165,11 +165,16 @@ def dumpstacks(sig, frame):
""" Signal handler: dump a stack trace for each existing thread.""" """ Signal handler: dump a stack trace for each existing thread."""
# code from http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application#answer-2569696 # code from http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application#answer-2569696
# modified for python 2.5 compatibility # modified for python 2.5 compatibility
thread_map = dict(threading._active, **threading._limbo) threads_info = dict([(th.ident, {'name': th.name,
id2name = dict([(threadId, thread.getName()) for threadId, thread in thread_map.items()]) 'uid': getattr(th,'uid','n/a')})
for th in threading.enumerate()])
code = [] code = []
for threadId, stack in sys._current_frames().items(): for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %s(%d)" % (id2name[threadId], threadId)) thread_info = threads_info.get(threadId)
code.append("\n# Thread: %s (id:%s) (uid:%s)" % \
(thread_info and thread_info['name'] or 'n/a',
threadId,
thread_info and thread_info['uid'] or 'n/a'))
for filename, lineno, name, line in traceback.extract_stack(stack): for filename, lineno, name, line in traceback.extract_stack(stack):
code.append('File: "%s", line %d, in %s' % (filename, lineno, name)) code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line: if line:

View File

@ -199,7 +199,7 @@
<field name="code">cf</field> <field name="code">cf</field>
</record> </record>
<record id="cd" model="res.country"> <record id="cd" model="res.country">
<field name="name">Congo, The Democratic Republic of the</field> <field name="name">Congo, Democratic Republic of the</field>
<field name="code">cd</field> <field name="code">cd</field>
</record> </record>
<record id="cg" model="res.country"> <record id="cg" model="res.country">

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n" "Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n" "Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:44+0000\n" "POT-Creation-Date: 2012-02-08 00:44+0000\n"
"PO-Revision-Date: 2012-01-08 15:06+0000\n" "PO-Revision-Date: 2012-03-19 10:06+0000\n"
"Last-Translator: kifcaliph <Unknown>\n" "Last-Translator: Abdulwhhab A. Al-Shehri <Unknown>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-03-10 04:46+0000\n" "X-Launchpad-Export-Date: 2012-03-20 04:55+0000\n"
"X-Generator: Launchpad (build 14914)\n" "X-Generator: Launchpad (build 14969)\n"
#. module: base #. module: base
#: model:res.country,name:base.sh #: model:res.country,name:base.sh
@ -367,7 +367,7 @@ msgstr "اسم المعالج"
#. module: base #. module: base
#: model:res.groups,name:base.group_partner_manager #: model:res.groups,name:base.group_partner_manager
msgid "Partner Manager" msgid "Partner Manager"
msgstr "" msgstr "إدارة الشركاء"
#. module: base #. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management #: model:ir.module.category,name:base.module_category_customer_relationship_management
@ -388,7 +388,7 @@ msgstr "تجميع غير ممكن"
#. module: base #. module: base
#: field:ir.module.category,child_ids:0 #: field:ir.module.category,child_ids:0
msgid "Child Applications" msgid "Child Applications"
msgstr "" msgstr "التطبيقات الفرعية"
#. module: base #. module: base
#: field:res.partner,credit_limit:0 #: field:res.partner,credit_limit:0
@ -408,7 +408,7 @@ msgstr "تاريخ التحديث"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_base_action_rule #: model:ir.module.module,shortdesc:base.module_base_action_rule
msgid "Automated Action Rules" msgid "Automated Action Rules"
msgstr "" msgstr "قواعد الاحداث التلقائية"
#. module: base #. module: base
#: view:ir.attachment:0 #: view:ir.attachment:0
@ -473,11 +473,13 @@ msgid ""
"The user this filter is available to. When left empty the filter is usable " "The user this filter is available to. When left empty the filter is usable "
"by the system only." "by the system only."
msgstr "" msgstr ""
"مرشحات المستخدم غير متوفرة. عندما يترك فارغا فان المرشح يستخدم بواسطة النظام "
"فقط."
#. module: base #. module: base
#: help:res.partner,website:0 #: help:res.partner,website:0
msgid "Website of Partner." msgid "Website of Partner."
msgstr "" msgstr "موقع إلكتروني للشريك."
#. module: base #. module: base
#: help:ir.actions.act_window,views:0 #: help:ir.actions.act_window,views:0
@ -506,7 +508,7 @@ msgstr "تنسيق التاريخ"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_base_report_designer #: model:ir.module.module,shortdesc:base.module_base_report_designer
msgid "OpenOffice Report Designer" msgid "OpenOffice Report Designer"
msgstr "" msgstr "مصمم تقارير اوبن اوفيس"
#. module: base #. module: base
#: field:res.bank,email:0 #: field:res.bank,email:0
@ -566,7 +568,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_sale_layout #: model:ir.module.module,shortdesc:base.module_sale_layout
msgid "Sales Orders Print Layout" msgid "Sales Orders Print Layout"
msgstr "" msgstr "تنسيق طباعة اوامر البيع"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
@ -576,7 +578,7 @@ msgstr "الأسبانية"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice #: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice
msgid "Invoice on Timesheets" msgid "Invoice on Timesheets"
msgstr "" msgstr "فاتورة على جداول زمنية"
#. module: base #. module: base
#: view:base.module.upgrade:0 #: view:base.module.upgrade:0
@ -700,7 +702,7 @@ msgstr "تمّت عملية التصدير"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_outlook #: model:ir.module.module,shortdesc:base.module_plugin_outlook
msgid "Outlook Plug-In" msgid "Outlook Plug-In"
msgstr "" msgstr "إضافات الاوت لوك"
#. module: base #. module: base
#: view:ir.model:0 #: view:ir.model:0
@ -727,7 +729,7 @@ msgstr "الأردن"
#. module: base #. module: base
#: help:ir.cron,nextcall:0 #: help:ir.cron,nextcall:0
msgid "Next planned execution date for this job." msgid "Next planned execution date for this job."
msgstr "" msgstr "تاريخ الحدث المقرر لاحقا لهذه الوظيفة."
#. module: base #. module: base
#: code:addons/base/ir/ir_model.py:139 #: code:addons/base/ir/ir_model.py:139
@ -743,7 +745,7 @@ msgstr "إريتريا"
#. module: base #. module: base
#: sql_constraint:res.company:0 #: sql_constraint:res.company:0
msgid "The company name must be unique !" msgid "The company name must be unique !"
msgstr "" msgstr "اسم الشركة يجب أن يكون فريداً !"
#. module: base #. module: base
#: view:res.config:0 #: view:res.config:0
@ -778,7 +780,7 @@ msgstr ""
#. module: base #. module: base
#: view:ir.mail_server:0 #: view:ir.mail_server:0
msgid "Security and Authentication" msgid "Security and Authentication"
msgstr "" msgstr "الحماية و التحقق من الصلاحيات"
#. module: base #. module: base
#: view:base.language.export:0 #: view:base.language.export:0
@ -879,7 +881,7 @@ msgstr ""
#. module: base #. module: base
#: view:res.users:0 #: view:res.users:0
msgid "Email Preferences" msgid "Email Preferences"
msgstr "" msgstr "تفضيلات البريد الالكتروني"
#. module: base #. module: base
#: model:ir.module.module,description:base.module_audittrail #: model:ir.module.module,description:base.module_audittrail
@ -971,7 +973,7 @@ msgstr "نييوي"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_membership #: model:ir.module.module,shortdesc:base.module_membership
msgid "Membership Management" msgid "Membership Management"
msgstr "" msgstr "إدارة الإشتراكات"
#. module: base #. module: base
#: selection:ir.module.module,license:0 #: selection:ir.module.module,license:0
@ -998,7 +1000,7 @@ msgstr "أنواع مراجع الطلبات"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_google_base_account #: model:ir.module.module,shortdesc:base.module_google_base_account
msgid "Google Users" msgid "Google Users"
msgstr "" msgstr "مستخدمي جوجل"
#. module: base #. module: base
#: help:ir.server.object.lines,value:0 #: help:ir.server.object.lines,value:0
@ -1035,6 +1037,7 @@ msgstr "ملف TGZ"
msgid "" msgid ""
"Users added to this group are automatically added in the following groups." "Users added to this group are automatically added in the following groups."
msgstr "" msgstr ""
"الاشخاص المضافون الى هذه المجموعة أضيفوا تلقائيا الى المجموعات التالية."
#. module: base #. module: base
#: view:res.lang:0 #: view:res.lang:0
@ -1088,7 +1091,7 @@ msgstr "لا يمكن استخدام كلمات مرور فارغة لأسباب
#: code:addons/base/ir/ir_mail_server.py:192 #: code:addons/base/ir/ir_mail_server.py:192
#, python-format #, python-format
msgid "Connection test failed!" msgid "Connection test failed!"
msgstr "" msgstr "فشلت محاولة الاتصال!"
#. module: base #. module: base
#: selection:ir.actions.server,state:0 #: selection:ir.actions.server,state:0
@ -1209,7 +1212,7 @@ msgstr "الأسبانية / Español (GT)"
#. module: base #. module: base
#: field:ir.mail_server,smtp_port:0 #: field:ir.mail_server,smtp_port:0
msgid "SMTP Port" msgid "SMTP Port"
msgstr "" msgstr "المنفذ SMTP"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_import_sugarcrm #: model:ir.module.module,shortdesc:base.module_import_sugarcrm
@ -1231,7 +1234,7 @@ msgstr ""
#: code:addons/base/module/wizard/base_language_install.py:55 #: code:addons/base/module/wizard/base_language_install.py:55
#, python-format #, python-format
msgid "Language Pack" msgid "Language Pack"
msgstr "" msgstr "حزمة لغة"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_web_tests #: model:ir.module.module,shortdesc:base.module_web_tests
@ -1289,11 +1292,14 @@ msgid ""
"reference it\n" "reference it\n"
"- creation/update: a mandatory field is not correctly set" "- creation/update: a mandatory field is not correctly set"
msgstr "" msgstr ""
"لا يمكن إكمال العملية، ربما بسبب أحد الاسباب التالية:\n"
"-الحذف: ربما تكون تحاول حذف سجل بينما هناك سجلات اخرى تشير اليه.\n"
"الانشاء/التحديث: حقل أساسي لم يتم ادخاله بشكل صحيح."
#. module: base #. module: base
#: field:ir.module.category,parent_id:0 #: field:ir.module.category,parent_id:0
msgid "Parent Application" msgid "Parent Application"
msgstr "" msgstr "التطبيق الرئيسي"
#. module: base #. module: base
#: code:addons/base/res/res_users.py:222 #: code:addons/base/res/res_users.py:222
@ -1310,12 +1316,12 @@ msgstr "لتصدير لغة جديدة، لا تختر أي لغة."
#: model:ir.module.module,shortdesc:base.module_document #: model:ir.module.module,shortdesc:base.module_document
#: model:ir.module.module,shortdesc:base.module_knowledge #: model:ir.module.module,shortdesc:base.module_knowledge
msgid "Document Management System" msgid "Document Management System"
msgstr "" msgstr "نظام ادارة الوثائق"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_crm_claim #: model:ir.module.module,shortdesc:base.module_crm_claim
msgid "Claims Management" msgid "Claims Management"
msgstr "" msgstr "إدارة المطالبات"
#. module: base #. module: base
#: model:ir.ui.menu,name:base.menu_purchase_root #: model:ir.ui.menu,name:base.menu_purchase_root
@ -1340,6 +1346,9 @@ msgid ""
"use the accounting application of OpenERP, journals and accounts will be " "use the accounting application of OpenERP, journals and accounts will be "
"created automatically based on these data." "created automatically based on these data."
msgstr "" msgstr ""
"قم بتكوين الحسابات البنكية لشركتك و اختر ما تريده ان يظهر في اسفل التقارير. "
"بإمكانك إعادة ترتيب الحسابات من قائمة العرض. إذا كنت تستخدم ملحق الحسابات, "
"سيتم انشاء اليوميات و الحسابات تلقائيا اعتمادا على هذه البيانات."
#. module: base #. module: base
#: view:ir.module.module:0 #: view:ir.module.module:0
@ -1359,6 +1368,14 @@ msgid ""
" * Commitment Date\n" " * Commitment Date\n"
" * Effective Date\n" " * Effective Date\n"
msgstr "" msgstr ""
"\n"
"أضف تواريخ اضافية الى طلب البيع.\n"
"===============================\n"
"\n"
"يمكنك اضافة التواريخ التالية الى طلب البيع:\n"
"* التاريخ المطلوب\n"
"* التاريخ الملتزم به\n"
"* تاريخ السريان\n"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_account_sequence #: model:ir.module.module,shortdesc:base.module_account_sequence
@ -1804,7 +1821,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_hr_evaluation #: model:ir.module.module,shortdesc:base.module_hr_evaluation
msgid "Employee Appraisals" msgid "Employee Appraisals"
msgstr "" msgstr "تقييمات الموظف"
#. module: base #. module: base
#: selection:ir.actions.server,state:0 #: selection:ir.actions.server,state:0
@ -1853,7 +1870,7 @@ msgstr "نموذج ملحق"
#. module: base #. module: base
#: field:res.partner.bank,footer:0 #: field:res.partner.bank,footer:0
msgid "Display on Reports" msgid "Display on Reports"
msgstr "" msgstr "عرض على التقارير"
#. module: base #. module: base
#: model:ir.module.module,description:base.module_l10n_cn #: model:ir.module.module,description:base.module_l10n_cn
@ -2050,7 +2067,7 @@ msgstr "وضع العرض"
msgid "" msgid ""
"Display this bank account on the footer of printed documents like invoices " "Display this bank account on the footer of printed documents like invoices "
"and sales orders." "and sales orders."
msgstr "" msgstr "عرض هذا الحساب البنكي على أسفل المطبوعات مثل الفواتير وطلبات البيع."
#. module: base #. module: base
#: view:base.language.import:0 #: view:base.language.import:0
@ -2159,7 +2176,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_subscription #: model:ir.module.module,shortdesc:base.module_subscription
msgid "Recurring Documents" msgid "Recurring Documents"
msgstr "" msgstr "وثائق متكررة"
#. module: base #. module: base
#: model:res.country,name:base.bs #: model:res.country,name:base.bs
@ -2244,7 +2261,7 @@ msgstr "المجموعات"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "Spanish (CL) / Español (CL)" msgid "Spanish (CL) / Español (CL)"
msgstr "" msgstr "الأسبانية / Español (CL)"
#. module: base #. module: base
#: model:res.country,name:base.bz #: model:res.country,name:base.bz
@ -2517,7 +2534,7 @@ msgstr "استيراد / تصدير"
#. module: base #. module: base
#: model:ir.actions.todo.category,name:base.category_tools_customization_config #: model:ir.actions.todo.category,name:base.category_tools_customization_config
msgid "Tools / Customization" msgid "Tools / Customization"
msgstr "" msgstr "أدوات / تخصيصات"
#. module: base #. module: base
#: field:ir.model.data,res_id:0 #: field:ir.model.data,res_id:0
@ -2533,7 +2550,7 @@ msgstr "عنوان البريد الإلكتروني"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "French (BE) / Français (BE)" msgid "French (BE) / Français (BE)"
msgstr "" msgstr "الفرنسية / Français (BE)"
#. module: base #. module: base
#: view:ir.actions.server:0 #: view:ir.actions.server:0
@ -2768,7 +2785,7 @@ msgstr "جزيرة نورفولك"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "Korean (KR) / 한국어 (KR)" msgid "Korean (KR) / 한국어 (KR)"
msgstr "" msgstr "الكورية / 한국어 (KR)"
#. module: base #. module: base
#: help:ir.model.fields,model:0 #: help:ir.model.fields,model:0
@ -3218,7 +3235,7 @@ msgstr ""
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "Finnish / Suomi" msgid "Finnish / Suomi"
msgstr "" msgstr "الفنلندية / Suomi"
#. module: base #. module: base
#: field:ir.rule,perm_write:0 #: field:ir.rule,perm_write:0
@ -3233,7 +3250,7 @@ msgstr "اللقب"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "German / Deutsch" msgid "German / Deutsch"
msgstr "" msgstr "الألمانية / Deutsch"
#. module: base #. module: base
#: view:ir.actions.server:0 #: view:ir.actions.server:0
@ -3581,7 +3598,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_point_of_sale #: model:ir.module.module,shortdesc:base.module_point_of_sale
msgid "Point Of Sale" msgid "Point Of Sale"
msgstr "" msgstr "نقطة بيع"
#. module: base #. module: base
#: code:addons/base/module/module.py:302 #: code:addons/base/module/module.py:302
@ -3611,6 +3628,8 @@ msgid ""
"Value Added Tax number. Check the box if the partner is subjected to the " "Value Added Tax number. Check the box if the partner is subjected to the "
"VAT. Used by the VAT legal statement." "VAT. Used by the VAT legal statement."
msgstr "" msgstr ""
"رقم ضريبة القيمة المضافة. ضع علامة في هذا المربع اذا كان الشريك خاضع لضريبة "
"القيمة المضافة. تستخدم بواسطة كشف ضريبة القيمة المضافة القانونية."
#. module: base #. module: base
#: selection:ir.sequence,implementation:0 #: selection:ir.sequence,implementation:0
@ -3708,7 +3727,7 @@ msgstr "ضريبة القيمة المضافة"
#. module: base #. module: base
#: field:res.users,new_password:0 #: field:res.users,new_password:0
msgid "Set password" msgid "Set password"
msgstr "" msgstr "ضبط كلمة المرور"
#. module: base #. module: base
#: view:res.lang:0 #: view:res.lang:0
@ -3723,7 +3742,7 @@ msgstr "خطأ! لا يمكنك إنشاء فئات متداخلة."
#. module: base #. module: base
#: view:res.lang:0 #: view:res.lang:0
msgid "%x - Appropriate date representation." msgid "%x - Appropriate date representation."
msgstr "" msgstr "%x - صيغة التاريخ المناسب"
#. module: base #. module: base
#: model:ir.module.module,description:base.module_web_mobile #: model:ir.module.module,description:base.module_web_mobile
@ -3836,7 +3855,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_fetchmail #: model:ir.module.module,shortdesc:base.module_fetchmail
msgid "Email Gateway" msgid "Email Gateway"
msgstr "" msgstr "بوابة البريد الالكتروني"
#. module: base #. module: base
#: code:addons/base/ir/ir_mail_server.py:439 #: code:addons/base/ir/ir_mail_server.py:439
@ -3957,7 +3976,7 @@ msgstr "البرتغال"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_share #: model:ir.module.module,shortdesc:base.module_share
msgid "Share any Document" msgid "Share any Document"
msgstr "" msgstr "مشاركة اي مستند"
#. module: base #. module: base
#: field:ir.module.module,certificate:0 #: field:ir.module.module,certificate:0
@ -4235,6 +4254,8 @@ msgid ""
"When no specific mail server is requested for a mail, the highest priority " "When no specific mail server is requested for a mail, the highest priority "
"one is used. Default priority is 10 (smaller number = higher priority)" "one is used. Default priority is 10 (smaller number = higher priority)"
msgstr "" msgstr ""
"حين إستداعاء البريد من الخادم، يتم اختيار الملف الملقم حسب الاولوية.\r\n"
"القيمة الافتراضية هي 10 (الارقام الاصغر= اولوية أعلى)"
#. module: base #. module: base
#: model:ir.module.module,description:base.module_crm_partner_assign #: model:ir.module.module,description:base.module_crm_partner_assign
@ -4291,7 +4312,7 @@ msgstr "\"كود\" لابد أن يكون فريداً"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_hr_expense #: model:ir.module.module,shortdesc:base.module_hr_expense
msgid "Expenses Management" msgid "Expenses Management"
msgstr "" msgstr "إدارة المصروفات و النفقات"
#. module: base #. module: base
#: view:workflow.activity:0 #: view:workflow.activity:0
@ -4438,7 +4459,7 @@ msgstr "غينيا الاستوائية"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_warning #: model:ir.module.module,shortdesc:base.module_warning
msgid "Warning Messages and Alerts" msgid "Warning Messages and Alerts"
msgstr "" msgstr "رسائل التحذير و الاشعارات"
#. module: base #. module: base
#: view:base.module.import:0 #: view:base.module.import:0
@ -4613,7 +4634,7 @@ msgstr "ليسوتو"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_base_vat #: model:ir.module.module,shortdesc:base.module_base_vat
msgid "VAT Number Validation" msgid "VAT Number Validation"
msgstr "" msgstr "التحقق من رقم ضريبة القيمة المضافة"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_crm_partner_assign #: model:ir.module.module,shortdesc:base.module_crm_partner_assign
@ -4759,7 +4780,7 @@ msgstr "قيمة لاحقة من السجل للمسلسل"
#. module: base #. module: base
#: help:ir.mail_server,smtp_user:0 #: help:ir.mail_server,smtp_user:0
msgid "Optional username for SMTP authentication" msgid "Optional username for SMTP authentication"
msgstr "" msgstr "اختياري: اسم المستخدم للتحقق من قبل ملقم البريد"
#. module: base #. module: base
#: model:ir.model,name:base.model_ir_actions_actions #: model:ir.model,name:base.model_ir_actions_actions
@ -4844,7 +4865,7 @@ msgstr ""
#. module: base #. module: base
#: help:res.partner.bank,company_id:0 #: help:res.partner.bank,company_id:0
msgid "Only if this bank account belong to your company" msgid "Only if this bank account belong to your company"
msgstr "" msgstr "فقط إذا كان هذا الحساب مملوكا لشركتك"
#. module: base #. module: base
#: model:res.country,name:base.za #: model:res.country,name:base.za
@ -5171,7 +5192,7 @@ msgstr "حقل"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_project_long_term #: model:ir.module.module,shortdesc:base.module_project_long_term
msgid "Long Term Projects" msgid "Long Term Projects"
msgstr "" msgstr "مشروعات المدى البعيد"
#. module: base #. module: base
#: model:res.country,name:base.ve #: model:res.country,name:base.ve
@ -12982,7 +13003,7 @@ msgstr "الصحراء الغربية"
#. module: base #. module: base
#: model:ir.module.category,name:base.module_category_account_voucher #: model:ir.module.category,name:base.module_category_account_voucher
msgid "Invoicing & Payments" msgid "Invoicing & Payments"
msgstr "" msgstr "الفواتير و المدفوعات"
#. module: base #. module: base
#: model:ir.actions.act_window,help:base.action_res_company_form #: model:ir.actions.act_window,help:base.action_res_company_form
@ -13186,7 +13207,7 @@ msgstr ""
#. module: base #. module: base
#: field:res.partner.bank,bank_name:0 #: field:res.partner.bank,bank_name:0
msgid "Bank Name" msgid "Bank Name"
msgstr "" msgstr "اسم البنك"
#. module: base #. module: base
#: model:res.country,name:base.ki #: model:res.country,name:base.ki
@ -13232,6 +13253,8 @@ msgid ""
"are available. To add a new language, you can use the 'Load an Official " "are available. To add a new language, you can use the 'Load an Official "
"Translation' wizard available from the 'Administration' menu." "Translation' wizard available from the 'Administration' menu."
msgstr "" msgstr ""
"اللغة الافتراضية المستخدمة في الواجهات، عندما تكون هناك ترجمات متوفرة. "
"لإضافة لغة جديدة، يمكنك استخدام 'تحميل ترجمة رسمية' من قائمة \"إدارة\"."
#. module: base #. module: base
#: model:ir.module.module,description:base.module_l10n_es #: model:ir.module.module,description:base.module_l10n_es
@ -13265,7 +13288,7 @@ msgstr "ملف CSV"
#: code:addons/base/res/res_company.py:154 #: code:addons/base/res/res_company.py:154
#, python-format #, python-format
msgid "Phone: " msgid "Phone: "
msgstr "" msgstr "هاتف "
#. module: base #. module: base
#: field:res.company,account_no:0 #: field:res.company,account_no:0
@ -13304,7 +13327,7 @@ msgstr ""
#. module: base #. module: base
#: field:res.company,vat:0 #: field:res.company,vat:0
msgid "Tax ID" msgid "Tax ID"
msgstr "" msgstr "رقم الضرائب"
#. module: base #. module: base
#: field:ir.model.fields,field_description:0 #: field:ir.model.fields,field_description:0
@ -13426,7 +13449,7 @@ msgstr "الأنشطة"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_product #: model:ir.module.module,shortdesc:base.module_product
msgid "Products & Pricelists" msgid "Products & Pricelists"
msgstr "" msgstr "المنتجات و قوائم الاسعار"
#. module: base #. module: base
#: field:ir.actions.act_window,auto_refresh:0 #: field:ir.actions.act_window,auto_refresh:0
@ -13477,7 +13500,7 @@ msgstr ""
#. module: base #. module: base
#: field:ir.model.data,name:0 #: field:ir.model.data,name:0
msgid "External Identifier" msgid "External Identifier"
msgstr "" msgstr "مُعرف خارجي"
#. module: base #. module: base
#: model:ir.actions.act_window,name:base.grant_menu_access #: model:ir.actions.act_window,name:base.grant_menu_access
@ -13542,7 +13565,7 @@ msgstr "تصدير"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_nl #: model:ir.module.module,shortdesc:base.module_l10n_nl
msgid "Netherlands - Accounting" msgid "Netherlands - Accounting"
msgstr "" msgstr "هولندا - محاسبة"
#. module: base #. module: base
#: field:res.bank,bic:0 #: field:res.bank,bic:0
@ -13651,7 +13674,7 @@ msgstr "الدليل التقني"
#. module: base #. module: base
#: view:res.company:0 #: view:res.company:0
msgid "Address Information" msgid "Address Information"
msgstr "" msgstr "معلومات العنوان"
#. module: base #. module: base
#: model:res.country,name:base.tz #: model:res.country,name:base.tz
@ -13676,7 +13699,7 @@ msgstr "جزيرة الكريسماس"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_web_livechat #: model:ir.module.module,shortdesc:base.module_web_livechat
msgid "Live Chat Support" msgid "Live Chat Support"
msgstr "" msgstr "التحدث مع الدعم الفني"
#. module: base #. module: base
#: view:ir.actions.server:0 #: view:ir.actions.server:0
@ -13876,7 +13899,7 @@ msgstr ""
#. module: base #. module: base
#: help:ir.actions.act_window,usage:0 #: help:ir.actions.act_window,usage:0
msgid "Used to filter menu and home actions from the user form." msgid "Used to filter menu and home actions from the user form."
msgstr "" msgstr "تستخدم لتصفية القائمة و الإجراءات الرئيسية من النموذج المستخدم."
#. module: base #. module: base
#: model:res.country,name:base.sa #: model:res.country,name:base.sa
@ -13886,7 +13909,7 @@ msgstr "المملكة العربية السعودية"
#. module: base #. module: base
#: help:res.company,rml_header1:0 #: help:res.company,rml_header1:0
msgid "Appears by default on the top right corner of your printed documents." msgid "Appears by default on the top right corner of your printed documents."
msgstr "" msgstr "يظهر إفتراضيا في أعلى الزاوية اليمنى من الوثائق المطبوعة."
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_fetchmail_crm_claim #: model:ir.module.module,shortdesc:base.module_fetchmail_crm_claim
@ -13989,7 +14012,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,description:base.module_auth_openid #: model:ir.module.module,description:base.module_auth_openid
msgid "Allow users to login through OpenID." msgid "Allow users to login through OpenID."
msgstr "" msgstr "السماح للمستخدمين بالدخول باستخدام أوبن أي دي(OpenID)."
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_account_payment #: model:ir.module.module,shortdesc:base.module_account_payment
@ -14036,7 +14059,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_report_designer #: model:ir.module.module,shortdesc:base.module_report_designer
msgid "Report Designer" msgid "Report Designer"
msgstr "" msgstr "مصمم التقارير"
#. module: base #. module: base
#: model:ir.ui.menu,name:base.menu_address_book #: model:ir.ui.menu,name:base.menu_address_book
@ -14075,7 +14098,7 @@ msgstr "الفرص والفرص المحتملة"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "Romanian / română" msgid "Romanian / română"
msgstr "" msgstr "الرومانية / română"
#. module: base #. module: base
#: view:res.log:0 #: view:res.log:0
@ -14129,7 +14152,7 @@ msgstr "تنفيذ للإنشاء"
#. module: base #. module: base
#: model:res.country,name:base.vi #: model:res.country,name:base.vi
msgid "Virgin Islands (USA)" msgid "Virgin Islands (USA)"
msgstr "" msgstr "جزيرة فيرجين - (الولايات المتحدة اﻻمريكية)"
#. module: base #. module: base
#: model:res.country,name:base.tw #: model:res.country,name:base.tw
@ -14169,12 +14192,12 @@ msgstr ""
#. module: base #. module: base
#: field:ir.ui.view,field_parent:0 #: field:ir.ui.view,field_parent:0
msgid "Child Field" msgid "Child Field"
msgstr "" msgstr "حقل فرعي."
#. module: base #. module: base
#: view:ir.rule:0 #: view:ir.rule:0
msgid "Detailed algorithm:" msgid "Detailed algorithm:"
msgstr "" msgstr "تفاصيل الخوارزمية."
#. module: base #. module: base
#: field:ir.actions.act_window,usage:0 #: field:ir.actions.act_window,usage:0
@ -14195,7 +14218,7 @@ msgstr "workflow.workitem"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_profile_tools #: model:ir.module.module,shortdesc:base.module_profile_tools
msgid "Miscellaneous Tools" msgid "Miscellaneous Tools"
msgstr "" msgstr "أدوات متنوعة."
#. module: base #. module: base
#: model:ir.module.category,description:base.module_category_tools #: model:ir.module.category,description:base.module_category_tools
@ -14242,7 +14265,7 @@ msgstr "عرض:"
#. module: base #. module: base
#: field:ir.model.fields,view_load:0 #: field:ir.model.fields,view_load:0
msgid "View Auto-Load" msgid "View Auto-Load"
msgstr "" msgstr "عرض التحميل التلقائي"
#. module: base #. module: base
#: code:addons/base/ir/ir_model.py:264 #: code:addons/base/ir/ir_model.py:264
@ -14268,7 +14291,7 @@ msgstr ""
#. module: base #. module: base
#: field:ir.ui.menu,web_icon:0 #: field:ir.ui.menu,web_icon:0
msgid "Web Icon File" msgid "Web Icon File"
msgstr "" msgstr "ملف ايقونة الويب"
#. module: base #. module: base
#: view:base.module.upgrade:0 #: view:base.module.upgrade:0
@ -14289,7 +14312,7 @@ msgstr "Persian / فارسي"
#. module: base #. module: base
#: view:ir.actions.act_window:0 #: view:ir.actions.act_window:0
msgid "View Ordering" msgid "View Ordering"
msgstr "" msgstr "عرض الطلبات"
#. module: base #. module: base
#: code:addons/base/module/wizard/base_module_upgrade.py:95 #: code:addons/base/module/wizard/base_module_upgrade.py:95
@ -14375,7 +14398,7 @@ msgstr "جزيرة أروبا"
#: code:addons/base/module/wizard/base_module_import.py:60 #: code:addons/base/module/wizard/base_module_import.py:60
#, python-format #, python-format
msgid "File is not a zip file!" msgid "File is not a zip file!"
msgstr "" msgstr "الملف ليس ملف مضغوط(zip)!!"
#. module: base #. module: base
#: model:res.country,name:base.ar #: model:res.country,name:base.ar
@ -14504,7 +14527,7 @@ msgstr "عقد ضمان الناشر"
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "Bulgarian / български език" msgid "Bulgarian / български език"
msgstr "" msgstr "البلغارية / български език"
#. module: base #. module: base
#: model:ir.ui.menu,name:base.menu_aftersale #: model:ir.ui.menu,name:base.menu_aftersale
@ -14514,7 +14537,7 @@ msgstr "خدمات بعد البيع"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr #: model:ir.module.module,shortdesc:base.module_l10n_fr
msgid "France - Accounting" msgid "France - Accounting"
msgstr "" msgstr "فرنسا - محاسبة"
#. module: base #. module: base
#: view:ir.actions.todo:0 #: view:ir.actions.todo:0
@ -14651,7 +14674,7 @@ msgstr ""
#. module: base #. module: base
#: selection:base.language.install,lang:0 #: selection:base.language.install,lang:0
msgid "Czech / Čeština" msgid "Czech / Čeština"
msgstr "" msgstr "التشيكية / Čeština"
#. module: base #. module: base
#: model:ir.module.category,name:base.module_category_generic_modules #: model:ir.module.category,name:base.module_category_generic_modules
@ -14778,7 +14801,7 @@ msgstr ""
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_thunderbird #: model:ir.module.module,shortdesc:base.module_plugin_thunderbird
msgid "Thunderbird Plug-In" msgid "Thunderbird Plug-In"
msgstr "" msgstr "اضافات - ثندربيرد"
#. module: base #. module: base
#: model:ir.model,name:base.model_res_country #: model:ir.model,name:base.model_res_country
@ -14796,7 +14819,7 @@ msgstr "الدولة"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_project_messages #: model:ir.module.module,shortdesc:base.module_project_messages
msgid "In-Project Messaging System" msgid "In-Project Messaging System"
msgstr "" msgstr "نظام المراسلة في المشاريع"
#. module: base #. module: base
#: model:res.country,name:base.pn #: model:res.country,name:base.pn
@ -14827,7 +14850,7 @@ msgstr ""
#: view:res.partner:0 #: view:res.partner:0
#: view:res.partner.address:0 #: view:res.partner.address:0
msgid "Change Color" msgid "Change Color"
msgstr "" msgstr "تغيير اللون"
#. module: base #. module: base
#: model:res.partner.category,name:base.res_partner_category_15 #: model:res.partner.category,name:base.res_partner_category_15
@ -14861,7 +14884,7 @@ msgstr ""
#. module: base #. module: base
#: field:ir.module.module,auto_install:0 #: field:ir.module.module,auto_install:0
msgid "Automatic Installation" msgid "Automatic Installation"
msgstr "" msgstr "تحميل تلقائي"
#. module: base #. module: base
#: model:res.country,name:base.jp #: model:res.country,name:base.jp
@ -14930,7 +14953,7 @@ msgstr "ir.actions.server"
#. module: base #. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ca #: model:ir.module.module,shortdesc:base.module_l10n_ca
msgid "Canada - Accounting" msgid "Canada - Accounting"
msgstr "" msgstr "كندا - محاسبة"
#. module: base #. module: base
#: model:ir.actions.act_window,name:base.act_ir_actions_todo_form #: model:ir.actions.act_window,name:base.act_ir_actions_todo_form

File diff suppressed because it is too large Load Diff

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n" "Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:44+0000\n" "POT-Creation-Date: 2012-02-08 00:44+0000\n"
"PO-Revision-Date: 2012-03-09 06:40+0000\n" "PO-Revision-Date: 2012-03-13 11:33+0000\n"
"Last-Translator: Serpent Consulting Services <Unknown>\n" "Last-Translator: Serpent Consulting Services <Unknown>\n"
"Language-Team: Gujarati <gu@li.org>\n" "Language-Team: Gujarati <gu@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-03-10 04:48+0000\n" "X-Launchpad-Export-Date: 2012-03-14 04:42+0000\n"
"X-Generator: Launchpad (build 14914)\n" "X-Generator: Launchpad (build 14933)\n"
#. module: base #. module: base
#: model:res.country,name:base.sh #: model:res.country,name:base.sh
@ -379,12 +379,12 @@ msgstr "વિઝાર્ડ નુ નામ"
#. module: base #. module: base
#: model:res.groups,name:base.group_partner_manager #: model:res.groups,name:base.group_partner_manager
msgid "Partner Manager" msgid "Partner Manager"
msgstr "" msgstr "ભાગીદાર વ્યવસ્થાપક"
#. module: base #. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management #: model:ir.module.category,name:base.module_category_customer_relationship_management
msgid "Customer Relationship Management" msgid "Customer Relationship Management"
msgstr "" msgstr "ગ્રાહક સંબંધ વ્યવસ્થા(સી.આર.એમ.)"
#. module: base #. module: base
#: view:ir.module.module:0 #: view:ir.module.module:0

15313
openerp/addons/base/i18n/ka.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -54,11 +54,11 @@ class ir_attachment(osv.osv):
ima.check(cr, uid, model, mode) ima.check(cr, uid, model, mode)
self.pool.get(model).check_access_rule(cr, uid, mids, mode, context=context) self.pool.get(model).check_access_rule(cr, uid, mids, mode, context=context)
def search(self, cr, uid, args, offset=0, limit=None, order=None, def _search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False, access_rights_uid=None):
context=None, count=False): ids = super(ir_attachment, self)._search(cr, uid, args, offset=offset,
ids = super(ir_attachment, self).search(cr, uid, args, offset=offset, limit=limit, order=order,
limit=limit, order=order, context=context, count=count,
context=context, count=False) access_rights_uid=access_rights_uid)
if not ids: if not ids:
if count: if count:
return 0 return 0

View File

@ -2,7 +2,7 @@
############################################################################## ##############################################################################
# #
# OpenERP, Open Source Management Solution # OpenERP, Open Source Management Solution
# Copyright (C) 2011 OpenERP S.A (<http://www.openerp.com>) # Copyright (C) 2011-2012 OpenERP S.A (<http://www.openerp.com>)
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -232,6 +232,11 @@ class ir_mail_server(osv.osv):
if user: if user:
# Attempt authentication - will raise if AUTH service not supported # Attempt authentication - will raise if AUTH service not supported
# The user/password must be converted to bytestrings in order to be usable for
# certain hashing schemes, like HMAC.
# See also bug #597143 and python issue #5285
user = tools.ustr(user).encode('utf-8')
password = tools.ustr(password).encode('utf-8')
connection.login(user, password) connection.login(user, password)
return connection return connection
@ -364,7 +369,6 @@ class ir_mail_server(osv.osv):
:param smtp_user: optional SMTP user, if mail_server_id is not passed :param smtp_user: optional SMTP user, if mail_server_id is not passed
:param smtp_password: optional SMTP password to use, if mail_server_id is not passed :param smtp_password: optional SMTP password to use, if mail_server_id is not passed
:param smtp_debug: optional SMTP debug flag, if mail_server_id is not passed :param smtp_debug: optional SMTP debug flag, if mail_server_id is not passed
:param debug: whether to turn on the SMTP level debugging, output to DEBUG log level
:return: the Message-ID of the message that was just sent, if successfully sent, otherwise raises :return: the Message-ID of the message that was just sent, if successfully sent, otherwise raises
MailDeliveryException and logs root cause. MailDeliveryException and logs root cause.
""" """

View File

@ -36,12 +36,14 @@ import pooler
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
def _get_fields_type(self, cr, uid, context=None): def _get_fields_type(self, cr, uid, context=None):
# Avoid too many nested `if`s below, as RedHat's Python 2.6
# break on it. See bug 939653.
return sorted([(k,k) for k,v in fields.__dict__.iteritems() return sorted([(k,k) for k,v in fields.__dict__.iteritems()
if type(v) == types.TypeType if type(v) == types.TypeType and \
if issubclass(v, fields._column) issubclass(v, fields._column) and \
if v != fields._column v != fields._column and \
if not v._deprecated not v._deprecated and \
if not issubclass(v, fields.function)]) not issubclass(v, fields.function)])
def _in_modules(self, cr, uid, ids, field_name, arg, context=None): def _in_modules(self, cr, uid, ids, field_name, arg, context=None):
#pseudo-method used by fields.function in ir.model/ir.model.fields #pseudo-method used by fields.function in ir.model/ir.model.fields

View File

@ -75,7 +75,7 @@ class ir_rule(osv.osv):
_columns = { _columns = {
'name': fields.char('Name', size=128, select=1), 'name': fields.char('Name', size=128, select=1),
'model_id': fields.many2one('ir.model', 'Object',select=1, required=True, ondelete='cascade'), 'model_id': fields.many2one('ir.model', 'Object',select=1, required=True, ondelete="cascade"),
'global': fields.function(_get_value, string='Global', type='boolean', store=True, help="If no group is specified the rule is global and applied to everyone"), 'global': fields.function(_get_value, string='Global', type='boolean', store=True, help="If no group is specified the rule is global and applied to everyone"),
'groups': fields.many2many('res.groups', 'rule_group_rel', 'rule_group_id', 'group_id', 'Groups'), 'groups': fields.many2many('res.groups', 'rule_group_rel', 'rule_group_id', 'group_id', 'Groups'),
'domain_force': fields.text('Domain'), 'domain_force': fields.text('Domain'),

View File

@ -42,6 +42,9 @@ class base_module_upgrade(osv.osv_memory):
@return: New arch of view. @return: New arch of view.
""" """
res = super(base_module_upgrade, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False) res = super(base_module_upgrade, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
if view_type != 'form':
return res
record_id = context and context.get('active_id', False) or False record_id = context and context.get('active_id', False) or False
active_model = context.get('active_model') active_model = context.get('active_model')
if (not record_id) or (not active_model): if (not record_id) or (not active_model):

View File

@ -21,6 +21,23 @@
from osv import fields, osv from osv import fields, osv
def location_name_search(self, cr, user, name='', args=None, operator='ilike',
context=None, limit=100):
if not args:
args = []
ids = []
if len(name) == 2:
ids = self.search(cr, user, [('code', 'ilike', name)] + args,
limit=limit, context=context)
search_domain = [('name', operator, name)]
if ids: search_domain.append(('id', 'not in', ids))
ids.extend(self.search(cr, user, search_domain + args,
limit=limit, context=context))
locations = self.name_get(cr, user, ids, context)
return sorted(locations, key=lambda (id, name): ids.index(id))
class Country(osv.osv): class Country(osv.osv):
_name = 'res.country' _name = 'res.country'
@ -48,23 +65,10 @@ addresses belonging to this country.\n\nYou can use the python-style string pate
_defaults = { _defaults = {
'address_format': "%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s\n%(country_name)s", 'address_format': "%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s\n%(country_name)s",
} }
def name_search(self, cr, user, name='', args=None, operator='ilike',
context=None, limit=100):
if not args:
args=[]
if not context:
context={}
ids = False
if len(name) == 2:
ids = self.search(cr, user, [('code', 'ilike', name)] + args,
limit=limit, context=context)
if not ids:
ids = self.search(cr, user, [('name', operator, name)] + args,
limit=limit, context=context)
return self.name_get(cr, user, ids, context)
_order='name' _order='name'
name_search = location_name_search
def create(self, cursor, user, vals, context=None): def create(self, cursor, user, vals, context=None):
if 'code' in vals: if 'code' in vals:
vals['code'] = vals['code'].upper() vals['code'] = vals['code'].upper()
@ -77,8 +81,6 @@ addresses belonging to this country.\n\nYou can use the python-style string pate
return super(Country, self).write(cursor, user, ids, vals, return super(Country, self).write(cursor, user, ids, vals,
context=context) context=context)
Country()
class CountryState(osv.osv): class CountryState(osv.osv):
_description="Country state" _description="Country state"
@ -90,23 +92,9 @@ class CountryState(osv.osv):
'code': fields.char('State Code', size=3, 'code': fields.char('State Code', size=3,
help='The state code in three chars.\n', required=True), help='The state code in three chars.\n', required=True),
} }
def name_search(self, cr, user, name='', args=None, operator='ilike',
context=None, limit=100):
if not args:
args = []
if not context:
context = {}
ids = self.search(cr, user, [('code', 'ilike', name)] + args, limit=limit,
context=context)
if not ids:
ids = self.search(cr, user, [('name', operator, name)] + args,
limit=limit, context=context)
return self.name_get(cr, user, ids, context)
_order = 'code' _order = 'code'
CountryState()
name_search = location_name_search
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -121,17 +121,22 @@ def get_encodings(hint_encoding='utf-8'):
if prefenc: if prefenc:
yield prefenc yield prefenc
def ustr(value, hint_encoding='utf-8'): def ustr(value, hint_encoding='utf-8', errors='strict'):
"""This method is similar to the builtin `str` method, except """This method is similar to the builtin `unicode`, except
it will return unicode() string. that it may try multiple encodings to find one that works
for decoding `value`, and defaults to 'utf-8' first.
@param value: the value to convert :param: value: the value to convert
@param hint_encoding: an optional encoding that was detected :param: hint_encoding: an optional encoding that was detecte
upstream and should be tried first to upstream and should be tried first to decode ``value``.
decode ``value``. :param str error: optional `errors` flag to pass to the unicode
built-in to indicate how illegal character values should be
@rtype: unicode treated when converting a string: 'strict', 'ignore' or 'replace'.
@return: unicode string Passing anything other than 'strict' means that the first
encoding tried will be used, even if it's not the correct
one to use, so be careful! Ignore if value is not a string/unicode.
:rtype: unicode
:raise: UnicodeError if value cannot be coerced to unicode
""" """
if isinstance(value, Exception): if isinstance(value, Exception):
return exception_to_unicode(value) return exception_to_unicode(value)
@ -147,7 +152,7 @@ def ustr(value, hint_encoding='utf-8'):
for ln in get_encodings(hint_encoding): for ln in get_encodings(hint_encoding):
try: try:
return unicode(value, ln) return unicode(value, ln, errors=errors)
except Exception: except Exception:
pass pass
raise UnicodeError('unable to convert %r' % (value,)) raise UnicodeError('unable to convert %r' % (value,))

View File

@ -151,7 +151,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
_logger.debug('loading %d packages...', len(graph)) _logger.debug('loading %d packages...', len(graph))
# get db timestamp # get db timestamp
cr.execute("select now()::timestamp") cr.execute("select (now() at time zone 'UTC')::timestamp")
dt_before_load = cr.fetchone()[0] dt_before_load = cr.fetchone()[0]
# register, instantiate and initialize models for each modules # register, instantiate and initialize models for each modules

View File

@ -357,6 +357,8 @@ def dispatch_rpc(service_name, method, params):
if rpc_request and rpc_response_flag: if rpc_request and rpc_response_flag:
log(rpc_request,logging.DEBUG,'%s.%s'%(service_name,method), replace_request_password(params)) log(rpc_request,logging.DEBUG,'%s.%s'%(service_name,method), replace_request_password(params))
threading.current_thread().uid = None
threading.current_thread().dbname = None
result = ExportService.getService(service_name).dispatch(method, params) result = ExportService.getService(service_name).dispatch(method, params)
if rpc_request_flag or rpc_response_flag: if rpc_request_flag or rpc_response_flag:

View File

@ -364,7 +364,15 @@ class time(_column):
class binary(_column): class binary(_column):
_type = 'binary' _type = 'binary'
_symbol_c = '%s' _symbol_c = '%s'
_symbol_f = lambda symb: symb and Binary(symb) or None
# Binary values may be byte strings (python 2.6 byte array), but
# the legacy OpenERP convention is to transfer and store binaries
# as base64-encoded strings. The base64 string may be provided as a
# unicode in some circumstances, hence the str() cast in symbol_f.
# This str coercion will only work for pure ASCII unicode strings,
# on purpose - non base64 data must be passed as a 8bit byte strings.
_symbol_f = lambda symb: symb and Binary(str(symb)) or None
_symbol_set = (_symbol_c, _symbol_f) _symbol_set = (_symbol_c, _symbol_f)
_symbol_get = lambda self, x: x and str(x) _symbol_get = lambda self, x: x and str(x)

View File

@ -750,7 +750,7 @@ class BaseModel(object):
name_id = 'model_'+self._name.replace('.', '_') name_id = 'model_'+self._name.replace('.', '_')
cr.execute('select * from ir_model_data where name=%s and module=%s', (name_id, context['module'])) cr.execute('select * from ir_model_data where name=%s and module=%s', (name_id, context['module']))
if not cr.rowcount: if not cr.rowcount:
cr.execute("INSERT INTO ir_model_data (name,date_init,date_update,module,model,res_id) VALUES (%s, now(), now(), %s, %s, %s)", \ cr.execute("INSERT INTO ir_model_data (name,date_init,date_update,module,model,res_id) VALUES (%s, (now() at time zone 'UTC'), (now() at time zone 'UTC'), %s, %s, %s)", \
(name_id, context['module'], 'ir.model', model_id) (name_id, context['module'], 'ir.model', model_id)
) )
@ -816,7 +816,7 @@ class BaseModel(object):
cr.execute("select name from ir_model_data where name=%s", (name1,)) cr.execute("select name from ir_model_data where name=%s", (name1,))
if cr.fetchone(): if cr.fetchone():
name1 = name1 + "_" + str(id) name1 = name1 + "_" + str(id)
cr.execute("INSERT INTO ir_model_data (name,date_init,date_update,module,model,res_id) VALUES (%s, now(), now(), %s, %s, %s)", \ cr.execute("INSERT INTO ir_model_data (name,date_init,date_update,module,model,res_id) VALUES (%s, (now() at time zone 'UTC'), (now() at time zone 'UTC'), %s, %s, %s)", \
(name1, context['module'], 'ir.model.fields', id) (name1, context['module'], 'ir.model.fields', id)
) )
else: else:
@ -872,11 +872,11 @@ class BaseModel(object):
for parent_name in ((type(parent_names)==list) and parent_names or [parent_names]): for parent_name in ((type(parent_names)==list) and parent_names or [parent_names]):
parent_model = pool.get(parent_name) parent_model = pool.get(parent_name)
if not getattr(cls, '_original_module', None) and name == parent_model._name:
cls._original_module = parent_model._original_module
if not parent_model: if not parent_model:
raise TypeError('The model "%s" specifies an unexisting parent class "%s"\n' raise TypeError('The model "%s" specifies an unexisting parent class "%s"\n'
'You may need to add a dependency on the parent class\' module.' % (name, parent_name)) 'You may need to add a dependency on the parent class\' module.' % (name, parent_name))
if not getattr(cls, '_original_module', None) and name == parent_model._name:
cls._original_module = parent_model._original_module
parent_class = parent_model.__class__ parent_class = parent_model.__class__
nattr = {} nattr = {}
for s in attributes: for s in attributes:
@ -2691,7 +2691,7 @@ class BaseModel(object):
elif val in dict(self._columns[field].selection(self, cr, uid, context=context)): elif val in dict(self._columns[field].selection(self, cr, uid, context=context)):
return return
raise except_orm(_('ValidateError'), raise except_orm(_('ValidateError'),
_('The value "%s" for the field "%s.%s" is not in the selection') % (value, self._table, field)) _('The value "%s" for the field "%s.%s" is not in the selection') % (value, self._table, field))
def _check_removed_columns(self, cr, log=False): def _check_removed_columns(self, cr, log=False):
# iterate on the database columns to drop the NOT NULL constraints # iterate on the database columns to drop the NOT NULL constraints
@ -2734,6 +2734,50 @@ class BaseModel(object):
_schema.debug("Table '%s': added foreign key '%s' with definition=REFERENCES \"%s\" ON DELETE %s", _schema.debug("Table '%s': added foreign key '%s' with definition=REFERENCES \"%s\" ON DELETE %s",
source_table, source_field, dest_model._table, ondelete) source_table, source_field, dest_model._table, ondelete)
def _drop_constraint(self, cr, source_table, constraint_name):
cr.execute("ALTER TABLE %s DROP CONSTRAINT %s" % (source_table,constraint_name))
def _m2o_fix_foreign_key(self, cr, source_table, source_field, dest_model, ondelete):
# Find FK constraint(s) currently established for the m2o field,
# and see whether they are stale or not
cr.execute("""SELECT confdeltype as ondelete_rule, conname as constraint_name,
cl2.relname as foreign_table
FROM pg_constraint as con, pg_class as cl1, pg_class as cl2,
pg_attribute as att1, pg_attribute as att2
WHERE con.conrelid = cl1.oid
AND cl1.relname = %s
AND con.confrelid = cl2.oid
AND array_lower(con.conkey, 1) = 1
AND con.conkey[1] = att1.attnum
AND att1.attrelid = cl1.oid
AND att1.attname = %s
AND array_lower(con.confkey, 1) = 1
AND con.confkey[1] = att2.attnum
AND att2.attrelid = cl2.oid
AND att2.attname = %s
AND con.contype = 'f'""", (source_table, source_field, 'id'))
constraints = cr.dictfetchall()
if constraints:
if len(constraints) == 1:
# Is it the right constraint?
cons, = constraints
if cons['ondelete_rule'] != POSTGRES_CONFDELTYPES.get((ondelete or 'set null').upper(), 'a')\
or cons['foreign_table'] != dest_model._table:
_schema.debug("Table '%s': dropping obsolete FK constraint: '%s'",
source_table, cons['constraint_name'])
self._drop_constraint(cr, source_table, cons['constraint_name'])
self._m2o_add_foreign_key_checked(source_field, dest_model, ondelete)
# else it's all good, nothing to do!
else:
# Multiple FKs found for the same field, drop them all, and re-create
for cons in constraints:
_schema.debug("Table '%s': dropping duplicate FK constraints: '%s'",
source_table, cons['constraint_name'])
self._drop_constraint(cr, source_table, cons['constraint_name'])
self._m2o_add_foreign_key_checked(source_field, dest_model, ondelete)
def _auto_init(self, cr, context=None): def _auto_init(self, cr, context=None):
""" """
@ -2932,31 +2976,8 @@ class BaseModel(object):
if isinstance(f, fields.many2one): if isinstance(f, fields.many2one):
dest_model = self.pool.get(f._obj) dest_model = self.pool.get(f._obj)
ref = dest_model._table if dest_model._table != 'ir_actions':
if ref != 'ir_actions': self._m2o_fix_foreign_key(cr, self._table, k, dest_model, f.ondelete)
cr.execute('SELECT confdeltype, conname FROM pg_constraint as con, pg_class as cl1, pg_class as cl2, '
'pg_attribute as att1, pg_attribute as att2 '
'WHERE con.conrelid = cl1.oid '
'AND cl1.relname = %s '
'AND con.confrelid = cl2.oid '
'AND cl2.relname = %s '
'AND array_lower(con.conkey, 1) = 1 '
'AND con.conkey[1] = att1.attnum '
'AND att1.attrelid = cl1.oid '
'AND att1.attname = %s '
'AND array_lower(con.confkey, 1) = 1 '
'AND con.confkey[1] = att2.attnum '
'AND att2.attrelid = cl2.oid '
'AND att2.attname = %s '
"AND con.contype = 'f'", (self._table, ref, k, 'id'))
res2 = cr.dictfetchall()
if res2:
if res2[0]['confdeltype'] != POSTGRES_CONFDELTYPES.get((f.ondelete or 'set null').upper(), 'a'):
cr.execute('ALTER TABLE "' + self._table + '" DROP CONSTRAINT "' + res2[0]['conname'] + '"')
self._m2o_add_foreign_key_checked(k, dest_model, f.ondelete)
cr.commit()
_schema.debug("Table '%s': column '%s': XXX",
self._table, k)
# The field doesn't exist in database. Create it if necessary. # The field doesn't exist in database. Create it if necessary.
else: else:
@ -3164,6 +3185,9 @@ class BaseModel(object):
_sql_constraints. _sql_constraints.
""" """
def unify_cons_text(txt):
return txt.lower().replace(', ',',').replace(' (','(')
for (key, con, _) in self._sql_constraints: for (key, con, _) in self._sql_constraints:
conname = '%s_%s' % (self._table, key) conname = '%s_%s' % (self._table, key)
@ -3192,7 +3216,7 @@ class BaseModel(object):
# constraint does not exists: # constraint does not exists:
sql_actions['add']['execute'] = True sql_actions['add']['execute'] = True
sql_actions['add']['msg_err'] = sql_actions['add']['msg_err'] % (sql_actions['add']['query'], ) sql_actions['add']['msg_err'] = sql_actions['add']['msg_err'] % (sql_actions['add']['query'], )
elif con.lower() not in [item['condef'].lower() for item in existing_constraints]: elif unify_cons_text(con) not in [unify_cons_text(item['condef']) for item in existing_constraints]:
# constraint exists but its definition has changed: # constraint exists but its definition has changed:
sql_actions['drop']['execute'] = True sql_actions['drop']['execute'] = True
sql_actions['drop']['msg_ok'] = sql_actions['drop']['msg_ok'] % (existing_constraints[0]['condef'].lower(), ) sql_actions['drop']['msg_ok'] = sql_actions['drop']['msg_ok'] % (existing_constraints[0]['condef'].lower(), )
@ -3208,10 +3232,8 @@ class BaseModel(object):
cr.commit() cr.commit()
_schema.debug(sql_action['msg_ok']) _schema.debug(sql_action['msg_ok'])
name_id = 'constraint_'+ conname name_id = 'constraint_'+ conname
cr.execute('select conname from pg_constraint where contype=%s and conname=%s',('u', conname),)
existing_const = cr.fetchall()
cr.execute('select * from ir_model_data where name=%s and module=%s', (name_id, module)) cr.execute('select * from ir_model_data where name=%s and module=%s', (name_id, module))
if not cr.rowcount and not existing_const: if not cr.rowcount:
cr.execute("INSERT INTO ir_model_data (name,date_init,date_update,module, model) VALUES (%s, now(), now(), %s, %s)", \ cr.execute("INSERT INTO ir_model_data (name,date_init,date_update,module, model) VALUES (%s, now(), now(), %s, %s)", \
(name_id, module, self._name) (name_id, module, self._name)
) )
@ -3435,8 +3457,8 @@ class BaseModel(object):
return "date_trunc('second', %s) as %s" % (f_qual, f) return "date_trunc('second', %s) as %s" % (f_qual, f)
if f == self.CONCURRENCY_CHECK_FIELD: if f == self.CONCURRENCY_CHECK_FIELD:
if self._log_access: if self._log_access:
return "COALESCE(%s.write_date, %s.create_date, now())::timestamp AS %s" % (self._table, self._table, f,) return "COALESCE(%s.write_date, %s.create_date, (now() at time zone 'UTC'))::timestamp AS %s" % (self._table, self._table, f,)
return "now()::timestamp AS %s" % (f,) return "(now() at time zone 'UTC')::timestamp AS %s" % (f,)
if isinstance(self._columns[f], fields.binary) and context.get('bin_size', False): if isinstance(self._columns[f], fields.binary) and context.get('bin_size', False):
return 'length(%s) as "%s"' % (f_qual, f) return 'length(%s) as "%s"' % (f_qual, f)
return f_qual return f_qual
@ -3617,7 +3639,7 @@ class BaseModel(object):
return return
if not (context.get(self.CONCURRENCY_CHECK_FIELD) and self._log_access): if not (context.get(self.CONCURRENCY_CHECK_FIELD) and self._log_access):
return return
check_clause = "(id = %s AND %s < COALESCE(write_date, create_date, now())::timestamp)" check_clause = "(id = %s AND %s < COALESCE(write_date, create_date, (now() at time zone 'UTC'))::timestamp)"
for sub_ids in cr.split_for_in_conditions(ids): for sub_ids in cr.split_for_in_conditions(ids):
ids_to_check = [] ids_to_check = []
for id in sub_ids: for id in sub_ids:
@ -3901,7 +3923,7 @@ class BaseModel(object):
if self._log_access: if self._log_access:
upd0.append('write_uid=%s') upd0.append('write_uid=%s')
upd0.append('write_date=now()') upd0.append("write_date=(now() at time zone 'UTC')")
upd1.append(user) upd1.append(user)
if len(upd0): if len(upd0):
@ -4168,7 +4190,7 @@ class BaseModel(object):
self._check_selection_field_value(cr, user, field, vals[field], context=context) self._check_selection_field_value(cr, user, field, vals[field], context=context)
if self._log_access: if self._log_access:
upd0 += ',create_uid,create_date' upd0 += ',create_uid,create_date'
upd1 += ',%s,now()' upd1 += ",%s,(now() at time zone 'UTC')"
upd2.append(user) upd2.append(user)
cr.execute('insert into "'+self._table+'" (id'+upd0+") values ("+str(id_new)+upd1+')', tuple(upd2)) cr.execute('insert into "'+self._table+'" (id'+upd0+") values ("+str(id_new)+upd1+')', tuple(upd2))
self.check_access_rule(cr, user, [id_new], 'create', context=context) self.check_access_rule(cr, user, [id_new], 'create', context=context)
@ -4401,13 +4423,11 @@ class BaseModel(object):
domain = domain[:] domain = domain[:]
# if the object has a field named 'active', filter out all inactive # if the object has a field named 'active', filter out all inactive
# records unless they were explicitely asked for # records unless they were explicitely asked for
if 'active' in self._columns and (active_test and context.get('active_test', True)): if 'active' in self._all_columns and (active_test and context.get('active_test', True)):
if domain: if domain:
active_in_args = False # the item[0] trick below works for domain items and '&'/'|'/'!'
for a in domain: # operators too
if a[0] == 'active': if not any(item[0] == 'active' for item in domain):
active_in_args = True
if not active_in_args:
domain.insert(0, ('active', '=', 1)) domain.insert(0, ('active', '=', 1))
else: else:
domain = [('active', '=', 1)] domain = [('active', '=', 1)]
@ -4871,15 +4891,15 @@ class BaseModel(object):
def _transient_clean_rows_older_than(self, cr, seconds): def _transient_clean_rows_older_than(self, cr, seconds):
assert self._transient, "Model %s is not transient, it cannot be vacuumed!" % self._name assert self._transient, "Model %s is not transient, it cannot be vacuumed!" % self._name
cr.execute("SELECT id FROM " + self._table + " WHERE" cr.execute("SELECT id FROM " + self._table + " WHERE"
" COALESCE(write_date, create_date, now())::timestamp <" " COALESCE(write_date, create_date, (now() at time zone 'UTC'))::timestamp <"
" (now() - interval %s)", ("%s seconds" % seconds,)) " ((now() at time zone 'UTC') - interval %s)", ("%s seconds" % seconds,))
ids = [x[0] for x in cr.fetchall()] ids = [x[0] for x in cr.fetchall()]
self.unlink(cr, SUPERUSER_ID, ids) self.unlink(cr, SUPERUSER_ID, ids)
def _transient_clean_old_rows(self, cr, count): def _transient_clean_old_rows(self, cr, count):
assert self._transient, "Model %s is not transient, it cannot be vacuumed!" % self._name assert self._transient, "Model %s is not transient, it cannot be vacuumed!" % self._name
cr.execute( cr.execute(
"SELECT id, COALESCE(write_date, create_date, now())::timestamp" "SELECT id, COALESCE(write_date, create_date, (now() at time zone 'UTC'))::timestamp"
" AS t FROM " + self._table + " AS t FROM " + self._table +
" ORDER BY t LIMIT %s", (count,)) " ORDER BY t LIMIT %s", (count,))
ids = [x[0] for x in cr.fetchall()] ids = [x[0] for x in cr.fetchall()]

View File

@ -30,7 +30,7 @@ RELEASE_LEVELS_DISPLAY = {ALPHA: ALPHA,
# properly comparable using normal operarors, for example: # 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,'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) # (6,1,0,'candidate',2) < (6,1,0,'final',0) < (6,1,2,'final',0)
version_info = (6,1,0,FINAL,0) version_info = (6,2,0,ALPHA,0)
version = '.'.join(map(str,version_info[:2])) + RELEASE_LEVELS_DISPLAY[version_info[3]] + str(version_info[4] or '') version = '.'.join(map(str,version_info[:2])) + RELEASE_LEVELS_DISPLAY[version_info[3]] + str(version_info[4] or '')
major_version = '.'.join(map(str,version_info[:2])) major_version = '.'.join(map(str,version_info[:2]))

View File

@ -561,6 +561,7 @@ class objects_proxy(netsvc.ExportService):
def dispatch(self, method, params): def dispatch(self, method, params):
(db, uid, passwd ) = params[0:3] (db, uid, passwd ) = params[0:3]
threading.current_thread().uid = uid
params = params[3:] params = params[3:]
if method == 'obj_list': if method == 'obj_list':
raise NameError("obj_list has been discontinued via RPC as of 6.0, please query ir.model directly!") raise NameError("obj_list has been discontinued via RPC as of 6.0, please query ir.model directly!")
@ -594,6 +595,7 @@ class wizard(netsvc.ExportService):
def dispatch(self, method, params): def dispatch(self, method, params):
(db, uid, passwd ) = params[0:3] (db, uid, passwd ) = params[0:3]
threading.current_thread().uid = uid
params = params[3:] params = params[3:]
if method not in ['execute','create']: if method not in ['execute','create']:
raise KeyError("Method not supported %s" % method) raise KeyError("Method not supported %s" % method)
@ -645,6 +647,7 @@ class report_spool(netsvc.ExportService):
def dispatch(self, method, params): def dispatch(self, method, params):
(db, uid, passwd ) = params[0:3] (db, uid, passwd ) = params[0:3]
threading.current_thread().uid = uid
params = params[3:] params = params[3:]
if method not in ['report', 'report_get', 'render_report']: if method not in ['report', 'report_get', 'render_report']:
raise KeyError("Method not supported %s" % method) raise KeyError("Method not supported %s" % method)

View File

@ -96,6 +96,7 @@ class test_ir_sequence_no_gap(unittest2.TestCase):
""" """
cr0 = cursor() cr0 = cursor()
cr1 = cursor() cr1 = cursor()
cr1._default_log_exceptions = False # Prevent logging a traceback
msg_re = '^could not obtain lock on row in relation "ir_sequence"$' msg_re = '^could not obtain lock on row in relation "ir_sequence"$'
with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re): with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re):
n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {}) n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})

View File

@ -3,7 +3,7 @@
# #
# OpenERP, Open Source Management Solution # OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). # Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>). # Copyright (C) 2010-2012 OpenERP s.a. (<http://openerp.com>).
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -383,7 +383,7 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
res = mail_server_pool.send_email(cr, uid or 1, email_msg, mail_server_id=None, res = mail_server_pool.send_email(cr, uid or 1, email_msg, mail_server_id=None,
smtp_server=smtp_server, smtp_port=smtp_port, smtp_user=smtp_user, smtp_password=smtp_password, smtp_server=smtp_server, smtp_port=smtp_port, smtp_user=smtp_user, smtp_password=smtp_password,
smtp_encryption=('ssl' if ssl else None), debug=debug) smtp_encryption=('ssl' if ssl else None), smtp_debug=debug)
except Exception: except Exception:
_logger.exception("tools.email_send failed to deliver email") _logger.exception("tools.email_send failed to deliver email")
return False return False

View File

@ -20,9 +20,7 @@
############################################################################## ##############################################################################
def drop_view_if_exists(cr, viewname): def drop_view_if_exists(cr, viewname):
cr.execute("select count(1) from pg_class where relkind=%s and relname=%s", ('v', viewname,)) cr.execute("DROP view IF EXISTS %s CASCADE" % (viewname,))
if cr.fetchone()[0]: cr.commit()
cr.execute("DROP view %s" % (viewname,))
cr.commit()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: