2010-02-16 11 views
8

Próbuję wdrożyć system kalendarza z możliwością planowania innych osób na spotkania. System musi być w stanie uniemożliwić zaplanowanie danej osoby podczas innego spotkania lub w czasie niedostępności.kalendarz django wolny/zajęty/dyspozycyjność

Przyjrzałem się wszystkim istniejącym projektom kalendarza django, które znalazłem w Internecie i żadne z nich nie wydaje się mieć wbudowanego w nie (jeśli w jakiś sposób je pominąłem, proszę dać mi znać).

Być może jestem po prostu zbyt zmęczony, ale jedyny sposób, w jaki mogę to zrobić, wydaje się trochę brudny. Tu idzie w pseudo kod:

  • , gdy użytkownik próbuje utworzyć nowy termin, chwyć START_TIME nowego terminu i end_time
  • dla każdego powołania w tym samym dniu, sprawdź czy
    • existing_start_time < new_start_time I existing_end_time> new_start_time (czy nowy termin zaczyna się pomiędzy datą początkową a końcową istniejącego spotkania)
    • existing_start_time < new_end_time I existing_end_time> new_end_time (nowe terminy en d czasu pomiędzy czasem rozpoczęcia i zakończenia wszelkich istniejących Powołanie za)
  • jeśli nie znaleziono żadnych przedmiotów, a następnie iść do przodu i dodać nowy termin

Zważywszy Django ma filtrowanie na podstawie czasu, musi to wszystko zrobić przy użyciu .extra() w zestawie zapytań.

Tak, pytam, czy istnieje lepszy sposób. Pythoniczna sztuczka lub moduł lub cokolwiek, co może to uprościć. Albo istniejący projekt, który ma to, czego potrzebuję, lub może poprowadzić we właściwym kierunku.

Dzięki.

Odpowiedz

13

Co z użyciem Django na range test.

Na przykład:

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 

coś takiego? Nie próbowałem tego sam, więc być może trzeba go trochę poprawić.

EDYCJA: Dodano bit during_conflict.

+1

+1 Fantastyczny! Nie zauważyłem testowania zasięgu został wbudowany w API QuerySet Django. –

+0

Dziękuję za wspaniałą wskazówkę. Brakowało zdarzeń rozpoczętych przed i po zakończeniu nowej wizyty. Na przykład: jeśli klient miał spotkanie od 1 do 5, nie uniemożliwiłoby to osobie rezerwacji od 2 do 3. Dodałem następujące informacje, aby uwzględnić takie sytuacje: during_conflict = Appointment.objects.filter (start_date__lte = appointment.start_time, end_date__gte = spotkanie.end_time) jeśli (start_conflict lub end_conflict lub over_conflict): – mhost

+0

Doskonały. Cieszę się, że to było pomocne. Zamierzam dodać twoją sprawę, aby odpowiedź była bardziej kompletna. –

0

Jedna uwaga dotyczy różnych stref czasowych dla różnych użytkowników i przynosi czas letni w miksie, co staje się bardzo skomplikowane.

Możesz zajrzeć do modułu pytz, aby poradzić sobie z problemem strefy czasowej.

Powiązane problemy