Добавлены новые файлы: .gitignore для исключения временных файлов, fill_db.py для заполнения базы данных тестовыми данными, main.py с основным функционалом FastAPI, models.py с API моделями и requirements.txt для зависимостей проекта.
This commit is contained in:
161
fill_db.py
Normal file
161
fill_db.py
Normal file
@@ -0,0 +1,161 @@
|
||||
import random
|
||||
from uuid import uuid4
|
||||
from sqlmodel import Session
|
||||
from main import AUTH_DB_ENGINE, TgAgent, Ref, Sale, Transaction
|
||||
from sqlalchemy import text
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
|
||||
# Константа: список user_ids
|
||||
USER_IDS = [1001, 256844410, 426261192, 564746427]
|
||||
|
||||
# Примеры телефонов
|
||||
PHONES = [
|
||||
"+79991234567",
|
||||
"+79997654321",
|
||||
"+79993456789",
|
||||
"+79992345678",
|
||||
"+79994561234"
|
||||
]
|
||||
|
||||
# Примеры описаний
|
||||
DESCRIPTIONS = [
|
||||
"Партнёр по рекламе",
|
||||
"Блогер",
|
||||
"Тестовая ссылка",
|
||||
"Промо акция",
|
||||
"VIP клиент",
|
||||
"Реклама в Telegram от 01.05.2025",
|
||||
"Пост в Instagram от 15.04.2025",
|
||||
"Рассылка в ВК от 24.02.2025",
|
||||
"Промо в Facebook от 10.03.2025",
|
||||
"Пост в Twitter от 05.03.2025",
|
||||
"Реклама в YouTube от 12.04.2025",
|
||||
"Промо в TikTok от 20.04.2025",
|
||||
"Пост в LinkedIn от 18.03.2025",
|
||||
"Реклама в Одноклассниках от 22.03.2025",
|
||||
"Промо в Pinterest от 30.03.2025",
|
||||
"Пост в Reddit от 02.04.2025",
|
||||
"Реклама в Dzen от 11.04.2025",
|
||||
"Промо в Medium от 08.04.2025",
|
||||
"Пост в WhatsApp от 14.04.2025",
|
||||
"Реклама в Discord от 21.04.2025"
|
||||
]
|
||||
|
||||
# Примеры имен и логинов
|
||||
NAMES = [
|
||||
"Иван Иванов",
|
||||
"Петр Петров",
|
||||
"Сергей Сергеев",
|
||||
"Анна Смирнова"
|
||||
]
|
||||
LOGINS = [
|
||||
"ivanov1001",
|
||||
"petrov256",
|
||||
"serg426",
|
||||
"anna564"
|
||||
]
|
||||
|
||||
# --- Загрузка mock-данных ---
|
||||
|
||||
ALL_DESCRIPTIONS = DESCRIPTIONS
|
||||
|
||||
# ---
|
||||
def get_date_list(days=7):
|
||||
today = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
return [today - timedelta(days=i) for i in range(days, -1, -1)]
|
||||
|
||||
def fill_db():
|
||||
date_list = get_date_list(7) # 8 дней: от недели назад до сегодня
|
||||
with Session(AUTH_DB_ENGINE) as session:
|
||||
# Очистка таблиц
|
||||
session.execute(text("DELETE FROM sale"))
|
||||
session.execute(text("DELETE FROM ref"))
|
||||
session.execute(text("DELETE FROM tgagent"))
|
||||
session.commit()
|
||||
# 1. TgAgents
|
||||
tg_agents = []
|
||||
for i, tg_agent_id in enumerate(USER_IDS):
|
||||
dt = random.choice(date_list)
|
||||
tg_agent = TgAgent(
|
||||
tg_id=tg_agent_id,
|
||||
chat_id=tg_agent_id, # chat_id совпадает с tg_id
|
||||
phone=PHONES[i % len(PHONES)],
|
||||
name=NAMES[i % len(NAMES)],
|
||||
login=LOGINS[i % len(LOGINS)],
|
||||
create_dttm=dt,
|
||||
update_dttm=dt
|
||||
)
|
||||
session.add(tg_agent)
|
||||
tg_agents.append(tg_agent)
|
||||
session.commit()
|
||||
for tg_agent in tg_agents:
|
||||
session.refresh(tg_agent)
|
||||
|
||||
# 2. Refs (минимум 22 на агента)
|
||||
refs = []
|
||||
desc_count = len(ALL_DESCRIPTIONS)
|
||||
for tg_agent in tg_agents:
|
||||
ref_count = random.randint(22, int(22 * 1.25)) # от 22 до 27
|
||||
for j in range(ref_count):
|
||||
ref_val = str(uuid4())
|
||||
desc_val = ALL_DESCRIPTIONS[(j % desc_count)]
|
||||
dt = random.choice(date_list)
|
||||
ref = Ref(
|
||||
tg_agent_id=tg_agent.id,
|
||||
ref=ref_val,
|
||||
description=desc_val,
|
||||
create_dttm=dt,
|
||||
update_dttm=dt
|
||||
)
|
||||
session.add(ref)
|
||||
refs.append(ref)
|
||||
session.commit()
|
||||
for ref in refs:
|
||||
session.refresh(ref)
|
||||
|
||||
# 3. Sales (минимум 20 на каждый ref)
|
||||
for ref in refs:
|
||||
sale_count = random.randint(20, int(20 * 1.25)) # от 20 до 25
|
||||
for _ in range(sale_count):
|
||||
cost = round(random.uniform(100, 1000), 2)
|
||||
crediting = round(cost * random.uniform(0.5, 1.0), 2)
|
||||
dt = random.choice(date_list)
|
||||
sale = Sale(
|
||||
cost=cost,
|
||||
crediting=crediting,
|
||||
ref=ref.id,
|
||||
sale_id=str(uuid4()),
|
||||
create_dttm=dt,
|
||||
update_dttm=dt
|
||||
)
|
||||
session.add(sale)
|
||||
session.commit()
|
||||
|
||||
# 4. Transactions (только withdrawal на агента)
|
||||
TRANSACTION_STATUSES = ['process', 'done', 'error', 'waiting']
|
||||
for tg_agent in tg_agents:
|
||||
withdrawal_count = random.randint(5, int(5 * 1.25)) # от 5 до 6
|
||||
used_statuses = set()
|
||||
for i in range(withdrawal_count):
|
||||
dt = random.choice(date_list)
|
||||
# Гарантируем, что каждый статус будет использован хотя бы раз
|
||||
if len(used_statuses) < len(TRANSACTION_STATUSES):
|
||||
status = TRANSACTION_STATUSES[len(used_statuses)]
|
||||
used_statuses.add(status)
|
||||
else:
|
||||
status = random.choice(TRANSACTION_STATUSES)
|
||||
transaction = Transaction(
|
||||
transaction_id=str(uuid4()),
|
||||
sum=round(random.uniform(200, 3000), 2),
|
||||
tg_agent_id=tg_agent.id,
|
||||
status=status,
|
||||
create_dttm=dt,
|
||||
update_dttm=dt
|
||||
)
|
||||
session.add(transaction)
|
||||
session.commit()
|
||||
print("База успешно заполнена!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
fill_db()
|
||||
Reference in New Issue
Block a user