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.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()
|
||||
|
||||
|
@ -68,34 +68,6 @@ def set_blend_file(
|
||||
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:
|
||||
"""Send the given job to Flamenco Manager."""
|
||||
from flamenco.manager import ApiClient
|
||||
|
@ -115,6 +115,31 @@ class JobTypePropertyGroup:
|
||||
raise SettingEvalError(setting_key, setting_eval, eval_locals, ex) from ex
|
||||
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
|
||||
def last_n_dir_parts(n: int, filepath: Union[str, Path, None] = None) -> Path:
|
||||
"""Return the last `n` parts of the directory of `filepath`.
|
||||
|
@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# <pep8 compliant>
|
||||
|
||||
import datetime
|
||||
import logging
|
||||
from pathlib import Path
|
||||
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)
|
||||
return {"CANCELLED"}
|
||||
|
||||
# Determine where the render output will be stored.
|
||||
pack_target_dir = Path("/render/_flamenco/tests/renders") / self.job_name
|
||||
# Determine where the blend file will be stored.
|
||||
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.
|
||||
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(
|
||||
base_blendfile=blendfile,
|
||||
project=project_path,
|
||||
target=pack_target_dir,
|
||||
target=str(pack_target_dir),
|
||||
exclusion_filter="", # 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)
|
||||
|
||||
job_type = job_types.active_job_type(context.scene)
|
||||
assert job_type is not None # If we're here, the job type should be known.
|
||||
propgroup = getattr(context.scene, "flamenco_job_settings", None)
|
||||
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.eval_hidden_settings(context, job_type, self.job)
|
||||
job = job_submission.submit_job(self.job, api_client)
|
||||
job_submission.set_blend_file(
|
||||
propgroup.job_type, self.job, self.blendfile_on_farm
|
||||
)
|
||||
|
||||
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]:
|
||||
"""Stop any timer and return a 'FINISHED' status.
|
||||
|
@ -11,6 +11,13 @@ def discard_flamenco_client(prefs, context):
|
||||
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):
|
||||
bl_idname = "flamenco"
|
||||
|
||||
@ -21,14 +28,27 @@ class FlamencoPreferences(bpy.types.AddonPreferences):
|
||||
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:
|
||||
layout = self.layout
|
||||
|
||||
col = layout.column()
|
||||
col.use_property_split = True
|
||||
|
||||
row = col.row(align=True)
|
||||
row.prop(self, "manager_url")
|
||||
row.operator("flamenco.ping_manager", text="Test Connection")
|
||||
col.label(text=context.window_manager.flamenco_status_ping)
|
||||
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.prop(self, "job_storage")
|
||||
|
||||
|
||||
def get(context: bpy.types.Context) -> FlamencoPreferences:
|
||||
@ -46,5 +66,30 @@ def manager_url(context: bpy.types.Context) -> str:
|
||||
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,)
|
||||
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