def invitationAcceptedHandler(invitation, event):
    owner = IOwnership(invitation).owner
    if owner is None:
        return

    messaging = IMessageStorage(owner, None)
    if messaging is None:
        return

    interaction = queryInteraction()

    if interaction is not None:
        for request in interaction.participations:
            principal = invitation.principal

            view = queryMultiAdapter(
                (principal, request), IPagelet, 'personal.message')
            if view is None:
                return

            view.update()

            data = {'title': u'Your invitation has been accepted',
                    'text': view.render(),
                    'sender': unicode(principal.id)}
            messaging.create(SERVICE_ID, **data)
    def update(self):
        request = self.request
        context = removeAllProxies(self.context)
        context.__status__ = False

        try:
            sender = getUtility(IAuthentication).getPrincipal(context.sender)
        except PrincipalLookupError:
            sender = None

        self.replyTo = sender
        self.messaging = IMessageStorage(self.replyTo, None)

        if sender is not None:
            profile = IPersonalProfile(sender, None)
            self.sender = getattr(profile, 'title', sender.title)

            space = getattr(profile, 'space', None)
            if space is not None:
                self.profile = '%s/'%absoluteURL(space, request)
            else:
                self.profile = ''
        else:
            self.sender = context.sender
            self.profile = ''

        oldcontext = self.context

        self.context = context
        super(MessageView, self).update()
        self.context = oldcontext
class MessageView(PageletForm):

    label = _(u'Reply')
    fields = Fields(IMessage)

    def getContent(self):
        context = self.context
        if not context.title.startswith(u'Re:'):
            return {'title': u'Re: %s'%context.title,
                    'body': u'<blockquote>%s</blockquote><br />'%context.text}
        else:
            return {'title': u'',
                    'body': u'<blockquote>%s</blockquote><br />'%context.text}

    def update(self):
        request = self.request
        context = removeAllProxies(self.context)
        context.__status__ = False

        try:
            sender = getUtility(IAuthentication).getPrincipal(context.sender)
        except PrincipalLookupError:
            sender = None

        self.replyTo = sender
        self.messaging = IMessageStorage(self.replyTo, None)

        if sender is not None:
            profile = IPersonalProfile(sender, None)
            self.sender = getattr(profile, 'title', sender.title)

            space = getattr(profile, 'space', None)
            if space is not None:
                self.profile = '%s/'%absoluteURL(space, request)
            else:
                self.profile = ''
        else:
            self.sender = context.sender
            self.profile = ''

        oldcontext = self.context

        self.context = context
        super(MessageView, self).update()
        self.context = oldcontext

    @button.buttonAndHandler(_(u'Send reply'), provides=interfaces.IAddButton)
    def handleReply(self, action):
        data, errors = self.extractData()

        if errors:
            IStatusMessage(self.request).add(self.formErrorsMessage, 'error')
        else:
            data['text'] = data['body'].cooked
            data['sender'] = unicode(
                self.context.__parent__.__parent__.principalId)
            data['replyto'] = unicode(self.context.__uid__)

            self.messaging.create(SERVICE_ID, **data)

            IStatusMessage(self.request).add(_(u'Message has been sent.'))
            self.redirect('../')