예제 #1
0
    def _migrate_contribution(self, old_contrib, friendly_id):
        ac = old_contrib._Contribution__ac
        try:
            description = old_contrib._fields.get('content', '')
        except AttributeError:
            if not self.is_legacy_event:
                self.print_warning('Contribution {} has no fields'.format(old_contrib))
            description = ''
        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),
                               render_mode=RenderMode.html,
                               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(getattr(old_contrib, '_keywords', '')),
                               is_deleted=(status_class == 'ContribStatusWithdrawn'))
        if old_contrib._track is not None:
            track = self.event_ns.track_map.get(old_contrib._track)
            if not track:
                self.print_warning('Track not found: {}. Setting to None.'.format(old_contrib._track))
            else:
                contrib.track = track
        if not self.quiet:
            self.print_info('%[cyan]Contribution%[reset] {}'.format(contrib.title))
        self.event_ns.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.event_ns.legacy_contribution_type_map[old_contrib._type]
            except AttributeError:
                self.print_warning('%[yellow!]Invalid contrib type {}'
                                   .format(convert_to_unicode(old_contrib._type._name)))
        # abstract
        if old_contrib in self.event_ns.legacy_contribution_abstracts:
            contrib.abstract = self.event_ns.legacy_contribution_abstracts[old_contrib]
        # 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
        if hasattr(old_contrib, '_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