Planet Plone

This is where developers and integrators write about Plone, and is your best source for news and developments from the community.

April 13, 2014

JC Brand: New spelling and grammar checker for TinyMCE

2014-04-13T17:10:55Z

The spellchecker "After the deadline" is now available as an add-on for TinyMCE in Plone. It's multilingual, open-source, platform agnostic and even does grammar checking.

I've actually already added this add-on two months ago but didn't get around to mentioning it.  After the deadline is an open-source spelling and grammar checker that can be integrated with web based WYSIWYG editors, such as our beloved TinyMCE.

This new spelling checker provides some advantages over the existing (and still default) IESpell. Firstly, IESpell only works on Microsoft Windows. Secondly, IESpell is only free for non-commercial purposes. After the deadline however is open-source (GPL license, see here) and platform agnostic. Oh, and it's multilingual as well! To top it off... the killer feature, for us at least, is that it has a grammar checker. Pretty impressive IMHO.

The actual thing doing the spellchecking, is a Java server app, which you should download and install on your own server. There is a public default option for testing and demonstration purposes, but it comes with no guarantees.

After the deadline is included with all Products.TinyMCE releases since 1.2.1, but it's not the default spell checker. To enable it is at least straightforward.

Enabling AtD in TinyMCE for Plone:

  • Go to the Plone control panel and click on "TinyMCE Visual Editor"
  • Click on 'Toolbar' (middle left)
  • Make sure that 'spellchecker' is checked.
  • Click on 'Libraries' (top right)
  • Under Spellchecker plugin to use, choose After the deadline
  • Under AtD Service URL, choose your ATD server's URL. (The default is their - public service)
  • It's however recommended that you install your own AtD spellchecker service
  • See here for more details.
  • You should now have After the deadline enabled and have a spellcheck button in your TinyMCE editor.

If you'd like a demonstration of ATD, click here.

Oh, and if you find any spelling/grammar mistakes in this blogpost, it's because I'm still using Products.TinyMCE 1.1.6 ;)

Jazkarta Blog: Plone 5 and the 2014 Emerald Sprint

by Sally Kleinfeldt at 2014-04-13T03:06:26Z

2014 Emerald Sprint Attendees

Back row l to r: Alec Mitchell, Spanky Kapanka, Eric Steele, Ian Anderson, Ross Patterson, Luke Bannon, Cris Ewing, Andy Leeb, Cal Doval, Chris Calloway. Front row l to r: Elizabeth Leddy, David Glick, Steve McMahon, Fulvio Casali, Franco Pellegrini, Sally Kleinfeldt, Trish Ang. Photo by Trish Ang.

I recently returned from the Emerald Sprint, and I have to say that Plone 5 is starting to look pretty good. For developers, there is a solid core buildout that even I was able to run without a hitch. So if there’s a PLIP (Plone Improvement Proposal) or a feature that interests you, and you’ve been thinking about contributing – do it! The community awaits you with open arms.  And what a great community! You don’t need to be a Python developer – Plone 5 is a Javascript-friendly development environment. We would love to have more Javascript developers and designers join our ranks. You won’t be sorry.

OOTB Plone 5 with the new editing toolbar on the left.  Still a work in progress, you will be able to choose top or side placement, and icons, text, or both.

OOTB Plone 5 with the new editing toolbar on the left. Still a work in progress, you will be able to choose top or side placement, and icons, text, or both.

But UI improvements and new features are the real cause of excitement. The first thing Plonistas will notice is the new theme – people new to Plone won’t find it remarkable, just clean and modern, but we Plone folks have been looking forward to replacing Sunburst for a long time. In fact we’ve been looking forward to Plone 5 for a long time. After the community gained consensus about what Plone 5 will be, things got a bit bogged down. The Javascript rewrite was extensive. The new content type framework (Dexterity) had to gain maturity as a Plone 4 add-on. There was – and still is – much discussion over how to improve and streamline content editing and page layouts; ideas are being implemented as add-on products such as collective.cover.

Over the last few months the community has really picked up the pace on Plone 5.  Supported by the Plone Foundation and numerous sponsors, there have been a series of productive sprints. The Emerald Sprint’s focus was on user management, registration, and login.  A robust system of user permissions, groups, and roles is one of Plone’s most notable (and oldest) features and the concepts and underpinnings are still solid. However the UI is overdue for an overhaul and the old implementation layers have gotten pretty crufty.

Cris Ewing shows a mockup of the new registration process

