Skip to content
Snippets Groups Projects
Commit 642877a0 authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'import-volume' into 'master'

Import from files into volume

See merge request !144
parents a13535e3 d83a61ef
No related branches found
No related tags found
1 merge request!144Import from files into volume
......@@ -97,16 +97,28 @@ class DataImportFromFiles(CreateAPIView):
files = serializer.validated_data['files']
corpus = files[0].corpus
mode = serializer.validated_data['mode']
# Serializer validation codes returns a volume for 'volume_id'
volume = serializer.validated_data.get('volume_id')
volume_name = serializer.validated_data.get('volume_name')
if volume:
# The files' corpus is already validated as writable
if volume.corpus != corpus:
raise ValidationError('Volume and files are in different corpora')
else:
if not volume_name:
if mode == DataImportMode.PDF:
suffix = os.path.splitext(files[0].name)[0]
else:
suffix = datetime.today().strftime('%Y-%m-%d %H:%M')
volume_name = 'Import {} {}'.format(mode.value, suffix)
volume = corpus.elements.create(
name=volume_name,
type=ElementType.Volume,
)
volume.events.create(type=EventType.Addition)
suffix = datetime.today().strftime('%Y-%m-%d %H:%M')
if mode == DataImportMode.PDF:
suffix = os.path.splitext(files[0].name)[0]
volume = corpus.elements.create(
name='Import {} {}'.format(mode.value, suffix),
type=ElementType.Volume,
)
volume.events.create(type=EventType.Addition)
self.dataimport = corpus.imports.create(
creator=self.request.user,
state=DataImportState.Configured,
......
......@@ -5,7 +5,7 @@ from arkindex.dataimport.models import (
DataImport, DataImportMode, DataImportState, DataImportFailure, DataFile,
Repository, Revision, Event, EventType
)
from arkindex.documents.models import Corpus
from arkindex.documents.models import Corpus, Element, ElementType
from arkindex.documents.serializers.light import ElementLightSerializer
import gitlab.v4.objects
import celery.states
......@@ -169,6 +169,8 @@ class DataImportFromFilesSerializer(serializers.Serializer):
mode = EnumField(DataImportMode, default=DataImportMode.Images)
files = serializers.PrimaryKeyRelatedField(queryset=DataFile.objects.all(), many=True)
volume_id = serializers.UUIDField(required=False, allow_null=True)
volume_name = serializers.CharField(max_length=250, required=False, allow_null=True)
def validate_mode(self, mode):
if mode not in (DataImportMode.Images, DataImportMode.PDF):
......@@ -184,6 +186,18 @@ class DataImportFromFilesSerializer(serializers.Serializer):
raise serializers.ValidationError('Cannot write in corpus')
return files
def validate_volume_id(self, volume_id):
if not volume_id:
return None
try:
volume = Element.objects.get(
id=volume_id,
type=ElementType.Volume,
)
return volume
except Element.DoesNotExist:
raise serializers.ValidationError('Volume does not exist')
def validate(self, data):
if data['mode'] == DataImportMode.PDF:
if len(data['files']) > 1:
......
......@@ -170,3 +170,37 @@ class TestImports(RedisMockMixin, FixtureAPITestCase):
format='json',
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_from_files_volume_id(self):
self.client.force_login(self.user)
response = self.client.post(
reverse('api:import-from-files'),
{
'files': [str(self.pdf_df.id)],
'mode': 'pdf',
'volume_id': str(self.demo_volume.id),
},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
data = response.json()
dataimport = DataImport.objects.get(id=data['id'])
self.assertEqual(dataimport.payload['volume_id'], str(self.demo_volume.id))
def test_from_files_volume_name(self):
self.client.force_login(self.user)
response = self.client.post(
reverse('api:import-from-files'),
{
'files': [str(self.pdf_df.id)],
'mode': 'pdf',
'volume_name': 'New volume',
},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
data = response.json()
dataimport = DataImport.objects.get(id=data['id'])
volume = Element.objects.get(id=dataimport.payload['volume_id'])
self.assertEqual(volume.name, 'New volume')
self.assertEqual(volume.corpus, self.corpus)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment