diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py
index 282f402e0c..97ab1f80fd 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py
@@ -16,10 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
import ifcopenshell
+from typing import Literal
+
+TIME_TYPE = Literal["WorkingTimes", "ExceptionTimes"]
def add_work_time(
- file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance, time_type: str = "WorkingTimes"
+ file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance, time_type: TIME_TYPE = "WorkingTimes"
) -> ifcopenshell.entity_instance:
"""Add either working times or holiday times to a calendar
diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py
index 10ad55e5dd..a51390c368 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py
@@ -18,6 +18,7 @@
import ifcopenshell
import ifcopenshell.api
+import ifcopenshell.api.sequence
import ifcopenshell.util.element
@@ -60,6 +61,15 @@ def remove_work_calendar(file: ifcopenshell.file, work_calendar: ifcopenshell.en
relating_control=settings["work_calendar"],
related_object=related_object,
)
+
+ # Currently in API work times are created already attached
+ # to the work calendar, so they are never reused.
+ for working_time in settings["work_calendar"].WorkingTimes or []:
+ ifcopenshell.api.sequence.remove_work_time(file, work_time=working_time)
+
+ for exception_time in settings["work_calendar"].ExceptionTimes or []:
+ ifcopenshell.api.sequence.remove_work_time(file, work_time=exception_time)
+
history = settings["work_calendar"].OwnerHistory
file.remove(settings["work_calendar"])
if history:
diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py
new file mode 100644
index 0000000000..4abb5d111a
--- /dev/null
+++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py
@@ -0,0 +1,52 @@
+# IfcOpenShell - IFC toolkit and geometry engine
+# Copyright (C) 2021 Dion Moult
+#
+# This file is part of IfcOpenShell.
+#
+# IfcOpenShell is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# IfcOpenShell is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with IfcOpenShell. If not, see .
+
+import pytest
+import test.bootstrap
+import ifcopenshell.api
+import ifcopenshell.api.control
+import ifcopenshell.api.sequence
+
+
+# NOTE: sequence module features relies on entities introduced in IFC4
+# therefore no IFC2X3 tests
+class TestRemoveWorkCalendar(test.bootstrap.IFC4):
+ def test_remove_work_calendar(self):
+ self.file.create_entity("IfcProject")
+ work_calendar = ifcopenshell.api.sequence.add_work_calendar(self.file)
+
+ # Add work times.
+ ifcopenshell.api.sequence.add_work_time(self.file, work_calendar, "WorkingTimes")
+ ifcopenshell.api.sequence.add_work_time(self.file, work_calendar, "WorkingTimes")
+ ifcopenshell.api.sequence.add_work_time(self.file, work_calendar, "ExceptionTimes")
+ ifcopenshell.api.sequence.add_work_time(self.file, work_calendar, "ExceptionTimes")
+
+ # Assign tasks.
+ task = ifcopenshell.api.sequence.add_task(self.file)
+ ifcopenshell.api.control.assign_control(self.file, work_calendar, task)
+
+ ifcopenshell.api.sequence.remove_work_calendar(self.file, work_calendar)
+
+ assert len(self.file.by_type("IfcWorkCalendar")) == 0
+ assert len(self.file.by_type("IfcWorkTime")) == 0
+ assert len(self.file.by_type("IfcTask")) == 1
+ assert len(self.file.by_type("IfcRelAssignsToControl")) == 0
+
+
+class TestRemoveWorkCalendarIFC4X3(test.bootstrap.IFC4X3, TestRemoveWorkCalendar):
+ pass