From 0444ff325490f24e9a8d35f83ba37a0bd95ab6c5 Mon Sep 17 00:00:00 2001 From: Tolmachev Igor Date: Mon, 23 Mar 2026 22:17:24 +0300 Subject: Add pay_invoice button --- models/__init__.py | 8 ++++++-- models/callback_data.py | 9 ++++++++- models/payment.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++-- models/suggest.py | 3 +-- 4 files changed, 65 insertions(+), 7 deletions(-) (limited to 'models') diff --git a/models/__init__.py b/models/__init__.py index 0547429..f26ee74 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,9 +1,9 @@ # isort: off from .base import BaseTable from .rich_text import RichText -from .user import User +from .user import User, UserRole from .invoce import Invoice -from .payment import Payment +from .payment import Payment, PaymentStatus, ReceiptFile, ReceiptFileType from .announcement import Announcement from . import callback_data # isort: on @@ -11,8 +11,12 @@ from . import callback_data __all__ = [ "BaseTable", "User", + "UserRole", "Invoice", "Payment", + "PaymentStatus", + "ReceiptFile", + "ReceiptFileType", "RichText", "Announcement", "callback_data", diff --git a/models/callback_data.py b/models/callback_data.py index d3e6d61..137c4fa 100644 --- a/models/callback_data.py +++ b/models/callback_data.py @@ -1,5 +1,12 @@ from aiogram.filters.callback_data import CallbackData +from models import PaymentStatus -class PayInvoiceData(CallbackData, prefix="pay_invoice"): + +class PayInvoiceClb(CallbackData, prefix="pay_invoice"): invoice_id: int + + +class PaymentStatusClb(CallbackData, prefix="payment_status"): + payment_id: int + payment_status: PaymentStatus diff --git a/models/payment.py b/models/payment.py index 2b1cb90..afae642 100644 --- a/models/payment.py +++ b/models/payment.py @@ -1,16 +1,64 @@ from datetime import datetime +from enum import StrEnum, auto -from sqlalchemy import ForeignKey +from aiogram import Bot +from aiogram.types import Message, ReplyMarkupUnion +from pydantic import BaseModel +from sqlalchemy import JSON, ForeignKey from sqlalchemy.orm import Mapped, mapped_column from models import BaseTable, Invoice, User +class ReceiptFileType(StrEnum): + PHOTO = auto() + DOCUMENT = auto() + + +class ReceiptFile(BaseModel): + type: ReceiptFileType + file_id: str + + async def send( + self, + bot: Bot, + user_id: int, + reply_markup: ReplyMarkupUnion | None = None, + ) -> Message: + if self.type == ReceiptFileType.DOCUMENT: + return await bot.send_document( + user_id, + document=self.file_id, + reply_markup=reply_markup, + ) + else: + return await bot.send_photo( + user_id, + photo=self.file_id, + reply_markup=reply_markup, + ) + + +class PaymentStatus(StrEnum): + PENDING = auto() + ACCEPTED = auto() + REJECTED = auto() + + class Payment(BaseTable): __tablename__ = "payment" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column(ForeignKey(User.id)) invoice_id: Mapped[int] = mapped_column(ForeignKey(Invoice.id)) - receipt_file_id: Mapped[str] + __receipt_file: Mapped[str] = mapped_column("receipt_file", JSON()) + status: Mapped[PaymentStatus] = mapped_column(default=PaymentStatus.PENDING) datetime: Mapped[datetime] + + @property + def receipt_file(self) -> ReceiptFile: + return ReceiptFile.model_validate_json(self.__receipt_file) + + @receipt_file.setter + def receipt_file(self, value: ReceiptFile) -> None: + self.__receipt_file = value.model_dump_json() diff --git a/models/suggest.py b/models/suggest.py index a76a004..bd628bb 100644 --- a/models/suggest.py +++ b/models/suggest.py @@ -4,8 +4,7 @@ from sqlalchemy import JSON from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql.schema import ForeignKey -from models import RichText, User -from models.base import BaseTable +from models import BaseTable, RichText, User class Suggest(BaseTable): -- cgit v1.3