redash/handlers/groups.py (173 lines of code) (raw):

import time from flask import request from flask_restful import abort from redash import models from redash.permissions import require_admin, require_permission from redash.handlers.base import BaseResource, get_object_or_404 class GroupListResource(BaseResource): @require_admin def post(self): name = request.json["name"] group = models.Group(name=name, org=self.current_org) models.db.session.add(group) models.db.session.commit() self.record_event( {"action": "create", "object_id": group.id, "object_type": "group"} ) return group.to_dict() def get(self): if self.current_user.has_permission("admin"): groups = models.Group.all(self.current_org) else: groups = models.Group.query.filter( models.Group.id.in_(self.current_user.group_ids) ) self.record_event( {"action": "list", "object_id": "groups", "object_type": "group"} ) return [g.to_dict() for g in groups] class GroupResource(BaseResource): @require_admin def post(self, group_id): group = models.Group.get_by_id_and_org(group_id, self.current_org) if group.type == models.Group.BUILTIN_GROUP: abort(400, message="Can't modify built-in groups.") group.name = request.json["name"] models.db.session.commit() self.record_event( {"action": "edit", "object_id": group.id, "object_type": "group"} ) return group.to_dict() def get(self, group_id): if not ( self.current_user.has_permission("admin") or int(group_id) in self.current_user.group_ids ): abort(403) group = models.Group.get_by_id_and_org(group_id, self.current_org) self.record_event( {"action": "view", "object_id": group_id, "object_type": "group"} ) return group.to_dict() @require_admin def delete(self, group_id): group = models.Group.get_by_id_and_org(group_id, self.current_org) if group.type == models.Group.BUILTIN_GROUP: abort(400, message="Can't delete built-in groups.") members = models.Group.members(group_id) for member in members: member.group_ids.remove(int(group_id)) models.db.session.add(member) models.db.session.delete(group) models.db.session.commit() class GroupMemberListResource(BaseResource): @require_admin def post(self, group_id): user_id = request.json["user_id"] user = models.User.get_by_id_and_org(user_id, self.current_org) group = models.Group.get_by_id_and_org(group_id, self.current_org) user.group_ids.append(group.id) models.db.session.commit() self.record_event( { "action": "add_member", "object_id": group.id, "object_type": "group", "member_id": user.id, } ) return user.to_dict() @require_permission("list_users") def get(self, group_id): if not ( self.current_user.has_permission("admin") or int(group_id) in self.current_user.group_ids ): abort(403) members = models.Group.members(group_id) return [m.to_dict() for m in members] class GroupMemberResource(BaseResource): @require_admin def delete(self, group_id, user_id): user = models.User.get_by_id_and_org(user_id, self.current_org) user.group_ids.remove(int(group_id)) models.db.session.commit() self.record_event( { "action": "remove_member", "object_id": group_id, "object_type": "group", "member_id": user.id, } ) def serialize_data_source_with_group(data_source, data_source_group): d = data_source.to_dict() d["view_only"] = data_source_group.view_only return d class GroupDataSourceListResource(BaseResource): @require_admin def post(self, group_id): data_source_id = request.json["data_source_id"] data_source = models.DataSource.get_by_id_and_org( data_source_id, self.current_org ) group = models.Group.get_by_id_and_org(group_id, self.current_org) data_source_group = data_source.add_group(group) models.db.session.commit() self.record_event( { "action": "add_data_source", "object_id": group_id, "object_type": "group", "member_id": data_source.id, } ) return serialize_data_source_with_group(data_source, data_source_group) @require_admin def get(self, group_id): group = get_object_or_404( models.Group.get_by_id_and_org, group_id, self.current_org ) # TOOD: move to models data_sources = models.DataSource.query.join(models.DataSourceGroup).filter( models.DataSourceGroup.group == group ) self.record_event( {"action": "list", "object_id": group_id, "object_type": "group"} ) return [ds.to_dict(with_permissions_for=group) for ds in data_sources] class GroupDataSourceResource(BaseResource): @require_admin def post(self, group_id, data_source_id): data_source = models.DataSource.get_by_id_and_org( data_source_id, self.current_org ) group = models.Group.get_by_id_and_org(group_id, self.current_org) view_only = request.json["view_only"] data_source_group = data_source.update_group_permission(group, view_only) models.db.session.commit() self.record_event( { "action": "change_data_source_permission", "object_id": group_id, "object_type": "group", "member_id": data_source.id, "view_only": view_only, } ) return serialize_data_source_with_group(data_source, data_source_group) @require_admin def delete(self, group_id, data_source_id): data_source = models.DataSource.get_by_id_and_org( data_source_id, self.current_org ) group = models.Group.get_by_id_and_org(group_id, self.current_org) data_source.remove_group(group) models.db.session.commit() self.record_event( { "action": "remove_data_source", "object_id": group_id, "object_type": "group", "member_id": data_source.id, } )