205 lines
7.7 KiB
Python
Executable file
205 lines
7.7 KiB
Python
Executable file
#!/usr/bin/python
|
|
|
|
import sys, os, re, datetime, pytz
|
|
|
|
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
|
|
sys.path = [ basedir ] + sys.path
|
|
|
|
from ietf import settings
|
|
settings.USE_DB_REDESIGN_PROXY_CLASSES = False
|
|
settings.IMPORTING_FROM_OLD_SCHEMA = True
|
|
|
|
from django.core import management
|
|
management.setup_environ(settings)
|
|
|
|
from django.template.defaultfilters import slugify
|
|
|
|
from ietf.idtracker.models import Acronym, EmailAddress
|
|
from ietf.liaisons.models import *
|
|
from ietf.doc.models import Document, DocAlias
|
|
from ietf.person.models import *
|
|
from ietf.importing.utils import old_person_to_person
|
|
from ietf.name.models import *
|
|
from ietf.name.utils import name
|
|
|
|
|
|
# imports LiaisonDetail, OutgoingLiaisonApproval, Uploads
|
|
|
|
# todo: LiaisonStatementManager, LiaisonManagers, SDOAuthorizedIndividual
|
|
|
|
# assumptions:
|
|
# - persons have been imported
|
|
# - groups have been imported
|
|
|
|
purpose_mapping = {
|
|
1: name(LiaisonStatementPurposeName, "action", "For action", order=1),
|
|
2: name(LiaisonStatementPurposeName, "comment", "For comment", order=2),
|
|
3: name(LiaisonStatementPurposeName, "info", "For information", order=3),
|
|
4: name(LiaisonStatementPurposeName, "response", "In response", order=4),
|
|
# we drop the "other" category here, it was virtuall unused in the old schema
|
|
}
|
|
|
|
liaison_attachment_doctype = name(DocTypeName, "liai-att", "Liaison Attachment")
|
|
|
|
purpose_mapping[None] = purpose_mapping[0] = purpose_mapping[3] # map unknown to "For information"
|
|
purpose_mapping[5] = purpose_mapping[3] # "Other" is mapped to "For information" as default
|
|
|
|
system_email = Email.objects.get(person__name="(System)")
|
|
obviously_bogus_date = datetime.date(1970, 1, 1)
|
|
|
|
bodies = {
|
|
'IESG': Group.objects.get(acronym="iesg"),
|
|
'IETF': Group.objects.get(acronym="ietf"),
|
|
'IETF IESG': Group.objects.get(acronym="iesg"),
|
|
'The IETF': Group.objects.get(acronym="ietf"),
|
|
'IAB/ISOC': Group.objects.get(acronym="iab"),
|
|
'ISOC/IAB': Group.objects.get(acronym="iab"),
|
|
'IAB/IESG': Group.objects.get(acronym="iab"),
|
|
'IAB': Group.objects.get(acronym="iab"),
|
|
'IETF IAB': Group.objects.get(acronym="iab"),
|
|
'IETF Transport Directorate': Group.objects.get(acronym="tsvdir"),
|
|
'Sigtran': Group.objects.get(acronym="sigtran", type="wg"),
|
|
'IETF RAI WG': Group.objects.get(acronym="rai", type="area"),
|
|
'IETF RAI': Group.objects.get(acronym="rai", type="area"),
|
|
'IETF Mobile IP WG': Group.objects.get(acronym="mobileip", type="wg"),
|
|
"IETF Operations and Management Area": Group.objects.get(acronym="ops", type="area"),
|
|
"IETF/Operations and Management Area": Group.objects.get(acronym="ops", type="area"),
|
|
"IETF OAM Area": Group.objects.get(acronym="ops", type="area"),
|
|
"IETF O&M Area": Group.objects.get(acronym="ops", type="area"),
|
|
"IETF O&M area": Group.objects.get(acronym="ops", type="area"),
|
|
"IETF O&M": Group.objects.get(acronym="ops", type="area"),
|
|
"IETF O&M Area Directors": Group.objects.get(acronym="ops", type="area"),
|
|
"PWE3 Working Greoup": Group.objects.get(acronym="pwe3", type="wg"),
|
|
"IETF PWE 3 WG": Group.objects.get(acronym="pwe3", type="wg"),
|
|
"IETF/Routing Area": Group.objects.get(acronym="rtg", type="area"),
|
|
"IRTF Internet Area": Group.objects.get(acronym="int", type="area"),
|
|
"IETF Sub IP Area": Group.objects.get(acronym="sub", type="area"),
|
|
}
|
|
|
|
def get_body(name, raw_code):
|
|
if raw_code:
|
|
# new tool is storing some group info directly, try decoding it
|
|
b = None
|
|
t = raw_code.split("_")
|
|
if len(t) == 2:
|
|
if t[0] == "area":
|
|
b = lookup_group(acronym=Acronym.objects.get(pk=t[1]).acronym, type="area")
|
|
elif t[0] == "wg":
|
|
b = lookup_group(acronym=Acronym.objects.get(pk=t[1]).acronym, type="wg")
|
|
elif t[0] == "sdo":
|
|
b = lookup_group(name=SDOs.objects.get(pk=t[1]).sdo_name, type="sdo")
|
|
|
|
if not b:
|
|
b = lookup_group(acronym=raw_code)
|
|
|
|
return b
|
|
|
|
# the from body name is a nice case study in how inconsistencies
|
|
# build up over time
|
|
name = (name.replace("(", "").replace(")", "").replace(" Chairs", "")
|
|
.replace("Working Group", "WG").replace("working group", "WG"))
|
|
b = bodies.get(name)
|
|
t = name.split()
|
|
if not b and name.startswith("IETF"):
|
|
if len(t) == 1:
|
|
if "-" in name:
|
|
t = name.split("-")
|
|
elif "/" in name:
|
|
t = name.split("/")
|
|
b = lookup_group(acronym=t[1].lower(), type="wg")
|
|
elif len(t) < 3 or t[2].lower() == "wg":
|
|
b = lookup_group(acronym=t[1].lower(), type="wg")
|
|
elif t[2].lower() in ("area", "ad"):
|
|
b = lookup_group(acronym=t[1].lower(), type="area")
|
|
if not b:
|
|
b = lookup_group(name=u"%s %s" % (t[1], t[2]), type="area")
|
|
|
|
if not b and name.endswith(" WG"):
|
|
b = lookup_group(acronym=t[-2].lower(), type="wg")
|
|
|
|
if not b:
|
|
b = lookup_group(name=name, type="sdo")
|
|
|
|
return b
|
|
|
|
for o in LiaisonDetail.objects.all().order_by("pk"):
|
|
print "importing LiaisonDetail", o.pk
|
|
|
|
try:
|
|
l = LiaisonStatement.objects.get(pk=o.pk)
|
|
except LiaisonStatement.DoesNotExist:
|
|
l = LiaisonStatement(pk=o.pk)
|
|
|
|
l.title = (o.title or "").strip()
|
|
l.purpose = purpose_mapping[o.purpose_id]
|
|
if o.purpose_text and not o.purpose and "action" in o.purpose_text.lower():
|
|
o.purpose = purpose_mapping[1]
|
|
l.body = (o.body or "").strip()
|
|
l.deadline = o.deadline_date
|
|
|
|
l.related_to_id = o.related_to_id # should not dangle as we process ids in turn
|
|
|
|
def lookup_group(**kwargs):
|
|
try:
|
|
return Group.objects.get(**kwargs)
|
|
except Group.DoesNotExist:
|
|
return None
|
|
|
|
l.from_name = o.from_body().strip()
|
|
l.from_group = get_body(l.from_name, o.from_raw_code) # try to establish link
|
|
if not o.person:
|
|
l.from_contact = None
|
|
else:
|
|
try:
|
|
l.from_contact = Email.objects.get(address__iexact=o.from_email().address)
|
|
except EmailAddress.DoesNotExist:
|
|
l.from_contact = old_person_to_person(o.person).email_set.order_by('-active')[0]
|
|
|
|
if o.by_secretariat:
|
|
l.to_name = o.submitter_name
|
|
if o.submitter_email:
|
|
l.to_name += " <%s>" % o.submitter_email
|
|
else:
|
|
l.to_name = o.to_body
|
|
l.to_name = l.to_name.strip()
|
|
l.to_group = get_body(l.to_name, o.to_raw_code) # try to establish link
|
|
l.to_contact = (o.to_poc or "").strip()
|
|
|
|
l.reply_to = (o.replyto or "").strip()
|
|
|
|
l.response_contact = (o.response_contact or "").strip()
|
|
l.technical_contact = (o.technical_contact or "").strip()
|
|
l.cc = (o.cc1 or "").strip()
|
|
|
|
l.submitted = o.submitted_date
|
|
l.modified = o.last_modified_date
|
|
if not l.modified and l.submitted:
|
|
l.modified = l.submitted
|
|
if not o.approval:
|
|
# no approval object means it's approved alright - weird, we
|
|
# have to fake the approved date then
|
|
l.approved = l.modified or l.submitted or datetime.datetime.now()
|
|
else:
|
|
l.approved = o.approval.approval_date if o.approval.approved else None
|
|
|
|
l.action_taken = o.action_taken
|
|
|
|
l.save()
|
|
|
|
l.attachments.all().delete()
|
|
for i, u in enumerate(o.uploads_set.order_by("pk")):
|
|
attachment = Document()
|
|
attachment.title = u.file_title
|
|
attachment.type = liaison_attachment_doctype
|
|
attachment.name = l.name() + ("-attachment-%s" % (i + 1))
|
|
attachment.time = l.submitted
|
|
# we should fixup the filenames, but meanwhile, store it here
|
|
attachment.external_url = "file%s%s" % (u.file_id, u.file_extension)
|
|
attachment.save()
|
|
|
|
DocAlias.objects.get_or_create(document=attachment, name=attachment.name)
|
|
|
|
l.attachments.add(attachment)
|
|
|
|
|