root/PloneSMSCommunicator/tags/0.1.3/PloneSMSCommunicator.py

Revision 12 (checked in by fenix, 3 years ago)

PloneSMSCommunicator import

Line 
1 from Products.PloneSMSCommunicator.Utils import getHostName
2 from urllib2 import urlopen, Request, HTTPError, URLError
3 from Products.Archetypes.public import *
4 from xml.dom.minidom import *
5 from StringIO import StringIO
6 from DateTime import DateTime
7 from time import strftime
8 import socket
9 import os
10
11 from config import *
12 from pyXIAM import *
13
14
15 class SendMessageError(IOError):
16
17     def __init__(self, reason):
18         self.reason = reason
19
20     def __str__(self):
21         return '<Can\'t send message because %s>' % self.reason
22
23 class PloneSMSCommunicator(BaseFolder):
24
25     _properties = (
26       { 'id': 'server_url', 'type':'string', 'mode':'w' },
27       { 'id': 'policy', 'type':'selection', 'mode':'w', 'select_variable':'getAvailableSMSPolicies'},
28       { 'id': 'mtMessageOriginator', 'type':'string', 'mode':'w' },
29       { 'id': 'provider_id', 'type':'string', 'mode':'w' },
30       { 'id': 'log_flag', 'type':'boolean', 'mode':'w' },
31     )
32
33     archetype_name="PloneSMSCommunicator"
34     id=COMMUNICATORID
35
36     def __init__(self):
37         BaseFolder.__init__(self, self.id)
38         self.server_url = SERVER_URL
39         self.policy = 'free'
40         self.mtMessageOriginator = ORIGINATOR
41         self.log_flag = True
42         self.provider_id = PROVIDER
43
44     def setProperties(self, **properties):
45         '''Set properties'''
46         for property in properties.keys():
47             setattr(self, property, properties[property])
48
49     def getProperties(self, ids = []):
50         props = {}
51         if ids:
52             for i in ids:
53                 props[i] = getattr(self, i)
54         else:
55             for p in self._properties:
56                 property = p['id']
57                 props[property] = getattr(self, property, None)
58
59         return props
60
61     def LOG(self, INFO, data):
62
63         if self.log_flag:
64             log_time = DateTime().strftime("%Y/%m/%d %H:%M:%S")
65             xiam_log = file(XIAM_LOG, 'a')
66             xiam_log.write(log_time)
67             xiam_log.write(data)
68
69     def write_sms(self, sms_id, request = None, response = None):
70         if self.log_flag:
71             #create sms directory
72             if  not 'sms' in os.listdir(CLIENT_HOME):
73                  os.mkdir(CLIENT_HOME+'/sms')
74
75             if request:
76                 sms_request = file(SMS_LOG+sms_id+'out.xml', 'w')
77                 sms_request.write(request)
78                 sms_request.close()
79
80             if response:
81                 sms_response = file(SMS_LOG+sms_id+'in.xml', 'w')
82                 sms_response.write(response)
83                 sms_response.close()
84
85     def send_Request(self, originator, destination, body):
86         """Send message"""
87         response = StringIO()
88         request=SMSsubmitRequest(originator, destination, body)
89         xml = str(request.toXML())
90         self.write_sms(request.id, request = xml)
91         data = Request(self.server_url, xml, headers = {'X-XIAM-Provider-ID':self.provider_id})
92         self.LOG('INFO', " > Sent %(id)s request. Originator: %(originator)s, %(noRecipients)d recipients (%(id)sout.xml)\n" % \
93             {'id': request.id,
94              'originator': originator,
95              'noRecipients': len(destination)
96             })
97         try:
98             response = urlopen(data)
99             response_status = '200 OK'
100         except HTTPError, e:
101             response_status = str(e.code)+' '+e.msg
102         except URLError, e:
103             raise SendMessageError(e)
104         str_response = response.read()
105         self.write_sms(request.id, response = str_response)
106         self.LOG('INFO', " < Received response %(response_status)s (%(id)sin.xml)\n" % \
107             {'response_status': response_status,
108              'id': request.id
109             })
110         response.close()
111
112     def Response(self, REQUEST = None):
113         """write all data from response to xiam.log file"""
114         stream = REQUEST.stdin
115         stream.seek(0)
116         response_xml = stream.read()
117         self.LOG('INFO', response_xml)
118         return
119
120     def getAvailableSMSPolicies(self):
121         return ['free', 'enforceOriginator']
122
123     def getServerInfo(self, server_url):
124         info = {}
125         info['host_name'] = getHostName(server_url)
126         info['ip_addr'] = socket.gethostbyname(info['host_name'])
127         return info
128
129     def getLogs(self, size):
130         line = ''
131         result = []
132         xiam_log = file(XIAM_LOG, 'r')
133         logs = xiam_log.read()
134         for log in logs:
135             if log != '\n':
136                 line = line+log
137             else:
138                 result.append(line)
139                 line = ''
140         result = result[-size:]
141         result.reverse()
142         return result
143
144 registerType(PloneSMSCommunicator)
Note: See TracBrowser for help on using the browser.