Example #1
0
    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()
Example #3
0
    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)
Example #4
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()
Example #5
0
    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)