Projet

Général

Profil

0001-replace-urllib-calls-by-requests-7898.patch

Voir les différences:

Subject: [PATCH] replace urllib calls by requests (#7898)

 passerelle/apps/choosit/models.py |  9 +++----
 passerelle/apps/clicrdv/models.py | 49 +++++++++++++++++----------------------
 passerelle/apps/mobyt/models.py   | 20 +++++++---------
 passerelle/apps/ovh/models.py     | 10 ++++----
 passerelle/apps/oxyd/models.py    | 36 +++++++++++-----------------
 passerelle/apps/solis/solis.py    | 29 ++++++++---------------
 passerelle/apps/solis/test.py     |  8 +++----
 passerelle/repost/models.py       | 15 +++++-------
 8 files changed, 69 insertions(+), 107 deletions(-)
passerelle/apps/choosit/models.py
1 1
import re
2 2
import urllib
3
import urllib2
4 3
import logging
5 4
import json
5
import requests
6 6

  
7 7
from django.utils.translation import ugettext_lazy as _
8 8
from django.db import models
......
60 60
                }
61 61
            try:
62 62
                data = urllib.urlencode([('data', json.dumps(params))])
63
                r = urllib2.Request('http://sms.choosit.com/webservice', data)
64
                p = urllib2.urlopen(r, timeout=5)
65
                output = json.load(p)
66
                p.close()
63
                r = request.get('http://sms.choosit.com/webservice', params=data, timeout=5)
64
                output = r.json()
67 65
            except Exception, e:
68 66
                logging.exception(u'%s unable to send message %s to %s',
69 67
                        self, text, destinations)
......
156 154
        reg = ChoositRegisterWS(self.url, self.key)
157 155
        ws = reg.update(subscriptions, user)
158 156
        return {"message": ws['status']}
159

  
passerelle/apps/clicrdv/models.py
7 7
import base64
8 8
import datetime
9 9
import json
10
import urllib2
10
import requests
11 11

  
12 12
from django.conf import settings
13 13
from django.core.urlresolvers import reverse
......
64 64
        return 'clock'
65 65

  
66 66

  
67
    def get_request(self, uri):
67
    def get_request(self, uri, req='get', data=None, headers=None):
68
        kwargs = {}
68 69
        url = 'https://%s/api/v1/%s' % (self.server, uri)
69 70
        if '?' in url:
70 71
           url = url + '&apikey=%s&format=json' % self.apikey
71 72
        else:
72 73
           url = url + '?apikey=%s&format=json' % self.apikey
73
        req = urllib2.Request(url)
74
        authheader = 'Basic ' + \
75
            base64.encodestring('%s:%s' % (self.username, self.password))[:-1]
76
        req.add_header('Authorization', authheader)
77
        return req
74
        if data:
75
            kwargs.update({'data': data})
76
        if headers:
77
            kwargs.update({'headers': headers})
78
        return requests.request(req, url,
79
                    auth=((self.username, self.password)), **kwargs)
78 80

  
79 81
    def get_json(self, uri):
80
        req = self.get_request(uri)
81
        return json.load(urllib2.urlopen(req))
82
        r = get_request(uri)
83
        return r.json()
82 84

  
83 85
    def get_interventionsets(self, **kwargs):
84 86
        records = self.get_json('interventionsets').get('records')
......
156 158

  
157 159
    def cancel(self, id, **kwargs):
158 160
        appointment_id = int(id)
159
        req = self.get_request('appointments/%s' % appointment_id)
160
        req.get_method = (lambda: 'DELETE')
161
        try:
162
            fd = urllib2.urlopen(req)
163
            none = fd.read()
164
        except urllib2.HTTPError as e:
161
        req = self.get_request('appointments/%s' % appointment_id, 'delete')
162
        if not req.ok():
165 163
            # clicrdv will return a "Bad Request" (HTTP 400) response
166 164
            # when it's not possible to remove an appointment
167 165
            # (for example because it's too late)
168
            response = e.read()
169
            response = json.loads(response)
170
            return {'success': False, 'error': response}
166
            return {'success': False, 'error': req.json()}
171 167
        return {'success': True}
172 168

  
173

  
174 169
    def create_appointment(self, intervention, websource, data):
175 170
        fields = data.get('fields') or {}
176 171
        extra = data.get('extra') or {}
......
206 201
        # optional parameters, if any...
207 202
        for fieldname in (fields.keys() + extra.keys() + data.keys()):
208 203
            if fieldname.startswith('clicrdv_fiche_'):
209
                appointment['fiche'][fieldname[14:]] = get_data(fieldname) or ''
210
        req = self.get_request('appointments')
211
        req.add_data(json.dumps({'appointment': appointment}))
212
        req.add_header('Content-Type', 'application/json')
213
        try:
