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 +5 -0
- aiteamutils/base_service.py +53 -28
- aiteamutils/files.py +7 -4
- aiteamutils/version.py +1 -1
- {aiteamutils-0.2.139.dist-info → aiteamutils-0.2.140.dist-info}/METADATA +1 -1
- {aiteamutils-0.2.139.dist-info → aiteamutils-0.2.140.dist-info}/RECORD +7 -7
- {aiteamutils-0.2.139.dist-info → aiteamutils-0.2.140.dist-info}/WHEEL +0 -0
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,
|
aiteamutils/base_service.py
CHANGED
@@ -107,35 +107,60 @@ class BaseService(Generic[ModelType]):
|
|
107
107
|
# 파일 처리 및 저장
|
108
108
|
file_infos = {}
|
109
109
|
if separated_files:
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
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.
|
2
|
+
__version__ = "0.2.140"
|
@@ -1,16 +1,16 @@
|
|
1
1
|
aiteamutils/__init__.py,sha256=kRBpRjark0M8ZwFfmKiMFol6CbIILN3WE4f6_P6iIq0,1089
|
2
|
-
aiteamutils/base_model.py,sha256=
|
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=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=
|
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=
|
14
|
-
aiteamutils-0.2.
|
15
|
-
aiteamutils-0.2.
|
16
|
-
aiteamutils-0.2.
|
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,,
|
File without changes
|