Upgrade to 5.2 failing with 'IATCTTool' has no attribute '__iro__'

  • You may have Archetypes and Products.Archetypes registered as installed products, thus you can uninstall it twice. I think I had the same issue with ATContentTypes and Products.ATContentTypes.

  • I had a case where I had to run Products.ATContentTypes:uninstall even after removing the tools. That helped:

      # remove obsolete AT tools
      tools = [
          'portal_languages',
          'portal_tinymce',
          'kupu_library_tool',
          'portal_factory',
          'portal_atct',
          'uid_catalog',
          'archetype_tool',
          'reference_catalog',
          'portal_metadata',
      ]
      for tool in tools:
          try:
              portal.manage_delObjects([tool])
              log.info('Deleted {}'.format(tool))
          except AttributeError:
              log.info('{} not found'.format(tool))
    
      # reapply uninstall to get rid of IATCTTool component
      try:
          loadMigrationProfile(
              setup,
              'profile-Products.ATContentTypes:uninstall',
          )
      except KeyError:
          pass
    

Also: plone.app.upgrade.utils.alias_module is your friend if there are interfaces or tools that are hard to remove. Check
https://github.com/plone/plone.app.upgrade/blob/master/plone/app/upgrade/init.py if you want to have you mind blown.

1 Like

And I already mentioned that wildcard.fixpersistentutilities does not help in this case.
Whether I go to /@@fix-persistent-utilities or /@@fix-interfaces-fpu, there is nothing that applies to removing IATCTTool, since it's not a real dotted interface name, and it can't find it.

Thanks, @pbauer. I think it's fixed now. I was able to remove the [archetypes] extra from the buildout, and the no attribute '__iro__' error did not come back.

I'm not sure what did the trick, but I think it was running profile-Products.ATContentTypes:uninstall twice, and then going back and re-deleting portal_languages and portal_tinymce again (they came back, like the phoenix, although none of the others did).

Sorry. I read only the emails not the discussion forum itself -- and, unfortunately, the email delivery is unreliable. This way, I missed your experience report about wildcard.fixpersistentutilities.

Initially, CMFCore tools (such as the ATCTTool) have been accessed via acquisition. With the advent of the "Zope toolkit", one thought it more modern to access them as (Zope toolkit) utilities.Therefore, modern "CMFCore tools" register as local utilities. You error message clearly indicates that your portal contains an IATCTTool utility and fix-persistent-utilities should find it. Almost surely, you use it in the wrong way; maybe, you use it outside the portal context (persistent utilities are only seen/effective below the "site" containing their registration (the Plone portal in case of Plone))?

@fulv Can you tell me where and how to run Products.ATContentTypes:uninstall in plone 5.1.5?

@hugozu: The easiest way is this: In the ZMI, go to portal_setup, click on Import tab, then under or you can select a profile by id : look for profile-Products.ATContentTypes:uninstall. Then click on the Import all steps button.

Thanks.
Is this default? Where and how can I add this to profile?

# remove obsolete AT tools
  tools = [
      'portal_languages',
      'portal_tinymce',
      'kupu_library_tool',
      'portal_factory',
      'portal_atct',
      'uid_catalog',
      'archetype_tool',
      'reference_catalog',
      'portal_metadata',
  ]
  for tool in tools:
      try:
          portal.manage_delObjects([tool])
          log.info('Deleted {}'.format(tool))
      except AttributeError:
          log.info('{} not found'.format(tool))

  # reapply uninstall to get rid of IATCTTool component
  try:
      loadMigrationProfile(
          setup,
          'profile-Products.ATContentTypes:uninstall',
      )
  except KeyError:
      pass

I don't know what you are asking. The ZMI approach I gave you yesterday is basically the manual equivalent of this code:

Sorry, I'd thought code modification.

I had the same problem as fulv, occurring on about half of my sites. I migrated all of my content types to Dexterity in 5.0 but these Archetypes utilities have long legs. pbauer's script seems to resolve the issue completely.

Hilariously, wildcard.fixpersistentutilities caused the same iro attribute when trying to view its browser resource. Not a comforting sign to see that.

I migrated from 4.3 to 5.1 and then to 5.2-python2. I had to delete several product objects that didn't have support for Plone 5.1 and 5.2 at the time (collective.cover, PloneFormGen, Plone True Gallery, Reset Password Tool), I also used wildcard.fixpersistentutilities and @atct_migrator. I had to add wiked and Plone [archetypes] in buildout.cfg in version 5.2-python2. I had to uninstall Products.Archetypes and plone.app.collections for each site using portal_quickinstaler, in addition to deleting the folders portal_atct, portal_factory, portal_languages, and portal_tinymce.

So far everything has worked on Plone 5.2-python2, but I haven't been able to migrate to version 5.2-python3. I was able to run zodbupdate after adding wicked, Plone [archetypes] and eea.aliases to [buildout] eggs, but when I start Plone 5.2-python3 there are several errors like "AttributeError: type object 'IATCTTool' has no attribute 'iro' ".

