docs: def get_sec_project_process(self):
          """
          Generate the "project process" section of the report.
          """
  
          logger.debug("Calculating Project Process metrics.")
  
          data_path = os.path.join(self.data_dir, "process")
          if not os.path.exists(data_path):
              os.makedirs(data_path)
  
          project_process_config = {
              "bmi_metrics": [],
              "time_to_close_metrics": [],
              "time_to_close_review_metrics": [],
              "patchsets_metrics": []
          }
  
          for ds in self.data_sources:
              metric_file = self.ds2class[ds]
              metric_index = self.get_metric_index(ds)
              project_process = metric_file.project_process(metric_index, self.start_date,
                                                            self.end_date)
              for section in project_process_config:
                  project_process_config[section].extend(project_process[section])
  
          project_process_config["time_to_close_title"] = "Days to close (median and average)"
          project_process_config["time_to_close_review_title"] = "Days to close review (median and average)"
  
          """
          BMI Pull Requests, BMI Issues
          description: closed PRs/issues out of open PRs/issues in a period of time
          """
          for bmi_metric in project_process_config['bmi_metrics']:
              headers = bmi_metric.id
              dataframe = bmi_metric.timeseries(dataframe=True)
              file_label = bmi_metric.DS_NAME + "_" + bmi_metric.id
              file_path = os.path.join(data_path, file_label)
              title_name = bmi_metric.name
              self.create_csv_fig_from_df([dataframe], file_path, [headers],
                                          fig_type="bar", title=title_name)
          """
          Time to close Issues and gerrit and ITS tickets
          description: median and mean time to close issues
          """
          i = 0
          if len(project_process_config['time_to_close_metrics']) > 0:
              metrics = project_process_config['time_to_close_metrics']
              while i < len(metrics):
                  file_label = ""
                  headers = [metrics[i].id, metrics[i + 1].id]
                  file_label += metrics[i].DS_NAME + "_" + metrics[i].id + "_"
                  file_label += metrics[i + 1].DS_NAME + "_" + metrics[i + 1].id
                  dataframes = [metrics[i].timeseries(dataframe=True),
                                metrics[i + 1].timeseries(dataframe=True)]
                  title_name = project_process_config['time_to_close_title']
                  file_path = os.path.join(data_path, file_label)
                  self.create_csv_fig_from_df(dataframes, file_path, headers,
                                              fig_type="bar", title=title_name)
                  i += 2
          """
          Time to close PRs and gerrit reviews
          description: median and mean time to close prs and gerrit reviews
          """
          i = 0
          if len(project_process_config['time_to_close_review_metrics']) > 0:
              metrics = project_process_config['time_to_close_review_metrics']
              while i < len(metrics):
                  file_label = ""
                  headers = [metrics[i].id, metrics[i + 1].id]
                  file_label += metrics[i].DS_NAME + "_" + metrics[i].id + "_"
                  file_label += metrics[i + 1].DS_NAME + "_" + metrics[i + 1].id
                  dataframes = [metrics[i].timeseries(dataframe=True),
                                metrics[i + 1].timeseries(dataframe=True)]
                  title_name = project_process_config['time_to_close_review_title']
                  file_path = os.path.join(data_path, file_label)
                  self.create_csv_fig_from_df(dataframes, file_path, headers,
                                              fig_type="bar", title=title_name)
                  i += 2
          """
          Patchsets per review
          description: median and average of the number of patchsets per review
          """
          if project_process_config['patchsets_metrics']:
              file_label = ""
              metrics = project_process_config['patchsets_metrics']
              headers = [metrics[0].id, metrics[1].id]
              dataframes = [metrics[0].timeseries(dataframe=True),
                            metrics[1].timeseries(dataframe=True)]
              file_label = metrics[0].DS_NAME + "_" + metrics[0].id + "_"
              file_label += metrics[1].DS_NAME + "_" + metrics[1].id
              file_path = os.path.join(data_path, file_label)
              title_name = project_process_config['patchsets_title']
              self.create_csv_fig_from_df(dataframes, file_path, headers,
                                          fig_type="bar", title=title_name)