[Bf-blender-cvs] [6018191] asset-engine: Claude: add Pillar 'login' to Blender CLoud.

Bastien Montagne noreply at git.blender.org
Wed Aug 31 12:52:45 CEST 2016


Commit: 6018191d79e08a0e7a79413b9d5f4f231e3269ee
Author: Bastien Montagne
Date:   Wed Aug 31 12:51:18 2016 +0200
Branches: asset-engine
https://developer.blender.org/rB6018191d79e08a0e7a79413b9d5f4f231e3269ee

Claude: add Pillar 'login' to Blender CLoud.

Reusing again mostly code from NlenderCloud add-on, adapted to asset engine system...

===================================================================

M	release/scripts/startup/bl_operators/claude/__init__.py
M	release/scripts/startup/bl_operators/claude/pillar.py

===================================================================

diff --git a/release/scripts/startup/bl_operators/claude/__init__.py b/release/scripts/startup/bl_operators/claude/__init__.py
index 1a64ae2..17ab18c 100644
--- a/release/scripts/startup/bl_operators/claude/__init__.py
+++ b/release/scripts/startup/bl_operators/claude/__init__.py
@@ -67,9 +67,8 @@ import time
 import random
 
 import pillarsdk
-from . import pillar, cache
 
-REQUIRED_ROLES_FOR_TEXTURE_BROWSER = {'subscriber', 'demo'}
+REQUIRED_ROLES_FOR_CLAUDE = {'subscriber', 'demo'}
 
 
 ##########
@@ -117,6 +116,80 @@ class ClaudeJob:
     def __del__(self):
         self.cancel()
 
+class ClaudeJobCheckCredentials(ClaudeJob):
+    @staticmethod
+    async def check():
+        """
+        Check credentials with Pillar, and if ok returns the user ID.
+        Returns None if the user cannot be found, or if the user is not a Cloud subscriber.
+        """
+        try:
+            user_id = await pillar.check_pillar_credentials(REQUIRED_ROLES_FOR_CLAUDE)
+        except pillar.NotSubscribedToCloudError:
+            print('Not subsribed.')
+            return None
+        except pillar.CredentialsNotSyncedError:
+            print('Credentials not synced, re-syncing automatically.')
+            #~ self.log.info('Credentials not synced, re-syncing automatically.')
+        else:
+            print('Credentials okay.')
+            #~ self.log.info('Credentials okay.')
+            return user_id
+
+        try:
+            user_id = await pillar.refresh_pillar_credentials(required_roles)
+        except pillar.NotSubscribedToCloudError:
+            print('Not subsribed.')
+            return None
+        except pillar.UserNotLoggedInError:
+            print('User not logged in on Blender ID.')
+            #~ self.log.error('User not logged in on Blender ID.')
+        else:
+            print('Credentials refreshed and ok.')
+            #~ self.log.info('Credentials refreshed and ok.')
+            return user_id
+
+        return None
+
+    def start(self):
+        self.check_task = asyncio.run_coroutine_threadsafe(self.check(), self.loop)
+        self.progress = 0.0
+        self.status = {'VALID', 'RUNNING'}
+
+    def update(self):
+        if self.evt_cancel.is_set():
+            self.cancel()
+            return
+
+        self.status = {'VALID', 'RUNNING'}
+        user_id = ...
+        if self.check_task is not None:
+            if not self.check_task.done():
+                return ...
+            print("cred check finished, we should have cloud access...")
+            user_id = self.check_task.result()
+            print(user_id)
+            self.check_task = None
+            self.progress = 1.0
+
+        if self.check_task is None:
+            self.status = {'VALID'}
+        return user_id
+
+    def cancel(self):
+        print("CANCELLING...")
+        super().cancel()
+        if self.check_task is not None and not self.check_task.done():
+            self.check_task.cancel()
+        self.status = {'VALID'}
+
+    def __init__(self, executor, job_id):
+        super().__init__(executor, job_id)
+
+        self.check_task = None
+
+        self.start()
+
 
 class ClaudeJobList(ClaudeJob):
     @staticmethod
@@ -135,12 +208,22 @@ class ClaudeJobList(ClaudeJob):
         self.ls_task = asyncio.run_coroutine_threadsafe(self.ls(self.evt_cancel, self.curr_node), self.loop)
         self.status = {'VALID', 'RUNNING'}
 
-    def update(self, dirs):
+    def update(self, user_id, dirs):
         if self.evt_cancel.is_set():
             self.cancel()
             return
 
         self.status = {'VALID', 'RUNNING'}
+
+        if user_id is None:
+            print("Invalid user ID, cannot proceed...")
+            self.cancel()
+            return
+
+        if user_id is ...:
+            print("Awaiting a valid user ID...")
+            return
+
         if self.ls_task is not None:
             if not self.ls_task.done():
                 dirs[:] = [".."]
@@ -161,7 +244,7 @@ class ClaudeJobList(ClaudeJob):
             self.ls_task.cancel()
         self.status = {'VALID'}
 
