bzr revid: nch@tinyerp.com-20100304053759-qkdcrymo4dcda3z6
This commit is contained in:
nch@tinyerp.com
2010-03-04 11:07:59 +05:30
77 changed files with 305 additions and 685 deletions
+4 -1
View File
@@ -634,7 +634,10 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
name, ext = os.path.splitext(filename)
fp = tools.file_open(opj(m, filename))
if ext == '.csv':
tools.convert_csv_import(cr, m, os.path.basename(filename), fp.read(), idref, mode=mode)
noupdate=False
if kind == 'init':
noupdate=True
tools.convert_csv_import(cr, m, os.path.basename(filename), fp.read(), idref, mode=mode, noupdate=noupdate)
elif ext == '.sql':
queries = fp.read().split(';')
for query in queries:
+26
View File
@@ -1271,6 +1271,32 @@
<field name="currency_id" ref="INR"/>
<field eval="time.strftime('%Y-01-01')" name="name"/>
</record>
<record id="AUD" model="res.currency">
<field name="name">AUD</field>
<field name="code">AUD</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>
<field name="company_id" ref="main_company"/>
</record>
<record id="rateAUD" model="res.currency.rate">
<field name="rate">1.5266</field>
<field name="currency_id" ref="AUD"/>
<field eval="time.strftime('%Y-01-01')" name="name"/>
</record>
<record id="UAH" model="res.currency">
<field name="name">UAH</field>
<field name="code">UAH</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>
<field name="company_id" ref="main_company"/>
</record>
<record id="rateUAH" model="res.currency.rate">
<field name="rate">10.8266</field>
<field name="currency_id" ref="UAH"/>
<field eval="time.strftime('%Y-01-01')" name="name"/>
</record>
</data>
</openerp>
+1 -1
View File
@@ -121,7 +121,7 @@
<page string="Roles">
<field colspan="4" nolabel="1" name="roles_id"/>
</page>
<page string="Accepted Companies">
<page string="Companies">
<field colspan="4" nolabel="1" name="company_ids" select="1"/>
</page>
</notebook>
-5
View File
@@ -2801,11 +2801,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2741,11 +2741,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2863,11 +2863,6 @@ msgstr "Мавриций"
msgid "Scan for new modules"
msgstr "Провери за нови модули"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Хранилище с модули"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2805,11 +2805,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2875,11 +2875,6 @@ msgstr "Maurici"
msgid "Scan for new modules"
msgstr "Cerca nous mòduls"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Biblioteca del mòdul"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2804,11 +2804,6 @@ msgstr "Mauricius"
msgid "Scan for new modules"
msgstr "Najít nové moduly"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repozitář modulu"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2875,11 +2875,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Suche Neue Module"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Verzeichnis der Module"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2880,11 +2880,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Αναζήτηση νέων Αρθρωμάτων"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Τοποθεσία Αρθρωμάτων"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2878,11 +2878,6 @@ msgstr "Mauricio"
msgid "Scan for new modules"
msgstr "Buscar nuevos módulos"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Biblioteca de módulos"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2858,11 +2858,6 @@ msgstr "Mauricio"
msgid "Scan for new modules"
msgstr "Buscar nuevos módulos"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repositorio de Módulos"
#. module: base
#: model:ir.ui.menu,name:base.menu_security
msgid "Security"
-5
View File
@@ -2877,11 +2877,6 @@ msgstr "Mauricio"
msgid "Scan for new modules"
msgstr "Buscar nuevos módulos"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Biblioteca de módulos"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2844,11 +2844,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Otsi uusi mooduleid"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Moodulite Varamu"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2864,11 +2864,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Etsi uusia moduuleja"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Moduulin ohjelmalähde"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2882,11 +2882,6 @@ msgstr "Île Maurice"
msgid "Scan for new modules"
msgstr "Recherche de nouveaux modules"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Dépot de modules"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2842,11 +2842,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "סרוק לחיפוש מודול חדש"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "מאגר מודולים"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
+3 -8
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-12-18 08:39+0000\n"
"PO-Revision-Date: 2010-02-22 05:40+0000\n"
"PO-Revision-Date: 2010-03-02 05:28+0000\n"
"Last-Translator: goranc <goranc@gmail.com>\n"
"Language-Team: openerp-translators\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-02-23 05:05+0000\n"
"X-Launchpad-Export-Date: 2010-03-03 04:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Language: hr\n"
@@ -1458,7 +1458,7 @@ msgstr "Madagaskar"
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"aziv objekta mora početi s x_ i ne smije sadržavati posebne znakove !"
"Naziv objekta mora početi s x_ i ne smije sadržavati posebne znakove !"
#. module: base
#: help:ir.rule.group,global:0
@@ -2846,11 +2846,6 @@ msgstr "Mauricijus"
msgid "Scan for new modules"
msgstr "Pretraži za nove module"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repozitorij modula"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2801,11 +2801,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2881,11 +2881,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Cerca nuovi Moduli"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repository dei Moduli"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
+4 -9
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-12-18 08:39+0000\n"
"PO-Revision-Date: 2010-02-22 05:38+0000\n"
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"PO-Revision-Date: 2010-03-02 05:31+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Japanese <ja@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: 2010-02-23 05:04+0000\n"
"X-Launchpad-Export-Date: 2010-03-03 04:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
@@ -25,7 +25,7 @@ msgstr "セント・ヘレナ"
#. module: base
#: wizard_view:res.partner.sms_send,init:0
msgid "SMS - Gateway: clickatell"
msgstr ""
msgstr "SMS - ゲートウェイ:clickatell"
#. module: base
#: view:res.lang:0
@@ -2804,11 +2804,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2827,11 +2827,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr "새 모듈 스캔"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "모듈 리포지토리"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2801,11 +2801,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2735,11 +2735,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_security
msgid "Security"
-5
View File
@@ -2869,11 +2869,6 @@ msgstr "Maurīcija"
msgid "Scan for new modules"
msgstr "Pārbaudīt vai ir pieejami jauni moduļi"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Moduļu Repozitorijs"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2879,11 +2879,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Zoek naar nieuwe modules"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Module-repository"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2836,11 +2836,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Zoeken naar nieuwe modules"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_security
msgid "Security"
-5
View File
@@ -2873,11 +2873,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Zoeken naar nieuwe modules"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Module opslagplaats"
#. module: base
#: model:ir.ui.menu,name:base.menu_security
msgid "Security"
-5
View File
@@ -2876,11 +2876,6 @@ msgstr "Mauritius"
msgid "Scan for new modules"
msgstr "Sprawdź, czy są nowe moduły"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repozytorium modułów"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2872,11 +2872,6 @@ msgstr "Maurícia"
msgid "Scan for new modules"
msgstr "Pesquizar novos módulos"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repositorio do módulo"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2864,11 +2864,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr "Procurando por novos módulos"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Repositório de módulos"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2812,11 +2812,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2878,11 +2878,6 @@ msgstr "Маврикий"
msgid "Scan for new modules"
msgstr "Поиск новых модулей"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Хранилище модулей"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2818,11 +2818,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2821,11 +2821,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr "Preveri za nove module"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Odlagališče modulov"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2807,11 +2807,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2867,11 +2867,6 @@ msgstr "Mauricijus"
msgid "Scan for new modules"
msgstr "Traži nove module"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Skladište modula"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2801,11 +2801,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2867,11 +2867,6 @@ msgstr "Mauritus"
msgid "Scan for new modules"
msgstr "Yeni modülleri tara"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Modül Deposu"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2853,11 +2853,6 @@ msgstr "Маврикій"
msgid "Scan for new modules"
msgstr "Пошук нових модулів"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Репозитарій модулів"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2753,11 +2753,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr "Пошук нових модулів"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "Репозитарій модулів"
#. module: base
#: model:ir.ui.menu,name:base.menu_security
msgid "Security"
-5
View File
@@ -2802,11 +2802,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
-5
View File
@@ -2814,11 +2814,6 @@ msgstr "毛里求斯"
msgid "Scan for new modules"
msgstr "查找新模块"
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr "模块库"
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
+9 -14
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-12-18 08:39+0000\n"
"PO-Revision-Date: 2010-02-15 05:47+0000\n"
"Last-Translator: Walter Cheuk <wwycheuk@gmail.com>\n"
"PO-Revision-Date: 2010-02-24 06:09+0000\n"
"Last-Translator: OpenERP Administrators <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: 2010-02-17 04:54+0000\n"
"X-Launchpad-Export-Date: 2010-02-25 04:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
@@ -40,7 +40,7 @@ msgstr ""
#: field:ir.ui.view,arch:0
#: field:ir.ui.view.custom,arch:0
msgid "View Architecture"
msgstr "视图结构"
msgstr "視圖結構"
#. module: base
#: code:addons/base/ir/ir_model.py:0
@@ -58,7 +58,7 @@ msgstr ""
#: field:workflow.activity,wkf_id:0
#: field:workflow.instance,wkf_id:0
msgid "Workflow"
msgstr "工作流"
msgstr "工作流程"
#. module: base
#: view:wizard.module.lang.export:0
@@ -2801,11 +2801,6 @@ msgstr ""
msgid "Scan for new modules"
msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_module_repository
msgid "Module Repository"
msgstr ""
#. module: base
#: view:ir.actions.act_window:0
#: model:ir.ui.menu,name:base.menu_security
@@ -7784,7 +7779,7 @@ msgstr ""
#. module: base
#: field:ir.actions.server,mobile:0
msgid "Mobile No"
msgstr ""
msgstr "手機號碼"
#. module: base
#: model:ir.actions.act_window,name:base.action_partner_by_category
@@ -7886,12 +7881,12 @@ msgstr ""
#: code:addons/base/res/partner/partner.py:0
#, python-format
msgid "Partners: "
msgstr ""
msgstr "合作伙伴 "
#. module: base
#: model:res.country,name:base.kp
msgid "North Korea"
msgstr ""
msgstr "北韓(North Korea)"
#. module: base
#: view:ir.report.custom:0
@@ -7921,7 +7916,7 @@ msgstr ""
#. module: base
#: field:ir.exports,name:0
msgid "Export Name"
msgstr ""
msgstr "匯出名稱"
#. module: base
#: help:res.partner.address,type:0
@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields,osv
import ir
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+27 -10
View File
@@ -18,7 +18,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
from operator import itemgetter
from osv import fields,osv
import ir, re
import netsvc
@@ -417,6 +418,7 @@ ir_model_access()
class ir_model_data(osv.osv):
_name = 'ir.model.data'
__logger = logging.getLogger('addons.base.'+_name)
_columns = {
'name': fields.char('XML Identifier', required=True, size=128),
'model': fields.char('Object', required=True, size=64),
@@ -599,22 +601,37 @@ class ir_model_data(osv.osv):
wf_service.trg_write(uid, model, id, cr)
cr.commit()
if not config.get('import_partial', False):
logger = netsvc.Logger()
if not config.get('import_partial'):
for (model, res_id) in self.unlink_mark.keys():
if self.pool.get(model):
logger.notifyChannel('init', netsvc.LOG_INFO, 'Deleting %s@%s' % (res_id, model))
self.__logger.info('Deleting %s@%s', res_id, model)
try:
self.pool.get(model).unlink(cr, uid, [res_id])
id = self.unlink_mark[(model, res_id)]
if id:
self.unlink(cr, uid, [id])
cr.execute('DELETE FROM ir_values WHERE value=%s', ('%s,%s' % (model, res_id),))
ids = self.search(cr, uid, [('res_id','=',res_id),
('model','=',model)])
self.__logger.debug('=> Deleting %s: %s',
self._name, ids)
if len(ids) > 1 and \
self.__logger.isEnabledFor(logging.WARNING):
self.__logger.warn(
'Got %d %s for (%s, %d): %s',
len(ids), self._name, model, res_id,
map(itemgetter('module','name'),
self.read(cr, uid, ids,
['name', 'module'])))
self.unlink(cr, uid, ids)
cr.execute(
'DELETE FROM ir_values WHERE value=%s',
('%s,%s'%(model, res_id),))
cr.commit()
except Exception, e:
except Exception:
cr.rollback()
logger.notifyChannel('init', netsvc.LOG_ERROR, e)
logger.notifyChannel('init', netsvc.LOG_ERROR, 'Could not delete id: %d of model %s\nThere should be some relation that points to this resource\nYou should manually fix this and restart --update=module' % (res_id, model))
self.__logger.exception(
'Could not delete id: %d of model %s\nThere '
'should be some relation that points to this '
'resource\nYou should manually fix this and '
'restart with --update=module', res_id, model)
return True
ir_model_data()
-68
View File
@@ -37,29 +37,6 @@ import netsvc
from tools.parse_version import parse_version
from tools.translate import _
class module_repository(osv.osv):
_name = "ir.module.repository"
_description = "Module Repository"
_columns = {
'name': fields.char('Name', size=128),
'url': fields.char('URL', size=256, required=True),
'sequence': fields.integer('Sequence', required=True),
'filter': fields.char('Filter', size=128, required=True,
help='Regexp to search module on the repository webpage:\n'
'- The first parenthesis must match the name of the module.\n'
'- The second parenthesis must match the whole version number.\n'
'- The last parenthesis must match the extension of the module.'),
'active': fields.boolean('Active'),
}
_defaults = {
'sequence': lambda *a: 5,
'filter': lambda *a: 'href="([a-zA-Z0-9_]+)-('+release.major_version+'.(\\d+)((\\.\\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\\d*)*)(-r(\\d+))?)(\.zip)"',
'active': lambda *a: 1,
}
_order = "sequence"
module_repository()
class module_category(osv.osv):
_name = "ir.module.category"
_description = "Module Category"
@@ -298,7 +275,6 @@ class module(osv.osv):
# update the list of available packages
def update_list(self, cr, uid, context={}):
robj = self.pool.get('ir.module.repository')
res = [0, 0] # [update, add]
# iterate through installed modules and mark them as being so
@@ -345,50 +321,6 @@ class module(osv.osv):
self._update_dependencies(cr, uid, id, terp.get('depends', []))
self._update_category(cr, uid, id, terp.get('category', 'Uncategorized'))
for repository in robj.browse(cr, uid, robj.search(cr, uid, [])):
try:
index_page = urllib.urlopen(repository.url).read()
except IOError, e:
if e.errno == 21:
raise orm.except_orm(_('Error'),
_("This url '%s' must provide an html file with links to zip modules") % (repository.url))
else:
raise
modules = re.findall(repository.filter, index_page, re.I+re.M)
mod_sort = {}
for m in modules:
name, version, extension = m[0], m[1], m[-1]
if not version or version == 'x': # 'x' version was a mistake
version = '0'
if name in mod_sort:
if parse_version(version) <= parse_version(mod_sort[name][0]):
continue
mod_sort[name] = [version, extension]
for name in mod_sort.keys():
version, extension = mod_sort[name]
url = repository.url+'/'+name+'-'+version+extension
ids = self.search(cr, uid, [('name','=',name)])
if not ids:
self.create(cr, uid, {
'name': name,
'published_version': version,
'url': url,
'state': 'uninstalled',
})
res[1] += 1
else:
id = ids[0]
installed_version = self.read(cr, uid, id, ['latest_version'])['latest_version']
if not installed_version or installed_version == 'x': # 'x' version was a mistake
installed_version = '0'
if parse_version(version) > parse_version(installed_version):
self.write(cr, uid, id, { 'url': url })
res[0] += 1
published_version = self.read(cr, uid, id, ['published_version'])['published_version']
if published_version == 'x' or not published_version:
published_version = '0'
if parse_version(version) > parse_version(published_version):
self.write(cr, uid, id, {'published_version': version})
return res
def download(self, cr, uid, ids, download=True, context=None):
+1 -8
View File
@@ -1,13 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="module_repository_openerp" model="ir.module.repository">
<field name="name">OpenERP</field>
<field name="url">http://www.openerp.com/download/modules/</field>
<field eval="False" name="active"/>
<field eval="'href=&quot;([a-zA-Z0-9_]+)-('+version+'.(\\d+)((\\.\\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\\d*)*)(-r(\\d+))?)(\.zip)&quot;'" name="filter"/>
</record>
<data>
<record id="ir_ui_view_sc_modules0" model="ir.ui.view_sc">
<field name="name">Modules</field>
<field name="resource">ir.ui.menu</field>
+7 -43
View File
@@ -38,7 +38,7 @@
<menuitem action="action_module_category_tree" id="menu_action_module_category_tree" parent="base.menu_management"/>
<!-- Click on a category -->
<record id="view_module_filter" model="ir.ui.view">
<field name="name">ir.module.module.list.select</field>
<field name="model">ir.module.module</field>
@@ -51,14 +51,14 @@
<filter icon="terp-sale" string="To be upgraded" domain="[('state','in', ['to upgrade', 'to remove', 'to install'])]"/>
<separator orientation="vertical"/>
<field name="name" select="1"/>
<field name="state" readonly="1" select="1"/>
<field name="state" readonly="1" select="1"/>
</group>
</search>
</field>
</record>
<record id="action_module_open_categ" model="ir.actions.act_window">
<field name="name">Modules</field>
@@ -66,7 +66,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('category_id','=',active_id)]</field>
</record>
<record id="ir_action_module_category" model="ir.values">
<field eval="'tree_but_open'" name="key2"/>
@@ -154,43 +154,7 @@
<field name="domain"/>
<field name="search_view_id" ref="view_module_filter"/>
</record>
<menuitem action="open_module_tree" id="menu_module_tree" parent="base.menu_management"/>
<record id="repository_form" model="ir.ui.view">
<field name="name">ir.module.repository.form</field>
<field name="model">ir.module.repository</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Repository">
<field name="name" select="1"/>
<field name="sequence"/>
<field name="url" select="1" widget="url"/>
<field name="active" select="1"/>
<field colspan="4" name="filter"/>
</form>
</field>
</record>
<record id="repository_tree" model="ir.ui.view">
<field name="name">ir.module.repository.tree</field>
<field name="model">ir.module.repository</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Repository list">
<field name="sequence"/>
<field name="active"/>
<field name="name"/>
<field name="url"/>
</tree>
</field>
</record>
<record id="open_repository_tree" model="ir.actions.act_window">
<field name="name">Repository list</field>
<field name="res_model">ir.module.repository</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'active_test': False}</field>
</record>
<menuitem action="open_repository_tree" id="menu_module_repository_tree" parent="base.menu_management"/>
<menuitem action="open_module_tree" id="menu_module_tree" parent="base.menu_management"/>
</data>
</openerp>
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
@@ -27,11 +27,11 @@ class wizard_update_module(wizard.interface):
arch = '''<?xml version="1.0"?>
<form string="Scan for new modules">
<label string="This function will check for new modules in the 'addons' path and on module repositories:" colspan="4" align="0.0"/>
<field name="repositories" colspan="4" nolabel="1"/>
<label string="This function will check for new modules in the 'addons' path" colspan="4" align="0.0"/>
</form>'''
fields = {
'repositories': {'type': 'text', 'string': 'Repositories', 'readonly': True},
}
arch_module = '''<?xml version="1.0"?>
@@ -60,16 +60,11 @@ class wizard_update_module(wizard.interface):
'type': 'ir.actions.act_window'
}
def _get_repositories(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
repository_obj = pool.get('ir.module.repository')
ids = repository_obj.search(cr, uid, [])
res = repository_obj.read(cr, uid, ids, ['name', 'url'], context)
return {'repositories': '\n'.join(map(lambda x: x['name']+': '+x['url'], res))}
states = {
'init': {
'actions': [_get_repositories],
'actions': [],
'result': {'type': 'form', 'arch': arch, 'fields': fields,
'state': [
('end', 'Cancel', 'gtk-cancel'),
+42 -42
View File
@@ -94,30 +94,30 @@
<field eval="8" name="priority"/>
<field name="arch" type="xml">
<form string="Address">
<field name="partner_id" select="1" colspan="2"/>
<field name="company_id" groups="base.group_multi_company" widget="selection" colspan="2"/>
<newline/>
<group colspan="4" col="6">
<field name="name" select="2"/>
<field domain="[('domain', '=', 'contact')]" name="title"/>
<field name="function"/>
</group>
<field name="partner_id" colspan="2"/>
<field name="company_id" groups="base.group_multi_company" widget="selection" colspan="2"/>
<newline/>
<field name="name"/>
<field domain="[('domain', '=', 'contact')]" name="title"/>
<field name="function"/>
</group>
<group colspan="2" col="2">
<separator string="Postal Address" colspan="4" col="4"/>
<field name="street" select="2"/>
<separator string="Postal Address" colspan="4" col="4"/>
<field name="street"/>
<field name="street2"/>
<field name="zip" select="2"/>
<field name="city" select="2"/>
<field name="country_id" select="2" completion="1"/>
<field name="state_id" select="2"/>
<field name="zip"/>
<field name="city"/>
<field name="country_id"/>
<field name="state_id"/>
</group>
<group colspan="2" col="2">
<separator string="Communication" colspan="4" col="4"/>
<field name="type" select="2" />
<separator string="Communication" colspan="4" col="4"/>
<field name="type"/>
<field name="phone"/>
<field name="fax"/>
<field name="mobile" select="2"/>
<field name="email" select="2" widget="email"/>
<field name="mobile"/>
<field name="email" widget="email"/>
</group>
</form>
</field>
@@ -158,15 +158,15 @@
<field domain="[('domain', '=', 'contact')]" name="title"/>
<field name="street"/>
<field name="street2"/>
<field name="type" select="2"/>
<field name="type"/>
<field name="function"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
<newline/>
<field name="zip" select="2"/>
<field name="city" select="2"/>
<field name="zip"/>
<field name="city"/>
<newline/>
<field completion="1" name="country_id" select="1"/>
<field name="state_id" select="2"/>
<field name="state_id"/>
<newline/>
<field name="phone"/>
<field name="fax"/>
@@ -238,8 +238,8 @@
<field name="name"/>
<field name="title"/>
<field name="ref"/>
<field name="city" select="2"/>
<field name="country" select="2"/>
<field name="city"/>
<field name="country"/>
<field name="lang"/>
</tree>
</field>
@@ -256,11 +256,11 @@
<field name="name" select="1" colspan="6"/>
<field name="ref" select="1"/>
<field domain="[('domain', '=', 'partner')]" name="title"/>
<field name="lang" select="2"/>
<field name="lang"/>
</group>
<group colspan="1" col="2">
<field name="customer" select="1"/>
<field name="supplier" select="2"/>
<field name="supplier"/>
</group>
</group>
<notebook colspan="4">
@@ -268,27 +268,27 @@
<field colspan="4" mode="form,tree" name="address" nolabel="1" select="1" height="260">
<form string="Partner Contacts">
<group colspan="4" col="6">
<field name="name" select="2"/>
<field name="name"/>
<field domain="[('domain', '=', 'contact')]" name="title" size="0"/>
<field name="function"/>
</group>
<newline/>
<group colspan="2" col="4">
<separator string="Postal Address" colspan="4" col="4" />
<field name="street" select="2" colspan="4"/>
<field name="street" colspan="4"/>
<field name="street2" colspan="4"/>
<field name="zip" select="2"/>
<field name="city" select="2"/>
<field name="country_id" select="2" completion="1"/>
<field name="state_id" select="2"/>
<field name="zip"/>
<field name="city"/>
<field name="country_id" completion="1"/>
<field name="state_id"/>
</group>
<group colspan="2" col="2">
<separator string="Communication" colspan="2" col="2" />
<field name="type" select="2" string="Type" />
<field name="type" string="Type" />
<field name="phone"/>
<field name="mobile"/>
<field name="fax"/>
<field name="email" select="2" widget="email"/>
<field name="email" widget="email"/>
</group>
</form>
<tree string="Partner Contacts">
@@ -301,14 +301,14 @@
</tree>
</field>
<separator colspan="4" string="Categories"/>
<field colspan="4" name="category_id" nolabel="1" select="2" height="90"/>
<field colspan="4" name="category_id" nolabel="1" height="90"/>
</page>
<page string="Sales &amp; Purchases">
<separator string="General Information" colspan="4"/>
<field name="user_id" select="2"/>
<field name="active" select="2"/>
<field name="user_id"/>
<field name="active"/>
<field name="website" widget="url"/>
<field name="date" select="2"/>
<field name="date"/>
<field name="parent_id"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
<newline/>
@@ -457,7 +457,7 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Bank account">
<field name="state" select="2"/>
<field name="state"/>
<field name="partner_id" select="1"/>
<newline/>
<field name="acc_number" select="1"/>
@@ -467,12 +467,12 @@
<field name="sequence"/>
<field colspan="4" name="name"/>
<separator colspan="4" string="Bank Account Owner"/>
<field colspan="4" name="owner_name" select="2"/>
<field colspan="4" name="owner_name"/>
<field colspan="4" name="street"/>
<field name="city"/>
<field name="zip"/>
<field completion="1" name="country_id" select="2"/>
<field name="state_id" select="2"/>
<field completion="1" name="country_id"/>
<field name="state_id"/>
</form>
</field>
</record>
@@ -539,7 +539,7 @@
<field name="active" select="1"/>
<field name="parent_id"/>
<separator colspan="4" string="Partners"/>
<field colspan="4" name="partner_ids" nolabel="1" select="2"/>
<field colspan="4" name="partner_ids" nolabel="1"/>
</form>
</field>
</record>
+1 -1
View File
@@ -188,7 +188,7 @@ class users(osv.osv):
'rules_id': fields.many2many('ir.rule.group', 'user_rule_group_rel', 'user_id', 'rule_group_id', 'Rules'),
'company_id': fields.many2one('res.company', 'Company', required=True,
help="The company this user is currently working for."),
'company_ids':fields.many2many('res.company','res_company_users_rel','user_id','cid','Accepted Companies'),
'company_ids':fields.many2many('res.company','res_company_users_rel','user_id','cid','Companies'),
'context_lang': fields.selection(_lang_get, 'Language', required=True,
help="Sets the language for the user's user interface, when UI "
"translations are available"),
+2 -6
View File
@@ -17,8 +17,8 @@
<field name="name">Employee</field>
</record>
<record model="res.groups" id="group_multi_company">
<field name="name">Useability / Multi Company</field>
<record model="res.groups" context="{'noadmin':True}" id="group_multi_company">
<field name="name">Multi Companies</field>
</record>
<record model="res.groups" context="{'noadmin':True}" id="group_extended">
@@ -29,10 +29,6 @@
<field name="name">Useability / No One</field>
</record>
<record model="res.groups" id="group_multi_company">
<field name="name">Multi Companies</field>
</record>
<!--
Users
-->
+14 -15
View File
@@ -18,9 +18,8 @@
"access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category","group_system",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_dependency_group_system","ir_module_module_dependency group_system","model_ir_module_module_dependency","group_system",1,1,1,1
"access_ir_module_repository_group_system","ir_module_repository group_system","model_ir_module_repository","group_system",1,1,1,1
"access_ir_property_group_user","ir_property group_user","model_ir_property",,1,0,0,0
"access_ir_property_group_user_manager","ir_property group_manager","model_ir_property",base.group_partner_manager,1,1,1,1
"access_ir_property_group_user_manager","ir_property group_manager","model_ir_property","base.group_partner_manager",1,1,1,1
"access_ir_report_custom_group_system","ir_report_custom group_system","model_ir_report_custom",,1,0,0,0
"access_ir_report_custom_fields_group_system","ir_report_custom_fields group_system","model_ir_report_custom_fields",,1,0,0,0
"access_ir_rule_group_user","ir_rule group_user","model_ir_rule",,1,0,0,0
@@ -37,7 +36,7 @@
"access_ir_ui_view_custom_group_user","ir_ui_view_custom_group_user","model_ir_ui_view_custom",,1,0,0,0
"access_ir_ui_view_custom_group_system","ir_ui_view_custom_group_system","model_ir_ui_view_custom","group_system",1,1,1,1
"access_ir_ui_view_sc_group_user","ir_ui_view_sc group_user","model_ir_ui_view_sc",,1,1,1,1
"access_ir_values_group_erp_manager","ir_values group_erp_manager","model_ir_values",group_erp_manager,1,1,1,1
"access_ir_values_group_erp_manager","ir_values group_erp_manager","model_ir_values","group_erp_manager",1,1,1,1
"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,0,0,0
"access_wizard_ir_model_menu_create_group_system","wizard_ir_model_menu_create group_system","model_wizard_ir_model_menu_create","group_system",1,1,1,1
"access_wizard_ir_model_menu_create_line_group_system","wizard_ir_model_menu_create_line group_system","model_wizard_ir_model_menu_create_line","group_system",1,1,1,1
@@ -59,29 +58,29 @@
"access_res_lang_group_all","res_lang group_all","model_res_lang",,1,0,0,0
"access_res_lang_group_user","res_lang group_user","model_res_lang","group_system",1,1,1,1
"access_res_partner_group_partner_manager","res_partner group_partner_manager","model_res_partner","group_partner_manager",1,1,1,1
"access_res_partner_group_user","res_partner group_user","model_res_partner",group_user,1,0,0,0
"access_res_partner_group_user","res_partner group_user","model_res_partner","group_user",1,0,0,0
"access_res_partner_address_group_partner_manager","res_partner_address group_partner_manager","model_res_partner_address","group_partner_manager",1,1,1,1
"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner_address",group_user,1,0,0,0
"access_res_partner_bank_group_user","res_partner_bank group_user","model_res_partner_bank",group_user,1,0,0,0
"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner_address","group_user",1,0,0,0
"access_res_partner_bank_group_user","res_partner_bank group_user","model_res_partner_bank","group_user",1,0,0,0
"access_res_partner_bank_group_partner_manager","res_partner_bank group_partner_manager","model_res_partner_bank","group_partner_manager",1,1,1,1
"access_res_partner_bank_type_group_partner_manager","res_partner_bank_type group_partner_manager","model_res_partner_bank_type","group_partner_manager",1,1,1,1
"access_res_partner_bank_type_group_user","res_partner_bank_type group_user","model_res_partner_bank_type",group_user,1,0,0,0
"access_res_partner_bank_type_group_user","res_partner_bank_type group_user","model_res_partner_bank_type","group_user",1,0,0,0
"access_res_partner_bank_type_field_group_partner_manager","res_partner_bank_type_field group_partner_manager","model_res_partner_bank_type_field","group_partner_manager",1,1,1,1
"access_res_partner_bank_type_field_group_user","res_partner_bank_type_field group_user","model_res_partner_bank_type_field",group_user,1,0,0,0
"access_res_partner_canal_group_user","res_partner_canal group_user","model_res_partner_canal",group_user,1,0,0,0
"access_res_partner_bank_type_field_group_user","res_partner_bank_type_field group_user","model_res_partner_bank_type_field","group_user",1,0,0,0
"access_res_partner_canal_group_user","res_partner_canal group_user","model_res_partner_canal","group_user",1,0,0,0
"access_res_partner_canal_group_partner_manager","res_partner_canal group_partner_manager","model_res_partner_canal","group_partner_manager",1,1,1,1
"access_res_partner_category_group_user","res_partner_category group_user","model_res_partner_category",group_user,1,0,0,0
"access_res_partner_category_group_user","res_partner_category group_user","model_res_partner_category","group_user",1,0,0,0
"access_res_partner_category_group_partner_manager","res_partner_category group_partner_manager","model_res_partner_category","group_partner_manager",1,1,1,1
"access_res_partner_event_group_user","res_partner_event group_user","model_res_partner_event",group_user,1,1,1,1
"access_res_partner_event_group_user","res_partner_event group_user","model_res_partner_event","group_user",1,1,1,1
"access_res_partner_event_group_partner_manager","res_partner_event group_partner_manager","model_res_partner_event","group_partner_manager",1,1,1,1
"access_res_partner_event_type_group_partner_manager","res_partner_event_type group_partner_manager","model_res_partner_event_type","group_partner_manager",1,1,1,1
"access_res_partner_event_type_group_user","res_partner_event_type group_user","model_res_partner_event_type",group_user,1,0,0,0
"access_res_partner_event_type_group_user","res_partner_event_type group_user","model_res_partner_event_type","group_user",1,0,0,0
"access_res_partner_function_group_user","res_partner_function group_user","model_res_partner_function","group_partner_manager",1,1,1,1
"access_res_partner_function_group_partner_manager","res_partner_function group_partner_manager","model_res_partner_function",group_user,1,0,0,0
"access_res_partner_function_group_partner_manager","res_partner_function group_partner_manager","model_res_partner_function","group_user",1,0,0,0
"access_res_partner_som_group_user","res_partner_som group_user","model_res_partner_som","group_partner_manager",1,1,1,1
"access_res_partner_som_group_partner_manager","res_partner_som group_partner_manager","model_res_partner_som",group_user,1,0,0,0
"access_res_partner_som_group_partner_manager","res_partner_som group_partner_manager","model_res_partner_som","group_user",1,0,0,0
"access_res_partner_title_group_user","res_partner_title group_user","model_res_partner_title","group_partner_manager",1,1,1,1
"access_res_partner_title_group_partner_manager","res_partner_title group_partner_manager","model_res_partner_title",group_user,1,0,0,0
"access_res_partner_title_group_partner_manager","res_partner_title group_partner_manager","model_res_partner_title","group_user",1,0,0,0
"access_res_request_group_user","res_request group_user","model_res_request",,1,1,1,1
"access_res_request_history_group_user","res_request_history group_user","model_res_request_history",,1,1,1,1
"access_res_request_link_group_system","res_request_link group_system","model_res_request_link","group_system",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
18 access_ir_module_category_group_user ir_module_category group_user model_ir_module_category group_system 1 0 0 0
19 access_ir_module_module_group_user ir_module_module group_user model_ir_module_module group_system 1 1 1 1
20 access_ir_module_module_dependency_group_system ir_module_module_dependency group_system model_ir_module_module_dependency group_system 1 1 1 1
access_ir_module_repository_group_system ir_module_repository group_system model_ir_module_repository group_system 1 1 1 1
21 access_ir_property_group_user ir_property group_user model_ir_property 1 0 0 0
22 access_ir_property_group_user_manager ir_property group_manager model_ir_property base.group_partner_manager 1 1 1 1
23 access_ir_report_custom_group_system ir_report_custom group_system model_ir_report_custom 1 0 0 0
24 access_ir_report_custom_fields_group_system ir_report_custom_fields group_system model_ir_report_custom_fields 1 0 0 0
25 access_ir_rule_group_user ir_rule group_user model_ir_rule 1 0 0 0
36 access_ir_ui_view_custom_group_user ir_ui_view_custom_group_user model_ir_ui_view_custom 1 0 0 0
37 access_ir_ui_view_custom_group_system ir_ui_view_custom_group_system model_ir_ui_view_custom group_system 1 1 1 1
38 access_ir_ui_view_sc_group_user ir_ui_view_sc group_user model_ir_ui_view_sc 1 1 1 1
39 access_ir_values_group_erp_manager ir_values group_erp_manager model_ir_values group_erp_manager 1 1 1 1
40 access_ir_values_group_all ir_values group_all model_ir_values 1 0 0 0
41 access_wizard_ir_model_menu_create_group_system wizard_ir_model_menu_create group_system model_wizard_ir_model_menu_create group_system 1 1 1 1
42 access_wizard_ir_model_menu_create_line_group_system wizard_ir_model_menu_create_line group_system model_wizard_ir_model_menu_create_line group_system 1 1 1 1
58 access_res_lang_group_all res_lang group_all model_res_lang 1 0 0 0
59 access_res_lang_group_user res_lang group_user model_res_lang group_system 1 1 1 1
60 access_res_partner_group_partner_manager res_partner group_partner_manager model_res_partner group_partner_manager 1 1 1 1
61 access_res_partner_group_user res_partner group_user model_res_partner group_user 1 0 0 0
62 access_res_partner_address_group_partner_manager res_partner_address group_partner_manager model_res_partner_address group_partner_manager 1 1 1 1
63 access_res_partner_address_group_user res_partner_address group_user model_res_partner_address group_user 1 0 0 0
64 access_res_partner_bank_group_user res_partner_bank group_user model_res_partner_bank group_user 1 0 0 0
65 access_res_partner_bank_group_partner_manager res_partner_bank group_partner_manager model_res_partner_bank group_partner_manager 1 1 1 1
66 access_res_partner_bank_type_group_partner_manager res_partner_bank_type group_partner_manager model_res_partner_bank_type group_partner_manager 1 1 1 1
67 access_res_partner_bank_type_group_user res_partner_bank_type group_user model_res_partner_bank_type group_user 1 0 0 0
68 access_res_partner_bank_type_field_group_partner_manager res_partner_bank_type_field group_partner_manager model_res_partner_bank_type_field group_partner_manager 1 1 1 1
69 access_res_partner_bank_type_field_group_user res_partner_bank_type_field group_user model_res_partner_bank_type_field group_user 1 0 0 0
70 access_res_partner_canal_group_user res_partner_canal group_user model_res_partner_canal group_user 1 0 0 0
71 access_res_partner_canal_group_partner_manager res_partner_canal group_partner_manager model_res_partner_canal group_partner_manager 1 1 1 1
72 access_res_partner_category_group_user res_partner_category group_user model_res_partner_category group_user 1 0 0 0
73 access_res_partner_category_group_partner_manager res_partner_category group_partner_manager model_res_partner_category group_partner_manager 1 1 1 1
74 access_res_partner_event_group_user res_partner_event group_user model_res_partner_event group_user 1 1 1 1
75 access_res_partner_event_group_partner_manager res_partner_event group_partner_manager model_res_partner_event group_partner_manager 1 1 1 1
76 access_res_partner_event_type_group_partner_manager res_partner_event_type group_partner_manager model_res_partner_event_type group_partner_manager 1 1 1 1
77 access_res_partner_event_type_group_user res_partner_event_type group_user model_res_partner_event_type group_user 1 0 0 0
78 access_res_partner_function_group_user res_partner_function group_user model_res_partner_function group_partner_manager 1 1 1 1
79 access_res_partner_function_group_partner_manager res_partner_function group_partner_manager model_res_partner_function group_user 1 0 0 0
80 access_res_partner_som_group_user res_partner_som group_user model_res_partner_som group_partner_manager 1 1 1 1
81 access_res_partner_som_group_partner_manager res_partner_som group_partner_manager model_res_partner_som group_user 1 0 0 0
82 access_res_partner_title_group_user res_partner_title group_user model_res_partner_title group_partner_manager 1 1 1 1
83 access_res_partner_title_group_partner_manager res_partner_title group_partner_manager model_res_partner_title group_user 1 0 0 0
84 access_res_request_group_user res_request group_user model_res_request 1 1 1 1
85 access_res_request_history_group_user res_request_history group_user model_res_request_history 1 1 1 1
86 access_res_request_link_group_system res_request_link group_system model_res_request_link group_system 1 1 1 1
+33 -42
View File
@@ -24,18 +24,14 @@
#
##############################################################################
import SimpleXMLRPCServer
import SocketServer
import logging
import logging.handlers
import os
import signal
import socket
import sys
import threading
import time
import xmlrpclib
import release
from pprint import pformat
import warnings
class Service(object):
""" Base class for *Local* services
@@ -77,6 +73,7 @@ class LocalService(object):
Any instance of this class will behave like the single instance
of Service(name)
"""
__logger = logging.getLogger('service')
def __init__(self, name):
self.__name = name
try:
@@ -84,8 +81,9 @@ class LocalService(object):
for method_name, method_definition in self._service._methods.items():
setattr(self, method_name, method_definition)
except KeyError, keyError:
Logger().notifyChannel('module', LOG_ERROR, 'This service does not exist: %s' % (str(keyError),) )
self.__logger.error('This service does not exist: %s' % (str(keyError),) )
raise
def __call__(self, method, *params):
return getattr(self, method)(*params)
@@ -129,15 +127,13 @@ class ExportService(object):
LOG_NOTSET = 'notset'
LOG_DEBUG_RPC = 'debug_rpc'
LOG_DEBUG = 'debug'
LOG_DEBUG2 = 'debug2'
LOG_INFO = 'info'
LOG_WARNING = 'warn'
LOG_ERROR = 'error'
LOG_CRITICAL = 'critical'
# add new log level below DEBUG
logging.DEBUG2 = logging.DEBUG - 1
logging.DEBUG_RPC = logging.DEBUG2 - 1
logging.DEBUG_RPC = logging.DEBUG - 2
logging.addLevelName(logging.DEBUG_RPC, 'DEBUG_RPC')
def init_logger():
import os
@@ -197,7 +193,6 @@ def init_logger():
mapping = {
'DEBUG_RPC': ('blue', 'white'),
'DEBUG2': ('green', 'white'),
'DEBUG': ('blue', 'default'),
'INFO': ('green', 'default'),
'WARNING': ('yellow', 'default'),
@@ -211,16 +206,20 @@ def init_logger():
class Logger(object):
def __init__(self):
warnings.warn("The netsvc.Logger API shouldn't be used anymore, please "
"use the standard `logging.getLogger` API instead",
PendingDeprecationWarning, stacklevel=2)
super(Logger, self).__init__()
def notifyChannel(self, name, level, msg):
warnings.warn("notifyChannel API shouldn't be used anymore, please use "
"the standard `logging` module instead",
PendingDeprecationWarning, stacklevel=2)
from service.web_services import common
log = logging.getLogger(tools.ustr(name))
if level == LOG_DEBUG2 and not hasattr(log, level):
fct = lambda msg, *args, **kwargs: log.log(logging.DEBUG2, msg, *args, **kwargs)
setattr(log, LOG_DEBUG2, fct)
if level == LOG_DEBUG_RPC and not hasattr(log, level):
fct = lambda msg, *args, **kwargs: log.log(logging.DEBUG_RPC, msg, *args, **kwargs)
setattr(log, LOG_DEBUG_RPC, fct)
@@ -232,7 +231,7 @@ class Logger(object):
try:
msg = tools.ustr(msg).strip()
if level in (LOG_ERROR,LOG_CRITICAL) and tools.config.get_misc('debug','env_info',False):
if level in (LOG_ERROR, LOG_CRITICAL) and tools.config.get_misc('debug','env_info',False):
msg = common().exp_get_server_environment() + "\n" + msg
result = msg.split('\n')
@@ -268,10 +267,12 @@ class Agent(object):
_timers = {}
_logger = Logger()
__logger = logging.getLogger('timer')
def setAlarm(self, fn, dt, db_name, *args, **kwargs):
wait = dt - time.time()
if wait > 0:
self._logger.notifyChannel('timers', LOG_DEBUG, "Job scheduled in %.3g seconds for %s.%s" % (wait, fn.im_class.__name__, fn.func_name))
self.__logger.debug("Job scheduled in %.3g seconds for %s.%s" % (wait, fn.im_class.__name__, fn.func_name))
timer = threading.Timer(wait, fn, args, kwargs)
timer.start()
self._timers.setdefault(db_name, []).append(timer)
@@ -298,25 +299,26 @@ import traceback
class Server:
""" Generic interface for all servers with an event loop etc.
Override this to impement http, net-rpc etc. servers.
Servers here must have threaded behaviour. start() must not block,
there is no run().
"""
__is_started = False
__servers = []
__logger = logging.getLogger('server')
def __init__(self):
if Server.__is_started:
raise Exception('All instances of servers must be inited before the startAll()')
Server.__servers.append(self)
def start(self):
print "called stub Server.start"
pass
self.__logger.debug("called stub Server.start")
def stop(self):
print "called stub Server.stop"
pass
self.__logger.debug("called stub Server.stop")
def stats(self):
""" This function should return statistics about the server """
@@ -326,35 +328,25 @@ class Server:
def startAll(cls):
if cls.__is_started:
return
Logger().notifyChannel("services", LOG_INFO,
"Starting %d services" % len(cls.__servers))
cls.__logger.info("Starting %d services" % len(cls.__servers))
for srv in cls.__servers:
srv.start()
cls.__is_started = True
@classmethod
def quitAll(cls):
if not cls.__is_started:
return
Logger().notifyChannel("services", LOG_INFO,
"Stopping %d services" % len(cls.__servers))
cls.__logger.info("Stopping %d services" % len(cls.__servers))
for srv in cls.__servers:
srv.stop()
cls.__is_started = False
@classmethod
def allStats(cls):
res = ''
if cls.__is_started:
res += "Servers started\n"
else:
res += "Servers stopped\n"
for srv in cls.__servers:
try:
res += srv.stats() + "\n"
except:
pass
return res
res = ["Servers %s" % ('stopped', 'started')[cls.__is_started]]
res.extend(srv.stats() for srv in cls.__servers)
return '\n'.join(res)
class OpenERPDispatcherException(Exception):
def __init__(self, exception, traceback):
@@ -363,7 +355,6 @@ class OpenERPDispatcherException(Exception):
class OpenERPDispatcher:
def log(self, title, msg):
from pprint import pformat
Logger().notifyChannel('%s' % title, LOG_DEBUG_RPC, pformat(msg))
def dispatch(self, service_name, method, params):
-11
View File
@@ -37,17 +37,6 @@ import sys
import os
import signal
import pwd
#----------------------------------------------------------
# ubuntu 8.04 has obsoleted `pyxml` package and installs here.
# the path needs to be updated before any `import xml`
# TODO: remove PyXML dependencies, use lxml instead.
#----------------------------------------------------------
_oldxml1 = '/usr/lib/python%s/site-packages/oldxml' % sys.version[:3]
_oldxml2 = '/usr/lib/python%s/dist-packages/oldxml' % sys.version[:3]
if os.path.exists(_oldxml1):
sys.path.insert(0,_oldxml1)
elif os.path.exists(_oldxml2):
sys.path.insert(0,_oldxml2)
import release
__author__ = release.author
-2
View File
@@ -778,7 +778,6 @@ class related(function):
res[data.id] = t_data.id
else:
res[data.id] = t_data
if self._type=='many2one':
ids = filter(None, res.values())
if ids:
@@ -790,7 +789,6 @@ class related(function):
for r in res:
if res[r]:
res[r] = [x.id for x in res[r]]
return res
def __init__(self, *arg, **args):
+40 -21
View File
@@ -41,6 +41,7 @@
import calendar
import copy
import datetime
import logging
import pickle
import random
import re
@@ -139,6 +140,8 @@ class browse_record(object):
self._id = id
self._table = table
self._table_name = self._table._name
self.__logger = logging.getLogger(
'osv.browse_record.' + self._table_name)
self._context = context
self._fields_process = fields_process
@@ -210,9 +213,8 @@ class browse_record(object):
if not datas:
# Where did those ids come from? Perhaps old entries in ir_model_dat?
self.logger.notifyChannel("browse_record", netsvc.LOG_WARNING,
"No datas found for ids %s in %s \n%s" % (
ids, self, ''.join(traceback.format_exc())))
self.__logger.warn("No datas found for ids %s in %s",
ids, self)
raise KeyError('Field %s not found in %s'%(name,self))
# create browse records for 'remote' objects
for data in datas:
@@ -247,7 +249,7 @@ class browse_record(object):
new_data[n] = self._list_class([browse_record(self._cr, self._uid, id, self._table.pool.get(f._obj), self._cache, context=self._context, list_class=self._list_class, fields_process=self._fields_process) for id in data[n]], self._context)
else:
new_data[n] = data[n]
self._data[data['id']].update(new_data)
self._data[data['id']].update(new_data)
if not name in self._data[self._id]:
#how did this happen?
self.logger.notifyChannel("browse_record", netsvc.LOG_ERROR,
@@ -1100,7 +1102,7 @@ class orm_template(object):
if column._domain and not isinstance(column._domain, (str, unicode)):
dom = column._domain
dom += eval(node.get('domain','[]'), {'uid':user, 'time':time})
context.update(eval(node.get('context','{}')))
context.update(eval(node.get('context','{}')))
attrs['selection'] = self.pool.get(relation).name_search(cr, user, '', dom, context=context)
if (node.get('required') and not int(node.get('required'))) or not column.required:
attrs['selection'].append((False,''))
@@ -1837,17 +1839,21 @@ class orm(orm_template):
if not fields:
fields = self._columns.keys()
(qu1, qu2, tables) = self._where_calc(cr, uid, domain, context=context)
(where_clause, where_params, tables) = self._where_calc(cr, uid, domain, context=context)
dom = self.pool.get('ir.rule').domain_get(cr, uid, self._name, context=context)
qu1 = qu1 + dom[0]
qu2 = qu2 + dom[1]
where_clause = where_clause + dom[0]
where_params = where_params + dom[1]
for t in dom[2]:
if t not in tables:
tables.append(t)
if len(qu1):
qu1 = ' where '+string.join(qu1, ' and ')
# Take care of adding join(s) if groupby is an '_inherits'ed field
tables, where_clause = self._inherits_join_calc(groupby,tables,where_clause)
if len(where_clause):
where_clause = ' where '+string.join(where_clause, ' and ')
else:
qu1 = ''
where_clause = ''
limit_str = limit and ' limit %d' % limit or ''
offset_str = offset and ' offset %d' % offset or ''
@@ -1855,7 +1861,7 @@ class orm(orm_template):
float_int_fields = filter(lambda x: fget[x]['type'] in ('float','integer'), fields)
sum = {}
group_by = groupby
group_by = groupby
if fget.get(groupby,False) and fget[groupby]['type'] in ('date','datetime'):
flist = "to_char(%s,'yyyy-mm') as %s "%(groupby,groupby)
groupby = "to_char(%s,'yyyy-mm')"%(groupby)
@@ -1872,7 +1878,8 @@ class orm(orm_template):
flist += ',avg('+f+') as '+f
else:
flist += ',sum('+f+') as '+f
cr.execute('select min(id) as id,'+flist+' from ' + self._table +qu1+' group by '+ groupby + limit_str + offset_str,qu2)
cr.execute('select min(%s.id) as id,' % self._table + flist + ' from ' + ','.join(tables) + where_clause + ' group by '+ groupby + limit_str + offset_str, where_params)
alldata = {}
groupby = group_by
for r in cr.dictfetchall():
@@ -1888,21 +1895,33 @@ class orm(orm_template):
dt = datetime.datetime.strptime(alldata[d['id']][groupby][:7],'%Y-%m')
days = calendar.monthrange(dt.year, dt.month)[1]
if d[groupby][:7] == today.strftime('%Y-%m'):
d[groupby] = 'This Month'
else:
d[groupby] = datetime.datetime.strptime(d[groupby][:10],'%Y-%m-%d').strftime('%B %Y')
d[groupby] = datetime.datetime.strptime(d[groupby][:10],'%Y-%m-%d').strftime('%B %Y')
d['__domain'] = [(groupby,'>=',alldata[d['id']][groupby] and datetime.datetime.strptime(alldata[d['id']][groupby][:7] + '-01','%Y-%m-%d').strftime('%Y-%m-%d') or False),\
(groupby,'<=',alldata[d['id']][groupby] and datetime.datetime.strptime(alldata[d['id']][groupby][:7] + '-' + str(days),'%Y-%m-%d').strftime('%Y-%m-%d') or False)] + domain
elif fget[groupby]['type'] == 'many2one':
d[groupby] = d[groupby] and d[groupby][1] or ''
d[groupby] = d[groupby] and ((type(d[groupby])==type(1)) and d[groupby] or d[groupby][1]) or ''
del alldata[d['id']][groupby]
d.update(alldata[d['id']])
del d['id']
return data
def _inherits_join_calc(self, field, tables, where_clause):
""" Adds missing table select and join clause(s) for reaching
the field coming from an '_inherits' parent table.
@param tables: list of table._table names enclosed in double quotes as returned
by _where_calc()
"""
current_table = self
while field in current_table._inherit_fields and not field in current_table._columns:
parent_table = self.pool.get(current_table._inherit_fields[field][0])
parent_table_name = parent_table._table
if '"%s"'%parent_table_name not in tables:
tables.append('"%s"'%parent_table_name)
where_clause.append('(%s.%s = %s.id)' % (current_table._table, current_table._inherits[parent_table._name], parent_table_name))
current_table = parent_table
return (tables, where_clause)
def _parent_store_compute(self, cr):
logger = netsvc.Logger()
logger.notifyChannel('orm', netsvc.LOG_INFO, 'Computing parent left and right for table %s...' % (self._table, ))
@@ -2032,12 +2051,12 @@ class orm(orm_template):
if isinstance(f, fields.one2many):
cr.execute("SELECT relname FROM pg_class WHERE relkind='r' AND relname=%s", (f._obj,))
if self.pool.get(f._obj):
if f._fields_id not in self.pool.get(f._obj)._columns.keys():
if not self.pool.get(f._obj)._inherits or (f._fields_id not in self.pool.get(f._obj)._inherit_fields.keys()):
raise except_orm('Programming Error', ("There is no reference field '%s' found for '%s'") % (f._fields_id,f._obj,))
if cr.fetchone():
cr.execute("SELECT count(1) as c FROM pg_class c,pg_attribute a WHERE c.relname=%s AND a.attname=%s AND c.oid=a.attrelid", (f._obj, f._fields_id))
res = cr.fetchone()[0]
+2 -2
View File
@@ -21,8 +21,8 @@
##############################################################################
name = 'openerp-server'
version = '5.0.7'
major_version = '5.0'
version = '5.2dev'
major_version = '5.2'
description = 'OpenERP Server'
long_desc = '''\
OpenERP is a complete ERP and CRM. The main features are accounting (analytic
+1 -1
View File
@@ -135,7 +135,7 @@ class _rml_styles(object,):
sys.stderr.write('Warning: style not found, %s - setting default!\n' % (node.get('style'),) )
if not style:
styles = reportlab.lib.styles.getSampleStyleSheet()
style = copy.deepcopy(styles['Normal'])
style = styles['Normal']
style.__dict__.update(self._para_style_update(node))
return style
+7 -10
View File
@@ -40,18 +40,16 @@ import re
import reportlab
from lxml import etree
import copy
import tools
import locale
import netsvc
import traceback, sys
_regex = re.compile('\[\[(.+?)\]\]')
def str2xml(s):
return s.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
return (s or '').replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
def xml2str(s):
return s.replace('&amp;','&').replace('&lt;','<').replace('&gt;','>')
return (s or '').replace('&amp;','&').replace('&lt;','<').replace('&gt;','>')
def _child_get(node, self=None, tagname=None):
for n in node:
@@ -106,25 +104,24 @@ def _process_text(self, txt):
sps = _regex.split(txt)
while sps:
# This is a simple text to translate
result += tools.ustr(self.localcontext.get('translate', lambda x:x)(sps.pop(0)))
result += unicode(self.localcontext.get('translate', lambda x:x)(sps.pop(0)))
if sps:
try:
expr = sps.pop(0)
txt = eval(expr,self.localcontext)
if txt and (isinstance(txt, unicode) or isinstance(txt, str)):
txt = tools.ustr(self.localcontext.get('translate', lambda x:x)(txt))
txt = unicode(self.localcontext.get('translate', lambda x:x)(txt))
except Exception,e:
tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
netsvc.Logger().notifyChannel('report', netsvc.LOG_ERROR,'report :\n%s\n%s\nexpr: %s' % (tb_s, str(e),expr.encode('utf-8')))
if type(txt)==type('') or type(txt)==type(u''):
txt2 = str2xml(txt)
result += tools.ustr(txt2)
result += unicode(txt2)
elif (txt is not None) and (txt is not False):
result += tools.ustr(txt)
result += unicode(txt)
return result
def text_get(node):
return ''.join([tools.ustr(n.text) for n in node])
return ''.join([unicode(n.text) for n in node])
units = [
(re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch),
+1 -4
View File
@@ -30,12 +30,9 @@ class ExceptionNoTb(Exception):
self.args = (msg, '')
def login(db, login, password):
print 'login'
pool = pooler.get_pool(db)
user_obj = pool.get('res.users')
res = user_obj.login(db, login, password)
print 'login end'
return res
return user_obj.login(db, login, password)
def check_super(passwd):
if passwd == tools.config['admin_passwd']:
+4 -2
View File
@@ -383,7 +383,8 @@ class common(_ObjectService):
auth.logout(params[1])
logger.notifyChannel("web-service", netsvc.LOG_INFO,'Logout %s from database %s'%(login,db))
return True
elif method in ['about', 'timezone_get', 'get_server_environment', 'login_message', 'get_stats' ]:
elif method in ['about', 'timezone_get', 'get_server_environment',
'login_message','get_stats', 'check_connectivity']:
pass
elif method in ['get_available_updates', 'get_migration_scripts', 'set_loglevel']:
passwd = params[0]
@@ -564,7 +565,8 @@ GNU Public Licence.
res = "OpenERP server: %d threads\n" % threading.active_count()
res += netsvc.Server.allStats()
return res
def check_connectivity(self):
def exp_check_connectivity(self):
return bool(sql_db.db_connect('template1'))
common()
+22 -26
View File
@@ -21,7 +21,7 @@
__all__ = ['db_connect', 'close_db']
import netsvc
import logging
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_SERIALIZABLE
from psycopg2.psycopg1 import cursor as psycopg1cursor
from psycopg2.pool import PoolError
@@ -60,15 +60,11 @@ import re
re_from = re.compile('.* from "?([a-zA-Z_0-9]+)"? .*$');
re_into = re.compile('.* into "?([a-zA-Z_0-9]+)"? .*$');
def log(msg, lvl=netsvc.LOG_DEBUG2):
logger = netsvc.Logger()
logger.notifyChannel('sql', lvl, msg)
sql_counter = 0
class Cursor(object):
IN_MAX = 1000
__logger = logging.getLogger('db.cursor')
def check(f):
@wraps(f)
@@ -102,15 +98,16 @@ class Cursor(object):
# pool, preventing some operation on the database like dropping it.
# This can also lead to a server overload.
msg = "Cursor not closed explicitly\n" \
"Cursor was created at %s:%s" % self.__caller
log(msg, netsvc.LOG_WARNING)
"Cursor was created at %s:%s"
self.__logger.warn(msg, *self.__caller)
self.close()
@check
def execute(self, query, params=None):
if '%d' in query or '%f' in query:
log(query, netsvc.LOG_WARNING)
log("SQL queries cannot contain %d or %f anymore. Use only %s", netsvc.LOG_WARNING)
self.__logger.warn(query)
self.__logger.warn("SQL queries cannot contain %d or %f anymore. "
"Use only %s")
if params:
query = query.replace('%d', '%s').replace('%f', '%s')
@@ -121,19 +118,17 @@ class Cursor(object):
params = params or None
res = self._obj.execute(query, params)
except psycopg2.ProgrammingError, pe:
logger= netsvc.Logger()
logger.notifyChannel('sql_db', netsvc.LOG_ERROR, "Programming error: %s, in query %s" % (pe, query))
self.__logger.error("Programming error: %s, in query %s" % (pe, query))
raise
except Exception, e:
log("bad query: %s" % self._obj.query)
log(e)
except Exception:
self.__logger.exception("bad query: %s", self._obj.query)
raise
if self.sql_log:
delay = mdt.now() - now
delay = delay.seconds * 1E6 + delay.microseconds
log("query: %s" % self._obj.query)
self.__logger.debug("query: %s", self._obj.query)
self.sql_log_count+=1
res_from = re_from.match(query.lower())
if res_from:
@@ -158,14 +153,16 @@ class Cursor(object):
if sqllogs[type]:
sqllogitems = sqllogs[type].items()
sqllogitems.sort(key=lambda k: k[1][1])
log("SQL LOG %s:" % (type,))
self.__logger.debug("SQL LOG %s:", type)
for r in sqllogitems:
delay = timedelta(microseconds=r[1][1])
log("table: %s: %s/%s" %(r[0], str(delay), r[1][0]))
self.__logger.debug("table: %s: %s/%s",
r[0], delay, r[1][0])
sum+= r[1][1]
sqllogs[type].clear()
sum = timedelta(microseconds=sum)
log("SUM %s:%s/%d [%d]" % (type, str(sum), self.sql_log_count, sql_counter))
self.__logger.debug("SUM %s:%s/%d [%d]",
type, sum, self.sql_log_count, sql_counter)
sqllogs[type].clear()
process('from')
process('into')
@@ -213,6 +210,8 @@ class Cursor(object):
class ConnectionPool(object):
__logger = logging.getLogger('db.connection_pool')
def locked(fun):
@wraps(fun)
def _locked(self, *args, **kwargs):
@@ -228,7 +227,6 @@ class ConnectionPool(object):
self._connections = []
self._maxconn = max(maxconn, 1)
self._lock = threading.Lock()
self._logger = netsvc.Logger()
def __repr__(self):
used = len([1 for c, u in self._connections[:] if u])
@@ -236,8 +234,8 @@ class ConnectionPool(object):
return "ConnectionPool(used=%d/count=%d/max=%d)" % (used, count, self._maxconn)
def _debug(self, msg):
self._logger.notifyChannel('ConnectionPool', netsvc.LOG_DEBUG, repr(self))
self._logger.notifyChannel('ConnectionPool', netsvc.LOG_DEBUG, msg)
self.__logger.debug(repr(self))
self.__logger.debug(msg)
@locked
def borrow(self, dsn):
@@ -293,17 +291,15 @@ class ConnectionPool(object):
class Connection(object):
def _debug(self, msg):
self._logger.notifyChannel('Connection', netsvc.LOG_DEBUG, msg)
__logger = logging.getLogger('db.connection')
def __init__(self, pool, dbname):
self.dbname = dbname
self._pool = pool
self._logger = netsvc.Logger()
def cursor(self, serialized=False):
cursor_type = serialized and 'serialized ' or ''
self._debug('create %scursor to "%s"' % (cursor_type, self.dbname,))
self.__logger.debug('create %scursor to "%s"' % (cursor_type, self.dbname,))
return Cursor(self._pool, self.dbname, serialized=serialized)
def serialized_cursor(self):
+2 -19
View File
@@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import cStringIO
import csv
import logging
@@ -62,7 +63,6 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
f_search = node.get("search",'').encode('utf-8')
f_use = node.get("use",'id').encode('ascii')
f_name = node.get("name",'').encode('utf-8')
q = eval(f_search, idref)
ids = pool.get(f_model).search(cr, uid, q)
if f_use != 'id':
@@ -190,7 +190,6 @@ class assertion_report(object):
return res
class xml_import(object):
@staticmethod
def nodeattr2bool(node, attr, default=False):
if not node.get(attr):
@@ -838,7 +837,7 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init',
except:
logger = netsvc.Logger()
logger.notifyChannel("init", netsvc.LOG_ERROR, "Cannot import the line: %s" % line)
pool.get(model).import_data(cr, uid, fields, datas,mode, module,noupdate,filename=fname_partial)
pool.get(model).import_data(cr, uid, fields, datas,mode, module, noupdate, filename=fname_partial)
if config.get('import_partial'):
data = pickle.load(file(config.get('import_partial')))
data[fname_partial] = 0
@@ -866,19 +865,3 @@ def convert_xml_import(cr, module, xmlfile, idref=None, mode='init', noupdate=Fa
obj.parse(doc.getroot())
return True
def convert_xml_export(res):
uid=1
pool=pooler.get_pool(cr.dbname)
cr=pooler.db.cursor()
idref = {}
page = etree.Element ( 'terp' )
doc = etree.ElementTree ( page )
data = etree.SubElement ( page, 'data' )
text_node = etree.SubElement ( page, 'text' )
text_node.text = 'Some textual content.'
cr.commit()
cr.close()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+39 -34
View File
@@ -327,23 +327,23 @@ def html2plaintext(html, body_id=None, encoding='utf-8'):
## (c) Fry-IT, www.fry-it.com, 2007
## <peter@fry-it.com>
## download here: http://www.peterbe.com/plog/html2plaintext
""" from an HTML text, convert the HTML to plain text.
If @body_id is provided then this is the tag where the
If @body_id is provided then this is the tag where the
body (not necessarily <body>) starts.
"""
try:
from BeautifulSoup import BeautifulSoup, SoupStrainer, Comment
except:
return html
urls = []
if body_id is not None:
strainer = SoupStrainer(id=body_id)
else:
strainer = SoupStrainer('body')
soup = BeautifulSoup(html, parseOnlyThese=strainer, fromEncoding=encoding)
for link in soup.findAll('a'):
title = link.renderContents()
@@ -351,7 +351,7 @@ def html2plaintext(html, body_id=None, encoding='utf-8'):
urls.append(dict(url=url, tag=str(link), title=title))
html = soup.__str__()
url_index = []
i = 0
for d in urls:
@@ -368,11 +368,11 @@ def html2plaintext(html, body_id=None, encoding='utf-8'):
html = html.replace('<h2>','**').replace('</h2>','**')
html = html.replace('<h1>','**').replace('</h1>','**')
html = html.replace('<em>','/').replace('</em>','/')
# the only line breaks we respect is those of ending tags and
# the only line breaks we respect is those of ending tags and
# breaks
html = html.replace('\n',' ')
html = html.replace('<br>', '\n')
html = html.replace('<tr>', '\n')
@@ -381,7 +381,7 @@ def html2plaintext(html, body_id=None, encoding='utf-8'):
html = html.replace(' ' * 2, ' ')
# for all other tags we failed to clean up, just remove then and
# for all other tags we failed to clean up, just remove then and
# complain about them on the stderr
def desperate_fixer(g):
#print >>sys.stderr, "failed to clean up %s" % str(g.group())
@@ -501,8 +501,8 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
return True
except Exception,e:
netsvc.Logger().notifyChannel('email_send (maildir)', netsvc.LOG_ERROR, e)
return False
return False
try:
oldstderr = smtplib.stderr
s = smtplib.SMTP()
@@ -511,7 +511,7 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
if debug:
smtplib.stderr = WriteToLogger()
s.set_debuglevel(int(bool(debug))) # 0 or 1
s.set_debuglevel(int(bool(debug))) # 0 or 1
s.connect(smtp_server, config['smtp_port'])
if ssl:
s.ehlo()
@@ -519,7 +519,7 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
s.ehlo()
if config['smtp_user'] or config['smtp_password']:
s.login(config['smtp_user'], config['smtp_password'])
s.login(config['smtp_user'], config['smtp_password'])
s.sendmail(email_from,
flatten([email_to, email_cc, email_bcc]),
msg.as_string()
@@ -754,10 +754,10 @@ class cache(object):
else:
kwargs2 = self._unify_args(*args, **kwargs)
keys_to_del = [key for key, _ in self._generate_keys(dbname, kwargs2) if key in self.cache.keys()]
for key in keys_to_del:
self.cache.pop(key)
@classmethod
def clean_caches_for_db(cls, dbname):
for c in cls.__caches:
@@ -883,29 +883,15 @@ if not hasattr(__builtin__, 'any'):
__builtin__.any = any
del any
get_iso = {'ca_ES':'ca',
'cs_CZ': 'cs',
'et_EE': 'et',
'sv_SE': 'sv',
'sq_AL': 'sq',
'uk_UA': 'uk',
'vi_VN': 'vi',
'af_ZA': 'af',
'be_BY': 'be',
'ja_JP': 'ja',
'ko_KR': 'ko'
}
def get_iso_codes(lang):
if lang in get_iso:
lang = get_iso[lang]
elif lang.find('_') != -1:
if lang.find('_') != -1:
if lang.split('_')[0] == lang.split('_')[1].lower():
lang = lang.split('_')[0]
return lang
def get_languages():
languages={
'ab_RU': u'Abkhazian (RU)',
'ar_AR': u'Arabic / الْعَرَبيّة',
'bg_BG': u'Bulgarian / български',
'bs_BS': u'Bosnian / bosanski jezik',
@@ -920,29 +906,48 @@ def get_languages():
'es_AR': u'Spanish (AR) / Español (AR)',
'es_ES': u'Spanish / Español',
'et_EE': u'Estonian / Eesti keel',
'fa_IR': u'Persian / Iran, Islamic Republic of',
'fi_FI': u'Finland / Suomi',
'fr_BE': u'French (BE) / Français (BE)',
'fr_CH': u'French (CH) / Français (CH)',
'fr_FR': u'French / Français',
'gl_ES': u'Galician / Spain',
'gu_IN': u'Gujarati / India',
'hi_IN': u'Hindi / India',
'hr_HR': u'Croatian / hrvatski jezik',
'hu_HU': u'Hungarian / Magyar',
'id_ID': u'Indonesian / Bahasa Indonesia',
'it_IT': u'Italian / Italiano',
'iu_CA': u'Inuktitut / Canada',
'ja_JP': u'Japanese / Japan',
'ko_KP': u'Korean / Korea, Democratic Peoples Republic of',
'ko_KR': u'Korean / Korea, Republic of',
'lt_LT': u'Lithuanian / Lietuvių kalba',
'lv_LV': u'Latvian / Latvia',
'ml_IN': u'Malayalam / India',
'mn_MN': u'Mongolian / Mongolia',
'nb_NO': u'Norwegian Bokmål / Norway',
'nl_NL': u'Dutch / Nederlands',
'nl_BE': u'Dutch (Belgium) / Nederlands (Belgïe)',
'oc_FR': u'Occitan (post 1500) / France',
'pl_PL': u'Polish / Język polski',
'pt_BR': u'Portugese (BR) / português (BR)',
'pt_PT': u'Portugese / português',
'ro_RO': u'Romanian / limba română',
'ru_RU': u'Russian / русский язык',
'si_LK': u'Sinhalese / Sri Lanka',
'sk_SK': u'Slovak / Slovakia',
'sl_SL': u'Slovenian / slovenščina',
'sq_AL': u'Albanian / Shqipëri',
'sr_RS': u'Serbian / Serbia',
'sv_SE': u'Swedish / svenska',
'te_IN': u'Telugu / India',
'tr_TR': u'Turkish / Türkçe',
'vi_VN': u'Vietnam / Cộng hòa xã hội chủ nghĩa Việt Nam',
'uk_UA': u'Ukrainian / украї́нська мо́ва',
'ur_PK': u'Urdu / Pakistan',
'zh_CN': u'Chinese (CN) / 简体中文',
'zh_HK': u'Chinese (HK)',
'zh_TW': u'Chinese (TW) / 正體字',
'th_TH': u'Thai / ภาษาไทย',
'tlh_TLH': u'Klingon',
@@ -1181,9 +1186,9 @@ def detect_ip_addr():
# RATIONALE BEHIND TIMESTAMP CALCULATIONS AND TIMEZONE MANAGEMENT:
# The server side never does any timestamp calculation, always
# sends them in a naive (timezone agnostic) format supposed to be
# expressed within the server timezone, and expects the clients to
# expressed within the server timezone, and expects the clients to
# provide timestamps in the server timezone as well.
# It stores all timestamps in the database in naive format as well,
# It stores all timestamps in the database in naive format as well,
# which also expresses the time in the server timezone.
# For this reason the server makes its timezone name available via the
# common/timezone_get() rpc method, which clients need to read
+2 -6
View File
@@ -8,11 +8,9 @@ Required dependencies:
You need the following software installed:
* Python 2.4 or 2.5
* Python 2.5 or 2.6
* Postgresql 8.2 or above
* Psycopg2 python module
* libxml2 and python bindings
* libxslt and python bindings
* Reportlab pdf generation library for python
* lxml python module
* pytz python module
@@ -29,7 +27,7 @@ for generating reports using non .jpg images, you need:
For Debian-based distributions, the required packages can be installed with the
following command:
#> apt-get install -y postgresql graphviz python-psycopg2 python-xml python-lxml python-libxml2 python-libxslt1 python-tz python-imaging
#> apt-get install -y postgresql graphviz python-psycopg2 python-lxml python-tz python-imaging
For Fedora
if they are not installed, install:
@@ -37,8 +35,6 @@ python and postgresql
uses yum or you can recover required packages on fedora web site in "core" or "extra" repository :
postgresql-python
libxml2-python
libxslt-python
python-lxml
python-imaging
python-psycopg2
+4 -4
View File
@@ -171,10 +171,10 @@ options = {
"optimize": 2,
"dist_dir": 'dist',
"packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
"lxml.objectify", "decimal", "xml", "xml.dom", "xml.xpath",
"encodings","dateutil","wizard","pychart","PIL",
"pyparsing", "pydot","asyncore","asynchat", "reportlab",
"vobject", "HTMLParser", "select"],
"lxml.objectify", "decimal", "xml", "encodings",
"dateutil", "wizard", "pychart", "PIL", "pyparsing",
"pydot", "asyncore","asynchat", "reportlab", "vobject",
"HTMLParser", "select"],
"excludes" : ["Tkconstants","Tkinter","tcl"],
}
}