|
from tortoise import fields, models
|
|
from tortoise.contrib.pydantic import pydantic_model_creator
|
|
from datetime import datetime
|
|
|
|
class User(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
username = fields.CharField(max_length=20, unique=True)
|
|
email = fields.CharField(max_length=255, unique=True)
|
|
hashed_password = fields.CharField(max_length=255)
|
|
is_active = fields.BooleanField(default=True)
|
|
is_superuser = fields.BooleanField(default=False)
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
updated_at = fields.DatetimeField(auto_now=True)
|
|
storage_quota_bytes = fields.BigIntField(default=10 * 1024 * 1024 * 1024) # 10 GB default
|
|
used_storage_bytes = fields.BigIntField(default=0)
|
|
plan_type = fields.CharField(max_length=50, default="free")
|
|
two_factor_secret = fields.CharField(max_length=255, null=True)
|
|
is_2fa_enabled = fields.BooleanField(default=False)
|
|
recovery_codes = fields.TextField(null=True)
|
|
|
|
class Meta:
|
|
table = "users"
|
|
|
|
def __str__(self):
|
|
return self.username
|
|
|
|
class Folder(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
name = fields.CharField(max_length=255)
|
|
parent: fields.ForeignKeyRelation["Folder"] = fields.ForeignKeyField("models.Folder", related_name="children", null=True)
|
|
owner: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="folders")
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
updated_at = fields.DatetimeField(auto_now=True)
|
|
is_deleted = fields.BooleanField(default=False)
|
|
is_starred = fields.BooleanField(default=False)
|
|
|
|
class Meta:
|
|
table = "folders"
|
|
unique_together = (("name", "parent", "owner"),) # Ensure unique folder names within a parent for an owner
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class File(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
name = fields.CharField(max_length=255)
|
|
path = fields.CharField(max_length=1024) # Internal storage path
|
|
size = fields.BigIntField()
|
|
mime_type = fields.CharField(max_length=255)
|
|
file_hash = fields.CharField(max_length=64, null=True) # SHA-256
|
|
thumbnail_path = fields.CharField(max_length=1024, null=True)
|
|
parent: fields.ForeignKeyRelation[Folder] = fields.ForeignKeyField("models.Folder", related_name="files", null=True)
|
|
owner: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="files")
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
updated_at = fields.DatetimeField(auto_now=True)
|
|
is_deleted = fields.BooleanField(default=False)
|
|
deleted_at = fields.DatetimeField(null=True)
|
|
is_starred = fields.BooleanField(default=False)
|
|
last_accessed_at = fields.DatetimeField(null=True)
|
|
|
|
class Meta:
|
|
table = "files"
|
|
unique_together = (("name", "parent", "owner"),) # Ensure unique file names within a parent for an owner
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class FileVersion(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
file: fields.ForeignKeyRelation[File] = fields.ForeignKeyField("models.File", related_name="versions")
|
|
version_path = fields.CharField(max_length=1024)
|
|
size = fields.BigIntField()
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
table = "file_versions"
|
|
|
|
class Share(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
token = fields.CharField(max_length=64, unique=True)
|
|
file: fields.ForeignKeyRelation[File] = fields.ForeignKeyField("models.File", related_name="shares", null=True)
|
|
folder: fields.ForeignKeyRelation[Folder] = fields.ForeignKeyField("models.Folder", related_name="shares", null=True)
|
|
owner: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="shares")
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
expires_at = fields.DatetimeField(null=True)
|
|
password_protected = fields.BooleanField(default=False)
|
|
hashed_password = fields.CharField(max_length=255, null=True)
|
|
access_count = fields.IntField(default=0)
|
|
permission_level = fields.CharField(max_length=50, default="viewer") # viewer, uploader, editor
|
|
|
|
class Meta:
|
|
table = "shares"
|
|
|
|
class Team(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
name = fields.CharField(max_length=255, unique=True)
|
|
owner: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="owned_teams")
|
|
members: fields.ManyToManyRelation[User] = fields.ManyToManyField("models.User", related_name="teams", through="team_members")
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
table = "teams"
|
|
|
|
class TeamMember(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
team: fields.ForeignKeyRelation[Team] = fields.ForeignKeyField("models.Team", related_name="team_members")
|
|
user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="user_teams")
|
|
role = fields.CharField(max_length=50, default="member") # owner, admin, member
|
|
|
|
class Meta:
|
|
table = "team_members"
|
|
unique_together = (("team", "user"),)
|
|
|
|
class Activity(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="activities", null=True)
|
|
action = fields.CharField(max_length=255)
|
|
target_type = fields.CharField(max_length=50) # file, folder, share, user, team
|
|
target_id = fields.IntField()
|
|
ip_address = fields.CharField(max_length=45, null=True)
|
|
timestamp = fields.DatetimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
table = "activities"
|
|
|
|
class FileRequest(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
title = fields.CharField(max_length=255)
|
|
description = fields.TextField(null=True)
|
|
token = fields.CharField(max_length=64, unique=True)
|
|
owner: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="file_requests")
|
|
target_folder: fields.ForeignKeyRelation[Folder] = fields.ForeignKeyField("models.Folder", related_name="file_requests")
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
expires_at = fields.DatetimeField(null=True)
|
|
is_active = fields.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
table = "file_requests"
|
|
|
|
class WebDAVProperty(models.Model):
|
|
id = fields.IntField(pk=True)
|
|
resource_type = fields.CharField(max_length=10)
|
|
resource_id = fields.IntField()
|
|
namespace = fields.CharField(max_length=255)
|
|
name = fields.CharField(max_length=255)
|
|
value = fields.TextField()
|
|
created_at = fields.DatetimeField(auto_now_add=True)
|
|
updated_at = fields.DatetimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
table = "webdav_properties"
|
|
unique_together = (("resource_type", "resource_id", "namespace", "name"),)
|
|
|
|
User_Pydantic = pydantic_model_creator(User, name="User_Pydantic")
|
|
UserIn_Pydantic = pydantic_model_creator(User, name="UserIn_Pydantic", exclude_readonly=True)
|