f613d9f69e
# Conflicts: # .gitignore # Dockerfile # apps/admin/services.py # apps/admin/views.py # apps/base/models.py # apps/base/views.py # core/settings.py
110 lines
4.1 KiB
Python
110 lines
4.1 KiB
Python
# @Time : 2023/8/13 20:43
|
|
# @Author : Lan
|
|
# @File : models.py
|
|
# @Software: PyCharm
|
|
from typing import Optional
|
|
|
|
from tortoise.models import Model
|
|
from tortoise.contrib.pydantic import pydantic_model_creator
|
|
|
|
from tortoise import fields, models
|
|
from datetime import datetime
|
|
from core.utils import get_now
|
|
|
|
|
|
class FileCodes(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
code = fields.CharField(max_length=255, unique=True, index=True)
|
|
prefix = fields.CharField(max_length=255, default="")
|
|
suffix = fields.CharField(max_length=255, default="")
|
|
uuid_file_name = fields.CharField(max_length=255, null=True)
|
|
file_path = fields.CharField(max_length=255, null=True)
|
|
size = fields.BigIntField(default=0)
|
|
text = fields.TextField(null=True)
|
|
expired_at = fields.DatetimeField(null=True)
|
|
expired_count = fields.IntField(default=0)
|
|
used_count = fields.IntField(default=0)
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
file_hash = fields.CharField(max_length=64, null=True)
|
|
is_chunked = fields.BooleanField(default=False)
|
|
upload_id = fields.CharField(max_length=36, null=True)
|
|
|
|
async def is_expired(self):
|
|
if self.expired_at is None:
|
|
return False
|
|
if self.expired_at and self.expired_count < 0:
|
|
return self.expired_at < await get_now()
|
|
return self.expired_count <= 0
|
|
|
|
async def get_file_path(self):
|
|
return f"{self.file_path}/{self.uuid_file_name}"
|
|
|
|
|
|
class UploadChunk(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
upload_id = fields.CharField(max_length=36, index=True)
|
|
chunk_index = fields.IntField()
|
|
chunk_hash = fields.CharField(max_length=64)
|
|
total_chunks = fields.IntField()
|
|
file_size = fields.BigIntField()
|
|
chunk_size = fields.IntField()
|
|
file_name = fields.CharField(max_length=255)
|
|
save_path = fields.CharField(max_length=512, null=True)
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
completed = fields.BooleanField(default=False)
|
|
|
|
|
|
class TransferStats(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
action = fields.CharField(max_length=16, index=True)
|
|
file_code_id = fields.IntField(null=True, index=True)
|
|
code = fields.CharField(max_length=255, null=True, index=True)
|
|
name = fields.CharField(max_length=512, default="")
|
|
size = fields.BigIntField(default=0)
|
|
ip = fields.CharField(max_length=64, default="")
|
|
file_path = fields.CharField(max_length=1024, default="")
|
|
expired_at = fields.DatetimeField(null=True)
|
|
deleted_at = fields.DatetimeField(null=True, index=True)
|
|
meta = fields.TextField(null=True)
|
|
created_at = fields.DatetimeField(auto_now_add=True, index=True)
|
|
|
|
class Meta:
|
|
table = "transfer_stats"
|
|
|
|
|
|
class KeyValue(Model):
|
|
id: Optional[int] = fields.IntField(pk=True)
|
|
key: Optional[str] = fields.CharField(
|
|
max_length=255, description="键", index=True, unique=True
|
|
)
|
|
value: Optional[str] = fields.JSONField(description="值", null=True)
|
|
created_at: Optional[datetime] = fields.DatetimeField(
|
|
auto_now_add=True, description="创建时间"
|
|
)
|
|
|
|
|
|
class PresignUploadSession(models.Model):
|
|
"""预签名上传会话模型"""
|
|
|
|
id = fields.IntField(pk=True)
|
|
upload_id = fields.CharField(max_length=36, unique=True, index=True)
|
|
file_name = fields.CharField(max_length=255)
|
|
file_size = fields.BigIntField()
|
|
save_path = fields.CharField(max_length=512)
|
|
mode = fields.CharField(max_length=10) # "direct" 或 "proxy"
|
|
expire_value = fields.IntField(default=1)
|
|
expire_style = fields.CharField(max_length=20, default="day")
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
expires_at = fields.DatetimeField() # 会话过期时间
|
|
|
|
async def is_expired(self):
|
|
"""检查会话是否已过期"""
|
|
return self.expires_at < await get_now()
|
|
|
|
|
|
file_codes_pydantic = pydantic_model_creator(FileCodes, name="FileCodes")
|
|
upload_chunk_pydantic = pydantic_model_creator(UploadChunk, name="UploadChunk")
|
|
key_value_pydantic = pydantic_model_creator(KeyValue, name="KeyValue")
|
|
presign_upload_session_pydantic = pydantic_model_creator(
|
|
PresignUploadSession, name="PresignUploadSession"
|
|
) |