From 84ae1c80a825083ea8e56b3c70007c5874a1763b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Thu, 28 Sep 2023 09:11:15 +0200
Subject: [PATCH] ENH: added old example

---
 examples/set_permissions.py | 90 +++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 49 deletions(-)

diff --git a/examples/set_permissions.py b/examples/set_permissions.py
index 8162b11b..8b2b59f1 100755
--- a/examples/set_permissions.py
+++ b/examples/set_permissions.py
@@ -25,13 +25,15 @@
 
 As a result, only a specific user or group may access it.
 
-This script assumes that the user specified in the pycaosdb.ini
-configuration can create new entities.
+This script assumes that data similar to the demo server of IndiScale (at
+demo.indiscale.com) exists on the server specified in the pycaosdb.ini
+configuration.
 
 """
 
 import caosdb as db
 from caosdb import administration as admin
+import lxml
 
 
 def assert_user_and_role():
@@ -48,27 +50,27 @@ out : tuple
     """
     try:
         human_user = admin._retrieve_user("jane")
-        admin._update_user(name="jane", status="ACTIVE")
-    except db.HTTPResourceNotFoundError:
+        _activate_user("jane")
+    except db.EntityDoesNotExistError:
         human_user = admin._insert_user(
             "jane", password="Human_Rememberable_Password_1234", status="ACTIVE")
 
     try:
         alien_user = admin._retrieve_user("xaxys")
-        admin._update_user(name="xaxys", status="ACTIVE")
-    except db.HTTPResourceNotFoundError:
+        _activate_user("xaxys")
+    except db.EntityDoesNotExistError:
         alien_user = admin._insert_user("xaxys", password="4321_Syxax",
                                         status="ACTIVE")
 
     # At the moment, the return value is only "ok" for successful insertions.
     try:
         human_role = admin._retrieve_role("human")
-    except db.HTTPResourceNotFoundError:
+    except db.EntityDoesNotExistError:
         human_role = admin._insert_role("human", "An Earthling.")
 
     try:
         alien_role = admin._retrieve_role("alien")
-    except db.HTTPResourceNotFoundError:
+    except db.EntityDoesNotExistError:
         alien_role = admin._insert_role("alien", "An Extra-terrestrial.")
 
     admin._set_roles("jane", ["human"])
@@ -78,6 +80,24 @@ out : tuple
             ("xaxys", list(admin._get_roles("xaxys"))))
 
 
+def _activate_user(user):
+    """Set the user state to "ACTIVE" if necessary.
+
+Parameters
+----------
+user : str
+    The user to activate.
+
+Returns
+-------
+None
+
+    """
+    user_xml = lxml.etree.fromstring(admin._retrieve_user(user))
+    if user_xml.xpath("User")[0].attrib["status"] != "ACTIVE":
+        admin._update_user(user, status="ACTIVE")
+
+
 def get_entities(count=1):
     """Retrieve one or more entities.
 
@@ -91,11 +111,9 @@ Returns
 out : Container
     A container of retrieved entities, the length is given by the parameter count.
     """
-    cont = db.execute_query("FIND RECORD 'Human Food'", flags={
-                            "P": "0L{n}".format(n=count)})
+    cont = db.execute_query("FIND RECORD Guitar", flags={"P": "0L{n}".format(n=count)})
     if len(cont) != count:
-        raise db.CaosDBException(
-            msg="Incorrect number of entitities returned.")
+        raise db.CaosDBException(msg="Incorrect number of entitities returned.")
     return cont
 
 
@@ -120,8 +138,7 @@ general : bool, optional
 
     # Set general permissions
     if general:
-        grant = admin.PermissionRule(
-            action="grant", permission="RETRIEVE:OWNER")
+        grant = admin.PermissionRule(action="grant", permission="RETRIEVE:OWNER")
         deny = admin.PermissionRule(action="deny", permission="RETRIEVE:FILE")
 
         admin._set_permissions(role=role_grant, permission_rules=[grant])
@@ -172,12 +189,9 @@ None
         for ent in cont:
             ent.retrieve()
         print("Successfully retrieved all entities.")
-    except db.TransactionError as te:
-        if te.has_error(db.AuthorizationError):
-            print(ent)
-            print("Could not retrieve this entity although it should have been possible!")
-        else:
-            raise te
+    except db.AuthorizationException:
+        print(ent)
+        print("Could not retrieve this entity although it should have been possible!")
 
     # Switch to user without permissions
     db.configure_connection(username=denied_user[0], password=denied_user[1],
@@ -192,45 +206,23 @@ None
             denied_all = False
             print(ent)
             print("Could retrieve this entity although it should not have been possible!")
-        except db.TransactionError as te:
-            # Only do something if an error wasn't caused by an
-            # AuthorizationError
-            if not te.has_error(db.AuthorizationError):
-                raise te
+        except db.AuthorizationException:
+            pass
     if denied_all:
         print("Retrieval of all entities was successfully denied.")
 
 
-def create_test_entities():
-    """Create some test entities.
-    After calling this function, there will be a RecordType "Human Food" with the corresponding Records
-    "Bread", "Tomatoes", and "Twinkies" inserted in the database.
-    """
-    rt = db.RecordType(
-        name="Human Food", description="Food that can be eaten only by humans").insert()
-    food = ("Bread", "Tomatoes", "Twinkies")
-
-    cont = db.Container()
-    for i in range(len(food)):
-        rec = db.Record(food[i])
-        rec.add_parent(name="Human Food")
-        cont.append(rec)
-
-    cont.insert()
-
-
 def main():
     """The main function of this script."""
 
-    """Create some test entities"""
-    create_test_entities()
-    """Create new users"""
+    db.connection.connection.get_connection()._login()
+
     human, alien = assert_user_and_role()
-    """Load the newly created entities."""
+
+    # public, private, undefined entities
     entities = get_entities(count=3)
-    """Set permission for the entities (only humans are allowed to eat human food)"""
+
     set_permission(human[1][0], alien[1][0], entities)
-    """Test the permissions"""
     test_permission((human[0], "Human_Rememberable_Password_1234"),
                     (alien[0], "4321_Syxax"), entities)
 
-- 
GitLab