説明
How to manage Plone member propeties programmatically
Member profile fields are the fields which the logged in member can edit oneself on his user account page.
For more info, see
ノート
Following concerns vanilla Plone only. If you have customized membership behavior it doesn’t necessarily work.
Member profile properties (title, address, biography, etc.) are stored in portal_membership tool.
Available fields can be found in ZMI -> portal_membership -> Properties .
how to retrieve these properties.
In Python code you can ask info from MemberData object:
fullname = member_data.getProperty("fullname")
In template you can do something along the lines:
<tal:with-fullname define="membership context/portal_membership;info python:membership.getMemberInfo(user.getId()); fullname info/fullname">
You are are <span class="name" tal:content="fullname" />
</tal:with-fullname>
Note that this code won’t work for anonymous users.
Use setMemberProperties(mapping={}) to batch update properties. Old properties are not removed.
Example:
member.setMemberProperties(mapping={"email":"aaa@aaa.com"})
New properties must be explicitly declared in portal_memberdata, before creation of the member, or setMemberProperties() will silently fail.
ノート
TODO: How to retrofit existing members with new properties?
Example:
def prepareMemberProperties(site):
""" Adjust site for custom member properties """
# Need to use ancient Z2 property sheet API here...
portal_memberdata = getToolByName(site, "portal_memberdata")
# When new member is created, it's MemberData
# is populated with the values from portal_memberdata property sheet,
# so value="" will be the default value for users' home_folder_uid
# member property
if not portal_memberdata.hasProperty("home_folder_uid"):
portal_memberdata.manage_addProperty(id="home_folder_uid", value="", type="string")
....
def createMatchingHomeFolder(member):
""" """
email = member.getProperty("email")
home_folder.setEmail(email)
# Store UID of the created folder in memberdata so we can
# look it up later to e.g. generate the link to the member folder
member.setMemberProperties(mapping={"home_folder_uid": home_folder.UID()})
return home_folder
Password is a special case.
Example how to set the user password:
# Password is set in a special way
# passwd is password as plain text
member.setSecurityProfile(password=passwd)
If you want to certain member to use TinyMCE instead of Kupu. Plone provides no means to do change other member properties through-the-web, but you can do it using the command-line scripting snippet below:
# Traverse to your Plone site from Zope application root
context = app.mfabrik # site id is mfabrik
users = context.acl_users.getUserNames()
portal_membership = context.portal_membership
for user in users:
member = portal_membership.getMemberById(user)
value = member.wysiwyg_editor
# Show the existing editor choice before upgrading
print str(user) + ": " + str(value)
# Set WYSIWYG editor to all
member.wysiwyg_editor = "TinyMCE"
# The following does not work from command-line (assumes HTTP request?)
#member.setMemberProperties({'wysiwyg_editor': 'TinyMCE'})
ノート
The script does not work through ZMI as member properties do not have proper security declarations to set them as admin.