@Mikkkch

Как реализовать систему ограничений в зависимости от плана пользователя?

О задаче:
Есть набор планов, один из которых пользователь выбирает сам. План может быть бесплатным.

В зависимости от плана на пользователя накладываются определенные ограничения. Ограничения эти связаны с количеством создаваемых объектов конкретной модели, пусть это будет модель, называющаяся Post.

Например, нам нужно ограничить количество объектов Post, создаваемых пользователем в день. Добавлю еще то, что возможность редактировать ограничения динамически - крайне необходима.

Вот как я представляю себе решение:
В отдельном приложении есть модель UserPlan, в которой указано название плана, будь то free или premium и перечислены ограничения, накладываемые на пользователя с этим планом касательно модели Post.
В этой апликухе отсутствуют вьюшки, вся логика ограничений расположена в __init__(или другом файле).
В модели юзера конечно же внешним ключом связь с UserPlan.

Из сервисов приложения, отвечающего за работу с моделью Post(вьюшки создания и т.д) подтягиваются функции из приложения с логикой ограничений.

Пример:
def check_can_user_create_post_now(user):
    if Post.objects.filter(created_at=today).count() == user.plan.posts_number_per_day:
        return False


Возможно, что мое решение является правильным, но я все-таки хотел бы лучшим образом реализовать такую систему.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
AlexNest
@AlexNest
Работаю с Python/Django
В отдельном приложении есть модель UserPlan

На мой взгляд выносить в отдельное приложение имеет смысл всю логику работы с пользователем (авторизация/регистрация/модели).
логика ограничений расположена в __init__(или другом файле).

middleware в помощь.
def check_can_user_create_post_now(user):
    if Post.objects.filter(created_at=today).count() == user.plan.posts_number_per_day:
        return False

Конкретно в таком виде код поломает всю логику, поскольку идет выборка из постов всех пользователей.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы