docs: def make_grid(self):
          """
          return grid
          """
          changes = None
          # if there is a MagicDataFrame, extract data from it
          if isinstance(self.magic_dataframe, cb.MagicDataFrame):
              # get columns and reorder slightly
              col_labels = list(self.magic_dataframe.df.columns)
              for ex_col in self.exclude_cols:
                  col_labels.pop(ex_col)
              if self.grid_type == 'ages':
                  levels = ['specimen', 'sample', 'site', 'location']
                  for label in levels[:]:
                      if label in col_labels:
                          col_labels.remove(label)
                      else:
                          levels.remove(label)
                  col_labels[:0] = levels
              else:
                  if self.parent_type:
                      if self.parent_type[:-1] in col_labels:
                          col_labels.remove(self.parent_type[:-1])
                      col_labels[:0] = [self.parent_type[:-1]]
                  if self.grid_type[:-1] in col_labels:
                      col_labels.remove(self.grid_type[:-1])
                  col_labels[:0] = (self.grid_type[:-1],)
              for col in col_labels:
                  if col not in self.magic_dataframe.df.columns:
                      self.magic_dataframe.df[col] = None
              self.magic_dataframe.df = self.magic_dataframe.df[col_labels]
              self.magic_dataframe.sort_dataframe_cols()
              col_labels = list(self.magic_dataframe.df.columns)
              row_labels = self.magic_dataframe.df.index
              # make sure minimum defaults are present
              for header in self.reqd_headers:
                  if header not in col_labels:
                      changes = set([1])
                      col_labels.append(header)
          # if there is no pre-existing MagicDataFrame,
          # make a blank grid with do some defaults:
          else:
              # default headers
              #col_labels = list(self.data_model.get_headers(self.grid_type, 'Names'))
              #col_labels[:0] = self.reqd_headers
              col_labels = list(self.reqd_headers)
              if self.grid_type in ['specimens', 'samples', 'sites']:
                  col_labels.extend(['age', 'age_sigma'])
              ## use the following line if you want sorted column labels:
              #col_labels = sorted(set(col_labels))
              # defaults are different for ages
              if self.grid_type == 'ages':
                  levels = ['specimen', 'sample', 'site', 'location']
                  for label in levels:
                      if label in col_labels:
                          col_labels.remove(label)
                  col_labels[:0] = levels
              else:
                  if self.parent_type:
                      col_labels.remove(self.parent_type[:-1])
                      col_labels[:0] = [self.parent_type[:-1]]
                  col_labels.remove(self.grid_type[:-1])
                  col_labels[:0] = [self.grid_type[:-1]]
          # make sure all reqd cols are in magic_dataframe
          for col in col_labels:
              if col not in self.magic_dataframe.df.columns:
                  self.magic_dataframe.df[col] = None
          # make the grid
          if not self.huge:
              grid = magic_grid.MagicGrid(parent=self.panel, name=self.grid_type,
                                          row_labels=[], col_labels=col_labels)
          # make the huge grid
          else:
              row_labels = self.magic_dataframe.df.index
              grid = magic_grid.HugeMagicGrid(parent=self.panel, name=self.grid_type,
                              row_labels=row_labels, col_labels=col_labels)
          grid.do_event_bindings()
          grid.changes = changes
  
          self.grid = grid
          return grid