def _migrate_contribution(self, old_contrib, friendly_id):
        ac = old_contrib._Contribution__ac
        description = old_contrib._fields.get('content', '')
        description = convert_to_unicode(getattr(description, 'value', description))  # str or AbstractFieldContent
        status = getattr(old_contrib, '_status', None)
        status_class = status.__class__.__name__ if status else None

        contrib = Contribution(event_new=self.event, friendly_id=friendly_id,
                               title=convert_to_unicode(old_contrib.title),
                               description=description, duration=old_contrib.duration,
                               protection_mode=PROTECTION_MODE_MAP[ac._accessProtection],
                               board_number=convert_to_unicode(getattr(old_contrib, '_boardNumber', '')),
                               keywords=self._process_keywords(old_contrib._keywords),
                               is_deleted=(status_class == 'ContribStatusWithdrawn'))
        if old_contrib._track is not None:
            contrib.track_id = int(old_contrib._track.id)
        if not self.importer.quiet:
            self.importer.print_info(cformat('%{cyan}Contribution%{reset} {}').format(contrib.title))
        self.legacy_contribution_map[old_contrib] = contrib
        contrib.legacy_mapping = LegacyContributionMapping(event_new=self.event, legacy_contribution_id=old_contrib.id)
        # contribution type
        if old_contrib._type is not None:
            try:
                contrib.type = self.legacy_contribution_type_map[old_contrib._type]
            except AttributeError:
                self.importer.print_warning(cformat('%{yellow!}Invalid contrib type {}')
                                            .format(convert_to_unicode(old_contrib._type._name)),
                                            event_id=self.event.id)
        # ACLs (managers, read access, submitters)
        principals = {}
        self._process_ac(ContributionPrincipal, principals, ac)
        for submitter in old_contrib._submitters:
            self._process_principal(ContributionPrincipal, principals, submitter, 'Submitter', roles={'submit'})
        self._process_principal_emails(ContributionPrincipal, principals, getattr(old_contrib, '_submittersEmail', []),
                                       'Submitter', roles={'submit'})
        contrib.acl_entries = set(principals.itervalues())
        # speakers, authors and co-authors
        contrib.person_links = list(self._migrate_contribution_person_links(old_contrib))
        # references ("report numbers")
        contrib.references = list(self._process_references(ContributionReference, old_contrib))
        # contribution/abstract fields
        contrib.field_values = list(self._migrate_contribution_field_values(old_contrib))
        contrib.subcontributions = [self._migrate_subcontribution(old_contrib, old_subcontrib, pos)
                                    for pos, old_subcontrib in enumerate(old_contrib._subConts, 1)]
        contrib._last_friendly_subcontribution_id = len(contrib.subcontributions)
        return contrib