Compare commits

..

No commits in common. "796f0d6ad132ff75e2d6b562147e1e24d7284f81" and "34f520aa81ec6186f63a724e0aa9b1da4110da63" have entirely different histories.

2 changed files with 32 additions and 15 deletions

View File

@ -415,7 +415,13 @@ class EventInstructor(models.Model):
class EventExtManager(models.Manager["EventExt"]): class EventExtManager(models.Manager["EventExt"]):
def get_queryset(self) -> models.QuerySet["EventExt"]: def get_queryset(self) -> models.QuerySet["EventExt"]:
return super().get_queryset().annotate(duration=Sum("meeting_times__duration")) return (
super()
.get_queryset()
.annotate(duration=Sum(F("meeting_times__end") - F("meeting_times__start")))
)
# TODO: use simpler expression when GeneratedField fixed
# return super().get_queryset().annotate(duration=Sum("meeting_times__duration"))
class EventExt(Event): class EventExt(Event):
@ -440,18 +446,29 @@ class EventExt(Event):
verbose_name = "event" verbose_name = "event"
class EventMeetingTimeManager(models.Manager["EventMeetingTime"]):
def get_queryset(self) -> models.QuerySet["EventMeetingTime"]:
return super().get_queryset().annotate(duration=F("end") - F("start"))
class EventMeetingTime(models.Model): class EventMeetingTime(models.Model):
objects = EventMeetingTimeManager()
event = models.ForeignKey( event = models.ForeignKey(
EventExt, on_delete=models.CASCADE, related_name="meeting_times" EventExt, on_delete=models.CASCADE, related_name="meeting_times"
) )
start = models.DateTimeField() start = models.DateTimeField()
end = models.DateTimeField() end = models.DateTimeField()
duration = models.GeneratedField( # TODO: Should use generated field instead of manager, but this is
expression=F("end") - F("start"), # broken due to current Django bug, pending next release (> 5.0)
output_field=models.DurationField(), # ref: https://code.djangoproject.com/ticket/35019
db_persist=False,
) # duration = models.GeneratedField(
# expression=F("end") - F("start"),
# output_field=models.DurationField(),
# db_persist=False,
# )
class Meta: class Meta:
constraints = [ constraints = [

View File

@ -4,7 +4,7 @@
[metadata] [metadata]
groups = ["default", "debug", "lint", "server", "typing", "dev"] groups = ["default", "debug", "lint", "server", "typing", "dev"]
strategy = ["cross_platform"] strategy = ["cross_platform"]
lock_version = "4.4.1" lock_version = "4.4"
content_hash = "sha256:91f554bae127245b4082d069629400706b8b43daf3bf1fb8fd963eee120ff449" content_hash = "sha256:91f554bae127245b4082d069629400706b8b43daf3bf1fb8fd963eee120ff449"
[[package]] [[package]]
@ -395,17 +395,17 @@ files = [
[[package]] [[package]]
name = "django" name = "django"
version = "5.0.1" version = "5.0"
requires_python = ">=3.10" requires_python = ">=3.10"
summary = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." summary = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
dependencies = [ dependencies = [
"asgiref<4,>=3.7.0", "asgiref>=3.7.0",
"sqlparse>=0.3.1", "sqlparse>=0.3.1",
"tzdata; sys_platform == \"win32\"", "tzdata; sys_platform == \"win32\"",
] ]
files = [ files = [
{file = "Django-5.0.1-py3-none-any.whl", hash = "sha256:f47a37a90b9bbe2c8ec360235192c7fddfdc832206fcf618bb849b39256affc1"}, {file = "Django-5.0-py3-none-any.whl", hash = "sha256:3a9fd52b8dbeae335ddf4a9dfa6c6a0853a1122f1fb071a8d5eca979f73a05c8"},
{file = "Django-5.0.1.tar.gz", hash = "sha256:8c8659665bc6e3a44fefe1ab0a291e5a3fb3979f9a8230be29de975e57e8f854"}, {file = "Django-5.0.tar.gz", hash = "sha256:7d29e14dfbc19cb6a95a4bd669edbde11f5d4c6a71fdaa42c2d40b6846e807f7"},
] ]
[[package]] [[package]]
@ -1694,15 +1694,15 @@ files = [
[[package]] [[package]]
name = "types-requests" name = "types-requests"
version = "2.31.0.20231231" version = "2.31.0.10"
requires_python = ">=3.7" requires_python = ">=3.7"
summary = "Typing stubs for requests" summary = "Typing stubs for requests"
dependencies = [ dependencies = [
"urllib3>=2", "urllib3>=2",
] ]
files = [ files = [
{file = "types-requests-2.31.0.20231231.tar.gz", hash = "sha256:0f8c0c9764773384122813548d9eea92a5c4e1f33ed54556b508968ec5065cee"}, {file = "types-requests-2.31.0.10.tar.gz", hash = "sha256:dc5852a76f1eaf60eafa81a2e50aefa3d1f015c34cf0cba130930866b1b22a92"},
{file = "types_requests-2.31.0.20231231-py3-none-any.whl", hash = "sha256:2e2230c7bc8dd63fa3153c1c0ae335f8a368447f0582fc332f17d54f88e69027"}, {file = "types_requests-2.31.0.10-py3-none-any.whl", hash = "sha256:b32b9a86beffa876c0c3ac99a4cd3b8b51e973fb8e3bd4e0a6bb32c7efad80fc"},
] ]
[[package]] [[package]]
@ -1787,7 +1787,7 @@ dependencies = [
"python-dotenv>=0.13", "python-dotenv>=0.13",
"pyyaml>=5.1", "pyyaml>=5.1",
"uvicorn==0.25.0", "uvicorn==0.25.0",
"uvloop!=0.15.0,!=0.15.1,>=0.14.0; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"", "uvloop!=0.15.0,!=0.15.1,>=0.14.0; sys_platform != \"win32\" and (sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\")",
"watchfiles>=0.13", "watchfiles>=0.13",
"websockets>=10.4", "websockets>=10.4",
] ]