diff --git a/openpype/hosts/maya/api/lib.py b/openpype/hosts/maya/api/lib.py index fca4410ede1..ba0f049fd93 100644 --- a/openpype/hosts/maya/api/lib.py +++ b/openpype/hosts/maya/api/lib.py @@ -421,11 +421,28 @@ def imprint(node, data): add_type = {"attributeType": "enum", "enumName": ":".join(value)} set_type = {"keyable": False, "channelBox": True} value = 0 # enum default + elif isinstance(value, dict): + for key, group_list in value.items(): + cmds.addAttr( + node, + longName=key, + numberOfChildren=len(group_list), + attributeType="compound" + ) + for group in group_list: + cmds.addAttr( + node, + longName=group, + attributeType="bool", + parent=key + ) + continue else: raise TypeError("Unsupported type: %r" % type(value)) - cmds.addAttr(node, longName=key, **add_type) - cmds.setAttr(node + "." + key, value, **set_type) + if not isinstance(value, dict): + cmds.addAttr(node, longName=key, **add_type) + cmds.setAttr(node + "." + key, value, **set_type) def lsattr(attr, value=None): diff --git a/openpype/hosts/maya/plugins/create/create_render.py b/openpype/hosts/maya/plugins/create/create_render.py index 46811758086..0933d19d635 100644 --- a/openpype/hosts/maya/plugins/create/create_render.py +++ b/openpype/hosts/maya/plugins/create/create_render.py @@ -297,6 +297,15 @@ def _create_render_settings(self): self.data["secondaryPool"] = self._set_default_pool(pool_names, secondary_pool) + requested_arguments = {"NamesOnly": True} + limit_groups = self.deadline_module.get_deadline_data( + deadline_url, + "limitgroups", + log=self.log, + **requested_arguments + ) + self.data["limits"] = {"limits": limit_groups} + if muster_enabled: self.log.info(">>> Loading Muster credentials ...") self._load_credentials() diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index babd494758f..7dac1961648 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -51,6 +51,8 @@ from openpype.lib import get_formatted_current_time from openpype.pipeline import legacy_io +from openpype.settings import get_system_settings, get_project_settings +from openpype.modules import ModulesManager from openpype.hosts.maya.api.lib_renderproducts import get as get_layer_render_products # noqa: E501 from openpype.hosts.maya.api import lib @@ -426,6 +428,9 @@ def parse_options(self, render_globals): options["mayaRenderPlugin"] = maya_render_plugin + limits = self._get_checked_limit_groups(attributes) + options["limits"] = limits + return options def _discover_pools(self, attributes): @@ -467,3 +472,47 @@ def get_render_attribute(attr, layer): return lib.get_attr_in_layer( "defaultRenderGlobals.{}".format(attr), layer=layer ) + + def _get_checked_limit_groups(self, attributes): + checked_limits = [] + deadline_settings = get_system_settings()["modules"]["deadline"] + + if not deadline_settings["enabled"]: + return checked_limits + + manager = ModulesManager() + deadline_module = manager.modules_by_name["deadline"] + + try: + default_servers = deadline_settings["deadline_urls"] + project_settings = get_project_settings( + legacy_io.Session["AVALON_PROJECT"] + ) + project_servers = ( + project_settings["deadline"]["deadline_servers"] + ) + deadline_servers = { + k: default_servers[k] + for k in project_servers + if k in default_servers + } + + if not deadline_servers: + deadline_servers = default_servers + except AttributeError: + # Handle situation were we had only one url for deadline. + # get default deadline webservice url from deadline module + deadline_servers = deadline_module.deadline_urls + + requested_arguments = {"NamesOnly": True} + limit_groups = deadline_module.get_deadline_data( + deadline_settings['deadline_urls']["default"], + "limitgroups", + log=self.log, + **requested_arguments + ) + for group, value in zip(limit_groups, attributes['limits'][0]): + if value is True: + checked_limits.append(group) + + return checked_limits diff --git a/openpype/modules/deadline/deadline_module.py b/openpype/modules/deadline/deadline_module.py index 9855f8c1b10..824e9887d9e 100644 --- a/openpype/modules/deadline/deadline_module.py +++ b/openpype/modules/deadline/deadline_module.py @@ -74,3 +74,50 @@ def get_deadline_pools(webservice, log=None): return [] return response.json() + + @staticmethod + def get_deadline_data(webservice, endpoint, log=None, **kwargs): + """Get Limits groups for Deadline + Args: + webservice (str): Server url + endpoint (str): Request endpoint + log (Logger) + kwargs (Any): Request payload content as key=value pairs + Returns: + Any: Returns the json-encoded content of a response, if any. + Throws: + RuntimeError: If Deadline webservice is unreachable. + """ + if not log: + log = Logger.get_logger(__name__) + + request = "{}/api/{}".format( + webservice, + endpoint + ) + + # Construct the full request with arguments + arguments = [] + for key, value in kwargs.items(): + new_argument = "{}={}".format(key, value) + arguments.append(new_argument) + + if arguments: + arguments = "&".join(arguments) + request = "{}?{}".format(request, arguments) + + try: + response = requests_get(request) + except requests.exceptions.ConnectionError as exc: + msg = "Cannot connect to DL web service {}".format(webservice) + log.error(msg) + six.reraise( + DeadlineWebserviceError, + DeadlineWebserviceError("{} - {}".format(msg, exc)), + sys.exc_info()[2] + ) + if not response.ok: + log.warning("The data requested could not be retrieved") + return [] + + return response.json() diff --git a/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py b/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py index a6cdcb7e711..763d2ff5741 100644 --- a/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -148,6 +148,8 @@ def get_job_info(self): if self.group != "none" and self.group: job_info.Group = self.group + self.limit = instance.data.get('limits') + if self.limit: job_info.LimitGroups = ",".join(self.limit)