def fetch_activity(self, may_contact_only=True):
        roles = Role.objects.filter(name__in=['instructor', 'helper'])
        instructor_badges = Badge.objects.instructor_badges()

        instructors = Person.objects.filter(badges__in=instructor_badges)
        instructors = instructors.exclude(email__isnull=True)
        if may_contact_only:
            instructors = instructors.exclude(may_contact=False)

        # let's get some things faster
        instructors = instructors.select_related('airport') \
                                 .prefetch_related('task_set', 'lessons',
                                                   'award_set', 'badges')

        # don't repeat the records
        instructors = instructors.distinct()

        result = []
        for person in instructors:
            tasks = person.task_set.filter(role__in=roles) \
                                   .select_related('event', 'role')
            record = {
                'person': person,
                'lessons': person.lessons.all(),
                'instructor_awards': person.award_set.filter(
                    badge__in=person.badges.instructor_badges()
                ),
                'tasks': zip(tasks,
                             self.foreign_tasks(tasks, person, roles)),
            }
            result.append(record)

        return result