def add_parties_and_attorneys(d, parties): """Add parties and attorneys from the docket data to the docket. :param d: The docket to update :param parties: The parties to update the docket with, with their associated attorney objects. This is typically the docket_data['parties'] field. :return: None """ normalize_attorney_roles(parties) updated_parties = set() updated_attorneys = set() for party in parties: ps = Party.objects.filter(name=party['name'], party_types__docket=d).distinct() count = ps.count() if count == 0: try: p = Party.objects.create(name=party['name']) except IntegrityError: # Race condition. Object was created after our get and before # our create. Try to get it again. ps = Party.objects.filter(name=party['name'], party_types__docket=d).distinct() count = ps.count() if count == 1: p = ps[0] elif count >= 2: p = ps.earliest('date_created') updated_parties.add(p.pk) # If the party type doesn't exist, make a new one. pts = p.party_types.filter(docket=d, name=party['type']) criminal_data = party.get('criminal_data') update_dict = { 'extra_info': party.get('extra_info', ''), 'date_terminated': party.get('date_terminated'), } if criminal_data: update_dict['highest_offense_level_opening'] = criminal_data[ 'highest_offense_level_opening'] update_dict['highest_offense_level_terminated'] = criminal_data[ 'highest_offense_level_terminated'] if pts.exists(): pts.update(**update_dict) pt = pts[0] else: pt = PartyType.objects.create(docket=d, party=p, name=party['type'], **update_dict) # Criminal counts and complaints if criminal_data and criminal_data['counts']: CriminalCount.objects.filter(party_type=pt).delete() CriminalCount.objects.bulk_create([ CriminalCount(party_type=pt, name=criminal_count['name'], disposition=criminal_count['disposition'], status=CriminalCount.normalize_status( criminal_count['status'])) for criminal_count in criminal_data['counts'] ]) if criminal_data and criminal_data['complaints']: CriminalComplaint.objects.filter(party_type=pt).delete() CriminalComplaint.objects.bulk_create([ CriminalComplaint( party_type=pt, name=complaint['name'], disposition=complaint['disposition'], ) for complaint in criminal_data['complaints'] ]) # Attorneys for atty in party.get('attorneys', []): updated_attorneys.add(add_attorney(atty, p, d)) disassociate_extraneous_entities(d, parties, updated_parties, updated_attorneys)
def add_parties_and_attorneys(d, parties): """Add parties and attorneys from the docket data to the docket. :param d: The docket to update :param parties: The parties to update the docket with, with their associated attorney objects. This is typically the docket_data['parties'] field. :return: None """ if not parties: # Exit early if no parties. Some dockets don't have any due to user # preference, and if we don't bail early, we risk deleting everything # we have. return normalize_attorney_roles(parties) updated_parties = set() updated_attorneys = set() for party in parties: ps = Party.objects.filter( name=party["name"], party_types__docket=d ).distinct() count = ps.count() if count == 0: try: p = Party.objects.create(name=party["name"]) except IntegrityError: # Race condition. Object was created after our get and before # our create. Try to get it again. ps = Party.objects.filter( name=party["name"], party_types__docket=d ).distinct() count = ps.count() if count == 1: p = ps[0] elif count >= 2: p = ps.earliest("date_created") updated_parties.add(p.pk) # If the party type doesn't exist, make a new one. pts = p.party_types.filter(docket=d, name=party["type"]) criminal_data = party.get("criminal_data") update_dict = { "extra_info": party.get("extra_info", ""), "date_terminated": party.get("date_terminated"), } if criminal_data: update_dict["highest_offense_level_opening"] = criminal_data[ "highest_offense_level_opening" ] update_dict["highest_offense_level_terminated"] = criminal_data[ "highest_offense_level_terminated" ] if pts.exists(): pts.update(**update_dict) pt = pts[0] else: pt = PartyType.objects.create( docket=d, party=p, name=party["type"], **update_dict ) # Criminal counts and complaints if criminal_data and criminal_data["counts"]: CriminalCount.objects.filter(party_type=pt).delete() CriminalCount.objects.bulk_create( [ CriminalCount( party_type=pt, name=criminal_count["name"], disposition=criminal_count["disposition"], status=CriminalCount.normalize_status( criminal_count["status"] ), ) for criminal_count in criminal_data["counts"] ] ) if criminal_data and criminal_data["complaints"]: CriminalComplaint.objects.filter(party_type=pt).delete() CriminalComplaint.objects.bulk_create( [ CriminalComplaint( party_type=pt, name=complaint["name"], disposition=complaint["disposition"], ) for complaint in criminal_data["complaints"] ] ) # Attorneys for atty in party.get("attorneys", []): updated_attorneys.add(add_attorney(atty, p, d)) disassociate_extraneous_entities( d, parties, updated_parties, updated_attorneys )