mirror of https://github.com/jumpserver/jumpserver
				
				
				
			perf: 去掉工单重新打开状态
							parent
							
								
									681cecc52b
								
							
						
					
					
						commit
						d3d89b0853
					
				| 
						 | 
				
			
			@ -16,7 +16,6 @@ class TicketType(TextChoices):
 | 
			
		|||
class TicketState(TextChoices):
 | 
			
		||||
    pending = 'pending', _('Open')
 | 
			
		||||
    closed = 'closed', _("Cancel")
 | 
			
		||||
    reopen = 'reopen', _("Reopen")
 | 
			
		||||
    approved = 'approved', _('Approved')
 | 
			
		||||
    rejected = 'rejected', _('Rejected')
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +28,6 @@ class TicketStatus(TextChoices):
 | 
			
		|||
class StepState(TextChoices):
 | 
			
		||||
    pending = 'pending', _('Pending')
 | 
			
		||||
    closed = 'closed', _("Closed")
 | 
			
		||||
    reopen = 'reopen', _("Reopen")
 | 
			
		||||
    approved = 'approved', _('Approved')
 | 
			
		||||
    rejected = 'rejected', _('Rejected')
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,10 +11,9 @@ from tickets.models import (
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
class TicketFilter(BaseFilterSet):
 | 
			
		||||
    applicant = filters.CharFilter(method='filter_applicant')
 | 
			
		||||
    assignees__id = filters.UUIDFilter(method='filter_assignees_id')
 | 
			
		||||
    relevant_app = filters.CharFilter(method='filter_relevant_app')
 | 
			
		||||
    relevant_asset = filters.CharFilter(method='filter_relevant_asset')
 | 
			
		||||
    relevant_system_user = filters.CharFilter(method='filter_relevant_system_user')
 | 
			
		||||
    relevant_command = filters.CharFilter(method='filter_relevant_command')
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
| 
						 | 
				
			
			@ -64,6 +63,11 @@ class TicketFilter(BaseFilterSet):
 | 
			
		|||
        ).values_list('id', flat=True)
 | 
			
		||||
        return queryset.filter(id__in=list(command_ids))
 | 
			
		||||
 | 
			
		||||
    def filter_applicant(self, queryset, name, value):
 | 
			
		||||
        return queryset.filter(
 | 
			
		||||
            Q(applicant__username__icontains=value) | Q(applicant__name__icontains=value)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ApplyAssetTicketFilter(BaseFilterSet):
 | 
			
		||||
    class Meta:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ class BaseHandler:
 | 
			
		|||
 | 
			
		||||
    def _create_state_change_comment(self, state):
 | 
			
		||||
        # 打开或关闭工单,备注显示是自己,其他是受理人
 | 
			
		||||
        if state in [TicketState.reopen, TicketState.pending, TicketState.closed]:
 | 
			
		||||
        if state in [TicketState.pending, TicketState.closed]:
 | 
			
		||||
            user = self.ticket.applicant
 | 
			
		||||
        else:
 | 
			
		||||
            user = self.ticket.processor
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ class Migration(migrations.Migration):
 | 
			
		|||
            model_name='ticket',
 | 
			
		||||
            name='state',
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Open'), ('approved', 'Approved'), ('rejected', 'Rejected'),
 | 
			
		||||
                                            ('closed', 'Cancel'), ('reopen', 'Reopen')], default='pending',
 | 
			
		||||
                                            ('closed', 'Cancel')], default='pending',
 | 
			
		||||
                                   max_length=16, verbose_name='State'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
