mirror of
https://github.com/GSA/notifications-api.git
synced 2026-07-29 04:09:36 -04:00
dao was deleting all permissions for that user (regardless of service id) as the last filter on the permissions dao get_query method won. I've added a replace flag to the set_user_service_permission method so that it can handle adding new users + permissions and editing of existing users' permissions. Also by pass the get_query method until it can be refactored to work correctly. For now execute the filter query directly on the model.
87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
from app import db
|
|
from werkzeug.datastructures import MultiDict
|
|
from app.dao import DAOClass
|
|
from app.models import (
|
|
Permission,
|
|
Service,
|
|
User,
|
|
MANAGE_USERS,
|
|
MANAGE_TEMPLATES,
|
|
MANAGE_SETTINGS,
|
|
SEND_TEXTS,
|
|
SEND_EMAILS,
|
|
SEND_LETTERS,
|
|
MANAGE_API_KEYS,
|
|
VIEW_ACTIVITY)
|
|
|
|
|
|
# Default permissions for a service
|
|
default_service_permissions = [
|
|
MANAGE_USERS,
|
|
MANAGE_TEMPLATES,
|
|
MANAGE_SETTINGS,
|
|
SEND_TEXTS,
|
|
SEND_EMAILS,
|
|
SEND_LETTERS,
|
|
MANAGE_API_KEYS,
|
|
VIEW_ACTIVITY]
|
|
|
|
|
|
class PermissionDAO(DAOClass):
|
|
|
|
class Meta:
|
|
model = Permission
|
|
|
|
# TODO rework this as last filter wins, whereas what is needed is
|
|
# append to filter so that semantics are 'and'
|
|
def get_query(self, filter_by_dict=None):
|
|
if filter_by_dict is None:
|
|
filter_by_dict = MultiDict()
|
|
else:
|
|
filter_by_dict = MultiDict(filter_by_dict)
|
|
query = self.Meta.model.query
|
|
if 'id' in filter_by_dict:
|
|
query = query.filter(Permission.id.in_(filter_by_dict.getlist('id')))
|
|
if 'service' in filter_by_dict:
|
|
service_ids = filter_by_dict.getlist('service')
|
|
if len(service_ids) == 1:
|
|
query.filter_by(service=Service.query.get(service_ids[0]))
|
|
# TODO the join method for multiple services
|
|
if 'user' in filter_by_dict:
|
|
user_ids = filter_by_dict.getlist('user')
|
|
if len(user_ids) == 1:
|
|
query = query.filter_by(user=User.query.get(user_ids[0]))
|
|
# TODO the join method for multiple users
|
|
if 'permission' in filter_by_dict:
|
|
query = query.filter(Permission.permission.in_(filter_by_dict.getlist('permission')))
|
|
return query
|
|
|
|
def add_default_service_permissions_for_user(self, user, service):
|
|
for name in default_service_permissions:
|
|
permission = Permission(permission=name, user=user, service=service)
|
|
self.create_instance(permission, _commit=False)
|
|
|
|
def remove_user_service_permissions(self, user, service):
|
|
query = self.Meta.model.query.filter_by(user=user, service=service)
|
|
query.delete()
|
|
|
|
def set_user_service_permission(self, user, service, permissions, _commit=False, replace=False):
|
|
try:
|
|
if replace:
|
|
query = self.Meta.model.query.filter_by(user=user, service=service)
|
|
query.delete()
|
|
for p in permissions:
|
|
p.user = user
|
|
p.service = service
|
|
self.create_instance(p, _commit=False)
|
|
except Exception as e:
|
|
if _commit:
|
|
db.session.rollback()
|
|
raise e
|
|
else:
|
|
if _commit:
|
|
db.session.commit()
|
|
|
|
|
|
permission_dao = PermissionDAO()
|