календарь django свободен / занят / доступен - PullRequest
8 голосов
/ 16 февраля 2010

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

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

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

  • когда пользователь пытается создать новую встречу, захватите start_time и end_time новой встречи
  • для каждой встречи в тот же день, проверьте, если
    • Существующее_старт_Время <новое_старт_Время И существующее_end_time> новое_старт_Время (это время начала новых встреч между временем начала и окончания любой существующей встречи)
    • Существующее_старт_Время <время_новременной_И И существующей_Энд_Времени> время_новременностей новых встречвремя начала и окончания любой существующей встречи)
  • , если никакие объекты не были найдены, затем добавьте новую встречу

Учитывая, что Django не имеет фильтрации на основевремя, все это должно быть сделано с помощью .extra () в наборе запросов.

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

Спасибо.

Ответы [ 2 ]

13 голосов
/ 16 февраля 2010

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

Например:

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 бит.

0 голосов
/ 16 февраля 2010

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

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

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