-    def __init__(self, executor, job_id, curr_node):
+    def __init__(self, executor, job_id, user_id, curr_node):
         super().__init__(executor, job_id)
         self.curr_node = curr_node
 
@@ -242,10 +325,14 @@ class AssetEngineClaude(AssetEngine):
 
     def __init__(self):
         self.executor = futures.ThreadPoolExecutor(8)  # Using threads for now, if issues arise we'll switch to process.
-
-        self.reset()
+        self.jobs = {}
 
         self.job_uuid = 1
+        self.user_id = ...
+        self.job_id_check_credentials = ...
+        self.check_credentials()
+
+        self.reset()
 
     def __del__(self):
         # XXX This errors, saying self has no executor attribute... Suspect some py/RNA funky game. :/
@@ -259,12 +346,29 @@ class AssetEngineClaude(AssetEngine):
     ########## Various helpers ##########
     def reset(self):
         print("Claude Reset!")
-        self.jobs = {}
+        self.jobs = {jid: j for jid, j in self.jobs.items() if jid == self.job_id_check_credentials}
         self.root = ""
         self.dirs = []
 
         self.sortedfiltered = []
 
+    def check_credentials(self):
+        if self.job_id_check_credentials is None:
+            return self.user_id
+        if self.job_id_check_credentials is ...:
+            self.job_id_check_credentials = job_id = self.job_uuid
+            self.job_uuid += 1
+            job = self.jobs[job_id] = ClaudeJobCheckCredentials(self.executor, job_id)
+        else:
+            print(self.job_id_check_credentials)
+            job = self.jobs[self.job_id_check_credentials]
+        if job is not None:
+            self.user_id = job.update()
+            if self.user_id is not ...:
+                self.kill(self.job_id_check_credentials)
+                self.job_id_check_credentials = None
+        return self.user_id
+
     def pretty_version(self, v=None):
         if v is None:
             v = self.bl_version
@@ -339,21 +443,23 @@ class AssetEngineClaude(AssetEngine):
         self.jobs.clear()
 
     def list_dir(self, job_id, entries):
+        user_id = self.check_credentials()
+
         job = self.jobs.get(job_id, None)
         print(entries.root_path, job_id, job)
         if job is not None and isinstance(job, ClaudeJobList):
             if job.curr_node != entries.root_path:
                 self.reset()
-                self.jobs[job_id] = ClaudeJobList(self.executor, job_id, entries.root_path)
+                self.jobs[job_id] = ClaudeJobList(self.executor, job_id, user_id, entries.root_path)
                 self.root = entries.root_path
         elif self.root != entries.root_path:
             self.reset()
             job_id = self.job_uuid
             self.job_uuid += 1
-            job = self.jobs[job_id] = ClaudeJobList(self.executor, job_id, entries.root_path)
+            job = self.jobs[job_id] = ClaudeJobList(self.executor, job_id, user_id, entries.root_path)
             self.root = entries.root_path
         if job is not None:
-            job.update(self.dirs)
+            job.update(user_id, self.dirs)
         print(self.dirs)
         entries.nbr_entries = len(self.dirs)
         return job_id
@@ -429,8 +535,7 @@ class CLAUDE_PT_messages(Panel, ClaudePanel):
         space = context.space_data
         ae = space.asset_engine
 
-        for icon, message in ae.messages:
-            layout.label(message, icon=icon)
+        layout.label("Some stupid test info...", icon='INFO')
 
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/release/scripts/startup/bl_operators/claude/pillar.py b/release/scripts/startup/bl_operators/claude/pillar.py
index ef69d6d..34b2dc4 100644
--- a/release/scripts/startup/bl_operators/claude/pillar.py
+++ b/release/scripts/startup/bl_operators/claude/pillar.py
@@ -142,8 +142,9 @@ def pillar_api(pillar_endpoint: str = None, caching=True) -> pillarsdk.Api:
     if not _pillar_api:
         # Allow overriding the endpoint before importing Blender-specific stuff.
         if pillar_endpoint is None:
-            from . import blender
-            pillar_endpoint = blender.preferences().pillar_server
+            #~ from . import blender
+            #~ pillar_endpoint = blender.preferences().pillar_server
+            pillar_endpoint = "https://cloudapi.blender.org/"
 
         _caching_api = pillarsdk.Api(endpoint=pillar_endpoint,
                                      username=subclient['subclient_user_id'],
@@ -227,8 +228,9 @@ async def refresh_pillar_credentials(required_roles: set):
 
     import blender_id
 
-    from . import blender
-    pillar_endpoint = blender.preferences().pillar_server.rstrip('/')
+    #~ from . import blender
+    #~ pillar_endpoint = blender.preferences().pillar_server.rstrip('/')
+    pillar_endpoint = "https://cloudapi.blender.org"
 
     # Create a subclient token and send it to Pillar.
     # May raise a blender_id.BlenderIdCommError




More information about the Bf-blender-cvs mailing list