def reconcile_repeat_records(self, voucher_updates): """ Mark updated records as "succeeded", all others as "cancelled" Delete duplicate records if any exist """ print "Reconciling repeat records" chemist_voucher_repeater_id = 'be435d3f407bfb1016cc89ebbf8146b1' lab_voucher_repeater_id = 'be435d3f407bfb1016cc89ebbfc42a47' already_seen = set() updates_by_voucher_id = {update.id: update for update in voucher_updates} headers = ['record_id', 'voucher_id', 'status'] rows = [] get_db = (lambda: IterDB(RepeatRecord.get_db())) if self.commit else MagicMock with get_db() as iter_db: for repeater_id in [chemist_voucher_repeater_id, lab_voucher_repeater_id]: print "repeater {}".format(repeater_id) records = iter_repeat_records_by_domain(self.domain, repeater_id=repeater_id) record_count = get_repeat_record_count(self.domain, repeater_id=repeater_id) for record in with_progress_bar(records, record_count): if record.payload_id in already_seen: status = "deleted" iter_db.delete(record) elif record.payload_id in updates_by_voucher_id: # add successful attempt status = "succeeded" attempt = RepeatRecordAttempt( cancelled=False, datetime=datetime.datetime.utcnow(), failure_reason=None, success_response="Paid offline via import_voucher_confirmations", next_check=None, succeeded=True, ) record.add_attempt(attempt) iter_db.save(record) else: # mark record as canceled record.add_attempt(RepeatRecordAttempt( cancelled=True, datetime=datetime.datetime.utcnow(), failure_reason="Cancelled during import_voucher_confirmations", success_response=None, next_check=None, succeeded=False, )) iter_db.save(record) already_seen.add(record.payload_id) rows.append([record._id, record.payload_id, status]) self.write_csv('repeat_records', headers, rows)
def _succeed_record(self, record, success_message, response_status): success_attempt = RepeatRecordAttempt( cancelled=False, datetime=datetime.datetime.utcnow(), success_response=success_message, succeeded=True, ) record.add_attempt(success_attempt) record.save()
def test_success(self): one_minute = timedelta(minutes=1) rec = RepeatRecord( domain=DOMAIN, repeater_id=self.rep.get_id, ) attempt = RepeatRecordAttempt( datetime=datetime.utcnow() - one_minute, success_response='w00t', succeeded=True, ) rec.add_attempt(attempt) self.assertEqual(rec.repeater.last_success_at, attempt.datetime) self.assertEqual(rec.repeater.failure_streak, 0)
def _succeed_record(self, record, success_message, response_status): success_attempt = RepeatRecordAttempt( cancelled=False, datetime=datetime.datetime.utcnow(), success_response=success_message, succeeded=True, ) record.add_attempt(success_attempt) mock_response = MagicMock() mock_response.status_code = response_status repeater = record.repeater repeater.generator.handle_success(mock_response, repeater.payload_doc(record), record) record.save()
def test_failure(self): one_minute = timedelta(minutes=1) rec = RepeatRecord( domain=DOMAIN, repeater_id=self.rep.get_id, ) attempt = RepeatRecordAttempt( datetime=datetime.utcnow() - one_minute, failure_reason='oops', succeeded=False, ) rec.add_attempt(attempt) self.assertIsNone(rec.repeater.last_success_at) self.assertEqual(rec.repeater.failure_streak, 1)