2010-02-16 19 views
8

Tôi đang cố gắng triển khai hệ thống lịch có khả năng lên lịch cho những người khác cho các cuộc hẹn. Hệ thống phải có khả năng ngăn chặn việc lập kế hoạch cho một người trong một cuộc hẹn khác hoặc trong thời gian không có mặt của họ.django calendar free/busy/availabilitty

Tôi đã xem xét tất cả các dự án lịch django hiện có mà tôi đã tìm thấy trên internet và không có dự án nào trong số này dường như được tích hợp sẵn (nếu tôi bỏ lỡ bằng cách nào đó, vui lòng cho tôi biết).

Có lẽ tôi chỉ cảm thấy mệt mỏi, nhưng cách duy nhất tôi có thể nghĩ là làm điều này có vẻ hơi lộn xộn một chút. Ở đây đi trong mã giả:

  • khi người dùng cố gắng để tạo ra một cuộc hẹn mới, lấy start_time việc bổ nhiệm mới và END_TIME
  • cho mỗi cuộc hẹn vào cùng ngày hôm đó, kiểm tra xem
    • existing_start_time < NEW_START_TIME AND existing_end_time> new_start_time (là các cuộc hẹn mới bắt đầu thời gian giữa bất kỳ thời điểm bắt đầu và kết thúc cuộc hẹn hiện tại nào)
    • existing_start_time < new_end_time AND existing_end_time> new_end_time (là các cuộc hẹn mới vi d thời gian ở giữa các cuộc hẹn hiện của sự khởi đầu và kết thúc)
  • nếu không có đối tượng được tìm thấy, sau đó đi trước và thêm việc bổ nhiệm mới

Xét Django không có lọc dựa trên thời gian, điều này phải tất cả được thực hiện bằng cách sử dụng .extra() trên queryset.

Vì vậy, tôi hỏi nếu có cách nào tốt hơn. Một thủ thuật hoặc mô-đun pythonic hoặc bất kỳ thứ gì có thể đơn giản hóa điều này. Hoặc một dự án hiện có có những gì tôi cần hoặc có thể dẫn tôi đi đúng hướng.

Cảm ơn.

Trả lời

13

Điều gì về việc sử dụng số range test của Django.

Ví dụ:

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 

Something như vậy? Tôi đã không cố gắng này bản thân mình để bạn có thể phải tinh chỉnh nó một chút.

EDIT: Đã thêm during_conflict bit.

+1

+1 Tuyệt vời! Đã không nhìn thấy thử nghiệm phạm vi được xây dựng vào API QuerySet của Django. –

+0

Cảm ơn bạn về mẹo tuyệt vời. Điều này đã thiếu các sự kiện bắt đầu trước và kết thúc sau cuộc hẹn mới. Ví dụ: Nếu khách hàng có cuộc hẹn từ 1 đến 5, điều này sẽ không ngăn ai đó đặt chỗ từ 2 đến 3. Tôi đã thêm những điều sau đây để bao gồm các tình huống như vậy: in_conflict = Appointment.objects.filter (start_date__lte = appoint.start_time, end_date__gte = cuộc hẹn.end_time) nếu (start_conflict hoặc end_conflict hoặc trong_conflict): – mhost

+0

Tuyệt vời. Tôi rất vui vì điều này rất hữu ích. Tôi sẽ thêm trường hợp của bạn để câu trả lời hoàn chỉnh hơn. –

0

Một lưu ý ở đây là các múi giờ khác nhau của những người dùng khác nhau và mang lại thời gian tiết kiệm ánh sáng ban ngày vào những thứ hỗn hợp trở nên rất phức tạp.

Bạn có thể muốn xem mô hình pytz để quản lý vấn đề múi giờ.