• Как задать дефолт-значение в boolean-поле sqlalchemy?

    @Dbtzhv Автор вопроса
    Everything_is_bad, аааа спс. Я к джанго-миграциям привык))) Вручную добавил, получилось
    Написано
  • Как задать дефолт-значение в boolean-поле sqlalchemy?

    @Dbtzhv Автор вопроса
    Everything_is_bad, миграцию. Ща заметил, что в ней пусто:
    from typing import Sequence, Union
    
    from alembic import op
    import sqlalchemy as sa
    
    
    # revision identifiers, used by Alembic.
    revision: str = '10fb8fe047be'
    down_revision: Union[str, None] = '99af779c8e34'
    branch_labels: Union[str, Sequence[str], None] = None
    depends_on: Union[str, Sequence[str], None] = None
    
    
    def upgrade() -> None:
        # ### commands auto generated by Alembic - please adjust! ###
        pass
        # ### end Alembic commands ###
    
    
    def downgrade() -> None:
        # ### commands auto generated by Alembic - please adjust! ###
        pass
        # ### end Alembic commands ###
    Написано
  • Почему nginx не отдает статику, хотя работает?

    @Dbtzhv Автор вопроса
    dodo512, а как пермишин дать?) Не подскажите пожалуйста
    Написано
  • Почему nginx не отдает статику, хотя работает?

    @Dbtzhv Автор вопроса
    dodo512,
    2024/05/01 17:00:26 [notice] 2858#2858: using inherited sockets from "6;7;"
    2024/05/01 17:04:58 [error] 3015#3015: *1 open() "/home/ubuntu/portfolio-server/static/portfolio/custom.css" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/custom.css HTTP/1.1", host: "77.243.80.21", referrer: "http://77.243.80.21/">
    2024/05/01 17:04:58 [error] 3015#3015: *3 open() "/home/ubuntu/portfolio-server/static/portfolio/roo1ts.jpg" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/roo1ts.jpg HTTP/1.1", hos>
    2024/05/01 17:04:59 [error] 3015#3015: *3 open() "/home/ubuntu/portfolio-server/static/portfolio/custom.css" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/custom.css HTTP/1.1", hos>
    2024/05/01 17:04:59 [error] 3015#3015: *8 open() "/home/ubuntu/portfolio-server/static/portfolio/roo1ts.jpg" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/roo1ts.jpg HTTP/1.1", hos>
    2024/05/01 17:05:00 [error] 3015#3015: *3 open() "/home/ubuntu/portfolio-server/static/portfolio/roo1ts.jpg" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/roo1ts.jpg HTTP/1.1", hos>
    2024/05/01 17:05:00 [error] 3015#3015: *8 open() "/home/ubuntu/portfolio-server/static/portfolio/custom.css" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/custom.css HTTP/1.1", hos>
    2024/05/01 17:05:00 [error] 3015#3015: *3 open() "/home/ubuntu/portfolio-server/static/portfolio/custom.css" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/custom.css HTTP/1.1", hos>
    2024/05/01 17:05:00 [error] 3015#3015: *8 open() "/home/ubuntu/portfolio-server/static/portfolio/roo1ts.jpg" failed (13: Permission denied), client: 185.113.37.112, server: 77.243.80.21, request: "GET /static/portfolio/roo1ts.jpg HTTP/1.1", hos>
    Написано
  • Почему asyncio.current_task() не передается в функцию?

    @Dbtzhv Автор вопроса
    Everything_is_bad, а что можно сделать?) Чтоб при вызове функции с аргументом next_stage, работа предыдущей с её asyncio.sleep() прерывалась
    Написано
  • Почему asyncio.current_task() не передается в функцию?

    @Dbtzhv Автор вопроса
    Everything_is_bad,
    @dp.message_handler(filters.Text(startswith=['Продолжить выполнение', 'Попробовать еще раз']))
    async def info_start_tasks(message: types.Message, next_stage=None, delay=None, task=None):
        try:
            user = get_object_or_404(User, telegram_id=message.chat.id)
            if user.life_counter < 1:
                raise TimeoutError
            funnel = Funnel.objects.get(members=user)
            if user.funnel_step == funnel.stage_id.count():
                raise ValueError
            if next_stage!=None:
                # task.cancel()
                print('NEXT STAGE:', next_stage)
                stages = list(funnel.stage_id.all())
                stage = Stage.objects.filter(stage_id=next_stage).first()
                index_of_next_stage = stages.index(stage)
                print('INDEX', index_of_next_stage)
                user.funnel_step = index_of_next_stage
                user.save()
            else:
                print('CHEEEECK344', user.funnel_step, funnel.stage_id.all())
                stage = list(funnel.stage_id.all())[user.funnel_step]
            statistics, _ = StageUser.objects.get_or_create(user=user, stage=stage)
            if stage.time_to_finish != 0:
                # logger.debug(f'запускаю таймер на {stage.time_to_finish * 3600} сек')
                if user.cache_delete:
                    original_datetime = datetime.strptime(str(datetime.now()), "%Y-%m-%d %H:%M:%S.%f")
                    user.start_time_point = original_datetime.strftime("%Y-%m-%dT%H:%M:%S")
                    user.cache_delete = False
                    user.save()
                    current_datetime = datetime.now(datetime.UTC)
                    statistics.time_to_starting_burn = datetime.now()
                    statistics.save()
                    data_to_1_burn = current_datetime + timedelta(hours=stage.time_to_finish * 0.5)
                    data_to_2_burn = data_to_1_burn + timedelta(hours=stage.time_to_finish * 0.25)
                    data_to_3_burn = data_to_2_burn + timedelta(hours=stage.time_to_finish * 0.25)
                    task = check_stage_timeout_task.apply_async(
                        args=[statistics.id, [data_to_1_burn, data_to_2_burn, data_to_3_burn]],
                        eta=data_to_1_burn
                    )
                    TaskUser.objects.create(user=user, task_id=task.id)
            print('STAGE1:', stage)
            print(stage.message_id.all(), user.number_of_solved_tasks)
            answer_for_user_all = list(stage.message_id.all())#[user.number_of_solved_tasks]
            print('ANSWERRR', answer_for_user_all)
            for answer_for_user in answer_for_user_all:
                if delay==None:
                    delay = answer_for_user.delay if answer_for_user.delay!=None else 0
                print('DELAY', delay)
                await asyncio.sleep(delay)
                delay=answer_for_user.delay if answer_for_user.delay!=None else 0
                print('STAGE2:', stage)
                await send_task_information(message.chat.id, answer_for_user, stage)
                await send_all_files(user, answer_for_user)
                await image_generation(answer_for_user, user)
            user.funnel_step+=1
            user.save()
            end_task = current_task()
            print('CURRENT TASK', end_task)
            await info_start_tasks(message, task=end_task)
            if (
                stage.is_generation
                and stage.description
                and stage.photo
                and user.number_of_solved_tasks == 0
            ):
                create_image(user, stage=stage)
                with open('send.png', "rb") as image_from_buffer:
                    await bot.send_photo(
                        chat_id=user.telegram_id,
                        photo=image_from_buffer.read()
                        )
            if stage.linked:
                ilkeyboard = types.InlineKeyboardMarkup(row_width=4).add(types.InlineKeyboardButton(
                    text='Ссылка для прохождения',
                    url=f'{MAIN_URL}{funnel.owner}/{user}'
                ))
                await bot.send_message(
                    chat_id=user.telegram_id,
                    text='Этот этап необходимо пройти на сайте',
                    reply_markup=ilkeyboard,
                )
            count = 0
            for button in answer_for_user.buttons.all():
                count += 1
                if button.button_type == 'Ссылка на ресурс':
                    count -= 1
            if count == 0 and (not stage.with_open_answer or not (answer_for_user == list(stage.message_id.all())[-1])):
                user.number_of_solved_tasks += 1
                user.save()
                print('FUNC 44444')
                #await info_start_tasks(message, next_stage=next_stage)
        except Http404 as error:
            await handle_http4044_error(message.chat.id, error)
        except IndexError:
            await handle_index_error(user, funnel, message, next_stage)
        except BotBlocked:
            await bot_blocked_error(user, funnel)
        except TimeoutError:
            await handle_timeout_error(message.chat.id)
        except ValueError:
            answer, keyboard, _, _ = create_answer('Stage_matching_query_does_not_exist')
            return await bot.send_message(
                chat_id=user.telegram_id,
                text=answer.message_text.replace('<br>', '\n'),
                reply_markup=keyboard,
                parse_mode='HTML'
            )
        except Exception as error:
            await handle_exception(message.chat.id, error)


    P.S. Это не моё творение, если что)
    Написано
  • Как сделать вебсокеты в drf-проекте с реакт-фронтендом?

    @Dbtzhv Автор вопроса
    Everything_is_bad, спасибо!
    А как это обрабатывать вообще с фронта?
    soket.on("getTasks")
    soket.on("addTask", task: {"новая задача"}
    Написано
  • Как сделать вебсокеты в drf-проекте с реакт-фронтендом?

    @Dbtzhv Автор вопроса
    а можно поподробнее? Не в плане того, что вебсокеты с DRF никак не соприкасаются, а в плане реализации в целом. Я просто даже хз, с чего начать это делать.

    В джанго-проекте делал вебсокеты на channels, подключал в шаблонах (как в stackoverflow и показано), и потом через джанго-сигналы отправлял инфу на сокет. А тут как быть, какие технологии использовать и т.д.?
    Написано
  • Почему не работает ссылка с parse_mode='HTML'?

    @Dbtzhv Автор вопроса
    febday, в ней была проблема. Спасибо
    Написано
  • Какое тут упущение в логике джанго?

    @Dbtzhv Автор вопроса
    Everything_is_bad, да, url ведёт в представление, которое использует логику, которую я выше указал. Причём, всё работало, но с какого-то момента перестало.

    в консоли ещё оказывается есть ошибка:
    tics.py", line 565, in median
    raise StatisticsError("no median for empty data")
    statistics.StatisticsError: no median for empty data

    но почему в median передаются пустые значения непонятно
    Написано
  • Какое тут упущение в логике джанго?

    @Dbtzhv Автор вопроса
    Everything_is_bad, в консоли браузера:
    [Error] Failed to load resource: the server responded with a status of 500 (Internal Server Error) (ajax, line 0)
    TypeError: undefined is not an object (evaluating 'response.responseJSON.errors')

    В джанговской всё чисто
    Написано
  • Какое тут упущение в логике джанго?

    @Dbtzhv Автор вопроса
    Everything_is_bad, {% trans "Не удалось получить данные, пожалуйста, перезагрузите страницу" %}
    Написано
  • Как сделать basicauth для фронтэнда?

    @Dbtzhv Автор вопроса
    Дмитрий, я прост не совсем понимаю, как фронт будет с этим взаимодействовать. Н-р, в страничке логина
    Написано
  • Как автоматически обновлять поле модели, значение которого делается на основе полей других моделей?

    @Dbtzhv Автор вопроса
    а метод save() для нужной customuser модели вызвать при изменении payment'ов нельзя?
    Написано
  • Почему не могу словить чекбокс из шаблона в представлении?

    @Dbtzhv Автор вопроса
    Михаил Р.,
    def make_qr_connection_request(request, code):
        if request.method == 'POST':


    если так сделать, то условие возвращает False.

    шаблон - это кусок из html, который я первым указал в вопросе
    Написано
  • Почему не могу словить чекбокс из шаблона в представлении?

    @Dbtzhv Автор вопроса
    а что нужно в шаблоне поменять, чтобы заработало? Ща если на POST менять, то вьюха ошибку выдаёт
    Написано
  • Wireshark: как поймать запросы с десктопного Viber?

    @Dbtzhv Автор вопроса
    "пустить трафик через прокси с расшифровкой https и там смотреть" - можете подсказать, как?)
    Написано
  • Aiogram: LookupError: proxy is closed! Чем может быть вызвано?

    @Dbtzhv Автор вопроса
    febday, а это вне стэйта происходит.
    get_categories_list() - с помощью DRF получаем список категорий из БД, в виде списка.
    Написано
  • Бесплатный API антиплагиата?

    @Dbtzhv Автор вопроса
    Михаил Р., да. Проверка на уникальность, по сути
    Написано