Narrow Files backend import surfaces

This commit is contained in:
2026-07-21 03:16:23 +02:00
parent d1051293b2
commit 3bc1d3489e
4 changed files with 34 additions and 21 deletions

View File

@@ -1 +1,25 @@
from govoplan_files.backend.db.models import * from govoplan_files.backend.db.models import (
CampaignAttachmentUse,
FileAsset,
FileBlob,
FileConnectorCredential,
FileConnectorPolicy,
FileConnectorProfile,
FileConnectorSpace,
FileFolder,
FileShare,
FileVersion,
)
__all__ = [
"CampaignAttachmentUse",
"FileAsset",
"FileBlob",
"FileConnectorCredential",
"FileConnectorPolicy",
"FileConnectorProfile",
"FileConnectorSpace",
"FileFolder",
"FileShare",
"FileVersion",
]

View File

@@ -9,7 +9,7 @@ from importlib import import_module
import mimetypes import mimetypes
from typing import Any from typing import Any
from urllib.parse import quote, unquote, urljoin, urlsplit from urllib.parse import quote, unquote, urljoin, urlsplit
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET # nosec B405 - typing/element creation only; parsing uses defusedxml below.
from defusedxml import ElementTree as SafeElementTree from defusedxml import ElementTree as SafeElementTree
import httpx import httpx

View File

@@ -15,21 +15,6 @@ from govoplan_files.backend.storage.common import (
utcnow, utcnow,
) )
from govoplan_files.backend.storage.files import ( from govoplan_files.backend.storage.files import (
_active_asset_at_path,
_active_asset_exists,
_asset_owner_id,
_asset_query_for_owner,
_candidate_renamed_path,
_copy_asset_to_path,
_get_or_create_blob,
_next_available_logical_path,
_normalize_conflict_strategy,
_resolution_by_path,
_soft_delete_conflicting_asset,
_split_logical_path,
_storage_backend_name,
_storage_bucket_name,
_storage_key,
asset_is_audit_relevant, asset_is_audit_relevant,
create_file_asset, create_file_asset,
current_version_and_blob, current_version_and_blob,
@@ -42,10 +27,6 @@ from govoplan_files.backend.storage.files import (
soft_delete_assets, soft_delete_assets,
) )
from govoplan_files.backend.storage.folders import ( from govoplan_files.backend.storage.folders import (
_active_folder_exists,
_ensure_target_folder_hierarchy,
_folder_query_for_owner,
_owner_filter,
create_folder, create_folder,
list_folders_for_user, list_folders_for_user,
soft_delete_folder, soft_delete_folder,

View File

@@ -21,6 +21,7 @@ GROUP_ID = "group-1"
class FilesAccessProviderTests(unittest.TestCase): class FilesAccessProviderTests(unittest.TestCase):
def test_file_access_provider_explains_owner_share_admin_and_missing_resources(self) -> None: def test_file_access_provider_explains_owner_share_admin_and_missing_resources(self) -> None:
session = _session() session = _session()
self.addCleanup(_close_session, session)
_seed_access_subjects(session) _seed_access_subjects(session)
owned = FileAsset(id="file-owned", tenant_id=TENANT_ID, owner_type="user", owner_user_id=USER_ID, display_path="owned.pdf", filename="owned.pdf") owned = FileAsset(id="file-owned", tenant_id=TENANT_ID, owner_type="user", owner_user_id=USER_ID, display_path="owned.pdf", filename="owned.pdf")
shared = FileAsset(id="file-shared", tenant_id=TENANT_ID, owner_type="user", owner_user_id=OTHER_USER_ID, display_path="shared.pdf", filename="shared.pdf") shared = FileAsset(id="file-shared", tenant_id=TENANT_ID, owner_type="user", owner_user_id=OTHER_USER_ID, display_path="shared.pdf", filename="shared.pdf")
@@ -46,6 +47,7 @@ class FilesAccessProviderTests(unittest.TestCase):
def test_file_access_provider_explains_persisted_and_virtual_folders(self) -> None: def test_file_access_provider_explains_persisted_and_virtual_folders(self) -> None:
session = _session() session = _session()
self.addCleanup(_close_session, session)
_seed_access_subjects(session) _seed_access_subjects(session)
persisted = FileFolder(id="folder-persisted", tenant_id=TENANT_ID, owner_type="group", owner_group_id=GROUP_ID, path="records") persisted = FileFolder(id="folder-persisted", tenant_id=TENANT_ID, owner_type="group", owner_group_id=GROUP_ID, path="records")
virtual_child = FileAsset( virtual_child = FileAsset(
@@ -80,6 +82,12 @@ def _session():
return sessionmaker(bind=engine, future=True)() return sessionmaker(bind=engine, future=True)()
def _close_session(session) -> None:
engine = session.get_bind()
session.close()
engine.dispose()
def _seed_access_subjects(session) -> None: def _seed_access_subjects(session) -> None:
session.add_all([ session.add_all([
Account(id="account-1", email="one@example.test", normalized_email="one@example.test"), Account(id="account-1", email="one@example.test", normalized_email="one@example.test"),