Rename the request_data variable to querystring for clarity. Turn the querystring into an IRI to support international characters in metadata values and allow JSON serializer for Celery.
Signed-off-by: Michael Price <loneviking72@gmail.com>
This commit is contained in:
committed by
Roberto Rosario
parent
b200438c4e
commit
e9a365333f
@@ -1,12 +1,15 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from furl import furl
|
||||
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.six.moves.urllib.parse import unquote_plus
|
||||
|
||||
from .models import DocumentMetadata, MetadataType
|
||||
|
||||
|
||||
def decode_metadata_from_url(url_dict):
|
||||
def decode_metadata_from_querystring(querystring=None):
|
||||
"""
|
||||
Parse a URL query string to a list of metadata
|
||||
"""
|
||||
@@ -15,19 +18,20 @@ def decode_metadata_from_url(url_dict):
|
||||
'value': {}
|
||||
}
|
||||
metadata_list = []
|
||||
# Match out of order metadata_type ids with metadata values from request
|
||||
for key, value in url_dict.items():
|
||||
if 'metadata' in key:
|
||||
index, element = key[8:].split('_')
|
||||
metadata_dict[element][index] = value
|
||||
if querystring:
|
||||
# Match out of order metadata_type ids with metadata values from request
|
||||
for key, value in furl(querystring).args.items():
|
||||
if 'metadata' in key:
|
||||
index, element = key[8:].split('_')
|
||||
metadata_dict[element][index] = value
|
||||
|
||||
# Convert the nested dictionary into a list of id+values dictionaries
|
||||
for order, identifier in metadata_dict['id'].items():
|
||||
if order in metadata_dict['value'].keys():
|
||||
metadata_list.append({
|
||||
'id': identifier,
|
||||
'value': metadata_dict['value'][order]
|
||||
})
|
||||
# Convert the nested dictionary into a list of id+values dictionaries
|
||||
for order, identifier in metadata_dict['id'].items():
|
||||
if order in metadata_dict['value'].keys():
|
||||
metadata_list.append({
|
||||
'id': identifier,
|
||||
'value': metadata_dict['value'][order]
|
||||
})
|
||||
|
||||
return metadata_list
|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from metadata.api import decode_metadata_from_url, save_metadata_list
|
||||
from metadata.api import (
|
||||
decode_metadata_from_querystring, save_metadata_list
|
||||
)
|
||||
from metadata.forms import DocumentMetadataFormSet
|
||||
|
||||
from sources.wizards import WizardStep, WizardStepDocumentType
|
||||
@@ -56,8 +58,8 @@ class WizardStepMetadata(WizardStep):
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def step_post_upload_process(cls, document, request_data=None):
|
||||
metadata_dict_list = decode_metadata_from_url(url_dict=request_data)
|
||||
def step_post_upload_process(cls, document, querystring=None):
|
||||
metadata_dict_list = decode_metadata_from_querystring(querystring=querystring)
|
||||
if metadata_dict_list:
|
||||
save_metadata_list(
|
||||
metadata_list=metadata_dict_list, document=document,
|
||||
|
||||
@@ -101,22 +101,22 @@ class Source(models.Model):
|
||||
compressed_file = CompressedFile(file_object)
|
||||
for compressed_file_child in compressed_file.children():
|
||||
kwargs.update({'label': force_text(compressed_file_child)})
|
||||
return self.upload_document(
|
||||
self.upload_document(
|
||||
file_object=File(compressed_file_child), **kwargs
|
||||
)
|
||||
compressed_file_child.close()
|
||||
|
||||
except NotACompressedFile:
|
||||
logging.debug('Exception: NotACompressedFile')
|
||||
return self.upload_document(file_object=file_object, **kwargs)
|
||||
self.upload_document(file_object=file_object, **kwargs)
|
||||
else:
|
||||
return self.upload_document(file_object=file_object, **kwargs)
|
||||
self.upload_document(file_object=file_object, **kwargs)
|
||||
|
||||
def get_upload_file_object(self, form_data):
|
||||
pass
|
||||
# TODO: Should raise NotImplementedError?
|
||||
|
||||
def upload_document(self, file_object, document_type, description=None, label=None, language=None, request_data=None, user=None):
|
||||
def upload_document(self, file_object, document_type, description=None, label=None, language=None, querystring=None, user=None):
|
||||
"""
|
||||
Upload an individual document
|
||||
"""
|
||||
@@ -158,7 +158,7 @@ class Source(models.Model):
|
||||
raise
|
||||
else:
|
||||
WizardStep.post_upload_process(
|
||||
document=document, request_data=request_data
|
||||
document=document, querystring=querystring
|
||||
)
|
||||
return document
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ def task_check_interval_source(source_id):
|
||||
|
||||
|
||||
@app.task(bind=True, default_retry_delay=DEFAULT_SOURCE_TASK_RETRY_DELAY, ignore_result=True)
|
||||
def task_upload_document(self, source_id, document_type_id, shared_uploaded_file_id, description=None, label=None, language=None, request_data=None, user_id=None):
|
||||
def task_upload_document(self, source_id, document_type_id, shared_uploaded_file_id, description=None, label=None, language=None, querystring=None, user_id=None):
|
||||
SharedUploadedFile = apps.get_model(
|
||||
app_label='common', model_name='SharedUploadedFile'
|
||||
)
|
||||
@@ -65,7 +65,7 @@ def task_upload_document(self, source_id, document_type_id, shared_uploaded_file
|
||||
source.upload_document(
|
||||
file_object=file_object, document_type=document_type,
|
||||
description=description, label=label, language=language,
|
||||
request_data=request_data, user=user,
|
||||
querystring=querystring, user=user,
|
||||
)
|
||||
|
||||
except OperationalError as exception:
|
||||
@@ -86,7 +86,7 @@ def task_upload_document(self, source_id, document_type_id, shared_uploaded_file
|
||||
|
||||
|
||||
@app.task(bind=True, default_retry_delay=DEFAULT_SOURCE_TASK_RETRY_DELAY, ignore_result=True)
|
||||
def task_source_handle_upload(self, document_type_id, shared_uploaded_file_id, source_id, description=None, expand=False, label=None, language=None, skip_list=None, request_data=None, user_id=None):
|
||||
def task_source_handle_upload(self, document_type_id, shared_uploaded_file_id, source_id, description=None, expand=False, label=None, language=None, querystring=None, skip_list=None, user_id=None):
|
||||
SharedUploadedFile = apps.get_model(
|
||||
app_label='common', model_name='SharedUploadedFile'
|
||||
)
|
||||
@@ -113,8 +113,8 @@ def task_source_handle_upload(self, document_type_id, shared_uploaded_file_id, s
|
||||
|
||||
kwargs = {
|
||||
'description': description, 'document_type_id': document_type.pk,
|
||||
'label': label, 'language': language,
|
||||
'source_id': source_id, 'request_data': request_data, 'user_id': user_id
|
||||
'label': label, 'language': language, 'querystring': querystring,
|
||||
'source_id': source_id, 'user_id': user_id
|
||||
}
|
||||
|
||||
if not skip_list:
|
||||
@@ -150,7 +150,7 @@ def task_source_handle_upload(self, document_type_id, shared_uploaded_file_id, s
|
||||
source_id=source_id, description=description,
|
||||
expand=expand, label=label,
|
||||
language=language,
|
||||
skip_list=skip_list, request_data=request_data,
|
||||
skip_list=skip_list, querystring=querystring,
|
||||
user_id=user_id
|
||||
)
|
||||
return
|
||||
|
||||
@@ -147,12 +147,13 @@ class DocumentUploadMetadataTestCase(MetadataTypeMixin, GenericDocumentViewTestC
|
||||
|
||||
# Upload the test document
|
||||
with open(TEST_SMALL_DOCUMENT_PATH) as file_descriptor:
|
||||
self.post(
|
||||
response = self.post(
|
||||
path=url, data={
|
||||
'document-language': 'eng', 'source-file': file_descriptor,
|
||||
'document_type_id': self.document_type.pk,
|
||||
}, follow=True
|
||||
}
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(Document.objects.count(), 1)
|
||||
self.assertEqual(
|
||||
Document.objects.first().metadata.first().value,
|
||||
|
||||
@@ -4,7 +4,7 @@ from django.contrib import messages
|
||||
from django.http import HttpResponseRedirect, JsonResponse
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.encoding import force_text, uri_to_iri
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from acls.models import AccessControlList
|
||||
@@ -248,7 +248,11 @@ class UploadInteractiveView(UploadBaseView):
|
||||
expand=expand,
|
||||
label=label,
|
||||
language=forms['document_form'].cleaned_data.get('language'),
|
||||
request_data=self.request.GET,
|
||||
querystring=uri_to_iri(
|
||||
'?{}&{}'.format(
|
||||
self.request.GET.urlencode(), self.request.POST.urlencode()
|
||||
)
|
||||
),
|
||||
shared_uploaded_file_id=shared_uploaded_file.pk,
|
||||
source_id=self.source.pk,
|
||||
user_id=user_id,
|
||||
|
||||
@@ -47,16 +47,18 @@ class WizardStep(object):
|
||||
return {}
|
||||
|
||||
@classmethod
|
||||
def post_upload_process(cls, document, request_data=None):
|
||||
def post_upload_process(cls, document, querystring=None):
|
||||
for step in cls.get_all():
|
||||
step.step_post_upload_process(document=document, request_data=request_data)
|
||||
step.step_post_upload_process(
|
||||
document=document, querystring=querystring
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def register(cls, step):
|
||||
cls._registry[step.name] = step
|
||||
|
||||
@classmethod
|
||||
def step_post_upload_process(cls, document, request_data=None):
|
||||
def step_post_upload_process(cls, document, querystring=None):
|
||||
pass
|
||||
|
||||
|
||||
@@ -158,4 +160,5 @@ class DocumentCreateWizard(SessionWizardView):
|
||||
urlencode(query_dict, doseq=True)
|
||||
]
|
||||
)
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@@ -41,13 +41,11 @@ class WizardStepTags(WizardStep):
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def step_post_upload_process(cls, document, request_data=None):
|
||||
f = furl(request_data)
|
||||
f.args.getlist('tags')
|
||||
|
||||
def step_post_upload_process(cls, document, querystring=None):
|
||||
furl_instance = furl(querystring)
|
||||
Tag = apps.get_model(app_label='tags', model_name='Tag')
|
||||
|
||||
for tag in Tag.objects.filter(pk__in=request_data.getlist('tags')):
|
||||
for tag in Tag.objects.filter(pk__in=furl_instance.args.getlist('tags')):
|
||||
tag.documents.add(document)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user