Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
api/tasks for bulk import using OclFleximporter (ocldev-py3) get/post
- Loading branch information
1 parent
99b8f80
commit dc9db47
Showing
8 changed files
with
137 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
import json | ||
|
||
from django.utils.text import compress_string | ||
from ocldev.oclfleximporter import OclFlexImporter | ||
|
||
from core.common.utils import get_base_url | ||
from core.users.models import UserProfile | ||
|
||
|
||
class ImportResults: | ||
def __init__(self, importer): | ||
self.json = compress_string(importer.import_results.to_json()) | ||
self.detailed_summary = importer.import_results.get_detailed_summary() | ||
self.report = importer.import_results.display_report() | ||
|
||
|
||
class BulkImport: | ||
def __init__(self, content, username, update_if_exists): | ||
self.input_list = [] | ||
self.user = None | ||
self.result = None | ||
self.importer = None | ||
self.content = content | ||
self.username = username | ||
self.update_if_exists = update_if_exists | ||
self.populate_input_list() | ||
self.set_user() | ||
self.prepare_importer() | ||
|
||
def populate_input_list(self): | ||
for line in self.content.splitlines(): | ||
self.input_list.append(json.loads(line)) | ||
|
||
def set_user(self): | ||
self.user = UserProfile.objects.get(username=self.username) | ||
|
||
def prepare_importer(self): | ||
self.importer = OclFlexImporter( | ||
input_list=self.input_list, | ||
api_url_root=get_base_url(), | ||
api_token=self.user.auth_token.key, | ||
do_update_if_exists=self.update_if_exists | ||
) | ||
|
||
def run(self): | ||
self.importer.process() | ||
self.result = ImportResults(self.importer) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from django.urls import re_path | ||
|
||
from core.importers import views | ||
|
||
urlpatterns = [ | ||
re_path(r'^bulk-import/$', views.BulkImportView.as_view(), name='bulk-import'), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
import uuid | ||
|
||
from celery.result import AsyncResult | ||
from rest_framework import status | ||
from rest_framework.permissions import IsAuthenticated | ||
from rest_framework.response import Response | ||
from rest_framework.views import APIView | ||
|
||
from core.common.tasks import bulk_import, bulk_priority_import | ||
|
||
|
||
class BulkImportView(APIView): | ||
permission_classes = (IsAuthenticated,) | ||
|
||
def post(self, request): | ||
username = self.request.user.username | ||
update_if_exists = request.GET.get('update_if_exists', 'true') | ||
if update_if_exists not in ['true', 'false']: | ||
return Response( | ||
{'exception': 'update_if_exists must be either \'true\' or \'false\''}, | ||
status=status.HTTP_400_BAD_REQUEST | ||
) | ||
update_if_exists = update_if_exists == 'true' | ||
|
||
task_id = str(uuid.uuid4()) + '-' + username | ||
if username == 'root': | ||
task = bulk_priority_import.apply_async((request.body, username, update_if_exists), task_id=task_id) | ||
else: | ||
task = bulk_import.apply_async((request.body, username, update_if_exists), task_id=task_id) | ||
|
||
return Response(dict(task=task.id, state=task.state)) | ||
|
||
def get(self, request): # pylint: disable=too-many-return-statements | ||
task_id = request.GET.get('task') | ||
result_format = request.GET.get('result') | ||
if not task_id: | ||
return Response(dict(exception='Required task id'), status=status.HTTP_400_BAD_REQUEST) | ||
username = task_id[37:] | ||
user = self.request.user | ||
|
||
if not user.is_staff and user.username != username: | ||
return Response(status=status.HTTP_403_FORBIDDEN) | ||
|
||
task = AsyncResult(task_id) | ||
|
||
if task.successful(): | ||
result = task.get() | ||
if result_format == 'json': | ||
response = Response(result.json, content_type="application/json") | ||
response['Content-Encoding'] = 'gzip' | ||
return response | ||
if result_format == 'report': | ||
return Response(result.report) | ||
return Response(result.detailed_summary) | ||
|
||
if task.failed(): | ||
return Response({'exception': str(task.result)}, status=status.HTTP_400_BAD_REQUEST) | ||
|
||
return Response(dict(task=task.id, state=task.state)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,6 +49,7 @@ | |
'core.collections', | ||
'core.concepts', | ||
'core.mappings', | ||
'core.importers', | ||
] | ||
|
||
REST_FRAMEWORK = { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters