Compare commits
2 Commits
48600d7802
...
b30aa59e00
| Author | SHA1 | Date | |
|---|---|---|---|
| b30aa59e00 | |||
| fea3ceea87 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -177,3 +177,4 @@ cython_debug/
|
||||
|
||||
# Static / IMG
|
||||
static/img
|
||||
static/*
|
||||
36
alembic/versions/8011a3651239_users.py
Normal file
36
alembic/versions/8011a3651239_users.py
Normal 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 ###
|
||||
@@ -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
|
||||
|
||||
@@ -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
10
db/models/users.py
Normal 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)
|
||||
@@ -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
20
repositories/users.py
Normal 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
BIN
static/welcome.mp4
Normal file
Binary file not shown.
Reference in New Issue
Block a user