From f6128febe9523babda1f205c45ee9c7dcef3588b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 12 Oct 2021 19:12:15 +1100 Subject: [PATCH] You can now clear the active user for ownership history. See #1790. --- src/blenderbim/blenderbim/bim/module/csv/operator.py | 8 ++++++-- src/blenderbim/blenderbim/bim/module/csv/ui.py | 6 +++--- .../blenderbim/bim/module/owner/__init__.py | 1 + .../blenderbim/bim/module/owner/operator.py | 12 +++++++++++- src/blenderbim/blenderbim/bim/module/owner/ui.py | 3 ++- src/blenderbim/blenderbim/core/owner.py | 4 ++++ src/blenderbim/blenderbim/tool/ifc.py | 3 ++- src/blenderbim/blenderbim/tool/owner.py | 4 ++++ src/blenderbim/test/bim/feature/owner.feature | 5 +++++ src/blenderbim/test/core/test_owner.py | 6 ++++++ src/blenderbim/test/tool/test_owner.py | 10 ++++++++++ 11 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index 4f6859249c..ac93485c94 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -48,6 +48,7 @@ class RemoveCsvAttribute(bpy.types.Operator): context.scene.CsvProperties.csv_attributes.remove(self.index) return {"FINISHED"} + class RemoveAllCsvAttributes(bpy.types.Operator): bl_idname = "bim.remove_all_csv_attributes" bl_label = "Remove all CSV Attributes" @@ -57,6 +58,7 @@ class RemoveAllCsvAttributes(bpy.types.Operator): context.scene.CsvProperties.csv_attributes.clear() return {"FINISHED"} + class ImportCsvAttributes(bpy.types.Operator): bl_idname = "bim.import_csv_attributes" bl_label = "Import CSV Attributes" @@ -72,7 +74,7 @@ class ImportCsvAttributes(bpy.types.Operator): for attribute in csv_json: csv_attributes.add() csv_attributes[i].name = attribute - i +=1 + i += 1 return {"FINISHED"} @@ -80,6 +82,7 @@ class ImportCsvAttributes(bpy.types.Operator): context.window_manager.fileselect_add(self) return {"RUNNING_MODAL"} + class ExportCsvAttributes(bpy.types.Operator): bl_idname = "bim.export_csv_attributes" bl_label = "Export CSV Attributes" @@ -102,7 +105,8 @@ class ExportCsvAttributes(bpy.types.Operator): self.filepath = bpy.path.ensure_ext(bpy.data.filepath, ".json") WindowManager = context.window_manager WindowManager.fileselect_add(self) - return {"RUNNING_MODAL"} + return {"RUNNING_MODAL"} + class ExportIfcCsv(bpy.types.Operator): bl_idname = "bim.export_ifccsv" diff --git a/src/blenderbim/blenderbim/bim/module/csv/ui.py b/src/blenderbim/blenderbim/bim/module/csv/ui.py index 1ee7e46271..31ae46dceb 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/ui.py +++ b/src/blenderbim/blenderbim/bim/module/csv/ui.py @@ -42,7 +42,7 @@ class BIM_PT_ifccsv(Panel): row = layout.row(align=True) row.prop(props, "csv_ifc_file") row.operator("bim.select_csv_ifc_file", icon="FILE_FOLDER", text="") - + row = layout.row(align=True) row.prop(props, "ifc_selector") row.operator("bim.eyedrop_ifccsv", icon="EYEDROPPER", text="") @@ -66,8 +66,8 @@ class BIM_PT_ifccsv(Panel): row.operator("bim.remove_all_csv_attributes", icon="CANCEL", text="") row = layout.row() row.operator("bim.export_csv_attributes", icon="EXPORT", text="Create Template") - - layout.separator() + + layout.separator() row = layout.row(align=True) row.prop(props, "csv_delimiter") diff --git a/src/blenderbim/blenderbim/bim/module/owner/__init__.py b/src/blenderbim/blenderbim/bim/module/owner/__init__.py index 94effc9326..14bc0b1c95 100644 --- a/src/blenderbim/blenderbim/bim/module/owner/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/owner/__init__.py @@ -27,6 +27,7 @@ classes = ( operator.AddPersonAndOrganisation, operator.AddPersonAttribute, operator.AddRole, + operator.ClearUser, operator.DisableEditingAddress, operator.DisableEditingOrganisation, operator.DisableEditingPerson, diff --git a/src/blenderbim/blenderbim/bim/module/owner/operator.py b/src/blenderbim/blenderbim/bim/module/owner/operator.py index a2a668d6e9..890566325b 100644 --- a/src/blenderbim/blenderbim/bim/module/owner/operator.py +++ b/src/blenderbim/blenderbim/bim/module/owner/operator.py @@ -292,9 +292,19 @@ class RemovePersonAndOrganisation(bpy.types.Operator, Operator): class SetUser(bpy.types.Operator, Operator): bl_idname = "bim.set_user" - bl_label = "set_user" + bl_label = "Set User" bl_options = {"REGISTER", "UNDO"} user: bpy.props.IntProperty() def _execute(self, context): core.set_user(tool.Owner, user=tool.Ifc.get().by_id(self.user)) + + +class ClearUser(bpy.types.Operator, Operator): + bl_idname = "bim.clear_user" + bl_label = "Clear User" + bl_options = {"REGISTER", "UNDO"} + user: bpy.props.IntProperty() + + def _execute(self, context): + core.clear_user(tool.Owner) diff --git a/src/blenderbim/blenderbim/bim/module/owner/ui.py b/src/blenderbim/blenderbim/bim/module/owner/ui.py index bd61add10e..0bbff1f585 100644 --- a/src/blenderbim/blenderbim/bim/module/owner/ui.py +++ b/src/blenderbim/blenderbim/bim/module/owner/ui.py @@ -218,8 +218,9 @@ class BIM_PT_owner(bpy.types.Panel): row = self.layout.row(align=True) if user["is_active"]: row.label(text=user["label"], icon="USER") + row.operator("bim.clear_user", icon="KEYFRAME", text="").user = user["id"] else: row.label(text=user["label"]) - row.operator("bim.set_user", icon="KEYFRAME_HLT", text="").user = user["id"] + row.operator("bim.set_user", icon="KEYFRAME_HLT", text="").user = user["id"] op = row.operator("bim.remove_person_and_organisation", icon="X", text="") op.person_and_organisation = user["id"] diff --git a/src/blenderbim/blenderbim/core/owner.py b/src/blenderbim/blenderbim/core/owner.py index fb620de619..077c840325 100644 --- a/src/blenderbim/blenderbim/core/owner.py +++ b/src/blenderbim/blenderbim/core/owner.py @@ -139,3 +139,7 @@ def set_user(owner, user=None): def get_user(owner): return owner.get_user() + + +def clear_user(owner): + owner.clear_user() diff --git a/src/blenderbim/blenderbim/tool/ifc.py b/src/blenderbim/blenderbim/tool/ifc.py index d05ddb21a6..7ead3b3502 100644 --- a/src/blenderbim/blenderbim/tool/ifc.py +++ b/src/blenderbim/blenderbim/tool/ifc.py @@ -37,7 +37,8 @@ class Ifc(blenderbim.core.tool.Ifc): @classmethod def get_schema(cls): - return IfcStore.get_file().schema + if IfcStore.get_file(): + return IfcStore.get_file().schema @classmethod def get_entity(cls, obj): diff --git a/src/blenderbim/blenderbim/tool/owner.py b/src/blenderbim/blenderbim/tool/owner.py index 3977bceacc..0a3ede8b66 100644 --- a/src/blenderbim/blenderbim/tool/owner.py +++ b/src/blenderbim/blenderbim/tool/owner.py @@ -30,6 +30,10 @@ class Owner(blenderbim.core.tool.Owner): def get_user(cls): if bpy.context.scene.BIMOwnerProperties.active_user_id: return tool.Ifc.get().by_id(bpy.context.scene.BIMOwnerProperties.active_user_id) + elif tool.Ifc.get_schema() == "IFC2X3": + users = tool.Ifc.get().by_type("IfcPersonAndOrganization") + if users: + return users[0] @classmethod def clear_user(cls): diff --git a/src/blenderbim/test/bim/feature/owner.feature b/src/blenderbim/test/bim/feature/owner.feature index fe1a7f3197..8c204ce1f5 100644 --- a/src/blenderbim/test/bim/feature/owner.feature +++ b/src/blenderbim/test/bim/feature/owner.feature @@ -233,3 +233,8 @@ Scenario: Set user And the variable "user" is "{ifc}.by_type('IfcPersonAndOrganization')[0].id()" And I press "bim.set_user(user={user})" Then nothing happens + +Scenario: Clear user + Given an empty IFC project + When I press "bim.clear_user(user={user})" + Then nothing happens diff --git a/src/blenderbim/test/core/test_owner.py b/src/blenderbim/test/core/test_owner.py index 6d7243a8a4..62beb32bd1 100644 --- a/src/blenderbim/test/core/test_owner.py +++ b/src/blenderbim/test/core/test_owner.py @@ -219,3 +219,9 @@ class TestGetUser: def test_run(self, owner): owner.get_user().should_be_called().will_return("person_and_organisation") assert subject.get_user(owner) == "person_and_organisation" + + +class TestClearUser: + def test_run(self, owner): + owner.clear_user().should_be_called() + subject.clear_user(owner) diff --git a/src/blenderbim/test/tool/test_owner.py b/src/blenderbim/test/tool/test_owner.py index 70c44707e2..ff755a443f 100644 --- a/src/blenderbim/test/tool/test_owner.py +++ b/src/blenderbim/test/tool/test_owner.py @@ -45,6 +45,16 @@ class TestGetUser(test.bim.bootstrap.NewFile): user = tool.Ifc.get().by_type("IfcPersonAndOrganization")[0] assert subject.get_user() == user + def test_falling_back_to_any_available_user_ifc2x3(self): + assert subject.get_user() is None + ifc = ifcopenshell.file(schema="IFC2X3") + tool.Ifc.set(ifc) + user = ifc.createIfcPersonAndOrganization() + assert subject.get_user() == user + user2 = ifc.createIfcPersonAndOrganization() + subject.set_user(user2) + assert subject.get_user() == user2 + class TestClearUser(test.bim.bootstrap.NewFile): def test_run(self):