Reorder categories
This commit is contained in:
parent
b2824286f0
commit
9576089e84
|
@ -356,12 +356,12 @@ def reorder_workflow_spec_category(cat_id, direction):
|
|||
if direction not in ('up', 'down'):
|
||||
raise ApiError(code='bad_direction',
|
||||
message='The direction must be `up` or `down`.')
|
||||
WorkflowService.cleanup_workflow_spec_category_display_order()
|
||||
spec_service = WorkflowSpecService()
|
||||
spec_service.cleanup_category_display_order()
|
||||
category = spec_service.get_category(cat_id)
|
||||
if category:
|
||||
ordered_categories = spec_service.reorder_workflow_spec_category(category, direction)
|
||||
return ordered_categories
|
||||
return WorkflowSpecCategorySchema(many=True).dump(ordered_categories)
|
||||
else:
|
||||
raise ApiError(code='bad_category_id',
|
||||
message=f'The category id {cat_id} did not return a Workflow Spec Category. Make sure it is a valid ID.')
|
||||
|
|
|
@ -8,13 +8,14 @@ from crc import db, ma
|
|||
|
||||
|
||||
class WorkflowSpecCategory(object):
|
||||
def __init__(self, id, display_name, display_order, admin):
|
||||
self.id = id # A unique string name, lower case, under scores (ie, 'my_category')
|
||||
def __init__(self, id, display_name, display_order, admin=False):
|
||||
self.id = id # A unique string name, lower case, under scores (ie, 'my_category')
|
||||
self.display_name = display_name
|
||||
self.display_order = display_order
|
||||
self.admin = admin
|
||||
self.workflows = [] # For storing Workflow Metadata
|
||||
self.specs = [] # For the list of specifications associated with a category
|
||||
self.specs = [] # For the list of specifications associated with a category
|
||||
|
||||
|
||||
class WorkflowSpecCategorySchema(ma.Schema):
|
||||
class Meta:
|
||||
|
|
|
@ -127,7 +127,7 @@ class WorkflowSpecService(FileSystemService):
|
|||
index = cats.index(cat)
|
||||
if direction == 'up' and index > 0:
|
||||
cats[index-1], cats[index] = cats[index], cats[index-1]
|
||||
if direction == 'down' and index < len(cats):
|
||||
if direction == 'down' and index < len(cats)-1:
|
||||
cats[index+1], cats[index] = cats[index], cats[index+1]
|
||||
index = 0
|
||||
for category in cats:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from tests.base_test import BaseTest
|
||||
|
||||
from crc import session
|
||||
from crc.api.common import ApiError
|
||||
from crc.models.workflow import WorkflowSpecCategory
|
||||
from crc.services.workflow_spec_service import WorkflowSpecService
|
||||
|
||||
import json
|
||||
|
||||
|
@ -10,146 +10,157 @@ class TestWorkflowSpecCategoryReorder(BaseTest):
|
|||
|
||||
@staticmethod
|
||||
def _load_test_categories():
|
||||
category_model_1 = WorkflowSpecCategoryModel(
|
||||
id=1,
|
||||
category_model_1 = WorkflowSpecCategory(
|
||||
id='test_category_1',
|
||||
display_name='Test Category 1',
|
||||
display_order=1
|
||||
)
|
||||
category_model_2 = WorkflowSpecCategoryModel(
|
||||
id=2,
|
||||
category_model_2 = WorkflowSpecCategory(
|
||||
id='test_category_2',
|
||||
display_name='Test Category 2',
|
||||
display_order=2
|
||||
)
|
||||
category_model_3 = WorkflowSpecCategoryModel(
|
||||
id=3,
|
||||
category_model_3 = WorkflowSpecCategory(
|
||||
id='test_category_3',
|
||||
display_name='Test Category 3',
|
||||
display_order=3
|
||||
)
|
||||
session.add(category_model_1)
|
||||
session.add(category_model_2)
|
||||
session.add(category_model_3)
|
||||
session.commit()
|
||||
WorkflowSpecService().add_category(category_model_1)
|
||||
WorkflowSpecService().add_category(category_model_2)
|
||||
WorkflowSpecService().add_category(category_model_3)
|
||||
|
||||
def test_initial_order(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
initial_order = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
self.assertEqual(1, initial_order[0].id)
|
||||
self.assertEqual(2, initial_order[1].id)
|
||||
self.assertEqual(3, initial_order[2].id)
|
||||
categories = WorkflowSpecService().get_categories()
|
||||
categories.sort(key=lambda w: w.display_order)
|
||||
self.assertEqual('test_category_1', categories[0].id)
|
||||
self.assertEqual('test_category_2', categories[1].id)
|
||||
self.assertEqual('test_category_3', categories[2].id)
|
||||
|
||||
def test_workflow_spec_category_reorder_up(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
|
||||
# Move category 2 up
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/2/reorder?direction=up",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_2/reorder?direction=up",
|
||||
headers=self.logged_in_headers())
|
||||
self.assert_success(rv)
|
||||
# Make sure category 2 is in position 1 now
|
||||
self.assertEqual(2, rv.json[0]['id'])
|
||||
self.assertEqual('test_category_2', rv.json[0]['id'])
|
||||
|
||||
ordered = session.query(WorkflowSpecCategoryModel).\
|
||||
order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
self.assertEqual(2, ordered[0].id)
|
||||
categories = WorkflowSpecService().get_categories()
|
||||
categories.sort(key=lambda w: w.display_order)
|
||||
self.assertEqual('test_category_2', categories[0].id)
|
||||
|
||||
def test_workflow_spec_category_reorder_down(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
|
||||
# Move category 2 down
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/2/reorder?direction=down",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_2/reorder?direction=down",
|
||||
headers=self.logged_in_headers())
|
||||
|
||||
# Make sure category 2 is in position 3 now
|
||||
self.assertEqual(2, rv.json[2]['id'])
|
||||
self.assertEqual('test_category_2', rv.json[2]['id'])
|
||||
|
||||
ordered = session.query(WorkflowSpecCategoryModel). \
|
||||
order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
self.assertEqual(2, ordered[2].id)
|
||||
categories = WorkflowSpecService().get_categories()
|
||||
categories.sort(key=lambda w: w.display_order)
|
||||
self.assertEqual('test_category_2', categories[2].id)
|
||||
|
||||
def test_workflow_spec_category_reorder_bad_direction(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/2/reorder?direction=asdf",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_2/reorder?direction=asdf",
|
||||
headers=self.logged_in_headers())
|
||||
self.assertEqual('bad_direction', rv.json['code'])
|
||||
self.assertEqual('The direction must be `up` or `down`.', rv.json['message'])
|
||||
|
||||
def test_workflow_spec_category_reorder_bad_category_id(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
|
||||
# with self.assertRaises(ApiError):
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/10/reorder?direction=down",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_10/reorder?direction=down",
|
||||
headers=self.logged_in_headers())
|
||||
self.assertEqual('bad_category_id', rv.json['code'])
|
||||
self.assertEqual('The category id 10 did not return a Workflow Spec Category. Make sure it is a valid ID.', rv.json['message'])
|
||||
self.assertEqual('The category id test_category_10 did not return a Workflow Spec Category. Make sure it is a valid ID.', rv.json['message'])
|
||||
|
||||
def test_workflow_spec_category_down_too_far(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
ordered = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
categories = WorkflowSpecService().get_categories()
|
||||
categories.sort(key=lambda w: w.display_order)
|
||||
|
||||
# Try to move 3 down
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/3/reorder?direction=down",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_3/reorder?direction=down",
|
||||
headers=self.logged_in_headers())
|
||||
# Make sure we don't get an error
|
||||
self.assert_success(rv)
|
||||
|
||||
# Make sure we get the original list back.
|
||||
reordered = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
self.assertEqual(ordered, reordered)
|
||||
new_categories = WorkflowSpecService().get_categories()
|
||||
new_categories.sort(key=lambda w: w.display_order)
|
||||
|
||||
self.assertEqual(categories[0].id, new_categories[0].id)
|
||||
self.assertEqual(categories[1].id, new_categories[1].id)
|
||||
self.assertEqual(categories[2].id, new_categories[2].id)
|
||||
|
||||
def test_workflow_spec_category_up_too_far(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
ordered = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
|
||||
categories = WorkflowSpecService().get_categories()
|
||||
categories.sort(key=lambda w: w.display_order)
|
||||
|
||||
# Try to move 1 up
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/1/reorder?direction=up",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_1/reorder?direction=up",
|
||||
headers=self.logged_in_headers())
|
||||
# Make sure we don't get an error
|
||||
self.assert_success(rv)
|
||||
|
||||
# Make sure we get the original list back.
|
||||
reordered = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
self.assertEqual(ordered, reordered)
|
||||
new_categories = WorkflowSpecService().get_categories()
|
||||
new_categories.sort(key=lambda w: w.display_order)
|
||||
|
||||
self.assertEqual(categories[0].id, new_categories[0].id)
|
||||
self.assertEqual(categories[1].id, new_categories[1].id)
|
||||
self.assertEqual(categories[2].id, new_categories[2].id)
|
||||
|
||||
def test_workflow_spec_category_bad_order(self):
|
||||
self.load_example_data()
|
||||
self._load_test_categories()
|
||||
ordered = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
workflow_spec_service = WorkflowSpecService()
|
||||
|
||||
categories = workflow_spec_service.get_categories()
|
||||
categories.sort(key=lambda w: w.display_order)
|
||||
# Create bad display_orders
|
||||
# 3 of them have 1 as their display_order
|
||||
wf_spec_category_model = ordered[0]
|
||||
wf_spec_category_model.display_order = 1
|
||||
session.add(wf_spec_category_model)
|
||||
wf_spec_category_model = ordered[1]
|
||||
wf_spec_category_model.display_order = 1
|
||||
session.add(wf_spec_category_model)
|
||||
wf_spec_category_model = ordered[2]
|
||||
wf_spec_category_model.display_order = 1
|
||||
session.add(wf_spec_category_model)
|
||||
session.commit()
|
||||
wf_spec_category = categories[0]
|
||||
wf_spec_category.display_order = 1
|
||||
workflow_spec_service.update_category(wf_spec_category)
|
||||
|
||||
bad_ordered = session.query(WorkflowSpecCategoryModel).order_by(WorkflowSpecCategoryModel.display_order).all()
|
||||
# Confirm the bad display_orders
|
||||
self.assertEqual('Test Category 1', bad_ordered[0].display_name)
|
||||
self.assertEqual(1, bad_ordered[0].display_order)
|
||||
self.assertEqual('Test Category 2', bad_ordered[1].display_name)
|
||||
self.assertEqual(1, bad_ordered[1].display_order)
|
||||
self.assertEqual('Test Category 3', bad_ordered[2].display_name)
|
||||
self.assertEqual(1, bad_ordered[2].display_order)
|
||||
wf_spec_category = categories[1]
|
||||
wf_spec_category.display_order = 1
|
||||
workflow_spec_service.update_category(wf_spec_category)
|
||||
|
||||
wf_spec_category = categories[2]
|
||||
wf_spec_category.display_order = 1
|
||||
workflow_spec_service.update_category(wf_spec_category)
|
||||
|
||||
new_categories = WorkflowSpecService().get_categories()
|
||||
new_categories.sort(key=lambda w: w.display_order)
|
||||
|
||||
# Confirm the bad display_orders (They all have 1 as display_order)
|
||||
self.assertEqual('Test Category 3', new_categories[0].display_name)
|
||||
self.assertEqual(1, new_categories[0].display_order)
|
||||
self.assertEqual('Test Category 2', new_categories[1].display_name)
|
||||
self.assertEqual(1, new_categories[1].display_order)
|
||||
self.assertEqual('Test Category 1', new_categories[2].display_name)
|
||||
self.assertEqual(1, new_categories[2].display_order)
|
||||
|
||||
# Reorder 1 up
|
||||
# This should cause a cleanup of the display_orders
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/1/reorder?direction=up",
|
||||
rv = self.app.put(f"/v1.0/workflow-specification-category/test_category_1/reorder?direction=up",
|
||||
headers=self.logged_in_headers())
|
||||
self.assertEqual('Test Category 1', rv.json[0]['display_name'])
|
||||
self.assertEqual(0, rv.json[0]['display_order'])
|
||||
self.assertEqual('Test Category 2', rv.json[1]['display_name'])
|
||||
self.assertEqual(1, rv.json[1]['display_order'])
|
||||
self.assertEqual('Test Category 3', rv.json[2]['display_name'])
|
||||
self.assertEqual(2, rv.json[2]['display_order'])
|
||||
json_data = json.loads(rv.get_data(as_text=True))
|
||||
self.assertEqual('Test Category 3', json_data[0]['display_name'])
|
||||
self.assertEqual(0, json_data[0]['display_order'])
|
||||
self.assertEqual('Test Category 1', json_data[1]['display_name'])
|
||||
self.assertEqual(1, json_data[1]['display_order'])
|
||||
self.assertEqual('Test Category 2', json_data[2]['display_name'])
|
||||
self.assertEqual(2, json_data[2]['display_order'])
|
||||
|
|
Loading…
Reference in New Issue