Include HDRi projects in /bcloud/texture-libraries
This depends on the version of the Blender Cloud Addon, which will be sent as Blender-Cloud-Addon HTTP header in a future version of the addon.
This commit is contained in:
@@ -1,3 +1,27 @@
|
||||
from flask import request
|
||||
from werkzeug import exceptions as wz_exceptions
|
||||
|
||||
|
||||
def blender_cloud_addon_version():
|
||||
"""Returns the version of the Blender Cloud Addon, or None if not given in the request.
|
||||
|
||||
Uses the 'Blender-Cloud-Addon' HTTP header.
|
||||
|
||||
:returns: the version of the addon, as tuple (major, minor, micro)
|
||||
:rtype: tuple or None
|
||||
:raises: werkzeug.exceptions.BadRequest if the header is malformed.
|
||||
"""
|
||||
|
||||
header = request.headers.get('Blender-Cloud-Addon')
|
||||
if not header:
|
||||
return None
|
||||
|
||||
parts = header.split('.')
|
||||
try:
|
||||
return tuple(int(part) for part in parts)
|
||||
except ValueError:
|
||||
raise wz_exceptions.BadRequest('Invalid Blender-Cloud-Addon header')
|
||||
|
||||
|
||||
def setup_app(app, url_prefix):
|
||||
from . import texture_libs, home_project
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import functools
|
||||
import logging
|
||||
|
||||
from flask import Blueprint, request, current_app, g
|
||||
@@ -9,6 +10,7 @@ from werkzeug.exceptions import InternalServerError
|
||||
from application import utils
|
||||
from application.utils.authorization import require_login
|
||||
|
||||
FIRST_ADDON_VERSION_WITH_HDRI = (1, 4, 0)
|
||||
TL_PROJECTION = utils.dumps({'name': 1, 'url': 1, 'permissions': 1,})
|
||||
TL_SORT = utils.dumps([('name', 1)])
|
||||
|
||||
@@ -60,15 +62,22 @@ def keep_fetching_texture_libraries(proj_filter):
|
||||
@blueprint.route('/texture-libraries')
|
||||
@require_login()
|
||||
def texture_libraries():
|
||||
from . import blender_cloud_addon_version
|
||||
|
||||
# Use Eve method so that we get filtering on permissions for free.
|
||||
# This gives all the projects that contain the required node types.
|
||||
|
||||
request.args = MultiDict(request.args) # allow changes; it's an ImmutableMultiDict by default.
|
||||
request.args.setlist(eve_config.QUERY_PROJECTION, [TL_PROJECTION])
|
||||
request.args.setlist(eve_config.QUERY_SORT, [TL_SORT])
|
||||
|
||||
# Determine whether to return HDRi projects too, based on the version
|
||||
# of the Blender Cloud Addon. If the addon version is None, we're dealing
|
||||
# with a version of the BCA that's so old it doesn't send its version along.
|
||||
return_hdri = blender_cloud_addon_version() > FIRST_ADDON_VERSION_WITH_HDRI
|
||||
accept_as_library = functools.partial(has_texture_node, return_hdri=return_hdri)
|
||||
|
||||
# Construct eve-like response.
|
||||
projects = list(keep_fetching_texture_libraries(has_texture_node))
|
||||
projects = list(keep_fetching_texture_libraries(accept_as_library))
|
||||
result = {'_items': projects,
|
||||
'_meta': {
|
||||
'max_results': len(projects),
|
||||
@@ -79,13 +88,18 @@ def texture_libraries():
|
||||
return utils.jsonify(result)
|
||||
|
||||
|
||||
def has_texture_node(proj):
|
||||
def has_texture_node(proj, return_hdri=True):
|
||||
"""Returns True iff the project has a top-level (group)texture node."""
|
||||
|
||||
nodes_collection = current_app.data.driver.db['nodes']
|
||||
|
||||
# See which types of nodes we support.
|
||||
node_types = ['group_texture']
|
||||
if return_hdri:
|
||||
node_types.append('hdri')
|
||||
|
||||
count = nodes_collection.count(
|
||||
{'node_type': 'group_texture',
|
||||
{'node_type': {'$in': node_types},
|
||||
'project': proj['_id'],
|
||||
'parent': None})
|
||||
return count > 0
|
||||
|
Reference in New Issue
Block a user