[MERGE]: Merge with latest trunk-server

bzr revid: rpa@tinyerp.com-20111103071744-wkf0qgr8qkl540y7
bzr revid: rpa@tinyerp.com-20111116051225-w9b73w63w8g6z2hk
This commit is contained in:
Rucha (Open ERP) 2011-11-16 10:42:25 +05:30
commit d4ad054000
91 changed files with 1085 additions and 743 deletions

View File

@ -1,11 +1,23 @@
.*
*.egg-info
*.orig
*.pyc
.*.swp
.bzrignore
openerp/addons/*
openerp/filestore*
.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
*.pyo
build/
RE:^bin/
RE:^dist/
RE:^include/
RE:^share/
RE:^man/
RE:^lib/
bin/yolk
bin/pil*.py
.project
.pydevproject
.settings

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

View File

@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="parameter_web_base_url" model="ir.config_parameter">
<field name="key">web.base.url</field>
<field name="value">http://localhost:8069</field>
</record>
<record id="view_menu" model="ir.ui.view">
<field name="name">ir.ui.menu.tree</field>
<field name="model">ir.ui.menu</field>
@ -1671,5 +1667,19 @@
<field name="currency_id" ref="HNL"/>
<field eval="time.strftime('%Y-01-01')" name="name"/>
</record>
<!-- Chilean peso -->
<record id="CLP" model="res.currency">
<field name="name">CLP</field>
<field name="symbol">$</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>
<field name="company_id" ref="main_company"/>
</record>
<record id="rateCLP" model="res.currency.rate">
<field name="rate">710</field>
<field name="currency_id" ref="CLP"/>
<field eval="time.strftime('%Y-01-01')" name="name"/>
</record>
</data>
</openerp>

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"/>

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-01 05:00+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:00+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\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

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -168,7 +168,7 @@ msgstr "ir.ui.view.custom"
#. module: base
#: model:res.country,name:base.sz
msgid "Swaziland"
msgstr "Швейцария"
msgstr "Свазиленд"
#. module: base
#: code:addons/orm.py:1993

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\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

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -6604,8 +6604,8 @@ msgid ""
"You can not read this document (%s) ! Be sure your user belongs to one of "
"these groups: %s."
msgstr ""
"Sie haben kein Leserecht für diesen Beleg (%s) ! Stellen Sie sicher, dass "
"der Benutzer Mitglied der folgenden Gruppe ist: %s."
"Sie haben kein Leserecht für diesen Satz (%s) ! Stellen Sie sicher, dass der "
"Benutzer Mitglied der folgenden Gruppe ist: %s."
#. module: base
#: view:res.bank:0

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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\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"

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:05+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-04 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:07+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:55+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-11 05:29+0000\n"
"X-Generator: Launchpad (build 14123)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\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"

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-01 05:07+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:55+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -131,7 +131,7 @@ msgid ""
msgstr ""
"Le domaine, optionnel, est utilisé pour limiter les valeurs possibles des "
"champs concernés. Il s'exprime en langage Python sous forme de triplets. Par "
"exemple : [('color','=',rouge')]"
"exemple : [('color','=','rouge')]"
#. module: base
#: field:res.partner,ref:0
@ -202,7 +202,7 @@ msgstr ""
#. module: base
#: field:ir.sequence,number_increment:0
msgid "Increment Number"
msgstr "Incrémenter le Numéro"
msgstr "Incrémenter le numéro"
#. module: base
#: model:ir.actions.act_window,name:base.action_res_company_tree
@ -590,7 +590,7 @@ msgstr ""
#. module: base
#: field:res.partner,title:0
msgid "Partner Form"
msgstr "Formulaire des partenaires"
msgstr "Forme juridique"
#. module: base
#: selection:base.language.install,lang:0
@ -1661,7 +1661,7 @@ msgid ""
"do not wish to add more users at this stage, you can always do this later."
msgstr ""
"Créez des utilisateurs additionnels et assignez-les à des groupes qui leur "
"permettra d'avoir accès à des fonctionnalités choisies dans le système. "
"permettront d'avoir accès à des fonctionnalités choisies dans le système. "
"Cliquez sur 'Terminé' si vous ne désirez pas ajouter plus d'utilisateurs "
"pour l'instant, vous pourrez toujours en ajouter plus tard."
@ -2177,7 +2177,7 @@ msgstr "terminer"
#: selection:ir.ui.view,type:0
#: selection:wizard.ir.model.menu.create.line,view_type:0
msgid "Calendar"
msgstr "Calendrier"
msgstr "Créer un calendrier"
#. module: base
#: field:res.partner.address,partner_id:0
@ -2202,9 +2202,6 @@ msgid ""
"separated list of valid field names (optionally followed by asc/desc for the "
"direction)"
msgstr ""
"\"order\" spécifié non valide, une \"ordre\" de spécification est une liste "
"de nom de champs séparé par des virgules (optionnel suivi par le sens "
"croissant/décroissant)"
#. module: base
#: model:ir.model,name:base.model_ir_module_module_dependency
@ -3550,12 +3547,13 @@ msgid ""
"Would your payment have been carried out after this mail was sent, please "
"consider the present one as void."
msgstr ""
"Veuiller noter que les paiements ci dessous sont maintenant dus. Si votre "
"paiement a été envoyé, nous recevrons rapidement le détail de votre "
"paiements. Si votre paiement est décallé, merci de nous contacter pour en "
"discuter. \n"
"Si votre paiement a déjà réglé après que ce courriel soit parti, veuillez ne "
"pas tenir compte de cet envoi."
"Veuillez noter que les paiements ci-dessous sont maintenant dus. \n"
"Si votre règlement nous a été envoyé, merci de nous en préciser rapidement "
"les modalités.\n"
"Nous vous invitons à nous contacter au cas où ce retard serait volontaire, "
"et cela afin de nous en communiquer les motifs.\n"
"Dans le cas où votre règlement nous parviendrait avant réception de ce "
"courriel, nous vous demandons de considérer cette relance comme non avenue."
#. module: base
#: model:res.country,name:base.mx
@ -7159,7 +7157,7 @@ msgstr "Filtre"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_madam
msgid "Ms."
msgstr "Mme"
msgstr "Mlle"
#. module: base
#: model:res.country,name:base.ch
@ -8317,7 +8315,8 @@ msgstr "Administration"
#. module: base
#: view:base.module.update:0
msgid "Click on Update below to start the process..."
msgstr "Cliquer sur Mise à Jour afin de lancer l'opération..."
msgstr ""
"Cliquer sur le bouton Mettre à jour ci-dessous afin de lancer l'opération..."
#. module: base
#: model:res.country,name:base.ir
@ -8955,7 +8954,7 @@ msgstr "Relation de l'objet"
#: view:ir.rule:0
#: view:res.partner:0
msgid "General"
msgstr "Générale"
msgstr "Général"
#. module: base
#: model:res.country,name:base.uz

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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\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

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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:05+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
"Language: hr\n"
#. module: base
@ -720,7 +720,7 @@ msgstr "Radni dani"
#. module: base
#: selection:ir.module.module,license:0
msgid "Other OSI Approved Licence"
msgstr ""
msgstr "Druga OSI odobrena licenca"
#. module: base
#: help:res.config.users,context_lang:0
@ -1057,7 +1057,7 @@ msgstr "Jezik \"%s\" ne postoji/ nije definiran"
#: code:addons/base/publisher_warranty/publisher_warranty.py:163
#, python-format
msgid "Error during communication with the publisher warranty server."
msgstr ""
msgstr "Greška tijekom komunikacije sa serverom nositelja održavanja."
#. module: base
#: help:ir.actions.server,email:0
@ -2136,6 +2136,8 @@ msgid ""
"separated list of valid field names (optionally followed by asc/desc for the "
"direction)"
msgstr ""
"Naveden pogrešan \"poredak\". Ispravan \"poredak\" čini lista naziva polja "
"razdvojenih zarezom (opcionalno s asc/desc za smijer)"
#. module: base
#: model:ir.model,name:base.model_ir_module_module_dependency
@ -2597,7 +2599,7 @@ msgstr "Naurujski"
#: code:addons/base/module/module.py:200
#, python-format
msgid "The certificate ID of the module must be unique !"
msgstr ""
msgstr "Oznaka certifikata (ID) mora biti jedinstvena !"
#. module: base
#: model:ir.model,name:base.model_ir_property
@ -2674,7 +2676,7 @@ msgstr "EAN13"
#: code:addons/orm.py:1622
#, python-format
msgid "Invalid Architecture!"
msgstr ""
msgstr "Pogrešna arhitektura!"
#. module: base
#: model:res.country,name:base.pt
@ -2686,6 +2688,7 @@ msgstr "Portugal"
msgid ""
"You cannot have multiple records with the same id for the same module !"
msgstr ""
"Nije dozvoljeno imatii više zapisa s istom oznakom (ID) u istom modulu."
#. module: base
#: field:ir.module.module,certificate:0
@ -3952,7 +3955,7 @@ msgstr "Zelenortska Republika (Zelenortski otoci)"
#. module: base
#: view:base.module.import:0
msgid "Select module package to import (.zip file):"
msgstr ""
msgstr "Odaberite zapakirani modul za učitavanje (.zip datoteka):"
#. module: base
#: model:ir.actions.act_window,name:base.act_res_partner_event
@ -4347,7 +4350,7 @@ msgstr "Želite očistiti ID-ove ? "
#: field:publisher_warranty.contract,name:0
#: field:publisher_warranty.contract.wizard,name:0
msgid "Serial Key"
msgstr ""
msgstr "Serijski ključ"
#. module: base
#: selection:res.request,priority:0
@ -4424,7 +4427,7 @@ msgstr "Mapiranje polja"
#. module: base
#: view:publisher_warranty.contract:0
msgid "Refresh Validation Dates"
msgstr ""
msgstr "Osvježite datume važenja"
#. module: base
#: view:ir.model:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:01+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:48+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -8788,9 +8788,9 @@ msgid ""
"Check this box if the partner is a supplier. If it's not checked, purchase "
"people will not see it when encoding a purchase order."
msgstr ""
"Seleziona questa casella se il partner è un fornitore. Se non selezionata, "
"gli acquirenti non la vedranno durante la definizione di un ordine di "
"acquisto."
"Seleziona questa casella se il partner è un fornitore. Se non selezionata, i "
"responsabili acquisti non vedranno il partner durante la definizione di un "
"ordine di acquisto."
#. module: base
#: field:ir.model.fields,relation_field:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

File diff suppressed because it is too large Load Diff

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-10-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:50+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:03+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-09-30 20:44+0000\n"
"Last-Translator: Antony Lesuisse (OpenERP) <al@openerp.com>\n"
"PO-Revision-Date: 2011-10-26 15:29+0000\n"
"Last-Translator: Michel Vorenhout <Unknown>\n"
"Language-Team: \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-01 05:02+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:49+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -8107,9 +8107,9 @@ msgid ""
"loading a new language it becomes available as default interface language "
"for users and partners."
msgstr ""
"Deze assitent helpt u een nieuwe taal toe te voegen aan uw OpenERP systeem. "
"Na het laden van de nieuwe taal komt het beschikbaar als standaard interface "
"taal voor gebruikers en relaties."
"Deze assistent helpt u een nieuwe taal toe te voegen aan uw OpenERP systeem. "
"Na het laden van de nieuwe taal komt deze beschikbaar als standaard "
"interface taal voor gebruikers en relaties."
#. module: base
#: field:ir.actions.server,subject:0

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-01 05:07+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:51+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:04+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:05+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-05 04:44+0000\n"
"X-Generator: Launchpad (build 14085)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -211,7 +211,7 @@ msgstr "Struktura podjetja"
#. module: base
#: selection:base.language.install,lang:0
msgid "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
msgstr ""
msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: view:res.partner:0
@ -524,7 +524,7 @@ msgstr "Ime opcijskega modula predmeta na katerem bo to dejanje vidno"
#. module: base
#: field:workflow.transition,trigger_expr_id:0
msgid "Trigger Expression"
msgstr ""
msgstr "Izraz sprožilnika"
#. module: base
#: model:res.country,name:base.jo
@ -956,7 +956,7 @@ msgstr "Spletna stran"
#. module: base
#: model:res.country,name:base.gs
msgid "S. Georgia & S. Sandwich Isls."
msgstr ""
msgstr "S. Georgia in S. Sandwich otoki"
#. module: base
#: field:ir.actions.url,url:0
@ -1278,7 +1278,7 @@ msgstr "Računska natančnost"
#. module: base
#: selection:base.language.install,lang:0
msgid "Sinhalese / සිංහල"
msgstr ""
msgstr "Sinhalese / සිංහල"
#. module: base
#: model:ir.model,name:base.model_wizard_ir_model_menu_create_line
@ -1730,7 +1730,7 @@ msgstr "Poenostavljen"
#. module: base
#: model:res.country,name:base.st
msgid "Saint Tome (Sao Tome) and Principe"
msgstr ""
msgstr "Saint Tome (Sao Tome) in Principe"
#. module: base
#: selection:res.partner.address,type:0
@ -2165,7 +2165,7 @@ msgstr "Ime partnerja"
#. module: base
#: field:workflow.activity,signal_send:0
msgid "Signal (subflow.*)"
msgstr ""
msgstr "Signal (subflow.*)"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_17
@ -2545,7 +2545,7 @@ msgstr "Ruska federacija"
#. module: base
#: selection:base.language.install,lang:0
msgid "Urdu / اردو"
msgstr ""
msgstr "Urdu / اردو"
#. module: base
#: field:res.company,name:0
@ -3218,7 +3218,7 @@ msgstr "Poročila po meri"
#. module: base
#: selection:base.language.install,lang:0
msgid "Abkhazian / аҧсуа"
msgstr ""
msgstr "Copy text \t Abkhazian / аҧсуа"
#. module: base
#: view:base.module.configuration:0
@ -3865,7 +3865,7 @@ msgstr "Seznam kontrole dostopa"
#. module: base
#: model:res.country,name:base.um
msgid "USA Minor Outlying Islands"
msgstr ""
msgstr "Manjši oddaljeni otoki ZDA"
#. module: base
#: field:res.partner.bank,state:0
@ -3894,7 +3894,7 @@ msgstr "Datum inicializacije"
#. module: base
#: selection:base.language.install,lang:0
msgid "Gujarati / ગુજરાતી"
msgstr ""
msgstr "Gujarati / ગુજરાતી"
#. module: base
#: code:addons/base/module/module.py:257
@ -3946,7 +3946,7 @@ msgstr "Ure"
#. module: base
#: model:res.country,name:base.gp
msgid "Guadeloupe (French)"
msgstr ""
msgstr "Guadeloupe (francoski)"
#. module: base
#: code:addons/base/res/res_lang.py:157
@ -4088,7 +4088,7 @@ msgstr "Natančnost cene"
#. module: base
#: selection:base.language.install,lang:0
msgid "Latvian / latviešu valoda"
msgstr ""
msgstr "Latvijsko / latviešu valoda"
#. module: base
#: view:res.config:0
@ -4099,7 +4099,7 @@ msgstr "vsep"
#. module: base
#: selection:base.language.install,lang:0
msgid "French / Français"
msgstr ""
msgstr "Francosko / Français"
#. module: base
#: code:addons/orm.py:1049
@ -4193,7 +4193,7 @@ msgstr "Meniji"
#. module: base
#: selection:base.language.install,lang:0
msgid "Serbian (Latin) / srpski"
msgstr ""
msgstr "Srbsko (Latin) / srpski"
#. module: base
#: model:res.country,name:base.il
@ -4266,7 +4266,7 @@ msgstr "Banke"
#. module: base
#: view:res.log:0
msgid "Unread"
msgstr ""
msgstr "Neprebrano"
#. module: base
#: field:ir.cron,doall:0
@ -4393,7 +4393,7 @@ msgstr "Za sorodna polja, tehnično ime ciljnega modela"
#. module: base
#: selection:base.language.install,lang:0
msgid "Indonesian / Bahasa Indonesia"
msgstr ""
msgstr "Indonezijski / Bahasa Indonesia"
#. module: base
#: field:ir.ui.view,inherit_id:0
@ -4847,7 +4847,7 @@ msgstr "Elementi delovnih procesov"
#. module: base
#: model:res.country,name:base.vc
msgid "Saint Vincent & Grenadines"
msgstr ""
msgstr "Saint Vincent in Grenadine"
#. module: base
#: field:partner.sms.send,password:0
@ -4886,7 +4886,7 @@ msgstr "RML interna glava"
#. module: base
#: field:ir.actions.act_window,search_view_id:0
msgid "Search View Ref."
msgstr ""
msgstr "Sklic pogleda iskanja"
#. module: base
#: field:ir.module.module,installed_version:0
@ -5144,7 +5144,7 @@ msgstr "Nadrejena kategorija"
#. module: base
#: selection:ir.property,type:0
msgid "Integer Big"
msgstr ""
msgstr "Veliko celo število"
#. module: base
#: selection:res.partner.address,type:0
@ -5440,7 +5440,7 @@ msgstr "Naprej"
#. module: base
#: selection:base.language.install,lang:0
msgid "Thai / ภาษาไทย"
msgstr ""
msgstr "Tajski/ ภาษาไทย"
#. module: base
#: code:addons/orm.py:158
@ -5523,7 +5523,7 @@ msgstr "Privzeto podjetje"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (EC) / Español (EC)"
msgstr ""
msgstr "Špansko (EC) / Español (EC)"
#. module: base
#: help:ir.ui.view,xml_id:0
@ -5598,7 +5598,7 @@ msgstr "Zaposlovanje"
#. module: base
#: model:res.country,name:base.re
msgid "Reunion (French)"
msgstr ""
msgstr "Reunion (francoski)"
#. module: base
#: code:addons/base/ir/ir_model.py:321
@ -5732,7 +5732,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Flemish (BE) / Vlaams (BE)"
msgstr ""
msgstr "Flamski (BE) / Vlaams (BE)"
#. module: base
#: field:ir.cron,interval_number:0
@ -5797,7 +5797,7 @@ msgstr "Bližnjice po meri"
#. module: base
#: selection:base.language.install,lang:0
msgid "Vietnamese / Tiếng Việt"
msgstr ""
msgstr "Vietnamski/ Tiếng Việt"
#. module: base
#: model:res.country,name:base.dz
@ -5915,7 +5915,7 @@ msgstr "Nevtralno območje"
#. module: base
#: selection:base.language.install,lang:0
msgid "Hindi / हिंदी"
msgstr ""
msgstr "Hindujski / हिंदी"
#. module: base
#: view:ir.model:0
@ -6121,7 +6121,7 @@ msgstr "Osnova"
#. module: base
#: selection:base.language.install,lang:0
msgid "Telugu / తెలుగు"
msgstr ""
msgstr "Copy text \t Telugu / తెలుగు"
#. module: base
#: model:res.country,name:base.lr
@ -6210,7 +6210,7 @@ msgstr "Kode zaporedja"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (CO) / Español (CO)"
msgstr ""
msgstr "Špansko (CO) / Español (CO)"
#. module: base
#: view:base.module.configuration:0
@ -6250,7 +6250,7 @@ msgstr "res.log"
#: help:ir.translation,module:0
#: help:ir.translation,xml_id:0
msgid "Maps to the ir_model_data for which this translation is provided."
msgstr ""
msgstr "Mapira k ir_model_data za katerega je zagotovljen prevod."
#. module: base
#: view:workflow.activity:0
@ -6266,7 +6266,7 @@ msgstr "Tedni"
#. module: base
#: model:res.country,name:base.af
msgid "Afghanistan, Islamic State of"
msgstr ""
msgstr "Afganistan, Muslimanska država"
#. module: base
#: code:addons/base/module/wizard/base_module_import.py:67
@ -6324,7 +6324,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Chinese (TW) / 正體字"
msgstr ""
msgstr "Kitajsko (TW) / 正體字"
#. module: base
#: model:ir.model,name:base.model_res_request
@ -6382,7 +6382,7 @@ msgstr "Ime storitve"
#. module: base
#: model:res.country,name:base.pn
msgid "Pitcairn Island"
msgstr ""
msgstr "Otok Pitcairn"
#. module: base
#: view:base.module.upgrade:0
@ -6585,7 +6585,7 @@ msgstr "Nameščena različica"
#. module: base
#: selection:base.language.install,lang:0
msgid "Mongolian / монгол"
msgstr ""
msgstr "Mongolski / монгол"
#. module: base
#: model:res.country,name:base.mr
@ -6622,7 +6622,7 @@ msgstr "Krovno podjetje"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (CR) / Español (CR)"
msgstr ""
msgstr "Špansko (CR) / Español (CR)"
#. module: base
#: field:res.currency.rate,rate:0
@ -6652,7 +6652,7 @@ msgstr "Orodja"
#. module: base
#: model:res.country,name:base.kn
msgid "Saint Kitts & Nevis Anguilla"
msgstr ""
msgstr "Saint Kitts in Nevis Anguilla"
#. module: base
#: code:addons/base/res/res_currency.py:100
@ -6717,7 +6717,7 @@ msgstr "Model kateremu ta polja pripadajo"
#. module: base
#: model:res.country,name:base.mq
msgid "Martinique (French)"
msgstr ""
msgstr "Martinique (francoski)"
#. module: base
#: view:ir.sequence.type:0
@ -6781,7 +6781,7 @@ msgstr ""
#. module: base
#: field:ir.ui.menu,child_id:0
msgid "Child IDs"
msgstr ""
msgstr "Podrejeni ID-ji"
#. module: base
#: code:addons/base/ir/ir_actions.py:713
@ -7231,7 +7231,7 @@ msgstr "Stranka"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (NI) / Español (NI)"
msgstr ""
msgstr "Špansko (NI) / Español (NI)"
#. module: base
#: field:ir.module.module,shortdesc:0
@ -7542,7 +7542,7 @@ msgstr "Stanje"
#. module: base
#: selection:base.language.install,lang:0
msgid "Galician / Galego"
msgstr ""
msgstr "Galski / Galego"
#. module: base
#: model:res.country,name:base.no
@ -7766,7 +7766,7 @@ msgstr "Nedefinirana metoda 'get'!"
#. module: base
#: selection:base.language.install,lang:0
msgid "Norwegian Bokmål / Norsk bokmål"
msgstr ""
msgstr "Norveški Bokmål / Norsk bokmål"
#. module: base
#: help:res.config.users,new_password:0
@ -7827,7 +7827,7 @@ msgstr "ir.values"
#. module: base
#: selection:base.language.install,lang:0
msgid "Occitan (FR, post 1500) / Occitan"
msgstr ""
msgstr "Copy text \t Occitan (FR, post 1500) / Occitan"
#. module: base
#: model:ir.actions.act_window,help:base.open_module_tree
@ -7856,7 +7856,7 @@ msgstr "Demokratična republika Kongo"
#. module: base
#: selection:base.language.install,lang:0
msgid "Malayalam / മലയാളം"
msgstr ""
msgstr "Malezijski / മലയാളം"
#. module: base
#: view:res.request:0
@ -7928,7 +7928,7 @@ msgstr "Koda države mora biti edinstvena!"
#. module: base
#: selection:ir.module.module.dependency,state:0
msgid "Uninstallable"
msgstr ""
msgstr "Nenamestljiv"
#. module: base
#: view:res.partner.category:0
@ -8018,7 +8018,7 @@ msgstr "2.sklic dokument"
#. module: base
#: field:res.request,ref_doc1:0
msgid "Document Ref 1"
msgstr ""
msgstr "1.sklic dokumenta"
#. module: base
#: model:res.country,name:base.ga
@ -8055,7 +8055,7 @@ msgstr "Copy text \t 1. %c ==> Pet 5.Dec 2008 5 18:25:20"
#. module: base
#: model:res.country,name:base.nc
msgid "New Caledonia (French)"
msgstr ""
msgstr "Nova Caledonia (francoski)"
#. module: base
#: model:res.country,name:base.cy
@ -8262,7 +8262,7 @@ msgstr "Gradiniki na uporabnika"
#. module: base
#: selection:base.language.install,lang:0
msgid "Slovak / Slovenský jazyk"
msgstr ""
msgstr "Slovaški / Slovenský jazyk"
#. module: base
#: field:base.language.export,state:0
@ -8570,7 +8570,7 @@ msgstr "Tanzanija"
#. module: base
#: selection:base.language.install,lang:0
msgid "Danish / Dansk"
msgstr ""
msgstr "Danski / Dansk"
#. module: base
#: selection:ir.model.fields,select_level:0
@ -8703,7 +8703,7 @@ msgstr "Dominikanska republika"
#. module: base
#: selection:base.language.install,lang:0
msgid "Serbian (Cyrillic) / српски"
msgstr ""
msgstr "Srbski (Cirilica) / српски"
#. module: base
#: code:addons/orm.py:2161
@ -8860,7 +8860,7 @@ msgstr "Interesi & priložnosti"
#. module: base
#: selection:base.language.install,lang:0
msgid "Romanian / română"
msgstr ""
msgstr "Romunski/ română"
#. module: base
#: view:res.log:0
@ -8985,7 +8985,7 @@ msgstr "Datoteka spletne ikone"
#. module: base
#: selection:base.language.install,lang:0
msgid "Persian / فارس"
msgstr ""
msgstr "Perzijski / فارس"
#. module: base
#: view:ir.actions.act_window:0
@ -9099,7 +9099,7 @@ msgstr "Pogodba založniške garancije"
#. module: base
#: selection:base.language.install,lang:0
msgid "Bulgarian / български език"
msgstr ""
msgstr "Bolgarski / български език"
#. module: base
#: model:ir.ui.menu,name:base.menu_aftersale
@ -9212,7 +9212,7 @@ msgstr "Ni mogoče posodobiti"
#. module: base
#: selection:base.language.install,lang:0
msgid "Klingon"
msgstr ""
msgstr "Klingon"
#. module: base
#: model:res.country,name:base.sg
@ -9295,7 +9295,7 @@ msgstr "%X - primeren čas zastopnja"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (SV) / Español (SV)"
msgstr ""
msgstr "Španski (SV) / Español (SV)"
#. module: base
#: help:res.lang,grouping:0

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-01 05:00+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:47+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:05+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:52+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:07+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:55+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:05+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0
@ -28,7 +28,7 @@ msgstr "Domän"
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena"
msgstr "St Helena"
msgstr "Sankta Helena"
#. module: base
#: view:ir.actions.report.xml:0
@ -38,7 +38,7 @@ msgstr "Övrig konfiguration"
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
msgstr "DatumTid"
msgstr "Datum/Tid"
#. module: base
#: code:addons/fields.py:534

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-01 05:05+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:53+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\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

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-01 05:07+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:06+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

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-01 05:07+0000\n"
"X-Generator: Launchpad (build 14071)\n"
"X-Launchpad-Export-Date: 2011-11-04 04:54+0000\n"
"X-Generator: Launchpad (build 14231)\n"
#. module: base
#: view:ir.filters:0

View File

@ -2043,7 +2043,9 @@
<field name="view_id" ref="ir_mail_server_list" />
<field name="search_view_id" ref="view_ir_mail_server_search"/>
</record>
<menuitem id="next_id_15" name="Parameters" parent="base.menu_config" groups="base.group_extended" />
<menuitem id="menu_mail_servers" parent="base.next_id_15" action="action_ir_mail_server_list" sequence="15"/>
<menuitem id="menu_email" name="Email" parent="base.menu_config" groups="base.group_extended"/>
<menuitem id="menu_mail_servers" parent="menu_email" action="action_ir_mail_server_list" sequence="15"/>
</data>
</openerp>

View File

@ -117,7 +117,7 @@ class report_xml(osv.osv):
'multi': fields.boolean('On multiple doc.', help="If set to true, the action will not be displayed on the right toolbar of a form view."),
'attachment': fields.char('Save As Attachment Prefix', size=128, help='This is the filename of the attachment used to store the printing result. Keep empty to not save the printed reports. You can use a python expression with the object and time variables.'),
'attachment_use': fields.boolean('Reload from Attachment', help='If you check this, then the second time the user prints with same attachment name, it returns the previous report.'),
'auto': fields.boolean('Custom python parser', required=True),
'auto': fields.boolean('Custom python parser'),
'header': fields.boolean('Add RML header', help="Add or not the coporate RML header"),
@ -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 " \

View File

@ -25,7 +25,7 @@ Store database-specific configuration parameters
from osv import osv,fields
import uuid
import datetime
from tools import misc
from tools import misc, config
"""
A dictionary holding some configuration parameters to be initialized when the database is created.
@ -33,6 +33,7 @@ A dictionary holding some configuration parameters to be initialized when the da
_default_parameters = {
"database.uuid": lambda: str(uuid.uuid1()),
"database.create_date": lambda: datetime.datetime.now().strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT),
"web.base.url": lambda: "http://localhost:%s" % config.get('xmlrpc_port'),
}
class ir_config_parameter(osv.osv):

View File

@ -44,8 +44,8 @@ _logger = logging.getLogger('ir.mail_server')
class MailDeliveryException(osv.except_osv):
"""Specific exception subclass for mail delivery errors"""
def __init__(self, name, value, exc_type='warning'):
super(MailDeliveryException, self).__init__(name, value, exc_type=exc_type)
def __init__(self, name, value):
super(MailDeliveryException, self).__init__(name, value)
class WriteToLogger(object):
"""debugging helper: behave as a fd and pipe to logger at the given level"""
@ -431,7 +431,9 @@ class ir_mail_server(osv.osv):
# ignored, just a consequence of the previous exception
pass
except Exception, e:
msg = _("Mail delivery failed via SMTP server '%s'.\n%s: %s") % (smtp_server, e.__class__.__name__, e)
msg = _("Mail delivery failed via SMTP server '%s'.\n%s: %s") % (tools.ustr(smtp_server),
e.__class__.__name__,
tools.ustr(e))
_logger.exception(msg)
raise MailDeliveryException(_("Mail delivery failed"), msg)
return message_id

View File

@ -124,12 +124,13 @@ class ir_model(osv.osv):
# overridden to allow searching both on model name (model field)
# and model description (name field)
def name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=None):
def _name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=100, name_get_uid=None):
if args is None:
args = []
domain = args + ['|', ('model', operator, name), ('name', operator, name)]
return super(ir_model, self).name_search(cr, uid, None, domain,
operator=operator, limit=limit, context=context)
return self.name_get(cr, name_get_uid or uid,
super(ir_model, self).search(cr, uid, domain, limit=limit, context=context),
context=context)
def unlink(self, cr, user, ids, context=None):
@ -671,18 +672,20 @@ class ir_model_data(osv.osv):
action_id = False
if xml_id:
cr.execute('''SELECT imd.id, imd.res_id, md.id
cr.execute('''SELECT imd.id, imd.res_id, md.id, imd.model
FROM ir_model_data imd LEFT JOIN %s md ON (imd.res_id = md.id)
WHERE imd.module=%%s AND imd.name=%%s''' % model_obj._table,
(module, xml_id))
results = cr.fetchall()
for imd_id2,res_id2,real_id2 in results:
for imd_id2,res_id2,real_id2,real_model in results:
if not real_id2:
self._get_id.clear_cache(self, uid, module, xml_id)
self.get_object_reference.clear_cache(self, uid, module, xml_id)
cr.execute('delete from ir_model_data where id=%s', (imd_id2,))
res_id = False
else:
assert model == real_model, "External ID conflict, %s already refers to a `%s` record,"\
" you can't define a `%s` record with this ID." % (xml_id, real_model, model)
res_id,action_id = res_id2,imd_id2
if action_id and res_id:

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

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>

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

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,

View File

@ -105,13 +105,16 @@
</form>
</field>
</record>
<record model="ir.ui.view" id="contacts_kanban_view">
<field name="name">res.partner.address.kanban</field>
<field name="model">res.partner.address</field>
<field name="type">kanban</field>
<field name="arch" type="xml">
<kanban >
<kanban>
<field name="color"/>
<field name="name"/>
<field name="email"/>
<templates>
<t t-name="kanban-box">
<t t-set="color" t-value="kanban_color(record.color.raw_value || record.name.raw_value)"/>
@ -133,22 +136,22 @@
<table class="oe_kanban_table">
<tr>
<td valign="top" width="22" align="left">
<img src="/web/static/src/img/persons.png"/>
<img src="/base/static/src/img/kanban_partner.png" width="64" height="64"/>
</td>
<td valign="top" align="left">
<div class="oe_kanban_title2">
<field name="title"/>
<t t-if="record.title.raw_value &amp;&amp; record.function.raw_value">,</t>
<t t-if="record.title.raw_value and record.function.raw_value">,</t>
<field name="function"/>
</div>
<div class="oe_kanban_title3">
<field name="partner_id"/>
<t t-if="record.partner_id.raw_value &amp;&amp; record.country_id.raw_value">,</t>
<t t-if="record.partner_id.raw_value and record.country_id.raw_value">,</t>
<field name="country_id"/>
</div>
<div class="oe_kanban_title3">
<i><field name="email"/>
<t t-if="record.phone.raw_value &amp;&amp; record.email.raw_value">,</t>
<t t-if="record.phone.raw_value and record.email.raw_value">,</t>
<field name="phone"/></i>
</div>
</td>
@ -157,7 +160,7 @@
</div>
<div class="oe_kanban_buttons_set oe_kanban_color_border oe_kanban_color_bglight oe_kanban_box_show_onclick">
<div class="oe_kanban_left">
<a string="Edit" icon="gtk-edit" type="edit"/>
<a string="Edit" icon="gtk-edit" type="edit"/>
<a string="Change Color" icon="color-picker" type="color" name="color"/>
<a title="Mail" t-att-href="'mailto:'+record.email.value" style="text-decoration: none;" >
<img src="/web/static/src/img/icons/terp-mail-message-new.png" border="0" width="16" height="16"/>
@ -422,7 +425,7 @@
</search>
</field>
</record>
<!-- Partner Kanban View -->
<record model="ir.ui.view" id="res_partner_kanban_view">
<field name="name">RES - PARTNER KANBAN</field>
@ -430,6 +433,9 @@
<field name="type">kanban</field>
<field name="arch" type="xml">
<kanban>
<field name="color"/>
<field name="name"/>
<field name="email"/>
<templates>
<t t-name="kanban-box">
<t t-set="color" t-value="kanban_color(record.color.raw_value || record.name.raw_value)"/>
@ -450,23 +456,23 @@
<div class="oe_kanban_box_content oe_kanban_color_bglight oe_kanban_box_show_onclick_trigger oe_kanban_color_border">
<table class="oe_kanban_table">
<tr>
<td valign="top" width="22" align="left">
<img src="/web/static/src/img/partner.png"/>
<td valign="top" width="64" align="left">
<img src="/base/static/src/img/kanban_partner.png" width="64" height="64"/>
</td>
<td valign="top" align="left">
<div class="oe_kanban_title2">
<field name="title"/>
<t t-if="record.title.raw_value &amp;&amp; record.country.raw_value">,</t>
<t t-if="record.title.raw_value and record.country.raw_value">,</t>
<field name="country"/>
</div>
<div class="oe_kanban_title3">
<field name="subname"/>
<t t-if="record.subname.raw_value &amp;&amp; record.function.raw_value">,</t>
<t t-if="record.subname.raw_value and record.function.raw_value">,</t>
<field name="function"/>
</div>
<div class="oe_kanban_title3">
<i><field name="email"/>
<t t-if="record.phone.raw_value &amp;&amp; record.email.raw_value">,</t>
<t t-if="record.phone.raw_value and record.email.raw_value">,</t>
<field name="phone"/></i>
</div>
</td>
@ -475,7 +481,7 @@
</div>
<div class="oe_kanban_buttons_set oe_kanban_color_border oe_kanban_color_bglight oe_kanban_box_show_onclick">
<div class="oe_kanban_left">
<a string="Edit" icon="gtk-edit" type="edit"/>
<a string="Edit" icon="gtk-edit" type="edit"/>
<a string="Change Color" icon="color-picker" type="color" name="color"/>
<a title="Mail" t-att-href="'mailto:'+record.email.value" style="text-decoration: none;" >
<img src="/web/static/src/img/icons/terp-mail-message-new.png" border="0" width="16" height="16"/>

View File

@ -35,6 +35,7 @@ from osv import fields,osv
from osv.orm import browse_record
from service import security
from tools.translate import _
import openerp
import openerp.exceptions
class groups(osv.osv):
@ -205,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"),
@ -417,14 +419,42 @@ class users(osv.osv):
data_id = dataobj._get_id(cr, 1, 'base', 'action_res_users_my')
return dataobj.browse(cr, uid, data_id, context=context).res_id
def authenticate(self, db, login, password, user_agent_env):
"""Verifies and returns the user ID corresponding to the given
``login`` and ``password`` combination, or False if there was
no matching user.
:param str db: the database on which user is trying to authenticate
:param str login: username
:param str password: user password
:param dict user_agent_env: environment dictionary describing any
relevant environment attributes
"""
uid = self.login(db, login, password)
if uid == openerp.SUPERUSER_ID:
# Successfully logged in as admin!
# Attempt to guess the web base url...
if user_agent_env and user_agent_env.get('base_location'):
cr = pooler.get_db(db).cursor()
try:
self.pool.get('ir.config_parameter').set_param(cr, uid, 'web.base.url',
user_agent_env['base_location'])
cr.commit()
except Exception:
logging.getLogger('res.users').exception("Failed to update web.base.url configuration parameter")
finally:
cr.close()
return uid
def login(self, db, login, password):
if not password:
return False
cr = pooler.get_db(db).cursor()
try:
cr.execute('UPDATE res_users SET date=now() WHERE login=%s AND password=%s AND active RETURNING id',
(tools.ustr(login), tools.ustr(password)))
cr.execute("""UPDATE res_users
SET date = now() AT TIME ZONE 'UTC'
WHERE login=%s AND password=%s AND active RETURNING id""",
(tools.ustr(login), tools.ustr(password)))
res = cr.fetchone()
cr.commit()
if res:
@ -726,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

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>

View File

@ -16,7 +16,7 @@
"access_ir_model_access_all","ir_model_access_all","model_ir_model_access",,1,0,0,0
"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,0,0,0
"access_ir_model_fields_all","ir_model_fields all","model_ir_model_fields",,1,0,0,0
"access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category","group_system",1,0,0,0
"access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category",,1,0,0,0
"access_ir_module_module_group_user","ir_module_module group_user","model_ir_module_module","group_system",1,1,1,1
"access_ir_module_module_user","ir_module_module user","model_ir_module_module",,1,0,0,0
"access_ir_module_module_dependency_group_system","ir_module_module_dependency group_system","model_ir_module_module_dependency","group_system",1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
16 access_ir_model_access_all ir_model_access_all model_ir_model_access 1 0 0 0
17 access_ir_model_data_all ir_model_data all model_ir_model_data 1 0 0 0
18 access_ir_model_fields_all ir_model_fields all model_ir_model_fields 1 0 0 0
19 access_ir_module_category_group_user ir_module_category group_user model_ir_module_category group_system 1 0 0 0
20 access_ir_module_module_group_user ir_module_module group_user model_ir_module_module group_system 1 1 1 1
21 access_ir_module_module_user ir_module_module user model_ir_module_module 1 0 0 0
22 access_ir_module_module_dependency_group_system ir_module_module_dependency group_system model_ir_module_module_dependency group_system 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -101,7 +101,7 @@ class Graph(dict):
# NOTE The call to load_information_from_description_file is already
# done by db.initialize, so it is possible to not do it again here.
info = openerp.modules.module.load_information_from_description_file(module)
if info['installable']:
if info and info['installable']:
packages.append((module, info)) # TODO directly a dict, like in get_modules_with_version
else:
logger.notifyChannel('init', netsvc.LOG_WARNING, 'module %s: not installable, skipped' % (module))

View File

@ -147,6 +147,10 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
migrations = openerp.modules.migration.MigrationManager(cr, graph)
logger.debug('loading %d packages...', len(graph))
# get db timestamp
cr.execute("select now()::timestamp")
dt_before_load = cr.fetchone()[0]
# register, instantiate and initialize models for each modules
for index, package in enumerate(graph):
module_name = package.name
@ -214,6 +218,9 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
cr.commit()
# mark new res_log records as read
cr.execute("update res_log set read=True where create_date >= %s", (dt_before_load,))
cr.commit()
return loaded_modules, processed_modules

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

View File

@ -131,6 +131,12 @@ class boolean(_column):
_symbol_f = lambda x: x and 'True' or 'False'
_symbol_set = (_symbol_c, _symbol_f)
def __init__(self, string='unknown', required=False, **args):
super(boolean, self).__init__(string=string, required=required, **args)
if required:
warnings.warn("Making a boolean field `required` has no effect, as NULL values are "
"automatically turned into False", PendingDeprecationWarning, stacklevel=2)
class integer(_column):
_type = 'integer'
_symbol_c = '%s'
@ -138,6 +144,12 @@ class integer(_column):
_symbol_set = (_symbol_c, _symbol_f)
_symbol_get = lambda self,x: x or 0
def __init__(self, string='unknown', required=False, **args):
super(integer, self).__init__(string=string, required=required, **args)
if required:
warnings.warn("Making an integer field `required` has no effect, as NULL values are "
"automatically turned into 0", PendingDeprecationWarning, stacklevel=2)
class integer_big(_column):
"""Experimental 64 bit integer column type, currently unused.
@ -155,6 +167,12 @@ class integer_big(_column):
_symbol_set = (_symbol_c, _symbol_f)
_symbol_get = lambda self,x: x or 0
def __init__(self, string='unknown', required=False, **args):
super(integer_big, self).__init__(string=string, required=required, **args)
if required:
warnings.warn("Making an integer_big field `required` has no effect, as NULL values are "
"automatically turned into 0", PendingDeprecationWarning, stacklevel=2)
class reference(_column):
_type = 'reference'
_classic_read = False # post-process to handle missing target
@ -208,10 +226,13 @@ class float(_column):
_symbol_set = (_symbol_c, _symbol_f)
_symbol_get = lambda self,x: x or 0.0
def __init__(self, string='unknown', digits=None, digits_compute=None, **args):
_column.__init__(self, string=string, **args)
def __init__(self, string='unknown', digits=None, digits_compute=None, required=False, **args):
_column.__init__(self, string=string, required=required, **args)
self.digits = digits
self.digits_compute = digits_compute
if required:
warnings.warn("Making a float field `required` has no effect, as NULL values are "
"automatically turned into 0.0", PendingDeprecationWarning, stacklevel=2)
def digits_change(self, cr):
@ -1037,7 +1058,7 @@ class related(function):
_columns = {
'foo_id': fields.many2one('my.foo', 'Foo'),
'bar': fields.related('frol', 'foo_id', type='char', string='Frol of Foo'),
'bar': fields.related('foo_id', 'frol', type='char', string='Frol of Foo'),
}
"""
@ -1364,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

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
@ -1261,7 +1260,7 @@ class BaseModel(object):
nbrmax = position+1
done = {}
for i in range(len(fields)):
for i, field in enumerate(fields):
res = False
if i >= len(line):
raise Exception(_('Please check that all your lines have %d columns.'
@ -1270,11 +1269,11 @@ class BaseModel(object):
if not line[i]:
continue
field = fields[i]
if field[:len(prefix)] <> prefix:
if line[i] and skip:
return False
continue
field_name = field[len(prefix)]
#set the mode for m2o, o2m, m2m : xml_id/id/name
if len(field) == len(prefix)+1:
@ -1290,7 +1289,7 @@ class BaseModel(object):
return [(6,0,res)]
# ID of the record using a XML ID
if field[len(prefix)]=='id':
if field_name == 'id':
try:
data_res_id = _get_id(model_name, line[i], current_module, 'id')
except ValueError:
@ -1299,16 +1298,17 @@ class BaseModel(object):
continue
# ID of the record using a database ID
elif field[len(prefix)]=='.id':
elif field_name == '.id':
data_res_id = _get_id(model_name, line[i], current_module, '.id')
continue
field_type = fields_def[field_name]['type']
# recursive call for getting children and returning [(0,0,{})] or [(1,ID,{})]
if fields_def[field[len(prefix)]]['type']=='one2many':
if field[len(prefix)] in done:
if field_type == 'one2many':
if field_name in done:
continue
done[field[len(prefix)]] = True
relation = fields_def[field[len(prefix)]]['relation']
done[field_name] = True
relation = fields_def[field_name]['relation']
relation_obj = self.pool.get(relation)
newfd = relation_obj.fields_get( cr, uid, context=context )
pos = position
@ -1317,7 +1317,7 @@ class BaseModel(object):
first = 0
while pos < len(datas):
res2 = process_liness(self, datas, prefix + [field[len(prefix)]], current_module, relation_obj._name, newfd, pos, first)
res2 = process_liness(self, datas, prefix + [field_name], current_module, relation_obj._name, newfd, pos, first)
if not res2:
break
(newrow, pos, w2, data_res_id2, xml_id2) = res2
@ -1333,36 +1333,36 @@ class BaseModel(object):
res.append( (data_res_id2 and 1 or 0, data_res_id2 or 0, newrow) )
elif fields_def[field[len(prefix)]]['type']=='many2one':
relation = fields_def[field[len(prefix)]]['relation']
elif field_type == 'many2one':
relation = fields_def[field_name]['relation']
res = _get_id(relation, line[i], current_module, mode)
elif fields_def[field[len(prefix)]]['type']=='many2many':
relation = fields_def[field[len(prefix)]]['relation']
elif field_type == 'many2many':
relation = fields_def[field_name]['relation']
res = many_ids(line[i], relation, current_module, mode)
elif fields_def[field[len(prefix)]]['type'] == 'integer':
elif field_type == 'integer':
res = line[i] and int(line[i]) or 0
elif fields_def[field[len(prefix)]]['type'] == 'boolean':
elif field_type == 'boolean':
res = line[i].lower() not in ('0', 'false', 'off')
elif fields_def[field[len(prefix)]]['type'] == 'float':
elif field_type == 'float':
res = line[i] and float(line[i]) or 0.0
elif fields_def[field[len(prefix)]]['type'] == 'selection':
for key, val in fields_def[field[len(prefix)]]['selection']:
elif field_type == 'selection':
for key, val in fields_def[field_name]['selection']:
if tools.ustr(line[i]) in [tools.ustr(key), tools.ustr(val)]:
res = key
break
if line[i] and not res:
logger.notifyChannel("import", netsvc.LOG_WARNING,
_("key '%s' not found in selection field '%s'") % \
(tools.ustr(line[i]), tools.ustr(field[len(prefix)])))
warning += [_("Key/value '%s' not found in selection field '%s'") % (tools.ustr(line[i]), tools.ustr(field[len(prefix)]))]
logging.getLogger('orm.import').warn(
_("key '%s' not found in selection field '%s'"),
tools.ustr(line[i]), tools.ustr(field_name))
warning.append(_("Key/value '%s' not found in selection field '%s'") % (
tools.ustr(line[i]), tools.ustr(field_name)))
else:
res = line[i]
row[field[len(prefix)]] = res or False
row[field_name] = res or False
result = (row, nbrmax, warning, data_res_id, xml_id)
return result
@ -1807,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)
@ -2476,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):
@ -4598,7 +4616,7 @@ class BaseModel(object):
:type default: dictionary
:param context: context arguments, like lang, time zone
:type context: dictionary
:return: True
:return: id of the newly created record
"""
if context is None:

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

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 !')

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

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

View File

@ -366,20 +366,15 @@ class db(netsvc.ExportService):
return True
class common(netsvc.ExportService):
_logger = logging.getLogger('web-services')
def __init__(self,name="common"):
netsvc.ExportService.__init__(self,name)
def dispatch(self, method, params):
logger = netsvc.Logger()
if method == 'login':
res = security.login(params[0], params[1], params[2])
msg = res and 'successful login' or 'bad login or password'
# TODO log the client ip address..
logger.notifyChannel("web-service", netsvc.LOG_INFO, "%s from '%s' using database '%s'" % (msg, params[1], params[0].lower()))
return res or False
elif method in ['about', 'timezone_get', 'get_server_environment',
'login_message','get_stats', 'check_connectivity',
'list_http_services', 'version']:
if method in ['login', 'about', 'timezone_get', 'get_server_environment',
'login_message','get_stats', 'check_connectivity',
'list_http_services', 'version', 'authenticate']:
pass
elif method in ['get_available_updates', 'get_migration_scripts', 'set_loglevel', 'get_os_time', 'get_sqlcount']:
passwd = params[0]
@ -391,6 +386,18 @@ class common(netsvc.ExportService):
fn = getattr(self, 'exp_'+method)
return fn(*params)
def exp_login(self, db, login, password):
# TODO: legacy indirection through 'security', should use directly
# the res.users model
res = security.login(db, login, password)
msg = res and 'successful login' or 'bad login or password'
self._logger.info("%s from '%s' using database '%s'", msg, login, db.lower())
return res or False
def exp_authenticate(self, db, login, password, user_agent_env):
res_users = pooler.get_pool(db).get('res.users')
return res_users.authenticate(db, login, password, user_agent_env)
def exp_version(self):
return RPC_VERSION_1

View File

@ -102,6 +102,9 @@ class configmanager(object):
group.add_option("-P", "--import-partial", dest="import_partial", my_default='',
help="Use this for big data importation, if it crashes you will be able to continue at the current state. Provide a filename to store intermediate importation states.")
group.add_option("--pidfile", dest="pidfile", help="file where the server pid will be stored")
group.add_option("--addons-path", dest="addons_path",
help="specify additional addons paths (separated by commas).",
action="callback", callback=self._check_addons_path, nargs=1, type="string")
group.add_option("--load", dest="server_wide_modules", help="Comma-separated list of server-wide modules default=web")
parser.add_option_group(group)
@ -233,9 +236,6 @@ class configmanager(object):
help="overwrites existing translation terms on updating a module or importing a CSV or a PO file.")
group.add_option("--modules", dest="translate_modules",
help="specify modules to export. Use in combination with --i18n-export")
group.add_option("--addons-path", dest="addons_path",
help="specify additional addons paths (separated by commas).",
action="callback", callback=self._check_addons_path, nargs=1, type="string")
parser.add_option_group(group)
security = optparse.OptionGroup(parser, 'Security-related options')

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)

View File

@ -363,7 +363,7 @@ class TinyPoFile(object):
"msgid \"\"\n" \
"msgstr \"\"\n" \
'''"Project-Id-Version: %(project)s %(version)s\\n"\n''' \
'''"Report-Msgid-Bugs-To: %(bugmail)s\\n"\n''' \
'''"Report-Msgid-Bugs-To: \\n"\n''' \
'''"POT-Creation-Date: %(now)s\\n"\n''' \
'''"PO-Revision-Date: %(now)s\\n"\n''' \
'''"Last-Translator: <>\\n"\n''' \
@ -377,7 +377,6 @@ class TinyPoFile(object):
% { 'project': release.description,
'version': release.version,
'modules': reduce(lambda s, m: s + "#\t* %s\n" % m, modules, ""),
'bugmail': release.support_email,
'now': datetime.utcnow().strftime('%Y-%m-%d %H:%M')+"+0000",
}
)

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]
@ -308,10 +312,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
@ -322,22 +337,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):
@ -366,7 +469,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]
@ -387,7 +490,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)]

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