class_docstr: ProjectController inherits from BaseController and manages business logic related to the
  project. One model is associated with each project currently.
  
  Methods
  -------
  init(name, description)
      Initialize the project repository as a new model or update the existing project
  cleanup()
      Remove all datmo references from the current repository. NOTE: THIS WILL DELETE ALL DATMO WORK
  status()
      Give the user a picture of the status of the project, snapshots, and tasks
class_docstr_tok: ["ProjectController","inherits","from","BaseController","and","manages","business","logic","related","to","the","project",".","One","model","is","associated","with","each","project","currently",".","Methods","--","--","--","-","init","(","name",",","description",")","Initialize","the","project","repository","as","a","new","model","or","update","the","existing","project","cleanup","(",")","Remove","all","datmo","references","from","the","current","repository",".","NOTE",":","THIS","WILL","DELETE","ALL","DATMO","WORK","status","(",")","Give","the","user","a","picture","of","the","status","of","the","project",",","snapshots",",","and","tasks"]
docstr: Initialize the project
  
  This function will initialize the project or reinitialize it the project is
  already initialized.
  
  Parameters
  ----------
  name : str
  description : str
  
  Returns
  -------
  bool
docstr_tok: ["Initialize","the","project","This","function","will","initialize","the","project","or","reinitialize","it","the","project","is","already","initialized",".","Parameters","--","--","--","--","--","name",":","str","description",":","str","Returns","--","--","--","-","bool"]
code: def init(self, name, description):
      """Initialize the project
  
      This function will initialize the project or reinitialize it the project is
      already initialized.
  
      Parameters
      ----------
      name : str
      description : str
  
      Returns
      -------
      bool
      """
      is_new_model = False
      old_model = self.model
      if not self.model:
          is_new_model = True
  
      try:
          # Always validate inputs to the init function
          validate(
              "create_project",
              {"name": name, "description": description},
          )
  
          # Initialize File Driver if needed
          if not self.file_driver.is_initialized:
              self.file_driver.init()
  
          # Initialize the dal
          if not self.dal.is_initialized:
              self.dal.init()
  
          # Initialize Code Driver if needed
          if not self.code_driver.is_initialized:
              self.code_driver.init()
  
          # Initialize Environment Driver if needed
          if not self.environment_driver.is_initialized:
              self.environment_driver.init()
  
          # Initialize the config JSON store
          self.config_store = JSONStore(
              os.path.join(
                  self.home, Config().datmo_directory_name, ".config"
              )
          )
  
          # Create model if new else update
          if is_new_model:
              _ = self.dal.model.create(
                  Model({"name": name, "description": description})
              )
          else:
              self._model = self.dal.model.update(
                  {
                      "id": self.model.id,
                      "name": name,
                      "description": description,
                  }
              )
  
          # Connect Environment Driver if needed
          # (not required but will warn if not present)
          try:
              if not self.environment_driver.is_connected:
                  self.environment_driver.connect()
          except EnvironmentConnectFailed:
              self.logger.warning(
                  __("warn", "controller.general.environment.failed")
              )
  
          # Build the initial default Environment (NOT NECESSARY)
          # self.environment_driver.build_image(tag="datmo-" + \
          #                                  self.model.name)
          return True
      except Exception:
          # if any error occurred with new model, ensure no initialize occurs and raise previous error
          # if any error occurred with existing model, ensure no updates were made, raise previous error
          if is_new_model:
              self.cleanup()
          else:
              self._model = self.dal.model.update(
                  {
                      "id": old_model.id,
                      "name": old_model.name,
                      "description": old_model.description,
                  }
              )
          raise
  
file_path: datmo/datmo/core/controller/project.py
imports: import os
  from datmo.config import Config
  from datmo.core.util.validation import validate
  from datmo.core.util.i18n import get
  from datmo.core.controller.base import BaseController
  from datmo.core.controller.code.code import CodeController
  from datmo.core.controller.environment.environment import EnvironmentController
  from datmo.core.controller.file.file_collection import FileCollectionController
  from datmo.core.controller.snapshot import SnapshotController
  from datmo.core.entity.model import Model
  from datmo.core.util.json_store import JSONStore
  from datmo.core.util.exceptions import ProjectNotInitialized, EnvironmentConnectFailed, FileIOError, UnstagedChanges, PathDoesNotExist
label_desc: Use image node_id 2 for calling the ProjectController obj's underlying member method code with example usage: obj.init(name, description) and returns: True