[MERGE]: Merge with latest trunk-server

bzr revid: rpa@tinyerp.com-20111116051110-jtb3437w8vu3qhph
This commit is contained in:
Rucha (Open ERP)
2011-11-16 10:41:10 +05:30
77 changed files with 539 additions and 299 deletions
+10 -4
View File
@@ -179,9 +179,12 @@ def dumpstacks(sig, frame):
def setup_signal_handlers():
""" Register the signal handler defined above. """
SIGNALS = map(lambda x: getattr(signal, "SIG%s" % x), "INT TERM".split())
map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
if os.name == 'posix':
map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
signal.signal(signal.SIGQUIT, dumpstacks)
elif os.name == 'nt':
import win32api
win32api.SetConsoleCtrlHandler(lambda sig: signal_handler(sig, None), 1)
def quit_on_signals():
""" Wait for one or two signals then shutdown the server.
@@ -191,9 +194,12 @@ def quit_on_signals():
"""
# Wait for a first signal to be handled. (time.sleep will be interrupted
# by the signal handler.)
while quit_signals_received == 0:
time.sleep(60)
# by the signal handler.) The try/except is for the win32 case.
try:
while quit_signals_received == 0:
time.sleep(60)
except KeyboardInterrupt, e:
pass
if config['pidfile']:
os.unlink(config['pidfile'])
+1 -1
View File
@@ -2,7 +2,7 @@
<openerp>
<data>
<menuitem icon="terp-administration" id="menu_administration"
name="Administration" sequence="50"
name="Settings" sequence="50"
web_icon="data/administration.png"
web_icon_hover="data/administration-hover.png"/>
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:14+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:14+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+34 -26
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@@ -33,7 +33,7 @@ msgstr "سانت هيلينا"
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
msgstr "عدادت أخري"
msgstr "إعدادات أخرى"
#. module: base
#: selection:ir.property,type:0
@@ -103,7 +103,7 @@ msgstr "سير العمل نشط"
#. module: base
#: field:ir.actions.act_window,display_menu_tip:0
msgid "Display Menu Tips"
msgstr ""
msgstr "عرض إرشادات القائمة"
#. module: base
#: view:ir.module.module:0
@@ -117,6 +117,8 @@ msgid ""
"You can not write in this document (%s) ! Be sure your user belongs to one "
"of these groups: %s."
msgstr ""
"لا يمكنك تعديل هذا المستند (%s)! تأكد من أنك تنتمي إلى إحدى المجموعات "
"التالية: %s."
#. module: base
#: help:ir.model.fields,domain:0
@@ -134,7 +136,7 @@ msgstr ""
#. module: base
#: field:ir.actions.act_window,target:0
msgid "Target Window"
msgstr ""
msgstr "نافذة الهدف"
#. module: base
#: code:addons/base/res/res_user.py:507
@@ -154,7 +156,7 @@ msgstr ""
#: code:addons/osv.py:133
#, python-format
msgid "Constraint Error"
msgstr ""
msgstr "خطأ تقييد"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_custom
@@ -171,12 +173,12 @@ msgstr ""
#: code:addons/orm.py:3653
#, python-format
msgid "created."
msgstr ""
msgstr "تمّ الإنشاء"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_woodsuppliers0
msgid "Wood Suppliers"
msgstr ""
msgstr "مورّدو الخشب"
#. module: base
#: code:addons/base/module/module.py:303
@@ -185,6 +187,8 @@ msgid ""
"Some installed modules depend on the module you plan to Uninstall :\n"
" %s"
msgstr ""
"ثمّة وحدات برمجية تعتمد على الوحدة التي تريد إزالتها:\n"
" %s"
#. module: base
#: field:ir.sequence,number_increment:0
@@ -195,7 +199,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_res_company_tree
#: model:ir.ui.menu,name:base.menu_action_res_company_tree
msgid "Company's Structure"
msgstr ""
msgstr "هيكل الشركة"
#. module: base
#: selection:base.language.install,lang:0
@@ -211,7 +215,7 @@ msgstr ""
#: code:addons/base/res/res_user.py:132
#, python-format
msgid "\"smtp_server\" needs to be set to send mails to users"
msgstr ""
msgstr "لا بدّ من تعيين خادم إرسال البريد الإلكتروني \"smtp_server\""
#. module: base
#: code:addons/base/module/wizard/base_export_language.py:60
@@ -227,7 +231,7 @@ msgstr ""
#. module: base
#: field:ir.module.category,module_nr:0
msgid "Number of Modules"
msgstr ""
msgstr "عدد البرامج"
#. module: base
#: help:multi_company.default,company_dest_id:0
@@ -237,7 +241,7 @@ msgstr ""
#. module: base
#: field:res.partner.bank.type.field,size:0
msgid "Max. Size"
msgstr ""
msgstr "الحجم الأقصى"
#. module: base
#: field:res.partner.address,name:0
@@ -255,7 +259,7 @@ msgstr ""
#. module: base
#: sql_constraint:res.lang:0
msgid "The name of the language must be unique !"
msgstr ""
msgstr "لا بدّ أن يكون اسم اللغة مختلفاً عن اللغات الأخرى"
#. module: base
#: selection:res.request,state:0
@@ -265,7 +269,7 @@ msgstr "نشط"
#. module: base
#: field:ir.actions.wizard,wiz_name:0
msgid "Wizard Name"
msgstr ""
msgstr "اسم المعالج"
#. module: base
#: code:addons/orm.py:2160
@@ -296,7 +300,7 @@ msgstr ""
#. module: base
#: view:ir.actions.todo:0
msgid "Config Wizard Steps"
msgstr ""
msgstr "خطوات إعداد المعالج"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_sc
@@ -362,6 +366,8 @@ msgid ""
"You can not remove the admin user as it is used internally for resources "
"created by OpenERP (updates, module installation, ...)"
msgstr ""
"لا يمكنك حذف المستخدم المشرف العام (admin) لأنه يسنخدم داخلياً بواسطة "
"OpenERP في عمليات التحديث و إضافة البرامج الأخري"
#. module: base
#: model:res.country,name:base.gf
@@ -399,7 +405,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
@@ -420,7 +426,7 @@ msgstr "كولومبيا"
#. module: base
#: view:ir.module.module:0
msgid "Schedule Upgrade"
msgstr ""
msgstr "حدّد موعد الترقية"
#. module: base
#: code:addons/orm.py:838
@@ -434,6 +440,8 @@ msgid ""
"The ISO country code in two chars.\n"
"You can use this field for quick search."
msgstr ""
"رمز ISO للدولة والمكون من حرفين\n"
"يمكنك استخدام هذا الحقل للبحث السريع."
#. module: base
#: model:res.country,name:base.pw
@@ -461,12 +469,12 @@ msgstr ""
#: view:ir.actions.wizard:0
#: model:ir.ui.menu,name:base.menu_ir_action_wizard
msgid "Wizards"
msgstr ""
msgstr "المعالجات"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_miscellaneoussuppliers0
msgid "Miscellaneous Suppliers"
msgstr ""
msgstr "مورّدون متنوعون"
#. module: base
#: code:addons/base/ir/ir_model.py:255
@@ -487,12 +495,12 @@ msgstr ""
#. module: base
#: view:base.language.export:0
msgid "Export done"
msgstr ""
msgstr "تمّت عملية التصدير"
#. module: base
#: view:ir.model:0
msgid "Model Description"
msgstr ""
msgstr "وصف النموذج"
#. module: base
#: help:ir.actions.act_window,src_model:0
@@ -590,7 +598,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_base_language_import
msgid "Language Import"
msgstr ""
msgstr "استيراد اللغة"
#. module: base
#: model:ir.model,name:base.model_res_config_users
@@ -635,12 +643,12 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "My Partners"
msgstr ""
msgstr "شركائي"
#. module: base
#: view:ir.actions.report.xml:0
msgid "XML Report"
msgstr ""
msgstr "تقرير XML"
#. module: base
#: model:res.country,name:base.es
@@ -650,7 +658,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_translation_export
msgid "Import / Export"
msgstr ""
msgstr "استيراد / تصدير"
#. module: base
#: help:ir.actions.act_window,domain:0
@@ -662,7 +670,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_view_base_module_upgrade
#: model:ir.model,name:base.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
msgstr "ترقية وحدة برمجية"
#. module: base
#: view:res.config.users:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
"X-Poedit-Language: Czech\n"
#. module: base
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:55+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:55+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-09-30 21:09+0000\n"
"Last-Translator: Antony Lesuisse (OpenERP) <al@openerp.com>\n"
"PO-Revision-Date: 2011-11-13 17:25+0000\n"
"Last-Translator: Xosé <Unknown>\n"
"Language-Team: Galician <gl@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: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-14 05:15+0000\n"
"X-Generator: Launchpad (build 14277)\n"
#. module: base
#: view:ir.filters:0
@@ -1973,7 +1973,7 @@ msgstr "Mensaxes"
#: code:addons/base/module/wizard/base_update_translations.py:38
#, python-format
msgid "Error!"
msgstr "¡Erro!"
msgstr "Erro!"
#. module: base
#: view:res.lang:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
"Language: hr\n"
#. module: base
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:15+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:17+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:16+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:18+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:14+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:55+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:19+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+9 -9
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-07-23 16:37+0000\n"
"Last-Translator: OpenBMS JSC <Unknown>\n"
"PO-Revision-Date: 2011-11-05 03:38+0000\n"
"Last-Translator: Vuong Kien Hung <Unknown>\n"
"Language-Team: Vietnamese <vi@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: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-06 05:23+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@@ -9053,7 +9053,7 @@ msgstr "Hình thức tách"
#. module: base
#: view:base.module.upgrade:0
msgid "Note that this operation might take a few minutes."
msgstr ""
msgstr "Lưu ý hoạt động này có thể mất vài phút"
#. module: base
#: model:ir.ui.menu,name:base.menu_localisation
@@ -9106,7 +9106,7 @@ msgstr ""
#. module: base
#: view:res.lang:0
msgid "%j - Day of the year [001,366]."
msgstr ""
msgstr "%j - Ngày của năm [001,366]"
#. module: base
#: field:ir.actions.server,mobile:0
@@ -9189,7 +9189,7 @@ msgstr ""
#. module: base
#: help:ir.sequence,number_increment:0
msgid "The next number of the sequence will be incremented by this number"
msgstr ""
msgstr "Số tiếp theo của dãy thứ tự sẽ được tăng bằng số này"
#. module: base
#: field:ir.cron,function:0
@@ -9238,7 +9238,7 @@ msgstr "Các đối tác: "
#. module: base
#: model:res.country,name:base.kp
msgid "North Korea"
msgstr ""
msgstr "Bắc Triều Tiên"
#. module: base
#: selection:ir.actions.server,state:0
@@ -9269,7 +9269,7 @@ msgstr ""
#. module: base
#: field:ir.exports,name:0
msgid "Export Name"
msgstr ""
msgstr "Tên Trích xuất"
#. module: base
#: help:res.partner.address,type:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:20+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+2 -2
View File
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-27 05:21+0000\n"
"X-Generator: Launchpad (build 14197)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
+3 -2
View File
@@ -265,12 +265,13 @@ class act_window(osv.osv):
help="Model name of the object to open in the view window"),
'src_model': fields.char('Source Object', size=64,
help="Optional model name of the objects on which this action should be visible"),
'target': fields.selection([('current','Current Window'),('new','New Window')], 'Target Window'),
'target': fields.selection([('current','Current Window'),('new','New Window'),('inline','Inline')], 'Target Window'),
'view_type': fields.selection((('tree','Tree'),('form','Form')), string='View Type', required=True,
help="View type: set to 'tree' for a hierarchical tree view, or 'form' for other views"),
'view_mode': fields.char('View Mode', size=250, required=True,
help="Comma-separated list of allowed view modes, such as 'form', 'tree', 'calendar', etc. (Default: tree,form)"),
'usage': fields.char('Action Usage', size=32),
'usage': fields.char('Action Usage', size=32,
help="Used to filter menu and home actions from the user form."),
'view_ids': fields.one2many('ir.actions.act_window.view', 'act_window_id', 'Views'),
'views': fields.function(_views_get_fnc, method=True, type='binary', string='Views',
help="This function field computes the ordered list of views that should be enabled " \
+17 -16
View File
@@ -27,22 +27,6 @@ import tools
import os
import logging
def _check_xml(self, cr, uid, ids, context=None):
logger = logging.getLogger('init')
for view in self.browse(cr, uid, ids, context):
eview = etree.fromstring(view.arch.encode('utf8'))
frng = tools.file_open(os.path.join('base','rng','view.rng'))
try:
relaxng_doc = etree.parse(frng)
relaxng = etree.RelaxNG(relaxng_doc)
if not relaxng.validate(eview):
for error in relaxng.error_log:
logger.error(tools.ustr(error))
return False
finally:
frng.close()
return True
class view_custom(osv.osv):
_name = 'ir.ui.view.custom'
_order = 'create_date desc' # search(limit=1) should return the last customization
@@ -86,6 +70,23 @@ class view(osv.osv):
'priority': 16
}
_order = "priority,name"
def _check_xml(self, cr, uid, ids, context=None):
logger = logging.getLogger('init')
for view in self.browse(cr, uid, ids, context):
eview = etree.fromstring(view.arch.encode('utf8'))
frng = tools.file_open(os.path.join('base','rng','view.rng'))
try:
relaxng_doc = etree.parse(frng)
relaxng = etree.RelaxNG(relaxng_doc)
if not relaxng.validate(eview):
for error in relaxng.error_log:
logger.error(tools.ustr(error))
return False
finally:
frng.close()
return True
_constraints = [
(_check_xml, 'Invalid XML for View Architecture!', ['arch'])
]
+2 -2
View File
@@ -109,8 +109,8 @@
<field name="sequence">14</field>
</record>
<record model="ir.module.category" id="module_category_vertical_applications">
<field name="name">Verticalizations</field>
<record model="ir.module.category" id="module_category_specific_industry_applications">
<field name="name">Specific Industry Applications</field>
<field name="sequence">15</field>
</record>
+3
View File
@@ -70,6 +70,9 @@ class res_config_configurable(osv.osv_memory):
res = next.action_launch(context=context)
res['nodestroy'] = False
return res
#if there is no next action and if html is in the context: reload instead of closing
if 'html' in context:
return {'type' : 'ir.actions.reload'}
return {'type' : 'ir.actions.act_window_close'}
def start(self, cr, uid, ids, context=None):
-1
View File
@@ -150,7 +150,6 @@ class res_partner(osv.osv):
_defaults = {
'active': lambda *a: 1,
'customer': lambda *a: 1,
'address': [{'type': 'default'}],
'category_id': _default_category,
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'res.partner', context=c),
'color': 0,
+23
View File
@@ -206,6 +206,7 @@ class users(osv.osv):
return dict.fromkeys(ids, '')
_columns = {
'id': fields.integer('ID'),
'name': fields.char('User Name', size=64, required=True, select=True,
help="The new user's real name, used for searching"
" and most listings"),
@@ -755,6 +756,28 @@ class users_view(osv.osv):
return res
return super(users_view, self).read(cr, uid, ids, fields, context, load)
def fields_get(self, cr, user, allfields=None, context=None, write_access=True):
res = super(users_view, self).fields_get(cr, user, allfields, context, write_access)
apps, others = self.pool.get('res.groups').get_classified(cr, user, context)
for app, groups in apps:
ids = [g.id for name, g in groups]
app_name = name_boolean_groups(ids)
sel_name = name_selection_groups(ids)
selection = [(g.id, name) for name, g in groups]
res[app_name] = {'type': 'boolean', 'string': app}
tips = [name + ': ' + (g.comment or '') for name, g in groups]
if tips:
res[app_name].update(help='\n'.join(tips))
res[sel_name] = {'type': 'selection', 'string': 'Group', 'selection': selection}
for sec, groups in others:
for gname, g in groups:
name = name_boolean_group(g.id)
res[name] = {'type': 'boolean', 'string': gname}
if g.comment:
res[name].update(help=g.comment)
return res
def fields_view_get(self, cr, uid, view_id=None, view_type='form',
context=None, toolbar=False, submenu=False):
# in form views, transform 'groups_id' into reified group fields
+146 -91
View File
@@ -1,42 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<!-- Handling of element overloading when inheriting from a base
template
-->
<rng:define name="overload">
<rng:optional>
<!--
Alter matched element with content
-->
<rng:choice>
<rng:attribute name="position">
<rng:choice>
<!-- Insert content before first child -->
<rng:value>before</rng:value>
<!-- Insert content after last child -->
<rng:value>after</rng:value>
<!-- Replace all children with content -->
<rng:value>inside</rng:value>
<!-- Replace matched element itself with content -->
<rng:value>replace</rng:value>
</rng:choice>
</rng:attribute>
<rng:group>
<rng:attribute name="position">
<!-- Edit element attributes -->
<rng:value>attributes</rng:value>
</rng:attribute>
<rng:oneOrMore>
<rng:element name="attribute">
<rng:attribute name="name"><rng:text/></rng:attribute>
<rng:text />
</rng:element>
</rng:oneOrMore>
</rng:group>
</rng:choice>
</rng:optional>
</rng:define>
xmlns:a="http://relaxng.org/ns/annotation/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<!-- Handling of element overloading when inheriting from a base
template
-->
<rng:define name="overload">
<rng:optional>
<!--
Alter matched element with content
-->
<rng:choice>
<rng:attribute name="position">
<rng:choice>
<!-- Insert content before first child -->
<rng:value>before</rng:value>
<!-- Insert content after last child -->
<rng:value>after</rng:value>
<!-- Replace all children with content -->
<rng:value>inside</rng:value>
<!-- Replace matched element itself with content -->
<rng:value>replace</rng:value>
</rng:choice>
</rng:attribute>
<rng:group>
<rng:attribute name="position">
<!-- Edit element attributes -->
<rng:value>attributes</rng:value>
</rng:attribute>
<rng:oneOrMore>
<rng:element name="attribute">
<rng:attribute name="name"><rng:text/></rng:attribute>
<rng:text />
</rng:element>
</rng:oneOrMore>
</rng:group>
</rng:choice>
</rng:optional>
</rng:define>
<rng:define name="access_rights">
<rng:optional>
@@ -44,29 +45,113 @@
</rng:optional>
</rng:define>
<rng:define name="dashboard-column">
<rng:element name="column">
<rng:zeroOrMore>
<rng:element name="action">
<!-- Action identifier, used by clients to get the
actual action from db -->
<rng:attribute name="name"/>
<!-- Displayed name of dashboard item (above idem) -->
<rng:optional><rng:attribute name="string"/></rng:optional>
<!-- Merged into the action descriptor's own
context before executing the action -->
<rng:optional><rng:attribute name="context"/></rng:optional>
<!-- Added to the action descriptor's own domain
before executing the action -->
<rng:optional><rng:attribute name="domain"/></rng:optional>
<!-- In case the action is an act_window,
overrides its own @views. -->
<rng:optional><rng:attribute name="view_mode"/></rng:optional>
</rng:element>
</rng:zeroOrMore>
</rng:element>
</rng:define>
<rng:define name="dashboard">
<rng:choice>
<rng:element name="board">
<a:documentation>
New-style (6.1) dashboard definition
</a:documentation>
<rng:choice>
<rng:group>
<a:documentation>
Single-column dashboard style
</a:documentation>
<rng:attribute name="style">
<rng:value>1</rng:value>
</rng:attribute>
<rng:ref name="dashboard-column"/>
</rng:group>
<rng:group>
<a:documentation>
Three different 2-column dashboard styles:
50|50, 33|66 and 66|33.
</a:documentation>
<rng:attribute name="style">
<rng:choice>
<rng:value>1-1</rng:value>
<rng:value>1-2</rng:value>
<rng:value>2-1</rng:value>
</rng:choice>
</rng:attribute>
<rng:ref name="dashboard-column"/>
<rng:ref name="dashboard-column"/>
</rng:group>
<rng:group>
<a:documentation>
Three-column dashboard style: 33|33|33
</a:documentation>
<rng:attribute name="style">
<rng:value>1-1-1</rng:value>
</rng:attribute>
<rng:ref name="dashboard-column"/>
<rng:ref name="dashboard-column"/>
<rng:ref name="dashboard-column"/>
</rng:group>
</rng:choice>
</rng:element>
<!--
DEPRECATED old-style dashboards
-->
<rng:element>
<rng:choice>
<rng:name>hpaned</rng:name>
<rng:name>vpaned</rng:name>
</rng:choice>
<rng:optional>
<rng:attribute name="position">
<rng:data type="int"/>
</rng:attribute>
</rng:optional>
<rng:zeroOrMore>
<rng:optional><rng:ref name="any"/></rng:optional>
<rng:optional><rng:ref name="html"/></rng:optional>
</rng:zeroOrMore>
</rng:element>
</rng:choice>
</rng:define>
<rng:define name="container">
<rng:optional><rng:attribute name="col"/></rng:optional>
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="notebook"/>
<rng:ref name="field"/>
<rng:ref name="group"/>
<rng:ref name="button"/>
<rng:ref name="hpaned" />
<rng:ref name="label" />
<rng:ref name="separator"/>
<rng:ref name="image"/>
<rng:ref name="form"/>
<rng:ref name="vpaned"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
<rng:element name="properties"><rng:empty/></rng:element>
</rng:choice>
</rng:zeroOrMore>
</rng:define>
<rng:define name="container">
<rng:optional><rng:attribute name="col"/></rng:optional>
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="notebook"/>
<rng:ref name="field"/>
<rng:ref name="group"/>
<rng:ref name="button"/>
<rng:ref name="label" />
<rng:ref name="separator"/>
<rng:ref name="image"/>
<rng:ref name="form"/>
<rng:ref name="dashboard"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
<rng:element name="properties"><rng:empty/></rng:element>
</rng:choice>
</rng:zeroOrMore>
</rng:define>
<rng:define name="form">
<rng:element name="form">
@@ -219,12 +304,11 @@
<rng:ref name="field"/>
<rng:ref name="group"/>
<rng:ref name="button"/>
<rng:ref name="hpaned" />
<rng:ref name="label" />
<rng:ref name="separator"/>
<rng:ref name="image"/>
<rng:ref name="form"/>
<rng:ref name="vpaned"/>
<rng:ref name="dashboard"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
@@ -278,34 +362,6 @@
</rng:element>
</rng:define>
<rng:define name="hpaned">
<rng:element name="hpaned">
<rng:optional>
<rng:attribute name="position">
<rng:data type="int"/>
</rng:attribute>
</rng:optional>
<rng:zeroOrMore>
<rng:ref name="any" />
<rng:optional><rng:ref name="html"/></rng:optional>
</rng:zeroOrMore>
</rng:element>
</rng:define>
<rng:define name="vpaned">
<rng:element name="vpaned">
<rng:optional>
<rng:attribute name="position">
<rng:data type="int"/>
</rng:attribute>
</rng:optional>
<rng:zeroOrMore>
<rng:optional><rng:ref name="any"/></rng:optional>
<rng:optional><rng:ref name="html"/></rng:optional>
</rng:zeroOrMore>
</rng:element>
</rng:define>
<rng:define name="any">
<rng:element>
<rng:anyName/>
@@ -341,8 +397,7 @@
<rng:ref name="form" />
<rng:ref name="page" />
<rng:ref name="notebook"/>
<rng:ref name="hpaned"/>
<rng:ref name="vpaned"/>
<rng:ref name="dashboard"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
</rng:choice>
+1 -1
View File
@@ -69,7 +69,7 @@ and you would be tempted to believe something like this would be possible:
['!', ['=', 'company_id.name', ['&', ..., ...]]]
That is, a domain could be a valid operand. But this is not the case. A domain
is really limited to a two-level nature, and can not takes a recursive form: a
is really limited to a two-level nature, and can not take a recursive form: a
domain is not a valid second-level operand.
Unaccent - Accent-insensitive search
+3
View File
@@ -1385,6 +1385,9 @@ def field_to_dict(model, cr, user, field, context=None):
res['domain'] = field._domain
res['context'] = field._context
if isinstance(field, one2many):
res['relation_field'] = field._fields_id
return res
+23 -6
View File
@@ -229,11 +229,6 @@ POSTGRES_CONFDELTYPES = {
'SET DEFAULT': 'd',
}
def last_day_of_current_month():
today = datetime.date.today()
last_day = str(calendar.monthrange(today.year, today.month)[1])
return time.strftime('%Y-%m-' + last_day)
def intersect(la, lb):
return filter(lambda x: x in lb, la)
@@ -664,6 +659,10 @@ class BaseModel(object):
_sequence = None
_description = None
# dict of {field:method}, with method returning the name_get of records
# to include in the _read_group, if grouped on this field
_group_by_full = {}
# Transience
_transient = False # True in a TransientModel
_transient_max_count = None
@@ -1808,7 +1807,7 @@ class BaseModel(object):
"""
_rec_name = self._rec_name
if _rec_name not in self._columns:
_rec_name = self._columns.keys()[0]
_rec_name = self._columns.keys()[0] if len(self._columns.keys()) > 0 else "id"
view = etree.Element('tree', string=self._description)
etree.SubElement(view, 'field', name=_rec_name)
@@ -2477,6 +2476,24 @@ class BaseModel(object):
del alldata[d['id']][groupby]
d.update(alldata[d['id']])
del d['id']
if groupby and groupby in self._group_by_full:
gids = [x[groupby][0] for x in data if x[groupby]]
stages = self._group_by_full[groupby](self, cr, uid, gids, domain, context)
# as both lists are sorted in the same way, we can merge in one pass
pos = 0
while stages and ((pos<len(data)) or (pos<len(stages))):
if (pos<len(data)) and (not data[pos][groupby] or (data[pos][groupby][0] == stages[pos][0])):
pos+=1
continue
val = dict.fromkeys(float_int_fields, False)
val.update({
groupby: stages[pos],
'__domain': [(groupby, '=', stages[pos][0])]+domain,
groupby+'_count': 0L,
'__context': {'group_by': groupby_list[1:]}
})
data.insert(pos, val)
return data
def _inherits_join_add(self, current_table, parent_model_name, query):
+15 -2
View File
@@ -19,8 +19,21 @@
#
##############################################################################
version = '6.1dev'
major_version = '6.1'
RELEASE_LEVELS = [ALPHA, BETA, RELEASE_CANDIDATE, FINAL] = ['alpha', 'beta', 'candidate', 'final']
RELEASE_LEVELS_DISPLAY = {ALPHA: ALPHA,
BETA: BETA,
RELEASE_CANDIDATE: 'rc',
FINAL: ''}
# version_info format: (MAJOR, MINOR, MICRO, RELEASE_LEVEL, SERIAL)
# inspired by Python's own sys.version_info, in order to be
# properly comparable using normal operarors, for example:
# (6,1,0,'beta',0) < (6,1,0,'candidate',1) < (6,1,0,'candidate',2)
# (6,1,0,'candidate',2) < (6,1,0,'final',0) < (6,1,2,'final',0)
version_info = (6,1,0,BETA,0)
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]))
description = 'OpenERP Server'
long_desc = '''OpenERP is a complete ERP and CRM. The main features are accounting (analytic
and financial), stock management, sales and purchases management, tasks
+1 -1
View File
@@ -26,7 +26,7 @@ from render import render
#.apidoc title: Report Rendering
try:
import Image
from PIL import Image
except ImportError:
import logging
logging.warning('Python Imaging not installed, you can use only .JPG pictures !')
+4 -5
View File
@@ -610,11 +610,10 @@ class _rml_flowable(object):
for key in txt_n.attrib.keys():
if key in ('rml_except', 'rml_loop', 'rml_tag'):
del txt_n.attrib[key]
if True or not self._textual(n).isspace():
if not n.tag == 'bullet':
txt_n.text = utils.xml2str(self._textual(n))
txt_n.tail = n.tail and utils._process_text(self, n.tail.replace('\n','')) or ''
rc1 += etree.tostring(txt_n)
if not n.tag == 'bullet':
txt_n.text = utils.xml2str(self._textual(n))
txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
rc1 += etree.tostring(txt_n)
return rc1
def _table(self, node):
+10 -2
View File
@@ -110,6 +110,14 @@ def _child_get(node, self=None, tagname=None):
yield n
def _process_text(self, txt):
"""Translate ``txt`` according to the language in the local context,
replace dynamic ``[[expr]]`` with their real value, then escape
the result for XML.
:param str txt: original text to translate (must NOT be XML-escaped)
:return: translated text, with dynamic expressions evaluated and
with special XML characters escaped (``&,<,>``).
"""
if not self.localcontext:
return str2xml(txt)
if not txt:
@@ -130,10 +138,10 @@ def _process_text(self, txt):
except Exception:
pass
if isinstance(txt, basestring):
result += str2xml(txt)
result += txt
elif txt and (txt is not None) and (txt is not False):
result += ustr(txt)
return result
return str2xml(result)
def text_get(node):
return ''.join([ustr(n.text) for n in node])
+2 -2
View File
@@ -759,8 +759,8 @@ if __name__=='__main__':
g.process(starting_node)
g.scale(radius*3,radius*3, radius, radius)
import Image
import ImageDraw
from PIL import Image
from PIL import ImageDraw
img = Image.new("RGB", (800, 600), "#ffffff")
draw = ImageDraw.Draw(img)
+114 -11
View File
@@ -11,6 +11,8 @@ import misc
from config import config
import yaml_tag
import yaml
import re
from lxml import etree
# YAML import needs both safe and unsafe eval, but let's
# default to /safe/.
@@ -164,9 +166,11 @@ class YamlInterpreter(object):
self.logger.log(logging.ERROR, 'id: %s is to long (max: 64)', id)
def get_id(self, xml_id):
if not xml_id:
raise YamlImportException("The xml_id should be a non empty string.")
if isinstance(xml_id, types.IntType):
if xml_id is False:
return False
#if not xml_id:
# raise YamlImportException("The xml_id should be a non empty string.")
elif isinstance(xml_id, types.IntType):
id = xml_id
elif xml_id in self.id_map:
id = self.id_map[xml_id]
@@ -298,7 +302,7 @@ class YamlInterpreter(object):
def create_osv_memory_record(self, record, fields):
model = self.get_model(record.model)
record_dict = self._create_record(model, fields)
record_dict = self._create_record(model, fields, False)
id_new=model.create(self.cr, self.uid, record_dict, context=self.context)
self.id_map[record.id] = int(id_new)
return record_dict
@@ -307,10 +311,21 @@ class YamlInterpreter(object):
import openerp.osv as osv
record, fields = node.items()[0]
model = self.get_model(record.model)
view_id = record.view
if view_id and (view_id is not True):
view_id = self.pool.get('ir.model.data').get_object_reference(self.cr, 1, self.module, record.view)[1]
if model.is_transient():
record_dict=self.create_osv_memory_record(record, fields)
else:
self.validate_xml_id(record.id)
try:
self.pool.get('ir.model.data')._get_id(self.cr, 1, self.module, record.id)
default = False
except ValueError:
default = True
if self.isnoupdate(record) and self.mode != 'init':
id = self.pool.get('ir.model.data')._update_dummy(self.cr, 1, record.model, self.module, record.id)
# check if the resource already existed at the last update
@@ -321,22 +336,110 @@ class YamlInterpreter(object):
if not self._coerce_bool(record.forcecreate):
return None
record_dict = self._create_record(model, fields)
self.logger.debug("RECORD_DICT %s" % record_dict)
#context = self.get_context(record, self.eval_context)
context = record.context #TOFIX: record.context like {'withoutemployee':True} should pass from self.eval_context. example: test_project.yml in project module
#TOFIX: record.context like {'withoutemployee':True} should pass from self.eval_context. example: test_project.yml in project module
context = record.context
if view_id:
varg = view_id
if view_id is True: varg = False
view = model.fields_view_get(self.cr, 1, varg, 'form', context)
view_id = etree.fromstring(view['arch'].encode('utf-8'))
record_dict = self._create_record(model, fields, view_id, default=default)
self.logger.debug("RECORD_DICT %s" % record_dict)
id = self.pool.get('ir.model.data')._update(self.cr, 1, record.model, \
self.module, record_dict, record.id, noupdate=self.isnoupdate(record), mode=self.mode, context=context)
self.id_map[record.id] = int(id)
if config.get('import_partial'):
self.cr.commit()
def _create_record(self, model, fields):
def _create_record(self, model, fields, view=False, parent={}, default=True):
allfields = model.fields_get(self.cr, 1, context=self.context)
if view is not False:
defaults = default and model.default_get(self.cr, 1, allfields, context=self.context) or {}
fg = model.fields_get(self.cr, 1, context=self.context)
else:
default = {}
fg = {}
record_dict = {}
fields = fields or {}
def process_val(key, val):
if fg[key]['type']=='many2one':
if type(val) in (tuple,list):
val = val[0]
elif (fg[key]['type']=='one2many'):
if val is False:
val = []
if len(val) and type(val[0]) == dict:
val = map(lambda x: (0,0,x), val)
return val
# Process all on_change calls
nodes = (view is not False) and [view] or []
while nodes:
el = nodes.pop(0)
if el.tag=='field':
field_name = el.attrib['name']
assert field_name in fg, "The field '%s' is defined in the form view but not on the object '%s'!" % (field_name, model._name)
if field_name in fields:
view2 = None
# if the form view is not inline, we call fields_view_get
if (view is not False) and (fg[field_name]['type']=='one2many'):
view2 = view.find("field[@name='%s']/form"%(field_name,))
if not view2:
view2 = self.pool.get(fg[field_name]['relation']).fields_view_get(self.cr, 1, False, 'form', self.context)
view2 = etree.fromstring(view2['arch'].encode('utf-8'))
field_value = self._eval_field(model, field_name, fields[field_name], view2, parent=record_dict, default=default)
record_dict[field_name] = field_value
#if (field_name in defaults) and defaults[field_name] == field_value:
# print '*** You can remove these lines:', field_name, field_value
elif (field_name in defaults):
if (field_name not in record_dict):
record_dict[field_name] = process_val(field_name, defaults[field_name])
else:
continue
if not el.attrib.get('on_change', False):
continue
match = re.match("([a-z_1-9A-Z]+)\((.*)\)", el.attrib['on_change'])
assert match, "Unable to parse the on_change '%s'!" % (el.attrib['on_change'], )
# creating the context
class parent2(object):
def __init__(self, d):
self.d = d
def __getattr__(self, name):
return self.d.get(name, False)
ctx = record_dict.copy()
ctx['context'] = self.context
ctx['uid'] = 1
ctx['parent'] = parent2(parent)
for a in fg:
if a not in ctx:
ctx[a]=process_val(a, defaults.get(a, False))
# Evaluation args
args = map(lambda x: eval(x, ctx), match.group(2).split(','))
result = getattr(model, match.group(1))(self.cr, 1, [], *args)
for key, val in (result or {}).get('value', {}).items():
if key not in fields:
assert key in fg, "The returning field '%s' from your on_change call '%s' does not exist on the object '%s'" % (key, match.group(1), model._name)
record_dict[key] = process_val(key, val)
#if (key in fields) and record_dict[key] == process_val(key, val):
# print '*** You can remove these lines:', key, val
else:
nodes = list(el) + nodes
for field_name, expression in fields.items():
field_value = self._eval_field(model, field_name, expression)
if field_name in record_dict:
continue
field_value = self._eval_field(model, field_name, expression, default=False)
record_dict[field_name] = field_value
return record_dict
def process_ref(self, node, column=None):
@@ -365,7 +468,7 @@ class YamlInterpreter(object):
def process_eval(self, node):
return eval(node.expression, self.eval_context)
def _eval_field(self, model, field_name, expression):
def _eval_field(self, model, field_name, expression, view=False, parent={}, default=True):
# TODO this should be refactored as something like model.get_field() in bin/osv
if field_name in model._columns:
column = model._columns[field_name]
@@ -386,7 +489,7 @@ class YamlInterpreter(object):
value = self.get_id(expression)
elif column._type == "one2many":
other_model = self.get_model(column._obj)
value = [(0, 0, self._create_record(other_model, fields)) for fields in expression]
value = [(0, 0, self._create_record(other_model, fields, view, parent, default=default)) for fields in expression]
elif column._type == "many2many":
ids = [self.get_id(xml_id) for xml_id in expression]
value = [(6, 0, ids)]
+3 -2
View File
@@ -24,13 +24,14 @@ class Assert(YamlTag):
super(Assert, self).__init__(**kwargs)
class Record(YamlTag):
def __init__(self, model, id, use='id', **kwargs):
def __init__(self, model, id, use='id', view=True, **kwargs):
self.model = model
self.id = id
self.view = view
super(Record, self).__init__(**kwargs)
def __str__(self):
return '!record {model: %s, id: %s}:' % (str(self.model,), str(self.id,))
class Python(YamlTag):
def __init__(self, model, severity=logging.ERROR, name="", **kwargs):
self.model= model