summaryrefslogtreecommitdiff
path: root/bin/addons/base/module
diff options
context:
space:
mode:
authorHarry (OpenERP) <hmo@tinyerp.com>2010-09-29 15:48:58 +0530
committerHarry (OpenERP) <hmo@tinyerp.com>2010-09-29 15:48:58 +0530
commit6019fbd0322c165d367a7bdd599d1d2be8df3a78 (patch)
treec9e97e00bf2d92e5c4f32904e383db73c68b7b94 /bin/addons/base/module
parent217d88f128d68c02ac1799b1f8c39a5cecf855d8 (diff)
parent54fb35b34b8c3e53d43ab9b7b69239aa8cdd78f1 (diff)
[MERGE]
bzr revid: hmo@tinyerp.com-20100929101858-clmlcw5v1frcyux7
Diffstat (limited to 'bin/addons/base/module')
-rw-r--r--bin/addons/base/module/__init__.py8
-rw-r--r--bin/addons/base/module/module.py147
-rw-r--r--bin/addons/base/module/module_view.xml8
-rw-r--r--bin/addons/base/module/module_web.py46
-rw-r--r--bin/addons/base/module/module_web_view.xml29
5 files changed, 75 insertions, 163 deletions
diff --git a/bin/addons/base/module/__init__.py b/bin/addons/base/module/__init__.py
index 93f0f0a3d1c..1b7abf2e76e 100644
--- a/bin/addons/base/module/__init__.py
+++ b/bin/addons/base/module/__init__.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,14 +15,10 @@
# 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/>.
#
##############################################################################
-import module_web
import module
import wizard
import report
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/bin/addons/base/module/module.py b/bin/addons/base/module/module.py
index f4086f9edc3..b446f39f5b5 100644
--- a/bin/addons/base/module/module.py
+++ b/bin/addons/base/module/module.py
@@ -19,27 +19,24 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-
-import tarfile
-import re
-import urllib
-import os
import imp
import logging
-import tools
-from osv import fields, osv, orm
-import zipfile
-import release
+import os
+import re
+import urllib
import zipimport
-import wizard
import addons
-import pooler
import netsvc
+import pooler
+import release
+import tools
from tools.parse_version import parse_version
from tools.translate import _
+from osv import fields, osv, orm
+
class module_category(osv.osv):
_name = "ir.module.category"
_description = "Module Category"
@@ -72,6 +69,7 @@ module_category()
class module(osv.osv):
_name = "ir.module.module"
_description = "Module"
+ __logger = logging.getLogger('base.' + _name)
def get_module_info(self, name):
info = {}
@@ -79,8 +77,9 @@ class module(osv.osv):
info = addons.load_information_from_description_file(name)
if 'version' in info:
info['version'] = release.major_version + '.' + info['version']
- except:
- pass
+ except Exception:
+ self.__logger.debug('Error when trying to fetch informations for '
+ 'module %s', name, exc_info=True)
return info
def _get_latest_version(self, cr, uid, ids, field_name=None, arg=None, context={}):
@@ -115,17 +114,21 @@ class module(osv.osv):
v = view_obj.browse(cr,uid,data_id.res_id)
aa = v.inherit_id and '* INHERIT ' or ''
res[mnames[data_id.module]]['views_by_module'] += aa + v.name + ' ('+v.type+')\n'
- except:
- pass
+ except Exception:
+ self.__logger.debug(
+ 'Unknown error while browsing ir.ui.view[%s]',
+ data_id.res_id, exc_info=True)
elif key=='ir.actions.report.xml':
res[mnames[data_id.module]]['reports_by_module'] += report_obj.browse(cr,uid,data_id.res_id).name + '\n'
elif key=='ir.ui.menu':
try:
m = menu_obj.browse(cr,uid,data_id.res_id)
res[mnames[data_id.module]]['menus_by_module'] += m.complete_name + '\n'
- except:
- pass
- except KeyError, e:
+ except Exception:
+ self.__logger.debug(
+ 'Unknown error while browsing ir.ui.menu[%s]',
+ data_id.res_id, exc_info=True)
+ except KeyError:
pass
return res
@@ -151,8 +154,6 @@ class module(osv.osv):
'url': fields.char('URL', size=128, readonly=True),
'dependencies_id': fields.one2many('ir.module.module.dependency',
'module_id', 'Dependencies', readonly=True),
- 'web_dependencies_id': fields.one2many('ir.module.web.dependency',
- 'module_id', 'Web Dependencies', readonly=True),
'state': fields.selection([
('uninstallable','Not Installable'),
('uninstalled','Not Installed'),
@@ -175,12 +176,14 @@ class module(osv.osv):
'reports_by_module': fields.function(_get_views, method=True, string='Reports', type='text', multi="meta", store=True),
'views_by_module': fields.function(_get_views, method=True, string='Views', type='text', multi="meta", store=True),
'certificate' : fields.char('Quality Certificate', size=64, readonly=True),
+ 'web': fields.boolean('Has a web component', readonly=True),
}
_defaults = {
'state': lambda *a: 'uninstalled',
'demo': lambda *a: False,
'license': lambda *a: 'AGPL-3',
+ 'web': False,
}
_order = 'name'
@@ -245,12 +248,6 @@ class module(osv.osv):
od = self.browse(cr, uid, ids2)[0]
mdemo = od.demo or mdemo
- for web_mod in module.web_dependencies_id:
- if web_mod.state == 'unknown':
- raise orm.except_orm(_('Error'), _("You try to install the module '%s' that depends on the module:'%s'.\nBut this module is not available in your system.") % (module.name, dep.name,))
- ids2 = self.pool.get('ir.module.web').search(cr, uid, [('module','=',web_mod.name)])
- self.pool.get('ir.module.web').button_install(cr, uid, ids2)
-
terp = self.get_module_info(module.name)
try:
self._check_external_dependencies(terp)
@@ -340,6 +337,7 @@ class module(osv.osv):
'website': terp.get('website', ''),
'license': terp.get('license', 'GPL-2'),
'certificate': terp.get('certificate') or None,
+ 'web': terp.get('web') or False,
}
# update the list of available packages
@@ -373,7 +371,6 @@ class module(osv.osv):
id = self.create(cr, uid, dict(name=mod_name, state='uninstalled', **values))
res[1] += 1
self._update_dependencies(cr, uid, id, terp.get('depends', []))
- self._update_web_dependencies(cr, uid, id, terp.get('web_depends', []))
self._update_category(cr, uid, id, terp.get('category', 'Uncategorized'))
return res
@@ -398,7 +395,9 @@ class module(osv.osv):
fp = file(fname, 'wb')
fp.write(zipfile)
fp.close()
- except Exception, e:
+ except Exception:
+ self.__logger.exception('Error when trying to create module '
+ 'file %s', fname)
raise orm.except_orm(_('Error'), _('Can not create the module file:\n %s') % (fname,))
terp = self.get_module_info(mod.name)
self.write(cr, uid, mod.id, self.get_values_from_terp(terp))
@@ -417,18 +416,6 @@ class module(osv.osv):
for d in depends:
cr.execute('INSERT INTO ir_module_module_dependency (module_id, name) values (%s, %s)', (id, d))
- def _update_web_dependencies(self, cr, uid, id, depends=[]):
- web_module_pool = self.pool.get('ir.module.web')
- res = False
-
- for d in depends:
- ids = web_module_pool.search(cr, uid, [('module','=',d)])
- if len(ids) > 0:
- cr.execute("Select id from ir_module_web_dependency where module_id=%s and web_module_id=%s and name=%s", (id, ids[0], d))
- res = cr.fetchone()
- if not res:
- cr.execute('INSERT INTO ir_module_web_dependency (module_id, web_module_id, name) values (%s, %s, %s)', (id, ids[0], d))
-
def _update_category(self, cr, uid, id, category='Uncategorized'):
categs = category.split('/')
p_id = None
@@ -491,40 +478,54 @@ class module(osv.osv):
logger.critical('module %s: invalid quality certificate: %s', mod.name, mod.certificate)
raise osv.except_osv(_('Error'), _('Module %s: Invalid Quality Certificate') % (mod.name,))
-module()
-
-class web_module_dependency(osv.osv):
- _name = "ir.module.web.dependency"
- _description = "Web Module dependency"
-
- def _state(self, cr, uid, ids, name, args, context={}):
- result = {}
- mod_obj = self.pool.get('ir.module.web')
- for md in self.browse(cr, uid, ids):
- ids = mod_obj.search(cr, uid, [('module', '=', md.name)])
- if ids:
- result[md.id] = mod_obj.read(cr, uid, [ids[0]], ['state'])[0]['state']
+ def list_web(self, cr, uid, context=None):
+ """ list_web(cr, uid, context) -> [module_name]
+ Lists all the currently installed modules with a web component.
+
+ Returns a list of addon names.
+ """
+ return [
+ module['name']
+ for module in self.browse(cr, uid,
+ self.search(cr, uid,
+ [('web', '=', True),
+ ('state', 'in', ['installed','to upgrade','to remove'])],
+ context=context),
+ context=context)]
+ def _web_dependencies(self, cr, uid, module, context=None):
+ for dependency in module.dependencies_id:
+ (parent,) = self.browse(cr, uid, self.search(cr, uid,
+ [('name', '=', dependency.name)], context=context),
+ context=context)
+ if parent.web:
+ yield parent.name
else:
- result[md.id] = 'unknown'
- return result
-
-
- _columns = {
- 'name': fields.char('Name', size=128, select=True),
- 'module_id': fields.many2one('ir.module.module', 'Module', select=True, ondelete='cascade'),
- 'web_module_id': fields.many2one('ir.module.web', 'Web Module', select=True, ondelete='cascade'),
- 'state': fields.function(_state, method=True, type='selection', selection=[
- ('uninstallable','Uninstallable'),
- ('uninstalled','Not Installed'),
- ('installed','Installed'),
- ('to upgrade','To be upgraded'),
- ('to remove','To be removed'),
- ('to install','To be installed'),
- ('unknown', 'Unknown'),
- ], string='State', readonly=True, select=True),
- }
+ self._web_dependencies(
+ cr, uid, parent, context=context)
+ def get_web(self, cr, uid, names, context=None):
+ """ get_web(cr, uid, [module_name], context) -> [{name, depends, content}]
+
+ Returns the web content of all the named addons.
+
+ The toplevel directory of the zipped content is called 'web',
+ its final naming has to be managed by the client
+ """
+ modules = self.browse(cr, uid,
+ self.search(cr, uid, [('name', 'in', names)], context=context),
+ context=context)
+ if not modules: return []
+ self.__logger.info('Sending web content of modules %s '
+ 'to web client', names)
+ return [
+ {'name': module.name,
+ 'depends': list(self._web_dependencies(
+ cr, uid, module, context=context)),
+ 'content': addons.zip_directory(
+ addons.get_module_resource(module.name, 'web'))}
+ for module in modules
+ ]
-web_module_dependency()
+module()
class module_dependency(osv.osv):
_name = "ir.module.module.dependency"
@@ -555,5 +556,3 @@ class module_dependency(osv.osv):
], string='State', readonly=True, select=True),
}
module_dependency()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/bin/addons/base/module/module_view.xml b/bin/addons/base/module/module_view.xml
index bf5164d8276..7a303b9a9ae 100644
--- a/bin/addons/base/module/module_view.xml
+++ b/bin/addons/base/module/module_view.xml
@@ -129,14 +129,6 @@
</tree>
</field>
</page>
- <page string="Web Dependencies">
- <field colspan="4" name="web_dependencies_id" nolabel="1">
- <tree string="Dependencies">
- <field name="name"/>
- <field name="state"/>
- </tree>
- </field>
- </page>
<page string="Features" attrs="{'invisible':[('state','!=','installed')]}">
<separator string="Created Menus" colspan="4"/>
<field colspan="4" name="menus_by_module" nolabel="1"/>
diff --git a/bin/addons/base/module/module_web.py b/bin/addons/base/module/module_web.py
deleted file mode 100644
index 8f65dc3960d..00000000000
--- a/bin/addons/base/module/module_web.py
+++ /dev/null
@@ -1,46 +0,0 @@
-from osv import fields, osv, orm
-
-class module_web(osv.osv):
- _name = "ir.module.web"
- _description = "Web Module"
-
- _columns = {
- 'name': fields.char("Name", size=128, readonly=True, required=True),
- 'module': fields.char("Module", size=128, readonly=True, required=True),
- 'description': fields.text("Description", readonly=True, translate=True),
- 'author': fields.char("Author", size=128, readonly=True),
- 'website': fields.char("Website", size=256, readonly=True),
- 'state': fields.selection([
- ('uninstallable','Uninstallable'),
- ('uninstalled','Not Installed'),
- ('installed','Installed')
- ], string='State', readonly=True)
- }
-
- _defaults = {
- 'state': lambda *a: 'uninstalled',
- }
- _order = 'name'
-
- _sql_constraints = [
- ('name_uniq', 'unique (name)', 'The name of the module must be unique !'),
- ]
-
- def update_module_list(self, cr, uid, modules, context={}):
-
- for module in modules:
- mod_name = module['name']
- ids = self.search(cr, uid, [('name','=',mod_name)])
- if ids:
- self.write(cr, uid, ids, module)
- else:
- self.create(cr, uid, module)
-
- def button_install(self, cr, uid, ids, context={}):
- return self.write(cr, uid, ids, {'state': 'installed'}, context)
-
- def button_uninstall(self, cr, uid, ids, context={}):
- return self.write(cr, uid, ids, {'state': 'uninstalled'}, context)
-
-module_web()
-
diff --git a/bin/addons/base/module/module_web_view.xml b/bin/addons/base/module/module_web_view.xml
deleted file mode 100644
index 32e927b70e7..00000000000
--- a/bin/addons/base/module/module_web_view.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
-
- <record id="module_web_tree" model="ir.ui.view">
- <field name="name">ir.module.web.tree</field>
- <field name="model">ir.module.web</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <tree>
- <field name="name"/>
- <field name="module"/>
- <field name="description"/>
- <field name="author"/>
- <field name="state"/>
- <button name="button_install" string="Install" type="object" states="uninstalled" context="{'reload': 1}"/>
- <button name="button_uninstall" string="Uninstall" type="object" states="installed" context="{'reload': 1}"/>
- </tree>
- </field>
- </record>
-
- <record id="open_module_web_list" model="ir.actions.url">
- <field name="name">web_module_list</field>
- <field name="url">/openerp/modules</field>
- </record>
- <menuitem name="Web Modules" action="open_module_web_list" id="open_module_web_list_url" type="url" parent="base.menu_management"/>
-
- </data>
-</openerp>