lib.itmens/sync/views.py

72 lines
2.4 KiB
Python
Raw Normal View History

2021-06-14 22:18:39 +02:00
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseBadRequest, JsonResponse, HttpResponse
from .models import SyncTask
from .forms import SyncTaskForm
2021-12-12 18:15:42 -05:00
from .jobs import import_doufen_task
2021-06-14 22:18:39 +02:00
import tempfile
import os
from threading import Thread
import openpyxl
from django.utils.datastructures import MultiValueDictKeyError
from openpyxl.utils.exceptions import InvalidFileException
from zipfile import BadZipFile
2021-12-12 18:15:42 -05:00
import django_rq
2021-06-14 22:18:39 +02:00
@login_required
def sync_douban(request):
"""
Sync douban data from .xlsx file generated by doufen
"""
if request.method == 'POST':
# validate sunmitted data
try:
2021-09-01 11:41:21 +02:00
uploaded_file = request.FILES['file']
2021-06-14 22:18:39 +02:00
wb = openpyxl.open(uploaded_file, read_only=True,
data_only=True, keep_links=False)
wb.close()
2021-12-12 18:15:42 -05:00
except (MultiValueDictKeyError, InvalidFileException, BadZipFile) as e:
2021-06-14 22:18:39 +02:00
# raise e
return HttpResponseBadRequest(content="invalid excel file")
2021-09-01 11:41:21 +02:00
# file_data = {'file': request.FILES['xlsx']}
2021-08-29 17:52:42 +02:00
form = SyncTaskForm(request.POST, request.FILES)
2021-06-14 22:18:39 +02:00
if form.is_valid():
# stop all preivous task
SyncTask.objects.filter(user=request.user, is_finished=False).update(is_finished=True)
form.save()
2021-12-12 18:15:42 -05:00
django_rq.get_queue('doufen').enqueue(import_doufen_task, form.instance, job_id=f'SyncTask_{form.instance.id}')
2021-06-14 22:18:39 +02:00
return HttpResponse(status=204)
else:
return HttpResponseBadRequest()
else:
return HttpResponseBadRequest()
@login_required
def query_progress(request):
task = request.user.user_synctasks.order_by('-id').first()
if task is not None:
return JsonResponse({
'progress': task.get_progress()
})
else:
return JsonResponse()
def query_last_task(request):
task = request.user.user_synctasks.order_by('-id').first()
if task is not None:
return JsonResponse({
'total_items': task.total_items,
'success_items': task.success_items,
'finished_items': task.finished_items,
'status': task.get_status_emoji(),
'is_finished': task.is_finished,
'failed_urls': task.failed_urls,
'ended_time': task.ended_time if task.is_finished else None,
})
else:
return JsonResponse()