async def unset_roles_image_data(db_name: str, task_name: Union[str, None], permissions: Union[str, List[str]], user: UserDB): if isinstance(permissions, str): permissions = [permissions] for permission in permissions: assert permission in [ 'can_get', 'can_edit', 'can_edit_protected', 'can_add', 'can_delete' ], "Unknown permission" roles_image_data = user.roles_image_data.get(db_name, {}) if len(roles_image_data) > 0: if task_name is not None: task_names = [task_name] else: task_names = roles_image_data.keys() for task_name in task_names: task_roles = roles_image_data.get(task_name, None) if task_roles is not None: task_roles = remove_from_list(task_roles, permission) if len(task_roles) > 0: user.roles_image_data[db_name][task_name] = task_roles else: user.roles_image_data[db_name].pop(task_name, None) roles_image_data = user.roles_image_data.get(db_name, {}) if len(roles_image_data) == 0: user.roles_image_data.pop(db_name, None) updated_user = await user_db.update(user) return updated_user
async def delete_task(db_name: str, task_name: str) -> bool: """ :param db_name: :param task_name: :return: """ assert task_name not in system_task_names, "Can't delete task with this name" assert db_name not in system_db_names, "Can't add db with system name" db_names = await get_dbs() assert db_name in db_names, "DB not exist" data_db = client[db_name] task_names = await data_db.list_collection_names() assert task_name in task_names, "task doesn't exist" async for user in users_collection.find(): user = UserDB(**user) await unset_roles_image_data( db_name=db_name, task_name=task_name, permissions=[ 'can_get', 'can_add', 'can_edit', 'can_edit_protected', 'can_delete' ], user=user ) result = await data_db.drop_collection(task_name) if result: return True else: return False
async def delete_db(db_name: str) -> bool: """ :param db_name: :return: """ assert db_name not in system_db_names, "Can't delete system db" db_names = await get_dbs() assert db_name in db_names, "DB doesn't exist" async for user in users_collection.find(): user = UserDB(**user) await unset_roles_classes(db_name=db_name, permissions=['can_get', 'can_set'], user=user) await unset_roles_tasks(db_name=db_name, permissions=['can_add', 'can_delete'], user=user) await unset_roles_image_data( db_name=db_name, task_name=None, permissions=[ 'can_get', 'can_add', 'can_edit', 'can_edit_protected', 'can_delete' ], user=user ) result = await client.drop_database(db_name) return True
async def unset_roles_db(permissions: Union[str, List[str]], user: UserDB): if isinstance(permissions, str): permissions = [permissions] for permission in permissions: assert permission in ['can_add', 'can_delete'], "Unknown permission" user.roles_db = remove_from_list(user.roles_db, permission) updated_user = await user_db.update(user) return updated_user
async def set_roles_classes(db_name: str, permissions: Union[str, List[str]], user: UserDB): if isinstance(permissions, str): permissions = [permissions] for permission in permissions: assert permission in ['can_get', 'can_set'], "Unknown permission" user.roles_classes[db_name] = add_to_list( user.roles_classes.get(db_name, []), permission) updated_user = await user_db.update(user) return updated_user
async def _update_user( user: UserDB, update_dict: Dict[str, Any], request: Request ): #TODO: implement changing roles for field in update_dict: if field == "password": hashed_password = get_password_hash(update_dict[field]) user.hashed_password = hashed_password else: setattr(user, field, update_dict[field]) updated_user = await user_db.update(user) return updated_user
async def unset_roles_classes(db_name: str, permissions: Union[str, List[str]], user: UserDB): print(user) if isinstance(permissions, str): permissions = [permissions] for permission in permissions: assert permission in ['can_get', 'can_set'], "Unknown permission" roles_classes = remove_from_list(user.roles_classes.get(db_name, []), permission) if len(roles_classes) > 0: user.roles_classes[db_name] = roles_classes else: user.roles_classes.pop(db_name, None) updated_user = await user_db.update(user) return updated_user
async def set_roles_image_data(db_name: str, task_name: str, permissions: Union[str, List[str]], user: UserDB): if isinstance(permissions, str): permissions = [permissions] for permission in permissions: assert permission in [ 'can_get', 'can_edit', 'can_edit_protected', 'can_add', 'can_delete' ], "Unknown permission" roles_image_data = user.roles_image_data.get(db_name, {}) roles_image_data_task = add_to_list( roles_image_data.get(task_name, []), permission) roles_image_data[task_name] = roles_image_data_task user.roles_image_data[db_name] = roles_image_data updated_user = await user_db.update(user) return updated_user
async def create_first_admin() -> bool: try: session = Session() count = session.query(UserTable).filter_by(is_superuser=True).count() if count == 0: user = UserCreate(email=os.getenv('API_ADMIN_EMAIL', '*****@*****.**'), password=os.getenv('API_ADMIN_PASSWORD', 'adminpassword')) hashed_password = get_password_hash(user.password) db_user = UserDB(**user.create_update_dict(), hashed_password=hashed_password) created_user = await user_db.create(db_user) if created_user: created_user.is_superuser = True updated_user = await user_db.update(created_user) session.commit() session.close() return True except Exception as e: return False