~mailmanweb-django/+junk/dev

« back to all changes in this revision

Viewing changes to mailman_rest_client.py

  • Committer: Anna Granudd
  • Date: 2010-07-24 17:04:05 UTC
  • Revision ID: anna@athena-20100724170405-8xiqqv502ozeqzq6
Changed function names and calls in the view to make it work with the new rest-client.

Added the possibility to use fieldsets and divs in forms, by using as_div in the form.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
import json
3
 
from httplib import HTTPConnection, HTTPException
4
 
from urllib import urlencode
5
 
 
6
 
class MailmanRESTClientError(Exception):
7
 
    """An exception thrown by the Mailman REST API client."""
8
 
    pass
9
 
 
10
 
class MailmanRESTClient(object):
11
 
    """A thin client wrapper for the Mailman REST API."""
12
 
 
13
 
    def __init__(self, host):
14
 
        self.host = host
15
 
        if self.host[-1] == '/':
16
 
            self.host = self.host[:-1]
17
 
 
18
 
        # general header information
19
 
        self.headers = {
20
 
            "User-Agent": "MailmanRESTClient",
21
 
            "Accept": "text/plain", 
22
 
        }
23
 
 
24
 
        try:
25
 
            self.c = HTTPConnection(self.host)
26
 
        except:
27
 
            raise MailmanRESTClientError('Could not connect to server')
28
 
 
29
 
    def __repr__(self):
30
 
        return '<MailmanRESTClient: %s>' % self.host
31
 
 
32
 
    def _get_url(self, path):
33
 
        try:
34
 
            self.c.request('GET', path, None, self.headers)
35
 
        except:
36
 
            raise MailmanRESTClientError('Error sending request')
37
 
        
38
 
        try:
39
 
            r = self.c.getresponse()
40
 
            raw_data = r.read()
41
 
            if len(raw_data) == 0:
42
 
                raise None
43
 
            data = json.loads(raw_data)
44
 
        except:
45
 
                        raise MailmanRESTClientError('Error sending request')
46
 
        finally:
47
 
            self.c.close()
48
 
        
49
 
        return data
50
 
 
51
 
    def _post_url(self, path, data):
52
 
        self.headers['Content-type'] = "application/x-www-form-urlencoded"
53
 
        try:
54
 
            self.c.request('POST', path, urlencode(data), self.headers)
55
 
        except:
56
 
            raise MailmanRESTClientError('Could not send request')
57
 
            
58
 
        try:
59
 
            r = self.c.getresponse()
60
 
            if r.status == 201:
61
 
                return True
62
 
            else:
63
 
                return r.status
64
 
        finally:
65
 
            self.c.close()
66
 
 
67
 
    def _delete_url(self, path):
68
 
        try:
69
 
            self.c.request('DELETE', path, None, self.headers)
70
 
        except:
71
 
            raise MailmanRESTClientError('Could not send request')
72
 
        
73
 
    def _put_url(self, path):
74
 
        pass
75
 
        
76
 
    def get_lists(self):
77
 
        """Get a list of mail lists.
78
 
 
79
 
        returns a list of dicts
80
 
        """
81
 
        try:
82
 
            r = self._get_url('/3.0/lists')
83
 
        except:
84
 
            raise MailmanRESTClientError('Could not send request')
85
 
        
86
 
        if 'entries' not in r:
87
 
            raise MailmanRESTClientError('No mailing lists found')
88
 
 
89
 
        return r['entries']
90
 
 
91
 
    def read_list(self, list_name):
92
 
        """Get information about list.
93
 
 
94
 
        :param list_name: name of the list to get information about
95
 
        :type list_name: string
96
 
        :rtype: dict
97
 
        """
98
 
        try:
99
 
            r = self._get_url('/3.0/lists/' + list_name)
100
 
        except:
101
 
            raise MailmanRESTClientError('Unable to get info about list')
102
 
 
103
 
        return r
104
 
 
105
 
    def create_list(self, fqdn_listname, **kwargs):
106
 
        """Create a new list.
107
 
 
108
 
        :param fqdn_listname: the name of the list including the @ and the domain name.  eg.  test@example.com
109
 
        :type fqdn_listname: string
110
 
        :rtype: None
111
 
        """
