Export group by calibration

This commit is contained in:
Thomas Forgione 2024-07-22 15:31:16 +02:00
parent 48e1f82bc7
commit c7e1e423f5
2 changed files with 52 additions and 7 deletions

50
app.py
View File

@ -1,6 +1,7 @@
#!/usr/bin/env python
from flask import Flask, redirect, request, render_template, send_from_directory, session
import itertools
import io
import json
import os
@ -275,8 +276,53 @@ def download_object(id: int):
conn = db.get()
object = db.Object.get_from_id(id, conn).full(conn)
# Group acquisitions sharing calibration
def keyfunc(x: db.Calibration) -> int:
return x.calibration_id
acquisitions_sorted = sorted(object.acquisitions, key=keyfunc)
acquisitions_grouped = [(db.Calibration.get_from_id(k, conn), list(g)) for k, g in itertools.groupby(acquisitions_sorted, key=keyfunc)]
def generate():
for acquisition_index, acquisition in enumerate(object.acquisitions):
for calibration_index, (calib, acquisitions) in enumerate(acquisitions_grouped):
# Send each image
calibration_dir = join(config.CALIBRATION_DIR, str(calib.id))
for image in os.listdir(calibration_dir):
# Generate tar header for file
image_path = join(calibration_dir, image)
bytes = io.BytesIO()
stat = os.stat(image_path)
# Create dummy tar to extract tar header for file
with tarfile.open(fileobj=bytes, mode='w') as buffer:
tar_info = tarfile.TarInfo(image_path)
tar_info.name = f'object/{calibration_index}/calibration/{image}'
tar_info.size = stat.st_size
buffer.addfile(tar_info)
# Yield header
value = bytes.getvalue()
yield value[:512]
# Yield file content, by chunks of 4MiB
chunk_size = 4_194_304
bytes_len = 0
with open(image_path, 'rb') as file:
while True:
bytes = file.read(chunk_size)
if len(bytes) == 0:
break
bytes_len += len(bytes)
yield bytes
yield b'\x00' * (512 - bytes_len % 512)
for acquisition_index, acquisition in enumerate(acquisitions):
acquisition_dir = join(config.OBJECT_DIR, str(object.id), str(acquisition.id))
# Send each image
@ -290,7 +336,7 @@ def download_object(id: int):
# Create dummy tar to extract tar header for file
with tarfile.open(fileobj=bytes, mode='w') as buffer:
tar_info = tarfile.TarInfo(image_path)
tar_info.name = f'object/{acquisition_index}/{image}'
tar_info.name = f'object/{calibration_index}/{acquisition_index}/{image}'
tar_info.size = stat.st_size
buffer.addfile(tar_info)

1
db.py
View File

@ -245,7 +245,6 @@ class Object:
[self.id]
)
acquisitions = list(map(lambda x: Acquisition.from_row(x), response.fetchall()))
print(acquisitions)
return FullObject(self.id, self.name, acquisitions)