From 344c17b51e13a273e8b6e80d67cfa112d1ea6926 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 9 Sep 2019 00:05:51 +0200 Subject: Serialization: manage export action in admin - optimizations --- ishtar_common/tasks.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'ishtar_common/tasks.py') diff --git a/ishtar_common/tasks.py b/ishtar_common/tasks.py index a8db97bb1..a68a30b86 100644 --- a/ishtar_common/tasks.py +++ b/ishtar_common/tasks.py @@ -17,14 +17,87 @@ # See the file COPYING for details. +import datetime + +import os import sys from django.conf import settings +from django.core.files import File from django.db.models import Q from ishtar_common.models import Town, Department +from ishtar_common.utils import task +from ishtar_common.serializers import full_serialization + +from archaeological_operations.models import Operation, ArchaeologicalSite +from archaeological_context_records.models import ContextRecord +from archaeological_finds.models import Find +from archaeological_warehouse.models import Warehouse + +from archaeological_operations.views import get_operation, get_site +from archaeological_context_records.views import get_contextrecord +from archaeological_finds.views import get_find +from archaeological_warehouse.views import get_warehouse + + +@task() +def launch_export(export_task): + if export_task.state != 'S': + return + export_task.launch_date = datetime.datetime.now() + export_task.state = 'P' + export_task.save() + + kwargs = {} + if export_task.filter_type and export_task.filter_text: + query = {"search_vector": export_task.filter_text} + kwargs["info"] = {"query": {"filter": export_task.filter_text}} + if export_task.filter_type == "O": + kwargs["info"]["query"]["model"] = "Operation" + ids = list( + get_operation( + None, query=query, return_query=True).values_list( + "id", flat=True)) + kwargs["operation_queryset"] = Operation.objects.filter(pk__in=ids) + elif export_task.filter_type == "S": + kwargs["info"]["query"]["model"] = "ArchaeologicalSite" + ids = list(get_site( + None, query=query, return_query=True).values_list( + "id", flat=True)) + kwargs["site_queryset"] = ArchaeologicalSite.objects.filter( + pk__in=ids) + elif export_task.filter_type == "CR": + kwargs["info"]["query"]["model"] = "ArchaeologicalSite" + ids = list(get_contextrecord( + None, query=query, return_query=True).values_list( + "id", flat=True)) + kwargs["cr_queryset"] = ContextRecord.objects.filter(pk__in=ids) + elif export_task.filter_type == "F": + kwargs["info"]["query"]["model"] = "Find" + ids = list(get_find( + None, query=query, return_query=True + ).values_list("id", flat=True)) + kwargs["find_queryset"] = Find.objects.filter(pk__in=ids) + elif export_task.filter_type == "W": + kwargs["info"]["query"]["model"] = "Warehouse" + ids = list(get_warehouse( + None, query=query, return_query=True + ).values_list("id", flat=True)) + kwargs["warehouse_queryset"] = Warehouse.objects.filter(pk__in=ids) + if not export_task.geo: + kwargs["no_geo"] = True + archive_name = full_serialization(**kwargs) + result = open(archive_name, "rb") + export_task.result.save(archive_name.split(os.sep)[-1], File(result)) + os.remove(archive_name) + export_task.finished_date = datetime.datetime.now() + export_task.state = 'F' + export_task.save() + def load_towns(): + # TODO: remove? from geodjangofla.models import Commune q = None for dpt_number in settings.ISHTAR_DPTS: @@ -55,6 +128,7 @@ def load_towns(): return nb, updated def update_towns(): + # TODO: remove? nb, updated = 0, 0 dpts = dict([(dpt.number, dpt) for dpt in Department.objects.all()]) q = Town.objects.filter(numero_insee__isnull=False) -- cgit v1.2.3