def handle(self, *args, **options):
        now = timezone.now()
        try:
            last_import_run = ImportRun.objects.latest('timestamp')
            since = last_import_run.timestamp
        except ImportRun.DoesNotExist:
            since = now - timedelta(days=3)
        ImportRun.objects.create(timestamp=now)

        changed_sprinters = set()
        trac_importer = TracImporter()
        changed_sprinters.update(trac_importer.sync(since))

        github_importer = GithubImporter()
        changed_sprinters.update(github_importer.sync(since))
        process_achievements(changed_sprinters)
 def setUp(self):
     self.since = make_aware(datetime(2013, 1, 1, 13, 46), utc)
     self.proxy = FakeProxy(self.since)
     self.importer = Importer(self.proxy)
class ImporterTest(TestCase):
    def setUp(self):
        self.since = make_aware(datetime(2013, 1, 1, 13, 46), utc)
        self.proxy = FakeProxy(self.since)
        self.importer = Importer(self.proxy)

    def test_changed_tickets_get_created(self):
        self.importer.sync(self.since)
        expect(Ticket.objects.count()) == 2

    def test_created_tickets_get_attributes(self):
        self.importer.sync(self.since)
        ticket = Ticket.objects.all()[0]
        expect(ticket.component) == u"Forms"
        expect(ticket.severity) == u"Normal"
        expect(ticket.status) == u"new"
        expect(ticket.kind) == u"New feature"
        expect(ticket.resolution) == u""

    def test_tickets_get_changes(self):
        self.importer.sync(self.since)
        ticket = Ticket.objects.all()[0]
        expect(len(ticket.changes.all())) == 2

    def test_ticket_change_get_attributes(self):
        self.importer.sync(self.since)
        ticket = Ticket.objects.all()[0]
        change = ticket.changes.latest("timestamp")
        expect(change.author) == u"bob"
        expect(change.field) == u"status"
        expect(change.old_value) == u"new"
        expect(change.new_value) == u"assigned"

    def test_sync_is_idempotent(self):
        self.importer.sync(self.since)
        self.importer.sync(self.since)
        expect(Ticket.objects.count()) == 2
        ticket = Ticket.objects.all()[0]
        expect(ticket.changes.count()) == 2

    def test_no_sprinter_no_change(self):
        self.importer.sync(self.since)
        expect(SprinterChange.objects.count()) == 0

    def test_adds_sprinter_changes(self):
        user = User.objects.create(username="******")
        sprinter = Sprinter.objects.create(user=user, trac_login="******")
        self.importer.sync(self.since - timedelta(hours=1))
        expect(SprinterChange.objects.count()) == 2
        sprinter_change = sprinter.changes.latest("pk")
        expect(sprinter_change.field) == u"comment"
        expect(sprinter_change.kind) == u"New feature"
        expect(sprinter_change.status) == u"new"
        expect(sprinter_change.severity) == u"Normal"
        expect(sprinter_change.resolution) == u""
        expect(sprinter_change.ticket_id) == 12345