Add setup_test_data management command for testing
Creates sample admin/supervisor users, 3 projects, 6 workers, 2 teams, and 2 weeks of work logs with overtime. Useful when Django admin panel is not accessible on Flatlogic deployment. Run: python manage.py setup_test_data Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
efe5f08682
commit
4449bf6fb8
180
core/management/commands/setup_test_data.py
Normal file
180
core/management/commands/setup_test_data.py
Normal file
@ -0,0 +1,180 @@
|
||||
# === SETUP TEST DATA MANAGEMENT COMMAND ===
|
||||
# Creates sample workers, projects, teams, and work logs for testing.
|
||||
# Run this once after deploying: python manage.py setup_test_data
|
||||
#
|
||||
# This is useful when the Django admin panel isn't accessible (e.g. on
|
||||
# Flatlogic's Cloud Run deployment where admin static files may not load).
|
||||
|
||||
import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils import timezone
|
||||
|
||||
from core.models import Project, Worker, Team, WorkLog
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Creates sample workers, projects, teams, and work logs for testing'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
# --- Create an admin superuser (if not exists) ---
|
||||
admin_user, created = User.objects.get_or_create(
|
||||
username='admin',
|
||||
defaults={
|
||||
'is_staff': True,
|
||||
'is_superuser': True,
|
||||
'first_name': 'Admin',
|
||||
'email': 'admin@foxfitt.co.za',
|
||||
}
|
||||
)
|
||||
if created:
|
||||
admin_user.set_password('admin123')
|
||||
admin_user.save()
|
||||
self.stdout.write(self.style.SUCCESS('Created admin user (password: admin123)'))
|
||||
else:
|
||||
# Make sure existing admin has staff/superuser flags
|
||||
if not admin_user.is_staff or not admin_user.is_superuser:
|
||||
admin_user.is_staff = True
|
||||
admin_user.is_superuser = True
|
||||
admin_user.save()
|
||||
self.stdout.write('Updated admin user to have staff + superuser flags')
|
||||
else:
|
||||
self.stdout.write('Admin user already exists')
|
||||
|
||||
# --- Create a supervisor user ---
|
||||
supervisor, created = User.objects.get_or_create(
|
||||
username='supervisor1',
|
||||
defaults={
|
||||
'is_staff': False,
|
||||
'first_name': 'John',
|
||||
'last_name': 'Supervisor',
|
||||
}
|
||||
)
|
||||
if created:
|
||||
supervisor.set_password('super123')
|
||||
supervisor.save()
|
||||
self.stdout.write(self.style.SUCCESS('Created supervisor user (password: super123)'))
|
||||
else:
|
||||
self.stdout.write('Supervisor user already exists')
|
||||
|
||||
# --- Create Projects ---
|
||||
project_names = [
|
||||
'Kalkbult Solar Farm',
|
||||
'De Aar Wind Farm',
|
||||
'Prieska Solar Plant',
|
||||
]
|
||||
projects = []
|
||||
for name in project_names:
|
||||
proj, created = Project.objects.get_or_create(
|
||||
name=name,
|
||||
defaults={'active': True}
|
||||
)
|
||||
# Assign supervisor to the project
|
||||
proj.supervisors.add(supervisor)
|
||||
projects.append(proj)
|
||||
if created:
|
||||
self.stdout.write(self.style.SUCCESS(f' Created project: {name}'))
|
||||
else:
|
||||
self.stdout.write(f' Project already exists: {name}')
|
||||
|
||||
# --- Create Workers ---
|
||||
worker_data = [
|
||||
{'name': 'Thabo Mokoena', 'id_number': '9001015000080', 'salary': Decimal('8000.00')},
|
||||
{'name': 'Sipho Ndlovu', 'id_number': '8805125000081', 'salary': Decimal('7500.00')},
|
||||
{'name': 'Lerato Dlamini', 'id_number': '9203220000082', 'salary': Decimal('7000.00')},
|
||||
{'name': 'Bongani Zulu', 'id_number': '8510305000083', 'salary': Decimal('8500.00')},
|
||||
{'name': 'Nomsa Khumalo', 'id_number': '9106185000084', 'salary': Decimal('7200.00')},
|
||||
{'name': 'David Botha', 'id_number': '8707125000085', 'salary': Decimal('9000.00')},
|
||||
]
|
||||
workers = []
|
||||
for wd in worker_data:
|
||||
worker, created = Worker.objects.get_or_create(
|
||||
name=wd['name'],
|
||||
defaults={
|
||||
'id_number': wd['id_number'],
|
||||
'monthly_salary': wd['salary'],
|
||||
'active': True,
|
||||
'employment_date': datetime.date(2024, 1, 15),
|
||||
}
|
||||
)
|
||||
workers.append(worker)
|
||||
if created:
|
||||
self.stdout.write(self.style.SUCCESS(f' Created worker: {wd["name"]} (R{wd["salary"]}/month)'))
|
||||
else:
|
||||
self.stdout.write(f' Worker already exists: {wd["name"]}')
|
||||
|
||||
# --- Create Teams ---
|
||||
team_a, created = Team.objects.get_or_create(
|
||||
name='Team Alpha',
|
||||
defaults={'supervisor': supervisor, 'active': True}
|
||||
)
|
||||
if created:
|
||||
team_a.workers.set(workers[:3]) # First 3 workers
|
||||
self.stdout.write(self.style.SUCCESS(' Created Team Alpha (3 workers)'))
|
||||
else:
|
||||
self.stdout.write(' Team Alpha already exists')
|
||||
|
||||
team_b, created = Team.objects.get_or_create(
|
||||
name='Team Bravo',
|
||||
defaults={'supervisor': supervisor, 'active': True}
|
||||
)
|
||||
if created:
|
||||
team_b.workers.set(workers[3:]) # Last 3 workers
|
||||
self.stdout.write(self.style.SUCCESS(' Created Team Bravo (3 workers)'))
|
||||
else:
|
||||
self.stdout.write(' Team Bravo already exists')
|
||||
|
||||
# --- Create Work Logs (last 2 weeks) ---
|
||||
today = timezone.now().date()
|
||||
logs_created = 0
|
||||
|
||||
for days_ago in range(14, 0, -1):
|
||||
log_date = today - datetime.timedelta(days=days_ago)
|
||||
|
||||
# Skip weekends
|
||||
if log_date.weekday() >= 5:
|
||||
continue
|
||||
|
||||
# Alternate between projects
|
||||
project = projects[days_ago % len(projects)]
|
||||
|
||||
# Create a work log with some workers
|
||||
log_workers = workers[:4] if days_ago % 2 == 0 else workers[2:]
|
||||
|
||||
# Check if this log already exists
|
||||
existing = WorkLog.objects.filter(date=log_date, project=project).first()
|
||||
if existing:
|
||||
continue
|
||||
|
||||
# Set overtime on some days
|
||||
ot = Decimal('0.00')
|
||||
if days_ago % 3 == 0:
|
||||
ot = Decimal('0.50') # Half day overtime every 3rd day
|
||||
elif days_ago % 5 == 0:
|
||||
ot = Decimal('0.25') # Quarter day overtime every 5th day
|
||||
|
||||
worklog = WorkLog.objects.create(
|
||||
date=log_date,
|
||||
project=project,
|
||||
team=team_a if days_ago % 2 == 0 else team_b,
|
||||
supervisor=supervisor,
|
||||
overtime_amount=ot,
|
||||
)
|
||||
worklog.workers.set(log_workers)
|
||||
logs_created += 1
|
||||
|
||||
self.stdout.write(self.style.SUCCESS(f' Created {logs_created} work logs'))
|
||||
|
||||
# --- Summary ---
|
||||
self.stdout.write('')
|
||||
self.stdout.write(self.style.SUCCESS('=== Test data setup complete! ==='))
|
||||
self.stdout.write(f' Admin login: admin / admin123')
|
||||
self.stdout.write(f' Supervisor login: supervisor1 / super123')
|
||||
self.stdout.write(f' Projects: {Project.objects.filter(active=True).count()}')
|
||||
self.stdout.write(f' Workers: {Worker.objects.filter(active=True).count()}')
|
||||
self.stdout.write(f' Teams: {Team.objects.filter(active=True).count()}')
|
||||
self.stdout.write(f' WorkLogs: {WorkLog.objects.count()}')
|
||||
self.stdout.write('')
|
||||
self.stdout.write(' Now log in as "admin" and go to /payroll/ to test the dashboard!')
|
||||
Loading…
x
Reference in New Issue
Block a user