aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
authorTolmachev Igor <me@igorek.dev>2026-04-20 20:56:35 +0300
committerTolmachev Igor <me@igorek.dev>2026-04-20 20:56:35 +0300
commit75e99ca0712a2c09230e5c6f8d093dc526cc717d (patch)
treef3f00494364a82b866f093651cb9a08030135c4e /models
parentf186fca0f1aa9bbe5eab7613f229df527b2ab774 (diff)
downloadvpn_manager_bot-75e99ca0712a2c09230e5c6f8d093dc526cc717d.tar.gz
vpn_manager_bot-75e99ca0712a2c09230e5c6f8d093dc526cc717d.zip
Add users command
Diffstat (limited to 'models')
-rw-r--r--models/__init__.py3
-rw-r--r--models/callback_data.py41
-rw-r--r--models/user.py33
3 files changed, 75 insertions, 2 deletions
diff --git a/models/__init__.py b/models/__init__.py
index f26ee74..c458f30 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,7 +1,7 @@
1# isort: off 1# isort: off
2from .base import BaseTable 2from .base import BaseTable
3from .rich_text import RichText 3from .rich_text import RichText
4from .user import User, UserRole 4from .user import UserCache, User, UserRole
5from .invoce import Invoice 5from .invoce import Invoice
6from .payment import Payment, PaymentStatus, ReceiptFile, ReceiptFileType 6from .payment import Payment, PaymentStatus, ReceiptFile, ReceiptFileType
7from .announcement import Announcement 7from .announcement import Announcement
@@ -10,6 +10,7 @@ from . import callback_data
10 10
11__all__ = [ 11__all__ = [
12 "BaseTable", 12 "BaseTable",
13 "UserCache",
13 "User", 14 "User",
14 "UserRole", 15 "UserRole",
15 "Invoice", 16 "Invoice",
diff --git a/models/callback_data.py b/models/callback_data.py
index 5ee38bd..b1e7e56 100644
--- a/models/callback_data.py
+++ b/models/callback_data.py
@@ -1,6 +1,6 @@
1from aiogram.filters.callback_data import CallbackData 1from aiogram.filters.callback_data import CallbackData
2 2
3from models import PaymentStatus 3from models import PaymentStatus, UserRole
4 4
5 5
6class PayInvoiceClb(CallbackData, prefix="pay_invoice"): 6class PayInvoiceClb(CallbackData, prefix="pay_invoice"):
@@ -37,3 +37,42 @@ class PaymentPageClb(CallbackData, prefix="payment.p"):
37class PaymentItemClb(CallbackData, prefix="payment.i"): 37class PaymentItemClb(CallbackData, prefix="payment.i"):
38 page: int 38 page: int
39 payment_id: int 39 payment_id: int
40
41
42class UserPageClb(CallbackData, prefix="user.p"):
43 page: int
44
45
46class UserItemClb(CallbackData, prefix="user.i"):
47 page: int
48 user_id: int
49
50
51class UserAddClb(CallbackData, prefix="user.a"):
52 pass
53
54
55class UserRoleClb(CallbackData, prefix="user.e.r"):
56 page: int
57 user_id: int
58
59
60class UserRoleSetClb(CallbackData, prefix="user.e.r.s"):
61 page: int
62 user_id: int
63 role: UserRole
64
65
66class UserDeleteClb(CallbackData, prefix="user.e.d"):
67 page: int
68 user_id: int
69
70
71class UserDeleteConfirmClb(CallbackData, prefix="user.e.d.c"):
72 page: int
73 user_id: int
74
75
76class UserVpnLinkClb(CallbackData, prefix="user.e.v"):
77 page: int
78 user_id: int
diff --git a/models/user.py b/models/user.py
index 690083c..896ff3b 100644
--- a/models/user.py
+++ b/models/user.py
@@ -1,11 +1,44 @@
1from datetime import datetime 1from datetime import datetime
2from enum import IntEnum 2from enum import IntEnum
3from typing import Self
3 4
5from aiogram.types import Chat
6from aiogram.types import User as TgUser
7from pydantic import BaseModel
4from sqlalchemy.orm import Mapped, mapped_column 8from sqlalchemy.orm import Mapped, mapped_column
5 9
6from models import BaseTable 10from models import BaseTable
7 11
8 12
13class UserCache(BaseModel):
14 id: int
15 username: str | None = None
16 full_name: str
17
18 @classmethod
19 def from_chat(cls, chat: Chat) -> Self:
20 return cls(
21 id=chat.id,
22 username=chat.username,
23 full_name=chat.full_name,
24 )
25
26 @classmethod
27 def from_user(cls, user: TgUser) -> Self:
28 return cls(
29 id=user.id,
30 username=user.username,
31 full_name=user.full_name,
32 )
33
34 @property
35 def mention(self) -> str:
36 if self.username is not None:
37 return f'<a href="tg://{self.username}">{self.full_name}</a>'
38 else:
39 return f'<a href="tg://user?id={self.id}">{self.full_name}</a>'
40
41
9class UserRole(IntEnum): 42class UserRole(IntEnum):
10 REGULAR = 0 43 REGULAR = 0
11 ADMIN = 1 44 ADMIN = 1