https://dev.kronoz.win/r/marzneshin.git
1from fastapi.security import OAuth2PasswordBearer
2from passlib.context import CryptContext
3from pydantic import ConfigDict, BaseModel
4
5pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
6oauth2_scheme = OAuth2PasswordBearer(
7 tokenUrl="/api/admins/token"
8) # Admin view url
9
10
11class Token(BaseModel):
12 access_token: str
13 is_sudo: bool
14 token_type: str = "bearer"
15
16
17class Admin(BaseModel):
18 id: int | None = None
19 username: str
20 is_sudo: bool
21 enabled: bool = True
22 all_services_access: bool = False
23 modify_users_access: bool = True
24 service_ids: list = []
25 subscription_url_prefix: str = ""
26 model_config = ConfigDict(from_attributes=True)
27
28
29class AdminCreate(Admin):
30 username: str
31 password: str
32
33 @property
34 def hashed_password(self):
35 return pwd_context.hash(self.password)
36
37
38class AdminResponse(Admin):
39 id: int
40 users_data_usage: int
41
42
43class AdminModify(Admin):
44 password: str
45 is_sudo: bool
46
47 @property
48 def hashed_password(self):
49 return (
50 pwd_context.hash(self.password)
51 if self.password is not None
52 else None
53 )
54
55
56class AdminPartialModify(AdminModify):
57 """__annotations__ = {
58 k: v | None for k, v in AdminModify.__annotations__.items()
59 }"""
60
61 password: str | None = None
62 username: str | None = None
63 is_sudo: bool | None = None
64 enabled: bool | None = None
65 all_services_access: bool | None = None
66 modify_users_access: bool | None = None
67 service_ids: list | None = None
68 subscription_url_prefix: str | None = None
69
70
71class AdminInDB(Admin):
72 username: str
73 hashed_password: str
74
75 def verify_password(self, plain_password):
76 return pwd_context.verify(plain_password, self.hashed_password)