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.
@@ -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"[DB 저장 시작] {original_name}")
188
- result = await db_session.execute(
189
- text("""
190
- INSERT INTO files (
191
- entity_name, entity_ulid, original_name, storage_path,
192
- mime_type, size, checksum, column_name
193
- ) VALUES (
194
- :entity_name, :entity_ulid, :original_name, :storage_path,
195
- :mime_type, :size, :checksum, :column_name
196
- ) RETURNING *
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
- file_info = dict(result.fetchone())
211
- file_infos.append(file_info)
212
- logger.info(f"[DB 저장 완료] {original_name}")
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"[DB 저장 실패] {original_name}: {str(e)}")
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.145"
2
+ __version__ = "0.2.146"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiteamutils
3
- Version: 0.2.145
3
+ Version: 0.2.146
4
4
  Summary: AI Team Utilities
5
5
  Project-URL: Homepage, https://github.com/yourusername/aiteamutils
6
6
  Project-URL: Issues, https://github.com/yourusername/aiteamutils/issues
@@ -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=dqs0b5xyCdBibgbgHKG9LCyeyQW1MNwiwuOrmSluJHI,22349
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=hBCnXCa8wrBK05aSZAF08tcH_eiYmVQqUaSQqCgib7o,10311
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=qTfcWqtaTYCddRCJFGc8bvpJSvvkq6vXGLan238hPT4,43
14
- aiteamutils-0.2.145.dist-info/METADATA,sha256=SSsB1r0zBl1--1_PNz-nvFAlMP1VFduSYZIwaSrKxZc,1743
15
- aiteamutils-0.2.145.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
- aiteamutils-0.2.145.dist-info/RECORD,,
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,,