コード例 #1
0
class SrcExtidRemover(object):
    def __init__(self, co, pe, ssys, external_id_type):
        self.co = co
        self.pe = pe
        self.ssys = ssys
        self.external_id_type = external_id_type
        self.other_ssys = set(
            co.human2constant(s)
            for s in SYSTEM_LOOKUP_ORDER) - set([self.ssys])
        log_ents = ['Checking:'] + [text_type(s) for s in self.other_ssys]
        logger.debug(' '.join(log_ents))
        self.dump = []
        self.stream = None

    def get_persons(self):
        """
        :return generator:
            A generator that yields persons with the given id types.
        """
        logger.debug('get_persons ...')
        for row in self.pe.search_external_ids(
                source_system=self.ssys,
                id_type=self.external_id_type,
                entity_type=self.co.entity_person,
                fetchall=False):
            yield {
                'entity_id': int(row['entity_id']),
                'ext_id': int(row['external_id']),
            }

    def in_other_ssys(self):
        """
        :return bool:
            True iff external id exists in any other relevant source system
        """
        for o_ssys in self.other_ssys:
            if self.pe.get_external_id(o_ssys, self.external_id_type):
                return True
        return False

    def remover(self):
        """
        delete external id from source system if it exists in
        """
        logger.debug('start remover ...')
        for i, person in enumerate(self.get_persons()):
            self.pe.clear()
            self.pe.find(person['entity_id'])
            if self.in_other_ssys():
                self.pe._delete_external_id(self.ssys, self.external_id_type)
                self.dump.append(person)
            if not (i + 1) % 10000:
                logger.debug(' remover: Treated {} entities'.format(i + 1))

    def get_output_stream(self, filename, codec):
        """ Get a unicode-compatible stream to write. """
        if filename == '-':
            self.stream = sys.stdout
        else:
            self.stream = AtomicFileWriter(filename,
                                           mode='w',
                                           encoding=codec.name)

    def write_csv_report(self):
        """ Write a CSV report to a stream.

        :param stream: file-like object that can write unicode strings
        :param persons: iterable with mappings that has keys ('ext_id', 'name')
        """
        writer = UnicodeWriter(self.stream, dialect=CerebrumDialect)
        for person in self.dump:
            writer.writerow((person['ext_id'], person['entity_id'],
                             time.strftime('%m/%d/%Y %H:%M:%S')))
        self.stream.flush()
        if self.stream is not sys.stdout:
            self.stream.close()