LINUX.ORG.RU

Помогите решить проблему с автоматическим переносом задач в конце дня

 , ,


0

1

Уважаемые гуру. Говорят что тут тусуются те кто могут решать сложные задачи. Возможно для таких спецов эта задача покажется детской, но я все же осмелюсь её описать.

Есть интернет сервис. В сервисе у пользователей есть таски. Проблема следующая, необходимо в конце дня в 23:59 перенести все не выполненные задачи на следующий день.

Я так понимаю нужно настроить сервер на нулевой мередиан и каждый час запускать скрипт который будет сдвигаться на +1 UTC и переносить задачи, но как быть с отрицательными поясами?. Не могу понять как релизовать это правильно.

Нужно же определить кончается день у пользователя или нет а только после могу переносить.

UTC без проблем могу узнать с помощью momentJS...

Помогите пожалуйста пошаговый план определить. Сервис написан на python, web.py

Человеку который реально поможет, вышлю монет на пиво (webmoney).



Последнее исправление: technobot (всего исправлений: 1)

1. Храните таски в UTC (или в любом другом часовом поясе, лишь бы в одном для всех). У каждого пользователя храните его таймзону.

2. Раз в час запускайте скрипт, который выберет таски пользователей, у которых сейчас полночь (посмотрели где полночь сейчас - выбрали этих пользователей - выбрали их таски), и перенесет их на новый день.

Только не понятно зачем у вас время окончания задачи определено, если они у вас живут пока не будут выполнены, чтоб туда-сюда переносить чтоли?

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu

Они живут в любом случае, просто есть календарь и модуль таксок на сегодняшний день. Если пользователь не выполнил задачи их приходится перетаскивать на след день вручную...

technobot
() автор топика
Ответ на: комментарий от technobot

А, то есть можно создать таску на, например, через неделю, так? А может тогда плясать от времени начала таска? Ну то есть я ее создал сегодня, и пока я ее не закрою - она всегда мне будет отображаться? И хранить, соотвественно, не время окончания, а только метку начала и при отображении показывать только те таски, которые были открыты сегодня или раньше и не закрыты?

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu

Да, получается что нужно в конце дня собрать все такски которые были начаты сегодня и не выполнены и просто добавить сутки к их времени что бы они перенеслись в календаре на след день и отобразились в модуле актуальных тасок.

Получается что если в полночь собирать то мне не очень удобно будет SQL запрос делать потому что у меня есть фкнуция getActualTasks() там собираются таски которые назначены на текущие сутки

Пока не совсем представляю как реализовать технически ваш подход. Как узнать где сейчас полночть програмным путем? с помощю python желательно...

technobot
() автор топика

Есть интернет сервис. В сервисе у пользователей есть таски. Проблема следующая, необходимо в конце дня в 23:59 перенести все не выполненные задачи на следующий день.

Чтобы перенести не исполненные задачи на следующий день - не нужно делать ровным счетом ничего. Если же сделано так, что задачи закрываются каждый день - значит этот сервис проектировал какой-то дурачок.

Siado ★★★★★
()
Ответ на: комментарий от technobot

Чет я подумал что вам наверно проще всего при добавлении таска рядом указывать «дедлайн» (я так понимаю это полночь) переведенный в UTC (или какая у вас там таймзона по дефолту, но наверно UTC проще). Потому что тогда можно будет за один проход выбирать таски и прибавлять 24 часа не смотря на то какая там у пользователя таймзона, а ему отдавать список уже с корректным временем (или на клиенте править, как там у вас заведено). Потому что если у вас очень много тасков (а я так понимаю это так) то вот этот поиск таймзоны, потом проверка в базе выльются в итоге в большую нагрузку или будет не быстро. Все равно придется, конечно, каждый час это выгребать, но хоть в запросе хватит простого сравнения с «now()».

micronekodesu ★★★
()
Ответ на: комментарий от Siado

А вот как «проще» будет - селектить все активные задачи, и потом проверять что они созданы сегодня или раньше, или селектить все задачи с окончанием «сегодня» и показывать активные? Я не могу сходу сказать, может там стопицот этих тасков, и тогда по идее выборка по первому варианту будет затратнее. Но да, я согласен что по сути время окончания жизни таска тут какое-то бесполезное.

micronekodesu ★★★
()
Ответ на: комментарий от Siado

Пользователь после того как отработал таску, должен пометить что она закончена что бы самому понимать что сделано что нет.

Если задача не выполнена по каким то причинам до конца дня, значит она должа быть перенесана на след день, это делается либо в календаре, что не удобно, либо должно перетаскиваться автоматически.

Или по вашему это для дураков?

technobot
() автор топика
Ответ на: комментарий от technobot

Немного непонятно как выбираются таски, составленные на сегодня, в пользовательский интерфейс.

Кмк самое логичное решение не двигать таски джобами, а отображать сегодняшние плюс просроченные. Вероятно даже отдельным стилем.

Deleted
()
Ответ на: комментарий от technobot

select all tasks where task.start <= today() (И вероятно ещё одно условие task.completed = False)

И Ваша проблема должна исчезнуть. Это все же наверное будет более правильным вариантом.

Как плюс достаточно легко отследить кол-во дней просрочки, и более глобально - построить расписание дат реального выполнения тасков (для аналитики, если таковая будет уместна)

Deleted
()
Ответ на: комментарий от Deleted

да так и есть task.completed = False вот в конце дня мне надо собрать все эти таски и прибавить дельту в 24 часа, что бы они появились в календаре следующего дня в то же самое время что и были заданы изначально

technobot
() автор топика
Ответ на: комментарий от micronekodesu

С меня пивас походу. Как реализую отпишусь.

Cron умеет передавать результат работы python скрипта, в другой cron процесс с python скриптом например?

Допустим один скрипт запускается и находит все таймзоны в которых полночь и передает этот список в другой процесс, который в свою очередь будет заниматься переносом всех этих тасок?

Это позволит гарантировать что если перенос займет более часа, то следующий цикл точно произойдет.

Естественно все это дело будет происходить на отдельном сервере ибо нагружать основной сервер подобной задачей сравнимо с харакири

technobot
() автор топика

Храни время с таймзоной, запускать селери задачку(или крон) каждый час на 58 минутке. Вот и все.

ggrn ★★★★★
()
Ответ на: комментарий от ggrn

ну сразу можно хранить да, просто в найстройках при регестрации определять geoip и подставлять туда зону. Если меняется тайм зона, предлагать менять...

technobot
() автор топика
Ответ на: комментарий от technobot

Можно и так, или просить пользователя указать тз.

ggrn ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.