aiteamutils 0.2.145__py3-none-any.whl → 0.2.147__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiteamutils/base_service.py +1 -0
- aiteamutils/files.py +61 -37
- aiteamutils/models.py +1 -0
- aiteamutils/version.py +1 -1
- {aiteamutils-0.2.145.dist-info → aiteamutils-0.2.147.dist-info}/METADATA +1 -1
- {aiteamutils-0.2.145.dist-info → aiteamutils-0.2.147.dist-info}/RECORD +7 -6
- {aiteamutils-0.2.145.dist-info → aiteamutils-0.2.147.dist-info}/WHEEL +0 -0
aiteamutils/base_service.py
CHANGED
@@ -71,6 +71,7 @@ class BaseService(Generic[ModelType]):
|
|
71
71
|
extra_data = entity_data_copy['extra_data'].copy()
|
72
72
|
file_fields = {k: v for k, v in extra_data.items() if k.endswith('_files')}
|
73
73
|
logger.info(f"[파일 필드 확인] {file_fields}")
|
74
|
+
logger.info(f"[파일 필드 타입] {[(k, type(v), type(v[0]) if isinstance(v, list) and v else None) for k, v in file_fields.items()]}")
|
74
75
|
|
75
76
|
if file_fields and not storage_dir:
|
76
77
|
logger.error("[에러] storage_dir이 필요하지만 제공되지 않음")
|
aiteamutils/files.py
CHANGED
@@ -11,6 +11,7 @@ from ulid import ULID
|
|
11
11
|
import logging
|
12
12
|
|
13
13
|
from .exceptions import ErrorCode, CustomException
|
14
|
+
from .base_model import BaseFileModel
|
14
15
|
|
15
16
|
logger = logging.getLogger(__name__)
|
16
17
|
|
@@ -165,6 +166,11 @@ class FileHandler:
|
|
165
166
|
) -> List[Dict[str, Any]]:
|
166
167
|
"""파일(들)을 저장하고 메타데이터 반환"""
|
167
168
|
logger.info(f"[다중 파일 저장 시작] storage_dir: {storage_dir}, entity_name: {entity_name}")
|
169
|
+
logger.info(f"[파일 데이터 타입] files type: {type(files)}")
|
170
|
+
if isinstance(files, list):
|
171
|
+
logger.info(f"[파일 리스트 내용] {[(type(f[0]), f[1]) for f in files]}")
|
172
|
+
else:
|
173
|
+
logger.info(f"[단일 파일 내용] {(type(files[0]), files[1])}")
|
168
174
|
|
169
175
|
file_infos = []
|
170
176
|
# 단일 파일인 경우 리스트로 변환
|
@@ -172,48 +178,66 @@ class FileHandler:
|
|
172
178
|
logger.info(f"[처리할 파일 수] {len(files_list)}")
|
173
179
|
|
174
180
|
for file, original_name in files_list:
|
175
|
-
logger.info(f"[개별 파일 처리] {original_name}")
|
176
|
-
# 파일 저장 및 메타데이터 생성
|
177
|
-
file_info = await FileHandler._save_file(
|
178
|
-
file=file,
|
179
|
-
original_name=original_name,
|
180
|
-
storage_dir=storage_dir,
|
181
|
-
entity_name=entity_name,
|
182
|
-
entity_ulid=entity_ulid
|
183
|
-
)
|
184
|
-
|
185
|
-
# DB에 파일 정보 저장
|
186
181
|
try:
|
187
|
-
logger.info(f"[
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
"""),
|
198
|
-
{
|
199
|
-
"entity_name": entity_name,
|
200
|
-
"entity_ulid": entity_ulid,
|
201
|
-
"original_name": file_info["original_name"],
|
202
|
-
"storage_path": file_info["storage_path"],
|
203
|
-
"mime_type": file_info["mime_type"],
|
204
|
-
"size": file_info["size"],
|
205
|
-
"checksum": file_info["checksum"],
|
206
|
-
"column_name": column_name
|
207
|
-
}
|
182
|
+
logger.info(f"[개별 파일 처리 시작] {original_name}")
|
183
|
+
logger.info(f"[파일 객체 정보] type: {type(file)}, seekable: {file.seekable()}, readable: {file.readable()}")
|
184
|
+
|
185
|
+
# 파일 저장 및 메타데이터 생성
|
186
|
+
file_info = await FileHandler._save_file(
|
187
|
+
file=file,
|
188
|
+
original_name=original_name,
|
189
|
+
storage_dir=storage_dir,
|
190
|
+
entity_name=entity_name,
|
191
|
+
entity_ulid=entity_ulid
|
208
192
|
)
|
209
193
|
|
210
|
-
|
211
|
-
|
212
|
-
|
194
|
+
# DB에 파일 정보 저장
|
195
|
+
try:
|
196
|
+
logger.info(f"[DB 저장 시작] {original_name}")
|
197
|
+
file_ulid = str(ULID())
|
198
|
+
logger.info(f"[생성된 파일 ULID] {file_ulid}")
|
199
|
+
|
200
|
+
result = await db_session.execute(
|
201
|
+
text("""
|
202
|
+
INSERT INTO files (
|
203
|
+
ulid, entity_name, entity_ulid, original_name, storage_path,
|
204
|
+
mime_type, size, checksum, column_name
|
205
|
+
) VALUES (
|
206
|
+
:ulid, :entity_name, :entity_ulid, :original_name, :storage_path,
|
207
|
+
:mime_type, :size, :checksum, :column_name
|
208
|
+
) RETURNING *
|
209
|
+
"""),
|
210
|
+
{
|
211
|
+
"ulid": file_ulid,
|
212
|
+
"entity_name": entity_name,
|
213
|
+
"entity_ulid": entity_ulid,
|
214
|
+
"original_name": file_info["original_name"],
|
215
|
+
"storage_path": file_info["storage_path"],
|
216
|
+
"mime_type": file_info["mime_type"],
|
217
|
+
"size": file_info["size"],
|
218
|
+
"checksum": file_info["checksum"],
|
219
|
+
"column_name": column_name
|
220
|
+
}
|
221
|
+
)
|
222
|
+
|
223
|
+
file_info = dict(result.fetchone())
|
224
|
+
file_infos.append(file_info)
|
225
|
+
logger.info(f"[DB 저장 완료] {original_name}, ulid: {file_info['ulid']}")
|
226
|
+
|
227
|
+
except Exception as e:
|
228
|
+
logger.error(f"[DB 저장 실패] {original_name}: {str(e)}")
|
229
|
+
# 파일 삭제 시도
|
230
|
+
try:
|
231
|
+
if "storage_path" in file_info:
|
232
|
+
await FileHandler.delete_files(file_info["storage_path"])
|
233
|
+
logger.info(f"[저장 실패로 인한 파일 삭제] {file_info['storage_path']}")
|
234
|
+
except Exception as del_e:
|
235
|
+
logger.error(f"[파일 삭제 실패] {str(del_e)}")
|
236
|
+
raise
|
213
237
|
except Exception as e:
|
214
|
-
logger.error(f"[
|
238
|
+
logger.error(f"[파일 처리 실패] {original_name}: {str(e)}")
|
215
239
|
raise
|
216
|
-
|
240
|
+
|
217
241
|
logger.info(f"[다중 파일 저장 완료] 성공: {len(file_infos)}개")
|
218
242
|
return file_infos
|
219
243
|
|
aiteamutils/models.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
aiteamutils/version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
"""버전 정보"""
|
2
|
-
__version__ = "0.2.
|
2
|
+
__version__ = "0.2.147"
|
@@ -1,16 +1,17 @@
|
|
1
1
|
aiteamutils/__init__.py,sha256=kRBpRjark0M8ZwFfmKiMFol6CbIILN3WE4f6_P6iIq0,1089
|
2
2
|
aiteamutils/base_model.py,sha256=yBZqzTDF9PA4wCAvmYfG12FdVwLtxOEUCcA3z2i6fXU,4176
|
3
3
|
aiteamutils/base_repository.py,sha256=Oy2zE1i5qx60Xf1tnsaKLyFWapiPqt5JH8NejwNrPWg,4647
|
4
|
-
aiteamutils/base_service.py,sha256=
|
4
|
+
aiteamutils/base_service.py,sha256=r7sAETymMMvKUjYFo8To3EnnIIOPFQ7PGI_IzuNx5-o,22504
|
5
5
|
aiteamutils/cache.py,sha256=07xBGlgAwOTAdY5mnMOQJ5EBxVwe8glVD7DkGEkxCtw,1373
|
6
6
|
aiteamutils/config.py,sha256=YdalpJb70-txhGJAS4aaKglEZAFVWgfzw5BXSWpkUz4,3232
|
7
7
|
aiteamutils/database.py,sha256=msvBKtxWeQVOo0v2Q9i2azuTNtnUItuNNar52gdRZTo,20418
|
8
8
|
aiteamutils/enums.py,sha256=7WLqlcJqQWtETAga2WAxNp3dJTQIAd2TW-4WzkoHHa8,2498
|
9
9
|
aiteamutils/exceptions.py,sha256=pgf3ersezObyl17wAO3I2fb8m9t2OzWDX1mSjwAWm2Y,16035
|
10
|
-
aiteamutils/files.py,sha256=
|
10
|
+
aiteamutils/files.py,sha256=cf6nCsw9p5VcT9TOKyZ8XYcar1n7g2IqOTwXVJLeglA,11810
|
11
|
+
aiteamutils/models.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
11
12
|
aiteamutils/security.py,sha256=McUl3t5Z5SyUDVUHymHdDkYyF4YSeg4g9fFMML4W6Kw,11630
|
12
13
|
aiteamutils/validators.py,sha256=_WHN6jqJQzKM5uPTg-Da8U2qqevS84XeKMkCCF4C_lY,9591
|
13
|
-
aiteamutils/version.py,sha256=
|
14
|
-
aiteamutils-0.2.
|
15
|
-
aiteamutils-0.2.
|
16
|
-
aiteamutils-0.2.
|
14
|
+
aiteamutils/version.py,sha256=XmN_MVqvHXx1LqJAvCY9xjvGvXLHkfX8aX9IgEcpB50,43
|
15
|
+
aiteamutils-0.2.147.dist-info/METADATA,sha256=iHI87wgDx5vKQpAOSmg1unnBIOeSjXY_rIx5PKd4ezU,1743
|
16
|
+
aiteamutils-0.2.147.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
17
|
+
aiteamutils-0.2.147.dist-info/RECORD,,
|
File without changes
|