fix [#25262] Keyboard shortcut presets can't be made because of wrong folder

New create option when getting a user resource for creating paths.
  bpy.utils.user_resource(type, path, create=False)
This commit is contained in:
Campbell Barton 2010-12-18 07:22:52 +00:00
parent 96dfaa215c
commit 77c17d332d
4 changed files with 44 additions and 27 deletions

@ -23,8 +23,9 @@ This module contains utility functions specific to blender but
not assosiated with blenders internal data.
"""
from _bpy import blend_paths, user_resource
from _bpy import blend_paths
from _bpy import script_paths as _bpy_script_paths
from _bpy import user_resource as _user_resource
import bpy as _bpy
import os as _os
@ -559,3 +560,36 @@ def keyconfig_set(filepath):
keyconfigs.active = kc_new
def user_resource(type, path, create=False):
"""
Return a user resource path (normally from the users home directory).
:arg type: Resource type in ['DATAFILES', 'CONFIG', 'SCRIPTS', 'AUTOSAVE'].
:type type: string
:arg subdir: Optional subdirectory.
:type subdir: string
:arg create: Treat the path as a directory and create it if its not existing.
:type create: boolean
:return: a path.
:rtype: string
"""
target_path = _user_resource(type, path)
if create:
# should always be true.
if target_path:
# create path if not existing.
if not _os.path.exists(target_path):
try:
_os.makedirs(target_path)
except:
import traceback
traceback.print_exc()
target_path = ""
elif not _os.path.isdir(target_path):
print("Path %r found but isn't a directory!" % path)
target_path = ""
return target_path

@ -49,13 +49,17 @@ class AddPresetBase():
preset_menu_class = getattr(bpy.types, self.preset_menu)
if not self.remove_active:
if not self.name:
return {'FINISHED'}
filename = self.as_filename(self.name)
target_path = bpy.utils.preset_paths(self.preset_subdir)[0] # we need some way to tell the user and system preset path
target_path = bpy.utils.user_resource('SCRIPTS', os.path.join("presets", self.preset_subdir), create=True)
if not target_path:
self.report({'WARNING'}, "Failed to create presets path")
return {'CANCELLED'}
filepath = os.path.join(target_path, filename) + ".py"

@ -1133,23 +1133,12 @@ class WM_OT_addon_install(bpy.types.Operator):
pyfile = self.filepath
# dont use bpy.utils.script_paths("addons") because we may not be able to write to it.
path_addons = bpy.utils.user_resource('SCRIPTS', 'addons')
path_addons = bpy.utils.user_resource('SCRIPTS', "addons", create=True)
# should never happen.
if not path_addons:
self.report({'WARNING'}, "Failed to get addons path\n")
return {'CANCELLED'}
# create path if not existing.
if not os.path.exists(path_addons):
try:
os.makedirs(path_addons)
except:
self.report({'WARNING'}, "Failed to create %r\n" % path_addons)
traceback.print_exc()
return {'CANCELLED'}
contents = set(os.listdir(path_addons))
#check to see if the file is in compressed format (.zip)

@ -121,17 +121,7 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
}
static char bpy_user_resource_doc[] =
".. function:: user_resource(type, subdir)\n"
"\n"
" Returns a list of paths to external files referenced by the loaded .blend file.\n"
"\n"
" :arg type: Resource type in ['DATAFILES', 'CONFIG', 'SCRIPTS', 'AUTOSAVE'].\n"
" :type type: string\n"
" :arg subdir: Optional subdirectory.\n"
" :type subdir: string\n"
" :return: a path.\n"
" :rtype: string\n";
// static char bpy_user_resource_doc[] = // now in bpy/utils.py
static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
char *type;
@ -165,7 +155,7 @@ static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObj
static PyMethodDef meth_bpy_script_paths = {"script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc};
static PyMethodDef meth_bpy_blend_paths = {"blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc};
static PyMethodDef meth_bpy_user_resource = {"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, bpy_user_resource_doc};
static PyMethodDef meth_bpy_user_resource = {"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, NULL};
static void bpy_import_test(const char *modname)
{