'Approve this attempt. `user_id`
Valid attempt statuses when calling this method:
`submitted`, `approved`, `denied`
Status after method completes: `approved`
Other fields that will be set by this method:
`reviewed_by_user_id`, `reviewed_by_service`, `error_msg`
State Transitions:
`submitted` â `approved`
This is the usual flow, whether initiated by a staff user or an
external validation service.
`approved` â `approved`
No-op. First one to approve it wins.
`denied` â `approved`
This might happen if a staff member wants to override a decision
made by an external service or another staff member (say, in
response to a support request). In this case, the previous values
of `reviewed_by_user_id` and `reviewed_by_service` will be changed
to whoever is doing the approving, and `error_msg` will be reset.
The only record that this record was ever denied would be in our
logs. This should be a relatively rare occurence.'

@status_before_must_be('must_retry', 'submitted', 'approved', 'denied')
def approve(self, user_id=None, service=''):

    if (self.status == 'approved'):
        return
    log.info(u"Verification    for    user    '{user_id}'    approved    by    '{reviewer}'.".format(user_id=self.user, reviewer=user_id))
    self.error_msg = ''
    self.error_code = ''
    self.reviewing_user = user_id
    self.reviewing_service = service
    self.status = 'approved'
    self.save()
    LEARNER_NOW_VERIFIED.send_robust(sender=PhotoVerification, user=self.user)
