Compare commits
2 Commits
48600d7802
...
b30aa59e00
| Author | SHA1 | Date | |
|---|---|---|---|
| b30aa59e00 | |||
| fea3ceea87 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -176,4 +176,5 @@ cython_debug/
|
|||||||
.pypirc
|
.pypirc
|
||||||
|
|
||||||
# Static / IMG
|
# Static / IMG
|
||||||
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")
|
REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/1")
|
||||||
PROXY_URL = os.getenv("PROXY_URL")
|
PROXY_URL = os.getenv("PROXY_URL")
|
||||||
|
|
||||||
|
WELCOME_VIDEO_NOTE_FP = os.getenv("WELCOME_VIDEO_NOTE_FP", "static/welcome.mp4")
|
||||||
|
|
||||||
### Constants ###
|
### Constants ###
|
||||||
|
|
||||||
PAGE_SIZE = 8
|
PAGE_SIZE = 8
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from .invoices import Invoice, InvoiceStatus
|
from .invoices import Invoice, InvoiceStatus
|
||||||
from .orders import Order, OrderItem, OrderStatus
|
from .orders import Order, OrderItem, OrderStatus
|
||||||
from .products import Category, Product
|
from .products import Category, Product
|
||||||
|
from .users import User
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"Category",
|
"Category",
|
||||||
@@ -10,4 +11,5 @@ __all__ = [
|
|||||||
"OrderItem",
|
"OrderItem",
|
||||||
"OrderStatus",
|
"OrderStatus",
|
||||||
"Product",
|
"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 contextlib
|
||||||
|
import os
|
||||||
|
|
||||||
from aiogram import F, Router
|
from aiogram import F, Router
|
||||||
from aiogram.filters import Command
|
from aiogram.filters import Command
|
||||||
from aiogram.fsm.context import FSMContext
|
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 sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
|
from config import WELCOME_VIDEO_NOTE_FP
|
||||||
from misc.kb.client import main_menu_kb
|
from misc.kb.client import main_menu_kb
|
||||||
from repositories.order_items import OrderItemRepository
|
from repositories.order_items import OrderItemRepository
|
||||||
|
from repositories.users import create_user, get_user
|
||||||
from services.orders import OrderService
|
from services.orders import OrderService
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
@@ -22,6 +25,12 @@ async def user_main_menu(
|
|||||||
):
|
):
|
||||||
await state.clear()
|
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)
|
cart_items = await order_items_repo.get_items_count_by_customer(session, msg.from_user.id)
|
||||||
await msg.answer(
|
await msg.answer(
|
||||||
"<b>Добрый день!</b>\n" 'Нажмите "Каталог" чтобы выбрать товар или воспользуйтесь поиском.',
|
"<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