premiere iteration de la gestion des documents
CI - Security, Lint & Tests / validate (push) Failing after 1m20s
CI - Security, Lint & Tests / validate (push) Failing after 1m20s
This commit is contained in:
@@ -41,6 +41,12 @@ from app.google_drive import (
|
||||
from app.google_drive import (
|
||||
download_file as download_google_drive_file,
|
||||
)
|
||||
from app.google_drive import (
|
||||
get_or_create_folder as get_or_create_drive_folder,
|
||||
)
|
||||
from app.google_drive import (
|
||||
root_folder_id as google_drive_root_folder_id,
|
||||
)
|
||||
from app.google_drive import (
|
||||
upload_file as upload_google_drive_file,
|
||||
)
|
||||
@@ -159,6 +165,73 @@ def store_uploaded_document(file_storage, relative_path):
|
||||
return f'{GOOGLE_DRIVE_PATH_PREFIX}{file_id}'
|
||||
|
||||
|
||||
def _save_locally(file_storage, relative_path):
|
||||
"""Persist *relative_path* (from ``documents_root()``) and return it."""
|
||||
absolute_path = document_path(relative_path)
|
||||
os.makedirs(os.path.dirname(absolute_path), exist_ok=True)
|
||||
file_storage.save(absolute_path)
|
||||
return relative_path
|
||||
|
||||
|
||||
def _drive_folder_for(parts):
|
||||
"""Resolve (and create as needed) a nested chain of Drive folders.
|
||||
|
||||
Args:
|
||||
parts: Folder names under the root folder, root first.
|
||||
|
||||
Returns:
|
||||
str: The Drive id of the deepest folder.
|
||||
"""
|
||||
parent = google_drive_root_folder_id()
|
||||
for part in parts:
|
||||
parent = get_or_create_drive_folder(part, parent)
|
||||
return parent
|
||||
|
||||
|
||||
def store_master_document(file_storage, filename, mimetype=None):
|
||||
"""Store the unsigned template of a document (the canonical copy).
|
||||
|
||||
The point is to store the file exactly once: every assignment for that
|
||||
document points at this one reference.
|
||||
"""
|
||||
if document_storage_backend() == 'local':
|
||||
return _save_locally(file_storage, os.path.join(CONTRACTS_DIR, filename))
|
||||
|
||||
file_id = upload_google_drive_file(
|
||||
stream=file_storage.stream,
|
||||
filename=filename,
|
||||
mimetype=mimetype or file_storage.mimetype or 'application/pdf',
|
||||
)
|
||||
return f'{GOOGLE_DRIVE_PATH_PREFIX}{file_id}'
|
||||
|
||||
|
||||
def store_signed_document(file_storage, *, team_name, role, username, filename, mimetype=None):
|
||||
"""File a signed copy under ``signés/<team>/<role>/<username>/<filename>``.
|
||||
|
||||
The root folder is already the signed-contracts folder, so no extra
|
||||
``signed`` segment is added (the layout the club requested).
|
||||
|
||||
Args:
|
||||
file_storage: The uploaded FileStorage.
|
||||
team_name: Name of the signing member's (primary) team.
|
||||
role: The signing member's own role (player/coach/manager).
|
||||
username: The signing member's username.
|
||||
filename: Name of the signed file, e.g. ``player-v1.pdf``.
|
||||
"""
|
||||
if document_storage_backend() == 'local':
|
||||
relative = os.path.join(CONTRACTS_DIR, team_name, role, username, filename)
|
||||
return _save_locally(file_storage, relative)
|
||||
|
||||
parent = _drive_folder_for([team_name, role, username])
|
||||
file_id = upload_google_drive_file(
|
||||
stream=file_storage.stream,
|
||||
filename=filename,
|
||||
mimetype=mimetype or file_storage.mimetype or 'application/pdf',
|
||||
parents=[parent],
|
||||
)
|
||||
return f'{GOOGLE_DRIVE_PATH_PREFIX}{file_id}'
|
||||
|
||||
|
||||
def open_document(stored_path):
|
||||
"""Return a filesystem path or in-memory stream suitable for ``send_file``."""
|
||||
if is_google_drive_path(stored_path):
|
||||
|
||||
Reference in New Issue
Block a user