278 lines
9.2 KiB
Python
278 lines
9.2 KiB
Python
"""
|
||
Скрипт для создания тестовых пользователей с календарями и событиями для системы schedule.
|
||
|
||
Использование:
|
||
python manage.py shell < scripts/create_test_calendar_users.py
|
||
|
||
или
|
||
|
||
.venv/Scripts/python manage.py shell
|
||
>>> exec(open('scripts/create_test_calendar_users.py').read())
|
||
"""
|
||
|
||
from datetime import datetime, timedelta
|
||
|
||
from django.contrib.auth import get_user_model
|
||
from django.utils import timezone
|
||
from schedule.models import Calendar, Event
|
||
|
||
User = get_user_model()
|
||
|
||
print("🚀 Создание тестовых пользователей и календарей...")
|
||
|
||
# Создание пользователей
|
||
test_users = [
|
||
{
|
||
"username": "anna_ivanova",
|
||
"email": "anna@example.com",
|
||
"first_name": "Анна",
|
||
"last_name": "Иванова",
|
||
"password": "test123",
|
||
},
|
||
{
|
||
"username": "petr_petrov",
|
||
"email": "petr@example.com",
|
||
"first_name": "Пётр",
|
||
"last_name": "Петров",
|
||
"password": "test123",
|
||
},
|
||
{
|
||
"username": "maria_sidorova",
|
||
"email": "maria@example.com",
|
||
"first_name": "Мария",
|
||
"last_name": "Сидорова",
|
||
"password": "test123",
|
||
},
|
||
]
|
||
|
||
created_users = []
|
||
for user_data in test_users:
|
||
user, created = User.objects.get_or_create(
|
||
username=user_data["username"],
|
||
defaults={
|
||
"email": user_data["email"],
|
||
"first_name": user_data["first_name"],
|
||
"last_name": user_data["last_name"],
|
||
},
|
||
)
|
||
if created:
|
||
user.set_password(user_data["password"])
|
||
user.save()
|
||
print(f"✅ Создан пользователь: {user.get_full_name()} ({user.username})")
|
||
else:
|
||
print(
|
||
f"ℹ️ Пользователь уже существует: {user.get_full_name()} ({user.username})"
|
||
)
|
||
created_users.append(user)
|
||
|
||
# Создание календарей для каждого пользователя
|
||
calendar_data = [
|
||
{
|
||
"user": created_users[0],
|
||
"name": "Рабочий календарь Анны",
|
||
"slug": "anna-work",
|
||
},
|
||
{
|
||
"user": created_users[0],
|
||
"name": "Личные дела Анны",
|
||
"slug": "anna-personal",
|
||
},
|
||
{
|
||
"user": created_users[1],
|
||
"name": "Проекты Петра",
|
||
"slug": "petr-projects",
|
||
},
|
||
{
|
||
"user": created_users[1],
|
||
"name": "Встречи Петра",
|
||
"slug": "petr-meetings",
|
||
},
|
||
{
|
||
"user": created_users[2],
|
||
"name": "Календарь Марии",
|
||
"slug": "maria-calendar",
|
||
},
|
||
]
|
||
|
||
created_calendars = []
|
||
for cal_data in calendar_data:
|
||
calendar, created = Calendar.objects.get_or_create(
|
||
slug=cal_data["slug"],
|
||
defaults={
|
||
"name": cal_data["name"],
|
||
},
|
||
)
|
||
if created:
|
||
print(f"✅ Создан календарь: {calendar.name}")
|
||
else:
|
||
print(f"ℹ️ Календарь уже существует: {calendar.name}")
|
||
created_calendars.append(calendar)
|
||
|
||
# Создание тестовых событий
|
||
now = timezone.now()
|
||
today = now.date()
|
||
|
||
events_data = [
|
||
# События для Анны (календарь 0 - рабочий)
|
||
{
|
||
"calendar": created_calendars[0],
|
||
"title": "Встреча с клиентом",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=1), datetime.min.time().replace(hour=10)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=1), datetime.min.time().replace(hour=11)
|
||
),
|
||
"description": "Обсуждение проекта",
|
||
},
|
||
{
|
||
"calendar": created_calendars[0],
|
||
"title": "Планерка команды",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=2), datetime.min.time().replace(hour=9)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=2), datetime.min.time().replace(hour=10)
|
||
),
|
||
"description": "Еженедельная встреча",
|
||
},
|
||
{
|
||
"calendar": created_calendars[0],
|
||
"title": "Презентация результатов",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=5), datetime.min.time().replace(hour=14)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=5), datetime.min.time().replace(hour=15, minute=30)
|
||
),
|
||
"description": "Демо для заказчика",
|
||
},
|
||
# События для Анны (календарь 1 - личный)
|
||
{
|
||
"calendar": created_calendars[1],
|
||
"title": "Врач",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=3), datetime.min.time().replace(hour=16)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=3), datetime.min.time().replace(hour=17)
|
||
),
|
||
"description": "Плановый осмотр",
|
||
},
|
||
{
|
||
"calendar": created_calendars[1],
|
||
"title": "Фитнес",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=4), datetime.min.time().replace(hour=19)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=4), datetime.min.time().replace(hour=20)
|
||
),
|
||
"description": "Тренировка",
|
||
},
|
||
# События для Петра (календарь 2 - проекты)
|
||
{
|
||
"calendar": created_calendars[2],
|
||
"title": "Разработка нового модуля",
|
||
"start": datetime.combine(today, datetime.min.time().replace(hour=10)),
|
||
"end": datetime.combine(today, datetime.min.time().replace(hour=18)),
|
||
"description": "Работа над функционалом",
|
||
},
|
||
{
|
||
"calendar": created_calendars[2],
|
||
"title": "Code Review",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=1), datetime.min.time().replace(hour=15)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=1), datetime.min.time().replace(hour=16)
|
||
),
|
||
"description": "Проверка кода коллег",
|
||
},
|
||
# События для Петра (календарь 3 - встречи)
|
||
{
|
||
"calendar": created_calendars[3],
|
||
"title": "Встреча с HR",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=2), datetime.min.time().replace(hour=11)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=2), datetime.min.time().replace(hour=12)
|
||
),
|
||
"description": "Собеседование кандидата",
|
||
},
|
||
{
|
||
"calendar": created_calendars[3],
|
||
"title": "1-on-1 с руководителем",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=7), datetime.min.time().replace(hour=14)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=7), datetime.min.time().replace(hour=15)
|
||
),
|
||
"description": "Обсуждение целей",
|
||
},
|
||
# События для Марии (календарь 4)
|
||
{
|
||
"calendar": created_calendars[4],
|
||
"title": "Обучение новых сотрудников",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=1), datetime.min.time().replace(hour=13)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=1), datetime.min.time().replace(hour=16)
|
||
),
|
||
"description": "Вводный курс",
|
||
},
|
||
{
|
||
"calendar": created_calendars[4],
|
||
"title": "Подготовка отчета",
|
||
"start": datetime.combine(
|
||
today + timedelta(days=6), datetime.min.time().replace(hour=10)
|
||
),
|
||
"end": datetime.combine(
|
||
today + timedelta(days=6), datetime.min.time().replace(hour=13)
|
||
),
|
||
"description": "Квартальный отчет",
|
||
},
|
||
]
|
||
|
||
print("\n📅 Создание событий...")
|
||
for event_data in events_data:
|
||
# Преобразуем datetime в timezone-aware
|
||
start = (
|
||
timezone.make_aware(event_data["start"])
|
||
if timezone.is_naive(event_data["start"])
|
||
else event_data["start"]
|
||
)
|
||
end = (
|
||
timezone.make_aware(event_data["end"])
|
||
if timezone.is_naive(event_data["end"])
|
||
else event_data["end"]
|
||
)
|
||
|
||
event, created = Event.objects.get_or_create(
|
||
calendar=event_data["calendar"],
|
||
title=event_data["title"],
|
||
start=start,
|
||
defaults={
|
||
"end": end,
|
||
"description": event_data.get("description", ""),
|
||
},
|
||
)
|
||
if created:
|
||
print(f" ✅ {event.title} ({event.calendar.name})")
|
||
else:
|
||
print(f" ℹ️ Событие уже существует: {event.title}")
|
||
|
||
print("\n" + "=" * 60)
|
||
print("✨ Готово! Создано:")
|
||
print(f" 👥 Пользователи: {len(created_users)}")
|
||
print(f" 📅 Календари: {len(created_calendars)}")
|
||
print(f" 🎯 События: {len(events_data)}")
|
||
print("=" * 60)
|
||
print("\n🔑 Учетные данные для входа:")
|
||
for user_data in test_users:
|
||
print(f" {user_data['username']} / {user_data['password']}")
|
||
print("\n")
|