214
            fd = urllib2.urlopen(req)
215
        except urllib2.HTTPError, e:
204
                appointment['fiche'][fieldname[14:]] = fields[fieldname] or ''
205
        req = self.get_request('appointments',
206
                        data=json.dumps({'appointment': appointment}),
207
                        headers={'Content-Type': 'application/json'})
208
        if not req.ok():
216 209
            try:
217
                error = json.load(e.fp)[0].get('error')
210
                error = req.json().get('error')
218 211
            except:
219 212
                error = 'Unknown error (Passerelle)'
220 213
            return {
......
223 216
            }
224 217
        else:
225 218
            success = True
226
            response = json.load(fd)
219
            response = req.json()
227 220
            appointment_id = response.get('records')[0].get('id')
228 221
            return {
229 222
                'success': True,
passerelle/apps/mobyt/models.py
1 1
import re
2
import urllib
3
import urllib2
4 2
import logging
5
import json
3
import requests
6 4

  
7 5
from django.utils.translation import ugettext_lazy as _
8 6
from django.db import models
......
63 61
        # unfortunately it lacks a batch API...
64 62
        destinations = self.clean_numbers(destinations, self.default_country_code)
65 63
        rcpt = ','.join(destinations)
66
        params = urllib.urlencode({
64
        params = {
67 65
            'user': self.username,
68 66
            'pass': self.password,
69 67
            'rcpt': rcpt,
70 68
            'data': text,
71 69
            'sender': sender,
72 70
            'qty': self.quality
73
            })
71
            }
74 72
        try:
75
            r = urllib2.urlopen(self.URL, params)
73
            r = requests.get(self.URL, params=params)
76 74
        except Exception, e:
77
            logger.error('unable to urlopen %s: %s', self.URL, e)
78
            raise MobytError('unable to urlopen %s: %s' % (self.URL, e))
79
        answer = r.read()
80
        r.close()
81
        if answer[:2] != "OK":
82
            raise MobytError('MobyT error: %r' % answer)
75
            logger.error('unable to open %s: %s', self.URL, e)
76
            raise MobytError('unable to open %s: %s' % (self.URL, e))
77
        if not r.ok():
78
            raise MobytError('MobyT error: %r' % r.content)
83 79
        return { 'message': 'OK' }
passerelle/apps/ovh/models.py
1 1
import re
2
import urllib
3
import urllib2
4 2
import logging
5
import json
3
import requests
6 4

  
7 5
from django.utils.translation import ugettext_lazy as _
8 6
from django.db import models
......
85 83
        }
86 84
        ret = {}
87 85
        try:
88
            stream = urllib.urlopen('%s?%s' % (self.URL, urllib.urlencode(params)))
86
            r = requests.get(self.URL, params=params)
89 87
        except Exception, e:
90 88
            logger.error('unable to urlopen %s: %s', self.URL, e)
91 89
            raise OVHError('unable to urlopen %s: %s' % (self.URL, e))
92 90
        else:
93
            result = json.loads(stream.read())
94
            if 100 <= result['status'] < 200:
91
            result = r.json()
92
            if 100 <= r.status_code < 200:
95 93
                credit_left = float(result['creditLeft'])
96 94
                # update credit left
97 95
                OVHSMSGateway.objects.filter(id=self.id) \
passerelle/apps/oxyd/models.py
1 1
import re
2
import urllib
3
import urllib2
4 2
import logging
5
import json
3
import requests
6 4

  
7 5
from django.db import models
8 6
from django.core.urlresolvers import reverse
......
54 52
        destinations = self.clean_numbers(destinations,
55 53
                self.default_country_code, prefix='')
56 54
        for dest in destinations:
57
            params = urllib.urlencode({
58
                'id': self.username,
59
                'pass': self.password,
60
                'num': number,
61
                'sms': text.encode('utf-8'),
62
                'flash': '0'
63
                })
55
            params = {'id': self.username,
56
                      'pass': self.password,
57
                      'num': number,
58
                      'sms': text.encode('utf-8'),
59
                      'flash': '0'
60
            }
64 61
            try:
65
                r = urllib2.urlopen('http://sms.oxyd.fr/send.php', params)
66
            except Exception, e:
67
                # XXX: add proper handling of errors
68
                logger.error('urlopen oxyd.fr failed : %s', e)
69
                raise OxydError('urlopen oxyd.fr failed : %s' % e)
70
            else:
71
                line = r.read()
72
                code = line.split()[0]
73
                if code != '200':
74
                    logger.error('OXYD error: %r', line)
75
                    raise OxydError('OXYD error: %r' % line)
76
            r.close()
62
                r = requests.get('http://sms.oxyd.fr/send.php', params=params)
63
            except requests.ConnectionError:
64
                logger.error('open oxyd.fr failed : %s', e)
