source: products/PloneSMSCommunicator/tags/0.1.3/PloneSMSCommunicator.py @ 1591

Last change on this file since 1591 was 1, checked in by myroslav, 18 years ago

Building directory structure

File size: 4.6 KB
Line 
1from Products.PloneSMSCommunicator.Utils import getHostName
2from urllib2 import urlopen, Request, HTTPError, URLError
3from Products.Archetypes.public import *
4from xml.dom.minidom import *
5from StringIO import StringIO
6from DateTime import DateTime
7from time import strftime
8import socket
9import os
10
11from config import *
12from pyXIAM import *
13
14
15class 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
23class 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
144registerType(PloneSMSCommunicator)
Note: See TracBrowser for help on using the repository browser.