partner-core/fill_db.py

197 lines
6.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random
from uuid import uuid4
from sqlmodel import Session
from main import AUTH_DB_ENGINE, TgAgent, Ref, Sale, Transaction, Account, Company
from sqlalchemy import text
from datetime import datetime, timedelta
from hashlib import sha256
from passlib.context import CryptContext
# Константа: список 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
# ---
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def get_password_hash(password):
return pwd_context.hash(password)
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.execute(text("DELETE FROM account"))
session.execute(text('DELETE FROM "transaction"'))
session.execute(text("DELETE FROM company"))
session.commit()
# 0. Company
company = Company(
name="RE: Premium",
commission=10.0,
key="re-premium-key",
)
session.add(company)
session.commit()
session.refresh(company)
# 1. Accounts
accounts = []
for i in range(4):
acc = Account(
login=f"user{i+1}",
password_hash=get_password_hash("password123"),
name=NAMES[i % len(NAMES)],
email=f"user{i+1}@example.com",
company_id=company.id
)
session.add(acc)
accounts.append(acc)
session.commit()
for acc in accounts:
session.refresh(acc)
# 2. TgAgents
tg_agents = []
for i, tg_agent_id in enumerate(USER_IDS):
dt = random.choice(date_list)
hash_value = sha256(f"{tg_agent_id}sold".encode()).hexdigest()
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)],
company_id=company.id,
create_dttm=dt,
update_dttm=dt,
hash=hash_value
)
session.add(tg_agent)
tg_agents.append(tg_agent)
session.commit()
for tg_agent in tg_agents:
session.refresh(tg_agent)
# 3. 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)
# 4. 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()),
company_id=company.id,
create_dttm=dt,
update_dttm=dt
)
session.add(sale)
session.commit()
# 5. 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,
company_id=company.id,
create_dttm=dt,
update_dttm=dt
)
session.add(transaction)
session.commit()
print("База успешно заполнена!")
if __name__ == "__main__":
fill_db()