Import full names when importing persons, not just first and last names

- Legacy-Id: 3425
This commit is contained in:
Ole Laursen 2011-09-16 11:27:38 +00:00
parent 9613186f9f
commit 8652f287a1
2 changed files with 52 additions and 24 deletions

View file

@ -14,13 +14,13 @@ management.setup_environ(settings)
from redesign.doc.models import *
from redesign.group.models import *
from redesign.name.models import *
from redesign.importing.utils import old_person_to_person
from redesign.importing.utils import old_person_to_person, person_name
from redesign.name.utils import name
from ietf.idtracker.models import InternetDraft, IDInternal, IESGLogin, DocumentComment, PersonOrOrgInfo, Rfc, IESGComment, IESGDiscuss, BallotInfo, Position
from ietf.idrfc.models import RfcIndex, DraftVersions
from ietf.idrfc.mirror_rfc_index import get_std_level_mapping, get_stream_mapping
#from ietf.ietfworkflows.utils import get_state_for_draft
import sys
document_name_to_import = None
if len(sys.argv) > 1:
@ -46,6 +46,7 @@ connection.queries = DummyQueries()
# IESGComment, IESGDiscuss, DocumentComment, IDAuthor, idrfc.RfcIndex,
# idrfc.DraftVersions
def alias_doc(name, doc):
DocAlias.objects.filter(name=name).exclude(document=doc).delete()
alias, _ = DocAlias.objects.get_or_create(name=name, document=doc)
@ -136,6 +137,8 @@ substate_mapping = {
"Point Raised - writeup needed": name(DocInfoTagName, 'point', "Point Raised - writeup needed", 'IESG discussions on the document have raised some issues that need to be brought to the attention of the authors/WG, but those issues have not been written down yet. (It is common for discussions during a telechat to result in such situations. An AD may raise a possible issue during a telechat and only decide as a result of that discussion whether the issue is worth formally writing up and bringing to the attention of the authors/WG). A document stays in the "Point Raised - Writeup Needed" state until *ALL* IESG comments that have been raised have been documented.', 1)
}
#wg_state_mapping = dict([(s.slug, s) for s in WGDocStateName.objects.all()] + [(None, None)])
tag_review_by_rfc_editor = name(DocInfoTagName, 'rfc-rev', "Review by RFC Editor")
tag_via_rfc_editor = name(DocInfoTagName, 'via-rfc', "Via RFC Editor")
tag_expired_tombstone = name(DocInfoTagName, 'exp-tomb', "Expired tombstone")
@ -190,12 +193,9 @@ def iesg_login_to_person(l):
try:
return old_person_to_person(l.person)
except Email.DoesNotExist:
try:
return Person.objects.get(name="%s %s" % (l.person.first_name, l.person.last_name))
except Person.DoesNotExist:
print "MISSING IESG LOGIN", l.person, l.person.email()
return None
except Person.DoesNotExist:
print "MISSING IESG LOGIN", l.person, l.person.email()
return None
def iesg_login_is_secretary(l):
# Amy has two users, for some reason, we sometimes get the wrong one
@ -775,7 +775,7 @@ for index, o in enumerate(all_drafts.iterator()):
d.stream = stream_mapping["INDEPENDENT"]
else:
d.stream = stream_mapping["IETF"]
d.wg_state = None
d.wg_state = None #wg_state_mapping[get_state_for_draft(o)]
d.iesg_state = iesg_state_mapping[None]
d.iana_state = None
d.rfc_state = None
@ -802,7 +802,7 @@ for index, o in enumerate(all_drafts.iterator()):
d.authors.clear()
for i, a in enumerate(o.authors.all().select_related("person").order_by('author_order', 'person')):
try:
e = Email.objects.get(address__iexact=a.email() or a.person.email()[1] or u"unknown-email-%s-%s" % (a.person.first_name, a.person.last_name))
e = Email.objects.get(address__iexact=a.email() or a.person.email()[1] or u"unknown-email-%s" % person_name(a.person).replace(" ", "-"))
# renumber since old numbers may be a bit borked
DocumentAuthor.objects.create(document=d, author=e, order=i)
except Email.DoesNotExist:

View file

