Skip to content
Snippets Groups Projects
Verified Commit dcb1915a authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Can now bind batch to request via API

parent a73a4e24
No related branches found
No related tags found
No related merge requests found
...@@ -125,5 +125,5 @@ class ImportBatchSerializer(serializers.ModelSerializer): ...@@ -125,5 +125,5 @@ class ImportBatchSerializer(serializers.ModelSerializer):
jobs = ImportJobSerializer(many=True, read_only=True) jobs = ImportJobSerializer(many=True, read_only=True)
class Meta: class Meta:
model = models.ImportBatch model = models.ImportBatch
fields = ('id', 'jobs', 'status', 'creation_date') fields = ('id', 'jobs', 'status', 'creation_date', 'import_request')
read_only_fields = ('creation_date',) read_only_fields = ('creation_date',)
...@@ -19,6 +19,7 @@ from musicbrainzngs import ResponseError ...@@ -19,6 +19,7 @@ from musicbrainzngs import ResponseError
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from funkwhale_api.requests.models import ImportRequest
from funkwhale_api.musicbrainz import api from funkwhale_api.musicbrainz import api
from funkwhale_api.common.permissions import ( from funkwhale_api.common.permissions import (
ConditionalAuthentication, HasModelPermission) ConditionalAuthentication, HasModelPermission)
...@@ -314,14 +315,28 @@ class SubmitViewSet(viewsets.ViewSet): ...@@ -314,14 +315,28 @@ class SubmitViewSet(viewsets.ViewSet):
serializer = serializers.ImportBatchSerializer(batch) serializer = serializers.ImportBatchSerializer(batch)
return Response(serializer.data) return Response(serializer.data)
def get_import_request(self, data):
try:
raw = data['importRequest']
except KeyError:
return
pk = int(raw)
try:
return ImportRequest.objects.get(pk=pk)
except ImportRequest.DoesNotExist:
pass
@list_route(methods=['post']) @list_route(methods=['post'])
@transaction.non_atomic_requests @transaction.non_atomic_requests
def album(self, request, *args, **kwargs): def album(self, request, *args, **kwargs):
data = json.loads(request.body.decode('utf-8')) data = json.loads(request.body.decode('utf-8'))
import_data, batch = self._import_album(data, request, batch=None) import_request = self.get_import_request(data)
import_data, batch = self._import_album(
data, request, batch=None, import_request=import_request)
return Response(import_data) return Response(import_data)
def _import_album(self, data, request, batch=None): def _import_album(self, data, request, batch=None, import_request=None):
# we import the whole album here to prevent race conditions that occurs # we import the whole album here to prevent race conditions that occurs
# when using get_or_create_from_api in tasks # when using get_or_create_from_api in tasks
album_data = api.releases.get(id=data['releaseId'], includes=models.Album.api_includes)['release'] album_data = api.releases.get(id=data['releaseId'], includes=models.Album.api_includes)['release']
...@@ -332,7 +347,9 @@ class SubmitViewSet(viewsets.ViewSet): ...@@ -332,7 +347,9 @@ class SubmitViewSet(viewsets.ViewSet):
except ResponseError: except ResponseError:
pass pass
if not batch: if not batch:
batch = models.ImportBatch.objects.create(submitted_by=request.user) batch = models.ImportBatch.objects.create(
submitted_by=request.user,
import_request=import_request)
for row in data['tracks']: for row in data['tracks']:
try: try:
models.TrackFile.objects.get(track__mbid=row['mbid']) models.TrackFile.objects.get(track__mbid=row['mbid'])
...@@ -346,6 +363,7 @@ class SubmitViewSet(viewsets.ViewSet): ...@@ -346,6 +363,7 @@ class SubmitViewSet(viewsets.ViewSet):
@transaction.non_atomic_requests @transaction.non_atomic_requests
def artist(self, request, *args, **kwargs): def artist(self, request, *args, **kwargs):
data = json.loads(request.body.decode('utf-8')) data = json.loads(request.body.decode('utf-8'))
import_request = self.get_import_request(data)
artist_data = api.artists.get(id=data['artistId'])['artist'] artist_data = api.artists.get(id=data['artistId'])['artist']
cleaned_data = models.Artist.clean_musicbrainz_data(artist_data) cleaned_data = models.Artist.clean_musicbrainz_data(artist_data)
artist = importers.load(models.Artist, cleaned_data, artist_data, import_hooks=[]) artist = importers.load(models.Artist, cleaned_data, artist_data, import_hooks=[])
...@@ -353,7 +371,8 @@ class SubmitViewSet(viewsets.ViewSet): ...@@ -353,7 +371,8 @@ class SubmitViewSet(viewsets.ViewSet):
import_data = [] import_data = []
batch = None batch = None
for row in data['albums']: for row in data['albums']:
row_data, batch = self._import_album(row, request, batch=batch) row_data, batch = self._import_album(
row, request, batch=batch, import_request=import_request)
import_data.append(row_data) import_data.append(row_data)
return Response(import_data[0]) return Response(import_data[0])
...@@ -65,6 +65,15 @@ def logged_in_api_client(db, factories, api_client): ...@@ -65,6 +65,15 @@ def logged_in_api_client(db, factories, api_client):
delattr(api_client, 'user') delattr(api_client, 'user')
@pytest.fixture
def superuser_api_client(db, factories, api_client):
user = factories['users.SuperUser']()
assert api_client.login(username=user.username, password='test')
setattr(api_client, 'user', user)
yield api_client
delattr(api_client, 'user')
@pytest.fixture @pytest.fixture
def superuser_client(db, factories, client): def superuser_client(db, factories, client):
user = factories['users.SuperUser']() user = factories['users.SuperUser']()
......
import json
from django.urls import reverse
from . import data as api_data
def test_create_import_can_bind_to_request(
mocker, factories, superuser_api_client):
request = factories['requests.ImportRequest']()
mocker.patch('funkwhale_api.music.tasks.import_job_run')
mocker.patch(
'funkwhale_api.musicbrainz.api.artists.get',
return_value=api_data.artists['get']['soad'])
mocker.patch(
'funkwhale_api.musicbrainz.api.images.get_front',
return_value=b'')
mocker.patch(
'funkwhale_api.musicbrainz.api.releases.get',
return_value=api_data.albums['get_with_includes']['hypnotize'])
payload = {
'releaseId': '47ae093f-1607-49a3-be11-a15d335ccc94',
'importRequest': request.pk,
'tracks': [
{
'mbid': '1968a9d6-8d92-4051-8f76-674e157b6eed',
'source': 'https://www.youtube.com/watch?v=1111111111',
}
]
}
url = reverse('api:v1:submit-album')
response = superuser_api_client.post(
url, json.dumps(payload), content_type='application/json')
batch = request.import_batches.latest('id')
assert batch.import_request == request
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment