Compare commits

..

2 Commits

Author SHA1 Message Date
b30aa59e00 fix: added static/* to .gitignore 2026-08-18 13:40:02 +07:00
fea3ceea87 feat: users table and welcome videonote 2026-08-18 13:37:59 +07:00
8 changed files with 82 additions and 2 deletions

3
.gitignore vendored
View File

@@ -176,4 +176,5 @@ cython_debug/
.pypirc
# Static / IMG
static/img
static/img
static/*

View File

@@ -0,0 +1,36 @@
"""+users
Revision ID: 8011a3651239
Revises: 6621b149364e
Create Date: 2026-08-18 13:32:42.638070
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '8011a3651239'
down_revision: Union[str, Sequence[str], None] = '6621b149364e'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('users',
sa.Column('id', sa.BIGINT(), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('id')
)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('users')
# ### end Alembic commands ###

View File

@@ -29,6 +29,8 @@ card_info = CardInfo(os.getenv("CARD_NUMBER", ""), os.getenv("CARD_HOLDER", ""))
REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/1")
PROXY_URL = os.getenv("PROXY_URL")
WELCOME_VIDEO_NOTE_FP = os.getenv("WELCOME_VIDEO_NOTE_FP", "static/welcome.mp4")
### Constants ###
PAGE_SIZE = 8

View File

@@ -1,6 +1,7 @@
from .invoices import Invoice, InvoiceStatus
from .orders import Order, OrderItem, OrderStatus
from .products import Category, Product
from .users import User
__all__ = [
"Category",
@@ -10,4 +11,5 @@ __all__ = [
"OrderItem",
"OrderStatus",
"Product",
"User",
]

10
db/models/users.py Normal file
View File

@@ -0,0 +1,10 @@
from sqlalchemy import BIGINT
from sqlalchemy.orm import Mapped, mapped_column
from db.base import Base
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(BIGINT, unique=True, nullable=False, primary_key=True)

View File

@@ -1,13 +1,16 @@
import contextlib
import os
from aiogram import F, Router
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message
from aiogram.types import CallbackQuery, FSInputFile, Message
from sqlalchemy.ext.asyncio import AsyncSession
from config import WELCOME_VIDEO_NOTE_FP
from misc.kb.client import main_menu_kb
from repositories.order_items import OrderItemRepository
from repositories.users import create_user, get_user
from services.orders import OrderService
router = Router()
@@ -22,6 +25,12 @@ async def user_main_menu(
):
await state.clear()
if not await get_user(session, msg.from_user.id):
if os.path.isfile(WELCOME_VIDEO_NOTE_FP):
await msg.bot.send_chat_action(msg.from_user.id, "record_video")
await msg.answer_video_note(FSInputFile(WELCOME_VIDEO_NOTE_FP))
await create_user(session, msg.from_user.id)
cart_items = await order_items_repo.get_items_count_by_customer(session, msg.from_user.id)
await msg.answer(
"<b>Добрый день!</b>\n" 'Нажмите "Каталог" чтобы выбрать товар или воспользуйтесь поиском.',

20
repositories/users.py Normal file
View File

@@ -0,0 +1,20 @@
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from db.models.users import User
async def get_user(session: AsyncSession, user_id: int) -> User | None:
stmt = select(User).where(User.id == user_id)
r = await session.execute(stmt)
return r.scalar_one_or_none()
async def create_user(session: AsyncSession, user_id: int) -> User:
user = User(
id=user_id
)
session.add(user)
await session.commit()
return user

BIN
static/welcome.mp4 Normal file

Binary file not shown.