@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


Возможно, что мое решение является правильным, но я все-таки хотел бы лучшим образом реализовать такую систему.
  • Вопрос задан
  • 65 просмотров
Решения вопроса 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

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

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

Похожие вопросы