| 
						 | 
				
			
			@ -74,14 +74,14 @@ class Migration(migrations.Migration):
 | 
			
		|||
            model_name='ticketassignee',
 | 
			
		||||
            name='state',
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Open'), ('approved', 'Approved'), ('rejected', 'Rejected'),
 | 
			
		||||
                                            ('closed', 'Cancel'), ('reopen', 'Reopen')], default='pending',
 | 
			
		||||
                                            ('closed', 'Cancel')], default='pending',
 | 
			
		||||
                                   max_length=64),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticketstep',
 | 
			
		||||
            name='state',
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Pending'), ('approved', 'Approved'), ('rejected', 'Rejected'),
 | 
			
		||||
                                            ('closed', 'Closed'), ('reopen', 'Reopen')], default='pending',
 | 
			
		||||
                                            ('closed', 'Closed')], default='pending',
 | 
			
		||||
                                   max_length=64, verbose_name='State'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,8 +30,7 @@ class Migration(migrations.Migration):
 | 
			
		|||
            field=models.CharField(
 | 
			
		||||
                choices=[
 | 
			
		||||
                    ('pending', 'Open'), ('closed', 'Cancel'),
 | 
			
		||||
                    ('reopen', 'Reopen'), ('approved', 'Approved'),
 | 
			
		||||
                    ('rejected', 'Rejected')
 | 
			
		||||
                    ('approved', 'Approved'), ('rejected', 'Rejected')
 | 
			
		||||
                ], default='pending', max_length=16, verbose_name='State'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
| 
						 | 
				
			
			@ -51,8 +50,7 @@ class Migration(migrations.Migration):
 | 
			
		|||
            field=models.CharField(
 | 
			
		||||
                choices=[
 | 
			
		||||
                    ('pending', 'Open'), ('closed', 'Cancel'),
 | 
			
		||||
                    ('reopen', 'Reopen'), ('approved', 'Approved'),
 | 
			
		||||
                    ('rejected', 'Rejected')
 | 
			
		||||
                    ('approved', 'Approved'), ('rejected', 'Rejected')
 | 
			
		||||
                ], default='pending', max_length=64),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
| 
						 | 
				
			
			@ -72,8 +70,7 @@ class Migration(migrations.Migration):
 | 
			
		|||
            field=models.CharField(
 | 
			
		||||
                choices=[
 | 
			
		||||
                    ('pending', 'Pending'), ('closed', 'Closed'),
 | 
			
		||||
                    ('reopen', 'Reopen'), ('approved', 'Approved'),
 | 
			
		||||
                    ('rejected', 'Rejected')
 | 
			
		||||
                    ('approved', 'Approved'), ('rejected', 'Rejected')
 | 
			
		||||
                ], default='pending', max_length=64, verbose_name='State'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@ from django.db import migrations, models
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('tickets', '0023_alter_applyassetticket_apply_actions'),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -13,36 +12,52 @@ class Migration(migrations.Migration):
 | 
			
		|||
        migrations.AlterField(
 | 
			
		||||
            model_name='approvalrule',
 | 
			
		||||
            name='strategy',
 | 
			
		||||
            field=models.CharField(choices=[('org_admin', 'Org admin'), ('custom_user', 'Custom user'), ('super_admin', 'Super admin'), ('super_org_admin', 'Super admin and org admin')], default='super_admin', max_length=64, verbose_name='Approve strategy'),
 | 
			
		||||
            field=models.CharField(
 | 
			
		||||
                choices=[('org_admin', 'Org admin'), ('custom_user', 'Custom user'), ('super_admin', 'Super admin'),
 | 
			
		||||
                         ('super_org_admin', 'Super admin and org admin')], default='super_admin', max_length=64,
 | 
			
		||||
                verbose_name='Approve strategy'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticket',
 | 
			
		||||
            name='state',
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Open'), ('closed', 'Cancel'), ('reopen', 'Reopen'), ('approved', 'Approved'), ('rejected', 'Rejected')], default='pending', max_length=16, verbose_name='State'),
 | 
			
		||||
            field=models.CharField(
 | 
			
		||||
                choices=[('pending', 'Open'), ('closed', 'Cancel'), ('approved', 'Approved'), ('rejected', 'Rejected')],
 | 
			
		||||
                default='pending', max_length=16, verbose_name='State'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticket',
 | 
			
		||||
            name='type',
 | 
			
		||||
            field=models.CharField(choices=[('general', 'General'), ('apply_asset', 'Apply for asset'), ('login_confirm', 'Login confirm'), ('command_confirm', 'Command confirm'), ('login_asset_confirm', 'Login asset confirm')], default='general', max_length=64, verbose_name='Type'),
 | 
			
		||||
            field=models.CharField(
 | 
			
		||||
                choices=[('general', 'General'), ('apply_asset', 'Apply for asset'), ('login_confirm', 'Login confirm'),
 | 
			
		||||
                         ('command_confirm', 'Command confirm'), ('login_asset_confirm', 'Login asset confirm')],
 | 
			
		||||
                default='general', max_length=64, verbose_name='Type'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticketassignee',
 | 
			
		||||
            name='state',
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Open'), ('closed', 'Cancel'), ('reopen', 'Reopen'), ('approved', 'Approved'), ('rejected', 'Rejected')], default='pending', max_length=64),
 | 
			
		||||
            field=models.CharField(
 | 
			
		||||
                choices=[('pending', 'Open'), ('closed', 'Cancel'), ('approved', 'Approved'), ('rejected', 'Rejected')],
 | 
			
		||||
                default='pending', max_length=64),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticketflow',
 | 
			
		||||
            name='type',
 | 
			
		||||
            field=models.CharField(choices=[('general', 'General'), ('apply_asset', 'Apply for asset'), ('login_confirm', 'Login confirm'), ('command_confirm', 'Command confirm'), ('login_asset_confirm', 'Login asset confirm')], default='general', max_length=64, verbose_name='Type'),
 | 
			
		||||
            field=models.CharField(
 | 
			
		||||
                choices=[('general', 'General'), ('apply_asset', 'Apply for asset'), ('login_confirm', 'Login confirm'),
 | 
			
		||||
                         ('command_confirm', 'Command confirm'), ('login_asset_confirm', 'Login asset confirm')],
 | 
			
		||||
                default='general', max_length=64, verbose_name='Type'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticketstep',
 | 
			
		||||
            name='state',
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Pending'), ('closed', 'Closed'), ('reopen', 'Reopen'), ('approved', 'Approved'), ('rejected', 'Rejected')], default='pending', max_length=64, verbose_name='State'),
 | 
			
		||||
            field=models.CharField(choices=[('pending', 'Pending'), ('closed', 'Closed'), ('approved', 'Approved'),
 | 
			
		||||
                                            ('rejected', 'Rejected')], default='pending', max_length=64,
 | 
			
		||||
                                   verbose_name='State'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='ticketstep',
 | 
			
		||||
            name='status',
 | 
			
		||||
            field=models.CharField(choices=[('active', 'Active'), ('closed', 'Closed'), ('pending', 'Pending')], default='pending', max_length=16),
 | 
			
		||||
            field=models.CharField(choices=[('active', 'Active'), ('closed', 'Closed'), ('pending', 'Pending')],
 | 
			
		||||
                                   default='pending', max_length=16),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,16 +143,13 @@ class StatusMixin:
 | 
			
		|||
    def reject(self, processor):
 | 
			
		||||
        self._change_state(StepState.rejected, processor)
 | 
			
		||||
 | 
			
		||||
    def reopen(self):
 | 
			
		||||
        self._change_state_by_applicant(TicketState.reopen)
 | 
			
		||||
 | 
			
		||||
    def close(self):
 | 
			
		||||
        self._change_state(TicketState.closed, self.applicant)
 | 
			
		||||
 | 
			
		||||
    def _change_state_by_applicant(self, state):
 | 
			
		||||
        if state == TicketState.closed:
 | 
			
		||||
            self.status = TicketStatus.closed
 | 
			
		||||
        elif state in [TicketState.reopen, TicketState.pending]:
 | 
			
		||||
        elif state == TicketState.pending:
 | 
			
		||||
            self.status = TicketStatus.open
 | 
			
		||||
        else:
 | 
			
		||||
            raise ValueError("Not supported state: {}".format(state))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ __all__ = [
 | 
			
		|||
class TicketSerializer(OrgResourceModelSerializerMixin):
 | 
			
		||||
    type = LabeledChoiceField(choices=TicketType.choices, read_only=True, label=_('Type'))
 | 
			
		||||
    status = LabeledChoiceField(choices=TicketStatus.choices, read_only=True, label=_('Status'))
 | 
			
		||||
    state = LabeledChoiceField(choices=TicketState.choices, read_only=True, label=_("State"))
 | 
			
		||||
    state = LabeledChoiceField(choices=TicketState.choices, read_only=True, label=_("Action"))
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Ticket
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue