def desc_cases(self): query = globals.db.query('cases', order_by='case_id') query.where_in('person_id', (self.id_a, self.id_b)) cases = {False: [], True: []} for case_id, deleted in query.fetchcols(('case_id', 'deleted')): cases[bool(deleted)].append(case_id) ids = ['%s' % case_id for case_id in cases[False]] + \ ['(%s)' % case_id for case_id in cases[True]] return utils.commalist(ids, 'and')
def desc_cases(self): query = globals.db.query('cases', order_by='case_id') query.where_in('person_id', (self.id_a, self.id_b)) cases = { False: [], True: [] } for case_id, deleted in query.fetchcols(('case_id', 'deleted')): cases[bool(deleted)].append(case_id) ids = ['%s' % case_id for case_id in cases[False]] + \ ['(%s)' % case_id for case_id in cases[True]] return utils.commalist(ids, 'and')
def merge(self, credentials): # lock the relevent cases persondupe.dupe_lock(globals.db) query = globals.db.query('cases', for_update=True) query.where_in('person_id', (self.id_a, self.id_b)) case_ids = query.fetchcols('case_id') # lock the person records and make sure they haven't changed # and estimate how how many changes each record might require a_delta_count = b_delta_count = 0 person_a, person_b = self._fetch_persons(for_update=True) for mc in self.fields: try: a_changed, b_changed = mc.apply(person_a, person_b) except PersonHasChanged: person_a.db_revert() person_b.db_revert() self.init_fields(person_a, person_b) raise if a_changed: a_delta_count += 1 if b_changed: b_delta_count += 1 # Now decide which direction to merge if b_delta_count > a_delta_count: update_person, delete_person = person_a, person_b else: update_person, delete_person = person_b, person_a # Update the log case_ids.sort() update_desc = update_person.db_desc() delete_desc = delete_person.db_desc() if not update_desc: update_desc = 'no edits required' if not delete_desc: delete_desc = 'no edits required' desc = 'Merge person, System IDs %s, UPDATED %s, DELETED %s' %\ (utils.commalist(case_ids, 'and'), update_desc, delete_desc) for case_id in case_ids: credentials.user_log(globals.db, desc, case_id=case_id) # Now update the cases and persons curs = globals.db.cursor() try: dbobj.execute( curs, 'UPDATE cases SET person_id=%s' ' WHERE person_id=%s', (update_person.person_id, delete_person.person_id)) finally: curs.close() fuzzyperson.update(globals.db, update_person.person_id, update_person.surname, update_person.given_names) update_person.db_update(refetch=False) delete_person.db_delete() # globals.db.rollback() # when testing return update_person, case_ids
def merge(self, credentials): # lock the relevent cases persondupe.dupe_lock(globals.db) query = globals.db.query('cases', for_update=True) query.where_in('person_id', (self.id_a, self.id_b)) case_ids = query.fetchcols('case_id') # lock the person records and make sure they haven't changed # and estimate how how many changes each record might require a_delta_count = b_delta_count = 0 person_a, person_b = self._fetch_persons(for_update=True) for mc in self.fields: try: a_changed, b_changed = mc.apply(person_a, person_b) except PersonHasChanged: person_a.db_revert() person_b.db_revert() self.init_fields(person_a, person_b) raise if a_changed: a_delta_count += 1 if b_changed: b_delta_count += 1 # Now decide which direction to merge if b_delta_count > a_delta_count: update_person, delete_person = person_a, person_b else: update_person, delete_person = person_b, person_a # Update the log case_ids.sort() update_desc = update_person.db_desc() delete_desc = delete_person.db_desc() if not update_desc: update_desc = 'no edits required' if not delete_desc: delete_desc = 'no edits required' desc = 'Merge person, System IDs %s, UPDATED %s, DELETED %s' %\ (utils.commalist(case_ids, 'and'), update_desc, delete_desc) for case_id in case_ids: credentials.user_log(globals.db, desc, case_id=case_id) # Now update the cases and persons curs = globals.db.cursor() try: dbobj.execute(curs, 'UPDATE cases SET person_id=%s' ' WHERE person_id=%s', (update_person.person_id, delete_person.person_id)) finally: curs.close() fuzzyperson.update(globals.db, update_person.person_id, update_person.surname, update_person.given_names) update_person.db_update(refetch=False) delete_person.db_delete() # globals.db.rollback() # when testing return update_person, case_ids
def describe_skip(self, skip): if not skip.show_msg: return labels = [] for value, label in self.choices: if value in skip.values: labels.append(label) if labels: op = 'selected' if skip.not_selected: op = 'did not select' return '%s %s' % (op, utils.commalist(labels))
def do_remove_selected(self, ctx, ignore): keys = ctx.locals.contacts.selected or ctx.locals.contacts.pkeys case_ids = [k[0] for k in keys] if len(case_ids) > 1 and not self.confirmed: raise ConfirmRemove(message='Dissociate %d cases with ID %s?' % (len(case_ids), ctx.locals.case.case_row.case_id)) contacts.dissociate_contacts(ctx.locals.case.case_row.case_id, case_ids) case = ctx.locals.case cs_name = '%d records dissocated from %s, %s (ID %s)' % ( len(case_ids), case.person.surname, case.person.given_names, case.case_row.case_id) ctx.locals.casesets.use(ctx.locals._credentials, caseset.CaseSet(case_ids, cs_name)) ctx.locals.contacts.select([]) ctx.locals.contacts.reset() ctx.locals.case.user_log('Dissociated ID(s) %s' % utils.commalist(case_ids, 'and')) globals.db.commit()
def do_remove_selected(self, ctx, ignore): keys = ctx.locals.contacts.selected or ctx.locals.contacts.pkeys case_ids = [k[0] for k in keys] if len(case_ids) > 1 and not self.confirmed: raise ConfirmRemove( message='Dissociate %d cases with ID %s?' % (len(case_ids), ctx.locals.case.case_row.case_id)) contacts.dissociate_contacts(ctx.locals.case.case_row.case_id, case_ids) case = ctx.locals.case cs_name = '%d records dissocated from %s, %s (ID %s)' % ( len(case_ids), case.person.surname, case.person.given_names, case.case_row.case_id) ctx.locals.casesets.use(ctx.locals._credentials, caseset.CaseSet(case_ids, cs_name)) ctx.locals.contacts.select([]) ctx.locals.contacts.reset() ctx.locals.case.user_log('Dissociated ID(s) %s' % utils.commalist(case_ids, 'and')) globals.db.commit()
def set_case_tags(case_id, tags): tags = tags_from_str(tags) bad_tags = tags.validate() if bad_tags: bad_tags.sort() bad_tags = utils.commalist(bad_tags, 'and') raise InvalidTags('Invalid tag(s): %s' % bad_tags) cur_tags = case_tags(case_id, for_update=True) del_tags = cur_tags - tags if del_tags: del_ids = del_tags.ids() query = globals.db.query('case_tags') query.where('case_id = %s', case_id) query.where_in('tag_id', del_ids) query.delete() add_tags = tags - cur_tags if add_tags: for id in add_tags.ids(): row = globals.db.new_row('case_tags') row.case_id = case_id row.tag_id = id row.db_update(refetch=False) return desc_changes(cur_tags, tags)
def fmt(person_id): ids = ['%s' % case_id for case_id in cases[(person_id, False)]] + \ ['(%s)' % case_id for case_id in cases[(person_id, True)]] return utils.commalist(ids, 'and')
def log_msg(self): return 'Associated contact ID(s) %s' % utils.commalist(self.pkeys, 'and')