Add data migration to set real SA ID numbers for all workers
Reads ID numbers from the workers_list.xlsx data and matches workers by first name + surname (case-insensitive). Handles name variations like "Soldier Aphiwe Dobe" matching "Aphiwe" + "Dobe". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b9c0a985c3
commit
3199e52e72
65
core/migrations/0002_update_worker_id_numbers.py
Normal file
65
core/migrations/0002_update_worker_id_numbers.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# === DATA MIGRATION: Update Worker ID Numbers ===
|
||||||
|
# One-time migration to set real SA ID numbers from the workers_list.xlsx file.
|
||||||
|
# Matches workers by first name + surname (case-insensitive contains).
|
||||||
|
# Safe: if a worker isn't found, it's skipped. If id_number is already correct, no change.
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
|
|
||||||
|
# Worker ID data from workers_list.xlsx
|
||||||
|
# Format: (first_name_part, surname, id_number)
|
||||||
|
# We search for workers whose name contains BOTH the first name part AND the surname
|
||||||
|
WORKER_ID_DATA = [
|
||||||
|
('Mpho', 'Nkoana', '9811125984089'),
|
||||||
|
('Richard', 'Moleko', '0003185071085'),
|
||||||
|
('Fikile', 'Masimula', '8606305407088'),
|
||||||
|
('Clifford', 'Selemela', '0104205798085'),
|
||||||
|
('Shane', 'Malobela', '9807046054085'),
|
||||||
|
('Jimmy', 'Moleko', '0101176105084'),
|
||||||
|
('Johannes', 'Laka', '9809066044087'),
|
||||||
|
('Tumelo', 'Sinugo', '9009055943080'),
|
||||||
|
('Goitsimang', 'Moleko', '0403135542068'),
|
||||||
|
('Sello', 'Matloa', '0407046184088'),
|
||||||
|
('Aphiwe', 'Dobe', '9212236112084'),
|
||||||
|
('Tshepo', 'Moganedi', '8112175417083'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def update_id_numbers(apps, schema_editor):
|
||||||
|
"""Update worker ID numbers from the Excel spreadsheet data."""
|
||||||
|
Worker = apps.get_model('core', 'Worker')
|
||||||
|
|
||||||
|
for first_name, surname, id_number in WORKER_ID_DATA:
|
||||||
|
# Find worker whose name contains both the first name and surname
|
||||||
|
# This handles cases like "Soldier Aphiwe Dobe" matching ("Aphiwe", "Dobe")
|
||||||
|
# or "Clifford Jan Bobby Selemela" matching ("Clifford", "Selemela")
|
||||||
|
matches = Worker.objects.filter(
|
||||||
|
Q(name__icontains=first_name) & Q(name__icontains=surname)
|
||||||
|
)
|
||||||
|
|
||||||
|
if matches.count() == 1:
|
||||||
|
worker = matches.first()
|
||||||
|
worker.id_number = id_number
|
||||||
|
worker.save(update_fields=['id_number'])
|
||||||
|
elif matches.count() > 1:
|
||||||
|
# Multiple matches — skip to avoid updating the wrong worker
|
||||||
|
# (shouldn't happen with first name + surname combo)
|
||||||
|
pass
|
||||||
|
# If no match found, skip silently — worker might not exist in this env
|
||||||
|
|
||||||
|
|
||||||
|
def reverse_id_numbers(apps, schema_editor):
|
||||||
|
"""Reverse is a no-op — we can't restore old ID numbers."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(update_id_numbers, reverse_id_numbers),
|
||||||
|
]
|
||||||
Loading…
x
Reference in New Issue
Block a user