aiteamutils 0.2.139__py3-none-any.whl → 0.2.140__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_model.py CHANGED
@@ -109,6 +109,11 @@ class BaseFileModel(BaseColumn):
109
109
  nullable=False,
110
110
  doc="엔티티 ULID"
111
111
  )
112
+ column_name: Mapped[str] = mapped_column(
113
+ String,
114
+ nullable=False,
115
+ doc="컬럼 이름"
116
+ )
112
117
  original_name: Mapped[str] = mapped_column(
113
118
  String,
114
119
  nullable=False,
@@ -107,35 +107,60 @@ class BaseService(Generic[ModelType]):
107
107
  # 파일 처리 및 저장
108
108
  file_infos = {}
109
109
  if separated_files:
110
- from .files import FileHandler
111
- for field_name, files in separated_files.items():
112
- saved_files = await FileHandler.save_files(
113
- files=files,
114
- storage_dir=storage_dir,
115
- entity_name=self.model.__tablename__,
116
- entity_ulid=result.ulid,
117
- db_session=self.db_session
118
- )
119
- file_infos[field_name] = saved_files
120
-
121
- # extra_data 업데이트
122
- if not hasattr(result, 'extra_data'):
123
- result.extra_data = {}
124
- if not result.extra_data:
125
- result.extra_data = {}
110
+ try:
111
+ from .files import FileHandler
112
+ for field_name, files in separated_files.items():
113
+ saved_files = await FileHandler.save_files(
114
+ files=files,
115
+ storage_dir=storage_dir,
116
+ entity_name=self.model.__tablename__,
117
+ entity_ulid=result.ulid,
118
+ db_session=self.db_session,
119
+ column_name=field_name.replace('_files', '') # _files 접미사 제거
120
+ )
121
+ file_infos[field_name] = saved_files
126
122
 
127
- result.extra_data[field_name] = [
128
- {
129
- 'original_name': f['original_name'],
130
- 'storage_path': f['storage_path'],
131
- 'mime_type': f['mime_type'],
132
- 'size': f['size'],
133
- 'checksum': f['checksum']
134
- } for f in saved_files
135
- ]
136
-
137
- # extra_data 업데이트된 엔티티 저장
138
- await self.db_session.flush()
123
+ # extra_data 업데이트 - 파일 정보 캐싱
124
+ if not hasattr(result, 'extra_data'):
125
+ result.extra_data = {}
126
+ if not result.extra_data:
127
+ result.extra_data = {}
128
+
129
+ result.extra_data[field_name] = [
130
+ {
131
+ 'original_name': f['original_name'],
132
+ 'storage_path': f['storage_path'],
133
+ 'mime_type': f['mime_type'],
134
+ 'size': f['size'],
135
+ 'checksum': f['checksum'],
136
+ 'column_name': f['column_name']
137
+ } for f in saved_files
138
+ ]
139
+
140
+ # extra_data 업데이트된 엔티티 저장
141
+ await self.db_session.flush()
142
+ except CustomException as e:
143
+ # 파일 저장 실패 시 저장된 파일들 삭제
144
+ for file_list in file_infos.values():
145
+ for file_info in file_list:
146
+ await FileHandler.delete_files(file_info["storage_path"])
147
+ raise CustomException(
148
+ e.error_code,
149
+ detail=e.detail,
150
+ source_function=f"{self.__class__.__name__}.create.file_processing",
151
+ original_error=e
152
+ )
153
+ except Exception as e:
154
+ # 파일 저장 실패 시 저장된 파일들 삭제
155
+ for file_list in file_infos.values():
156
+ for file_info in file_list:
157
+ await FileHandler.delete_files(file_info["storage_path"])
158
+ raise CustomException(
159
+ ErrorCode.FILE_SYSTEM_ERROR,
160
+ detail=str(e),
161
+ source_function=f"{self.__class__.__name__}.create.file_processing",
162
+ original_error=e
163
+ )
139
164
 
140
165
  # 결과 반환
141
166
  if response_model:
aiteamutils/files.py CHANGED
@@ -141,7 +141,8 @@ class FileHandler:
141
141
  storage_dir: str,
142
142
  entity_name: str,
143
143
  entity_ulid: str,
144
- db_session: AsyncSession
144
+ db_session: AsyncSession,
145
+ column_name: str = None
145
146
  ) -> List[Dict[str, Any]]:
