BlenderKit: fetch user's ratings from server

by now enabled only for validators, to test performance. Also shows to validator which assets were not yet rated by them.
This commit is contained in:
Vilem Duha 2021-05-21 14:44:11 +02:00 committed by Jeroen Bakker
parent 40112c2d37
commit 6a81558b63
Notes: blender-bot 2023-02-13 14:30:28 +01:00
Referenced by issue blender/blender#88449: Blender LTS: Maintenance Task 2.93
Referenced by issue blender/blender#88449, Blender LTS: Maintenance Task 2.93
4 changed files with 117 additions and 70 deletions

View File

@ -58,6 +58,9 @@ def upload_review_thread(url, reviews, headers):
# print('reviews upload failed: %s' % str(e))
def upload_rating(asset):
user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
api_key = user_preferences.api_key

View File

@ -68,6 +68,12 @@ def send_rating_to_thread_work_hours(url, ratings, headers):
thread.start()
def store_rating_local_empty(asset_id):
context = bpy.context
context.window_manager['asset ratings'] = context.window_manager.get('asset ratings', {})
context.window_manager['asset ratings'][asset_id] = context.window_manager['asset ratings'].get(asset_id, {})
def store_rating_local(asset_id, type='quality', value=0):
context = bpy.context
context.window_manager['asset ratings'] = context.window_manager.get('asset ratings', {})
@ -75,6 +81,36 @@ def store_rating_local(asset_id, type='quality', value=0):
context.window_manager['asset ratings'][asset_id][type] = value
def get_rating(asset_id, headers):
'''
Retrieve ratings from BlenderKit server. Can be run from a thread
Parameters
----------
asset_id
headers
Returns
-------
ratings - dict of type:value ratings
'''
url = paths.get_api_url() + 'assets/' + asset_id + '/rating/'
params = {}
r = rerequests.get(url, params=params, verify=True, headers=headers)
print(r.text)
rj = r.json()
ratings = {}
# store ratings - send them to task queue
for r in rj['results']:
ratings[r['ratingType']] = r['score']
tasks_queue.add_task((store_rating_local,(asset_id, r['ratingType'], r['score'])))
# store_rating_local(asset_id, type = r['ratingType'], value = r['score'])
if len(rj['results'])==0:
# store empty ratings too, so that server isn't checked repeatedly
tasks_queue.add_task((store_rating_local_empty,(asset_id,)))
return ratings
def get_rating_local(asset_id):
context = bpy.context
context.window_manager['asset ratings'] = context.window_manager.get('asset ratings', {})
@ -246,61 +282,67 @@ class RatingsProperties():
high_rating_warning = "This is a high rating, please be sure to give such rating only to amazing assets"
possible_wh_values = [0,.5,1,2,3,4,5,6,8,10,15,20,30,50,100,150,200,250]
items_models = [('0', '0', ''),
('.5', '0.5', ''),
('1', '1', ''),
('2', '2', ''),
('3', '3', ''),
('4', '4', ''),
('5', '5', ''),
('6', '6', ''),
('8', '8', ''),
('10', '10', ''),
('15', '15', ''),
('20', '20', ''),
('30', '30', high_rating_warning),
('50', '50', high_rating_warning),
('100', '100', high_rating_warning),
('150', '150', high_rating_warning),
('200', '200', high_rating_warning),
('250', '250', high_rating_warning),
]
rating_work_hours_ui: EnumProperty(name="Work Hours",
description="How many hours did this work take?",
items=[('0', '0', ''),
('.5', '0.5', ''),
('1', '1', ''),
('2', '2', ''),
('3', '3', ''),
('4', '4', ''),
('5', '5', ''),
('6', '6', ''),
('8', '8', ''),
('10', '10', ''),
('15', '15', ''),
('20', '20', ''),
('30', '30', high_rating_warning),
('50', '50', high_rating_warning),
('100', '100', high_rating_warning),
('150', '150', high_rating_warning),
('200', '200', high_rating_warning),
('250', '250', high_rating_warning),
],
items=items_models,
default='0', update=update_ratings_work_hours_ui,
options={'SKIP_SAVE'}
)
possible_wh_values_1_5 = [0,.2, .5,1,2,3,4,5]
items_1_5 = [('0', '0', ''),
('.2', '0.2', ''),
('.5', '0.5', ''),
('1', '1', ''),
('2', '2', ''),
('3', '3', ''),
('4', '4', ''),
('5', '5', '')
]
rating_work_hours_ui_1_5: EnumProperty(name="Work Hours",
description="How many hours did this work take?",
items=[('0', '0', ''),
('.2', '0.2', ''),
('.5', '0.5', ''),
('1', '1', ''),
('2', '2', ''),
('3', '3', ''),
('4', '4', ''),
('5', '5', '')
],
items=items_1_5,
default='0',
update=update_ratings_work_hours_ui_1_5,
options={'SKIP_SAVE'}
)
possible_wh_values_1_10 = [0,1,2,3,4,5,6,7,8,9,10]
items_1_10= [('0', '0', ''),
('1', '1', ''),
('2', '2', ''),
('3', '3', ''),
('4', '4', ''),
('5', '5', ''),
('6', '6', ''),
('7', '7', ''),
('8', '8', ''),
('9', '9', ''),
('10', '10', '')
]
rating_work_hours_ui_1_10: EnumProperty(name="Work Hours",
description="How many hours did this work take?",
items=[('0', '0', ''),
('1', '1', ''),
('2', '2', ''),
('3', '3', ''),
('4', '4', ''),
('5', '5', ''),
('6', '6', ''),
('7', '7', ''),
('8', '8', ''),
('9', '9', ''),
('10', '10', '')
],
items= items_1_10,
default='0',
update=update_ratings_work_hours_ui_1_10,
options={'SKIP_SAVE'}
@ -313,8 +355,10 @@ class RatingsProperties():
self.rating_quality = ratings['quality']
if ratings and ratings.get('working_hours'):
wh = int(ratings['working_hours'])
self.rating_work_hours_ui = str(wh)
if wh < 6:
self.rating_work_hours_ui_1_5 = str(int(ratings['working_hours']))
if wh < 11:
self.rating_work_hours_ui_1_10 = str(int(ratings['working_hours']))
whs = str(wh)
if wh in self.possible_wh_values:
self.rating_work_hours_ui = whs
if wh < 6 and wh in self.possible_wh_values_1_5:
self.rating_work_hours_ui_1_5 = whs
if wh < 11 and wh in self.possible_wh_values_1_10:
self.rating_work_hours_ui_1_10 = whs

View File

@ -17,7 +17,7 @@
# ##### END GPL LICENSE BLOCK #####
from blenderkit import paths, utils, categories, ui, colors, bkit_oauth, version_checker, tasks_queue, rerequests, \
resolutions, image_utils
resolutions, image_utils, ratings_utils
import blenderkit
from bpy.app.handlers import persistent
@ -428,6 +428,7 @@ def search_timer():
rdata = thread[0].result
result_field = []
ok, error = check_errors(rdata)
if ok:
ui_props = bpy.context.scene.blenderkitUI
@ -435,22 +436,18 @@ def search_timer():
if not ui_props.assetbar_on:
bpy.ops.object.run_assetbar_fix_context()
user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
api_key = user_preferences.api_key
headers = utils.get_headers(api_key)
for r in rdata['results']:
asset_data = parse_result(r)
if asset_data != None:
result_field.append(asset_data)
# Get ratings from BlenderKit server
user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
api_key = user_preferences.api_key
headers = utils.get_headers(api_key)
if utils.profile_is_validator():
for r in rdata['results']:
if ratings_utils.get_rating_local(asset_data['id']) is None:
rating_thread = threading.Thread(target=ratings_utils.get_rating, args=([r['id'], headers]), daemon=True)
rating_thread.start()
if utils.profile_is_validator() and ratings_utils.get_rating_local(asset_data['id']) is None:
thread = threading.Thread(target=ratings_utils.get_rating, args=([asset_data['id'], headers]), daemon=True)
thread.start()
wm[search_name] = result_field
wm['search results'] = result_field

View File

@ -18,7 +18,7 @@
from blenderkit import paths, ratings, utils, search, upload, ui_bgl, download, bg_blender, colors, tasks_queue, \
ui_panels, icons
ui_panels, icons, ratings_utils
import bpy
@ -272,7 +272,7 @@ def draw_text_block(x=0, y=0, width=40, font_size=10, line_height=15, text='', c
ui_bgl.draw_text(l, x, ytext, font_size, color)
def draw_tooltip(x, y, name='', author='', quality = '-', img=None, gravatar=None):
def draw_tooltip(x, y, name='', author='', quality='-', img=None, gravatar=None):
region = bpy.context.region
scale = bpy.context.preferences.view.ui_scale
t = time.time()
@ -282,12 +282,12 @@ def draw_tooltip(x, y, name='', author='', quality = '-', img=None, gravatar=Non
x += 20
y -= 20
#first get image size scaled
# first get image size scaled
isizex = int(512 * scale * img.size[0] / min(img.size[0], img.size[1]))
isizey = int(512 * scale * img.size[1] / min(img.size[0], img.size[1]))
ttipmargin = 5 * scale
#then do recurrent re-scaling, to know where to fit the tooltip
# then do recurrent re-scaling, to know where to fit the tooltip
estimated_height = 2 * ttipmargin + isizey
if estimated_height > y:
scaledown = y / (estimated_height)
@ -304,7 +304,6 @@ def draw_tooltip(x, y, name='', author='', quality = '-', img=None, gravatar=Non
else:
overlay_height_base = 70
overlay_height = overlay_height_base * scale
name_height = int(20 * scale)
@ -338,15 +337,14 @@ def draw_tooltip(x, y, name='', author='', quality = '-', img=None, gravatar=Non
ui_bgl.draw_rect(x - ttipmargin,
y - 2 * ttipmargin - isizey,
isizex + ttipmargin * 2,
ttipmargin + overlay_height ,
ttipmargin + overlay_height,
background_overlay)
#draw name
# draw name
name_x = x + textmargin
name_y = y - isizey + overlay_height - textmargin - name_height
ui_bgl.draw_text(name, name_x, name_y, name_height, textcol)
# draw gravatar
author_x_text = x + isizex - textmargin
gravatar_size = overlay_height - 2 * textmargin
@ -357,7 +355,7 @@ def draw_tooltip(x, y, name='', author='', quality = '-', img=None, gravatar=Non
gravatar_y, # + textmargin,
gravatar_size, gravatar_size, gravatar, 1)
#draw author's name
# draw author's name
author_text_size = int(name_height * .7)
ui_bgl.draw_text(author, author_x_text, gravatar_y, author_text_size, textcol, ralign=True)
@ -368,7 +366,6 @@ def draw_tooltip(x, y, name='', author='', quality = '-', img=None, gravatar=Non
ui_bgl.draw_text(str(quality), name_x + quality_text_size + 5, gravatar_y, quality_text_size, textcol)
def draw_tooltip_with_author(asset_data, x, y):
# TODO move this lazy loading into a function and don't duplicate through the code
@ -387,7 +384,7 @@ def draw_tooltip_with_author(asset_data, x, y):
aname = asset_data['displayName']
aname = aname[0].upper() + aname[1:]
if len(aname)>36:
if len(aname) > 36:
aname = f"{aname[:33]}..."
rc = asset_data.get('ratingsCount')
@ -399,7 +396,7 @@ def draw_tooltip_with_author(asset_data, x, y):
if rcount > show_rating_threshold:
quality = round(asset_data['ratingsAverage'].get('quality'))
draw_tooltip(x, y, name=aname, author=f"by {a['firstName']} {a['lastName']}", quality= quality, img=img,
draw_tooltip(x, y, name=aname, author=f"by {a['firstName']} {a['lastName']}", quality=quality, img=img,
gravatar=gimg)
@ -700,6 +697,12 @@ def draw_asset_bar(self, context):
# pcoll = icons.icon_collections["main"]
# v_icon = pcoll['rejected']
v_icon = verification_icons[result.get('verificationStatus', 'validated')]
if v_icon is None and utils.profile_is_validator():
# poke for validators to rate
if ratings_utils.get_rating_local(result['id']) in (None, {}):
v_icon = 'star_grey.png'
if v_icon is not None:
img = utils.get_thumbnail(v_icon)
ui_bgl.draw_image(x + ui_props.thumb_size - 26, y + 2, 24, 24, img, 1)
@ -1271,7 +1274,7 @@ class AssetBarOperator(bpy.types.Operator):
export_data, upload_data = upload.get_upload_data(context=context, asset_type=ui_props.asset_type)
if upload_data:
# print(upload_data)
ui_props.tooltip = upload_data['displayName']#search.generate_tooltip(upload_data)
ui_props.tooltip = upload_data['displayName'] # search.generate_tooltip(upload_data)
return {'PASS_THROUGH'}
@ -1424,7 +1427,7 @@ class AssetBarOperator(bpy.types.Operator):
mx = event.mouse_x - r.x
my = event.mouse_y - r.y
if event.value == 'PRESS' and mouse_in_asset_bar(mx, my) and ui_props.active_index>-1:
if event.value == 'PRESS' and mouse_in_asset_bar(mx, my) and ui_props.active_index > -1:
# context.window.cursor_warp(event.mouse_x - 300, event.mouse_y - 10);
bpy.ops.wm.blenderkit_asset_popup('INVOKE_DEFAULT')