class_docstr: A class representing a Project object.
  
  Attributes:
      id: (int) The ID of the project.
      archived: (Mutable, bool) True if experiment is archived, else false.
      description: (Mutable, str) The description of the project.
      n_active_experiments: (int) The number of active experiments in the project.
      n_experiments: (Mutable, int) The number of experiments in the project.
      name: (Mutable, str) Human-friendly name of the project.
      notes: (Mutable, List[Dict[str,str]) Notes about the project. As determined upstream,
          each note is a dict with exactly the keys "name" and "contents".
      username: (Mutable, str) The username of the project owner.
      workspace_id: (int) The ID of the workspace this project belongs to.
class_docstr_tok: ["A","class","representing","a","Project","object",".","Attributes",":","id",":","(","int",")","The","ID","of","the","project",".","archived",":","(","Mutable",",","bool",")","True","if","experiment","is","archived",",","else","false",".","description",":","(","Mutable",",","str",")","The","description","of","the","project",".","n_active_experiments",":","(","int",")","The","number","of","active","experiments","in","the","project",".","n_experiments",":","(","Mutable",",","int",")","The","number","of","experiments","in","the","project",".","name",":","(","Mutable",",","str",")","Human-friendly","name","of","the","project",".","notes",":","(","Mutable",",","List","[","Dict","[","str",",","str","]",")","Notes","about","the","project",".","As","determined","upstream",",","each","note","is","a","dict","with","exactly","the","keys","``","name","''","and","``","contents","''",".","username",":","(","Mutable",",","str",")","The","username","of","the","project","owner",".","workspace_id",":","(","int",")","The","ID","of","the","workspace","this","project","belongs","to","."]
docstr: Add a note to the project.
  
  Because there is not yet functionality on the backend to add a single note, this method:
  1. fetches current notes for this project from the master.
  2. adds the new note to the list of notes.
  3. sends the updated list of notes to the master.
  
  WARNING:
  On exit, the object's notes attribute matches the updated master's notes, possibly
  reflecting changes to the project that have happened since the project was last hydrated
  from master.
  
  Args:
      name: The name of the note.
      contents: The contents of the note.
docstr_tok: ["Add","a","note","to","the","project",".","Because","there","is","not","yet","functionality","on","the","backend","to","add","a","single","note",",","this","method",":","1.","fetches","current","notes","for","this","project","from","the","master",".","2.","adds","the","new","note","to","the","list","of","notes",".","3.","sends","the","updated","list","of","notes","to","the","master",".","WARNING",":","On","exit",",","the","object","'s","notes","attribute","matches","the","updated","master","'s","notes",",","possibly","reflecting","changes","to","the","project","that","have","happened","since","the","project","was","last","hydrated","from","master",".","Args",":","name",":","The","name","of","the","note",".","contents",":","The","contents","of","the","note","."]
code: def add_note(self, name: str, contents: str) -> None:
      """Add a note to the project.
  
      Because there is not yet functionality on the backend to add a single note, this method:
      1. fetches current notes for this project from the master.
      2. adds the new note to the list of notes.
      3. sends the updated list of notes to the master.
  
      WARNING:
      On exit, the object's notes attribute matches the updated master's notes, possibly
      reflecting changes to the project that have happened since the project was last hydrated
      from master.
  
      Args:
          name: The name of the note.
          contents: The contents of the note.
      """
      master_notes = bindings.get_GetProject(
          session=self._session, id=self.id
      ).project.notes
      combined_notes = list(master_notes) + [
          bindings.v1Note(name=name, contents=contents)
      ]
  
      request_body = bindings.v1PutProjectNotesRequest(
          notes=combined_notes, projectId=self.id
      )
      resp = bindings.put_PutProjectNotes(
          session=self._session, body=request_body, projectId=self.id
      )
  
      self.notes = [note.to_json() for note in resp.notes]
  
file_path: determined/harness/determined/common/experimental/project.py
imports: import itertools
  from typing import Dict, List, Optional
  from determined.common import api
  from determined.common.api import bindings
  from determined.common.experimental import experiment
label_desc: Use image node_id 10 for calling the Project obj's underlying member method code with example usage: obj.add_note(name, contents) without return types