- Добавлен CustomToolbar для BigCalendar со стрелками навигации - Выпадающий список для выбора вида календаря - Management command для создания тестовых пользователей и календарей - Создано 3 тестовых пользователя (anna_ivanova, petr_petrov, maria_sidorova) - Создано 5 календарей с 11 событиями - Убраны подписки (они для старой системы calendar_app) - Исправлены стили тулбара BigCalendar - Модалы календаря рендерятся на корневом уровне AppShell
227 lines
8.7 KiB
Python
227 lines
8.7 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 django.contrib.auth import get_user_model
|
||
from schedule.models import Calendar, Event, Rule
|
||
from datetime import datetime, timedelta
|
||
from django.utils import timezone
|
||
|
||
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")
|