Merge "Team and project groups delete methods"
This commit is contained in:
commit
eb871df4ba
@ -14,6 +14,7 @@
|
||||
# limitations under the License.
|
||||
|
||||
from oslo.config import cfg
|
||||
from pecan import abort
|
||||
from pecan import response
|
||||
from pecan import rest
|
||||
from pecan.secure import secure
|
||||
@ -23,6 +24,7 @@ import wsmeext.pecan as wsme_pecan
|
||||
import storyboard.api.auth.authorization_checks as checks
|
||||
from storyboard.api.v1 import validations
|
||||
from storyboard.api.v1 import wmodels
|
||||
import storyboard.common.exception as exc
|
||||
from storyboard.db.api import project_groups
|
||||
from storyboard.db.api import projects
|
||||
from storyboard.openstack.common.gettextutils import _ # noqa
|
||||
@ -169,13 +171,18 @@ class ProjectGroupsController(rest.RestController):
|
||||
return wmodels.ProjectGroup.from_db_model(updated_group)
|
||||
|
||||
@secure(checks.superuser)
|
||||
@wsme_pecan.wsexpose(wmodels.ProjectGroup, int)
|
||||
@wsme_pecan.wsexpose(None, int)
|
||||
def delete(self, project_group_id):
|
||||
"""Delete this project group.
|
||||
|
||||
:param project_group_id: An ID of the project group.
|
||||
"""
|
||||
project_groups.project_group_delete(project_group_id)
|
||||
try:
|
||||
project_groups.project_group_delete(project_group_id)
|
||||
except exc.NotFound as not_found_exc:
|
||||
abort(404, not_found_exc.message)
|
||||
except exc.NotEmpty as not_empty_exc:
|
||||
abort(400, not_empty_exc.message)
|
||||
|
||||
response.status_code = 204
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
# limitations under the License.
|
||||
|
||||
from oslo.config import cfg
|
||||
from pecan import abort
|
||||
from pecan.decorators import expose
|
||||
from pecan import response
|
||||
from pecan import rest
|
||||
@ -24,6 +25,7 @@ import wsmeext.pecan as wsme_pecan
|
||||
from storyboard.api.auth import authorization_checks as checks
|
||||
from storyboard.api.v1 import validations
|
||||
from storyboard.api.v1 import wmodels
|
||||
from storyboard.common import exception as exc
|
||||
from storyboard.db.api import teams as teams_api
|
||||
from storyboard.db.api import users as users_api
|
||||
from storyboard.openstack.common.gettextutils import _ # noqas
|
||||
@ -200,3 +202,19 @@ class TeamsController(rest.RestController):
|
||||
|
||||
# Use default routing for all other requests
|
||||
return super(TeamsController, self)._route(args, request)
|
||||
|
||||
@secure(checks.superuser)
|
||||
@wsme_pecan.wsexpose(None, int)
|
||||
def delete(self, team_id):
|
||||
"""Delete this team.
|
||||
|
||||
:param team_id: An ID of the team.
|
||||
"""
|
||||
try:
|
||||
teams_api.team_delete(team_id)
|
||||
except exc.NotFound as not_found_exc:
|
||||
abort(404, not_found_exc.message)
|
||||
except exc.NotEmpty as not_empty_exc:
|
||||
abort(400, not_empty_exc.message)
|
||||
|
||||
response.status_code = 204
|
||||
|
@ -46,3 +46,11 @@ class DuplicateEntry(StoryboardException):
|
||||
def __init__(self, message=None):
|
||||
if message:
|
||||
self.message = message
|
||||
|
||||
|
||||
class NotEmpty(StoryboardException):
|
||||
message = _("Database object must be empty")
|
||||
|
||||
def __init__(self, message=None):
|
||||
if message:
|
||||
self.message = message
|
||||
|
@ -120,5 +120,10 @@ def project_group_delete_project(project_group_id, project_id):
|
||||
def project_group_delete(project_group_id):
|
||||
project_group = project_group_get(project_group_id)
|
||||
|
||||
if project_group:
|
||||
api_base.entity_hard_delete(models.ProjectGroup, project_group_id)
|
||||
if not project_group:
|
||||
raise exc.NotFound(_('Project group not found.'))
|
||||
|
||||
if len(project_group.projects) > 0:
|
||||
raise exc.NotEmpty(_('Project group must be empty.'))
|
||||
|
||||
api_base.entity_hard_delete(models.ProjectGroup, project_group_id)
|
||||
|
@ -105,3 +105,15 @@ def team_delete_user(team_id, user_id):
|
||||
session.add(team)
|
||||
|
||||
return team
|
||||
|
||||
|
||||
def team_delete(team_id):
|
||||
team = team_get(team_id)
|
||||
|
||||
if not team:
|
||||
raise exc.NotFound(_('Team not found.'))
|
||||
|
||||
if len(team.users) > 0:
|
||||
raise exc.NotEmpty(_('Team must be empty.'))
|
||||
|
||||
api_base.entity_hard_delete(models.Team, team_id)
|
||||
|
@ -99,6 +99,36 @@ class TestProjectGroups(base.FunctionalTest):
|
||||
# check for a too short name
|
||||
self.assertRaises(AppError, self.put_json, url, delta)
|
||||
|
||||
def test_delete_invalid(self):
|
||||
# try to delete project group with projects
|
||||
# she can't be deleted, because
|
||||
# only empty project groups can be deleted
|
||||
|
||||
response = self.delete(self.resource + '/2', expect_errors=True)
|
||||
self.assertEqual(400, response.status_code)
|
||||
|
||||
def test_delete(self):
|
||||
# create new empty project group with name 'testProjectGroup'
|
||||
response = self.post_json(self.resource,
|
||||
{'name': 'testProjectGroup',
|
||||
'title': 'testProjectGroupTitle'})
|
||||
body = json.loads(response.body)
|
||||
self.assertEqual('testProjectGroup', body['name'])
|
||||
self.assertEqual('testProjectGroupTitle', body['title'])
|
||||
|
||||
# delete project group with name 'testProjectGroup'
|
||||
# project group with name 'testProjectGroup' can be deleted, because
|
||||
# she is empty
|
||||
# only empty project groups can be deleted
|
||||
resource = (self.resource + '/%d') % body['id']
|
||||
response = self.delete(resource)
|
||||
self.assertEqual(204, response.status_code)
|
||||
|
||||
# check that project group with name 'testProjectGroup'
|
||||
# doesn't exist now
|
||||
response = self.get_json(resource, expect_errors=True)
|
||||
self.assertEqual(404, response.status_code)
|
||||
|
||||
|
||||
class TestProjectGroupSearch(base.FunctionalTest):
|
||||
def setUp(self):
|
||||
|
58
storyboard/tests/api/test_teams.py
Normal file
58
storyboard/tests/api/test_teams.py
Normal file
@ -0,0 +1,58 @@
|
||||
# Copyright (c) 2014 Mirantis Inc.
|
||||
#
|
||||
# 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.
|
||||
|
||||
import json
|
||||
|
||||
from storyboard.tests import base
|
||||
|
||||
|
||||
class TestTeams(base.FunctionalTest):
|
||||
def setUp(self):
|
||||
super(TestTeams, self).setUp()
|
||||
self.resource = '/teams'
|
||||
self.default_headers['Authorization'] = 'Bearer valid_superuser_token'
|
||||
|
||||
def test_delete_invalid(self):
|
||||
# create new empty team with name 'testTeam'
|
||||
response = self.post_json(self.resource, {'name': 'testTeam'})
|
||||
body = json.loads(response.body)
|
||||
self.assertEqual('testTeam', body['name'])
|
||||
|
||||
# add user with id = 2 to team with name 'testTeam'
|
||||
resource = (self.resource + '/%d') % body['id']
|
||||
response = self.put_json(resource + '/users', {'user_id': '2'})
|
||||
self.assertEqual(200, response.status_code)
|
||||
|
||||
# try to delete team with name 'testTeam'
|
||||
# team with name 'testTeam' can't be deleted, because she isn't empty
|
||||
# only empty teams can be deleted
|
||||
response = self.delete(resource, expect_errors=True)
|
||||
self.assertEqual(400, response.status_code)
|
||||
|
||||
def test_delete(self):
|
||||
# create new team with name 'testTeam'
|
||||
response = self.post_json(self.resource, {'name': 'testTeam'})
|
||||
body = json.loads(response.body)
|
||||
self.assertEqual('testTeam', body['name'])
|
||||
resource = (self.resource + '/%d') % body['id']
|
||||
|
||||
# delete team with name 'testTeam'
|
||||
# team with name 'testTeam' can be deleted, because she is empty
|
||||
# only empty teams can be deleted
|
||||
response = self.delete(resource)
|
||||
self.assertEqual(204, response.status_code)
|
||||
|
||||
# check that team with name 'testTeam' doesn't exist now
|
||||
response = self.get_json(resource, expect_errors=True)
|
||||
self.assertEqual(404, response.status_code)
|
Loading…
Reference in New Issue
Block a user