aiteamutils 0.2.160__py3-none-any.whl → 0.2.161__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
@@ -129,6 +129,16 @@ class BaseFileModel(BaseColumn):
129
129
  nullable=False,
130
130
  doc="MIME 타입"
131
131
  )
132
+ mime_type_main: Mapped[str] = mapped_column(
133
+ String,
134
+ nullable=False,
135
+ doc="MIME 타입 주 분류 (예: image, video, application 등)"
136
+ )
137
+ mime_type_sub: Mapped[str] = mapped_column(
138
+ String,
139
+ nullable=False,
140
+ doc="MIME 타입 부 분류 (예: jpeg, mp4, pdf 등)"
141
+ )
132
142
  size: Mapped[int] = mapped_column(
133
143
  nullable=False,
134
144
  doc="파일 크기(bytes)"
@@ -130,6 +130,8 @@ class BaseService(Generic[ModelType]):
130
130
  'original_name': f['original_name'],
131
131
  'storage_path': f['storage_path'],
132
132
  'mime_type': f['mime_type'],
133
+ 'mime_type_main': f['mime_type_main'],
134
+ 'mime_type_sub': f['mime_type_sub'],
133
135
  'size': f['size'],
134
136
  'checksum': f['checksum'],
135
137
  'column_name': f['column_name']
aiteamutils/files.py CHANGED
@@ -48,6 +48,25 @@ class FileHandler:
48
48
  original_error=e
49
49
  )
50
50
 
51
+ @staticmethod
52
+ def _split_mime_type(mime_type: str) -> Tuple[str, str]:
53
+ """MIME 타입을 주 타입과 부 타입으로 분리
54
+
55
+ Args:
56
+ mime_type (str): MIME 타입 문자열 (예: "image/jpeg")
57
+
58
+ Returns:
59
+ Tuple[str, str]: (주 타입, 부 타입) 튜플
60
+ """
61
+ try:
62
+ if not mime_type or '/' not in mime_type:
63
+ return 'application', 'octet-stream'
64
+ main_type, sub_type = mime_type.split('/', 1)
65
+ return main_type.lower(), sub_type.lower()
66
+ except Exception as e:
67
+ logger.error(f"[MIME 타입 분리 실패] {mime_type}: {str(e)}")
68
+ return 'application', 'octet-stream'
69
+
51
70
  @staticmethod
52
71
  async def _calculate_checksum(file: BinaryIO) -> str:
53
72
  """파일의 SHA-256 체크섬 계산
@@ -131,10 +150,17 @@ class FileHandler:
131
150
  # 파일 포인터 복구
132
151
  file.seek(current_position)
133
152
 
153
+ # MIME 타입 처리
154
+ mime_type = FileHandler._get_mime_type(original_name)
155
+ mime_type_main, mime_type_sub = FileHandler._split_mime_type(mime_type)
156
+ logger.info(f"[MIME 타입 분리] {mime_type} -> {mime_type_main}/{mime_type_sub}")
157
+
134
158
  file_info = {
135
159
  "original_name": original_name,
136
160
  "storage_path": storage_path,
137
- "mime_type": FileHandler._get_mime_type(original_name),
161
+ "mime_type": mime_type,
162
+ "mime_type_main": mime_type_main,
163
+ "mime_type_sub": mime_type_sub,
138
164
  "size": os.path.getsize(storage_path),
139
165
  "checksum": checksum,
140
166
  "entity_name": entity_name,
@@ -202,12 +228,12 @@ class FileHandler:
202
228
  text("""
203
229
  INSERT INTO files (
204
230
  ulid, entity_name, entity_ulid, original_name, storage_path,
205
- mime_type, size, checksum, column_name, created_at, updated_at,
206
- is_deleted
231
+ mime_type, mime_type_main, mime_type_sub, size, checksum,
232
+ column_name, created_at, updated_at, is_deleted
207
233
  ) VALUES (
208
234
  :ulid, :entity_name, :entity_ulid, :original_name, :storage_path,
209
- :mime_type, :size, :checksum, :column_name, :created_at, :updated_at,
210
- :is_deleted
235
+ :mime_type, :mime_type_main, :mime_type_sub, :size, :checksum,
236
+ :column_name, :created_at, :updated_at, :is_deleted
211
237
  ) RETURNING *
