[Bf-extensions-cvs] [884f7761] master: BlenderKit: fist steps to comments integration

Vilem Duha noreply at git.blender.org
Mon Oct 11 13:31:11 CEST 2021


Commit: 884f7761807b8ae6c0ba35830efa4e8b570fe3f9
Author: Vilem Duha
Date:   Mon Oct 11 13:30:38 2021 +0200
Branches: master
https://developer.blender.org/rBA884f7761807b8ae6c0ba35830efa4e8b570fe3f9

BlenderKit: fist steps to comments integration

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

M	blenderkit/__init__.py
M	blenderkit/comments_utils.py
M	blenderkit/ratings_utils.py
M	blenderkit/resolutions.py
M	blenderkit/ui_panels.py

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

diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py
index 9c9e0780..3fc15f3b 100644
--- a/blenderkit/__init__.py
+++ b/blenderkit/__init__.py
@@ -50,6 +50,7 @@ if "bpy" in locals():
     paths = reload(paths)
     ratings = reload(ratings)
     ratings_utils = reload(ratings_utils)
+    comments_utils = reload(comments_utils)
     resolutions = reload(resolutions)
     search = reload(search)
     tasks_queue = reload(tasks_queue)
@@ -86,6 +87,7 @@ else:
     from blenderkit import paths
     from blenderkit import ratings
     from blenderkit import ratings_utils
+    from blenderkit import comments_utils
     from blenderkit import resolutions
     from blenderkit import search
     from blenderkit import tasks_queue
diff --git a/blenderkit/comments_utils.py b/blenderkit/comments_utils.py
index 8f2b4bcf..121beeb1 100644
--- a/blenderkit/comments_utils.py
+++ b/blenderkit/comments_utils.py
@@ -20,22 +20,82 @@
 import bpy
 from blenderkit import utils, paths, tasks_queue, rerequests
 
+import threading
+import requests
+import logging
 
+bk_logger = logging.getLogger('blenderkit')
 
-from blenderkit import rerequests
-user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
-api_key = user_preferences.api_key
-headers = utils.get_headers(api_key)
-r = rerequests.get(f"{api_url}/comments/assets-uuidasset/{asset_data['assetBaseId']}/", headers = headers)
-r= r.json()
-print(r)
 
+def upload_comment_thread(url, comment='', headers=None):
+    ''' Upload rating thread function / disconnected from blender data.'''
+    bk_logger.debug('upload comment ' + comment)
 
-def store_comments_local(asset_id, type='quality', value=0):
+    # rating_url = url + rating_name + '/'
+    data = {
+        "content_type": "",
+        "object_pk": "",
+        "timestamp": "",
+        "security_hash": "",
+        "honeypot": "",
+        "name": "",
+        "email": "",
+        "url": "",
+        "comment": comment,
+        "followup": False,
+        "reply_to": None
+    }
+
+    # try:
+    r = rerequests.put(url, data=data, verify=True, headers=headers)
+    print(r)
+    print(dir(r))
+    print(r.text)
+    # except requests.exceptions.RequestException as e:
+    #     print('ratings upload failed: %s' % str(e))
+
+
+def upload_comment_flag_thread(url, comment_id='', flag='like', headers=None):
+    ''' Upload rating thread function / disconnected from blender data.'''
+    bk_logger.debug('upload comment flag' + str(comment_id))
+
+    # rating_url = url + rating_name + '/'
+    data = {
+        "comment": comment_id,
+        "flag": flag,
+    }
+
+    # try:
+    r = rerequests.post(url, data=data, verify=True, headers=headers)
+    print(r)
+    print(dir(r))
+    print(r.text)
+    # except requests.exceptions.RequestException as e:
+    #     print('ratings upload failed: %s' % str(e))
+
+
+def send_comment_to_thread(url, comment, headers):
+    '''Sens rating into thread rating, main purpose is for tasks_queue.
+    One function per property to avoid lost data due to stashing.'''
+    thread = threading.Thread(target=upload_comment_thread, args=(url, comment, headers))
+    thread.start()
+
+
+def store_comments_local(asset_id, comments):
+    context = bpy.context
+    ac = context.window_manager.get('asset comments', {})
+    ac[asset_id] = comments
+    context.window_manager['asset comments'] = ac
+
+
+def get_comments_local(asset_id):
     context = bpy.context
