예제 #1
0
 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')
예제 #2
0
 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')
예제 #3
0
 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
예제 #4
0
    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
예제 #5
0
 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))
예제 #6
0
 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))
예제 #7
0
 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()
예제 #8
0
 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()
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
 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')
예제 #12
0
 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')
예제 #13
0
 def log_msg(self):
     return 'Associated contact ID(s) %s' % utils.commalist(self.pkeys, 'and')