212
238
  """),
213
239
  {
@@ -217,6 +243,8 @@ class FileHandler:
217
243
  "original_name": file_info["original_name"],
218
244
  "storage_path": file_info["storage_path"],
219
245
  "mime_type": file_info["mime_type"],
246
+ "mime_type_main": file_info["mime_type_main"],
247
+ "mime_type_sub": file_info["mime_type_sub"],
220
248
  "size": file_info["size"],
221
249
  "checksum": file_info["checksum"],
222
250
  "column_name": column_name,
@@ -234,6 +262,8 @@ class FileHandler:
234
262
  "original_name": row.original_name,
235
263
  "storage_path": row.storage_path,
236
264
  "mime_type": row.mime_type,
265
+ "mime_type_main": row.mime_type_main,
266
+ "mime_type_sub": row.mime_type_sub,
237
267
  "size": row.size,
238
268
  "checksum": row.checksum,
239
269
  "column_name": row.column_name,
aiteamutils/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  """버전 정보"""
2
- __version__ = "0.2.160"
2
+ __version__ = "0.2.161"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiteamutils
3
- Version: 0.2.160
3
+ Version: 0.2.161
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,17 +1,17 @@
1
1
  aiteamutils/__init__.py,sha256=kRBpRjark0M8ZwFfmKiMFol6CbIILN3WE4f6_P6iIq0,1089
2
- aiteamutils/base_model.py,sha256=yBZqzTDF9PA4wCAvmYfG12FdVwLtxOEUCcA3z2i6fXU,4176
2
+ aiteamutils/base_model.py,sha256=DFjDdNJ8dMFcWmeZwO1K69zPZE7tSu30SQ8si_1jhWk,4502
3
3
  aiteamutils/base_repository.py,sha256=Oy2zE1i5qx60Xf1tnsaKLyFWapiPqt5JH8NejwNrPWg,4647
4
- aiteamutils/base_service.py,sha256=5YSRpulLI-tO6zQ75LBTsyzYoMzayPITWhE5-8rie3s,21068
4
+ aiteamutils/base_service.py,sha256=JIeRtFn1Ll4Qcq3v88pgS9lmEQLQoVyyOKqYR8n02S4,21192
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=Qq2w3VAEOzvsDirYtxRTN48LnIzf4TPUH2LftmyYtQk,12831
10
+ aiteamutils/files.py,sha256=fxnCu9rErd4vCovMi0jy4adLUiA7rx_q4RdOL4wSgsU,14258
11
11
  aiteamutils/models.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
12
12
  aiteamutils/security.py,sha256=McUl3t5Z5SyUDVUHymHdDkYyF4YSeg4g9fFMML4W6Kw,11630
13
13
  aiteamutils/validators.py,sha256=_WHN6jqJQzKM5uPTg-Da8U2qqevS84XeKMkCCF4C_lY,9591
14
- aiteamutils/version.py,sha256=Dv_RPFPM_ljwt7FQn4GsgrSYOBxg7SL2-aDSf-jrp30,43
15
- aiteamutils-0.2.160.dist-info/METADATA,sha256=-mvX5XwdZbNh-6odVtUghcR6k9YU_P2eOv8XruEj5Gg,1743
16
- aiteamutils-0.2.160.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
- aiteamutils-0.2.160.dist-info/RECORD,,
14
+ aiteamutils/version.py,sha256=M1uxYIyHaq1jeL34T8UnMNaPGC2Tg5FBCVdajkMtNpE,43
15
+ aiteamutils-0.2.161.dist-info/METADATA,sha256=MEeOAEX3rJiiOvxkeP2-P4pm2sMMSoUTzZQBu0Wt-KU,1743
16
+ aiteamutils-0.2.161.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
+ aiteamutils-0.2.161.dist-info/RECORD,,