Features
* function 'echofile()' support for posted file content, not just url Bug fix * corrected file content in function 'afile()' * corrected payload assignment in function 'get_fwd_files_status()' * added 'type_dossier' to job creation in function 'create_dossier()' Coding style: better indentation Logging : 'debug' instead of 'info' Locale : identifier in english instead of french
This commit is contained in:
parent
0d4b51e9ba
commit
01660430af
|
@ -143,7 +143,7 @@ class AtrealOpenads(BaseResource):
|
|||
"""API that proxy/relay communications with/to openADS."""
|
||||
myjobs = jsonfield.JSONField(default={})
|
||||
collectivite = models.CharField(_('Collectivity (identifier)'), max_length=255,
|
||||
help_text=_('ex: Marseille, ou ex: 3'), default='', blank=True)
|
||||
help_text=_('ex: Marseille, or ex: 3'), default='', blank=True)
|
||||
openADS_API_key = models.CharField(_('openADS API key (secret)'), max_length=255,
|
||||
help_text=_('ex: ah9pGbKKHv5ToF3cPQuV'), default='')
|
||||
openADS_API_url = models.URLField(_('openADS API URL'), max_length=255,
|
||||
|
@ -176,10 +176,10 @@ class AtrealOpenads(BaseResource):
|
|||
description="[DEV] Return what it has received",
|
||||
methods=['get','post'],
|
||||
parameters={
|
||||
'body': {'description': _('Dump body'), 'example_value': 'True'},
|
||||
'COOKIES': {'description': _('Dump cookies'), 'example_value': 'True'},
|
||||
'META': {'description': _('Dump meta'), 'example_value': 'True'},
|
||||
'empty': {'description': _('Dump empty values'), 'example_value': 'True'}
|
||||
'body' : {'description': _('Dump body') , 'example_value': 'True'},
|
||||
'COOKIES': {'description': _('Dump cookies') , 'example_value': 'True'},
|
||||
'META' : {'description': _('Dump meta') , 'example_value': 'True'},
|
||||
'empty' : {'description': _('Dump empty values'), 'example_value': 'True'}
|
||||
})
|
||||
def echo(self, request, body=False, cookies=False, meta=False, empty=False, **kwargs):
|
||||
req_infos = {}
|
||||
|
@ -215,14 +215,14 @@ class AtrealOpenads(BaseResource):
|
|||
description="[DEV] Return the file it has received encoded in base64",
|
||||
methods=['post'])
|
||||
def echofile(self, request, *args, **kwargs):
|
||||
self.logger.info("echofile() request.content_type = '%s'" % request.content_type)
|
||||
self.logger.info("echofile() len(request.body) = '%d'" % len(request.body))
|
||||
self.logger.debug("echofile() request.content_type = '%s'" % request.content_type)
|
||||
self.logger.debug("echofile() len(request.body) = '%d', type(request.body) = '%s'" % (len(request.body), request.body.__class__))
|
||||
if request.content_type == 'application/json' and len(request.body):
|
||||
json_data = json.loads(request.body)
|
||||
self.logger.info("echofile() 'url' in json = '%s'" % str('url' in json_data))
|
||||
self.logger.debug("echofile() 'url' in json = '%s'" % str('url' in json_data))
|
||||
if 'url' in json_data:
|
||||
url = json_data['url']
|
||||
self.logger.info("echofile() url = '%s'" % url)
|
||||
self.logger.debug("echofile() url = '%s'" % url)
|
||||
|
||||
try:
|
||||
response = self.requests.get(url)
|
||||
|
@ -230,32 +230,46 @@ class AtrealOpenads(BaseResource):
|
|||
raise APIError(
|
||||
'API-WCS connection error: %s' % response.status_code,
|
||||
data={
|
||||
'url': url,
|
||||
'url' : url,
|
||||
'error': six.text_type(e)
|
||||
})
|
||||
|
||||
self.logger.info("echofile() response is '%s' (%s)" % (response, response.__class__))
|
||||
self.logger.debug("echofile() response is '%s' (%s)" % (response, response.__class__))
|
||||
|
||||
self.logger.info("echofile() response.status_code = '%s'" % response.status_code)
|
||||
self.logger.debug("echofile() response.status_code = '%s'" % response.status_code)
|
||||
if response.status_code != 200:
|
||||
raise APIError(
|
||||
'API-WCS returned a non 200 status %s: %s' % response.status_code,
|
||||
data={
|
||||
'status_code': response.status_code,
|
||||
'url': url
|
||||
'url' : url
|
||||
})
|
||||
|
||||
if 'content-type' in response.headers:
|
||||
self.logger.info("echofile() response['content-type'] = '%s'" % response.headers['content-type'])
|
||||
self.logger.debug("echofile() response['content-type'] = '%s'" % response.headers['content-type'])
|
||||
if 'content-disposition' in response.headers:
|
||||
self.logger.info("echofile() response['content-disposition'] = '%s'" % response.headers['content-disposition'])
|
||||
self.logger.info("echofile() response.content[:50] = '%s'" % response.content[:50])
|
||||
self.logger.debug("echofile() response['content-disposition'] = '%s'" % response.headers['content-disposition'])
|
||||
self.logger.debug("echofile() response.content[:50] = '%s'" % response.content[:50])
|
||||
return {
|
||||
'content_type': response.content_type if hasattr(response, 'content_type') else 'application/octet-stream',
|
||||
'content': base64.b64encode(response.content)
|
||||
'content_type' : response.content_type if hasattr(response, 'content_type') else 'application/octet-stream',
|
||||
'content' : base64.b64encode(response.content)
|
||||
}
|
||||
|
||||
elif 'b64_content' in json_data:
|
||||
content = json_data['b64_content']
|
||||
content_type = None
|
||||
filename = None
|
||||
if 'content_type' in json_data:
|
||||
content_type = json_data['content_type']
|
||||
if 'filename' in json_data:
|
||||
filename = json_data['filename']
|
||||
return {
|
||||
'filename' : filename,
|
||||
'content_type' : content_type,
|
||||
'content' : content
|
||||
}
|
||||
|
||||
raise ValueError("invalid request payload (no 'url' key found)")
|
||||
raise ValueError("invalid request payload (no 'url' or 'b64_content' key found)")
|
||||
|
||||
raise ValueError("invalid content type of request '%s' (but must be '%s')" % (request.content_type, 'application/json'))
|
||||
|
||||
|
@ -271,13 +285,13 @@ class AtrealOpenads(BaseResource):
|
|||
rand_id = base64.urlsafe_b64encode(os.urandom(6))
|
||||
self.add_job('ajob', natural_id=rand_id, dossier_id=rand_id)
|
||||
if format == 'base64':
|
||||
return TRAC_ICO_B64_CONTENT
|
||||
return get_file_data(TEST_FILE_TRAC_ICO)
|
||||
elif format[:4] == 'json':
|
||||
json = {
|
||||
'afile': {
|
||||
'filename': 'trac.ico',
|
||||
'filename' : 'trac.ico',
|
||||
'content_type': 'image/x-icon',
|
||||
'b64_content': TRAC_ICO_B64_CONTENT
|
||||
'b64_content' : get_file_data(TEST_FILE_TRAC_ICO)
|
||||
},
|
||||
'extra_info': 'blabla'
|
||||
}
|
||||
|
@ -285,7 +299,7 @@ class AtrealOpenads(BaseResource):
|
|||
return { 'data': json }
|
||||
return json
|
||||
else:
|
||||
raw_content = base64.b64decode(TRAC_ICO_B64_CONTENT)
|
||||
raw_content = get_file_data(TEST_FILE_TRAC_ICO, b64=False)
|
||||
return HttpResponse(raw_content, content_type='image/x-icon')
|
||||
#return FileResponse(raw_content, content_type='image/x-icon')
|
||||
|
||||
|
@ -293,13 +307,13 @@ class AtrealOpenads(BaseResource):
|
|||
"""A test job."""
|
||||
self.myjobs[dossier_id] = 'started'
|
||||
self.save()
|
||||
self.logger.info("Started ajob() %s" % dossier_id)
|
||||
self.logger.debug("Started ajob() %s" % dossier_id)
|
||||
for i in range(10):
|
||||
self.logger.info("Updated ajob() %s" % dossier_id)
|
||||
self.logger.debug("Updated ajob() %s" % dossier_id)
|
||||
self.myjobs[dossier_id] = 'running'
|
||||
self.save()
|
||||
time.sleep(10)
|
||||
self.logger.info("Ended ajob() %s" % dossier_id)
|
||||
self.logger.debug("Ended ajob() %s" % dossier_id)
|
||||
self.myjobs[dossier_id] = 'ended'
|
||||
self.save()
|
||||
|
||||
|
@ -315,7 +329,7 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<type_dossier>\w+)/?$',
|
||||
example_pattern='{type_dossier}/',
|
||||
parameters={
|
||||
'type_dossier': {'description': _('Type de dossier'), 'example_value': 'DIA'}
|
||||
'type_dossier': {'description': _("Type of 'dossier'"), 'example_value': 'DIA'}
|
||||
})
|
||||
def create_dossier(self, request, type_dossier, *args, **kwargs):
|
||||
payload = {
|
||||
|
@ -377,7 +391,7 @@ class AtrealOpenads(BaseResource):
|
|||
except ValueError:
|
||||
raise APIError('No JSON content returned: %r' % response.content[:1000])
|
||||
numero_dossier = result.get('numero_dossier')
|
||||
recepisse = result.get('files')[0]
|
||||
recepisse = result['files'][0]
|
||||
try:
|
||||
recepisse_content = base64.b64decode(recepisse['b64_content'])
|
||||
except TypeError:
|
||||
|
@ -392,9 +406,10 @@ class AtrealOpenads(BaseResource):
|
|||
file_ids.append(fwd_file.id)
|
||||
|
||||
self.add_job('upload_user_files',
|
||||
natural_id=numero_dossier,
|
||||
numero_dossier=numero_dossier,
|
||||
file_ids=file_ids)
|
||||
natural_id=numero_dossier,
|
||||
type_dossier=type_dossier,
|
||||
numero_dossier=numero_dossier,
|
||||
file_ids=file_ids)
|
||||
|
||||
return {'data': response.json()}
|
||||
|
||||
|
@ -424,8 +439,8 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<type_dossier>\w+)/(?P<numero_dossier>\w+)/?$',
|
||||
example_pattern='{type_dossier}/{numero_dossier}/',
|
||||
parameters={
|
||||
'type_dossier': {'description': _('Type de dossier'), 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _('Numero de dossier'), 'example_value': 'DIA0130551900001'}
|
||||
'type_dossier' : {'description': _("Type of 'dossier'") , 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _("Identifier for 'dossier'"), 'example_value': 'DIA0130551900001'}
|
||||
})
|
||||
def get_dossier(self, request, type_dossier, numero_dossier, *args, **kwargs):
|
||||
url = urlparse.urljoin(self.openADS_API_url, '/dossier/%s/%s' % (type_dossier, numero_dossier))
|
||||
|
@ -436,11 +451,11 @@ class AtrealOpenads(BaseResource):
|
|||
result = response.json()
|
||||
except ValueError:
|
||||
raise APIError('No JSON content returned: %r' % response.content[:1000])
|
||||
etat = result.get('etat')
|
||||
date_depot = result.get('date_depot')
|
||||
date_limite_instruction = result.get('date_limite_instruction')
|
||||
etat = result.get('etat')
|
||||
date_depot = result.get('date_depot')
|
||||
date_decision = result.get('date_decision')
|
||||
decision = result.get('decision')
|
||||
decision = result.get('decision')
|
||||
date_limite_instruction = result.get('date_limite_instruction')
|
||||
return {'data': response.json()}
|
||||
|
||||
|
||||
|
@ -449,8 +464,8 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<type_dossier>\w+)/(?P<numero_dossier>\w+)/?$',
|
||||
example_pattern='{type_dossier}/{numero_dossier}/',
|
||||
parameters={
|
||||
'type_dossier': {'description': _('Type de dossier'), 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _('Numero de dossier'), 'example_value': 'DIA0130551900001'}
|
||||
'type_dossier' : {'description': _("Type of 'dossier'") , 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _("Identifier for 'dossier'"), 'example_value': 'DIA0130551900001'}
|
||||
})
|
||||
def add_file(self, request, type_dossier, numero_dossier, *args, **kwargs):
|
||||
dia_b64 = get_file_data(TEST_FILE_CERFA_DIA)
|
||||
|
@ -479,19 +494,24 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<type_dossier>\w+)/(?P<numero_dossier>\w+)/?$',
|
||||
example_pattern='{type_dossier}/{numero_dossier}/',
|
||||
parameters={
|
||||
'type_dossier': {'description': _('Type de dossier'), 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _('Numero de dossier'), 'example_value': 'DIA0130551900001'}
|
||||
'type_dossier' : {'description': _("Type of 'dossier'") , 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _("Identifier for 'dossier'"), 'example_value': 'DIA0130551900001'}
|
||||
})
|
||||
def add_file_async(self, request, type_dossier, numero_dossier, *args, **kwargs):
|
||||
f = TEST_FILE_CERFA_DIA
|
||||
fwd_file = self.upload2ForwardFile(f, numero_dossier)
|
||||
fwd_file.save()
|
||||
self.add_job('upload_user_files',
|
||||
natural_id=numero_dossier,
|
||||
type_dossier=type_dossier,
|
||||
numero_dossier=numero_dossier,
|
||||
file_ids=[fwd_file.id])
|
||||
return {'data': 'upload is pending (async)'}
|
||||
job = self.add_job('upload_user_files',
|
||||
natural_id=numero_dossier,
|
||||
type_dossier=type_dossier,
|
||||
numero_dossier=numero_dossier,
|
||||
file_ids=[fwd_file.id])
|
||||
return {
|
||||
'data': {
|
||||
'message': 'upload is pending (async)',
|
||||
'job_id' : job.id
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@endpoint(
|
||||
|
@ -500,10 +520,11 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<numero_dossier>\w+)(/(?P<fichier_id>\w+))?/?$',
|
||||
example_pattern='{numero_dossier}/{fichier_id}/',
|
||||
parameters={
|
||||
'numero_dossier': {'description': _('Numero de dossier') , 'example_value': 'DIA0130551900001'},
|
||||
'fichier_id' : {'description': _('Identifiant de fichier'), 'example_value': '78'}
|
||||
'numero_dossier': {'description': _("Identifier for 'dossier'"), 'example_value': 'DIA0130551900001'},
|
||||
'fichier_id' : {'description': _("File identifier") , 'example_value': '78'},
|
||||
'summary' : {'description': _("Summary (only)") , 'example_value': '1'}
|
||||
})
|
||||
def get_fwd_files_status(self, request, numero_dossier, fichier_id=None, *args, **kwargs):
|
||||
def get_fwd_files_status(self, request, numero_dossier, fichier_id=None, summary=None, *args, **kwargs):
|
||||
payload = []
|
||||
fwd_files = []
|
||||
if not fichier_id:
|
||||
|
@ -519,6 +540,17 @@ class AtrealOpenads(BaseResource):
|
|||
if fwd_file:
|
||||
fwd_files.append(fwd_file)
|
||||
if fwd_files:
|
||||
|
||||
summary_enabled = summary and len(summary) and summary == '1'
|
||||
if summary_enabled:
|
||||
summary_data = {
|
||||
'all_forwarded': True,
|
||||
'pending' : [],
|
||||
'uploading' : [],
|
||||
'success' : [],
|
||||
'failed' : []
|
||||
}
|
||||
|
||||
for fwd_file in fwd_files:
|
||||
payload.append({
|
||||
'id' : fwd_file.id,
|
||||
|
@ -533,6 +565,16 @@ class AtrealOpenads(BaseResource):
|
|||
'b64_content' : get_file_data(fwd_file.upload_file.path),
|
||||
'last_update_datetime' : fwd_file.last_update_datetime
|
||||
})
|
||||
|
||||
if summary_enabled:
|
||||
status_msg = '[%s] %s => %s' % (fwd_file.id, fwd_file.orig_filename, fwd_file.upload_msg)
|
||||
summary_data[fwd_file.upload_status].append(status_msg)
|
||||
if fwd_file.upload_status != 'success':
|
||||
summary_data['all_forwarded'] = False
|
||||
|
||||
if summary_enabled:
|
||||
payload = summary_data
|
||||
|
||||
return {'data': payload}
|
||||
|
||||
|
||||
|
@ -542,7 +584,7 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<numero_dossier>\w+)/?$',
|
||||
example_pattern='{numero_dossier}/',
|
||||
parameters={
|
||||
'numero_dossier': {'description': _('Numero de dossier'), 'example_value': 'DIA0130551900001'}
|
||||
'numero_dossier': {'description': _("Identifier for 'dossier'"), 'example_value': 'DIA0130551900001'}
|
||||
})
|
||||
def createForwardFile(self, request, numero_dossier, *args, **kwargs):
|
||||
f = TEST_FILE_CERFA_DIA
|
||||
|
@ -556,8 +598,8 @@ class AtrealOpenads(BaseResource):
|
|||
pattern='^(?P<type_dossier>\w+)/(?P<numero_dossier>\w+)/?$',
|
||||
example_pattern='{type_dossier}/{numero_dossier}/',
|
||||
parameters={
|
||||
'type_dossier': {'description': _('Type de dossier'), 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _('Numero de dossier'), 'example_value': 'DIA0130551900001'}
|
||||
'type_dossier' : {'description': _("Type of 'dossier'") , 'example_value': 'DIA'},
|
||||
'numero_dossier': {'description': _("Identifier for 'dossier'"), 'example_value': 'DIA0130551900001'}
|
||||
})
|
||||
def get_courrier(self, request, type_dossier, numero_dossier, *args, **kwargs):
|
||||
url = urlparse.urljoin(
|
||||
|
|
Reference in New Issue