I returned to Plone 5.2-python2 and followed the procedure described by fulv, getting the following error messages:

  • pleonformgen - ERROR: Step pleonformgen has an invalid import handler
    toolset: Toolset imported.
  • languagetool - ERROR: Step languagetool has an invalid import handler
    toolset: Toolset imported.
  • collective.plonetruegallery.install - ERROR: Step collective.plonetruegallery.install has an invalid import handler
    collective.plonetruegallery.uninstall - ERROR: Step collective.plonetruegallery.uninstall has an invalid import handler
  • collective.portlet.calendar-upgrades - ERROR: Step collective.portlet.calendar-upgrades has an invalid import handler
  • collective.z3cform.datetimewidget - ERROR: Step collective.z3cform.datetimewidget has an invalid import handler

When I run zodbupdate and start Plone 5.2-python 3 there are still errors (AttributeError: type object 'IATCTTool' has no attribute 'iro' ) and Plone does not work.

Can someone help me?

How do I execute the script reported by @pbauer (Aug '19)? Do I save it to a clean_plone.py file and run "bin/instance run /plone/instance/clean_plone.py"?

This did not work for me. I got the following error messages:

Traceback (most recent call last):
    File "/plone/instance/parts/instance/bin/interpreter", line 287, in <module>
        exec(_val)
    File "<string>", line 1, in <module>
    File "/plone/instance/clean_plone.py", line 15, in <module>
        portal.manage_delObjects([tool])
NameError: name 'portal' is not defined

All the code in https://github.com/collective/collective.migrationhelpers is meant to be used in your own upgrade-steps. If you don't know what that means I suggest you read https://training.plone.org/5/mastering-plone/dexterity_2.html#upgrade-steps and https://docs.plone.org/develop/addons/components/genericsetup.html#upgrade-steps.

Simple examples how they are used in real life for upgrade-steps that migrated https://www.plone.de from Plone 4.3 to 5.2 can be found in https://github.com/collective/plonesite.de/blob/master/src/plonede.policy/plonede/policy/upgrades.zcml and https://github.com/collective/plonesite.de/blob/master/src/plonede.policy/plonede/policy/upgrades.py.

More examples are mentioned in Small project migration with customized barceloneta.

Errors like this typically indicate that the definition of the reference interface is not available. I would not be surprised as ATCT refers to "ArcheType based Content Types" and as far as I know, there is not Python 3 compatible Archetypes version. Eliminate Archetypes (migrating to dexterity) before you switch to Python 3.

@@atct_migrator shows that there is no content to be migrated for all sites in Plone 5.2-python2.

I think atct_migrator only shows the default content types.

You could try /@@custom_migration and see if there is something there.

/@@custom_migration also shows that there is no content to migrate.

Thank you, @pbauer.

I'm trying to use https://github.com/collective/collective.migrationhelpers to clean up the sites. I ran a few things on Plone 5.2-python2 to try to clean up, but when I run zodbverify the following errors still appear:

2020-02-20 14:59:33,844 INFO    [zodbverify:64][MainThread]                                                                                                                                                                                                                    
Could not process unknown record '\x00\x00\x00\x00\x00\xa3sP':                                                                                                                                                                                                                 
2020-02-20 14:59:33,844 INFO    [zodbverify:65][MainThread] '\x80\x02cProducts.ResourceRegistries.tools.CSSRegistry\nStylesheet\nq\x01.\x80\x02}q\x02(U\x05_dataq\x03U\x08\x00\x00\x00\x00\x00\xa3sQq\x04cPersistence.mapping\nPersistentMapping\nq\x05\x86QU\nisExternalq\x06\x89u.'                                                                                                                                                                                                                                                                         
2020-02-20 14:59:33,844 INFO    [zodbverify:66][MainThread] Traceback (most recent call last):                                                                                                                                                                                 
File "/plone/buildout-cache/eggs/zodbverify-1.0.1-py2.7.egg/zodbverify/verify.py", line 58, in verify_record                                                                                                                                                                 
    class_info = unpickler.load()                                                                                                                                                                                                                                              
AttributeError: 'module' object has no attribute 'Stylesheet'                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                            
2020-02-20 14:59:35,259 INFO    [zodbverify:48][MainThread] Done! Scanned 2533605 records.                                                                                                                                                                                     
Found 1047 records that could not be loaded.                                                                                                                                                                                                                                   
Exceptions and how often they happened: 
ImportError: No module named controlpanel.markup: 5
ImportError: No module named blocks.interfaces: 5
ImportError: No module named Product: 2
ImportError: No module named tiles.modifiers: 5
AttributeError: 'module' object has no attribute 'Stylesheet': 307
AttributeError: 'module' object has no attribute 'JavaScript': 428
ImportError: No module named piwik.core.interfaces: 3
ImportError: No module named js.jqueryui.controlpanel: 288
ImportError: No module named cover.content: 4

Can I remove these 1047 records in Plone 5.2-python2? How can I do this?

Uninstalling Products.Archetypes and plone.app.collections for each site using portal_quickinstaler again, in addition to deleting the folders 'portal_languages', 'portal_tinymce', 'kupu_library_tool', 'kupu_library_tool', 'portal_factory', 'portal_atct', 'uid_cct', 'uid_cctatal' , 'archetype_tool', 'reference_catalog' and 'portal_metadata', the following errors remain:

2020-02-21 12:49:48,330 INFO    [zodbverify:64][MainThread] 
Could not process <class 'plone.registry.field.Bool'> record '\x00\x00\x00\x00\x00\x81\x07\xee':
2020-02-21 12:49:48,330 INFO    [zodbverify:65][MainThread] 'cplone.registry.field\nBool\nq\x01.}q\x02(U\x17_Element__tagged_valuesq\x03}q\x04U\x0bdescriptionq\x05X\x00\x00\x00\x00U\x05titleq\x06X\x05\x00\x00\x00Mouseq\x07U\x07defaultq\x08I00\nU\x08requiredq\tI00\nU\x08readonlyq\nI00\nU\tfieldNameq\x0bU\x08ui_mouseq\x0cU\x08__name__q\rU\x05valueq\x0eU\tinterfaceq\x0fccollective.js.jqueryui.controlpanel\nIJQueryUIPlugins\nq\x10U\x0edefaultFactoryq\x11NU\x07__doc__q\x12h\x07U\rinterfaceNameq\x13U4collective.js.jqueryui.controlpanel.IJQueryUIPluginsq\x14u.'
2020-02-21 12:49:48,330 INFO    [zodbverify:66][MainThread] Traceback (most recent call last):
File "/plone/buildout-cache/eggs/zodbverify-1.0.1-py2.7.egg/zodbverify/verify.py", line 60, in verify_record
    unpickler.load()
ImportError: No module named js.jqueryui.controlpanel

2020-02-21 12:50:55,574 INFO    [zodbverify:48][MainThread] Done! Scanned 2412342 records. 
Found 310 records that could not be loaded. 
Exceptions and how often they happened: 
ImportError: No module named controlpanel.markup: 5
ImportError: No module named blocks.interfaces: 5
ImportError: No module named js.jqueryui.controlpanel: 288
ImportError: No module named tiles.modifiers: 5
ImportError: No module named piwik.core.interfaces: 3
ImportError: No module named cover.content: 4

After several attempts, I migrated the content of 8 plone sites (38GB) from 5.2-python2 to 5.2-python3. I had already managed to migrate from 4.3 to 5.2-python2, but not to 5.2-python3. This may not be the smartest and recommended way, but it worked.

For each of the sites (MySiteA, MySiteB, MySiteC, ...), I followed the following procedures:

  1. I created a new MySiteA2 website in Plone 5.2-python2;
  2. I cut out the content of the MySiteA website; (http: //my.plone.server/mysitea/folder_contents) and pasted it on the MySiteA2 website (http://my.plone.server/mysitea2/folder_contents);
  3. I exported the plone site mysitea2 using the "Import / Export" option in the Zope management interface (http://my.plone.server/manage_main).

After generating the .zexp file for all sites I did the following:
4) I deleted the entire volume of data from Plone 5.2-python2 (I use docker), that is, I started a completely clean plone;
5) I copied the .zexp files from each of the sites to the import folder (/data/instance/import, for my container);
5) I imported each of the sites using the "Import/Export" option in the Zope management interface (http://my.plone.server/manage_main), using the standard options;

Finally, I deleted Data.fs.index and ran zodbupdate (zodbupdate --convert-py3 --file=var/filestorage/ Data.fs --encoding = utf8 --encoding-fallback latin1).

When I started Plone 5.2-python3 some errors occurred due to the sharing of some folders and pages. To solve this problem, I installed, uninstalled and reinstalled the pas.ldap.plugin add-on.

Another thing I needed to do was add the Portuguese language, in addition to Portuguese (Brazil) at http://srv-ldock-009.tre-rn.jus.br:8888/biometria/@@language-controlpanel.

The side effect that I've identified so far has been losing all sharing settings for folders, folders, etc.

I believe these steps have worked for cleaning up broken objects and configurations that have existed on my plone sites since Plone 4.3.

1 Like

Be careful using the zexp export/import. The imported objects will have new intids and this will break relations and possibly make it difficult to create new relations with them (for things like Related Items). See Maintaining zope intids on zexp imports. I don't even bother trying to use the zexp export/import anymore and think it should probably be dropped in modern Plone. It's almost always better to copy an entire database or serialize/deserialize in some other way.

1 Like