diff options
| author | Harry (OpenERP) <hmo@tinyerp.com> | 2010-09-29 15:48:58 +0530 |
|---|---|---|
| committer | Harry (OpenERP) <hmo@tinyerp.com> | 2010-09-29 15:48:58 +0530 |
| commit | 6019fbd0322c165d367a7bdd599d1d2be8df3a78 (patch) | |
| tree | c9e97e00bf2d92e5c4f32904e383db73c68b7b94 /bin/addons/base/module | |
| parent | 217d88f128d68c02ac1799b1f8c39a5cecf855d8 (diff) | |
| parent | 54fb35b34b8c3e53d43ab9b7b69239aa8cdd78f1 (diff) | |
[MERGE]
bzr revid: hmo@tinyerp.com-20100929101858-clmlcw5v1frcyux7
Diffstat (limited to 'bin/addons/base/module')
| -rw-r--r-- | bin/addons/base/module/__init__.py | 8 | ||||
| -rw-r--r-- | bin/addons/base/module/module.py | 147 | ||||
| -rw-r--r-- | bin/addons/base/module/module_view.xml | 8 | ||||
| -rw-r--r-- | bin/addons/base/module/module_web.py | 46 | ||||
| -rw-r--r-- | bin/addons/base/module/module_web_view.xml | 29 |
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> |
