Skip to content

Commit e3476f5

Browse files
committed
wrap the repair and report utilities in management commands
- Legacy-Id: 18973
1 parent bcc280f commit e3476f5

3 files changed

Lines changed: 95 additions & 31 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Copyright The IETF Trust 2021, All Rights Reserved
2+
3+
import debug # pyflakes:ignore
4+
5+
from django.core.management.base import BaseCommand, CommandError
6+
7+
from ietf.stats.utils import find_meetingregistration_person_issues
8+
9+
class Command(BaseCommand):
10+
help = "Find possible Person/Email objects to repair based on MeetingRegistration objects"
11+
12+
def add_arguments(self, parser):
13+
parser.add_argument('--meeting',action='append')
14+
15+
def handle(self, *args, **options):
16+
meetings = options['meeting'] or None
17+
summary = find_meetingregistration_person_issues(meetings)
18+
19+
print(f'{summary.ok_records} records are OK')
20+
21+
for msg in summary.could_be_fixed:
22+
print(msg)
23+
24+
for msg in summary.maybe_address:
25+
print(msg)
26+
27+
for msg in summary.different_person:
28+
print(msg)
29+
30+
for msg in summary.no_person:
31+
print(msg)
32+
33+
for msg in summary.maybe_person:
34+
print(msg)
35+
36+
for msg in summary.no_email:
37+
print(msg)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Copyright The IETF Trust 2021, All Rights Reserved
2+
3+
import debug # pyflakes:ignore
4+
5+
from django.core.management.base import BaseCommand, CommandError
6+
7+
from ietf.stats.utils import repair_meetingregistration_person
8+
9+
class Command(BaseCommand):
10+
help = "Repair MeetingRegistration objects that have no person but an email matching a person"
11+
12+
def add_arguments(self, parser):
13+
parser.add_argument('--meeting',action='append')
14+
15+
def handle(self, *args, **options):
16+
meetings = options['meeting'] or None
17+
repaired = repair_meetingregistration_person(meetings)
18+
print(f'Repaired {repaired} MeetingRegistration objects')

ietf/stats/utils.py

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -346,47 +346,56 @@ def get_meeting_registration_data(meeting):
346346
meeting.save()
347347
return num_created, num_processed, num_total
348348

349-
# Might abandon this as too ambitious - if fixed things for 128 people in ietf 100 - 110 though, and that's probably worth doing.
350-
# Yeah - experiments say it _must_ be done. Probably need this as a management command.
351349
def repair_meetingregistration_person(meetings=None):
352-
maybe_address = set()
353-
different_person = set()
354-
no_person = set()
355-
maybe_person = set()
356-
no_email = set()
357-
ok_records = 0
358-
skipped = 0
359350
repaired_records = 0
360-
361-
362-
# for mr in MeetingRegistration.objects.exclude(person__email__address=F('email')):
363-
for mr in MeetingRegistration.objects.all():
364-
if meetings and mr.meeting.number not in meetings:
365-
skipped += 1
366-
continue
351+
qs = MeetingRegistration.objects.all()
352+
if meetings:
353+
qs = qs.filter(meeting__number__in=meetings)
354+
for mr in qs:
355+
if mr.email and not mr.person:
356+
email_person = Person.objects.filter(email__address=mr.email).first()
357+
if email_person:
358+
mr.person = email_person
359+
mr.save()
360+
repaired_records += 1
361+
return repaired_records
362+
363+
class MeetingRegistrationIssuesSummary(object):
364+
pass
365+
366+
def find_meetingregistration_person_issues(meetings=None):
367+
summary = MeetingRegistrationIssuesSummary()
368+
369+
summary.could_be_fixed = set()
370+
summary.maybe_address = set()
371+
summary.different_person = set()
372+
summary.no_person = set()
373+
summary.maybe_person = set()
374+
summary.no_email = set()
375+
summary.ok_records = 0
376+
377+
qs = MeetingRegistration.objects.all()
378+
if meetings:
379+
qs = qs.filter(meeting__number__in=meetings)
380+
for mr in qs:
367381
if mr.person and mr.email and mr.email in mr.person.email_set.values_list('address',flat=True):
368-
ok_records += 1
369-
continue
370-
if mr.email:
382+
summary.ok_records += 1
383+
elif mr.email:
371384
email_person = Person.objects.filter(email__address=mr.email).first()
372385
if mr.person:
373386
if not email_person:
374-
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})')
387+
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})')
375388
elif email_person != mr.person:
376-
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}).')
389+
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}).')
377390
elif email_person:
378-
mr.person = email_person
379-
mr.save()
380-
repaired_records += 1
391+
summary.could_be_fixed.add(f'{mr} ({mr.pk}) has no person, but email {mr.email} matches {email_person} ({email_person.pk})')
381392
else:
382393
maybe_person_qs = Person.objects.filter(name__icontains=mr.last_name).filter(name__icontains=mr.first_name)
383-
# if not maybe_person_qs.exists():
384-
# maybe_person_qs = Person.objects.filter(name__icontains=mr.last_name)
385-
if maybe_person_qs:
386-
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]}')
394+
if maybe_person_qs.exists():
395+
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]}')
387396
else:
388-
no_person.add(f'{mr} ({mr.pk}) has email address {mr.email} which cannot be associated with any Person')
397+
summary.no_person.add(f'{mr} ({mr.pk}) has email address {mr.email} which cannot be associated with any Person')
389398
else:
390-
no_email.add(f'{mr} ({mr.pk}) provides no email address')
399+
summary.no_email.add(f'{mr} ({mr.pk}) provides no email address')
391400

392-
return ok_records, repaired_records, skipped, maybe_address, different_person, maybe_person, no_person, no_email
401+
return summary

0 commit comments

Comments
 (0)