@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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,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="([a-zA-Z0-9_]+)-('+version+'.(\\d+)((\\.\\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\\d*)*)(-r(\\d+))?)(\.zip)"'" 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>
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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
|
||||
-->
|
||||
|
||||
@@ -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
|
||||
|
||||
|
+33
-42
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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('&', '&').replace('<', '<').replace('>', '>')
|
||||
return (s or '').replace('&', '&').replace('<', '<').replace('>', '>')
|
||||
|
||||
def xml2str(s):
|
||||
return s.replace('&','&').replace('<','<').replace('>','>')
|
||||
return (s or '').replace('&','&').replace('<','<').replace('>','>')
|
||||
|
||||
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),
|
||||
|
||||
@@ -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']:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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"],
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user