diff --git a/product/ERP5/Tool/TemplateTool.py b/product/ERP5/Tool/TemplateTool.py index d6fd92b5b6596758b796ae3f3e756f4d42d4ee00..7c2ebe1ffeecccfb4d5580a36ccb7ff15fd66744 100644 --- a/product/ERP5/Tool/TemplateTool.py +++ b/product/ERP5/Tool/TemplateTool.py @@ -1430,20 +1430,6 @@ class TemplateTool (BaseTool): LOG('upgradeSite', 0, message) dependency_list = [x[1] for x in \ self.resolveBusinessTemplateListDependency(bt5_list)] - update_bt5_list = self.getRepositoryBusinessTemplateList( - template_list=dependency_list) - update_bt5_list.sort(key=lambda x: dependency_list.index(x.title)) - for bt5 in update_bt5_list: - reinstall = bt5.title in deprecated_reinstall_set or bt5.force_install - if (not(reinstall) and bt5.version_state == 'present') or \ - bt5.title in keep_bt5_id_set: - continue - append("Update %s business template in state %s%s" % \ - (bt5.title, bt5.version_state, (reinstall and ' (reinstall)') or '')) - if not(dry_run): - bt5_url = "%s/%s" % (bt5.repository, bt5.title) - self.updateBusinessTemplateFromUrl(bt5_url, reinstall=reinstall, - update_catalog=update_catalog) if delete_orphaned: if keep_bt5_id_set is None: keep_bt5_id_set = set() @@ -1461,6 +1447,20 @@ class TemplateTool (BaseTool): if not(dry_run): # XXX Here is missing parameters to really remove stuff bt.uninstall() + update_bt5_list = self.getRepositoryBusinessTemplateList( + template_list=dependency_list) + update_bt5_list.sort(key=lambda x: dependency_list.index(x.title)) + for bt5 in update_bt5_list: + reinstall = bt5.title in deprecated_reinstall_set or bt5.force_install + if (not(reinstall) and bt5.version_state == 'present') or \ + bt5.title in keep_bt5_id_set: + continue + append("Update %s business template in state %s%s" % \ + (bt5.title, bt5.version_state, (reinstall and ' (reinstall)') or '')) + if not(dry_run): + bt5_url = "%s/%s" % (bt5.repository, bt5.title) + self.updateBusinessTemplateFromUrl(bt5_url, reinstall=reinstall, + update_catalog=update_catalog) return message_list diff --git a/product/ERP5/tests/testTemplateTool.py b/product/ERP5/tests/testTemplateTool.py index 3fefe32148708164aaed2000e980ad1cc639949b..9b41009f62cf46aa214e137227073c2b18e08c8c 100644 --- a/product/ERP5/tests/testTemplateTool.py +++ b/product/ERP5/tests/testTemplateTool.py @@ -32,6 +32,7 @@ import shutil import unittest import random import tempfile +from xml.dom.minidom import getDOMImplementation from App.config import getConfiguration from Products.ERP5VCS.WorkingCopy import getVcsTool @@ -273,7 +274,7 @@ class TestTemplateTool(ERP5TypeTestCase): self.assertEqual('Business Template', erp5_core.getPortalType()) def test_getInstalledBusinessTemplate_not_installed(self): - self.assertEquals(None, + self.assertEqual(None, self.portal.portal_templates.getInstalledBusinessTemplate('not_installed')) def test_getInstalledBusinessTemplate_provision(self): @@ -749,6 +750,90 @@ class TestTemplateTool(ERP5TypeTestCase): expected_position_dict[bt[1]], ordered_list.index(bt))) + def test_upgradeSite(self): + templates_tool = self.dummy_template_tool + repository = "dummy_repository" + + # setup dummy repository to make unit test independant from any real + # repository. This function creates the bt5list XML of the repository and + # the minimum BT files. + def createBtAndAddToRepository(repository, xml, **kw): + bt_dir = "%s/%s/bt" % (repository, kw['title']) + if not os.path.exists(bt_dir): + os.makedirs(bt_dir) + with open("%s/title" % bt_dir, "wb") as f: + f.write(kw['title']) + template = xml.createElement('template') + template.setAttribute('id', kw['title']) + defaults = { + 'copyright': "Copyright Test Template Tool", + 'license': "GPL", + 'title': kw['title'], # title is mandatory + 'version': "1.0", + 'revision': "1" + } + for el in ['copyright', 'version', 'revision', 'license', 'title']: + node = xml.createElement(el) + node.appendChild(xml.createTextNode(kw.get(el, defaults[el]))) + template.appendChild(node) + for dep in kw.get('dependency_list', []): + node = xml.createElement('dependency') + node.appendChild(xml.createTextNode(dep)) + template.appendChild(node) + xml.documentElement.appendChild(template) + + def copyTestCoreBt(bt_name): + bt_path = "%s/%s" % (repository, bt_name) + available_bt, = self.portal.portal_templates.getRepositoryBusinessTemplateList( + template_list=('test_core',) + ) + test_core_path = available_bt.repository + "/test_core" + if os.path.exists(bt_path): + shutil.rmtree(bt_path) + shutil.copytree(test_core_path, bt_path) + + # bt4 and bt5 are copies of test_core + copyTestCoreBt("bt4") + copyTestCoreBt("bt5") + # create bt1..5 BT inside dummy_repository + repo_xml = getDOMImplementation().createDocument(None, "repository", None) + createBtAndAddToRepository(repository, repo_xml, title='bt1', dependency_list=('bt4',)), + createBtAndAddToRepository(repository, repo_xml, title='bt2'), + createBtAndAddToRepository(repository, repo_xml, title='bt3'), + createBtAndAddToRepository(repository, repo_xml, title='bt4'), + createBtAndAddToRepository(repository, repo_xml, title='bt5'), + with open("%s/bt5list" % repository,"wb") as repo_xml_fd: + repo_xml.writexml(repo_xml_fd) + repo_xml_fd.close() + + # Install dummy_repository + templates_tool.repository_dict[repository] = None + templates_tool.updateRepositoryBusinessTemplateList([repository]) + + def getInstalledBtList(): + return sorted([bt.getTitle() for bt in templates_tool.getInstalledBusinessTemplateList()]) + + # Install manually 2 BT + templates_tool.updateBusinessTemplateFromUrl("%s/bt2" % repository) + self.assertEqual(getInstalledBtList(), ['bt2']) + templates_tool.updateBusinessTemplateFromUrl("%s/bt3" % repository) + self.assertEqual(getInstalledBtList(), ['bt2', 'bt3']) + + # First upgrade + templates_tool.upgradeSite(bt5_list=['bt1'], keep_bt5_id_set=['bt2'], delete_orphaned=True) + self.assertEqual(getInstalledBtList(), ['bt1', 'bt2', 'bt4']) + # test_file has been installed with bt4 + erp5_test = self.portal.portal_skins['erp5_test'] + self.assertTrue(erp5_test.hasObject('test_file')) + + # Second upgrade + templates_tool.upgradeSite(bt5_list=['bt5'], keep_bt5_id_set=['bt2'], delete_orphaned=True) + self.assertEqual(getInstalledBtList(), ['bt2', 'bt5']) + # test_file is now installed with bt5 + erp5_test = self.portal.portal_skins['erp5_test'] + self.assertTrue(erp5_test.hasObject('test_file')) + + def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestTemplateTool))