fix: save DingTalk downloaded files to media dir instead of /tmp
This commit is contained in:
@@ -538,8 +538,8 @@ class DingTalkChannel(BaseChannel):
|
|||||||
filename: str,
|
filename: str,
|
||||||
sender_id: str,
|
sender_id: str,
|
||||||
) -> str | None:
|
) -> str | None:
|
||||||
"""Download a DingTalk file to a local temp directory, return local path."""
|
"""Download a DingTalk file to the media directory, return local path."""
|
||||||
import tempfile
|
from nanobot.config.paths import get_media_dir
|
||||||
|
|
||||||
try:
|
try:
|
||||||
token = await self._get_access_token()
|
token = await self._get_access_token()
|
||||||
@@ -568,8 +568,8 @@ class DingTalkChannel(BaseChannel):
|
|||||||
logger.error("DingTalk file download failed: status={}", file_resp.status_code)
|
logger.error("DingTalk file download failed: status={}", file_resp.status_code)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Save to local temp directory
|
# Save to media directory (accessible under workspace)
|
||||||
download_dir = Path(tempfile.gettempdir()) / "nanobot_dingtalk" / sender_id
|
download_dir = get_media_dir("dingtalk") / sender_id
|
||||||
download_dir.mkdir(parents=True, exist_ok=True)
|
download_dir.mkdir(parents=True, exist_ok=True)
|
||||||
file_path = download_dir / filename
|
file_path = download_dir / filename
|
||||||
await asyncio.to_thread(file_path.write_bytes, file_resp.content)
|
await asyncio.to_thread(file_path.write_bytes, file_resp.content)
|
||||||
|
|||||||
@@ -194,14 +194,17 @@ async def test_download_dingtalk_file(tmp_path, monkeypatch) -> None:
|
|||||||
])
|
])
|
||||||
channel._http._responses[1].content = file_content
|
channel._http._responses[1].content = file_content
|
||||||
|
|
||||||
# Redirect temp dir to tmp_path
|
# Redirect media dir to tmp_path
|
||||||
monkeypatch.setattr("tempfile.gettempdir", lambda: str(tmp_path))
|
monkeypatch.setattr(
|
||||||
|
"nanobot.config.paths.get_media_dir",
|
||||||
|
lambda channel_name=None: tmp_path / channel_name if channel_name else tmp_path,
|
||||||
|
)
|
||||||
|
|
||||||
result = await channel._download_dingtalk_file("code123", "test.xlsx", "user1")
|
result = await channel._download_dingtalk_file("code123", "test.xlsx", "user1")
|
||||||
|
|
||||||
assert result is not None
|
assert result is not None
|
||||||
assert result.endswith("test.xlsx")
|
assert result.endswith("test.xlsx")
|
||||||
assert (tmp_path / "nanobot_dingtalk" / "user1" / "test.xlsx").read_bytes() == file_content
|
assert (tmp_path / "dingtalk" / "user1" / "test.xlsx").read_bytes() == file_content
|
||||||
|
|
||||||
# Verify API calls
|
# Verify API calls
|
||||||
assert channel._http.calls[0]["method"] == "POST"
|
assert channel._http.calls[0]["method"] == "POST"
|
||||||
|
|||||||
Reference in New Issue
Block a user