Merge pull request #3766 from pypeclub/feature/OP-3787_Move-create-project

General: Create project function moved to client code
This commit is contained in:
Jakub Trllo 2022-08-31 15:51:58 +02:00 committed by GitHub
commit f1da60cd66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 110 additions and 65 deletions

View file

@ -45,6 +45,11 @@ from .entities import (
get_workfile_info,
)
from .operations import (
create_project,
)
__all__ = (
"OpenPypeMongoConnection",
@ -88,4 +93,6 @@ __all__ = (
"get_thumbnail_id_from_source",
"get_workfile_info",
"create_project",
)

View file

@ -9,6 +9,7 @@ from bson.objectid import ObjectId
from pymongo import DeleteOne, InsertOne, UpdateOne
from .mongo import get_project_connection
from .entities import get_project
REMOVED_VALUE = object()
@ -662,3 +663,89 @@ class OperationsSession(object):
operation = DeleteOperation(project_name, entity_type, entity_id)
self.add(operation)
return operation
def create_project(project_name, project_code, library_project=False):
"""Create project using OpenPype settings.
This project creation function is not validating project document on
creation. It is because project document is created blindly with only
minimum required information about project which is it's name, code, type
and schema.
Entered project name must be unique and project must not exist yet.
Note:
This function is here to be OP v4 ready but in v3 has more logic
to do. That's why inner imports are in the body.
Args:
project_name(str): New project name. Should be unique.
project_code(str): Project's code should be unique too.
library_project(bool): Project is library project.
Raises:
ValueError: When project name already exists in MongoDB.
Returns:
dict: Created project document.
"""
from openpype.settings import ProjectSettings, SaveWarningExc
from openpype.pipeline.schema import validate
if get_project(project_name, fields=["name"]):
raise ValueError("Project with name \"{}\" already exists".format(
project_name
))
if not PROJECT_NAME_REGEX.match(project_name):
raise ValueError((
"Project name \"{}\" contain invalid characters"
).format(project_name))
project_doc = {
"type": "project",
"name": project_name,
"data": {
"code": project_code,
"library_project": library_project
},
"schema": CURRENT_PROJECT_SCHEMA
}
op_session = OperationsSession()
# Insert document with basic data
create_op = op_session.create_entity(
project_name, project_doc["type"], project_doc
)
op_session.commit()
# Load ProjectSettings for the project and save it to store all attributes
# and Anatomy
try:
project_settings_entity = ProjectSettings(project_name)
project_settings_entity.save()
except SaveWarningExc as exc:
print(str(exc))
except Exception:
op_session.delete_entity(
project_name, project_doc["type"], create_op.entity_id
)
op_session.commit()
raise
project_doc = get_project(project_name)
try:
# Validate created project document
validate(project_doc)
except Exception:
# Remove project if is not valid
op_session.delete_entity(
project_name, project_doc["type"], create_op.entity_id
)
op_session.commit()
raise
return project_doc

View file

@ -84,6 +84,7 @@ def deprecated(new_destination):
return _decorator(func)
@deprecated("openpype.client.operations.create_project")
def create_project(
project_name, project_code, library_project=False, dbcon=None
):
@ -107,59 +108,14 @@ def create_project(
Returns:
dict: Created project document.
Deprecated:
Function will be removed after release version 3.16.*
"""
from openpype.settings import ProjectSettings, SaveWarningExc
from openpype.pipeline import AvalonMongoDB
from openpype.pipeline.schema import validate
from openpype.client.operations import create_project
if get_project(project_name, fields=["name"]):
raise ValueError("Project with name \"{}\" already exists".format(
project_name
))
if dbcon is None:
dbcon = AvalonMongoDB()
if not PROJECT_NAME_REGEX.match(project_name):
raise ValueError((
"Project name \"{}\" contain invalid characters"
).format(project_name))
database = dbcon.database
project_doc = {
"type": "project",
"name": project_name,
"data": {
"code": project_code,
"library_project": library_project
},
"schema": CURRENT_DOC_SCHEMAS["project"]
}
# Insert document with basic data
database[project_name].insert_one(project_doc)
# Load ProjectSettings for the project and save it to store all attributes
# and Anatomy
try:
project_settings_entity = ProjectSettings(project_name)
project_settings_entity.save()
except SaveWarningExc as exc:
print(str(exc))
except Exception:
database[project_name].delete_one({"type": "project"})
raise
project_doc = get_project(project_name)
try:
# Validate created project document
validate(project_doc)
except Exception:
# Remove project if is not valid
database[project_name].delete_one({"type": "project"})
raise
return project_doc
return create_project(project_name, project_code, library_project)
def with_pipeline_io(func):

View file

@ -1,10 +1,8 @@
import json
import copy
from openpype.client import get_project
from openpype.api import ProjectSettings
from openpype.lib import create_project
from openpype.settings import SaveWarningExc
from openpype.client import get_project, create_project
from openpype.settings import ProjectSettings, SaveWarningExc
from openpype_modules.ftrack.lib import (
ServerAction,

View file

@ -1,10 +1,8 @@
import json
import copy
from openpype.client import get_project
from openpype.api import ProjectSettings
from openpype.lib import create_project
from openpype.settings import SaveWarningExc
from openpype.client import get_project, create_project
from openpype.settings import ProjectSettings, SaveWarningExc
from openpype_modules.ftrack.lib import (
BaseAction,

View file

@ -15,10 +15,10 @@ from openpype.client import (
get_assets,
get_asset_by_id,
get_asset_by_name,
create_project,
)
from openpype.pipeline import AvalonMongoDB
from openpype.api import get_project_settings
from openpype.lib import create_project
from openpype.settings import get_project_settings
from openpype.modules.kitsu.utils.credentials import validate_credentials
@ -278,7 +278,7 @@ def write_project_to_op(project: dict, dbcon: AvalonMongoDB) -> UpdateOne:
project_doc = get_project(project_name)
if not project_doc:
print(f"Creating project '{project_name}'")
project_doc = create_project(project_name, project_name, dbcon=dbcon)
project_doc = create_project(project_name, project_name)
# Project data and tasks
project_data = project_doc["data"] or {}

View file

@ -1,14 +1,13 @@
import re
from openpype.client import get_projects
from openpype.client import get_projects, create_project
from .constants import (
NAME_ALLOWED_SYMBOLS,
NAME_REGEX
)
from openpype.lib import create_project
from openpype.client.operations import (
PROJECT_NAME_ALLOWED_SYMBOLS,
PROJECT_NAME_REGEX
PROJECT_NAME_REGEX,
)
from openpype.style import load_stylesheet
from openpype.pipeline import AvalonMongoDB
@ -266,7 +265,7 @@ class CreateProjectDialog(QtWidgets.QDialog):
project_name = self.project_name_input.text()
project_code = self.project_code_input.text()
library_project = self.library_project_input.isChecked()
create_project(project_name, project_code, library_project, self.dbcon)
create_project(project_name, project_code, library_project)
self.done(1)