112
 
        data = {
113
 
                'fqdn_listname': fqdn_listname
114
 
        }
115
 
        data.update(**kwargs)
116
 
        try:
117
 
            return self._post_url('/3.0/lists', data)
118
 
        except MailmanRESTClientError, e:
119
 
            raise MailmanRESTClientError(e)
120
 
            
121
 
 
122
 
    def subscribe_list(self, fqdn_listname, address, real_name, **kwargs):
123
 
        """Add an address to a list.
124
 
 
125
 
        :param fqdn_listname: the name of the list .
126
 
        :type fqdn_listname: string
127
 
        :param address: email address to add to the list.
128
 
        :type address: string
129
 
        :param real_name: the "real" name for the address to be addded
130
 
        :type real_name: string
131
 
        """
132
 
 
133
 
        data = {
134
 
                'fqdn_listname': fqdn_listname,
135
 
                'address': address,
136
 
                'real_name': real_name
137
 
        }
138
 
        data.update(**kwargs)
139
 
        try:
140
 
            r = self._post_url('/3.0/members', data)
141
 
        except:
142
 
            raise MailmanRESTClientError('unable to join list')
143
 
 
144
 
        return r
145
 
 
146
 
    def leave_list(self, fqdn_listname, address):
147
 
        """Remove an address from a list.
148
 
 
149
 
        :param fqdn_listname: the name of the list.
150
 
        :type fqdn_listname: string
151
 
        :param address: email address that is leaving the list
152
 
        :type address: string
153
 
        :rtype: None
154
 
        """
155
 
        try:
156
 
            r = self._delete_url('/3.0/lists/' + fqdn_listname + '/member/' + address )
157
 
        except:
158
 
            raise MailmanRESTClientError('unable to leave list')
159
 
 
160
 
        return True
161
 
 
162
 
    def get_members(self, fqdn_listname = None):
163
 
        """Get a list of all members for all lists.
164
 
 
165
 
        :rtype: list of dicts
166
 
        :type fqdn_listname: string
167
 
        """
168
 
 
169
 
        if fqdn_listname != None:
170
 
            url = '/3.0/lists/' + fqdn_listname + '/members'
171
 
        else:
172
 
            url = '/3.0/members'
173
 
        try:
174
 
            r = self._get_url(url)
175
 
        except:
176
 
            raise MailmanRESTClientError('Could not complete request')
177
 
 
178
 
        if 'entries' not in r:
179
 
            raise MailmanRESTClientError('Could not find any members')
180
 
 
181
 
        return r['entries']
182
 
 
183
 
    def get_domains(self):
184
 
        """Get a list of domains.
185
 
 
186
 
        :rtype: list of dicts
187
 
        """
188
 
        try:
189
 
            r = self._get_url('/3.0/domains')
190
 
        except:
191
 
            raise MailmanRESTClientError('Could not complete request')
192
 
        if 'entries' not in r:
193
 
            raise MailmanRESTClientError('Could not find any domains')
194
 
 
195
 
        return r['entries']
196
 
 
197
 
    def read_domain(self, domain_name):
198
 
        """Get information about a specific domain.
199
 
 
200
 
        :param domain_name: the name of the domain.
201
 
        :rtype: dict
202
 
        """
203
 
        
204
 
        try:
205
 
            r = self._get_url('/3.0/domains/' + domain_name)
206
 
        except:
207
 
            raise MailmanRESTClientError('Unable to read domain')
208
 
 
209
 
        return r
210
 
 
211
 
    def create_domain(self, email_host, **kwargs):
212
 
        """Create a new domain name.
213
 
 
214
 
        :param email_host: domain name to create
215
 
        :type email_host: string
216
 
        :rtype: None
217
 
        """
218
 
        data = {
219
 
            'email_host': email_host,
220
 
        }
221
 
        data.update(**kwargs)
222
 
        try:
223
 
            r = self._post_url('/3.0/domains', data)
224
 
        except:
225
 
            raise MailmanRESTClientError('Unable to create domain')
226
 
 
227
 
        return r
228