@classmethod
  @gen.coroutine
  def _CheckCopySources(cls, action, client, user_id, source_ep_dicts):
    # Gather list of (episode_id, photo_ids) tuples and check for duplicate posts.
    unique_keys = set()
    ep_ph_ids_list = []
    for ep_dict in source_ep_dicts:
      ph_ids = []
      for photo_id in ep_dict['photo_ids']:
        db_key = (ep_dict['new_episode_id'], photo_id)
        if db_key in unique_keys:
          raise InvalidRequestError('Photo "%s" cannot be %sd into episode "%s" more than once in same request.' %
                                    (photo_id, action, ep_dict['new_episode_id']))
        unique_keys.add(db_key)
        ph_ids.append(photo_id)

      ep_ph_ids_list.append((ep_dict['existing_episode_id'], ph_ids))

    ep_posts_list = yield ViewfinderOperation._CheckEpisodePostAccess(action, client, user_id, ep_ph_ids_list)
    raise gen.Return(ep_posts_list)
Ensures that the sharer or saver has access to the source episodes and that the source
dataset/ETHPy150Open viewfinderco/viewfinder/backend/op/viewfinder_op.py/ViewfinderOperation._CheckCopySources