mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-17 02:32:32 -05:00
Set user permissions when creating a folder
If the new folder has a parent folder, it inherits user permissions from its parent. Else if the new folder is at root level, all users will have a permission to view it.
This commit is contained in:
@@ -1,13 +1,22 @@
|
|||||||
|
|
||||||
from app import db
|
from app import db
|
||||||
from app.dao.dao_utils import transactional
|
from app.dao.dao_utils import transactional
|
||||||
from app.models import ServiceUser
|
from app.models import ServiceUser, User
|
||||||
|
|
||||||
|
|
||||||
def dao_get_service_user(user_id, service_id):
|
def dao_get_service_user(user_id, service_id):
|
||||||
return ServiceUser.query.filter_by(user_id=user_id, service_id=service_id).one()
|
return ServiceUser.query.filter_by(user_id=user_id, service_id=service_id).one()
|
||||||
|
|
||||||
|
|
||||||
|
def dao_get_active_service_users(service_id):
|
||||||
|
query = ServiceUser.query.join(ServiceUser.user).filter(
|
||||||
|
ServiceUser.service_id == service_id,
|
||||||
|
User.state == 'active'
|
||||||
|
)
|
||||||
|
|
||||||
|
return query.all()
|
||||||
|
|
||||||
|
|
||||||
@transactional
|
@transactional
|
||||||
def dao_update_service_user(service_user):
|
def dao_update_service_user(service_user):
|
||||||
db.session.add(service_user)
|
db.session.add(service_user)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from app.dao.template_folder_dao import (
|
|||||||
dao_delete_template_folder
|
dao_delete_template_folder
|
||||||
)
|
)
|
||||||
from app.dao.services_dao import dao_fetch_service_by_id
|
from app.dao.services_dao import dao_fetch_service_by_id
|
||||||
|
from app.dao.service_user_dao import dao_get_active_service_users
|
||||||
from app.errors import InvalidRequest, register_errors
|
from app.errors import InvalidRequest, register_errors
|
||||||
from app.models import TemplateFolder
|
from app.models import TemplateFolder
|
||||||
from app.template_folder.template_folder_schema import (
|
from app.template_folder.template_folder_schema import (
|
||||||
@@ -49,17 +50,19 @@ def create_template_folder(service_id):
|
|||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
|
|
||||||
validate(data, post_create_template_folder_schema)
|
validate(data, post_create_template_folder_schema)
|
||||||
|
|
||||||
if data.get('parent_id') is not None:
|
if data.get('parent_id') is not None:
|
||||||
try:
|
try:
|
||||||
dao_get_template_folder_by_id_and_service_id(data['parent_id'], service_id)
|
parent_folder = dao_get_template_folder_by_id_and_service_id(data['parent_id'], service_id)
|
||||||
|
users_with_permission = parent_folder.users
|
||||||
except NoResultFound:
|
except NoResultFound:
|
||||||
raise InvalidRequest("parent_id not found", status_code=400)
|
raise InvalidRequest("parent_id not found", status_code=400)
|
||||||
|
else:
|
||||||
|
users_with_permission = dao_get_active_service_users(service_id)
|
||||||
template_folder = TemplateFolder(
|
template_folder = TemplateFolder(
|
||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
name=data['name'].strip(),
|
name=data['name'].strip(),
|
||||||
parent_id=data['parent_id']
|
parent_id=data['parent_id'],
|
||||||
|
users=users_with_permission,
|
||||||
)
|
)
|
||||||
|
|
||||||
dao_create_template_folder(template_folder)
|
dao_create_template_folder(template_folder)
|
||||||
|
|||||||
@@ -73,6 +73,38 @@ def test_create_template_folder(admin_request, sample_service, has_parent):
|
|||||||
assert resp['data']['parent_id'] == parent_id
|
assert resp['data']['parent_id'] == parent_id
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('has_parent', [True, False])
|
||||||
|
def test_create_template_folder_sets_user_permissions(admin_request, sample_service, has_parent):
|
||||||
|
user_1 = create_user(email='one@gov.uk')
|
||||||
|
user_2 = create_user(email='two@gov.uk')
|
||||||
|
user_3 = create_user(email='three@gov.uk', state='pending')
|
||||||
|
existing_folder = create_template_folder(sample_service)
|
||||||
|
sample_service.users = [user_1, user_2, user_3]
|
||||||
|
service_user_1 = dao_get_service_user(user_1.id, sample_service.id)
|
||||||
|
service_user_1.folders = [existing_folder]
|
||||||
|
|
||||||
|
parent_id = str(existing_folder.id) if has_parent else None
|
||||||
|
|
||||||
|
resp = admin_request.post(
|
||||||
|
'template_folder.create_template_folder',
|
||||||
|
service_id=sample_service.id,
|
||||||
|
_data={
|
||||||
|
'name': 'foo',
|
||||||
|
'parent_id': parent_id
|
||||||
|
},
|
||||||
|
_expected_status=201
|
||||||
|
)
|
||||||
|
|
||||||
|
assert resp['data']['name'] == 'foo'
|
||||||
|
assert resp['data']['service_id'] == str(sample_service.id)
|
||||||
|
assert resp['data']['parent_id'] == parent_id
|
||||||
|
|
||||||
|
if has_parent:
|
||||||
|
assert resp['data']['users_with_permission'] == [str(user_1.id)]
|
||||||
|
else:
|
||||||
|
assert resp['data']['users_with_permission'] == [str(user_1.id), str(user_2.id)]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('missing_field', ['name', 'parent_id'])
|
@pytest.mark.parametrize('missing_field', ['name', 'parent_id'])
|
||||||
def test_create_template_folder_fails_if_missing_fields(admin_request, sample_service, missing_field):
|
def test_create_template_folder_fails_if_missing_fields(admin_request, sample_service, missing_field):
|
||||||
data = {
|
data = {
|
||||||
|
|||||||
Reference in New Issue
Block a user