Addon: actually allow setting the job storage path
This commit is contained in:
parent
1fcbba79d7
commit
6764ee8259
@ -39,6 +39,8 @@ class FLAMENCO_PT_job_submission(bpy.types.Panel):
|
|||||||
|
|
||||||
col = layout.column(align=True)
|
col = layout.column(align=True)
|
||||||
col.prop(context.scene, "flamenco_job_name", text="Job Name")
|
col.prop(context.scene, "flamenco_job_name", text="Job Name")
|
||||||
|
row = col.row(align=True)
|
||||||
|
row.prop(context.scene, "flamenco_job_storage", text="Job Storage")
|
||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
|
@ -68,34 +68,6 @@ def set_blend_file(
|
|||||||
job.settings[BLENDFILE_SETTING_KEY] = str(blendfile)
|
job.settings[BLENDFILE_SETTING_KEY] = str(blendfile)
|
||||||
|
|
||||||
|
|
||||||
def eval_hidden_settings(
|
|
||||||
context: bpy.types.Context, job_type: _AvailableJobType, job: _SubmittedJob
|
|
||||||
) -> None:
|
|
||||||
"""Assign values to settings hidden from the UI.
|
|
||||||
|
|
||||||
If the setting has an `eval` property, it'll be evaluated and used as the
|
|
||||||
setting value. Otherwise the default is used.
|
|
||||||
"""
|
|
||||||
for setting in job_type.settings:
|
|
||||||
if setting.get("visible", True):
|
|
||||||
# Skip those settings that will be visible in the GUI.
|
|
||||||
continue
|
|
||||||
|
|
||||||
setting_eval = setting.get("eval", "")
|
|
||||||
if setting_eval:
|
|
||||||
value = JobTypePropertyGroup.eval_setting(
|
|
||||||
context, job, setting.key, setting_eval
|
|
||||||
)
|
|
||||||
elif "default" in setting:
|
|
||||||
value = setting.default
|
|
||||||
else:
|
|
||||||
# No way to get a default value, so just don't bother overwriting
|
|
||||||
# anything.
|
|
||||||
continue
|
|
||||||
|
|
||||||
job.settings[setting.key] = value
|
|
||||||
|
|
||||||
|
|
||||||
def submit_job(job: _SubmittedJob, api_client: _ApiClient) -> _Job:
|
def submit_job(job: _SubmittedJob, api_client: _ApiClient) -> _Job:
|
||||||
"""Send the given job to Flamenco Manager."""
|
"""Send the given job to Flamenco Manager."""
|
||||||
from flamenco.manager import ApiClient
|
from flamenco.manager import ApiClient
|
||||||
|
@ -115,6 +115,31 @@ class JobTypePropertyGroup:
|
|||||||
raise SettingEvalError(setting_key, setting_eval, eval_locals, ex) from ex
|
raise SettingEvalError(setting_key, setting_eval, eval_locals, ex) from ex
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def eval_hidden_settings_of_job(
|
||||||
|
self, context: bpy.types.Context, job: _SubmittedJob
|
||||||
|
) -> None:
|
||||||
|
"""Assign values to settings hidden from the UI.
|
||||||
|
|
||||||
|
If the setting has an `eval` property, it'll be evaluated and used as the
|
||||||
|
setting value. Otherwise the default is used.
|
||||||
|
"""
|
||||||
|
for setting in self.job_type.settings:
|
||||||
|
if setting.get("visible", True):
|
||||||
|
# Skip those settings that will be visible in the GUI.
|
||||||
|
continue
|
||||||
|
|
||||||
|
setting_eval = setting.get("eval", "")
|
||||||
|
if setting_eval:
|
||||||
|
value = self.eval_setting(context, setting.key, setting_eval)
|
||||||
|
elif "default" in setting:
|
||||||
|
value = setting.default
|
||||||
|
else:
|
||||||
|
# No way to get a default value, so just don't bother overwriting
|
||||||
|
# anything.
|
||||||
|
continue
|
||||||
|
|
||||||
|
job.settings[setting.key] = value
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def last_n_dir_parts(n: int, filepath: Union[str, Path, None] = None) -> Path:
|
def last_n_dir_parts(n: int, filepath: Union[str, Path, None] = None) -> Path:
|
||||||
"""Return the last `n` parts of the directory of `filepath`.
|
"""Return the last `n` parts of the directory of `filepath`.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# <pep8 compliant>
|
# <pep8 compliant>
|
||||||
|
|
||||||
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
@ -226,8 +227,12 @@ class FLAMENCO_OT_submit_job(FlamencoOpMixin, bpy.types.Operator):
|
|||||||
self.report({"ERROR"}, "Project path %s does not exist" % project_path)
|
self.report({"ERROR"}, "Project path %s does not exist" % project_path)
|
||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
|
|
||||||
# Determine where the render output will be stored.
|
# Determine where the blend file will be stored.
|
||||||
pack_target_dir = Path("/render/_flamenco/tests/renders") / self.job_name
|
unique_dir = "%s-%s" % (
|
||||||
|
datetime.datetime.now().isoformat("-").replace(":", ""),
|
||||||
|
self.job_name,
|
||||||
|
)
|
||||||
|
pack_target_dir = Path(context.scene.flamenco_job_storage) / unique_dir
|
||||||
|
|
||||||
# TODO: this should take the blendfile location relative to the project path into account.
|
# TODO: this should take the blendfile location relative to the project path into account.
|
||||||
pack_target_file = pack_target_dir / blendfile.name
|
pack_target_file = pack_target_dir / blendfile.name
|
||||||
@ -237,7 +242,7 @@ class FLAMENCO_OT_submit_job(FlamencoOpMixin, bpy.types.Operator):
|
|||||||
self.packthread = bat_interface.copy(
|
self.packthread = bat_interface.copy(
|
||||||
base_blendfile=blendfile,
|
base_blendfile=blendfile,
|
||||||
project=project_path,
|
project=project_path,
|
||||||
target=pack_target_dir,
|
target=str(pack_target_dir),
|
||||||
exclusion_filter="", # TODO: get from GUI.
|
exclusion_filter="", # TODO: get from GUI.
|
||||||
relative_only=True, # TODO: get from GUI.
|
relative_only=True, # TODO: get from GUI.
|
||||||
)
|
)
|
||||||
@ -276,14 +281,18 @@ class FLAMENCO_OT_submit_job(FlamencoOpMixin, bpy.types.Operator):
|
|||||||
|
|
||||||
api_client = self.get_api_client(context)
|
api_client = self.get_api_client(context)
|
||||||
|
|
||||||
job_type = job_types.active_job_type(context.scene)
|
propgroup = getattr(context.scene, "flamenco_job_settings", None)
|
||||||
assert job_type is not None # If we're here, the job type should be known.
|
assert isinstance(propgroup, JobTypePropertyGroup), "did not expect %s" % (
|
||||||
|
type(propgroup)
|
||||||
|
)
|
||||||
|
propgroup.eval_hidden_settings_of_job(context, self.job)
|
||||||
|
|
||||||
job_submission.set_blend_file(job_type, self.job, self.blendfile_on_farm)
|
job_submission.set_blend_file(
|
||||||
job_submission.eval_hidden_settings(context, job_type, self.job)
|
propgroup.job_type, self.job, self.blendfile_on_farm
|
||||||
job = job_submission.submit_job(self.job, api_client)
|
)
|
||||||
|
|
||||||
self.report({"INFO"}, "Job %s submitted" % job.name)
|
submitted_job = job_submission.submit_job(self.job, api_client)
|
||||||
|
self.report({"INFO"}, "Job %s submitted" % submitted_job.name)
|
||||||
|
|
||||||
def _quit(self, context: bpy.types.Context) -> set[str]:
|
def _quit(self, context: bpy.types.Context) -> set[str]:
|
||||||
"""Stop any timer and return a 'FINISHED' status.
|
"""Stop any timer and return a 'FINISHED' status.
|
||||||
|
@ -11,6 +11,13 @@ def discard_flamenco_client(prefs, context):
|
|||||||
comms.discard_flamenco_data()
|
comms.discard_flamenco_data()
|
||||||
|
|
||||||
|
|
||||||
|
def _update_default_job_storage(
|
||||||
|
prefs: "FlamencoPreferences", context: bpy.types.Context
|
||||||
|
) -> None:
|
||||||
|
_unregister_rna_props()
|
||||||
|
_register_rna_props(prefs)
|
||||||
|
|
||||||
|
|
||||||
class FlamencoPreferences(bpy.types.AddonPreferences):
|
class FlamencoPreferences(bpy.types.AddonPreferences):
|
||||||
bl_idname = "flamenco"
|
bl_idname = "flamenco"
|
||||||
|
|
||||||
@ -21,15 +28,28 @@ class FlamencoPreferences(bpy.types.AddonPreferences):
|
|||||||
update=discard_flamenco_client,
|
update=discard_flamenco_client,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
job_storage: bpy.props.StringProperty( # type: ignore
|
||||||
|
name="Job Storage Directory",
|
||||||
|
subtype="DIR_PATH",
|
||||||
|
default="",
|
||||||
|
description="Directory where blend files are stored, when submitting them to Flamenco",
|
||||||
|
update=_update_default_job_storage,
|
||||||
|
)
|
||||||
|
|
||||||
def draw(self, context: bpy.types.Context) -> None:
|
def draw(self, context: bpy.types.Context) -> None:
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
col = layout.column()
|
col = layout.column()
|
||||||
|
col.use_property_split = True
|
||||||
|
|
||||||
row = col.row(align=True)
|
row = col.row(align=True)
|
||||||
row.prop(self, "manager_url")
|
row.prop(self, "manager_url")
|
||||||
row.operator("flamenco.ping_manager", text="Test Connection")
|
row.operator("flamenco.ping_manager", text="", icon="CHECKMARK")
|
||||||
|
if context.window_manager.flamenco_status_ping:
|
||||||
col.label(text=context.window_manager.flamenco_status_ping)
|
col.label(text=context.window_manager.flamenco_status_ping)
|
||||||
|
|
||||||
|
col.prop(self, "job_storage")
|
||||||
|
|
||||||
|
|
||||||
def get(context: bpy.types.Context) -> FlamencoPreferences:
|
def get(context: bpy.types.Context) -> FlamencoPreferences:
|
||||||
"""Return the add-on preferences."""
|
"""Return the add-on preferences."""
|
||||||
@ -46,5 +66,30 @@ def manager_url(context: bpy.types.Context) -> str:
|
|||||||
return str(prefs.manager_url)
|
return str(prefs.manager_url)
|
||||||
|
|
||||||
|
|
||||||
|
def _register_rna_props(prefs: FlamencoPreferences) -> None:
|
||||||
|
"""RNA properties that have their defaults set in the preferences get registered here."""
|
||||||
|
|
||||||
|
bpy.types.Scene.flamenco_job_storage = bpy.props.StringProperty(
|
||||||
|
name="Flamenco Job Storage",
|
||||||
|
subtype="DIR_PATH",
|
||||||
|
default=prefs.job_storage,
|
||||||
|
description="Directory where blend files are stored, when submitting them to Flamenco",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _unregister_rna_props() -> None:
|
||||||
|
del bpy.types.Scene.flamenco_job_storage
|
||||||
|
|
||||||
|
|
||||||
classes = (FlamencoPreferences,)
|
classes = (FlamencoPreferences,)
|
||||||
register, unregister = bpy.utils.register_classes_factory(classes)
|
_register, _unregister = bpy.utils.register_classes_factory(classes)
|
||||||
|
|
||||||
|
|
||||||
|
def register():
|
||||||
|
_register()
|
||||||
|
_register_rna_props(get(bpy.context))
|
||||||
|
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
_unregister_rna_props()
|
||||||
|
_unregister()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user