Cris Ewing shows a mockup of the new registration process

The sprinters, led by David Glick, took a UI-first aproach which was fantastic. Before cracking open the laptops and diving into the code, we developed mockups of the new registration and login process and user management screens. It really helped that 2 of the 17 sprinters were UI/UX designers. Always try to get designers to come to your sprints!

The sprint gathered together a fantastic set of Plone gurus who were able to have in depth discussions of some of the thornier technical problems associated with users. For example, should user objects work like content objects? This discussion resulted in a concrete list of pros and cons and a better understanding of how to ameliorate potential problems if and when we decide to move to “contentish” users.

And of course software got developed. Teams worked on the Users and Groups control panel, member profile design and implementation, registration, log in, and forgotten password dialogs, and more. Read the summary report on plone.org for more details.

Plone 5 login design

Plone 5 log in design.


April 12, 2014

keul: "General Type": a new criterion for Plone Collections

by Luca Fabbri at 2014-04-12T17:59:17Z

A new
A new 1.2 version of plone.app.querystring has been released.
There are some improvement and bugfix but I'm particularly interested in one new feature: customizable parsed query. Why?

Some times ago I started developing a new product for providing some usability enhancement in type categorization using Collection but it was a dead end: it wont work without patching Plone. But the accepted pull request changed everything, so here it is: collective.typecriterion.

The product want to replace the Collection's "Types" search term (adding a new search term called "General type").

The scope of the add-on is to fix some usability issues with Collections:
  • Users don't always understand all of the content types installed in the site
  • User don't always get the difference from a type to another (classical examples: Page and File, or File and Image)
Plone type collection criteriaAlso there are some missing features:
  • There's not way to quickly define a new type alias or exclude types from the list
  • There's no way to group types under a general (but more user friendly) new type
