@classmethod
  @gen.coroutine
  def CreateNew(cls, client, **vp_dict):
    tasks = []

    # Create the viewpoint.
    assert 'viewpoint_id' in vp_dict and 'user_id' in vp_dict and 'timestamp' in vp_dict, vp_dict
    viewpoint = Viewpoint.CreateFromKeywords(**vp_dict)
    viewpoint.last_updated = viewpoint.timestamp
    viewpoint.update_seq = 0
    tasks.append(gen.Task(viewpoint.Update, client))

    # Create the follower and give all permissions, since it's the owner.
    foll_dict = {'user_id': viewpoint.user_id,
                 'viewpoint_id': viewpoint.viewpoint_id,
                 'timestamp': viewpoint.timestamp,
                 'labels': list(Follower.PERMISSION_LABELS),
                 'viewed_seq': 0}
    if viewpoint.IsDefault():
      foll_dict['labels'].append(Follower.PERSONAL)

    follower = Follower.CreateFromKeywords(**foll_dict)
    tasks.append(gen.Task(follower.Update, client))

    # Create the corresponding Followed record.
    tasks.append(gen.Task(Followed.UpdateDateUpdated,
                          client,
                          viewpoint.user_id,
                          viewpoint.viewpoint_id,
                          old_timestamp=None,
                          new_timestamp=viewpoint.last_updated))
    yield tasks

    raise gen.Return((viewpoint, follower))
Creates the viewpoint specified by 'vp_dict' and creates a follower relation between
dataset/ETHPy150Open viewfinderco/viewfinder/backend/db/viewpoint.py/Viewpoint.CreateNew