@ -1,4 +1,4 @@
from redesign import unaccent
from ietf.utils import unaccent
from redesign.person.models import Person, Email, Alias
def clean_email_address(addr):
@ -14,11 +14,38 @@ def clean_email_address(addr):
else:
return addr
def person_name(person):
def clean_prefix(n):
n = clean(n)
if n in [".", "Mr.", "<s/", "e", "fas", "lk", "Miss", "Mr", "Mr,", "Mr.", "Mr..", "MRS", "Mrs.", "ms", "Ms,", "Ms.", "Ms. L", "mw", "prefix", "q", "qjfglesjtg", "s", "te mr", "\Mr."]:
return "" # skip
fixes = { "Dr": "Dr.", "Lt.Colonel": "Lt. Col.", "M": "M.", "Prof": "Prof.", "Prof.Dr.": "Prof. Dr.", "Professort": "Professor" }
return fixes.get(n, n)
def clean_suffix(n):
n = clean(n)
if n in ["q", "a", "suffix", "u", "w", "x", "\\"]:
return "" # skip
fixes = { "Jr": "Jr.", "Ph. D.": "Ph.D.", "Ph.D": "Ph.D.", "PhD":"Ph.D.", "Phd.": "Phd.", "Scd": "Sc.D." }
return fixes.get(n, n)
def clean(n):
if not n:
return ""
return n.replace("]", "").strip()
names = [clean_prefix(person.name_prefix), clean(person.first_name),
clean(person.middle_initial), clean(person.last_name), clean_suffix(person.name_suffix)]
return u" ".join(n for n in names if n)
def old_person_to_person(person):
try:
return Person.objects.get(id=person.pk)
except Person.DoesNotExist:
return Person.objects.get(alias__name=u"%s %s" % (person.first_name, person.last_name))
return Person.objects.get(alias__name=person_name(person))
def old_person_to_email(person):
hardcoded_emails = {
@ -26,30 +53,31 @@ def old_person_to_email(person):
"Dow Street": "dow.street@linquest.com",
}
return clean_email_address(person.email()[1] or hardcoded_emails.get("%s %s" % (person.first_name, person.last_name)) or "")
return clean_email_address(person.email()[1] or hardcoded_emails.get(u"%s %s" % (person.first_name, person.last_name)) or "")
def get_or_create_email(o, create_fake):
# take o.person (or o) and get or create new Email and Person objects
person = o.person if hasattr(o, "person") else o
name = person_name(person)
email = old_person_to_email(person)
if not email:
if create_fake:
email = u"unknown-email-%s-%s" % (person.first_name, person.last_name)
print ("USING FAKE EMAIL %s for %s %s %s" % (email, person.pk, person.first_name, person.last_name)).encode('utf-8')
email = u"unknown-email-%s" % name.replace(" ", "-")
print ("USING FAKE EMAIL %s for %s %s" % (email, person.pk, name)).encode('utf-8')
else:
print ("NO EMAIL FOR %s %s %s %s %s" % (o.__class__, o.pk, person.pk, person.first_name, person.last_name)).encode('utf-8')
print ("NO EMAIL FOR %s %s %s %s" % (o.__class__, o.pk, person.pk, name)).encode('utf-8')
return None
e, _ = Email.objects.select_related("person").get_or_create(address=email)
if not e.person:
n = u"%s %s" % (person.first_name, person.last_name)
asciified = unaccent.asciify(n)
aliases = Alias.objects.filter(name__in=(n, asciified))
asciified = unaccent.asciify(name)
aliases = Alias.objects.filter(name__in=(name, asciified))
if aliases:
p = aliases[0].person
else:
p = Person(id=person.pk, name=n, ascii=asciified)
p = Person(id=person.pk, name=name, ascii=asciified)
from ietf.idtracker.models import PostalAddress
addresses = person.postaladdress_set.filter(address_priority=1)
@ -59,9 +87,9 @@ def get_or_create_email(o, create_fake):
p.save()
Alias.objects.create(name=n, person=p)
if asciified != n:
Alias.objects.create(name=asciified, person=p)
Alias.objects.create(name=p.name, person=p)
if p.ascii != p.name:
Alias.objects.create(name=p.ascii, person=p)
e.person = p
e.save()