msp: make the MSP gateway URL variable, add proxy access_token support
This commit is contained in:
parent
41bbdc37b9
commit
670fe83314
|
@ -11,7 +11,7 @@ class FileWithPreviewAndStrongboxWidget(FileWithPreviewWidget):
|
|||
data-url="%smyspace/strongbox/pick"
|
||||
rel="popup">%s</span></p>''') % (
|
||||
root_url, _('Use file from strongbox'))
|
||||
if get_publisher().has_site_option('msp') and not self.preview:
|
||||
if get_publisher().get_site_option('msp') is not None and not self.preview:
|
||||
get_response().add_javascript(['../../aq/js/msp.js'])
|
||||
root_url = get_publisher().get_root_url()
|
||||
t += htmltext('''<p class="use-file-from-msp"><span
|
||||
|
|
|
@ -9,46 +9,67 @@ from quixote import get_publisher, get_request, redirect, get_response, get_sess
|
|||
from quixote.directory import AccessControlled, Directory
|
||||
|
||||
import qommon.form
|
||||
from qommon.misc import http_post_request, http_get_page
|
||||
|
||||
authorize_url = 'https://portail-citoyen.dev.au-quotidien.com/msp/authorize/'
|
||||
documents_url = 'https://portail-citoyen.dev.au-quotidien.com/msp/documents/'
|
||||
document_url = 'https://portail-citoyen.dev.au-quotidien.com/msp/documents/%s/'
|
||||
|
||||
class MSPDirectory(Directory):
|
||||
_q_exports = ['', 'pick', 'download']
|
||||
|
||||
def fix_document(self, document, site_charset):
|
||||
@property
|
||||
def msp_gateway_base_url(self):
|
||||
return get_publisher().get_site_option('msp')
|
||||
|
||||
@property
|
||||
def authorize_url(self):
|
||||
return urlparse.urljoin(self.msp_gateway_base_url, 'authorize/')
|
||||
|
||||
@property
|
||||
def access_token_url(self):
|
||||
return urlparse.urljoin(self.msp_gateway_base_url, 'access_token/')
|
||||
|
||||
@property
|
||||
def documents_url(self):
|
||||
return urlparse.urljoin(self.msp_gateway_base_url, 'documents/')
|
||||
|
||||
@property
|
||||
def document_url(self):
|
||||
return urlparse.urljoin(self.msp_gateway_base_url, 'documents/%s/')
|
||||
|
||||
@property
|
||||
def client_id(self):
|
||||
return get_publisher().get_site_option('msp_client_id')
|
||||
|
||||
@property
|
||||
def client_secret(self):
|
||||
return get_publisher().get_site_option('msp_client_secret')
|
||||
|
||||
def fix_document(self, document):
|
||||
site_charset = get_publisher().site_charset
|
||||
for key, value in document.iteritems():
|
||||
# date are returned as millisecond POSIX timestamp,
|
||||
# it should be ISO-8601 instead
|
||||
if key.endswith('Date') and value is not None:
|
||||
document[key] = unicode(datetime.date.fromtimestamp(value // 1000))
|
||||
value = document[key] = document[key].replace(u'-', u'\u2011')
|
||||
if isinstance(value, unicode) and key != 'content':
|
||||
document[key] = value.encode(site_charset)
|
||||
|
||||
def get_documents(self, code):
|
||||
params = {
|
||||
'code': code,
|
||||
'redirect_uri': authorize_url,
|
||||
}
|
||||
url = '%s?%s' % (documents_url, urllib.urlencode(params))
|
||||
content = urllib2.urlopen(url).read()
|
||||
def get_documents(self, access_token):
|
||||
response, status, content, auth_header = http_get_page(self.documents_url, {
|
||||
'Authorization': 'Bearer %s' % access_token,
|
||||
});
|
||||
documents = json.loads(content)
|
||||
'<ul>'
|
||||
site_charset = get_publisher().site_charset
|
||||
for document in documents:
|
||||
self.fix_document(document, site_charset)
|
||||
self.fix_document(document)
|
||||
return documents
|
||||
|
||||
def get_document(self, code, doc_id):
|
||||
params = {
|
||||
'code': code,
|
||||
'redirect_uri': authorize_url,
|
||||
}
|
||||
url = '%s?%s' % (document_url % doc_id, urllib.urlencode(params))
|
||||
content = urllib2.urlopen(url).read()
|
||||
def get_document(self, doc_id, access_token):
|
||||
response, status, content, auth_header = http_get_page(
|
||||
self.document_url % doc_id,
|
||||
{ 'Authorization': 'Bearer %s' % access_token, }
|
||||
);
|
||||
document = json.loads(content)
|
||||
site_charset = get_publisher().site_charset
|
||||
self.fix_document(document, site_charset)
|
||||
self.fix_document(document)
|
||||
return document
|
||||
|
||||
def authorize(self, self_url, scope):
|
||||
|
@ -58,7 +79,19 @@ class MSPDirectory(Directory):
|
|||
'scope': scope,
|
||||
}
|
||||
return redirect('%s?%s' % (
|
||||
authorize_url, urllib.urlencode(params)))
|
||||
self.authorize_url, urllib.urlencode(params)))
|
||||
|
||||
def access_token(self, self_url, code):
|
||||
params = {
|
||||
'code': code,
|
||||
'client_id': self.client_id,
|
||||
'client_secret': self.client_secret,
|
||||
'grant_type': 'authorization_code',
|
||||
'redirect_uri': self_url,
|
||||
}
|
||||
response, status, data, auth_header = http_post_request(self.access_token_url,
|
||||
urllib.urlencode(params), { 'Content-Type': 'application/x-www-form-urlencoded' })
|
||||
return json.loads(data)['access_token']
|
||||
|
||||
def pick (self):
|
||||
request = get_request()
|
||||
|
@ -69,9 +102,10 @@ class MSPDirectory(Directory):
|
|||
|
||||
if 'code' not in request.form and 'error' not in request.form:
|
||||
return self.authorize(self_url, 'LIST_DOCS')
|
||||
return self.pick_display(request.form['code'])
|
||||
access_token = self.access_token(self_url, request.form['code'])
|
||||
return self.pick_display(access_token)
|
||||
|
||||
def pick_display [html] (self, code):
|
||||
def pick_display [html] (self, access_token):
|
||||
request = get_request()
|
||||
|
||||
get_response().add_javascript(['jquery.js',
|
||||
|
@ -85,7 +119,7 @@ class MSPDirectory(Directory):
|
|||
'<h2>%s</h2>' % _('Pick a file')
|
||||
|
||||
if 'error' not in request.form:
|
||||
documents = self.get_documents(code)
|
||||
documents = self.get_documents(access_token)
|
||||
'<table id="msp-pick-file-table" class="sortable tablesorter">'
|
||||
'<thead>'
|
||||
'<tr>'
|
||||
|
@ -135,7 +169,8 @@ class MSPDirectory(Directory):
|
|||
if 'error' in request.form:
|
||||
return self.download_error()
|
||||
else:
|
||||
document = self.get_document(request.form['code'], doc_id)
|
||||
access_token = self.access_token(self_url, request.form['code'])
|
||||
document = self.get_document(doc_id, access_token)
|
||||
download = qommon.form.PicklableUpload(document['name'],
|
||||
content_type='application/pdf')
|
||||
download.__setstate__({
|
||||
|
|
Reference in New Issue