161 lines
7.1 KiB
Python
161 lines
7.1 KiB
Python
from django.core.management.base import BaseCommand
|
|
from apps.users.models import User, RegistrationDomainRule, RegistrationRestrictionSetting
|
|
from apps.events.models import Skill, Event, TaskArea, Shift, ShiftSignup, EventTemplate
|
|
from apps.branding.models import BrandingSetting
|
|
|
|
class Command(BaseCommand):
|
|
help = "Populate database with initial demo data including Demo Admin & Demo User"
|
|
|
|
def handle(self, *args, **options):
|
|
# 1. Branding
|
|
branding = BrandingSetting.get_solo()
|
|
branding.app_name = "Veranstaltungsschichtplaner (Dev)"
|
|
branding.custom_banner_text = "💡 DEV INSTANZ: Demo Admin (admin / adminpassword) & Demo User (demouser / demouser123)"
|
|
branding.save()
|
|
|
|
# 2. Skills
|
|
skill_ersthelfer, _ = Skill.objects.get_or_create(
|
|
name="Ersthelfer",
|
|
defaults={'description': 'Gültiger Erste-Hilfe-Schein', 'color': '#ef4444'}
|
|
)
|
|
skill_bar, _ = Skill.objects.get_or_create(
|
|
name="Bar-Erfahrung",
|
|
defaults={'description': 'Erfahrung an der Zapfanlage', 'color': '#3b82f6'}
|
|
)
|
|
skill_fuehrerschein, _ = Skill.objects.get_or_create(
|
|
name="Führerschein B",
|
|
defaults={'description': 'PKW / Transporter fahren', 'color': '#10b981'}
|
|
)
|
|
|
|
# 3. Demo Admin User
|
|
admin_user, admin_created = User.objects.get_or_create(
|
|
username='admin',
|
|
defaults={
|
|
'email': 'admin@demo.local',
|
|
'display_name': 'Demo Admin',
|
|
'is_admin_user': True,
|
|
'is_staff': True,
|
|
'is_superuser': True
|
|
}
|
|
)
|
|
if admin_created:
|
|
admin_user.set_password('adminpassword')
|
|
admin_user.save()
|
|
self.stdout.write(self.style.SUCCESS("Demo Admin created: admin / adminpassword"))
|
|
else:
|
|
admin_user.set_password('adminpassword')
|
|
admin_user.is_admin_user = True
|
|
admin_user.is_staff = True
|
|
admin_user.is_superuser = True
|
|
admin_user.save()
|
|
|
|
# 4. Demo Regular User
|
|
demo_user, user_created = User.objects.get_or_create(
|
|
username='demouser',
|
|
defaults={
|
|
'email': 'user@demo.local',
|
|
'display_name': 'Demo User',
|
|
'is_admin_user': False
|
|
}
|
|
)
|
|
if user_created:
|
|
demo_user.set_password('demouser123')
|
|
demo_user.save()
|
|
demo_user.skills.add(skill_bar, skill_ersthelfer)
|
|
self.stdout.write(self.style.SUCCESS("Demo User created: demouser / demouser123"))
|
|
else:
|
|
demo_user.set_password('demouser123')
|
|
demo_user.save()
|
|
demo_user.skills.add(skill_bar, skill_ersthelfer)
|
|
|
|
# 5. Sample Event with Task Areas & Shifts
|
|
if not Event.objects.filter(title="Sommerfest 2026").exists():
|
|
event = Event.objects.create(
|
|
title="Sommerfest 2026",
|
|
description="Großes Vereins-Sommerfest mit Musik, Essen und Kinderprogramm",
|
|
location="Vereinsgelände, Festwiese",
|
|
start_date="2026-08-15",
|
|
end_date="2026-08-16",
|
|
created_by=admin_user
|
|
)
|
|
|
|
# Task Area: Tresendienst
|
|
ta_tresen = TaskArea.objects.create(
|
|
event=event, name="Tresendienst", description="Getränke- & Barverkauf", order=1
|
|
)
|
|
s1 = Shift.objects.create(
|
|
task_area=ta_tresen, title="Nachmittagsschicht", start_time="14:00", end_time="18:00", max_participants=3
|
|
)
|
|
s1.required_skills.add(skill_bar)
|
|
# Demo signup for demo_user
|
|
ShiftSignup.objects.create(shift=s1, user=demo_user)
|
|
|
|
s2 = Shift.objects.create(
|
|
task_area=ta_tresen, title="Abendschicht", start_time="18:00", end_time="23:00", max_participants=4
|
|
)
|
|
|
|
# Task Area: Essen kochen
|
|
ta_essen = TaskArea.objects.create(
|
|
event=event, name="Essen kochen & Stand", description="Grill & Salatausgabe", order=2
|
|
)
|
|
Shift.objects.create(
|
|
task_area=ta_essen, title="Vorbereitung & Grillen", start_time="11:30", end_time="16:00", max_participants=3
|
|
)
|
|
Shift.objects.create(
|
|
task_area=ta_essen, title="Abendschicht Essen", start_time="16:00", end_time="21:00", max_participants=3
|
|
)
|
|
|
|
# Task Area: Aufbau & Aufräumen
|
|
ta_aufbau = TaskArea.objects.create(
|
|
event=event, name="Aufbau & Aufräumen", description="Bänke, Pavillons & Technik", order=3
|
|
)
|
|
s_aufbau = Shift.objects.create(
|
|
task_area=ta_aufbau, title="Früher Aufbau", start_time="09:00", end_time="13:00", max_participants=5
|
|
)
|
|
s_aufbau.required_skills.add(skill_fuehrerschein)
|
|
|
|
Shift.objects.create(
|
|
task_area=ta_aufbau, title="Nacht-Aufräumen", start_time="23:00", end_time="01:00", max_participants=4
|
|
)
|
|
|
|
self.stdout.write(self.style.SUCCESS("Sample Event 'Sommerfest 2026' created."))
|
|
|
|
# 6. Sample Template
|
|
if not EventTemplate.objects.filter(name="Standard Vereinsfest Template").exists():
|
|
EventTemplate.objects.create(
|
|
name="Standard Vereinsfest Template",
|
|
description="Standard-Struktur mit Tresendienst, Essen kochen sowie Aufbau & Aufräumen",
|
|
template_data={
|
|
"task_areas": [
|
|
{
|
|
"name": "Tresendienst",
|
|
"description": "Getränkezapfen und Verkauf",
|
|
"order": 1,
|
|
"shifts": [
|
|
{"title": "Frühschicht", "start_time": "12:00", "end_time": "17:00", "max_participants": 2, "required_skill_names": ["Bar-Erfahrung"]},
|
|
{"title": "Spätschicht", "start_time": "17:00", "end_time": "22:00", "max_participants": 3}
|
|
]
|
|
},
|
|
{
|
|
"name": "Essen kochen",
|
|
"description": "Zubereitung & Verpflegung",
|
|
"order": 2,
|
|
"shifts": [
|
|
{"title": "Mittagessen", "start_time": "11:00", "end_time": "15:00", "max_participants": 3}
|
|
]
|
|
},
|
|
{
|
|
"name": "Aufbau & Aufräumen",
|
|
"description": "Aufbau und Abbau der Infrastruktur",
|
|
"order": 3,
|
|
"shifts": [
|
|
{"title": "Gesamtaufbau", "start_time": "08:00", "end_time": "12:00", "max_participants": 4}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
created_by=admin_user
|
|
)
|
|
|
|
self.stdout.write(self.style.SUCCESS("Dev seed data populated with Demo Admin & Demo User!"))
|