[Bf-extensions-cvs] [5412d45d] master: BlenderKit: -fix arrows not showing on the right side when the search results can be increased still. -improve tasks_queue. It's now hanging on another blender object(panel definition) to have persistent task queue. -get separate Author info (should also get Gravatar in future) -get Profile info in fetch server data -new Profile panel shows user information -improve tooltip - random tips, author info(will be further improved) -improve login UI - fix swapping of search results

Vilem Duha noreply at git.blender.org
Sun May 19 16:02:54 CEST 2019


Commit: 5412d45d9e682d0b8fe8437b735ee06979e34f02
Author: Vilem Duha
Date:   Mon Apr 29 21:30:11 2019 +0200
Branches: master
https://developer.blender.org/rBA5412d45d9e682d0b8fe8437b735ee06979e34f02

BlenderKit:
-fix arrows not showing on the right side when the search results can be increased still.
-improve tasks_queue. It's now hanging on another blender object(panel definition) to have persistent task queue.
-get separate Author info (should also get Gravatar in future)
-get Profile info in fetch server data
-new Profile panel shows user information
-improve tooltip - random tips, author info(will be further improved)
-improve login UI
- fix swapping of search results

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

M	blenderkit/__init__.py
M	blenderkit/oauth.py
M	blenderkit/search.py
M	blenderkit/tasks_queue.py
M	blenderkit/ui.py
M	blenderkit/ui_panels.py
M	blenderkit/utils.py

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

diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py
index 6a8b1886..929a900a 100644
--- a/blenderkit/__init__.py
+++ b/blenderkit/__init__.py
@@ -83,7 +83,8 @@ def scene_load(context):
     ui_props = bpy.context.scene.blenderkitUI
     ui_props.assetbar_on = False
     ui_props.turn_off = False