146
147
  """파일(들)을 저장하고 메타데이터 반환
147
148
 
@@ -151,6 +152,7 @@ class FileHandler:
151
152
  entity_name (str): 엔티티 이름
152
153
  entity_ulid (str): 엔티티 ULID
153
154
  db_session (AsyncSession): DB 세션
155
+ column_name (str): 파일이 속한 컬럼 이름
154
156
 
155
157
  Returns:
156
158
  List[Dict[str, Any]]: 저장된 파일들의 메타데이터 리스트
@@ -174,10 +176,10 @@ class FileHandler:
174
176
  text("""
175
177
  INSERT INTO files (
176
178
  entity_name, entity_ulid, original_name, storage_path,
177
- mime_type, size, checksum
179
+ mime_type, size, checksum, column_name
178
180
  ) VALUES (
179
181
  :entity_name, :entity_ulid, :original_name, :storage_path,
180
- :mime_type, :size, :checksum
182
+ :mime_type, :size, :checksum, :column_name
181
183
  ) RETURNING *
182
184
  """),
183
185
  {
@@ -187,7 +189,8 @@ class FileHandler:
187
189
  "storage_path": file_info["storage_path"],
188
190
  "mime_type": file_info["mime_type"],
189
191
  "size": file_info["size"],
190
- "checksum": file_info["checksum"]
192
+ "checksum": file_info["checksum"],
193
+ "column_name": column_name
191
194
  }
192
195
  )
193
196
 
aiteamutils/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  """버전 정보"""
2
- __version__ = "0.2.139"
2
+ __version__ = "0.2.140"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiteamutils
3
- Version: 0.2.139
3
+ Version: 0.2.140
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
- aiteamutils/base_model.py,sha256=0rs4cjnF2ea3Q2vBTj6F64BGk7ZglJsChsS7ne_R_tg,4056
2
+ aiteamutils/base_model.py,sha256=yBZqzTDF9PA4wCAvmYfG12FdVwLtxOEUCcA3z2i6fXU,4176
3
3
  aiteamutils/base_repository.py,sha256=Oy2zE1i5qx60Xf1tnsaKLyFWapiPqt5JH8NejwNrPWg,4647
4
- aiteamutils/base_service.py,sha256=QSUzdIcV88EdmjEF7vMyrN5CjKhS6HTbsoXSp8P9Gag,14432
4
+ aiteamutils/base_service.py,sha256=qzg7_rtnXFglg36RDsMScHkILrUbdsm67lmqicnFnlk,16051
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=tdvivl3XLNv7Al7H1gGFczmrHM8XlQpiZsEc2xQ_UTU,8829
10
+ aiteamutils/files.py,sha256=Dfi1rYMBZwV-3GMqZ77_I4BNMpnyL-OBaj9WwZVhCbs,8999
11
11
  aiteamutils/security.py,sha256=McUl3t5Z5SyUDVUHymHdDkYyF4YSeg4g9fFMML4W6Kw,11630
12
12
  aiteamutils/validators.py,sha256=_WHN6jqJQzKM5uPTg-Da8U2qqevS84XeKMkCCF4C_lY,9591
13
- aiteamutils/version.py,sha256=zSd70aa9K_B4_aJg7_D1oTM_3HSncLzFwXbLhIGYVA4,43
14
- aiteamutils-0.2.139.dist-info/METADATA,sha256=OmryJvAMZSQ69Szubzpbj94WBvAOv71nbu6eJdHyYuk,1743
15
- aiteamutils-0.2.139.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
- aiteamutils-0.2.139.dist-info/RECORD,,
13
+ aiteamutils/version.py,sha256=lUYyf6EhBRHxkbymtXrWeCpibvn_CBwk1pD92zTG0TU,43
14
+ aiteamutils-0.2.140.dist-info/METADATA,sha256=Y48xQbnxkdGCnlCjL7QuEfUyq4Ou0h65b6bUy3KkXck,1743
15
+ aiteamutils-0.2.140.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ aiteamutils-0.2.140.dist-info/RECORD,,