api: allow multiple occurences of same document in portfolio (#23339)

This commit is contained in:
Frédéric Péters 2018-04-23 14:52:39 +02:00
parent ef7a272c3f
commit 6d753a0f45
3 changed files with 12 additions and 3 deletions

View File

@ -125,15 +125,15 @@ class PushDocument(CommonAPIMixin, GenericAPIView):
document, created = Document.objects.get_or_create(
content_hash=content_hash,
defaults={'content': document_file})
if not created:
raise api_errors.APIError('DOCUMENT_EXISTS')
user_document = UserDocument(
user_document, created = UserDocument.objects.get_or_create(
user=data.get('user'),
filename=data.get('file_name'),
document=document,
origin=origin,
deletable_by_user=data.get('deletable_by_user'))
if not created:
raise api_errors.APIError('DOCUMENT_EXISTS')
user_document.save()
response_status = status.HTTP_200_OK

View File

@ -76,6 +76,7 @@ class UserDocument(models.Model):
verbose_name = _('user document')
verbose_name_plural = _('user documents')
ordering = ('-created', 'user')
unique_together = ('user', 'filename', 'document', 'origin', 'deletable_by_user')
@property
def filename_encoded(self):

View File

@ -98,6 +98,14 @@ def test_push_document(app, admin_user, john_doe):
assert models.UserDocument.objects.count() == 3 # new document
assert models.UserDocument.objects.filter(deletable_by_user=True).count() == 2
# same document
data['file_b64_content'] = base64.b64encode('coin3')
data['deletable_by_user'] = True
response = app.post_json(url, params=data, status=400)
assert response.json['result'] == 0
assert response.json['errors'][0]['code'] == 'document-exists'
assert models.UserDocument.objects.count() == 3 # no new document
def test_push_document_max_document_size(app, private_settings, admin_user, john_doe):
private_settings.FARGO_MAX_DOCUMENT_SIZE = 1