DummyGateway.py 5.68 KB
Newer Older
1 2
# -*- coding: utf-8 -*-
##############################################################################
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#
# Copyright (c) 2011 Nexedi SA and Contributors. All Rights Reserved.
#                    Francois-Xavier Algrain <fxalgrain@tiolive.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
28 29 30 31 32 33 34 35 36
##############################################################################
"""Receive or send SMS"""

#Import python module
import random
import string
from DateTime import DateTime

#Import Zope module
37
from AccessControl import ClassSecurityInfo
38 39
from AccessControl.SecurityManagement import  getSecurityManager, \
                                              setSecurityManager, \
40
                                              newSecurityManager
41 42 43 44
import zope.interface

from Products.ERP5Type import Permissions, PropertySheet, interfaces
from Products.ERP5Type.XMLObject import XMLObject
45
from Products import ERP5Security
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73


class DummyGateway(XMLObject):

    """Dummy SMS Gateway Implementation"""
    meta_type='Dummy Gateway'
    portal_type = 'Dummy Gateway'
    security = ClassSecurityInfo()


    add_permission = Permissions.AddPortalContent

    zope.interface.implements(interfaces.ISmsGateway)

    # Declarative security
    security = ClassSecurityInfo()
    security.declareObjectProtected(Permissions.AccessContentsInformation)

    # Declarative properi ties
    property_sheets = ( PropertySheet.Base
                      , PropertySheet.XMLObject
                      , PropertySheet.Reference
                      , PropertySheet.SMSGateway
                      )

    security.declarePublic('getAllowedMessageType')
    def getAllowedMessageType(self):
      """List of all message type"""
74 75
      return ['text',]

76
    security.declareProtected(Permissions.ManagePortal, 'send')
77
    def send(self, text,recipient,sender=None, sender_title=None,
78 79 80 81 82 83 84
              message_type="text",test=False,**kw):
      """Send a message.
         Parameters:
         text -- message
         recipient -- phone url of destination_reference. Could be a list
         sender -- phone url of source
         sender_title -- Use it as source if the gateway has title mode enable
85
         message_type -- Only 'text' is available today
86
         test -- Force the test mode
87

88 89
         Kw Parameters:
         quality -- Quality of the SMS (default,n)
90

91 92 93
         Return message id
         """
      #Check messsage type
94 95 96
      # XXX does it make sense to check message type in dummy gateway ? -jerome
      #if message_type not in self.getAllowedMessageType():
      #  raise ValueError, "Type of message in not allowed"
97 98 99

      #Send message (or test)
      if test or self.isSimulationMode():
100 101
        return None
      else:
102
        return self._generateRandomMessageId()
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

    security.declareProtected(Permissions.ManagePortal, 'getMessageStatus')
    def getMessageStatus(self, message_id):
      """Retrive the status of a message"""
      return "delivered"

    security.declarePublic('receive')
    def receive(self,REQUEST):
      """Receive push notification from the gateway"""

      #Get current user
      sm = getSecurityManager()
      try:
        #Use SUPER_USER
        portal_membership = self.getPortalObject().portal_membership
118
        newSecurityManager(None, portal_membership.getMemberById(ERP5Security.SUPER_USER))
119 120

        #Dummy notify only new SMS
121 122
        self.notifyReception(REQUEST.get("sender"),
                             REQUEST.get("text"),
123
                             self._generateRandomMessageId())
124 125 126
      finally:
        #Restore orinal user
        setSecurityManager(sm)
127

128 129 130 131


    security.declareProtected(Permissions.ManagePortal, 'notifyReception')
    def notifyReception(self, sender, text, message_id):
132 133
      """The gateway inform what we ha a new message.
      """
134 135 136 137 138 139 140

      #Convert phone as erp5 compliant
      def parsePhoneNumber(number):
        #XXX: Should register well formatted number or brut number ?
        #return number
        return "+%s(%s)-%s" % (number[0:2],0,number[2:])

141 142

      #Create the new sms in activities
143 144 145 146 147 148 149
      self.activate(activity='SQLQueue').SMSTool_pushNewSMS(
                              message_id=message_id,
                              sender=parsePhoneNumber(sender),
                              recipient=None,
                              text_content=text,
                              message_type='text/plain',
                              reception_date=DateTime())
150

151
    def _generateRandomMessageId(self):
152 153 154 155
      letters = random.sample(string.ascii_lowercase,20)
      return "%s-%s-%s-%s" % (''.join(letters[0:5]),
                              ''.join(letters[5:10]),
                              ''.join(letters[10:15]),
156
                              ''.join(letters[15:20]))