wrap the repair and report utilities in management commands

- Legacy-Id: 18973
This commit is contained in:
Robert Sparks 2021-05-06 16:03:32 +00:00
parent bcc280fe9b
commit e3476f5bdb
3 changed files with 93 additions and 29 deletions

View file

@ -0,0 +1,37 @@
# Copyright The IETF Trust 2021, All Rights Reserved
import debug # pyflakes:ignore
from django.core.management.base import BaseCommand, CommandError
from ietf.stats.utils import find_meetingregistration_person_issues
class Command(BaseCommand):
help = "Find possible Person/Email objects to repair based on MeetingRegistration objects"
def add_arguments(self, parser):
parser.add_argument('--meeting',action='append')
def handle(self, *args, **options):
meetings = options['meeting'] or None
summary = find_meetingregistration_person_issues(meetings)
print(f'{summary.ok_records} records are OK')
for msg in summary.could_be_fixed:
print(msg)
for msg in summary.maybe_address:
print(msg)
for msg in summary.different_person:
print(msg)
for msg in summary.no_person:
print(msg)
for msg in summary.maybe_person:
print(msg)
for msg in summary.no_email:
print(msg)

View file

@ -0,0 +1,18 @@
# Copyright The IETF Trust 2021, All Rights Reserved
import debug # pyflakes:ignore
from django.core.management.base import BaseCommand, CommandError
from ietf.stats.utils import repair_meetingregistration_person
class Command(BaseCommand):
help = "Repair MeetingRegistration objects that have no person but an email matching a person"
def add_arguments(self, parser):
parser.add_argument('--meeting',action='append')
def handle(self, *args, **options):
meetings = options['meeting'] or None
repaired = repair_meetingregistration_person(meetings)
print(f'Repaired {repaired} MeetingRegistration objects')

View file

@ -346,47 +346,56 @@ def get_meeting_registration_data(meeting):
meeting.save() meeting.save()
return num_created, num_processed, num_total return num_created, num_processed, num_total
# Might abandon this as too ambitious - if fixed things for 128 people in ietf 100 - 110 though, and that's probably worth doing.
# Yeah - experiments say it _must_ be done. Probably need this as a management command.
def repair_meetingregistration_person(meetings=None): def repair_meetingregistration_person(meetings=None):
maybe_address = set()
different_person = set()
no_person = set()
maybe_person = set()
no_email = set()
ok_records = 0
skipped = 0
repaired_records = 0 repaired_records = 0
qs = MeetingRegistration.objects.all()
if meetings:
qs = qs.filter(meeting__number__in=meetings)
for mr in qs:
if mr.email and not mr.person:
email_person = Person.objects.filter(email__address=mr.email).first()
if email_person:
mr.person = email_person
mr.save()
repaired_records += 1
return repaired_records
class MeetingRegistrationIssuesSummary(object):
pass
# for mr in MeetingRegistration.objects.exclude(person__email__address=F('email')): def find_meetingregistration_person_issues(meetings=None):
for mr in MeetingRegistration.objects.all(): summary = MeetingRegistrationIssuesSummary()
if meetings and mr.meeting.number not in meetings:
skipped += 1 summary.could_be_fixed = set()
continue summary.maybe_address = set()
summary.different_person = set()
summary.no_person = set()
summary.maybe_person = set()
summary.no_email = set()
summary.ok_records = 0
qs = MeetingRegistration.objects.all()
if meetings:
qs = qs.filter(meeting__number__in=meetings)
for mr in qs:
if mr.person and mr.email and mr.email in mr.person.email_set.values_list('address',flat=True): if mr.person and mr.email and mr.email in mr.person.email_set.values_list('address',flat=True):
ok_records += 1 summary.ok_records += 1
continue elif mr.email:
if mr.email:
email_person = Person.objects.filter(email__address=mr.email).first() email_person = Person.objects.filter(email__address=mr.email).first()
if mr.person: if mr.person:
if not email_person: if not email_person:
maybe_address.add(f'{mr.email} is not present in any Email object. The MeetingRegistration object implies this is an address for {mr.person} ({mr.person.pk})') summary.maybe_address.add(f'{mr.email} is not present in any Email object. The MeetingRegistration object implies this is an address for {mr.person} ({mr.person.pk})')
elif email_person != mr.person: elif email_person != mr.person:
different_person.add(f'{mr} ({mr.pk}) has person {mr.person} ({mr.person.pk}) but an email {mr.email} attached to a different person {email_person} ({email_person.pk}).') summary.different_person.add(f'{mr} ({mr.pk}) has person {mr.person} ({mr.person.pk}) but an email {mr.email} attached to a different person {email_person} ({email_person.pk}).')
elif email_person: elif email_person:
mr.person = email_person summary.could_be_fixed.add(f'{mr} ({mr.pk}) has no person, but email {mr.email} matches {email_person} ({email_person.pk})')
mr.save()
repaired_records += 1
else: else:
maybe_person_qs = Person.objects.filter(name__icontains=mr.last_name).filter(name__icontains=mr.first_name) maybe_person_qs = Person.objects.filter(name__icontains=mr.last_name).filter(name__icontains=mr.first_name)
# if not maybe_person_qs.exists(): if maybe_person_qs.exists():
# maybe_person_qs = Person.objects.filter(name__icontains=mr.last_name) summary.maybe_person.add(f'{mr} ({mr.pk}) has email address {mr.email} which cannot be associated with any Person. Consider these possible people {[(p,p.pk) for p in maybe_person_qs]}')
if maybe_person_qs:
maybe_person.add(f'{mr} ({mr.pk}) has email address {mr.email} which cannot be associated with any Person. Consider these possible people {[(p,p.pk) for p in maybe_person_qs]}')
else: else:
no_person.add(f'{mr} ({mr.pk}) has email address {mr.email} which cannot be associated with any Person') summary.no_person.add(f'{mr} ({mr.pk}) has email address {mr.email} which cannot be associated with any Person')
else: else:
no_email.add(f'{mr} ({mr.pk}) provides no email address') summary.no_email.add(f'{mr} ({mr.pk}) provides no email address')
return ok_records, repaired_records, skipped, maybe_address, different_person, maybe_person, no_person, no_email return summary