# This is a script which will perform portal_migrations on every plone
# site in a zope root. It must be set up as an external method located
# in the root of a zope site.

import transaction
from StringIO import StringIO

def upgrade_sites(self):
    out = StringIO()
    print >>out,"Running upgrade_sites version 1.0<br>\n"
    for (id,site) in self.objectItems():
        if hasattr(site,'portal_migration'):
            migration_tool = site.portal_migration
            atct_tool = site.portal_atct
            atct_tool.upgrade()
            migration_tool.upgrade()
            quickinstaller = site.portal_quickinstaller
            installable_products = []
            for product in quickinstaller.listInstalledProducts():
                if (product['hasError'] == 0 and 
                    product['isLocked'] == 0 and 
                    product['isHidden'] == 0 and 
                    product['installedVersion'] !=
                    quickinstaller.getProductVersion(product['id'])):
                    installable_products.append(product['id'])
            for p in installable_products:
                if quickinstaller.isProductInstalled(p):
                    try:
                        quickinstaller.reinstallProducts([p])
                    except AttributeError:
                        pass
                    print >>out, "Reinstall of %s succeeded<br>\n" % (p,)
                else:
                    try:
                        quickinstaller.installProduct(p)
                    except AttributeError:
                        pass
                    print >>out, "Installed %s (no re-install)" % (p,)
            print >>out, "Reinstalled all products for site %s<br>\n" % (id,)
            print >>out, "Upgraded %s<br>\n" % (id,)
            transaction.savepoint()
            print >>out, "<br>\n"
    transaction.commit()
    return out.getvalue()