-
+    preferences = bpy.context.preferences.addons['blenderkit'].preferences
+    preferences.login_attempt = False
 
 licenses = (
     ('royalty_free', 'Royalty Free', 'royalty free commercial license'),
@@ -205,14 +206,19 @@ def switch_search_results(self, context):
     props = s.blenderkitUI
     if props.asset_type == 'MODEL':
         s['search results'] = s.get('bkit model search')
+        s['search results orig'] = s.get('bkit model search orig')
     elif props.asset_type == 'SCENE':
         s['search results'] = s.get('bkit scene search')
+        s['search results orig'] = s.get('bkit scene search orig')
     elif props.asset_type == 'MATERIAL':
         s['search results'] = s.get('bkit material search')
+        s['search results orig'] = s.get('bkit material search orig')
     elif props.asset_type == 'TEXTURE':
         s['search results'] = s.get('bkit texture search')
+        s['search results orig'] = s.get('bkit texture search orig')
     elif props.asset_type == 'BRUSH':
         s['search results'] = s.get('bkit brush search')
+        s['search results orig'] = s.get('bkit brush search orig')
     search.load_previews()
 
 
@@ -1313,9 +1319,8 @@ class BlenderKitAddonPreferences(AddonPreferences):
         layout = self.layout
 
         if self.api_key.strip() == '':
-            op = layout.operator("wm.url_open", text="Register online and get your API Key",
-                                 icon='QUESTION')
-            op.url = paths.BLENDERKIT_SIGNUP_URL
+            layout.operator("wm.blenderkit_login", text="Login/ Sign up",
+                            icon='URL')
         layout.prop(self, "api_key", text='Your API Key')
         # layout.label(text='After you paste API Key, categories are downloaded, so blender will freeze for a few seconds.')
         layout.prop(self, "global_dir")
diff --git a/blenderkit/oauth.py b/blenderkit/oauth.py
index 78c8dfb3..f2cdf3e8 100644
--- a/blenderkit/oauth.py
+++ b/blenderkit/oauth.py
@@ -25,6 +25,7 @@ from urllib.parse import parse_qs, urlparse
 
 import requests
 import threading
+import blenderkit
 from blenderkit import tasks_queue, utils, paths
 
 CLIENT_ID = "IdFRwa3SGA8eMpzhRVFMg5Ts8sPK93xBjif93x0F"
@@ -99,8 +100,8 @@ def login_thread():
 def login():
     authenticator = SimpleOAuthAuthenticator(server_url=paths.get_bkit_url(), client_id=CLIENT_ID, ports=PORTS)
     auth_token, refresh_token = authenticator.get_new_token()
-    print('tokens retrieved')
-    tasks_queue.tasks_queue.put('blenderkit.oauth.write_tokens("%s", "%s")' % (auth_token, refresh_token))
+    utils.p('tokens retrieved')
+    tasks_queue.add_task((write_tokens , (auth_token, refresh_token)))
 
 
 def refresh_token_thread():
@@ -113,11 +114,12 @@ def refresh_token_thread():
 def refresh_token(api_key_refresh):
     authenticator = SimpleOAuthAuthenticator(server_url=paths.get_bkit_url(), client_id=CLIENT_ID, ports=PORTS)
     auth_token, refresh_token = authenticator.get_refreshed_token(api_key_refresh)
-    tasks_queue.tasks_queue.put('blenderkit.oauth.write_tokens("%s", "%s")' % (auth_token, refresh_token))
+    if auth_token is not None and refresh_token is not None:
+        tasks_queue.add_task((blenderkit.oauth.write_tokens , (auth_token, refresh_token)))
 
 
 def write_tokens(auth_token, refresh_token):
-    print('writing tokens?')
+    utils.p('writing tokens?')
     preferences = bpy.context.preferences.addons['blenderkit'].preferences
     preferences.api_key = auth_token
     preferences.api_key_refresh = refresh_token
@@ -144,6 +146,25 @@ class RegisterLoginOnline(bpy.types.Operator):
         return {'FINISHED'}
 
 
+class Logout(bpy.types.Operator):
+    """Bring linked object hierarchy to scene and make it editable."""
+
+    bl_idname = "wm.blenderkit_logout"
+    bl_label = "BlenderKit logout"
+    bl_options = {'REGISTER', 'UNDO'}
+
+    @classmethod
+    def poll(cls, context):
+        return True
+
+    def execute(self, context):
+        preferences = bpy.context.preferences.addons['blenderkit'].preferences
+        preferences.login_attempt = False
+        preferences.api_key_refresh = ''
+        preferences.api_key = ''
+        return {'FINISHED'}
+
+
 class CancelLoginOnline(bpy.types.Operator):
     """Cancel login attempt."""
 
@@ -163,6 +184,7 @@ class CancelLoginOnline(bpy.types.Operator):
 classess = (
     RegisterLoginOnline,
     CancelLoginOnline,
+    Logout,
 )
 
 
diff --git a/blenderkit/search.py b/blenderkit/search.py
index 39a770ee..45865391 100644
--- a/blenderkit/search.py
+++ b/blenderkit/search.py
@@ -25,8 +25,9 @@ if "bpy" in locals():
     imp.reload(ui)
     imp.reload(version_checker)
     imp.reload(oauth)
+    imp.reload(tasks_queue)
 else:
-    from blenderkit import paths, utils, categories, ui, oauth, version_checker
+    from blenderkit import paths, utils, categories, ui, oauth, version_checker, tasks_queue
 
 import blenderkit
 from bpy.app.handlers import persistent
@@ -91,6 +92,7 @@ def fetch_server_data():
     api_key = user_preferences.api_key
     # version_checker.check_version_thread(url, api_key, blenderkit)
     oauth.refresh_token_thread()
+    get_profile()
     categories.fetch_categories_thread(api_key)
 
 
@@ -177,7 +179,9 @@ def timer_update():  # TODO might get moved to handle all blenderkit stuff.
                                               'tooltip': tooltip,
                                               'tags': r['tags'],
                                               'can_download': r.get('canDownload', True),
-                                              'verification_status': r['verificationStatus']
+                                              'verification_status': r['verificationStatus'],
+                                              'author_id': str(r['author']['id'])
+                                              # 'author': r['author']['firstName'] + ' ' + r['author']['lastName']
                                               # 'description': r['description'],
                                               # 'author': r['description'],
                                               }
