mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.5 KiB
70 lines
2.5 KiB
# Generated by Django 3.2.16 on 2023-03-07 07:36
|
|
|
|
from django.db import migrations
|
|
from django.db.models import Q
|
|
|
|
|
|
def get_nodes_all_assets(apps, *nodes):
|
|
node_model = apps.get_model('assets', 'Node')
|
|
asset_model = apps.get_model('assets', 'Asset')
|
|
node_ids = set()
|
|
descendant_node_query = Q()
|
|
for n in nodes:
|
|
node_ids.add(n.id)
|
|
descendant_node_query |= Q(key__istartswith=f'{n.key}:')
|
|
if descendant_node_query:
|
|
_ids = node_model.objects.order_by().filter(descendant_node_query).values_list('id', flat=True)
|
|
node_ids.update(_ids)
|
|
return asset_model.objects.order_by().filter(nodes__id__in=node_ids).distinct()
|
|
|
|
|
|
def get_all_assets(apps, snapshot):
|
|
node_model = apps.get_model('assets', 'Node')
|
|
asset_model = apps.get_model('assets', 'Asset')
|
|
asset_ids = snapshot.get('assets', [])
|
|
node_ids = snapshot.get('nodes', [])
|
|
|
|
nodes = node_model.objects.filter(id__in=node_ids)
|
|
node_asset_ids = get_nodes_all_assets(apps, *nodes).values_list('id', flat=True)
|
|
asset_ids = set(list(asset_ids) + list(node_asset_ids))
|
|
return asset_model.objects.filter(id__in=asset_ids)
|
|
|
|
|
|
def migrate_account_usernames_to_ids(apps, schema_editor):
|
|
db_alias = schema_editor.connection.alias
|
|
execution_model = apps.get_model('accounts', 'AutomationExecution')
|
|
account_model = apps.get_model('accounts', 'Account')
|
|
executions = execution_model.objects.using(db_alias).all()
|
|
executions_update = []
|
|
for execution in executions:
|
|
snapshot = execution.snapshot
|
|
accounts = account_model.objects.none()
|
|
account_usernames = snapshot.get('accounts', [])
|
|
for asset in get_all_assets(apps, snapshot):
|
|
accounts = accounts | asset.accounts.all()
|
|
secret_type = snapshot.get('secret_type')
|
|
if secret_type:
|
|
ids = accounts.filter(
|
|
username__in=account_usernames,
|
|
secret_type=secret_type
|
|
).values_list('id', flat=True)
|
|
else:
|
|
ids = accounts.filter(
|
|
username__in=account_usernames
|
|
).values_list('id', flat=True)
|
|
snapshot['accounts'] = [str(_id) for _id in ids]
|
|
execution.snapshot = snapshot
|
|
executions_update.append(execution)
|
|
|
|
execution_model.objects.bulk_update(executions_update, ['snapshot'])
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
dependencies = [
|
|
('accounts', '0008_alter_gatheredaccount_options'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.RunPython(migrate_account_usernames_to_ids),
|
|
]
|