календарь django free/busy/availabilitty

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

Я посмотрел на все существующие django календарные проекты, которые я нашел в Интернете, и ни один из них, кажется, не создает это - в них (если я пропустил его так или иначе, сообщите мне).

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

  • когда пользователь попытается создать новое назначение, захватите start_time и end_time нового назначения
  • для каждого назначения в тот же самый день проверьте если
    • existing_start_time <new_start_time И existing_end_time> new_start_time (новое время начала назначений, промежуточное запуск любого существующего назначения и время окончания),
    • existing_start_time <new_end_time И existing_end_time> new_end_time (новое время окончания назначений, промежуточное запуск любого существующего назначения и время окончания),
  • если никакие объекты не были найдены, то идут вперед и добавляют новое назначение

Рассмотрение Django не имеет никакой фильтрации на основе времени, это должно все быть сделано с помощью .extra () на queryset.

Так, я спрашиваю, существует ли лучший путь. Прием pythonic или модуль или что-либо, что могло бы упростить это. Или существующий проект, который имеет то, в чем я нуждаюсь или могу привести меня в правильном направлении.

Спасибо.

8
задан mhost 16 February 2010 в 07:17
поделиться

2 ответа

А как насчет использования теста диапазона Django .

Например:

appoinment = Appointment()
appointment.start_time = datetime.datetime.now()
# 1 hour appointment
appointment.end_time = appointment.start_time + datetime.timedelta(hours=1)
# more stuff here
appointment.save()

# Checking for collision
# where the start time for an appointment is between the the start and end times
# You would want to filter this on user, etc 
# There is also a problem if you book an appointment within another appointment
start_conflict = Appointment.objects.filter(
                     start_time__range=(appointment.start_time,
                                        appointment.end_time))
end_conflict = Appointment.objects.filter(
                   end_time__range=(appointment.start_time,
                                    appointment.end_time))

during_conflict = Appointment.objects.filter(
                      start_date__lte=appointment.start_time, 
                      end_date__gte=appointment.end_time)

if (start_conflict or end_conflict or during_conflict):
    # reject, for there is a conflict

Что-то в этом роде? Я сам не пробовал, так что вам, возможно, придется немного подправить.

РЕДАКТИРОВАТЬ: Добавлен бит during_conflict .

13
ответ дан 5 December 2019 в 12:57
поделиться

Одно предостережение здесь - это разные часовые пояса разных пользователей, а если добавить переход на летнее время, то все становится очень сложным.

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

0
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: