Приложение Django для "включения" других приложений для конкретного пользователя
Я новичок в django, и мне очень нравится его модульная конструкция, поэтому я решил воспользоваться этим и поместить все отдельные функции в разные приложения.
Теперь мне нужен способ включать и выключать эти приложения как пользователем, так и администратором. Панель параметров пользователя будет выглядеть так:
[] блог --------------------- [ ] пометка [купить]
После проверки опции "блог" пользователь получит блог в своем профиле, а после покупки и проверки "пометки" он получит метки для блога.
Панель администратора будет иметь возможность показать или скрыть приложение из пользовательской панели.
Интересно, если:
- есть приложение, которое поможет мне включить и выключить приложение для конкретного пользователя
- а если нет -
- Какая будет правильная "архитектура" для такого приложения django?
- Это можно сделать динамически в промежуточном программном обеспечении или во время входа в систему (проверить доступные приложения из базы данных, включить их, перенаправить на домашнюю страницу пользователя)?
- Какие-нибудь советы для такой задачи?
Спасибо роберт
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()
Я бы не пытался делать это с промежуточным программным обеспечением, потому что, если я правильно понимаю проблему, я ожидаю, что вы (или, по крайней мере, я ожидаю, что я) буду в конечном итоге тратить кучу времени на создание общей структуры, которая, в конце концов, будет просто иметь чеки, похожие на те, что выше.
Это помогает? Есть что-то, что я могу уточнить?