Adrian Turjak 8d8c361b4a Update Adjutant-UI to handle 202 http codes
This matches the new changes to Adjutant as part of
the refactor to split API and Workflow layers.

202 will be the most common response code when dealing
with the creation of new tasks due to future async
task processing.

Change-Id: Ia09a070709b8a2973c9149df91c67af2b69199a0
2020-01-28 11:24:59 +13:00

253 lines
7.3 KiB
Python

# Copyright (c) 2016 Catalyst IT Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import exceptions
from horizon import tables
from adjutant_ui.api import adjutant
class CancelTask(tables.DeleteAction):
help_text = _("This will cancel all selected tasks.")
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Cancel Task",
u"Cancel Tasks",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Cancelled Task",
u"Cancelled Tasks",
count
)
def delete(self, request, obj_id):
result = adjutant.task_cancel(request, obj_id)
if not result or result.status_code != 200:
exception = exceptions.NotAvailable()
exception._safe_message = False
raise exception
def allowed(self, request, task=None):
if task:
return not(
task.status == "Completed" or task.status == "Cancelled")
return True
class ApproveTask(tables.BatchAction):
name = "approve"
help_text = _("This will approve all of the selected tasks.")
action_type = "danger"
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Approve Task",
u"Approve Tasks",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Approved Task",
u"Approved Tasks",
count
)
def action(self, request, obj_id):
result = adjutant.task_approve(request, obj_id)
if not result or result.status_code not in [200, 202]:
exception = exceptions.NotAvailable()
exception._safe_message = False
raise exception
def allowed(self, request, task=None):
if task:
return task.valid and not(
task.status == "Completed" or task.status == "Cancelled")
return True
class ReissueToken(tables.BatchAction):
name = "reissue"
help_text = _("This will reissue tokens for the selected tasks.")
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Reissue Token",
u"Reissue Tokens",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Reissued Token",
u"Reissued Tokens",
count
)
def action(self, request, obj_id):
result = adjutant.token_reissue(request, obj_id)
if not result or result.status_code != 200:
exception = exceptions.NotAvailable()
exception._safe_message = False
raise exception
def allowed(self, request, task=None):
if task:
return task.status == "Approved; Incomplete"
return True
class RevalidateTask(tables.BatchAction):
name = "revalidate"
help_text = _("Rerun initial validation for the task.")
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Rerun Validation",
u"Rerun Validation",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Validation run",
u"Validation run",
count
)
def action(self, request, obj_id):
result = adjutant.task_revalidate(request, obj_id)
if not result or result.status_code != 200:
exception = exceptions.NotAvailable()
exception._safe_message = False
raise exception
def allowed(self, request, task=None):
if task:
return task.status == 'Awaiting Approval' and not task.valid
return True
class ReapproveTask(ApproveTask):
name = "approve"
help_text = _("This will approve all of the selected tasks.")
action_type = "danger"
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Reapprove Task",
u"Reapprove Tasks",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Reapproved Task",
u"Reapproved Tasks",
count
)
class UpdateTask(tables.LinkAction):
name = "update"
verbose_name = _("Update Task")
url = "horizon:management:tasks:update"
classes = ("ajax-modal",)
def allowed(self, request, task=None):
if task:
return task.status == 'Awaiting Approval'
return True
def TaskTypeDisplayFilter(task_type):
return task_type.replace("_", " ").title()
class TaskTable(tables.DataTable):
uuid = tables.Column('id', verbose_name=_('Task ID'),
hidden=True)
task_type = tables.Column('task_type', verbose_name=_('Task Type'),
filters=[TaskTypeDisplayFilter],
link="horizon:management:tasks:detail")
status = tables.Column('status', verbose_name=_('Status'))
request_by = tables.Column('request_by', verbose_name=_('Requestee'))
request_project = tables.Column('request_project',
verbose_name=_('Request Project'))
valid = tables.Column('valid', verbose_name=_("Actions Valid"))
created_on = tables.Column('created_on',
verbose_name=_('Request Date'))
page = tables.Column('page', hidden=True)
class Meta(object):
name = 'task_table'
verbose_name = _('Tasks')
table_actions = (ApproveTask, RevalidateTask, CancelTask)
row_actions = (ApproveTask, UpdateTask, RevalidateTask, CancelTask, )
prev_pagination_param = pagination_param = 'task_page'
def get_prev_marker(self):
return str(int(self.data[0].page) - 1) if self.data else ''
def get_marker(self):
return str(int(self.data[0].page) + 1) if self.data else ''
def get_object_display(self, obj):
task_type = obj.task_type.replace("_", " ").title()
return "%s (%s)" % (task_type, obj.id)
class ApprovedTaskTable(TaskTable):
class Meta(object):
name = 'approved_table'
verbose_name = _('Tasks')
table_actions = (CancelTask, ReapproveTask, ReissueToken)
row_actions = (CancelTask, ReapproveTask, ReissueToken)
prev_pagination_param = pagination_param = 'approved_page'
class CompletedTaskTable(TaskTable):
class Meta(object):
name = 'completed_table'
verbose_name = _('Tasks')
prev_pagination_param = pagination_param = 'completed_page'
class CancelledTaskTable(TaskTable):
class Meta(object):
name = 'cancelled_table'
verbose_name = _('Tasks')
prev_pagination_param = pagination_param = 'cancelled_page'