diff options
author | Vilem Duha <vilem.duha@gmail.com> | 2021-10-11 14:30:38 +0300 |
---|---|---|
committer | Vilem Duha <vilem.duha@gmail.com> | 2021-10-11 14:30:48 +0300 |
commit | 884f7761807b8ae6c0ba35830efa4e8b570fe3f9 (patch) | |
tree | 97d084f2728bdf97f99cce4eed72270fbeaeca7d /blenderkit | |
parent | 50e38d250deabf02375b6603155b0f0209941530 (diff) |
BlenderKit: fist steps to comments integration
Diffstat (limited to 'blenderkit')
-rw-r--r-- | blenderkit/__init__.py | 2 | ||||
-rw-r--r-- | blenderkit/comments_utils.py | 84 | ||||
-rw-r--r-- | blenderkit/ratings_utils.py | 2 | ||||
-rw-r--r-- | blenderkit/resolutions.py | 15 | ||||
-rw-r--r-- | blenderkit/ui_panels.py | 55 |
5 files changed, 136 insertions, 22 deletions
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_manager.get('asset comments', {}) + self.comments = comments.get(asset_data['assetBaseId'], []) + return wm.invoke_popup(self, width=self.width) |