def __call__(self):
     form = self.request.form
     if 'form.button.New' in form:
         url = self.context.absolute_url() + '/@@message_new'
         self.request.response.redirect(url)
         
     elif 'form.button.Reply' in form:
         entries = form.get('entries', [])
         if not entries:
             IStatusMessage(self.request).addStatusMessage(_('Choose one message'), type='error')
         elif len(entries) > 1:
             IStatusMessage(self.request).addStatusMessage(_('Choose only one message'), type='error')
         else:
             url = self.context.absolute_url() + '/@@message_new?id=' + str(entries[0])
             self.request.response.redirect(url)
     elif 'form.button.Delete' in form:
         entries = form.get('entries', [])
         try:
             self.delete()
         except ValueError, e:
             IStatusMessage(self.request).addStatusMessage(e.args[0], type='error')
         else:
             IStatusMessage(self.request).addStatusMessage(_(u"%s Message(s) delete"%(len(entries))), type='info')
             url = self.context.absolute_url() + '/@@messages'
             return self.request.response.redirect(url)
 def delete(self):
     form = self.request.form
     entries = form.get('entries', [])
     if not entries:
         raise ValueError(_(u"You must select at least one message"))
         
     manager = getUtility(IMessagesManager)    
     for msg in entries:
         manager.message_delete(msg)
 def message(self):
     form = self.request.form
     entries = form.get('id', None)
     if not entries:
         raise ValueError(_(u"There isn't message"))
         
     read_flag = form.get('read_flag', False)
     manager = getUtility(IMessagesManager)            
     return manager.message_by_id(entries, read_flag)
 def __call__(self):
     form = self.request.form
     if 'form.button.Send' in form:
         try:
             self.send()
             IStatusMessage(self.request).addStatusMessage(_(u"Message has been sent"), type='info')
             url = self.context.absolute_url() + '/@@messages'
             self.request.response.redirect(url)
 	        
         except ValueError, e:
             IStatusMessage(self.request).addStatusMessage(e.args[0], type='error')
    def __call__(self):
        form = self.request.form
        if 'form.button.New' in form:
            url = self.context.absolute_url() + '/@@message_new'
            self.request.response.redirect(url)

        elif 'form.button.Reply' in form:
            entries = form.get('id', None)
            if not entries:
                IStatusMessage(self.request).addStatusMessage(_("There isn't message"), type='error')
            else:
                url = self.context.absolute_url() + '/@@message_new?id=' + str(entries)
                self.request.response.redirect(url)
        elif 'form.button.Delete' in form:
            try:
                self.delete()
            except ValueError, e:
                IStatusMessage(self.request).addStatusMessage(e.args[0], type='error')
            else:
                IStatusMessage(self.request).addStatusMessage(_(u"Message(s) delete"), type='info')
                url = self.context.absolute_url() + '/@@messages'
                return self.request.response.redirect(url)
    def send_email(self, data, email):
        """Send the email to the user and redirect to the
        front page, showing a status message to say the message was received.
        """

        #context = aq_inner(self.context)

        #mailhost = getToolByName(context, 'MailHost')
        #urltool = getToolByName(context, 'portal_url')
        
        #portal = urltool.getPortalObject()
        #email_charset = portal.getProperty('email_charset')
        #title = portal.getProperty('title')
        # Construct and send a message
        source = "%s <%s>" % (self.portal_title, self.portal_email)
        subject = _('Nuevo mensaje en') + " " + self.portal_title  
        message = MESSAGE_TEMPLATE % data
	
	self.mailhost.secureSend(message, email, str(source),
                            subject=subject, subtype='plain',
                            charset=self.email_charset, debug=False,
                            From=source)
    def send(self):
        """
        """
        pg = getToolByName(self.context, 'portal_groups')
        membership = getToolByName(self.context, 'portal_membership')        
                        
        form = self.request.form
        user_list = form.get('user_list', [])
        if not user_list:
            raise ValueError(_(u"You must select at least one recipient"))
        
        subject = form.get('subject', None)
        if not subject:
            raise ValueError(_(u"The message has not subject"))
        
        body = form.get('body', '')
        category = form.get('category_id', 1)
        
        sender = membership.getAuthenticatedMember()
        fullname = sender.getProperty('fullname')
        senderId = sender.getId()
        manager = getUtility(IMessagesManager)
        
        data_sender = dict(name = fullname or senderId,
                    email = sender.getProperty('email', None)
                )
        
        
        for receiver in user_list:
            if receiver.startswith('g:'):
                logger.info("is a Group")
                group = pg.getGroupById(receiver[2:])
                if group:
                    members = group.getGroupMembers()
                    logger.info("have %s members" %(len(members)))
                    for member in members:
                        email = member.getProperty('email', None)
                        #brincar mensaje para uno mismo                            
                        manager.message_new(int(category), 
                                            senderId, 
                                            member.getId(), 
                                            subject, body)
                        logger.info("Message DB for %s"%(member.getId()))
                        if email:
                            try:
                                self.send_email(data_sender, email)
                                logger.info("Message E-Mail for %s"%(member.getId()))                       
                            except SMTPAuthenticationError, inst:                        
                                logger.error("Authentication error:" + str(inst))
                                #logger.error("Error while sending email to " + email)
                            #finally:
                                raise ValueError(_(u"One or more emails could not be sent. Please try again later or contact the site Administrator"))
                        else:
                            fullname = member.getProperty('fullname', None)
                            raise ValueError (_("User %s does not have e-mail account associated"%(fullname)))
                            
                    manager.message_new(3, receiver, senderId, subject, body, read_flag=True) # copy sent
                    logger.info("copy sent")

            else:
                member = membership.getMemberById(receiver)
                email = member.getProperty('email', None)
                
                manager.message_new(int(category), sender.getId(), receiver, subject, body)
                #Make the same email on Sent items
                manager.message_new(3, receiver, sender.getId(), subject, body, read_flag=True)
                
                if email:
                    try :
                        self.send_email(data_sender, email)
                    except SMTPAuthenticationError, inst:                        
                        logger.error("Authentication error:" + str(inst))
                        logger.error("Error while sending email to " + email)
                    #finally:
                        raise ValueError (_(u"The mail could not be sent. Please try again later"))
from Products.Five.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile

from Products.CMFCore.utils import getToolByName
from Products.statusmessages.interfaces import IStatusMessage

from plone.memoize.instance import memoize

from eduintelligent.messages.interfaces import IMessagesManager
from eduintelligent.messages import messagesMessageFactory as _
from eduintelligent.messages import logger

MESSAGE_TEMPLATE = _(u"""\

Acaban de enviarle un mensaje personal de parte de %(name)s <%(email)s> 
para recuperarlo debe ir a: http://iservices.com.mx/

IMPORTANTE: Recuerde, esto es solamente una notificacion. Por favor, no respondas a este e-mail. 

""")


class MessagesView(BrowserView):
    """
    """
    
    template = ViewPageTemplateFile('templates/messages.pt')
    
    def __call__(self):
        form = self.request.form
        if 'form.button.New' in form:
            url = self.context.absolute_url() + '/@@message_new'
 def title(self):
     return _(u"My Messages")