diff --git a/src/actions/fun.py b/src/actions/fun.py index cb066365d6d8b54815050e39c6962b635e08820d..e93baf33ed7b961c117af736e1f23feef65ba06e 100644 --- a/src/actions/fun.py +++ b/src/actions/fun.py @@ -123,7 +123,10 @@ async def run_rotations(event: events.NewMessage.Event): current_time = start_rotation message = await event.respond(text) while (current_time - start_rotation).seconds < 10: - await message.edit(text_rotor.next_rotation) + current_rotation = text_rotor.next_rotation + if current_rotation.startswith(" ") and current_rotation.endswith(" "): + continue + await message.edit(current_rotation) current_time = datetime.now() await asyncio.sleep(0.2) await message.delete() diff --git a/src/utils/.str_helpers.py@neomake_1228869_3.py b/src/utils/.str_helpers.py@neomake_1228869_3.py new file mode 100644 index 0000000000000000000000000000000000000000..2d2e7cd1bd736931b2994e82be836fbbfccfb136 --- /dev/null +++ b/src/utils/.str_helpers.py@neomake_1228869_3.py @@ -0,0 +1,29 @@ +class Rotor: + """ + Class for text rotation. E.G. + abcd + bcda + cdab + ... + """ + + def __init__(self, original, start): + self.original = original + self.start = start + self.rotation = original + " " * len(original) + + @property + def next_rotation(self): + first = self.rotation[0] + self.rotation = self.rotation[1:] + first + return self.rotation + + +def replace_by_index(base, replacement, index): + if index < 0: # add it to the beginning + return replacement + base + if index > len(base): # add it to the end + return base + replacement + replacement_len = len(replacement) + # insert the new string between "slices" of the original + return base[:index] + replacement + base[index + replacement_len :] diff --git a/src/utils/str_helpers.py b/src/utils/str_helpers.py index caf749203675c99206541c27d21ec0140df649f7..28c680a2ebb3e2dca6c2c5242a97ef39a0a5bf27 100644 --- a/src/utils/str_helpers.py +++ b/src/utils/str_helpers.py @@ -10,13 +10,13 @@ class Rotor: def __init__(self, original, start): self.original = original self.start = start - self.rotation = original + self.rotation = original + " " * len(original) @property def next_rotation(self): first = self.rotation[0] self.rotation = self.rotation[1:] + first - return self.rotation + return self.rotation[: len(self.original)] def replace_by_index(base, replacement, index): diff --git a/static_messages/students.txt b/static_messages/students.txt index ace5aa60a3190c377365aa41013fcb195078a33e..dc1a9e9e7093f2de1c1b42a834486e157f347f8a 100644 --- a/static_messages/students.txt +++ b/static_messages/students.txt @@ -1,30 +1,11 @@ .Привет! Ðиже предÑтавлена Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ курÑу! -Ты уже Ñоздал шаблон Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Django! Самое Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ð¿Ð¸Ñать Ñамо приложение. - -Текущее задание: -ИÑправить замечаниÑ, еÑли таковые имелиÑÑŒ. - -Реализовать ÑÐµÑ€Ð²Ð¸Ñ `goods`. Данный ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть реализован на `DjangoRestFramework` и предоÑтавлÑть `REST API` Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¾Ð±ÑŠÑвлениÑми. -Ð’ рамках данной задачи требуетÑÑ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ñ‚ÑŒ модель объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸ проÑтую ÑиÑтему тегов. - -Ð’Ñе ответы `REST API` ÑервиÑа должны быть в формате JSON, за иÑключением методов работы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸. - -ПоÑÑÐ½ÐµÐ½Ð¸Ñ Ðº заданию: -Ð¡ÐµÑ€Ð²Ð¸Ñ `goods` должен отвечать Ñледующим требованиÑм: -- можно получить краткую информацию по объÑвлению, без ÑƒÐ²ÐµÐ»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñчётчика проÑмотров; -- можно получить полную информацию по объÑвлению; -- можно чаÑтично/полноÑтью обновить объÑвление; -- можно получить полный ÑпиÑок имеющихÑÑ Ñ‚ÐµÐ³Ð¾Ð²; -- можно получить вÑе объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ некоторому набору тегов; -- можно получить вÑе объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð·Ð° некоторый интервал времени (ПоиÑк по датам ÑозданиÑ); -- можно загрузить/удалить/обновить фотографию объÑвлениÑ; -- можно выполнить фильтрацию по ÑтоимоÑти; - -Ð’ ÑервиÑе **не** должно быть: -- ÑиÑтемы пользователей; -- панели админиÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Django; -- шаблонов (Веб-Ñтраниц); - -Задание выдано: `13.07.2020` -Первоначальный дедлайн: `20.07.2020` +ÐадеÑÑŒ ты уже Ñоздал приложение на Django Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÑвлениÑми. +Теперь Ñ‚Ð²Ð¾Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° напиÑать ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ ÑŽÐ·ÐµÑ€Ð°Ð¼Ð¸. + +Вот каким требованиÑм должен отвечать ÑÐµÑ€Ð²Ð¸Ñ ÑŽÐ·ÐµÑ€Ð¾Ð²: +1) Ð¡ÐµÑ€Ð²Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть напиÑан на Ñтеке aiohttp+SQLAlchemy+Alembic(Ð”Ð»Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ð¹). +2) ЕÑть ендпоинты Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации, логина, логаута, обновлении и Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о пользователе. +3) ПредуÑтротрен механихм ÑеÑÑий. Ð”Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ пользователей должен иÑпользоватьÑÑ JWT. +4) Реализовать механизм ÑеÑÑий, как показано в [диаграммах](https://drive.google.com/file/d/1k6TBDraBoZ8wK2tKDp6tFqSZoE650abS/view?usp=sharing). +5) Во вÑех Ñндпоинтах (кроме логина) валидировать корректноÑть токенов.