Приложение Django для "включения" других приложений для конкретного пользователя

Я новичок в django, и мне очень нравится его модульная конструкция, поэтому я решил воспользоваться этим и поместить все отдельные функции в разные приложения.

Теперь мне нужен способ включать и выключать эти приложения как пользователем, так и администратором. Панель параметров пользователя будет выглядеть так:


   [] блог
   ---------------------
   [ ] пометка [купить]

После проверки опции "блог" пользователь получит блог в своем профиле, а после покупки и проверки "пометки" он получит метки для блога.


Панель администратора будет иметь возможность показать или скрыть приложение из пользовательской панели.

Интересно, если:

  1. есть приложение, которое поможет мне включить и выключить приложение для конкретного пользователя
  2. а если нет -
    1. Какая будет правильная "архитектура" для такого приложения django?
    2. Это можно сделать динамически в промежуточном программном обеспечении или во время входа в систему (проверить доступные приложения из базы данных, включить их, перенаправить на домашнюю страницу пользователя)?
    3. Какие-нибудь советы для такой задачи?

Спасибо роберт

1 ответ

Решение

Я не слышал ни о каком таком приложении... Но я не ожидаю, что его будет слишком сложно построить.

Если бы я делал это, я бы поставил проверку прав доступа в точках входа для каждого приложения. Например:

check_app_permission = lambda request: permissions.check_app_permission("blog", request)

def view_blog(request, …):
    check_app_permission(request)
    …

(может даже быть возможно сделать немного магии и ввести эту проверку на urls.py уровень...)

Кроме того, я бы создал has_app_permission тег шаблона:

<div id="sidebar">
    {% if has_app_permission "blog" %}
        {% include "blog/sidebar_recent_posts.html" %}
    {% endif %}
</div>

Или похожие.

Наконец, есть приблизительно миллион способов, которыми вы могли бы внедрить систему разрешений... И без дополнительной информации я не смог бы прокомментировать. Самым простым, однако, было бы что-то вроде этого:

class App(Model):
    name = CharField(…)

class AppPermission(object):
    app = ForeignKey(App)
    user = ForiegnKey(User)

def user_has_permission(user, app_name):
    return AppPermission.objects.filter(app__name=app_name, user=user).exists()

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

Это помогает? Есть что-то, что я могу уточнить?

Другие вопросы по тегам