From 0c5a173de7756cb316b2dddde7bc94ca2e3fdbeb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 1 Mar 2024 19:46:50 +1100 Subject: [PATCH] Fix #4340. Indicate user needs to setup IFC2X3 user/app when using API directly. --- .../api/owner/create_owner_history.py | 36 +++++++------------ .../ifcopenshell/api/owner/settings.py | 16 +++++++-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py index c1aa37f986..4ae66cb45e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py @@ -48,7 +48,7 @@ class Usecase: software library and will not know what application the API is being called from, and nor does it have the responsibility to manage the "active user" making edits, which may be as simple as hardcoding it to - "Bob" or even be as complex as integrationg with a CDE's authentication + "Bob" or even be as complex as integration with a CDE's authentication system. As a result, the developer responsible to integrate with IfcOpenShell is expected to overload the ifcopenshell.api.owner.settings.get_user and @@ -106,26 +106,14 @@ class Usecase: application = ifcopenshell.api.owner.settings.get_application(self.file) if self.file.schema != "IFC2X3" and not application: return - try: - return self.file.create_entity( - "IfcOwnerHistory", - **{ - "OwningUser": user, - "OwningApplication": application, - "State": "READWRITE", - "ChangeAction": "ADDED", - "LastModifiedDate": int(time.time()), - "LastModifyingUser": user, - "LastModifyingApplication": application, - "CreationDate": int(time.time()), - }, - ) - except Exception as e: - # clarification message because error may come out of blue for users - # first time they try to create_entity in IFC2X3 - if self.file.schema == "IFC2X3" and (application is None or user is None): - raise Exception( - "In IFC2X3 setting up owner history mandatory but it cannot be setup because either user or application is not set. " - "See an example in the owner.create_owner_history documentation." - ) - raise e + return self.file.create_entity( + "IfcOwnerHistory", + OwningUser=user, + OwningApplication=application, + State="READWRITE", + ChangeAction="ADDED", + LastModifiedDate=int(time.time()), + LastModifyingUser=user, + LastModifyingApplication=application, + CreationDate=int(time.time()), + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py b/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py index 9016cd12e9..0d320df452 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py @@ -30,7 +30,13 @@ def get_application(ifc): :return: The IfcApplication with metadata of the authoring software. :rtype: ifcopenshell.entity_instance.entity_instance """ - return (ifc.by_type("IfcApplication") or [None])[0] + app = ifc.by_type("IfcApplication") + if not app and ifc.schema == "IFC2X3": + raise Exception( + "Please create an application to continue. See the owner.create_owner_history docs for more info." + "https://blenderbim.org/docs-python/autoapi/ifcopenshell/api/owner/create_owner_history/index.html" + ) + return (app or [None])[0] def get_user(ifc): @@ -44,7 +50,13 @@ def get_user(ifc): :return: The IfcPersonAndOrganization with metadata of the authoring user. :rtype: ifcopenshell.entity_instance.entity_instance """ - return (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + pao = ifc.by_type("IfcPersonAndOrganization") + if not pao and ifc.schema == "IFC2X3": + raise Exception( + "Please create a user to continue. See the owner.create_owner_history docs for more info." + "https://blenderbim.org/docs-python/autoapi/ifcopenshell/api/owner/create_owner_history/index.html" + ) + return (pao or [None])[0] get_application_factory = get_application