-    ar   = context.window_manager['asset comments']
-    ar[asset_id] = ar.get(asset_id, {})
-    ar[asset_id][type] = value
+    context.window_manager['asset comments'] = context.window_manager.get('asset comments', {})
+    comments = context.window_manager['asset comments'].get(asset_id)
+    if comments:
+        return comments
+    return None
+
 
 def get_comments(asset_id, headers):
     '''
@@ -59,7 +119,7 @@ def get_comments(asset_id, headers):
         comments = []
         # store comments - send them to task queue
 
-        tasks_queue.add_task((store_comments_local,(asset_id, rj['results'])))
+        tasks_queue.add_task((store_comments_local, (asset_id, rj['results'])))
 
         # if len(rj['results'])==0:
         #     # store empty ratings too, so that server isn't checked repeatedly
diff --git a/blenderkit/ratings_utils.py b/blenderkit/ratings_utils.py
index 67a79139..eafa60fa 100644
--- a/blenderkit/ratings_utils.py
+++ b/blenderkit/ratings_utils.py
@@ -78,7 +78,7 @@ def store_rating_local(asset_id, type='quality', value=0):
     context = bpy.context
     ar   = context.window_manager['asset ratings']
     ar[asset_id] = ar.get(asset_id, {})
-    ar[asset_id][type] = value
+    ar[asset_id]['type'] = value
 
 
 def get_rating(asset_id, headers):
diff --git a/blenderkit/resolutions.py b/blenderkit/resolutions.py
index f92f68c6..23aa939d 100644
--- a/blenderkit/resolutions.py
+++ b/blenderkit/resolutions.py
@@ -171,11 +171,13 @@ def unpack_asset(data):
     #mark asset browser asset
     data_block = None
     if asset_data['assetType'] == 'model':
-        
-        for c in bpy.data.collections:
-            if c.get('asset_data') is not None:
-                c.asset_mark()
-                data_block = c
+        for ob in bpy.data.objects:
+            if ob.parent is None and ob in bpy.context.visible_objects:
+                ob.asset_mark()
+        # for c in bpy.data.collections:
+        #     if c.get('asset_data') is not None:
+        #         c.asset_mark()
+        #         data_block = c
     elif asset_data['assetType'] == 'material':
         for m in bpy.data.materials:
             m.asset_mark()
@@ -197,9 +199,10 @@ def unpack_asset(data):
     # if this isn't here, blender crashes when saving file.
     bpy.context.preferences.filepaths.file_preview_type = 'NONE'
 
-    bpy.ops.wm.save_mainfile(compress=False)
+    bpy.ops.wm.save_as_mainfile(filepath = bpy.data.filepath, compress=False)
     # now try to delete the .blend1 file
     try:
+
         os.remove(bpy.data.filepath + '1')
     except Exception as e:
         print(e)
diff --git a/blenderkit/ui_panels.py b/blenderkit/ui_panels.py
index f65833ed..0e8630b5 100644
--- a/blenderkit/ui_panels.py
+++ b/blenderkit/ui_panels.py
@@ -17,7 +17,8 @@
 # ##### END GPL LICENSE BLOCK #####
 
 
-from blenderkit import paths, ratings, ratings_utils, utils, download, categories, icons, search, resolutions, ui, \
+from blenderkit import paths, comments_utils, ratings, ratings_utils, utils, download, categories, icons, search, \
+    resolutions, ui, \
     tasks_queue, \
     autothumb, upload
 
@@ -870,6 +871,7 @@ class VIEW3D_PT_blenderkit_advanced_material_search(Panel):
             row.prop(props, "search_file_size_max", text='Max')
         layout.prop(props, "quality_limit", slider=True)
 
+
 class VIEW3D_PT_blenderkit_advanced_HDR_search(Panel):
     bl_category = "BlenderKit"
     bl_idname = "VIEW3D_PT_blenderkit_advanced_HDR_search"
@@ -895,7 +897,6 @@ class VIEW3D_PT_blenderkit_advanced_HDR_search(Panel):
         layout.prop(props, "true_hdr")
 
 
-
 class VIEW3D_PT_blenderkit_categories(Panel):
     bl_category = "BlenderKit"
     bl_idname = "VIEW3D_PT_blenderkit_categories"
@@ -1199,7 +1200,7 @@ class BlenderKitWelcomeOperator(bpy.types.Operator):
                 props = bpy.context.window_manager.blenderkit_models
                 score_limit = 1000
 
-            props.search_keywords = ''#random_search[1]
+            props.search_keywords = ''  # random_search[1]
             props.search_keywords += f'+is_free:true+score_gte:{score_limit}+order:-created'  # random_search[1]
             # search.search()
         return {'FINISHED'}
@@ -1938,6 +1939,37 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingsProperties):
             push_op_left(name_row, strength=3)
             op = name_row.operator('view3d.close_popup_button', text='', icon='CANCEL')
 
+    def draw_comment(self, context, layout, comment, width=330):
+        box = layout.box()
+        box.emboss = 'NORMAL'
+        is_moderator = comment['userModerator']
+        if is_moderator:
+            role_text = f" - moderator"
+        else:
+            role_text = ""
+        box.label(text=f"{comment['submitDate']} - {comment['userName']}{role_text}")
+        utils.label_multiline(box, text=comment['comment'], width = width)
+        removal = False
+        likes = 0
+        dislikes = 0
+        for l in comment['flags']:
+            if l['flag'] == 'like':
+                likes +=1
+            if l['flag'] == 'dislike':
+                dislikes +=1
+            if l['flag'] == 'removal':
+                removal = True
+        row = box.row()
+
+        row.label(text = str(likes), icon = 'TRIA_UP')
+        row.label(text = str(dislikes), icon = 'TRIA_DOWN')
+        if removal:
+            row.label(text = '', icon = 'ERROR')
+
+
+        #box.label(text=str(comment['flags']))
+
+
     def draw(self, context):
         layout = self.layout
         # top draggable bar with name of the asset
@@ -1963,6 +1995,12 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingsProperties):
 
         tip_box = layout.box()
         tip_box.label(text=self.tip)
+        # comments
+        if utils.profile_is_validator() and bpy.app.debug_value == 2:
+            if self.comments is not None:
+                for comment in self.comments:
+                    self.draw_comment(context, layout, comment)
+
 
     def execute(self, context):
         wm = context.window_manager
@@ -1993,6 +2031,17 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingsProperties):
         # pre-fill ratings
         self.prefill_ratings()
 
+        # get comments
+        if utils.profile_is_validator() and bpy.app.debug_value == 2:
+            user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
+            api_key = user_preferences.api_key
+            headers = utils.get_headers(api_key)
+            comments = comments_utils.get_comments_local(asset_data['assetBaseId'])
+            if comments is None:
+                comments_utils.get_comments(asset_data['assetBaseId'], headers)
+                comments = bpy.context.window_mana

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list