mirror of https://github.com/jumpserver/jumpserver
perf: account backup
parent
c861f390c7
commit
408c6c568a
|
@ -49,23 +49,6 @@ class BaseAccountHandler:
|
||||||
header_fields[field] = str(v.label)
|
header_fields[field] = str(v.label)
|
||||||
return header_fields
|
return header_fields
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def load_auth(tp, value, system_user):
|
|
||||||
if value:
|
|
||||||
return value
|
|
||||||
if system_user:
|
|
||||||
return getattr(system_user, tp, '')
|
|
||||||
return ''
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def replace_auth(cls, account, system_user_dict):
|
|
||||||
system_user = system_user_dict.get(account.systemuser_id)
|
|
||||||
account.username = cls.load_auth('username', account.username, system_user)
|
|
||||||
account.password = cls.load_auth('password', account.password, system_user)
|
|
||||||
account.private_key = cls.load_auth('private_key', account.private_key, system_user)
|
|
||||||
account.public_key = cls.load_auth('public_key', account.public_key, system_user)
|
|
||||||
return account
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_row(cls, data, header_fields):
|
def create_row(cls, data, header_fields):
|
||||||
data = cls.unpack_data(data)
|
data = cls.unpack_data(data)
|
||||||
|
@ -94,30 +77,30 @@ class AssetAccountHandler(BaseAccountHandler):
|
||||||
return filename
|
return filename
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_data_map(cls, categories: list):
|
def create_data_map(cls, types: list):
|
||||||
data_map = defaultdict(list)
|
data_map = defaultdict(list)
|
||||||
|
|
||||||
# TODO 可以优化一下查询 在账号上做 category 的缓存 避免数据量大时连表操作
|
# TODO 可以优化一下查询 在账号上做 category 的缓存 避免数据量大时连表操作
|
||||||
qs = Account.objects.filter(
|
qs = Account.objects.filter(
|
||||||
asset__platform__type__in=categories
|
asset__platform__type__in=types
|
||||||
).annotate(category=F('asset__platform__type'))
|
).annotate(type=F('asset__platform__type'))
|
||||||
print(qs, categories)
|
|
||||||
if not qs.exists():
|
if not qs.exists():
|
||||||
return data_map
|
return data_map
|
||||||
|
|
||||||
category_dict = {}
|
type_dict = {}
|
||||||
for i in AllTypes.grouped_choices_to_objs():
|
for i in AllTypes.grouped_choices_to_objs():
|
||||||
for j in i['children']:
|
for j in i['children']:
|
||||||
category_dict[j['value']] = j['display_name']
|
type_dict[j['value']] = j['display_name']
|
||||||
|
|
||||||
header_fields = cls.get_header_fields(AccountSecretSerializer(qs.first()))
|
header_fields = cls.get_header_fields(AccountSecretSerializer(qs.first()))
|
||||||
account_category_map = defaultdict(list)
|
account_type_map = defaultdict(list)
|
||||||
for account in qs:
|
for account in qs:
|
||||||
account_category_map[account.category].append(account)
|
account_type_map[account.type].append(account)
|
||||||
|
|
||||||
data_map = {}
|
data_map = {}
|
||||||
for category, accounts in account_category_map.items():
|
for tp, accounts in account_type_map.items():
|
||||||
sheet_name = category_dict.get(category, category)
|
sheet_name = type_dict.get(tp, tp)
|
||||||
data = AccountSecretSerializer(accounts, many=True).data
|
data = AccountSecretSerializer(accounts, many=True).data
|
||||||
data_map.update(cls.add_rows(data, header_fields, sheet_name))
|
data_map.update(cls.add_rows(data, header_fields, sheet_name))
|
||||||
|
|
||||||
|
@ -140,9 +123,9 @@ class AccountBackupHandler:
|
||||||
# Print task start date
|
# Print task start date
|
||||||
time_start = time.time()
|
time_start = time.time()
|
||||||
files = []
|
files = []
|
||||||
categories = self.execution.categories
|
types = self.execution.types
|
||||||
|
|
||||||
data_map = AssetAccountHandler.create_data_map(categories)
|
data_map = AssetAccountHandler.create_data_map(types)
|
||||||
if not data_map:
|
if not data_map:
|
||||||
return files
|
return files
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ class AccountBackupPlanSerializer(PeriodTaskSerializerMixin, BulkOrgResourceMode
|
||||||
|
|
||||||
|
|
||||||
class AccountBackupPlanExecutionSerializer(serializers.ModelSerializer):
|
class AccountBackupPlanExecutionSerializer(serializers.ModelSerializer):
|
||||||
trigger = LabeledChoiceField(choices=Trigger.choices, label=_('Trigger mode'))
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = AccountBackupPlanExecution
|
model = AccountBackupPlanExecution
|
||||||
|
|
Loading…
Reference in New Issue