改用API驗證
This commit is contained in:
@@ -40,6 +40,7 @@ class TranslationJob(db.Model):
|
||||
error_message = db.Column(db.Text, comment='錯誤訊息')
|
||||
total_tokens = db.Column(db.Integer, default=0, comment='總token數')
|
||||
total_cost = db.Column(db.Numeric(10, 4), default=0.0000, comment='總成本')
|
||||
conversation_id = db.Column(db.String(100), comment='Dify對話ID,用於維持翻譯上下文')
|
||||
processing_started_at = db.Column(db.DateTime, comment='開始處理時間')
|
||||
completed_at = db.Column(db.DateTime, comment='完成時間')
|
||||
created_at = db.Column(db.DateTime, default=func.now(), comment='建立時間')
|
||||
@@ -82,6 +83,7 @@ class TranslationJob(db.Model):
|
||||
'error_message': self.error_message,
|
||||
'total_tokens': self.total_tokens,
|
||||
'total_cost': float(self.total_cost) if self.total_cost else 0.0,
|
||||
'conversation_id': self.conversation_id,
|
||||
'processing_started_at': format_taiwan_time(self.processing_started_at, "%Y-%m-%d %H:%M:%S") if self.processing_started_at else None,
|
||||
'completed_at': format_taiwan_time(self.completed_at, "%Y-%m-%d %H:%M:%S") if self.completed_at else None,
|
||||
'created_at': format_taiwan_time(self.created_at, "%Y-%m-%d %H:%M:%S") if self.created_at else None,
|
||||
@@ -115,38 +117,63 @@ class TranslationJob(db.Model):
|
||||
|
||||
def add_original_file(self, filename, file_path, file_size):
|
||||
"""新增原始檔案記錄"""
|
||||
from pathlib import Path
|
||||
stored_name = Path(file_path).name
|
||||
|
||||
original_file = JobFile(
|
||||
job_id=self.id,
|
||||
file_type='ORIGINAL',
|
||||
filename=filename,
|
||||
file_type='source',
|
||||
original_filename=filename,
|
||||
stored_filename=stored_name,
|
||||
file_path=file_path,
|
||||
file_size=file_size
|
||||
file_size=file_size,
|
||||
mime_type=self._get_mime_type(filename)
|
||||
)
|
||||
db.session.add(original_file)
|
||||
db.session.commit()
|
||||
return original_file
|
||||
|
||||
|
||||
def add_translated_file(self, language_code, filename, file_path, file_size):
|
||||
"""新增翻譯檔案記錄"""
|
||||
from pathlib import Path
|
||||
stored_name = Path(file_path).name
|
||||
|
||||
translated_file = JobFile(
|
||||
job_id=self.id,
|
||||
file_type='TRANSLATED',
|
||||
file_type='translated',
|
||||
language_code=language_code,
|
||||
filename=filename,
|
||||
original_filename=filename,
|
||||
stored_filename=stored_name,
|
||||
file_path=file_path,
|
||||
file_size=file_size
|
||||
file_size=file_size,
|
||||
mime_type=self._get_mime_type(filename)
|
||||
)
|
||||
db.session.add(translated_file)
|
||||
db.session.commit()
|
||||
return translated_file
|
||||
|
||||
def _get_mime_type(self, filename):
|
||||
"""取得MIME類型"""
|
||||
import mimetypes
|
||||
from pathlib import Path
|
||||
|
||||
ext = Path(filename).suffix.lower()
|
||||
mime_map = {
|
||||
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'.pdf': 'application/pdf',
|
||||
'.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'.txt': 'text/plain'
|
||||
}
|
||||
return mime_map.get(ext, mimetypes.guess_type(filename)[0] or 'application/octet-stream')
|
||||
|
||||
def get_translated_files(self):
|
||||
"""取得翻譯檔案"""
|
||||
return self.files.filter_by(file_type='TRANSLATED').all()
|
||||
|
||||
return self.files.filter_by(file_type='translated').all()
|
||||
|
||||
def get_original_file(self):
|
||||
"""取得原始檔案"""
|
||||
return self.files.filter_by(file_type='ORIGINAL').first()
|
||||
return self.files.filter_by(file_type='source').first()
|
||||
|
||||
def can_retry(self):
|
||||
"""是否可以重試"""
|
||||
@@ -257,23 +284,25 @@ class TranslationJob(db.Model):
|
||||
class JobFile(db.Model):
|
||||
"""檔案記錄表 (dt_job_files)"""
|
||||
__tablename__ = 'dt_job_files'
|
||||
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||
job_id = db.Column(db.Integer, db.ForeignKey('dt_translation_jobs.id'), nullable=False, comment='任務ID')
|
||||
file_type = db.Column(
|
||||
db.Enum('ORIGINAL', 'TRANSLATED', name='file_type'),
|
||||
nullable=False,
|
||||
db.Enum('source', 'translated', name='file_type'),
|
||||
nullable=False,
|
||||
comment='檔案類型'
|
||||
)
|
||||
language_code = db.Column(db.String(50), comment='語言代碼(翻譯檔案)')
|
||||
filename = db.Column(db.String(500), nullable=False, comment='檔案名稱')
|
||||
file_path = db.Column(db.String(1000), nullable=False, comment='檔案路徑')
|
||||
file_size = db.Column(db.BigInteger, nullable=False, comment='檔案大小')
|
||||
original_filename = db.Column(db.String(255), nullable=False, comment='原始檔名')
|
||||
stored_filename = db.Column(db.String(255), nullable=False, comment='儲存檔名')
|
||||
file_path = db.Column(db.String(500), nullable=False, comment='檔案路徑')
|
||||
file_size = db.Column(db.BigInteger, default=0, comment='檔案大小')
|
||||
mime_type = db.Column(db.String(100), comment='MIME 類型')
|
||||
created_at = db.Column(db.DateTime, default=func.now(), comment='建立時間')
|
||||
|
||||
|
||||
def __repr__(self):
|
||||
return f'<JobFile {self.filename}>'
|
||||
|
||||
return f'<JobFile {self.original_filename}>'
|
||||
|
||||
def to_dict(self):
|
||||
"""轉換為字典格式"""
|
||||
return {
|
||||
@@ -281,9 +310,11 @@ class JobFile(db.Model):
|
||||
'job_id': self.job_id,
|
||||
'file_type': self.file_type,
|
||||
'language_code': self.language_code,
|
||||
'filename': self.filename,
|
||||
'original_filename': self.original_filename,
|
||||
'stored_filename': self.stored_filename,
|
||||
'file_path': self.file_path,
|
||||
'file_size': self.file_size,
|
||||
'mime_type': self.mime_type,
|
||||
'created_at': format_taiwan_time(self.created_at, "%Y-%m-%d %H:%M:%S") if self.created_at else None
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user