PyZipline/pyzipline/models.py

250 lines
8.5 KiB
Python
Raw Permalink Normal View History

"""This is a list of all the models used in PyZipline. They are used to represent the data returned from the Zipline API."""
2024-03-28 11:28:24 -04:00
import logging
2023-12-19 05:36:18 -05:00
from datetime import datetime
from typing import Dict, List, Optional, Union
2023-12-19 05:36:18 -05:00
2024-03-28 11:28:24 -04:00
from pydantic import BaseModel, ConfigDict, Field
2023-12-19 05:36:18 -05:00
class File(BaseModel):
"""File object used for uploading files to Zipline
2023-12-20 21:37:02 -05:00
Attributes:
createdAt (datetime.datetime): Datetime object of when the file was created
id (int): ID of the file
mimetype (str): String of the file's mimetype
views (int): Integer of the number of views the file has
name (str): String of the file's name
size (int): Integer of the file's size in bytes
favorite (bool): Boolean of whether the file is favorited
originalName (Optional[str]): String of the file's original name
url (Optional[str]): String of the file's URL
maxViews (Optional[int]): Integer of the file's maximum number of views
expiredAt (Optional[datetime]): Datetime object of when the file will expire
thumbnail (Optional[str]): String of the file's thumbnail URL
folderId (Optional[int]): Integer of the file's folder ID
"""
createdAt: datetime
id: int
mimetype: str
views: int
name: str
size: int
favorite: bool
originalName: Optional[str] = None
url: Optional[str] = None
maxViews: Optional[int] = None
expiredAt: Optional[datetime] = None
thumbnail: Optional[str] = None
folderId: Optional[int] = None
2023-12-19 05:36:18 -05:00
def __str__(self):
return self.name
class Invite(BaseModel):
"""Invite object used for managing invites
Attributes:
id (int): Integer ID of the invite
code (str): String of the invite's code
createdAt (datetime): Datetime object of when the invite was created
expiresAt (datetime): Datetime object of when the invite will expire
used (bool): Boolean of whether the invite has been used
createdById (int): Integer ID of the user who created the invite
"""
id: int
code: str
createdAt: datetime
expiresAt: datetime
used: bool
createdById: int
2023-12-19 05:36:18 -05:00
def __str__(self):
return self.code
class Result(BaseModel):
"""Result returned from low-level RestAdapter
2023-12-20 21:37:02 -05:00
Attributes:
success (bool): Boolean of whether the request was successful
status_code (int): Standard HTTP Status code
message (str = ''): Human readable result
data (Union[List[Dict], Dict]): Python List of Dictionaries (or maybe just a single Dictionary on error)
"""
success: bool
status_code: int
message: str = ''
data: Union[List[Dict], Dict] = {}
def __str__(self):
return f"{self.status_code}: {self.message}"
2023-12-19 05:36:18 -05:00
class TypesCountItem(BaseModel):
"""Model used in [StatsData](.#pyzipline.models.StatsData) for storing the number of files with a specific mimetype
2023-12-19 05:36:18 -05:00
Attributes:
mimetype (str): String of the mimetype
count (int): Integer of the number of files with this mimetype
"""
count: int
mimetype: str
def __str__(self):
return f"{self.mimetype}: {self.count}"
class CountByUserItem(BaseModel):
"""Model used in [StatsData](.#pyzipline.models.StatsData) for storing the number of files uploaded by a user
2023-12-20 21:37:02 -05:00
Attributes:
username (str): String of the username
count (int): Integer of the number of files uploaded by this user
"""
count: int
username: str
2023-12-19 05:36:18 -05:00
def __str__(self):
return f"{self.username}: {self.count}"
class StatsData(BaseModel):
"""Stats data model
Attributes:
id (int): Integer ID of the stats
createdAt (datetime): Datetime object of when the stats were created
max_timestamp (Optional[datetime]): Datetime object of the maximum timestamp of the stats
size (str): String of the size of the files
size_num (int): Integer of the size of the files in bytes
count (int): Integer of the number of files
count_users (int): Integer of the number of users
views_count (int): Integer of the number of views
types_count (Optional[List[Mimetype]]): List of Mimetype objects
count_by_user (Optional[List[CountByUser]]): List of CountByUser objects
"""
size: str
count: int
size_num: int
count_users: int
types_count: List[TypesCountItem]
views_count: int
count_by_user: List[CountByUserItem]
2023-12-19 05:36:18 -05:00
2023-12-21 15:34:04 -05:00
class Stats(BaseModel):
"""Stats model
2023-12-20 21:37:02 -05:00
Attributes:
id (int): Integer ID of the stats
createdAt (datetime): Datetime object of when the stats were created
data (StatsData): StatsData object of the stats data
max_timestamp (Optional[datetime]): Datetime object of the maximum timestamp of the stats
"""
id: int
createdAt: datetime
data: StatsData
max_timestamp: str = Field(default=None)
class Embed(BaseModel):
2024-03-28 11:28:24 -04:00
"""Object containing a user's embed settings
Attributes:
color (Optional[str]): String of the embed's color
title (Optional[str]): String of the embed's title
site_name (Optional[str]): String of the embed's site name
description (Optional[str]): String of the embed's description
"""
color: Optional[str] = None
title: Optional[str] = None
siteName: Optional[str] = None
description: Optional[str] = None
2024-03-28 11:28:24 -04:00
def __str__(self):
if self.title is None:
return "None"
return self.title
class User(BaseModel):
2024-03-28 11:28:24 -04:00
"""Object containing user information
/// admonition | Contains Sensitive Information
type: danger
Please be mindful of how you use/store this object, as it contains sensitive information such as the user's token and TOTP information.
///
Attributes:
id (int): Integer ID of the user
uuid (str): String of the user's UUID
username (str): String of the user's username
avatar (Optional[str]): String of the user's avatar, base64 encoded
token (str): String of the user's token
administrator (bool): Boolean of whether the user is an administrator
super_admin (bool): Boolean of whether the user is a super administrator
system_theme (str): String of the user's system theme
embed (Embed): Embed object of the user's embed
totp_secret (Optional[str]): String of the user's TOTP secret
domains (List[str]): List of Strings of the user's domains
oauth (Optional[List[OAuth]]): List of [OAuth](.#pyzipline.models.OAuth) objects
ratelimit (Optional[datetime]): Datetime object of when the user's ratelimit expires
"""
id: int
uuid: str
username: str
avatar: Optional[str]
token: str
administrator: bool
superAdmin: bool
systemTheme: str
embed: Embed
ratelimit: None
totpSecret: Optional[str]
domains: List[str]
def __str__(self):
return self.username
class Versions(BaseModel):
2024-03-28 11:28:24 -04:00
"""Object containing the current, stable, and upstream versions of Zipline
Attributes:
stable (str): String of the stable version
upstream (str): String of the upstream version
current (str): String of the current version
"""
stable: str
upstream: str
current: str
class Version(BaseModel):
2024-03-28 11:28:24 -04:00
"""Model containing the current, stable, and upstream versions of Zipline
Attributes:
is_upstream (bool): Boolean of whether the current version is upstream (`trunk` branch)
update_to_type (str): String of the type of update available, one of 'stable' or 'upstream'
versions (Versions): Versions object containing the current, stable, and upstream versions
"""
isUpstream: bool
updateToType: str
versions: Versions
def __str__(self):
return self.versions.current
2024-03-28 11:28:24 -04:00
class ZiplineApiConfig(BaseModel):
"""Represents a configuration instance for the ZiplineApi/RestAdapter class.
Args:
hostname (str): The hostname of your Zipline instance, WITHOUT https or http.
token (str): String used for authentication when making requests.
ssl (bool): Normally set to True, but if your Zipline instance doesn't use SSL/TLS, set this to False.
enforced_signing (bool): Normally set to True, but if having SSL/TLS cert validation issues, can turn off with False.
logger (logging.Logger): If your app has a logger, pass it in here.
"""
model_config = ConfigDict(arbitrary_types_allowed=True)
hostname: str
token: str = ''
ssl: bool = True
enforced_signing: bool = True
logger: logging.Logger = logging.getLogger(__name__)