Some of the point above could be reached searching types using interfaces (through object_provides index) instead of portal_type (the attribute that commonly store primitive type name of every content, but:
  • although search by interface is the suggested way to search by types, it's not used anywhere by Plone UI
  • using interfaces lead to inheritance behavior (which is great... until you really want it)
  • sometimes you don't have the right interface to use. For example, there's an ITextContent interface in ATContentTypes, but it's implemented only by Page and News, not by Event. And generating new interfaces is a developer task
The idea is to keep using portal_type but give administrators a way to group and organize them in a more friendly form.

After installation the new control panel entry "Type criterion settings" will be available.
Plone general type control panelThe target of the configuration panel is simple: is possible to group a set of types under the cloak of a new descriptive type name. In the example given in the image we take again definition of a "textual" content (a content that contains rich text data), grouping all the know types.

After the configuration you can start using the new search term.
Plone type collection criteria Usability apart there's also another advantage in this approach, that is the integration with 3rd party products.

Let say that you defined a new general type called "Multimedia" and you configure it as a set that contains Image and Video, and let say that Video went from the installation of redturtle.video product.
After a while you plan a switch from redturtle.video to wildcard.media. What you need to do is simply to change the configuration of the general type, not all the collections in the site.

Finally an interesting note: the code inside the collective.typecriterion is really small. All the magic (one time again) came from Plone.

April 11, 2014

Starzel.de: Mastering Plone

2014-04-11T14:50:00Z

tl;dr: We're giving our three-day "Mastering Plone" training in Munich (in english)

During the course of this three-day training we will teach how to

  • ... wield the awesome features of Plone for maximum effect.
  • ... customize and extend Plone to make it do exactly what you want.
  • ... use the current best-practices to become a Plone rockstar.

In the first part we'll teach the fundamentals needed to setup and manage your own website using the many build-in features of Plone.

The second part will focus on customizations that may be done through-the-web.

The third and longest part will be devoted to Plone-development. Here we focus on current best-practices like Dexterity and Diazo that make developing with Plone fun and accessible.

The training is for people who are new to Plone or used to work with older versions of Plone and want to learn the current best-practices. Basic Python and HTML/CSS skills are a requirement.

The course is an updated and expanded version of the trainings we held at the international Plone-Conferences in Arnhem and Brasilia. The documentation for these can be found at http://starzel.github.io/training

As always, we give the training as a team of two Trainers. This way you'll receive a 1on1 training as soon as something works differently than expected. Something that is not possible with a single trainer and something that adds a lot of insight when something did not work as expected.

If you're interested call us at +49 (0)89 - 189 29 533 or send a mail to

Date:
26. - 28. May 2014

Time:
9:00 - 18:00

Location:
EineWeltHaus
Schwanthalerstr. 80
80336 München

Trainers:
Philip Bauer
Patrick Gerken

Language:
English

Cost:
EUR 1000.- per person plus 19% MwSt (VAT)

Photo: https://www.flickr.com/photos/mindonfire/4447448937

April 10, 2014

JC Brand: Collaborative editing of HTML with TinyMCE not going to happen soon

2014-04-10T19:40:56Z

TL:DR: Collaborative editing doesn't work well with XML/HTML. Right now, the solution seems to be to use Markdown instead.

During my talk on XMPP applications in Plone, someone asked whether I was aware of any issues with regards to collaborative editing in TinyMCE.

I don't exactly remember my reply, but it came down to "no", I wasn't aware of any problems with it. Just the next day however, at the sprints, I encountered a fundamental problem with regards to collaborative editing of Rich Text through TinyMCE.

The problem lies in the fact that the Diff-Match-Patch is meant for plain text only. It has no concept of structured content such as the a DOM-tree and can therefore create problems when one tries to patch HTML content. It seems that mainly two things can happen. Firstly, because your HTML nodes are not atomic, they can be broken by the patching algorithm inserting text inside them. Secondly, the patching can result in HTML nodes appearing in the wrong order. (See what the author of Diff-Match-Patch had to say about it on the project page and his excellent explanation on stackoverflow).

Ideally one should use a patching algorithm that is tree-based and which will maintain the integrity of the DOM-tree. When using the plain text algorithm, there are however two approaches to try and mitigate the above issues.

  • Strip all HTML tags, diff-match-patch the resulting plain text and re-insert the original tags.
  • Replace all tags with Unicode chars outside of the used range (thereby making them atomic), apply diff-match-patch and then restore all tags.

The problem with the first approach is that your markup is now immutable. So any markup changes a collaborator makes (e.g bold, italics, heading or other formatting) will be discarded. I think this is a dealbreaker and rules out this approach.

The problem with the second approach is that even though your HTML nodes are now atomic, they might still appear in the wrong order.

Because of this, I think trying to do collaborative editing via an HTML-based Wysiwyg editor is not the way to go. Instead, a Markdown editor (such as Epic Editor) seems to be the way to go. Markdown is plain text, and therefore doesn't suffer from the problems mentioned above.

I think I have created the impression at the Plone conf that production-ready collaborative editing via TinyMCE will soon be a reality, and for that I would like to apologize.

Jazkarta Blog: Rural sprinting

by Nate Aune at 2014-04-10T03:21:42Z

Jazkarta team with brand spanking new t-shirts!

Jazkarta team with brand spanking new t-shirts!

For the last three days, the Jazkarta team has been enjoying delicious meals lovingly prepared from local farm ingredients by Sally and her husband Doug, walks in the thawing New England woods, and even a visit to a farm to meet the baby goats who were especially attracted to Carlos for reasons unknown, and showed their affection by nimbling at his pants and shirt.

We usually work together from our home offices, and “meet” each other in the IRC channel, so when Sally invited us all to her place for a mini-sprint prior to Pycon, we jumped at the opportunity to meet up in person.

While we have the tradition of monthly “happy hours” in which we all get on Google Hangout with our beverage of choice and rap for an hour, it’s not the same as hanging out in real life, eating and drinking together, sprinting together, and yes, playing with baby goats together. ;)

Tomorrow we’re getting up early, piling into the rented mini-van and driving 5 hours to Montreal for PyCon! We’ll be staying in a shared apartment just a few blocks away from the conference center. If you want to get away from the PyCon crowds and chill out, you’re welcome to stop by our pad and say hi. Who knows – Sally might even treat you to some of her amazing home cooking!

See some photos from the sprint!


Tagged: distributed teams, farming, Plone, pycon, rural, sprinting

April 09, 2014

Wichert Akkerman: Lingua 2 released

2014-04-09T00:00:00Z

This new release was planned for a long time. I started working on it at the Pyramid NOLA sprint last February. Since I just finished a project and am looking for new work I had some time to finally finish Lingua 2.

Lingua is a Python package that helps you find translateable texts in your code, and generate POT-file for them. Previous versions handled this as an extractor plugin for Babel. With this release Babel is no longer used and Lingua now has a more powerful extraction framework itself.

Read entire article.

April 08, 2014

Martijn Faassen: Morepath 0.1 released!

2014-04-08T13:52:57Z

