datatracker/redesign/importing/import-liaison.py
2012-01-24 17:17:24 +00:00

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)