Uploading setting files to home project works.
This commit is contained in:
@@ -3,11 +3,15 @@ import asyncio
|
||||
import logging
|
||||
|
||||
import bpy
|
||||
import pathlib
|
||||
|
||||
import pillarsdk
|
||||
from pillarsdk import exceptions as sdk_exceptions
|
||||
from .pillar import pillar_call, check_pillar_credentials, PillarError
|
||||
from .pillar import pillar_call, check_pillar_credentials, PillarError, upload_file
|
||||
from . import async_loop
|
||||
|
||||
SETTINGS_FILES_TO_UPLOAD = ['bookmarks.txt', 'recent-files.txt', 'userpref.blend', 'startup.blend']
|
||||
|
||||
HOME_PROJECT_ENDPOINT = '/bcloud/home-project'
|
||||
SYNC_GROUP_NODE_NAME = 'Blender Sync'
|
||||
SYNC_GROUP_NODE_DESC = 'The [Blender Cloud Addon](https://cloud.blender.org/services' \
|
||||
@@ -66,24 +70,60 @@ class PILLAR_OT_sync(async_loop.AsyncModalOperatorMixin, bpy.types.Operator):
|
||||
return {'PASS_THROUGH'}
|
||||
|
||||
async def async_execute(self):
|
||||
self.user_id = await check_pillar_credentials()
|
||||
"""Entry point of the asynchronous operator."""
|
||||
|
||||
try:
|
||||
group_id = await self.find_sync_group_id()
|
||||
self.log.info('Found group node ID: %s', group_id)
|
||||
except sdk_exceptions.ForbiddenAccess as ex:
|
||||
self.log.exception('Unable to find Group ID')
|
||||
self.user_id = await check_pillar_credentials()
|
||||
try:
|
||||
self.home_project_id = await get_home_project_id()
|
||||
except sdk_exceptions.ForbiddenAccess:
|
||||
self.log.exception('Forbidden access to home project.')
|
||||
self.report({'ERROR'}, 'Did not get access to home project.')
|
||||
self._state = 'QUIT'
|
||||
return
|
||||
|
||||
try:
|
||||
self.sync_group_id = await self.find_sync_group_id()
|
||||
self.log.info('Found group node ID: %s', self.sync_group_id)
|
||||
except sdk_exceptions.ForbiddenAccess:
|
||||
self.log.exception('Unable to find Group ID')
|
||||
self.report({'ERROR'}, 'Unable to find sync folder.')
|
||||
self._state = 'QUIT'
|
||||
return
|
||||
|
||||
if self.action == 'PUSH':
|
||||
await self.action_push()
|
||||
else:
|
||||
self.report({'ERROR'}, 'Sorry, PULL not implemented yet.')
|
||||
except Exception as ex:
|
||||
self.log.exception('Unexpected exception caught.')
|
||||
self.report({'ERROR'}, 'Unexpected error: %s' % ex)
|
||||
|
||||
self._state = 'QUIT'
|
||||
|
||||
async def action_push(self):
|
||||
"""Sends files to the Pillar server."""
|
||||
|
||||
config_dir = pathlib.Path(bpy.utils.user_resource('CONFIG'))
|
||||
|
||||
for fname in SETTINGS_FILES_TO_UPLOAD:
|
||||
path = config_dir / fname
|
||||
if not path.exists():
|
||||
self.log.debug('Skipping non-existing %s', path)
|
||||
continue
|
||||
|
||||
self.report({'INFO'}, 'Uploading %s' % fname)
|
||||
await self.attach_file_to_group(path)
|
||||
|
||||
self.report({'INFO'}, 'Settings pushed to Blender Cloud.')
|
||||
|
||||
async def find_sync_group_id(self) -> pillarsdk.Node:
|
||||
"""Finds the group node in which to store sync assets.
|
||||
|
||||
If the group node doesn't exist, it creates it.
|
||||
"""
|
||||
|
||||
home_proj_id = await get_home_project_id()
|
||||
|
||||
node_props = {'project': home_proj_id,
|
||||
node_props = {'project': self.home_project_id,
|
||||
'node_type': 'group',
|
||||
'parent': None,
|
||||
'name': SYNC_GROUP_NODE_NAME,
|
||||
@@ -108,6 +148,28 @@ class PILLAR_OT_sync(async_loop.AsyncModalOperatorMixin, bpy.types.Operator):
|
||||
|
||||
return sync_group['_id']
|
||||
|
||||
async def attach_file_to_group(self, file_path: pathlib.Path) -> pillarsdk.Node:
|
||||
"""Creates an Asset node and attaches a file document to it."""
|
||||
|
||||
# First upload the file...
|
||||
file_id = await upload_file(self.home_project_id, file_path,
|
||||
future=self.signalling_future)
|
||||
# Then attach it to a new node.
|
||||
node_props = {'project': self.home_project_id,
|
||||
'node_type': 'asset',
|
||||
'parent': self.sync_group_id,
|
||||
'name': file_path.name,
|
||||
'properties': {'file': file_id},
|
||||
'user': self.user_id}
|
||||
node = pillarsdk.Node.new(node_props)
|
||||
created_ok = await pillar_call(node.create)
|
||||
if not created_ok:
|
||||
log.error('Blender Cloud addon: unable to create asset node on the Cloud for file %s.',
|
||||
file_path)
|
||||
raise PillarError('Unable to create asset node on the Cloud for file %s' % file_path)
|
||||
|
||||
return node
|
||||
|
||||
|
||||
def draw_userpref_header(self: bpy.types.USERPREF_HT_header, context):
|
||||
"""Adds some buttons to the userprefs header."""
|
||||
|
Reference in New Issue
Block a user