def perform_update(self): payment_client = PaymentClient() payments = payment_client.get_incomplete_payments() for payment in payments: if not self.should_be_checked(payment): continue payment_ref = payment['uuid'] govuk_id = payment['processor_id'] try: govuk_payment = payment_client.get_govuk_payment(govuk_id) previous_govuk_status = GovUkPaymentStatus.get_from_govuk_payment( govuk_payment) govuk_status = payment_client.complete_payment_if_necessary( payment, govuk_payment) # not yet finished and can't do anything so skip if govuk_status and not govuk_status.finished(): continue if previous_govuk_status != govuk_status: # refresh govuk payment to get up-to-date fields (e.g. error codes) govuk_payment = payment_client.get_govuk_payment(govuk_id) # if here, status is either success, failed, cancelled, error # or None (in case of govuk payment not found) payment_client.update_completed_payment(payment, govuk_payment) except OAuth2Error: logger.exception( 'Scheduled job: Authentication error while processing %s' % payment_ref) except RequestException as error: error_message = 'Scheduled job: Payment check failed for ref %s' % payment_ref if hasattr(error, 'response') and hasattr( error.response, 'content'): error_message += '\nReceived: %s' % error.response.content logger.exception(error_message) except GovUkPaymentStatusException: # expected much of the time pass