Reorder categories

This commit is contained in:
mike cullerton 2022-02-09 10:55:02 -05:00
parent b2824286f0
commit 9576089e84
4 changed files with 88 additions and 76 deletions

View File

@ -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.')

View File

@ -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:

View File

@ -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:

View File

@ -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'])