docstr: Start a Project
code: def create_project(
      self, context: AuthedServiceContext, project: ProjectSubmit
  ) -> Union[SyftSuccess, SyftError]:
      """Start a Project"""
  
      check_role = self.can_create_project(context)
      if isinstance(check_role, SyftError):
          return check_role
  
      try:
          # Check if the project with given id already exists
          project_id_check = self.stash.get_by_uid(
              credentials=context.node.verify_key, uid=project.id
          )
  
          if project_id_check.is_err():
              return SyftError(message=f"{project_id_check.err()}")
  
          if project_id_check.ok() is not None:
              return SyftError(
                  message=f"Project with id: {project.id} already exists."
              )
  
          project_obj: Project = project.to(Project, context=context)
  
          # Updating the leader node route of the project object
          # In case the current node, is the leader, they would input their node route
          # For the followers, they would check if the leader is their node peer
          # using the leader's verify_key
          # If the follower do not have the leader as its peer in its routes
          # They would raise as error
          leader_node = project_obj.state_sync_leader
  
          # If the current node is a follower
          # For followers the leader node route is retrieved from its peer
          if leader_node.verify_key != context.node.verify_key:
              network_service = context.node.get_service(
                  "networkservice"
              )
              peer = network_service.stash.get_for_verify_key(
                  credentials=context.node.verify_key,
                  verify_key=leader_node.verify_key,
              )
              if peer.is_err():
                  return SyftError(
                      message=(
                          f"Leader Node(id={leader_node.id.short()}) is not a "
                          f"peer of this Node(id={context.node.id.short()})"
                      )
                  )
              leader_node_peer = peer.ok()
          else:
              # for the leader node, as it does not have route information to itself
              # we rely on the data scientist to provide the route
              # the route is then validated by the leader
              leader_node_peer = (
                  project.leader_node_route.validate_with_context(
                      context=context
                  )
              )
  
          project_obj.leader_node_peer = leader_node_peer
  
          # This should always be the last call before flushing to DB
          project_obj.start_hash = create_project_hash(project_obj)[1]
  
          result = self.stash.set(context.credentials, project_obj)
          if result.is_err():
              return SyftError(message=str(result.err()))
  
          project_obj_store = result.ok()
          project_obj_store = self.add_signing_key_to_project(
              context, project_obj_store
          )
  
          return project_obj_store
  
      except Exception as e:
          print("Failed to submit Project", e)
          raise e
  
imports: from typing import List
  from typing import Union
  from ...serde.serializable import serializable
  from ...store.document_store import DocumentStore
  from ...store.linked_obj import LinkedObject
  from ...types.uid import UID
  from ...util.telemetry import instrument
  from ..context import AuthedServiceContext
  from ..notification.notification_service import NotificationService
  from ..notification.notifications import CreateNotification
  from ..response import SyftError
  from ..response import SyftNotReady
  from ..response import SyftSuccess
  from ..service import AbstractService
  from ..service import SERVICE_TO_TYPES
  from ..service import TYPE_TO_SERVICE
  from ..service import service_method
  from ..user.user_roles import GUEST_ROLE_LEVEL
  from ..user.user_roles import ONLY_DATA_SCIENTIST_ROLE_LEVEL
  from ..user.user_roles import ServiceRole
  from .project import Project
  from .project import ProjectEvent
  from .project import ProjectRequest
  from .project import ProjectSubmit
  from .project import create_project_hash
  from .project_stash import ProjectStash
label_desc: Use image node_id 3 for calling the ProjectService obj's underlying member method code with example usage: obj.create_project(context, project) and returns: check_role, project_obj_store, SyftError, SyftError, SyftError, SyftError