code: def copy_dash(self, dashboard_id):
          
          session = db.session()
          data = json.loads(request.form.get('data'))
          dash = models.Dashboard()
          original_dash = (
              session
              .query(models.Dashboard)
              .filter_by(id=dashboard_id).first())
  
          dash.owners = [g.user] if g.user else []
          dash.dashboard_title = data['dashboard_title']
  
          if data['duplicate_slices']:
              # Duplicating slices as well, mapping old ids to new ones
              old_to_new_sliceids = {}
              for slc in original_dash.slices:
                  new_slice = slc.clone()
                  new_slice.owners = [g.user] if g.user else []
                  session.add(new_slice)
                  session.flush()
                  new_slice.dashboards.append(dash)
                  old_to_new_sliceids['{}'.format(slc.id)] = \
                      '{}'.format(new_slice.id)
  
              # update chartId of layout entities
              # in v2_dash positions json data, chartId should be integer,
              # while in older version slice_id is string type
              for value in data['positions'].values():
                  if (
                      isinstance(value, dict) and value.get('meta') and
                      value.get('meta').get('chartId')
                  ):
                      old_id = '{}'.format(value.get('meta').get('chartId'))
                      new_id = int(old_to_new_sliceids[old_id])
                      value['meta']['chartId'] = new_id
          else:
              dash.slices = original_dash.slices
          dash.params = original_dash.params
  
          self._set_dash_metadata(dash, data)
          session.add(dash)
          session.commit()
          dash_json = json.dumps(dash.data)
          session.close()
          return json_success(dash_json)
docs: Copy dashboard