datatracker/ietf/bin/merge-person-records
Henrik Levkowetz 73a022cdb5 Merged in [9715] from rcross@amsl.com:
Update merge-person script to handle contraints and roles.
 - Legacy-Id: 9724
Note: SVN reference [9715] has been migrated to Git commit 5dfe492cfb
2015-07-15 11:14:15 +00:00

92 lines
2.4 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- Python -*-
#
import os, sys
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
sys.path = [ basedir ] + sys.path
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings")
import django
django.setup()
import argparse
import pprint
from django.contrib import admin
from django.contrib.auth.models import User
from ietf.person.models import Person
parser = argparse.ArgumentParser()
parser.add_argument("source_id",type=int)
parser.add_argument("target_id",type=int)
args = parser.parse_args()
source = Person.objects.get(pk=args.source_id)
target = Person.objects.get(pk=args.target_id)
print "Merging person {}({}) to {}({})".format(source.ascii,source.pk,target.ascii,target.pk)
response = raw_input('Ok to continue y/n? ')
if response.lower() != 'y':
sys.exit()
# merge emails
for email in source.email_set.all():
print "Merging email: {}".format(email.address)
email.person = target
email.save()
# merge aliases
target_aliases = [ a.name for a in target.alias_set.all() ]
for alias in source.alias_set.all():
if alias.name in target_aliases:
alias.delete()
else:
print "Merging alias: {}".format(alias.name)
alias.person = target
alias.save()
# merge DocEvents
for docevent in source.docevent_set.all():
docevent.by = target
docevent.save()
# merge SubmissionEvents
for subevent in source.submissionevent_set.all():
subevent.by = target
subevent.save()
# merge Messages
for message in source.message_set.all():
message.by = target
message.save()
# merge Constraints
for constraint in source.constraint_set.all():
constraint.person = target
constraint.save()
# merge Roles
for role in source.role_set.all():
role.person = target
role.save()
# check for any remaining relationships and delete if none
objs = [source]
opts = Person._meta
user = User.objects.filter(is_superuser=True).first()
admin_site = admin.site
using = 'default'
deletable_objects, perms_needed, protected = admin.utils.get_deleted_objects(
objs, opts, user, admin_site, using)
if len(deletable_objects) > 1:
print "Not Deleting Person: {}({})".format(source.ascii,source.pk)
print "Related objects remain:"
pprint.pprint(deletable_objects[1])
else:
print "Deleting Person: {}({})".format(source.ascii,source.pk)
source.delete()