• Django. Есть ли встроенный механизм пред-сохранения данных перед сохранением модели?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Pavel Denisov, то есть, для этой вьюхи (принимающей POST с формы) нужно будет установить, что-то типа декоратора @login_required и, по идее, всё автоматом где-то сохранится уже Джангой? Или там нет такого и после отправки на логин-форму — всё, что было на предыдущей странице — пропадает при возвращении?
  • Django. Есть ли встроенный механизм пред-сохранения данных перед сохранением модели?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Pavel Denisov, как понять "не в save, а во views"? То есть, надо всё делать не когда сохраняется модель, а когда с фронта прилетает POST из той формы? Или я не так понял? :)

    Roman Kitaev, я читал как раз противоположную точку зрения, что именно использование сигналов делают путаницу и не прозрачны в больших проектах.. хм..
  • Django. Есть ли встроенный механизм пред-сохранения данных перед сохранением модели?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Да, понимаю, что лучшее решение — это минимизация таких ситуаций, путём показа только того контента, который разрешен в данном инстансе :) Но, к сожалению, вводные именно такие (ведь, допустим, никто не хочет терять таких любопытных посетителей, особенно, если это касается е-коммерц).

    Спасибо за ссылки. Не хотелось бы использовать сигналы, ибо анти-патерн. Поэтому пойду через переопределение save() у модели... тем более, что это даже проще, чем потом разбираться с "где какой сигнал, что делает и зачем?".

    Я так понимаю, что алгоритм в save() будет такой:

    0. получаем данные
    1. если залогинен пользователь — сохраняем как обычно
    2. если нет — записываем в сессию (а она вообще есть у анонима, кстати?!) все данные
    3. переводим на страницу логина (где next параметром будет страница, например, с success сообщением)
    4. аноним авторизируется
    5. перекидываем его на страницу из next

    Я верно мыслю или может лучше не в сессию, а Redis/RMQ?
  • Django. Как сделать мульти-логин нескольких пользовательских аккаунтов для кастомной админки?

    vikkyshostak
    @vikkyshostak Автор вопроса
    OMFG! Спасибо огромное, как раз то, что нужно. Значит надо было гуглить по кейвордам hijacking :D

    Хотя я уже связался с автором django-multiple-auth и (совместно) исправили ошибки при установке. Он, оказывается, вообще не в курсе был, что кто-то не может поставить его пакет ;) Ну ладно, пусть будет, чем больше годных пакетов — тем лучше.
  • Django. Как сделать мульти-логин нескольких пользовательских аккаунтов для кастомной админки?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Pavel Denisov, да, не спорю. Просто был спортивный интерес — мало ли в самой Django есть такой/схожий функционал, который я не смог нагуглить.. :)
  • Django. Как сделать мульти-логин нескольких пользовательских аккаунтов для кастомной админки?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Pavel Denisov, Сергей Горностаев, вообще, было бы идеально какое-либо такое решение (сужу по описанию) — https://github.com/EngageSports/django-multiple-auth но у меня этот пакет даже устанавливаться не захотел, какие-то зависимости повреждены...
  • Django. Как сделать мульти-логин нескольких пользовательских аккаунтов для кастомной админки?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Сергей Горностаев, в обоих проектах, где такое нужно реализовать — эта фишка только для увеличения продуктивности менеджеров. Многие клиенты не хотят сами делать настройки в своих аккаунтах (сфера — автоматизация SMM, аналитика Я.Директа), поэтому заказывают полное сопровождение. Так вот, у одного манагера может быть таких клиентов 10+ и дико неудобно перелогиниваться каждый раз, копируя с эксель-таблички логин и пароль клиента.

    А так — залогинился сразу за всех своих клиентов и переключаешься между ними без логина/пароля, как будто бы разные разделы на сайте.
  • Конфигурация VDS для популярных веб-фреймворков (Python/Node.js/PHP)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Если не KVM, а какой-нить OpenVZ, то вполне можно найти. Но вопрос даже не в этом.

    Возьмём, допустим 1 проц + 512 Мб. Ставим ОСь, БД. Так вот на условный веб-фреймворк — уже явно не все 512 Мб будут приходиться, что-то будет на системные демоны, на БД и так далее. Вот этот момент мне и интересен — насколько такого сервака хватит для тех трёх стеков (с учётом, что у каждого свой VDS и одинаковый конфиг)? И хватит ли вообще, если считать, что код без косяков.
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    javedimka, вот уж воистину, тупанул так тупанул! o_O

    Спасибо огромное, теперь работает, как задумывалось! По аналогии, добавил и response_change() (с отправкой письма о правках в записи).

    Перенесите коммент выше в ответы — отмечу решением (для потомков).

    P.S. Кстати, а почему в методе возвращается пустой super(), а не super(ToursAdmin, self), например? Это чисто для себя на будущее, чтобы знать.
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    javedimka, спасибо за ссылку и подробное пояснение!
    Исправил косячный метод на self.hotels.all().order_by('cost') (плюс ещё во многих местах эту грязь убрал).

    Почитал доки и сделал вот так:

    @admin.register(Tours)  # Register `ToursAdmin` as Admin model
    class ToursAdmin(admin.ModelAdmin):
        exclude = ('created_at',)
        list_display = ('country',)
        ordering = ('created_at',)
        inlines = (HotelsInline,)
    
        def response_add(self, request, obj, post_url_continue=None):
            print(obj.pk)
            print(obj.country)
            print(obj.hotels.all())
            return super().response_add(request, obj, post_url_continue)

    Но то ли лыжи не едут, то ли я долбанутый — ничего не поменялось.
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    javedimka, да, конечно. Вот полный код:

    def _send_mail_to_admin(self, is_new_object=False):
        if is_new_object:
    
            tour = Tours.objects.get(id=self.id)
            hotels = ToursHotels.objects.filter(tour_id=tour.id).order_by('cost')
    
            message = 'Тур ID ' + tour.id + '\n'
            message += 'Страна: ' + tour.country_name + ' Город: ' + tour.country_name + '\n'
            message += 'Отели: \n'
            for hotel in hotels:
                message += hotel.name + ' ' + hotel.star + ' ' + hotel.cost + ' руб. \n'
    
            send_mail(
                'From Admin',
                message,
                'no-reply@example.com',
                ['admin@example.com'],
                fail_silently=False,
            )
            
    def save(self, *args, **kwargs):
        # Define checker of new object
        is_new_object = self.pk is None
        # Tours model save
        super(Tours, self).save(*args, **kwargs)
        # Send mail
        self._send_mail_to_admin(is_new_object)

    Всё то, что в tour — приходит на почту, а hotels — пустой при сохранении нового заказа в админке (только после повторного сохранения отправляется).
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    javedimka, так отправка и вызывается после super():

    def save(self, *args, **kwargs):
        # Tours model save
        super(Tours, self).save(*args, **kwargs)
        # Define checker of new object
        is_new_object = self.pk is None
        # Send mail
        self._send_mail_to_admin(is_new_object)
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    javedimka, Pavel Denisov, Ок. Поясню.

    Есть модель Tours и ToursHotels (назовём её просто Hotels для лучшего понимания). Модель Tours определена в admin.py (и доступна для CRUD операций в админке), а модель Hotels числится в её inlines=[...] параметре.

    Цель: при сохранении формы в админке — отправлять сохранённые данные из этой записи на почту администратору.

    Выглядит всё вот так: https://ibb.co/i1O2Hb (иными словами, модель Hotels может быть очень много раз добавлена к модели Tours — поэтому и нужно именно при сохранении Tours выполнять отправку на почту, а не при Hotels — ведь на каждый тик Hotels — будет улетать отдельное письмо).

    Состояние: переопределён метод save() для модели Tours.

    Проблема: после сохранения новой записи — отправляются только данные из модели Tours, а всё то, что в Hotels — нет. Почему? Я так понял, потому что родительская модель Tours сохраняется раньше, чем все прикреплённые к ней по ForeignKey потомки.

    В идеале: каким-то образом переопределить сохранение модели Tours, чтобы вначале сохранялись её потомки (модель Hotels), используя её pk, а только потом сам родитель (Tours). Далее — у нас уже есть в БД и Tours и Hotels — можно отправлять письмо админу с полными данными по этому заказу тура.
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    sim3x, javedimka, Pavel Denisov, перефразирую вопрос: можно ли в методе save() модели Tours определить вначале сохранение всей пачки ToursHotels, а уже потом сохранять основную? При этом, используя pk в инстансе модели Tours?
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    javedimka, sim3x, хм. спасибо за ссылку и объяснение ;)

    Я так понимаю, что в моём случае проще всего делать через переопределение save() метода модели Tours? Если да, то вопрос: каким образом получить внутри Tours.save() все данные из инлайновой модели ToursHotels (для сохранённой записи)?

    Ведь когда сохраняется модель Tours, то inline модель ToursHotels ещё не сохранена... или я что-то путаю?
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    sim3x, спасибо. Кстати, а почему использование Signals — это анти-паттерн в Django? Уже не первый раз встречаю такие высказывания..
  • Как получить inline модель в инстанс post_save (Django Signals)?

    vikkyshostak
    @vikkyshostak Автор вопроса
    sim3x, а можно по-подробнее про это, если не сложно:

    Если логика сохранения требует редактировать несколько моделей, то деаем все в форме
  • Загрузка фото через Instagram Private API на Python. Почему ошибка Bad Request: Uploaded image isn't in the right format?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Philipp, как-то не те пункты, либо я не понял. Разберём подробнее каждый.

    Пункт 10. Идёт речь про то, что нельзя использовать приватный (то есть тот, с которым работаем после создания приложения и получения accsess_token) API Instagram в других целях (об этом читаем по ссылке в API Terms), кроме тех, которые разрешены самим Instagram. ОК. Загрузка фото в свой аккаунт через приватный API — разрешён. Так что, не вижу тут проблем.

    Пункт 11. Идёт речь про использование API в целях спама. ОК. Лично я — для этих целей и не собирался использовать приватное API. Да и представить сложно: как можно «спамить в инсте другим пользователям — фотками из своего аккаунта». Народ скорее отпишется и забанит, чем будет терпеть в своей ленте такие аккаунты. А вот спам в директ — это серьёзная проблема, но... опять же — я не в этих целях использую приватное API. Тут тоже проблем не увидел.

    Я, честно признаться, думал, что вы раскопали про «нельзя использовать цифровые подписи мобильных устройств для работы с методами приватного API не через мобильные устройства и бла бла бла», а тут такая банальщина, на которую просто плевать (лично мне, ибо я правила пользования не нарушаю никоим образом).
  • Загрузка фото через Instagram Private API на Python. Почему ошибка Bad Request: Uploaded image isn't in the right format?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Philipp, ок. Поставил я цифровую подпись своего личного iPhone 7 в Python скрипт для постинга фоток с моего сайта — это нарушение? Если да, то почему? Это же моё устройство, в каком виде хочу — в таком им и пользуюсь! Instagram вообще должно быть пофиг на это, ИМХО, так же как Фейсбуку пофиг на тех, кто постит на своих бизнес страницах посты (такими же Python-скриптами) из своих CRM систем через API. Тут главное, содержание и качество фотки... собственно, от чём и говорит ошибка из моего вопроса.

    Но, впрочем, тыкните меня пожалуйста в то место пользовательского соглашения Instagram, где написано, что нельзя использовать их API для загрузки фотографий НЕ ЧЕРЕЗ мобильные устройства.
  • Загрузка фото через Instagram Private API на Python. Почему ошибка Bad Request: Uploaded image isn't in the right format?

    vikkyshostak
    @vikkyshostak Автор вопроса
    Philipp ну да. Много людей и компаний используют ботов для автолайка и прочих раскруток аккаунтов (нехилый кусок бизнеса, если что) и Инстаграм ничего с ними сделать не может (вернее нет такой задачи — ибо всё это только ещё больше развивает соц сеть)... а тут меня забанят, за 1-2 поста в день через их же приватный API.. смех да и только!

    И да, вопрос не в том «хорошо это или плохо», а «почему не работает, как задумано».