def postUpdate(self):
        # publish if it isn't already:
        pw = getToolByName(self.context, 'portal_workflow')
        reviewState = pw.getInfoFor(self.context, 'review_state')
        if reviewState == 'draft':
            utilities.rename(self.context)
            pw.doActionFor(self.context, 'publish-for-site-members')

        # process invited externs:
        if getattr(self.context, 'invitedExterns', None):
            invitedExterns = self.context.invitedExterns.split(',')
            emailAddresses = set()
            for email in invitedExterns:
                email = email.strip()
                if covalent.validators.email(email):
                    emailAddresses.add(email)

            urltool = getToolByName(self.context, 'portal_url')
            portal = urltool.getPortalObject()
            member_folder = portal['people']

            for email in emailAddresses:
                member = get_member_by_email(email, member_folder)
                if member:
                    # the member already exists
                    self.context.inviteMember(member.id)
                    continue

                # make member-objects (without invitation-mail)

                # become the owner of member_folder temporarily
                original_sm = getSecurityManager()
                member_folder_owner = member_folder.getOwner().getId()
                become_portal_user(portal, member_folder_owner)

                # add member
                uid = utilities.find_possible_id(email, member_folder)
                member = covalent.utilities.add_member_object(
                    member_folder, uid, uid, email, sendInvitation=False)
                member.role = 'extern'
                member.activation_code = ''.join(random.sample(
                    string.ascii_lowercase + string.digits, 8))

                # become the normal user again
                setSecurityManager(original_sm)

                # put the new uid on the workspaces invited-list
                self.context.inviteMember(uid)

                # avoid the usual invitation mail
                self.alreadyInvited.add(uid)

                # send special invitation mail
                self.messenger.sendInvitationForExtern(uid)

        super(Edit, self).postUpdate()
    def test_user_creation(self):
        login(self.portal, testing.MEMBER)

        member_folder = self.portal['people']

        # become the owner of member_folder temporarily
        original_sm = getSecurityManager()
        member_folder_owner = member_folder.getOwner().getId()
        become_portal_user(self.portal, member_folder_owner)

        # create a user
        member = utilities.add_member_object(member_folder, member_id='member',
            fullname=u"Hörbert M@ier", email="*****@*****.**")

        # become the normal user again
        setSecurityManager(original_sm)

        self.assertIn('member', member_folder)

        member = member_folder['member']
        message = self.mailhost.messages[-1]
        expectedMessageText = '\n'.join([
            "Hello H=C3=B6rbert M@ier!",
            '',
            "Please follow this link to activate your account on Plone site:",
            member.absolute_url() + '/activate?activation_code=3D' +
                member.activation_code,
            '', '', ])

        self.assertEqual(message.get_charset(), 'utf-8')
        self.assertIsInstance(message['To'], basestring)
        self.assertEqual(message['To'],
            u'Hörbert M[at]ier <*****@*****.**>')
        self.assertIsInstance(message['From'], basestring)
        self.assertEqual(message['From'], u'Plone site <>')
        self.assertEqual(unicode(message['Subject']),
            u"You've been invited to Plone site")
        self.assertEqual(message.get_payload(), expectedMessageText)
    def test_user_creation(self):
        """
        Test user creation by Site Admin with automatic approval.
        """

        login(self.portal, testing.SITE_ADMIN)

        member_folder = self.portal['people']

        # become the owner of member_folder temporarily
        original_sm = getSecurityManager()
        member_folder_owner = member_folder.getOwner().getId()
        become_portal_user(self.portal, member_folder_owner)

        # create a user
        member = utilities.add_member_object(member_folder, member_id='herbert',
            fullname=u"Hörbert M@ier", email="*****@*****.**")

        # become the normal user again
        setSecurityManager(original_sm)

        self.assertIn('herbert', member_folder)

        member = member_folder['herbert']

        pw = getToolByName(self.portal, 'portal_workflow')
        self.assertEqual(pw.getInfoFor(member, 'review_state'), 'pending')
        self.assertEqual(member.title, u"Hörbert M@ier")
        self.assertEqual(member.emailAddress, "*****@*****.**")

        message = self.mailhost.messages[-1]

        expectedMessageTpl = """Hello {name}!

You have been invited to the {site_title} site.

Please follow this link to activate your account on the {site_title} site:

{url}/activate?activation_code={activation_code}

This activation link is valid for {activation_period} days.

Your username is: {userId}

"""
        registry = getUtility(IRegistry)
        activation_period = registry['cnrd.vctypes.memberActivationTimeout']

        tplParams = {
            'url': member.absolute_url(),
            'activation_code': member.activation_code,
            'activation_period': activation_period,
            'userId': 'herbert',
            'site_title': 'Plone site',
            'name': 'Hörbert M@ier'
        }
        expectedMessageText = expectedMessageTpl.format(**tplParams)

        self.assertEqual(message.get_charset(), 'utf-8')
        self.assertIsInstance(message['To'], basestring)
        self.assertEqual(message['To'], u'Hörbert M[at]ier <*****@*****.**>')
        self.assertIsInstance(message['From'], basestring)
        self.assertEqual(message['From'], u'Plone site <>')
        self.assertEqual(unicode(message['Subject']), u"You've been invited to Plone site")
        self.assertEqual(message.get_payload(None, True), expectedMessageText)
 def test_owner(self):
     member_folder_owner = self.members.getOwner().getId()
     become_portal_user(self.portal, member_folder_owner)
     self.assertExpectedTraversability(MANAGE)
     self.assertCanDelete(USER_FOLDER)
     self.assert_can_add_to(USER_FOLDER)