<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def push(self, patch=None, toa=None, meta=None):
 """Push a change on to the revision stack for this ObjectId. Pushing onto the stack is how you get revisions to be staged and scheduled for some future time. :param dict patch: None Denotes Delete :param int toa: Time of action :param dict meta: The meta data for this action """


        if not meta:
            meta = {}

        if not toa:
            toa = time.mktime(datetime.datetime.now().timetuple())

        if not isinstance(toa, int):
            toa = int(toa)

        #Documents should be stored in bson formats
        if isinstance(patch, dict):
            patch = self.revisions._dictionary_to_cursor(patch)

        action = None

        if isinstance(patch, type(None)):
            action = self.DELETE_ACTION
        elif self.master_id and isinstance(patch, dict):
            action = self.UPDATE_ACTION
            patch = self.__make_patch_storeable(patch)
            yield self._lazy_migration(meta=copy.deepcopy(meta), toa=toa-1)

        elif not self.master_id and isinstance(patch, dict):
            #Scheduled inserts will not have an object ID and one should be generated
            action = self.INSERT_ACTION
            patch["_id"] = ObjectId()
            self.master_id = patch["_id"].__str__()

        elif not action:
            raise RevisionActionNotValid()

        # We shall never store the _id to a patch dictionary
        if patch and patch.get("_id"):
            del patch["_id"]

        change = {
            "toa": toa,
            "processed": False,
            "collection": self.collection_name,
            "master_id": self.master_id,
            "action": action,
            "patch" : None if action == self.DELETE_ACTION else self.collection._dictionary_to_cursor(patch),
            "meta": meta
        }

        jsonschema.validate(change, self.SCHEMA)

        id = yield self.revisions.insert(change)

        raise Return(id)