aiteamutils 0.2.145__py3-none-any.whl → 0.2.146__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 +64 -37
- aiteamutils/version.py +1 -1
- {aiteamutils-0.2.145.dist-info → aiteamutils-0.2.146.dist-info}/METADATA +1 -1
- {aiteamutils-0.2.145.dist-info → aiteamutils-0.2.146.dist-info}/RECORD +6 -6
- {aiteamutils-0.2.145.dist-info → aiteamutils-0.2.146.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,69 @@ 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
|
+
|
198
|
+
# FileModel 인스턴스 생성
|
199
|
+
file_record = BaseFileModel(
|
200
|
+
entity_name=entity_name,
|
201
|
+
entity_ulid=entity_ulid,
|
202
|
+
original_name=file_info["original_name"],
|
203
|
+
storage_path=file_info["storage_path"],
|
204
|
+
mime_type=file_info["mime_type"],
|
205
|
+
size=file_info["size"],
|
206
|
+
checksum=file_info["checksum"],
|
207
|
+
column_name=column_name
|
208
|
+
)
|
209
|
+
|
210
|
+
# DB에 저장
|
211
|
+
db_session.add(file_record)
|
212
|
+
await db_session.flush()
|
213
|
+
|
214
|
+
# 결과를 딕셔너리로 변환
|
215
|
+
file_info = {
|
216
|
+
"ulid": file_record.ulid,
|
217
|
+
"entity_name": file_record.entity_name,
|
218
|
+
"entity_ulid": file_record.entity_ulid,
|
219
|
+
"original_name": file_record.original_name,
|
220
|
+
"storage_path": file_record.storage_path,
|
221
|
+
"mime_type": file_record.mime_type,
|
222
|
+
"size": file_record.size,
|
223
|
+
"checksum": file_record.checksum,
|
224
|
+
"column_name": file_record.column_name
|
225
|
+
}
|
226
|
+
|
227
|
+
file_infos.append(file_info)
|
228
|
+
logger.info(f"[DB 저장 완료] {original_name}, ulid: {file_record.ulid}")
|
229
|
+
|
230
|
+
except Exception as e:
|
231
|
+
logger.error(f"[DB 저장 실패] {original_name}: {str(e)}")
|
232
|
+
# 파일 삭제 시도
|
233
|
+
try:
|
234
|
+
if "storage_path" in file_info:
|
235
|
+
await FileHandler.delete_files(file_info["storage_path"])
|
236
|
+
logger.info(f"[저장 실패로 인한 파일 삭제] {file_info['storage_path']}")
|
237
|
+
except Exception as del_e:
|
238
|
+
logger.error(f"[파일 삭제 실패] {str(del_e)}")
|
239
|
+
raise
|
213
240
|
except Exception as e:
|
214
|
-
logger.error(f"[
|
241
|
+
logger.error(f"[파일 처리 실패] {original_name}: {str(e)}")
|
215
242
|
raise
|
216
|
-
|
243
|
+
|
217
244
|
logger.info(f"[다중 파일 저장 완료] 성공: {len(file_infos)}개")
|
218
245
|
return file_infos
|
219
246
|
|
aiteamutils/version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
"""버전 정보"""
|
2
|
-
__version__ = "0.2.
|
2
|
+
__version__ = "0.2.146"
|
@@ -1,16 +1,16 @@
|
|
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=Kvm3nIUZ6NJjjTvHX-sXeLTxgH-k1jJq_Twqvur14Hw,11823
|
11
11
|
aiteamutils/security.py,sha256=McUl3t5Z5SyUDVUHymHdDkYyF4YSeg4g9fFMML4W6Kw,11630
|
12
12
|
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.
|
13
|
+
aiteamutils/version.py,sha256=ClTCT30rXE2oKBHZRmAcdozSNQ3LRVgasEyLlocl1QA,43
|
14
|
+
aiteamutils-0.2.146.dist-info/METADATA,sha256=vHpFbI0TxUminJyv0a0Hs5TPhslR8nh9LqnojZ-Ujgc,1743
|
15
|
+
aiteamutils-0.2.146.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
16
|
+
aiteamutils-0.2.146.dist-info/RECORD,,
|
File without changes
|