generateur_v3/backend/api/dbo/utils/FileField.py
2022-09-16 21:50:55 +02:00

61 lines
1.8 KiB
Python

import os
import typing
import uuid
from fastapi import UploadFile
from tortoise.fields import TextField
from tortoise import ConfigurationError
import io
from services.io import delete_root_slash, add_fast_api_root, get_filename_from_path, get_or_create_dir, is_binary_file, get_filename, remove_fastapi_root
class FileField(TextField):
def __init__(self, *, upload_root: str, **kwargs):
super().__init__(**kwargs)
self.upload_root = delete_root_slash(upload_root)
self.upload_root = get_or_create_dir(os.path.join(
os.environ.get('FASTAPI_ROOT_URL'), self.upload_root))
def _is_binary(self, file: UploadFile):
return isinstance(file, io.BytesIO)
def to_db_value(self, value: typing.IO, instance):
if not isinstance(value, str):
super().validate(value)
value.seek(0)
is_binary = self._is_binary(value)
name = get_filename(value)
parent = get_or_create_dir(os.path.join(
self.upload_root, instance.id_code))
mode = 'w+' if not is_binary else 'wb+'
path = os.path.join(self.upload_root, parent, name)
with open(path, mode) as f:
f.write(value.read())
return remove_fastapi_root(path)
return value
def to_python_value(self, value: str):
return value
"""
abs_path = get_abs_path_from_relative_to_root(value)
if is_binary_file(abs_path):
mode = 'rb'
buffer = io.BytesIO()
else:
mode = 'r'
buffer = io.StringIO()
buffer.name = get_filename_from_path(value)
with open(abs_path, mode) as f:
buffer.write(f.read())
buffer.seek(0)
return buffer
"""