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()