Beispiel #1
0
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)
Beispiel #2
0
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
    )