65
                raise OxydError('open oxyd.fr failed : %s' % e)
66
            if not r.ok():
67
                logger.error('OXYD error: %r', r.content)
68
                raise OxydError('OXYD error: %r' % r.content)
77 69

  
78 70
    def get_sms_left(self, type='standard'):
79 71
        raise NotImplementedError
passerelle/apps/solis/solis.py
1 1
import json
2
from urllib2 import Request, urlopen, HTTPError
2
import requests
3 3

  
4 4
# debug (ahem... sort of)
5 5
from config import DEBUG_PATH
......
11 11

  
12 12

  
13 13
def post(uri, data, base_url=BASE_URL):
14
    headers = {'Accept': 'application/json',
15
               'Content-Type': 'application/json;charset=UTF-8'
16
    }
14 17
    url = base_url + uri
15
    r = Request(url)
16
    r.add_header('Accept', 'application/json')
17
    r.add_header('Content-Type', 'application/json;charset=UTF-8')
18
    r.add_data(data)
19
    try:
20
        p = urlopen(r)
21
    except HTTPError as e:
22
        code = e.code
23
        out_data = 'read:\n%s' % e.read()
24
    else:
25
        code = p.getcode()
26
        out_data = p.read()
27
        p.close()
18
    r = requests.get(url, data=data, headers=headers)
19
    code = r.status_code
28 20
    if DEBUG_PATH:
29 21
        f = open(os.path.join(DEBUG_PATH, datetime.now().strftime('%Y%m%d-%H%M%S.txt')), 'a')
30 22
        f.write('url: %s\nCODE: %s\nIN\n---\n' % (url, code))
......
34 26
            f.write('NOT JSON: %s' % data)
35 27
        f.write('\n---\nOUT\n---\n')
36 28
        try:
37
            pprint(json.loads(out_data), f)
29
            pprint(r.json(), f)
38 30
        except:
39
            f.write('(NOT JSON)\n%s' % out_data)
31
            f.write('(NOT JSON)\n%s' % r.content)
40 32
        f.write('\n---\n')
41 33
        f.close()
42
    return code, out_data
34
    return code, r.content
43 35

  
44 36
def export_flow(flow, req, base_url=BASE_URL):
45 37
    uri = 'exportFlow?flow=%s&application=AsgTeleprocedureApa14' % flow
......
83 75
        "ConciliationInputWS": {
84 76
            "Block": block,
85 77
            "Input": {
86
                "Settings": { "Setting": setting, }, 
78
                "Settings": { "Setting": setting, },
87 79
                "Criteria": { "Criterium": criterium },
88 80
                },
89 81
            "Output": { "ReturnDatas": { "returnData": returndata }, },
......
166 158
            entries = [entries]
167 159
        l += entries
168 160
    return {'results': l, 'name': name, 'count': count, 'error': False}
169

  
passerelle/apps/solis/test.py
2 2
import config
3 3

  
4 4
from pprint import pprint
5
import urllib2
6 5
from datetime import datetime
7 6
import json
8 7
import sys
......
143 142
    try:
144 143
        code, data = solis.import_flow('ImportIntegrationDemande', dem)
145 144
        pprint(json.loads(data))
146
    except urllib2.HTTPError as e:
147
        print 'erreur', e.code
148
        print e.read()
145
    except:
146
        print 'erreur', code
147
        print data
149 148

  
150 149
if __name__ == '__main__':
151 150
    for t in sys.argv[1:]:
......
160 159
    dem['Beneficiaire']['dateNaissance'] = dn
161 160
    dem = {'ImportInputWSDemandeApa':DEMANDE_APA_MINIMALE}
162 161
    return solis.import_flow('ImportIntegrationDemande', dem)
163

  
passerelle/repost/models.py
1 1
import json
2
from urllib2 import Request, urlopen
2
import requests
3 3

  
4 4
from django.db import models
5 5
from passerelle.base.models import BaseResource
......
9 9
    timeout = models.IntegerField(null=True, blank=True)
10 10

  
11 11
    def repost(self, data, **kwargs):
12
        r = Request(self.url)
13
        r.add_header('Accept', 'application/json')
14
        r.add_header('Content-Type', 'application/json;charset=UTF-8')
15
        r.add_data(json.dumps(data))
12
        headers = {'Accept': 'application/json',
13
                   'Content-Type': 'application/json;charset=UTF-8'}
16 14
        if self.timeout:
17
            p = urlopen(r, timeout=self.timeout)
15
            r = requests.get(self.url, data=data, timeout=self.timeout)
18 16
        else:
19
            p = urlopen(r)
20
        out_data = json.loads(p.read())
21
        p.close()
17
            r = requests.get(self.url, data=data)
18
        return r.json()
22 19
        return out_data
23
-