mirror of https://github.com/jumpserver/jumpserver
perf(tickets): 申请资产工单支持授权多个系统用户
parent
8f52f79d91
commit
a53e930950
|
@ -63,13 +63,14 @@ class RequestAssetPermTicketViewSet(JMSModelViewSet):
|
||||||
meta = instance.meta
|
meta = instance.meta
|
||||||
ips = ', '.join(meta.get('ips', []))
|
ips = ', '.join(meta.get('ips', []))
|
||||||
confirmed_assets = ', '.join(meta.get('confirmed_assets', []))
|
confirmed_assets = ', '.join(meta.get('confirmed_assets', []))
|
||||||
|
confirmed_system_users = ', '.join(meta.get('confirmed_system_users', []))
|
||||||
|
|
||||||
return textwrap.dedent(f'''\
|
return textwrap.dedent(f'''\
|
||||||
{_('IP group')}: {ips}
|
{_('IP group')}: {ips}
|
||||||
{_('Hostname')}: {meta.get('hostname', '')}
|
{_('Hostname')}: {meta.get('hostname', '')}
|
||||||
{_('System user')}: {meta.get('system_user', '')}
|
{_('System user')}: {meta.get('system_user', '')}
|
||||||
{_('Confirmed assets')}: {confirmed_assets}
|
{_('Confirmed assets')}: {confirmed_assets}
|
||||||
{_('Confirmed system user')}: {meta.get('confirmed_system_user', '')}
|
{_('Confirmed system users')}: {confirmed_system_users}
|
||||||
''')
|
''')
|
||||||
|
|
||||||
@action(detail=True, methods=[POST], permission_classes=[IsAssignee, IsValidUser])
|
@action(detail=True, methods=[POST], permission_classes=[IsAssignee, IsValidUser])
|
||||||
|
@ -95,15 +96,15 @@ class RequestAssetPermTicketViewSet(JMSModelViewSet):
|
||||||
if len(assets) != len(confirmed_assets):
|
if len(assets) != len(confirmed_assets):
|
||||||
raise ConfirmedAssetsChanged(detail=_('Confirmed assets changed'))
|
raise ConfirmedAssetsChanged(detail=_('Confirmed assets changed'))
|
||||||
|
|
||||||
confirmed_system_user = meta.get('confirmed_system_user')
|
confirmed_system_users = meta.get('confirmed_system_users', [])
|
||||||
if not confirmed_system_user:
|
if not confirmed_system_users:
|
||||||
raise NotHaveConfirmedSystemUser(detail=_('Confirm system-user first'))
|
raise NotHaveConfirmedSystemUser(detail=_('Confirm system-users first'))
|
||||||
|
|
||||||
system_user = get_object_or_none(SystemUser, id=confirmed_system_user)
|
system_users = SystemUser.objects.filter(id__in=confirmed_system_users)
|
||||||
if system_user is None:
|
if system_users is None:
|
||||||
raise ConfirmedSystemUserChanged(detail=_('Confirmed system-user changed'))
|
raise ConfirmedSystemUserChanged(detail=_('Confirmed system-users changed'))
|
||||||
|
|
||||||
self._create_asset_permission(instance, assets, system_user)
|
self._create_asset_permission(instance, assets, system_users)
|
||||||
return Response({'detail': _('Succeed')})
|
return Response({'detail': _('Succeed')})
|
||||||
|
|
||||||
@action(detail=True, methods=[POST], permission_classes=[IsAssignee | IsObjectOwner])
|
@action(detail=True, methods=[POST], permission_classes=[IsAssignee | IsObjectOwner])
|
||||||
|
@ -113,7 +114,7 @@ class RequestAssetPermTicketViewSet(JMSModelViewSet):
|
||||||
instance.save()
|
instance.save()
|
||||||
return Response({'detail': _('Succeed')})
|
return Response({'detail': _('Succeed')})
|
||||||
|
|
||||||
def _create_asset_permission(self, instance: Ticket, assets, system_user):
|
def _create_asset_permission(self, instance: Ticket, assets, system_users):
|
||||||
meta = instance.meta
|
meta = instance.meta
|
||||||
request = self.request
|
request = self.request
|
||||||
actions = meta.get('actions', Action.CONNECT)
|
actions = meta.get('actions', Action.CONNECT)
|
||||||
|
@ -135,7 +136,7 @@ class RequestAssetPermTicketViewSet(JMSModelViewSet):
|
||||||
request.user,
|
request.user,
|
||||||
self._get_extra_comment(instance))
|
self._get_extra_comment(instance))
|
||||||
ap = AssetPermission.objects.create(**ap_kwargs)
|
ap = AssetPermission.objects.create(**ap_kwargs)
|
||||||
ap.system_users.add(system_user)
|
ap.system_users.add(*system_users)
|
||||||
ap.assets.add(*assets)
|
ap.assets.add(*assets)
|
||||||
ap.users.add(instance.user)
|
ap.users.add(instance.user)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Generated by BaiJiangjie 2020-09-29 18:31
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_ticket_meta_confirmed_system_user_to_confirmed_system_users(apps, schema_editor):
|
||||||
|
ticket_model = apps.get_model("tickets", "Ticket")
|
||||||
|
tickets = ticket_model.origin_objects.all()
|
||||||
|
|
||||||
|
for ticket in tickets:
|
||||||
|
meta = ticket.meta
|
||||||
|
confirmed_system_user = meta.get('confirmed_system_user')
|
||||||
|
if confirmed_system_user:
|
||||||
|
confirmed_system_users = [confirmed_system_user]
|
||||||
|
else:
|
||||||
|
confirmed_system_users = []
|
||||||
|
meta.update({
|
||||||
|
'confirmed_system_users': confirmed_system_users
|
||||||
|
})
|
||||||
|
ticket.meta = meta
|
||||||
|
ticket.save()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('tickets', '0004_ticket_comment'),
|
||||||
|
]
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(migrate_ticket_meta_confirmed_system_user_to_confirmed_system_users)
|
||||||
|
]
|
|
@ -33,19 +33,20 @@ class RequestAssetPermTicketSerializer(serializers.ModelSerializer):
|
||||||
source='meta.confirmed_assets',
|
source='meta.confirmed_assets',
|
||||||
default=list, required=False,
|
default=list, required=False,
|
||||||
label=_('Confirmed assets'))
|
label=_('Confirmed assets'))
|
||||||
confirmed_system_user = serializers.UUIDField(source='meta.confirmed_system_user',
|
confirmed_system_users = serializers.ListField(child=serializers.UUIDField(),
|
||||||
default='', required=False,
|
source='meta.confirmed_system_users',
|
||||||
|
default=list, required=False,
|
||||||
label=_('Confirmed system user'))
|
label=_('Confirmed system user'))
|
||||||
assets_waitlist_url = serializers.SerializerMethodField()
|
assets_waitlist_url = serializers.SerializerMethodField()
|
||||||
system_user_waitlist_url = serializers.SerializerMethodField()
|
system_users_waitlist_url = serializers.SerializerMethodField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Ticket
|
model = Ticket
|
||||||
mini_fields = ['id', 'title']
|
mini_fields = ['id', 'title']
|
||||||
small_fields = [
|
small_fields = [
|
||||||
'status', 'action', 'date_created', 'date_updated', 'system_user_waitlist_url',
|
'status', 'action', 'date_created', 'date_updated', 'system_users_waitlist_url',
|
||||||
'type', 'type_display', 'action_display', 'ips', 'confirmed_assets',
|
'type', 'type_display', 'action_display', 'ips', 'confirmed_assets',
|
||||||
'date_start', 'date_expired', 'confirmed_system_user', 'hostname',
|
'date_start', 'date_expired', 'confirmed_system_users', 'hostname',
|
||||||
'assets_waitlist_url', 'system_user', 'org_id', 'actions', 'comment'
|
'assets_waitlist_url', 'system_user', 'org_id', 'actions', 'comment'
|
||||||
]
|
]
|
||||||
m2m_fields = [
|
m2m_fields = [
|
||||||
|
@ -96,7 +97,7 @@ class RequestAssetPermTicketSerializer(serializers.ModelSerializer):
|
||||||
raise serializers.ValidationError(_('Field `assignees` must be organization admin or superuser'))
|
raise serializers.ValidationError(_('Field `assignees` must be organization admin or superuser'))
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
def get_system_user_waitlist_url(self, instance: Ticket):
|
def get_system_users_waitlist_url(self, instance: Ticket):
|
||||||
if not self._is_assignee(instance):
|
if not self._is_assignee(instance):
|
||||||
return None
|
return None
|
||||||
return reverse('api-assets:system-user-list')
|
return reverse('api-assets:system-user-list')
|
||||||
|
@ -190,16 +191,14 @@ class RequestAssetPermTicketSerializer(serializers.ModelSerializer):
|
||||||
meta['date_expired'] = dt_formater(date_expired)
|
meta['date_expired'] = dt_formater(date_expired)
|
||||||
|
|
||||||
# UUID 的转换
|
# UUID 的转换
|
||||||
confirmed_system_user = meta.get('confirmed_system_user')
|
confirmed_system_users = meta.get('confirmed_system_users')
|
||||||
if confirmed_system_user:
|
if confirmed_system_users:
|
||||||
meta['confirmed_system_user'] = str(confirmed_system_user)
|
meta['confirmed_system_users'] = [str(system_user) for system_user in confirmed_system_users]
|
||||||
|
|
||||||
confirmed_assets = meta.get('confirmed_assets')
|
confirmed_assets = meta.get('confirmed_assets')
|
||||||
if confirmed_assets:
|
if confirmed_assets:
|
||||||
new_confirmed_assets = []
|
meta['confirmed_assets'] = [str(asset) for asset in confirmed_assets]
|
||||||
for asset in confirmed_assets:
|
|
||||||
new_confirmed_assets.append(str(asset))
|
|
||||||
meta['confirmed_assets'] = new_confirmed_assets
|
|
||||||
with tmp_to_root_org():
|
with tmp_to_root_org():
|
||||||
return super().save(**kwargs)
|
return super().save(**kwargs)
|
||||||
|
|
||||||
|
@ -220,7 +219,7 @@ class RequestAssetPermTicketSerializer(serializers.ModelSerializer):
|
||||||
def _pop_confirmed_fields(self):
|
def _pop_confirmed_fields(self):
|
||||||
meta = self.validated_data['meta']
|
meta = self.validated_data['meta']
|
||||||
meta.pop('confirmed_assets', None)
|
meta.pop('confirmed_assets', None)
|
||||||
meta.pop('confirmed_system_user', None)
|
meta.pop('confirmed_system_users', None)
|
||||||
|
|
||||||
def _is_assignee(self, obj: Ticket):
|
def _is_assignee(self, obj: Ticket):
|
||||||
user = self.context['request'].user
|
user = self.context['request'].user
|
||||||
|
|
Loading…
Reference in New Issue