diff --git a/Makefile b/Makefile index 7f00a2b4..160cb013 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,9 @@ PKG := projects.blender.org/studio/flamenco # To update the version number in all the relevant places, update the VERSION # variable below and run `make update-version`. -VERSION := 3.3.1 +VERSION := 3.4-beta0 # "alpha", "beta", or "release". -RELEASE_CYCLE := release +RELEASE_CYCLE := beta # _GIT_DESCRIPTION_OR_TAG is either something like '16-123abc' (when we're 16 # commits since the last tag) or it's something like `v3.0-beta2` (when exactly diff --git a/addon/flamenco/__init__.py b/addon/flamenco/__init__.py index 6f1933ee..216263a3 100644 --- a/addon/flamenco/__init__.py +++ b/addon/flamenco/__init__.py @@ -5,14 +5,14 @@ bl_info = { "name": "Flamenco 3", "author": "Sybren A. Stüvel", - "version": (3, 3, 1), + "version": (3, 4), "blender": (3, 1, 0), "description": "Flamenco client for Blender.", "location": "Output Properties > Flamenco", "doc_url": "https://flamenco.blender.org/", "category": "System", "support": "COMMUNITY", - "warning": "", + "warning": "This is version 3.4-beta0 of the add-on, which is not a stable release", } from pathlib import Path diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py index ffb7e918..776a8834 100644 --- a/addon/flamenco/manager/__init__.py +++ b/addon/flamenco/manager/__init__.py @@ -10,7 +10,7 @@ """ -__version__ = "3.3.1" +__version__ = "3.4-beta0" # import ApiClient from flamenco.manager.api_client import ApiClient diff --git a/addon/flamenco/manager/api/jobs_api.py b/addon/flamenco/manager/api/jobs_api.py index 173e1822..81ac24bc 100644 --- a/addon/flamenco/manager/api/jobs_api.py +++ b/addon/flamenco/manager/api/jobs_api.py @@ -28,6 +28,7 @@ from flamenco.manager.model.job import Job from flamenco.manager.model.job_blocklist import JobBlocklist from flamenco.manager.model.job_deletion_info import JobDeletionInfo from flamenco.manager.model.job_last_rendered_image_info import JobLastRenderedImageInfo +from flamenco.manager.model.job_mass_deletion_selection import JobMassDeletionSelection from flamenco.manager.model.job_priority_change import JobPriorityChange from flamenco.manager.model.job_status_change import JobStatusChange from flamenco.manager.model.job_tasks_summary import JobTasksSummary @@ -99,6 +100,56 @@ class JobsApi(object): }, api_client=api_client ) + self.delete_job_mass_endpoint = _Endpoint( + settings={ + 'response_type': None, + 'auth': [], + 'endpoint_path': '/api/v3/jobs/mass-delete', + 'operation_id': 'delete_job_mass', + 'http_method': 'DELETE', + 'servers': None, + }, + params_map={ + 'all': [ + 'job_mass_deletion_selection', + ], + 'required': [ + 'job_mass_deletion_selection', + ], + 'nullable': [ + ], + 'enum': [ + ], + 'validation': [ + ] + }, + root_map={ + 'validations': { + }, + 'allowed_values': { + }, + 'openapi_types': { + 'job_mass_deletion_selection': + (JobMassDeletionSelection,), + }, + 'attribute_map': { + }, + 'location_map': { + 'job_mass_deletion_selection': 'body', + }, + 'collection_format_map': { + } + }, + headers_map={ + 'accept': [ + 'application/json' + ], + 'content_type': [ + 'application/json' + ] + }, + api_client=api_client + ) self.delete_job_what_would_it_do_endpoint = _Endpoint( settings={ 'response_type': (JobDeletionInfo,), @@ -1076,6 +1127,83 @@ class JobsApi(object): job_id return self.delete_job_endpoint.call_with_http_info(**kwargs) + def delete_job_mass( + self, + job_mass_deletion_selection, + **kwargs + ): + """Mark jobs for deletion, based on certain criteria. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.delete_job_mass(job_mass_deletion_selection, async_req=True) + >>> result = thread.get() + + Args: + job_mass_deletion_selection (JobMassDeletionSelection): Parameters to determine which jobs to delete. + + Keyword Args: + _return_http_data_only (bool): response data without head status + code and headers. Default is True. + _preload_content (bool): if False, the urllib3.HTTPResponse object + will be returned without reading/decoding response data. + Default is True. + _request_timeout (int/float/tuple): timeout setting for this request. If + one number provided, it will be total request timeout. It can also + be a pair (tuple) of (connection, read) timeouts. + Default is None. + _check_input_type (bool): specifies if type checking + should be done one the data sent to the server. + Default is True. + _check_return_type (bool): specifies if type checking + should be done one the data received from the server. + Default is True. + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _content_type (str/None): force body content-type. + Default is None and content-type will be predicted by allowed + content-types and body. + _host_index (int/None): specifies the index of the server + that we want to use. + Default is read from the configuration. + async_req (bool): execute request asynchronously + + Returns: + None + If the method is called asynchronously, returns the request + thread. + """ + kwargs['async_req'] = kwargs.get( + 'async_req', False + ) + kwargs['_return_http_data_only'] = kwargs.get( + '_return_http_data_only', True + ) + kwargs['_preload_content'] = kwargs.get( + '_preload_content', True + ) + kwargs['_request_timeout'] = kwargs.get( + '_request_timeout', None + ) + kwargs['_check_input_type'] = kwargs.get( + '_check_input_type', True + ) + kwargs['_check_return_type'] = kwargs.get( + '_check_return_type', True + ) + kwargs['_spec_property_naming'] = kwargs.get( + '_spec_property_naming', False + ) + kwargs['_content_type'] = kwargs.get( + '_content_type') + kwargs['_host_index'] = kwargs.get('_host_index') + kwargs['job_mass_deletion_selection'] = \ + job_mass_deletion_selection + return self.delete_job_mass_endpoint.call_with_http_info(**kwargs) + def delete_job_what_would_it_do( self, job_id, diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py index 3f18f45d..9fc43947 100644 --- a/addon/flamenco/manager/api_client.py +++ b/addon/flamenco/manager/api_client.py @@ -76,7 +76,7 @@ class ApiClient(object): self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = 'Flamenco/3.3.1 (Blender add-on)' + self.user_agent = 'Flamenco/3.4-beta0 (Blender add-on)' def __enter__(self): return self diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py index f9f22ccc..d56e17d6 100644 --- a/addon/flamenco/manager/configuration.py +++ b/addon/flamenco/manager/configuration.py @@ -404,7 +404,7 @@ conf = flamenco.manager.Configuration( "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0.0\n"\ - "SDK Package Version: 3.3.1".\ + "SDK Package Version: 3.4-beta0".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/addon/flamenco/manager/docs/JobsApi.md b/addon/flamenco/manager/docs/JobsApi.md index 6554b71b..e17890e1 100644 --- a/addon/flamenco/manager/docs/JobsApi.md +++ b/addon/flamenco/manager/docs/JobsApi.md @@ -5,6 +5,7 @@ All URIs are relative to *http://localhost* Method | HTTP request | Description ------------- | ------------- | ------------- [**delete_job**](JobsApi.md#delete_job) | **DELETE** /api/v3/jobs/{job_id} | Request deletion this job, including its tasks and any log files. The actual deletion may happen in the background. No job files will be deleted (yet). +[**delete_job_mass**](JobsApi.md#delete_job_mass) | **DELETE** /api/v3/jobs/mass-delete | Mark jobs for deletion, based on certain criteria. [**delete_job_what_would_it_do**](JobsApi.md#delete_job_what_would_it_do) | **GET** /api/v3/jobs/{job_id}/what-would-delete-do | Get info about what would be deleted when deleting this job. The job itself, its logs, and the last-rendered images will always be deleted. The job files are only deleted conditionally, and this operation can be used to figure that out. [**fetch_global_last_rendered_info**](JobsApi.md#fetch_global_last_rendered_info) | **GET** /api/v3/jobs/last-rendered | Get the URL that serves the last-rendered images. [**fetch_job**](JobsApi.md#fetch_job) | **GET** /api/v3/jobs/{job_id} | Fetch info about the job. @@ -90,6 +91,75 @@ No authorization required [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **delete_job_mass** +> delete_job_mass(job_mass_deletion_selection) + +Mark jobs for deletion, based on certain criteria. + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import jobs_api +from flamenco.manager.model.error import Error +from flamenco.manager.model.job_mass_deletion_selection import JobMassDeletionSelection +from pprint import pprint +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = flamenco.manager.Configuration( + host = "http://localhost" +) + + +# Enter a context with an instance of the API client +with flamenco.manager.ApiClient() as api_client: + # Create an instance of the API class + api_instance = jobs_api.JobsApi(api_client) + job_mass_deletion_selection = JobMassDeletionSelection( + last_updated_max=dateutil_parser('1970-01-01T00:00:00.00Z'), + ) # JobMassDeletionSelection | Parameters to determine which jobs to delete. + + # example passing only required values which don't have defaults set + try: + # Mark jobs for deletion, based on certain criteria. + api_instance.delete_job_mass(job_mass_deletion_selection) + except flamenco.manager.ApiException as e: + print("Exception when calling JobsApi->delete_job_mass: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **job_mass_deletion_selection** | [**JobMassDeletionSelection**](JobMassDeletionSelection.md)| Parameters to determine which jobs to delete. | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Jobs were succesfully marked for deletion. | - | +**416** | There were no jobs that match the request. | - | +**0** | Error message | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **delete_job_what_would_it_do** > JobDeletionInfo delete_job_what_would_it_do(job_id) diff --git a/addon/flamenco/manager/models/__init__.py b/addon/flamenco/manager/models/__init__.py index ce7dd74c..665a5673 100644 --- a/addon/flamenco/manager/models/__init__.py +++ b/addon/flamenco/manager/models/__init__.py @@ -29,6 +29,7 @@ from flamenco.manager.model.job_blocklist import JobBlocklist from flamenco.manager.model.job_blocklist_entry import JobBlocklistEntry from flamenco.manager.model.job_deletion_info import JobDeletionInfo from flamenco.manager.model.job_last_rendered_image_info import JobLastRenderedImageInfo +from flamenco.manager.model.job_mass_deletion_selection import JobMassDeletionSelection from flamenco.manager.model.job_metadata import JobMetadata from flamenco.manager.model.job_priority_change import JobPriorityChange from flamenco.manager.model.job_settings import JobSettings diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index 3b1cd165..f80b8ae3 100644 --- a/addon/flamenco/manager_README.md +++ b/addon/flamenco/manager_README.md @@ -4,7 +4,7 @@ Render Farm manager API The `flamenco.manager` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0.0 -- Package version: 3.3.1 +- Package version: 3.4-beta0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://flamenco.io/](https://flamenco.io/) @@ -39,6 +39,7 @@ from flamenco.manager.model.job import Job from flamenco.manager.model.job_blocklist import JobBlocklist from flamenco.manager.model.job_deletion_info import JobDeletionInfo from flamenco.manager.model.job_last_rendered_image_info import JobLastRenderedImageInfo +from flamenco.manager.model.job_mass_deletion_selection import JobMassDeletionSelection from flamenco.manager.model.job_priority_change import JobPriorityChange from flamenco.manager.model.job_status_change import JobStatusChange from flamenco.manager.model.job_tasks_summary import JobTasksSummary @@ -76,6 +77,7 @@ All URIs are relative to *http://localhost* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- *JobsApi* | [**delete_job**](flamenco/manager/docs/JobsApi.md#delete_job) | **DELETE** /api/v3/jobs/{job_id} | Request deletion this job, including its tasks and any log files. The actual deletion may happen in the background. No job files will be deleted (yet). +*JobsApi* | [**delete_job_mass**](flamenco/manager/docs/JobsApi.md#delete_job_mass) | **DELETE** /api/v3/jobs/mass-delete | Mark jobs for deletion, based on certain criteria. *JobsApi* | [**delete_job_what_would_it_do**](flamenco/manager/docs/JobsApi.md#delete_job_what_would_it_do) | **GET** /api/v3/jobs/{job_id}/what-would-delete-do | Get info about what would be deleted when deleting this job. The job itself, its logs, and the last-rendered images will always be deleted. The job files are only deleted conditionally, and this operation can be used to figure that out. *JobsApi* | [**fetch_global_last_rendered_info**](flamenco/manager/docs/JobsApi.md#fetch_global_last_rendered_info) | **GET** /api/v3/jobs/last-rendered | Get the URL that serves the last-rendered images. *JobsApi* | [**fetch_job**](flamenco/manager/docs/JobsApi.md#fetch_job) | **GET** /api/v3/jobs/{job_id} | Fetch info about the job. @@ -152,6 +154,7 @@ Class | Method | HTTP request | Description - [JobBlocklistEntry](flamenco/manager/docs/JobBlocklistEntry.md) - [JobDeletionInfo](flamenco/manager/docs/JobDeletionInfo.md) - [JobLastRenderedImageInfo](flamenco/manager/docs/JobLastRenderedImageInfo.md) + - [JobMassDeletionSelection](flamenco/manager/docs/JobMassDeletionSelection.md) - [JobMetadata](flamenco/manager/docs/JobMetadata.md) - [JobPriorityChange](flamenco/manager/docs/JobPriorityChange.md) - [JobSettings](flamenco/manager/docs/JobSettings.md) diff --git a/web/app/src/manager-api/ApiClient.js b/web/app/src/manager-api/ApiClient.js index eb5d1701..815c61b3 100644 --- a/web/app/src/manager-api/ApiClient.js +++ b/web/app/src/manager-api/ApiClient.js @@ -55,7 +55,7 @@ class ApiClient { * @default {} */ this.defaultHeaders = { - 'User-Agent': 'Flamenco/3.3.1 / webbrowser' + 'User-Agent': 'Flamenco/3.4-beta0 / webbrowser' }; /** diff --git a/web/app/src/manager-api/index.js b/web/app/src/manager-api/index.js index e1ff873e..d5721a88 100644 --- a/web/app/src/manager-api/index.js +++ b/web/app/src/manager-api/index.js @@ -31,6 +31,7 @@ import JobAllOf from './model/JobAllOf'; import JobBlocklistEntry from './model/JobBlocklistEntry'; import JobDeletionInfo from './model/JobDeletionInfo'; import JobLastRenderedImageInfo from './model/JobLastRenderedImageInfo'; +import JobMassDeletionSelection from './model/JobMassDeletionSelection'; import JobPriorityChange from './model/JobPriorityChange'; import JobStatus from './model/JobStatus'; import JobStatusChange from './model/JobStatusChange'; @@ -242,6 +243,12 @@ export { */ JobLastRenderedImageInfo, + /** + * The JobMassDeletionSelection model constructor. + * @property {module:model/JobMassDeletionSelection} + */ + JobMassDeletionSelection, + /** * The JobPriorityChange model constructor. * @property {module:model/JobPriorityChange} diff --git a/web/app/src/manager-api/manager/JobsApi.js b/web/app/src/manager-api/manager/JobsApi.js index a464e62a..12b9e64b 100644 --- a/web/app/src/manager-api/manager/JobsApi.js +++ b/web/app/src/manager-api/manager/JobsApi.js @@ -20,6 +20,7 @@ import Job from '../model/Job'; import JobBlocklistEntry from '../model/JobBlocklistEntry'; import JobDeletionInfo from '../model/JobDeletionInfo'; import JobLastRenderedImageInfo from '../model/JobLastRenderedImageInfo'; +import JobMassDeletionSelection from '../model/JobMassDeletionSelection'; import JobPriorityChange from '../model/JobPriorityChange'; import JobStatusChange from '../model/JobStatusChange'; import JobTasksSummary from '../model/JobTasksSummary'; @@ -96,6 +97,51 @@ export default class JobsApi { } + /** + * Mark jobs for deletion, based on certain criteria. + * @param {module:model/JobMassDeletionSelection} jobMassDeletionSelection Parameters to determine which jobs to delete. + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response + */ + deleteJobMassWithHttpInfo(jobMassDeletionSelection) { + let postBody = jobMassDeletionSelection; + // verify the required parameter 'jobMassDeletionSelection' is set + if (jobMassDeletionSelection === undefined || jobMassDeletionSelection === null) { + throw new Error("Missing the required parameter 'jobMassDeletionSelection' when calling deleteJobMass"); + } + + let pathParams = { + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = ['application/json']; + let accepts = ['application/json']; + let returnType = null; + return this.apiClient.callApi( + '/api/v3/jobs/mass-delete', 'DELETE', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Mark jobs for deletion, based on certain criteria. + * @param {module:model/JobMassDeletionSelection} jobMassDeletionSelection Parameters to determine which jobs to delete. + * @return {Promise} a {@link https://www.promisejs.org/|Promise} + */ + deleteJobMass(jobMassDeletionSelection) { + return this.deleteJobMassWithHttpInfo(jobMassDeletionSelection) + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Get info about what would be deleted when deleting this job. The job itself, its logs, and the last-rendered images will always be deleted. The job files are only deleted conditionally, and this operation can be used to figure that out. * @param {String} jobId