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: Return the project status information if initialized
  
  Returns
  -------
  status_dict : dict
      dictionary with project metadata and config
  current_snapshot : datmo.core.entity.snapshot.Snapshot
      snapshot object of the current state of the repo if present else None
  latest_snapshot_user_generated : datmo.core.entity.snapshot.Snapshot
      snapshot object of the latest snapshot generated by the user if present else None
  latest_snapshot_auto_generated : datmo.core.entity.snapshot.Snapshot
      snapshot object of the latest snapshot generated automatically by datmo if present else None
  unstaged_code : bool
      True if code has unstaged changes
  unstaged_environment : bool
      True if environment has unstaged changes
  unstaged_files : bool
      True if files have unstaged changes
docstr_tok: ["Return","the","project","status","information","if","initialized","Returns","--","--","--","-","status_dict",":","dict","dictionary","with","project","metadata","and","config","current_snapshot",":","datmo.core.entity.snapshot.Snapshot","snapshot","object","of","the","current","state","of","the","repo","if","present","else","None","latest_snapshot_user_generated",":","datmo.core.entity.snapshot.Snapshot","snapshot","object","of","the","latest","snapshot","generated","by","the","user","if","present","else","None","latest_snapshot_auto_generated",":","datmo.core.entity.snapshot.Snapshot","snapshot","object","of","the","latest","snapshot","generated","automatically","by","datmo","if","present","else","None","unstaged_code",":","bool","True","if","code","has","unstaged","changes","unstaged_environment",":","bool","True","if","environment","has","unstaged","changes","unstaged_files",":","bool","True","if","files","have","unstaged","changes"]
code: def status(self):
      """Return the project status information if initialized
  
      Returns
      -------
      status_dict : dict
          dictionary with project metadata and config
      current_snapshot : datmo.core.entity.snapshot.Snapshot
          snapshot object of the current state of the repo if present else None
      latest_snapshot_user_generated : datmo.core.entity.snapshot.Snapshot
          snapshot object of the latest snapshot generated by the user if present else None
      latest_snapshot_auto_generated : datmo.core.entity.snapshot.Snapshot
          snapshot object of the latest snapshot generated automatically by datmo if present else None
      unstaged_code : bool
          True if code has unstaged changes
      unstaged_environment : bool
          True if environment has unstaged changes
      unstaged_files : bool
          True if files have unstaged changes
      """
      if not self.is_initialized:
          raise ProjectNotInitialized(
              __("error", "controller.project.status")
          )
      # TODO: Add in note when environment is not setup or intialized
  
      # Add in project metadata
      status_dict = self.model.to_dictionary().copy()
  
      # Find  all project settings
      status_dict["config"] = self.config_store.to_dict()
  
      # Find the latest snapshot generated by the user
      descending_snapshots = self.dal.snapshot.query(
          {"visible": True},
          sort_key="created_at",
          sort_order="descending",
      )
      latest_snapshot_user_generated = (
          descending_snapshots[0] if descending_snapshots else None
      )
  
      # Show the latest snapshot generated automatically by datmo
      descending_snapshots = self.dal.snapshot.query(
          {"visible": False},
          sort_key="created_at",
          sort_order="descending",
      )
      latest_snapshot_auto_generated = (
          descending_snapshots[0] if descending_snapshots else None
      )
  
      # TODO: add in latest run
  
      self.code_controller = CodeController()
      try:
          unstaged_code = self.code_controller.check_unstaged_changes()
      except UnstagedChanges:
          unstaged_code = True
  
      self.environment_controller = EnvironmentController()
      try:
          unstaged_environment = (
              self.environment_controller.check_unstaged_changes()
          )
      except UnstagedChanges:
          unstaged_environment = True
  
      self.file_collection_controller = FileCollectionController()
      try:
          unstaged_files = (
              self.file_collection_controller.check_unstaged_changes()
          )
      except UnstagedChanges:
          unstaged_files = True
  
      # If exists, obtain the current snapshot, if unstaged changes, will be None
      self.snapshot_controller = SnapshotController()
      try:
          current_snapshot = self.snapshot_controller.current_snapshot()
      except UnstagedChanges:
          current_snapshot = None
  
      return (
          status_dict,
          current_snapshot,
          latest_snapshot_user_generated,
          latest_snapshot_auto_generated,
          unstaged_code,
          unstaged_environment,
          unstaged_files,
      )
  
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 4 for calling the ProjectController obj's underlying member method code with example usage: obj.status() and returns: status_dict,  current_snapshot,  latest_snapshot_user_generated,  latest_snapshot_auto_generated,  unstaged_code,  unstaged_environment,  unstaged_files