I've just released Morepath 0.1! This is Morepath's first ever proper release. Hurray! If you've been waiting for a release before trying Morepath, now is the time to stop waiting!

Morepath is your friendly neighborhood Python web framework with super powers.

The docs for 0.1 are here: http://morepath.readthedocs.org/en/0.1/

It includes a quickstart, and installation docs, and much much more.

The docs are quite complete in describing Morepath's abilities and how to use them, though undoubtedly things could be improved. Let me know if you find any sections where things are unclear or missing!

The Extra Bits

There are still some docs floating around that I intend to integrate into the main documentation. One bit involves the permission and authentication docs; I previously blogged a description.

You can integrate Morepath with SQLAlchemy or the ZODB using more.transaction. I've just made a 0.1 release of that too. See this blog entry for more information on what's going on with that, and here is example code.

Talking about Morepath

There is a #morepath channel on freenode IRC.

If you have an issue or feature request, you can use the issue tracker on Github:

https://github.com/morepath/morepath/issues?milestone=1&state=open

You can also contact me directly; contact information is at the bottom of this weblog. I'm happy to hear from you!

Onward to 0.2!

Morepath is now transitioning into a phase where its actual use will drive its further development. I expect others (you?) will come up with new and interesting ways to use the facilities and abstractions that Morepath offers. I'm looking forward to discovering new and better ways to do web development with you!

Alex Clark: Bro, do you even Pillow?

by aclark at 2014-04-08T00:00:00Z

Pillow is a fork of the Python Imaging Library. Here is an update on the status of the project.

2.4.0 released

Pillow 2.4.0 is out! Here are the highlights:

  • Indexed Transparency handled for conversions between L, RGB, and P modes. Fixes #510 [wiredfool]
  • Conversions enabled from RGBA->P, Fixes #544 [wiredfool]
  • Improved icns support [al45tair]
  • Fix libtiff leaking open files, fixes #580 [wiredfool]
  • Fixes for Jpeg encoding in Python 3, fixes #577 [wiredfool]
  • Added support for JPEG 2000 [al45tair]
  • Add more detailed error messages to Image.py [larsmans]
  • Avoid conflicting _expand functions in PIL & MINGW, fixes #538 [aclark]
  • Merge from Philippe Lagadec’s OleFileIO_PL fork [vadmium]
  • Fix ImageColor.getcolor [homm]
  • Make ICO files work with the ImageFile.Parser interface, fixes #522 [wiredfool]
  • Handle 32bit compiled python on 64bit architecture [choppsv1]
  • Fix support for characters >128 using .pcf or .pil fonts in Py3k. Fixes #505 [wiredfool]
  • Skip CFFI test earlier if it's not installed [wiredfool]
  • Fixed opening and saving odd sized .pcx files, fixes #523 [wiredfool]
  • Fixed palette handling when converting from mode P->RGB->P [d_schmidt]
  • Fixed saving mode P image as a PNG with transparency = palette color 0 [d-schmidt]
  • Improve heuristic used when saving progressive and optimized JPEGs with high quality values [e98cuenc]
  • Fixed DOS with invalid palette size or invalid image size in BMP file [wiredfool]
  • Added support for BMP version 4 and 5 [eddwardo, wiredfool]
  • Fix segfault in getfont when passed a memory resident font [wiredfool]
  • Fix crash on Saving a PNG when icc-profile is None [brutasse]
  • Cffi+Python implementation of the PixelAccess object [wiredfool]
  • PixelAccess returns unsigned ints for I16 mode [wiredfool]
  • Minor patch on booleans + Travis [sciunto]
  • Look in multiarch paths in GNU platforms [pinotree]
  • Add arch support for pcc64, s390, s390x, armv7l, aarch64 [manisandro]
  • Add arch support for ppc [wiredfool]
  • Correctly quote file names for WindowsViewer command [cgohlke]
  • Prefer homebrew freetype over X11 freetype (but still allow both) [dmckeone]

OS X 10.9.2 issues

This happened:

Security issues

This happened:

April 07, 2014

JC Brand: Converse.js: XMPP instant messaging with Javascript

2014-04-07T19:22:09Z

It is now possible to use converse.js, the Javascript from collective.xmpp.chat, in a standalone way, to communicate with any public Jabber account.

Lately I've been spending time refactoring converse.js the Javascript library used by collective.xmpp.chat the instant messaging add-on for the Plone CMS. My goal is to make it usable on it's own, requiring nothing else except an XMPP server to communicate with.

