'Create the Approval object and notify the Approval Granter.'

def Request(self):

    approval_id = ('approval:%X' % utils.PRNG.GetULong())
    approval_urn = self.BuildApprovalUrn(approval_id)
    subject_title = self.BuildSubjectTitle()
    email_msg_id = email.utils.make_msgid()
    with aff4.FACTORY.Create(approval_urn, self.approval_type, mode='w', token=self.token) as approval_request:
        approval_request.Set(approval_request.Schema.SUBJECT(self.subject_urn))
        approval_request.Set(approval_request.Schema.REQUESTOR(self.token.username))
        approval_request.Set(approval_request.Schema.REASON(self.reason))
        approval_request.Set(approval_request.Schema.EMAIL_MSG_ID(email_msg_id))
        cc_addresses = (self.email_cc_address, config.CONFIG.Get('Email.approval_cc_address'))
        email_cc = ','.join(filter(None, cc_addresses))
        if email_cc:
            reply_cc = ','.join((self.approver, email_cc))
        else:
            reply_cc = self.approver
        approval_request.Set(approval_request.Schema.EMAIL_CC(reply_cc))
        approval_request.Set(approval_request.Schema.NOTIFIED_USERS(self.approver))
        approval_request.AddAttribute(approval_request.Schema.APPROVER(self.token.username))
    approval_link_urns = self.BuildApprovalSymlinksUrns(approval_id)
    for link_urn in approval_link_urns:
        with aff4.FACTORY.Create(link_urn, aff4.AFF4Symlink, mode='w', token=self.token) as link:
            link.Set(link.Schema.SYMLINK_TARGET(approval_urn))
    for user in self.approver.split(','):
        user = user.strip()
        try:
            fd = aff4.FACTORY.Open(aff4.ROOT_URN.Add('users').Add(user), aff4_type=aff4_users.GRRUser, mode='rw', token=self.token)
        except aff4.InstantiationError:
            continue
        fd.Notify('GrantAccess', approval_urn, ('Please    grant    access    to    %s' % subject_title), '')
        fd.Close()
    if (not config.CONFIG.Get('Email.send_approval_emails')):
        return approval_urn
    reason = self.CreateReasonHTML(utils.SmartStr(self.reason))
    template = u'\n<html><body><h1>Approval    to    access\n<a    href=\'%(admin_ui)s#%(approval_url)s\'>%(subject_title)s</a>    requested.</h1>\n\nThe    user    "%(username)s"    has    requested    access    to\n<a    href=\'%(admin_ui)s#%(approval_url)s\'>%(subject_title)s</a>\nfor    the    purpose    of    "%(reason)s".\n\nPlease    click    <a    href=\'%(admin_ui)s#%(approval_url)s\'>\nhere\n</a>    to    review    this    request    and    then    grant    access.\n\n<p>Thanks,</p>\n<p>%(signature)s</p>\n<p>%(image)s</p>\n</body></html>'
    image = config.CONFIG['Email.approval_signature']
    body = (template % dict(username=self.token.username, reason=reason, admin_ui=config.CONFIG['AdminUI.url'], subject_title=subject_title, approval_url=self.BuildApprovalReviewUrlPath(approval_id), image=image, signature=config.CONFIG['Email.signature']))
    email_alerts.EMAIL_ALERTER.SendEmail(self.approver, utils.SmartStr(self.token.username), (u'Approval    for    %s    to    access    %s.' % (self.token.username, subject_title)), utils.SmartStr(body), is_html=True, cc_addresses=email_cc, message_id=email_msg_id)
    return approval_urn