@@ -217,6 +221,7 @@ def timer_update():  # TODO might get moved to handle all blenderkit stuff.
                                 # results = rdata['results']
                 s[search_name] = result_field
                 s['search results'] = result_field
+                s[search_name + ' orig'] = rdata
                 s['search results orig'] = rdata
                 load_previews()
                 ui_props = bpy.context.scene.blenderkitUI
@@ -432,17 +437,35 @@ def generate_tooltip(mdata):
     # generator is for both upload preview and search, this is only after search
     if mdata.get('versionNumber'):
         # t = writeblockm(t, mdata, key='versionNumber', pretext='version')
-
-        t += 'author: %s %s\n' % (mdata['author']['firstName'], mdata['author']['lastName'])
-        # t += '\n'
+        a_id = mdata['author'].get('id')
+        if a_id != None:
+            adata = bpy.context.window_manager['bkit authors'].get(str(a_id))
+            if adata != None:
+                t += generate_author_textblock(adata)
 
     at = mdata['assetType']
     t += '\n'
+
+    return t
+
+def get_random_tip():
     if at == 'brush' or at == 'texture':
         t += 'click to link %s' % mdata['assetType']
     if at == 'model' or at == 'material':
-        t += 'click or drag in scene to link/append %s' % mdata['assetType']
-
+        tips = ['Click or drag in scene to link/append %s' % mdata['assetType'],
+                # "'A' key to search assets by same author",
+                "'W' key to open Authors webpage",
+                ]
+        tip = 'Tip: ' + random.choice(tips)
+        t = writeblock(t, tip)
+
+def generate_author_textblock(adata):
+    t = ''
+    if adata not in (None, ''):
+        t += 'author: %s %s\n' % (adata['firstName'], adata['lastName'])
+        t = writeblockm(t, adata, key='aboutMe', pretext='')
+        t += '\n'
+        t = writeblockm(t, adata, key='aboutMeUrl', pretext='')
     return t
 
 
@@ -492,6 +515,80 @@ class ThumbDownloader(threading.Thread):
             #         f.write(chunk)
 
 
+def write_author(a_id, adata):
+    utils.p('writing author back')
+    authors = bpy.context.window_manager['bkit authors']
+    if authors.get(a_id) in (None, ''):
+        adata['tooltip'] = generate_author_textblock
+        authors[a_id] = adata
+
+
+def fetch_author(a_id, api_key):
+    utils.p('fetch author')
+    try:
+        a_url = paths.get_api_url() + 'accounts/' + a_id + '/'
+        headers = utils.get_headers(api_key)
+        r = requests.get(a_url, headers=headers)
+        adata = r.json()
+        if not hasattr(adata, 'id'):
+            utils.p(adata)
+        # utils.p(adata)
+        tasks_queue.add_task((write_author, (a_id, adata)))
+    except Exception as e:
+        utils.p(e)
+    utils.p('finish fetch')
+
+
+def get_author(r):
+    a_id = str(r['author']['id'])
+    preferences = bpy.context.preferences.addons['blenderkit'].preferences
+
+    authors = bpy.context.window_manager.get('bkit authors', {})
+    if authors == {}:
+        bpy.context.window_manager['bkit authors'] = authors
+    a = authors.get(a_id)
+    if a is None or a is '':
+        authors[a_id] = ''
+        thread = threading.Thread(target=fetch_author, args=(a_id, preferences.api_key), daemon=True)
+        thread.start()
+    return a
+
+
+def write_profile(adata):
+    utils.p('writing profile')
+    utils.p(adata.keys())
+    adata['user']['sumAssetFilesSize'] = str(round(adata['user']['sumAssetFilesSize'] / 1024 / 1024)) + ' Mb'
+    adata['user']['sumPrivateAssetFilesSize'] = str(
+        round(adata['user']['sumPrivateAssetFilesSize'] / 1024 / 1024)) + ' Mb'
+    adata['user']['remainingPrivateQuota'] = str(round(adata['user']['remainingPrivateQuota'] / 1024 / 1024)) + ' Mb'
+    

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list