summaryrefslogtreecommitdiff
path: root/bin/addons/base/module/module.py.old
diff options
context:
space:
mode:
authorpinky <>2006-12-07 13:41:40 +0000
committerpinky <>2006-12-07 13:41:40 +0000
commit004a0b996ff8f269451e07346f71a129a1f3fbaf (patch)
tree48f43c1fc2ca4c1f4d5648e7e73553d3f4ccae06 /bin/addons/base/module/module.py.old
New trunk
bzr revid: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
Diffstat (limited to 'bin/addons/base/module/module.py.old')
-rw-r--r--bin/addons/base/module/module.py.old228
1 files changed, 228 insertions, 0 deletions
diff --git a/bin/addons/base/module/module.py.old b/bin/addons/base/module/module.py.old
new file mode 100644
index 00000000000..7f1512f7c03
--- /dev/null
+++ b/bin/addons/base/module/module.py.old
@@ -0,0 +1,228 @@
+##############################################################################
+#
+# Copyright (c) 2005 TINY SPRL. (http://tiny.be) All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+import tarfile
+import re
+import urllib2
+import os
+import shutil
+from sets import Set
+
+from osv import fields, osv
+import tools
+
+class module(osv.osv):
+ _name = "module.module"
+ _description = "Module"
+
+ def _costs_get(self, cr, uid, ids, prop=None, unknown_none=None, unknown_dict={}):
+ dossiers = self.browse(cr, uid, ids)
+ res = {}
+ for d in dossiers:
+ costs = [l.amount_costs for l in d.lot_id]
+ cost_amount = reduce(lambda x, y: x+y, costs, 0.0)
+ res[d.id] = cost_amount
+ return res
+
+ _columns = {
+ 'name': fields.char("Name", size=128, readonly=True),
+ 'shortdesc': fields.char('Short description', size=256, readonly=True),
+ 'description': fields.text("Description", readonly=True),
+ 'author': fields.char("Author", size=128, readonly=True),
+ 'website': fields.char("Website", size=256, readonly=True),
+# 'running_version': fields.function(_get_installed_version, method=True, string='Installed version'),
+# 'installed_version': fields.function(_get_installed_version, method=True, string='Installed version'),
+ 'latest_version': fields.many2one('module.module.version', 'Latest version'),
+ 'versions': fields.one2many('module.module.version', 'module', 'Versions', readonly=True),
+ 'state': fields.selection([('uninstalled', 'Uninstalled'), ('preinstall','To install'),('installed','Installed'),('running','Running')], 'State'),
+# 'active': fields.boolean('Active'),
+ }
+
+ # update the list of available packages
+ def update(self, cr, uid, ids, *args):
+ vobj = self.pool.get('module.module.version')
+
+ # update installed_version
+
+ # get the index page containing available packages from the server
+ index_page = urllib2.urlopen('http://www.tinyerp.org/download/modules_test').read()
+# print index_page
+ # parses it
+ modules = re.findall('.*<a href="([a-zA-Z0-9.\-]+)_([a-zA-Z0-9.\-]+)\.tar\.gz">.*', index_page)
+ # create module.module records and module.module.version as needed
+ for name, version in modules:
+ print "name", name, "version", version
+ # open module package on the remote server and extract its __terp__.py
+ url = 'http://www.tinyerp.org/download/modules_test/' + name + '_' + version + ".tar.gz"
+ tar = tarfile.open(mode="r|gz", fileobj=urllib2.urlopen(url))
+ info = {}
+ # we need to go through the whole tar file, because we use a stream and we
+ # are not allowed to search backward in the stream, so we can't extract one
+ # particular file directly
+ for tarinfo in tar:
+ if tarinfo.name.endswith('__terp__.py'):
+ info = eval(tar.extractfile(tarinfo).read())
+ break
+ tar.close()
+ print info
+ ids = self.search(cr, uid, [('name','=',name)])
+ print ids
+ if not ids:
+ id = self.create(cr, uid, {
+ 'name': name,
+ 'shortdesc': info.get('name', False),
+ 'description': info.get('description', False),
+ 'author': info.get('author', False),
+ 'website': info.get('website', False),
+ 'state': 'uninstalled',
+ })
+ print "module_id", id
+ else:
+ assert len(ids)==1, "There shouldn't be two modules with the same name"
+ id = ids[0]
+
+ version_ids = vobj.search(cr, uid, [('module','=',id),('name','=',version)])
+ print version_ids
+ if not version_ids:
+ version_id = vobj.create(cr, uid, {
+ 'name': version,
+ 'module': id,
+ 'state': 'uninstalled',
+ })
+ print "version_id", version_id
+ # update latest_version
+ #TODO: compute latest version
+ self.write(cr, uid, [id], {'latest_version': version_id})
+# else:
+# assert len(version_ids)==1, "There shouldn't be two versions with the same name"
+# version_id = version_ids[0]
+
+ return True
+
+ def install(self, cr, uid, ids, *args):
+ objs = self.browse(cr, uid, ids)
+ vobj = self.pool.get('module.module.version')
+
+ # get the id of latest version for each module
+ version_ids = Set([o.latest_version.id for o in objs])
+# for o in objs:
+# version_ids.add()
+# version_ids = reduce(lambda dic, o: dic.update({o.latest_version.id:True}), objs, {})
+ print "version_ids", version_ids
+
+ # add the list of dependencies
+ dependencies_ids = vobj.get_dependencies(cr, uid, list(version_ids))
+ print "depends", dependencies_ids
+ version_ids.update(dependencies_ids)
+# version_ids = reduce(lambda dic, dep: dic.update({dep:True}), dependencies_ids, version_ids)
+ print "version_ids2", version_ids
+
+ # remove existing version of modules
+ self.remove(cr, uid, ids)
+
+ # install all selected modules and their dependencies
+ vobj.install(cr, uid, list(version_ids))
+ return True
+
+
+ # remove existing version of modules if they exist
+ def remove(self, cr, uid, ids, *args):
+ objs = self.browse(cr, uid, ids)
+ adp = tools.config['addons_path']
+ addons = os.listdir(adp)
+ for o in objs:
+ if o.name in addons:
+ shutil.rmtree(os.path.join(adp, o.name))
+ return True
+module()
+
+class module_version(osv.osv):
+ _name = "module.module.version"
+ _description = "Module Version"
+ _columns = {
+ 'name': fields.char('Name', size=64),
+ 'module': fields.many2one('module.module', "Module"),
+ 'dependencies': fields.one2many('module.module.dependency', 'version', 'Dependencies'),
+ 'state': fields.selection([('uninstalled','Uninstalled'), ('preinstall','To install'), ('installed','Installed'), ('running','Running')], 'State'),
+ }
+
+ def install(self, cr, uid, ids, *args):
+ print "install versions", ids
+ objs = self.browse(cr, uid, ids)
+
+ for o in objs:
+ # download and unpack to destination folder
+ url = 'http://www.tinyerp.org/download/modules_test/' + o.module.name + '_' + o.name + ".tar.gz"
+ tar = tarfile.open(mode="r|gz", fileobj=urllib2.urlopen(url))
+ for tarinfo in tar:
+ tar.extract(tarinfo, tools.config['addons_path'])
+ return True
+
+ def get_dependencies(self, cr, uid, ids, *args):
+ dobj = self.pool.get('module.module.dependency')
+ print "get_depends", ids
+ # for each dependency, get dependencies
+ objs = self.browse(cr, uid, ids)
+ depends = []
+ for o in objs:
+ print "name", o.name
+ o_depends = dobj.resolve(cr, uid, [d.id for d in o.dependencies])
+ print "depends", o_depends
+ depends.extend(o_depends)
+
+# depends.extend([d.id for d in o.dependencies])
+ print "total depends", depends
+ # merge the list
+ # return the list of ids
+ return depends
+module_version()
+
+# a module dependency record represents one dependency of a particular version of a module
+# it can depend on a range of version of one module
+class module_dependency(osv.osv):
+ _name = "module.module.dependency"
+ _description = "Module dependency"
+ _columns = {
+ 'dependency_for': fields.many2one('module.module.version', 'Version'),
+ 'module': fields.many2one('module.module', 'Module'),
+ 'version_pattern': fields.char('Version pattern', size=128),
+ }
+
+ # returns the ids of module version records which match all dependencies
+ # [version_id, ...]
+ def resolve(self, cr, uid, ids):
+ vobj = self.pool.get('module.module.version')
+ objs = self.browse(cr, uid, ids)
+ res = {}
+ for o in objs:
+ pattern = o.version_pattern and eval(o.version_pattern) or []
+ print "pattern", pattern
+ res[o.id] = vobj.search(cr, uid, [('module','=',o.module.id)]+pattern)
+ #TODO: add smart dependencies resolver here
+ # it should compute the best version for each module
+ return [r[0] for r in res.itervalues()]
+module_dependency()