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

    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. Если её раскомментировать, то пользователь будет добавлен сразу в две группы. Т.о. можно добавлять пользователей сразу в несколько групп (если в этом есть необходимость). Естественно нужно понимать, что подобное добавление в группу можно делать не только при регистрации, но видя этот код, сделать необходимое решение уже не должно составлять большого труда.

    Надеюсь код пригодиться людям.
    Ответ написан
    Комментировать
  • Ошибка аргументоа (мешает self), что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def download(link, path, mp, self):
    Нужно задекорировать метод как классовый или сттический. Если классовый, то надо указать первым аргументом cls
    Ответ написан
    Комментировать
  • Как написать простой mp3-плеер?

    ScorpLeX
    @ScorpLeX

    Это конечно не питон и не руби, но для плеера я бы посоветовал например https://github.com/rogerwang/node-webkit

    Ответ написан
    Комментировать
  • Доброй ночи,как создать свою IDE?

    FedLapshin06
    @FedLapshin06
    C/C++, Go, Python developer
    У Вас хорошая идея, а реализовать можно всё что угодно и на всём что угодно, главное иметь желание и идею!

    Совет: Писать лучше либо на C#, либо на C++, PHP тут не поможет, разве что NodeJS Electron(JS,HTML,CSS) для GUI.
    Ну а если всё таки PHP, то предупреждаю: 1- ЦП и ОЗУ от IDE на php не поздоровится; 2. придётся делать свой фреймворк для GUI...

    Если что я предупредил.

    Так что Стас Коростелев дерзайте!
    Ответ написан
    Комментировать
  • Закрыть модальные окна по клику esc?

    KorniloFF
    @KorniloFF Куратор тега JavaScript
    Работаю по font-end / JS
    <div id="modal_id" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">Модальное окно, закрывающееся по esc</div>
    <script>
    	document.addEventListener('keypress', function (e) {
    		if(e.keyCode === 27) document.getElementById('modal_id').hidden= 1;
    	}); 
    </script>
    Ответ написан
    4 комментария
  • Какую книгу по assembler посоветуете?

    frosty7777777
    @frosty7777777
    Для начала посмотри этот сайт. Там очень коротко и доходчиво изложены основные концепции.

    Затем, если тебя интересует теория и ты готов потратить время на её изучение, то самая лучшая книжка - это
    Юров В.И. - Assembler 2-е издание
    Кстати, к этой книге есть замечательный практикум:
    Юров В.И. - Assembler. Практикум.

    Если ты мечтаешь сразу начать писать программы и предпочитаешь практические навыки, то немедленно приступай к чтению
    Калашников О. А. - Ассемблер — это просто.

    Так же, как программист программисту, настоятельно рекомендую ознакомиться c двумя замечательными книгами:
    Пильщиков В.Н. - Программирование на языке ассембл...
    Марек. Р. - Ассемблер на примерах

    Если затянет и захочется стать гуру ассемблера, то, пожалуй, самые серьезные и глобальные книги, которые я могу тебе посоветовать:
    Ирвин К.Р. - Язык ассемблера для процессоров Intel
    Абель П. - Язык Ассемблера для IMP PC

    Дорогу осилит идущий. Удачи!
    Ответ написан
    2 комментария
  • Ошибка при компиляции в EXE файл Ursina?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Открываете доки по компилятору (судя по заголовку это Ursina), находите раздел отвечающий за конфигурирования и смотрите как подключить в файл, указанный во втором абзаце библиотеку, указанную там-же.
    Ответ написан
    3 комментария
  • Как вызвать HTML из Python?

    @T0r4
    Тоже столкнулся с этой проблемой.
    Вот решение. Открой командную строку, перейди в папку с проектом и введи команду.
    python -m eel {главный файл} {папка с вёрсткой} --onefile
    пример → python -m eel main.py web --onefile
    Ответ написан
    7 комментариев
  • Python eel и Pyinstaller как скомпилировать?

    aook039
    @aook039
    C++, С, python, html, css, js developer
    Вот решение. Открой командную строку, перейди в папку с проектом и введи команду.
    python -m eel {главный файл} {папка с вёрсткой} --onefile
    пример → python -m eel main.py web --onefile
    Ответ я взял с этого поста: Как вызвать HTML из Python?
    Ответ написан
    1 комментарий