Django 日历空闲/忙碌/可用性

发布于 2024-08-21 15:32:48 字数 603 浏览 3 评论 0原文

我正在尝试实现一个日历系统,能够安排其他人的约会。系统必须能够防止在另一个约会期间或在他们不可用的时间安排一个人。

我查看了在互联网上找到的所有现有 django 日历项目,但它们似乎都没有内置此功能(如果我以某种方式错过了它,请告诉我)。

也许我只是太累了,但我能想到的唯一方法似乎有点混乱。伪代码如下:

  • 当用户尝试创建新约会时,获取
  • 同一天每个约会的新约会的开始时间和结束时间,检查是否
    • 现有开始时间 <新的开始时间和现有的结束时间> new_start_time(是任何现有约会的开始时间和结束时间之间的新约会开始时间)
    • 现有开始时间 <新的结束时间和现有的结束时间> new_end_time(是任何现有约会的开始时间和结束时间之间的新约会结束时间)
  • 如果没有找到对象,则继续添加新约会

考虑到 Django 没有基于时间的过滤,这一切都必须使用 .extra( )在查询集上。

所以想问一下有没有更好的办法。一个 pythonic 技巧或模块或任何可以简化此操作的东西。或者一个现有的项目有我需要的东西或者可以引导我走向正确的方向。

谢谢。

I am trying to implement a calendar system with the ability to schedule other people for appointments. The system has to be able to prevent scheduling a person during another appointment or during their unavailable time.

I have looked at all the existing django calendar projects I have found on the internet and none of them seem to have this built-into them (if I missed it somehow, please let me know).

Perhaps I am just getting too tired, but the only way I can think of doing this seems a little messy. Here goes in pseudo code:

  • when a user tries to create a new appointment, grab the new appointment's start_time and end_time
  • for each appointment on that same day, check if
    • existing_start_time < new_start_time AND existing_end_time > new_start_time (is the new appointments start time in between any existing appointment's start and end times)
    • existing_start_time < new_end_time AND existing_end_time > new_end_time (is the new appointments end time in between any existing appointment's start and end times)
  • if no objects were found, then go ahead and add the new appointment

Considering Django has no filtering based on time, this must all be done using .extra() on the queryset.

So, I am asking if there is a better way. A pythonic trick or module or anything that might simplify this. Or an existing project that has what I need or can lead me in the right direction.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绝影如岚 2024-08-28 15:32:48

使用 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位。

What about using Django's range test.

For example:

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 like that? I haven't tried this myself so you may have to tweak it a bit.

EDIT: Added the during_conflict bit.

江挽川 2024-08-28 15:32:48

这里需要注意的是不同用户的不同时区,并且将夏令时纳入其中,事情会变得非常复杂。

您可能想看看 pytz 模块来处理时区问题。

One caveat here is the different timezones of different users, and bring Daylight saving time into the mix things become very complicated.

You might want to take a look at pytz module for taking care of the timezone issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文