Eliminate multiple-organization projects

Projects are duplicated with this migration to provide a nearly
equivalent functionality.

Satisifies #1164
This commit is contained in:
Akita Noek
2016-03-14 14:57:24 -04:00
parent 10646a448a
commit ba6752fb23
7 changed files with 175 additions and 25 deletions
@@ -184,4 +184,19 @@ class Migration(migrations.Migration):
name='rolepermission',
index_together=set([('content_type', 'object_id')]),
),
migrations.RenameField(
model_name='organization',
old_name='projects',
new_name='deprecated_projects',
),
migrations.AlterField(
model_name='organization',
name='deprecated_projects',
field=models.ManyToManyField(related_name='deprecated_organizations', to='main.Project', blank=True),
),
migrations.AddField(
model_name='project',
name='organization',
field=models.ForeignKey(related_name='projects', to='main.Organization', blank=True, null=True),
),
]
+54 -11
View File
@@ -1,3 +1,5 @@
from django.db import connection, transaction, reset_queries
from django.db.transaction import TransactionManagementError
from django.contrib.contenttypes.models import ContentType
from collections import defaultdict
@@ -131,31 +133,72 @@ def migrate_projects(apps, schema_editor):
Project = apps.get_model('main', 'Project')
Permission = apps.get_model('main', 'Permission')
JobTemplate = apps.get_model('main', 'JobTemplate')
for project in Project.objects.all():
if project.organizations.count() == 0 and project.created_by is not None:
# Migrate projects to single organizations, duplicating as necessary
for project in [p for p in Project.objects.all()]:
original_project_name = project.name
project_orgs = project.deprecated_organizations.distinct().all()
if project_orgs.count() > 1:
first_org = None
for org in project_orgs:
if first_org is None:
# For the first org, re-use our existing Project object, so don't do the below duplication effort
first_org = org
project.name = first_org.name + ' - ' + original_project_name
project.organization = first_org
project.save()
else:
print('Fork to %s ' % (org.name + ' - ' + original_project_name))
new_prj = Project.objects.create(
created = project.created,
description = project.description,
name = org.name + ' - ' + original_project_name,
old_pk = project.old_pk,
created_by_id = project.created_by_id,
scm_type = project.scm_type,
scm_url = project.scm_url,
scm_branch = project.scm_branch,
scm_clean = project.scm_clean,
scm_delete_on_update = project.scm_delete_on_update,
scm_delete_on_next_update = project.scm_delete_on_next_update,
scm_update_on_launch = project.scm_update_on_launch,
scm_update_cache_timeout = project.scm_update_cache_timeout,
credential = project.credential,
organization = org
)
migrations[original_project_name]['projects'].add(new_prj)
job_templates = JobTemplate.objects.filter(inventory__organization=org).all()
for jt in job_templates:
jt.project = new_prj
print('Updating jt to point to %s' % repr(new_prj))
jt.save()
# Migrate permissions
for project in [p for p in Project.objects.all()]:
if project.organization is not None and project.created_by is not None:
project.admin_role.members.add(project.created_by)
migrations[project.name]['users'].add(project.created_by)
migrations[original_project_name]['users'].add(project.created_by)
for team in project.teams.all():
team.member_role.children.add(project.member_role)
migrations[project.name]['teams'].add(team)
migrations[original_project_name]['teams'].add(team)
if project.organizations.count() > 0:
for org in project.organizations.all():
for user in org.users.all():
project.member_role.members.add(user)
migrations[project.name]['users'].add(user)
if project.organization is not None:
for user in project.organization.member_role.members.all():
project.member_role.members.add(user)
migrations[original_project_name]['users'].add(user)
for perm in Permission.objects.filter(project=project, active=True):
# All perms at this level just imply a user or team can read
if perm.team:
perm.team.member_role.children.add(project.member_role)
migrations[project.name]['teams'].add(perm.team)
migrations[original_project_name]['teams'].add(perm.team)
if perm.user:
project.member_role.members.add(perm.user)
migrations[project.name]['users'].add(perm.user)
migrations[original_project_name]['users'].add(perm.user)
return migrations