This would enable any website owner to add instant messaging functionality to their website, and due to the federated nature of XMPP, users could chat to any other public XMPP account (once they have been accepted as a contact).

One thing that previously prevented you from using converse.js on its own, was the fact that it made XHR calls to the Plone backend to fetch user data. To fix this, I added vCard support, to converse.js but also to Plone by adding it to collective.xmpp.core.

Last week I reached a significant milestone on the path to this goal, and I'd like to take a moment and share with you.

It is now possible to use converse.js (in a static HTML page) to communicate with Jabber accounts on any public server.

In the demo below, I illustrate this by chatting to a Google user and to a Jabber.org user. In the converse.js page, I'm authenticated with a Jappix.com account and I also use their connection manager to connect to their XMPP server. If you're doing XMPP via HTTP (i.e in the browser), you'll need a connection manager as a bridge to your intended XMPP server. Thanks a lot to the Jappix guys for making their connection manager public!

Note: For detailed fullscreen, make sure that video quality is set to HD, by clicking the gear icon on the video player.

Note

UPDATE: Since this blog post, a production ready version of converse.js has been released. So the following is no longer applicable.

I'm sorry to say that converse.js is not yet 100% ready for primetime as a standalone JS app. There are a few more hurdles (and nice-to-haves) to overcome before we'll achieve this goal:

  • Searching and adding new users still does XHR calls to Plone and should instead query the XMPP server.
  • Service discovery support (e.g so that multi-user chat is only available for servers that support it).
  • Some kind of "Keep me logged in" support when users log in manually.
  • I'm not proud of the CSS and it could probably be improved upon quite a bit.
  • The Jasmine tests are out of date and not passing, also more tests are required.

If you are interested in the project, please contribute by forking the code on github.

Thanks a lot to Alec Ghica and David Ichim from Eau de Web who've made various improvements to both collective.xmpp.chat and converse.js over the past months.

JC Brand: Plone 4 compatible release of Quills

2014-04-07T19:22:09Z

/img/quills.png

Since I've started this site, I've been using Quills for blogging functionality in Plone. So far, it's been perfectly fine for my relatively simple needs and I haven't found a reason to change. Unfortunately, except for some work to port Quills to Plone 4, development and bugfixes on Quills has completely dried up. No new releases were made for more than a year and the mailing list was almost dead. I only realised this when I fixed some bugs while porting my site to Plone 4 and couldn't find anybody to help making a new Plone 4 compatible release.

Eventually I got hold of Tim Hicks, one of the original maintainers of Quills, and I offered to help out with maintaining Quills and to make the new releases.

So, I'm happy to announce that new Plone 4 compatible releases of the Quills packages have been made. Notably Products.Quills, Products.QuillsEnabled and quills.app (all now at version 1.8a1). This new release is labeled alpha, as I'm still very new to the Quills codebase, but I'm already using it on this blog without any major problems.

If there is anyone who is still using Quills on a legacy Plone site and would like to migrate to Plone 4, just pin your Products.Quills (and Products.QuillsEnabled) version to 1.8a1 in your versions.cfg or bulidout.cfg.

