from tortoise import fields, models from tortoise.contrib.pydantic import pydantic_model_creator class User(models.Model): id = fields.IntField(primary_key=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(primary_key=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(primary_key=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(primary_key=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(primary_key=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(primary_key=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(primary_key=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(primary_key=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(primary_key=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(primary_key=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 )