JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как в Django определять админа, персонал, какую-то роль (которую определили в админке), как назначать свежезареганному пользователю роль?

Сразу прошу не ругаться и не кидать ссылки на https://docs.djangoproject.com/en/2.1/ref/contrib/auth/, ибо там не даются примеры простых действий, которые мне нужны и я не могу понять, что сделать чтобы получить результат.

Итак у меня есть пользователи:
  • admin - он же суперпользователь
  • personal - просто зарегистрированный пользователь с поставленной галочкой в админке напротив персонала.
  • manager - поставлена галочка персонала и добавлена роль manage (в которой разрешения на проверку заказов)
  • first, second, test, test2 ... - толпа пользователей, которым никакие права и роли не назначены (ибо я не знаю как это делать), но которые зарегистрированы не в админке, а в интернет-магазине при оформлении заказов и каждый из них может логиниться и каждый может заходить в свой ЛК


Да и вообще все перечисленные выше пользователи могут логиниться, оформлять заказы и заходить в свой ЛК.

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

Что собственно мне нужно? А нужно в фале views.py простую вещь:

# если авторизован, то
    if request.user.is_authenticated:
         if это_суперпользователь:
                # загружаем админку-кабинет суперпользователя (тот который я сам сделал)
                # ...
          elif это_персонал без ролей:
                # загружаем админку-кабинет персонала (другой, но тот который я сам сделал) без каких-либо спец.разрешений
                # ...
          elif это_персонал с ролью manage:
                # загружаем админку-кабинет менеджера (другой, но тот который я сам сделал)
                # ...
          else: 
                # загружаем админку-кабинет простых пользователей (другой, но тот который я сам сделал)
                # ...  кстати это (надеюсь просто через подготовку данных и 
                # return HttpResponseRedirect(reverse('account'))   
                #  и объяснять мне не надо. Мне нужны именно что писать в If-ах?


Ну почему вот в такой простой доступной и понятной форме нельзя это написать в документации? Ребята ну помогите пожалуйста. Устал уже читать и смотреть кучу несвязанных отрывков.

И если не сложно, скажите что добавить в registration_view, чтобы назначить свежерегистрирующемуся определённую роль. Сейчас там так:
def registration_view(request):
    form = RegistrationForm(request.POST or None)

    if form.is_valid():
        new_user = form.save(commit=False)
        new_user.username = form.cleaned_data['username']
        new_user.set_password(form.cleaned_data['password']) 
        new_user.email = form.cleaned_data['email']
        new_user.first_name = form.cleaned_data['first_name']
        new_user.last_name = form.cleaned_data['last_name']
        new_user.save()

        login_user = authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password'])

        if login_user:
            login(request, login_user)
            return HttpResponseRedirect(reverse('account'))


    context = {
        'form': form,
    }
    return render(request, 'registration.html', context)
  • Вопрос задан
  • 10861 просмотр
Решения вопроса 1
JawsIk
@JawsIk Автор вопроса
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
Итак, как было в теме, я задавал два вопроса. Отвечу на них по порядку, чтобы людям сразу наглядно было понятно что сделать, чтобы получить результат. Очень меня печалит документация по Django. Вроде бы всё есть, но в итоге нет примеров. А как сказал мой один хороший учитель (не по Django а вообще по программированию): "Документация без примеров кода, это просто справочник. И если ты не специалист, то грош цена такому справочнику". Поэтому я просто приведу два примера кода, после которого сразу всё станет ясно.