Hopefully everything goes well (did I mention it's alpha ;) but if not, feel free to let me know and I'll try to help out.

Blue Dynamics: Plone and NixOS Talks at Linuxtage.at

by Johannes Raggam at 2014-04-07T08:04:40Z

The Linuxtage.at in Graz is Austrians biggest freely accessible Event on Linux.  Every year people from all over Austria and German speaking countries are coming. There are talks, workshops, exhibition stands, a obligatory key-signing party and lots of possibilities for networking. The topics cover not only operating system specific subjects but all areas, where Linux plays a role. So I did a talk about Plone 5 and one about NixOS. Both in German language, but the amount of inter-language buzzwords in the talks is quite high, so I found it appropriate to write a blog-posting in English and link the German slides in here.

You can navigate through the slides by using your left/right/up/down arrow keys.

Up Next: Plone 5

 

Ein Ausblick auf die kommende Version vom CMS Plone.

 

Plone, das Python basierte Enterprise Content Management und Collaboration System steht vor einem neuen Release: Plone 5 soll in der zweiten Jahreshälfte 2014 veröffentlicht werden und wird das CMS in vielen Bereichen erneuern und verbessern: Wechsel auf ein neues Contenttype Framework, Integration eines Kalender Frameworks, Modernisierung der Eingabeinterfaces mittels eines Javascript Frameworks ähnlich der Web Components, Neues Default-Theme auf Basis von Bootstrap 3, radikale Reduzierung von Altlasten bei gleichzeitiger Gewährleistung eines Migrationspfades und vieles mehr. Darüber, und wie Plone die Herausforderungen der aktuellen Web Development Paradigmenshifts und Umbrüche meistert spricht Johannes Raggam, Plone Core Entwickler und Mitglied des Plone Framework Teams.

http://johannes.raggam.co.at/up-next-plone5/index.html

 

Die Linux Distro NixOS


NixOS ist eine Linux Distribution basierend auf dem "purely functional Package Manager nix". Nix ist vergleichbar mit Docker und bietet komplett isolierte Paketinstallationen und Rollbacks. Somit auch NixOS. Die Community ist noch klein, aber das Handling dieser Distro ist relativ einfach. Der Lightning Talk stellt dies kurz vor.

http://johannes.raggam.co.at/linux-distro-nixos/index.html

April 05, 2014

JC Brand: Collaborative editing of HTML with TinyMCE not going to happen soon

2014-04-05T17:00:59Z

TL:DR: Collaborative editing doesn't work well with XML/HTML. Right now, the solution seems to be to use Markdown instead.

During my talk on XMPP applications in Plone, someone asked whether I was aware of any issues with regards to collaborative editing in TinyMCE.

I don't exactly remember my reply, but it came down to "no", I wasn't aware of any problems with it. Just the next day however, at the sprints, I encountered a fundamental problem with regards to collaborative editing of Rich Text through TinyMCE.

The problem lies in the fact that the Diff-Match-Patch is meant for plain text only. It has no concept of structured content such as the a DOM-tree and can therefore create problems when one tries to patch HTML content. It seems that mainly two things can happen. Firstly, because your HTML nodes are not atomic, they can be broken by the patching algorithm inserting text inside them. Secondly, the patching can result in HTML nodes appearing in the wrong order. (See what the author of Diff-Match-Patch had to say about it on the project page and his excellent explanation on stackoverflow).

Ideally one should use a patching algorithm that is tree-based and which will maintain the integrity of the DOM-tree. When using the plain text algorithm, there are however two approaches to try and mitigate the above issues.

  • Strip all HTML tags, diff-match-patch the resulting plain text and re-insert the original tags.
  • Replace all tags with Unicode chars outside of the used range (thereby making them atomic), apply diff-match-patch and then restore all tags.

The problem with the first approach is that your markup is now immutable. So any markup changes a collaborator makes (e.g bold, italics, heading or other formatting) will be discarded. I think this is a dealbreaker and rules out this approach.

The problem with the second approach is that even though your HTML nodes are now atomic, they might still appear in the wrong order.

Because of this, I think trying to do collaborative editing via an HTML-based Wysiwyg editor is not the way to go. Instead, a Markdown editor (such as Epic Editor) seems to be the way to go. Markdown is plain text, and therefore doesn't suffer from the problems mentioned above.

I think I have created the impression at the Plone conf that production-ready collaborative editing via TinyMCE will soon be a reality, and for that I would like to apologize.

April 03, 2014

UW Oshkosh How-To's: Assign Local Roles Through Workflow

by scorciol at 2014-04-03T20:55:53Z

If you are using PloneFormGen and the Save Data to Content Adapter (uwosh.pfg.d2c) you can give access to a D2C object based on a string field on your form.

You will need a field to get the user's email address. We'll call it "form_field_id".

Then you need to go into portal_workflow/manage_main in the ZMI. Go into the "contents" tab and select your workflow. Go into the "scripts" tab and add a new "Script (Python)"

In the Parameter List put:

state_change

For the body put:

o = state_change['object']
email_address = 'form_field_id'
 
user_email = getattr(o,email_address, None)
(user_info) = o.portal_membership.searchMembers('email', user_email)
user_id = "%(username)s" % user_info[0]
o.manage_addLocalRoles(user_id, ['local_role'])

Where "form_field_id' is the ID of your email form field, and "local_role" is the role you want to assign.

This will use the email address given to get the user's id and then give that user the specified role.

Go into the "proxy" tab of the script and select "Manager" and the role of the user who will be running the transition. If you don't give the proxy manager access, non-managers will not be able to complete the transition.

Then you need to go into the "transition" tab of portal_workflow, select the transition you want to assign the script to, and assign the script either "before" or "after" the transition.