Права доступа

Что нужно сделать

На вас возложили задачу по созданию и поддержке специализированного сайта-форума. Вы только начали выполнять задачу и сейчас остановились на реализации действий, которые могут совершать посетители форума. И конечно же, для разных пользователей прописаны разные возможности.

Напишите декоратор check_permission, который проверяет, есть ли у пользователя доступ к вызываемой функции, и если нет, то выдаёт исключение PermissionError.

Пример кода:

user_permissions = ['admin']

@check_permission('admin')
def delete_site():
    print('Удаляем сайт')

@check_permission('user_1')
def add_comment():
    print('Добавляем комментарий')


delete_site()
add_comment()

Результат:

Удаляем сайт
PermissionError: У пользователя недостаточно прав, чтобы выполнить функцию add_comment

Что оценивается

  • Результат вычислений корректен.
  • Формат вывода соответствует примеру.
  • Переменные, функции и собственные методы классов имеют значащие имена, не abcd.
  • Классы и методы/функции имеют прописанную документацию.
  • Есть аннотация типов для методов/функций и их аргументов (кроме args и kwargs). Если функция/метод ничего не возвращают, то используется None.
user_permissions = ['admin']

def check_permission(username: str):
    '''Функция для передачи аргумента декоратору'''
    def check_permission_decorator(function):
        '''Декоратор для проверки доступа к вызываемой функции'''
        def inner():
            try:
                if username not in user_permissions:
                    raise PermissionError(f'У пользователя недостаточно прав, чтобы выполнить функцию {function.__name__}')
                else:
                    result = function()
                    return result
            except PermissionError as exc:
                print(f'PermissionError: {exc}')
        return inner
    return check_permission_decorator


@check_permission('admin')
def delete_site():
    print('Удаляем сайт')

@check_permission('user_1')
def add_comment():
    print('Добавляем комментарий')


delete_site()
add_comment()