Вопрос 1: Опознавание ролей (групп) программно.
В примере будет показан программный код метода account_view из файла views.py, который будет опознавать разные группы пользователей. Для примера в админке была создана группа manager. Ей не были даны специальные разрешения (permissions) и она служит лишь для декоративного разделения, но в программном коде даже такое декоративное разделение позволяет прекрасно опознавать и распределять пользователей. Так же прошу не обращать на функционал корзинки, здесь он оставлен только для того, чтобы показать на какой стадии нужно вставлять условия. Так же нужно понимать, что в каждом условии кроме имени шаблона могут быть (при необходимости) добавлены свои параметры, которые потом можно передать в шаблон.
def account_view(request):

    cart = Cart()
    cart_id = cart.get_cart_id(request)
    items_in_cart = CartItems.objects.filter(cart_id=cart_id)

    # если не опознан, то дуй на страницу регистрирации
    if not request.user.is_authenticated:
        return HttpResponseRedirect(reverse('registration'))

    # если это суперпользователь
    if request.user.is_superuser:
        template = 'account_admin.html'
    # или если это пользователь с галочкой персонал, а так же принадлежащий группе manager
    elif request.user.is_staff and request.user.groups.filter(name='manager').exists():
        template = 'account_personal_role.html'
    # или если это просто пользователь с галочкой персонал
    elif request.user.is_staff:
        template = 'account_personal.html'
    # или если это пользователь принадлежащий группе manager
    elif request.user.groups.filter(name='manager').exists():
        template = 'account_role.html'
    # иначе все остальные (обычные пользователи)
    else:
        template = 'account.html'

    # сортировка выдачи заказов в обратном порядке (от последнего к первому)    
    list_orders = Order.objects.filter(user=request.user).order_by('-id')
    orders = OrderItems.add_order_info(request, list_orders)

    context = {
        'title': 'Кабинет пользователя',
        'orders': orders,
        'cart': items_in_cart,
        'total_cost': cart_id.total_cost,
    }
    return render(request, template, context=context)

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

Вопрос 2: Программное добавление пользователей в группу (или в несколько сразу)
Иногда бывает, что (например) при регистрации, нужно сразу добавить пользователя в определённую группу. Для примера была создана группа clients. Это чисто декоративное разделение. Группа не имеет никаких разрешений в админке, но выполняет свою задачу. Ниже представлен код метода registration_view из файла views.py , т.е. регистрации пользователя и этот новый пользователь после регистрации будет уже принадлежать группе clients. Кстати, чтобы код работал нужно выполнить необходимый импорт, это тоже в коде показано.
...
from django.contrib.auth.models import Group
...

def registration_view(request):

    # (предотвращаем заход по прямой ссылке)
    # если авторизован, то
    if request.user.is_authenticated:
        return HttpResponseRedirect(reverse('account'))

    form = RegistrationForm(request.POST or None)
    if form.is_valid():
        new_user = form.save(commit=False)
        new_user.username = form.cleaned_data['username']
        new_user.set_password(form.cleaned_data['password'])  # вот из-за этой бяки вся засада была у меня с паролями ЗАПОМНИ!!!!!!
        new_user.email = form.cleaned_data['email']
        new_user.first_name = form.cleaned_data['first_name']
        new_user.last_name = form.cleaned_data['last_name']
        new_user.save()

        # после собственно регистрации (сохранения нового) пользователя его можно добавить к группам
        new_user.groups.add(Group.objects.get(name='clients'))
	# new_user.groups.add(Group.objects.get(name='manager'))  # и в ещё одну группу работает тоже

        login_user = authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password'])
        if login_user:
            login(request, login_user)
            return HttpResponseRedirect(reverse('account'))

    context = {
        'title': 'Регистрация',
        'form': form,
    }
    return render(request, 'registration.html', context)

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

Надеюсь код пригодиться людям.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Konstantin18ko
@Konstantin18ko
Стоматолог
Короче, django по default создаёт ещё таблицы permissions и groups.
Так же есть таблицы user_permissions, user_groups.
Ищите как их можно настроить.

get_group_permissions(obj=None)¶
Возвращает множество строк представляющие права пользователя добавленные с помощью групп.

Добавлено в Django 1.2.
Если указан obj, возвращает права только для указанного объекта.

get_all_permissions(obj=None)
Возвращает множество строк представляющие все права пользователя, с учетом групп.

Добавлено в Django 1.2.
Если указан obj, возвращает права только для указанного объекта.

request.user.get_all_permissions вроде так
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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