def test_get_normalized_name__removes_honorifics(self): self.assertEqual(normalize_name("Rt Hon Alistair Darling"), "Alistair Darling") self.assertEqual(normalize_name("Sir Christopher Chope"), "Christopher Chope") # Check that name beginning with an honorific ("Sir") are unaffected. self.assertEqual(normalize_name("Sirius Snape"), "Sirius Snape")
def _update_lord_basic_info(data: MemberResponseData, house: House) -> None: member_id = data.get_parliament_id() party = get_or_create_party(data.get_party_id(), data.get_party()) is_active = data.get_is_active() try: lords_type, _ = LordsType.objects.get_or_create(name=data.get_lords_type()) except: lords_type = None Person.objects.update_or_create( parliamentdotuk=member_id, defaults={ "name": normalize_name(data.get_name()), "full_title": data.get_full_title(), "party": party, "lords_type": lords_type, "house": house, "date_entered_house": data.get_house_start_date(), "date_left_house": data.get_house_end_date(), "date_of_birth": data.get_date_of_birth(), "date_of_death": data.get_date_of_death(), "gender": data.get_gender(), "active": is_active, }, )
def _create_candidate( election_result: ConstituencyResultDetail, candidate, constituency: Constituency, election: Election, ): check_required_fields( candidate, contract.CANDIDATE_NAME, contract.CANDIDATE_PARTY, ) name = get_str(candidate, contract.CANDIDATE_NAME) person = get_member_for_election_result( normalize_name(name), constituency, election, ) party_name = get_str(candidate, contract.CANDIDATE_PARTY) party = get_party_by_name(party_name) votes = get_int(candidate, contract.CANDIDATE_VOTES) order = get_int(candidate, contract.CANDIDATE_ORDINAL) ConstituencyCandidate.objects.update_or_create( election_result=election_result, name=name, defaults={ "person": person, "votes": votes, "order": order, "party_name": party_name, "party": party, }, )
def _migrate_people_normalized_names(): people = Person.objects.all() for p in people: normalized_name = normalize_name(p.name) if normalized_name != p.name: print(f" [{p.pk}] {p.name} -> {normalized_name}") p.name = normalized_name p.save()
def _update_single_member(id: int = None, name: str = None): if id: member = Person.objects.get(pk=id) else: member = get_member_by_name(normalize_name(name)) if member is None: raise Exception(f"Member not found: name={name} [id={id}]") print(f"Trying to update portrait for member {member}") update_member_portrait(member) try: print(f"Portrait: {MemberPortrait.objects.get(person=member)}") except MemberPortrait.DoesNotExist: print(f"Unable to find portrait for member {member}")
def _update_sponsor(bill: Bill, data: dict): sponsor_name = get_str(data, contract.SPONSOR_NAME) normalized_name = normalize_name(sponsor_name) if not normalized_name: log.warning( f"Sponsor name is empty (bill:{bill.parliamentdotuk}): '{sponsor_name}' -> '{normalized_name}'" ) return person = get_member_by_name(normalized_name) BillSponsor.objects.update_or_create( name=normalized_name, bill=bill, defaults={ "person": person, }, )
def _update_mp_basic_info(data: MemberResponseData, house: House) -> None: member_id = data.get_parliament_id() party = get_or_create_party(data.get_party_id(), data.get_party()) is_active = data.get_is_active() if is_active: constituency = get_current_constituency(data.get_constituency()) else: constituency = get_constituency_for_date( data.get_constituency(), data.get_house_end_date() or data.get_house_start_date(), ) person, _ = Person.objects.update_or_create( parliamentdotuk=member_id, defaults={ "name": normalize_name(data.get_name()), "full_title": data.get_full_title(), "party": party, "constituency": constituency, "house": house, "date_entered_house": data.get_house_start_date(), "date_left_house": data.get_house_end_date(), "date_of_birth": data.get_date_of_birth(), "date_of_death": data.get_date_of_death(), "gender": data.get_gender(), "active": is_active, }, ) if is_active and constituency and house.name == HOUSE_OF_COMMONS: # If the member is registered to some other constituency, # remove that relation first before updating. existing = get_or_none(Constituency, mp__pk=member_id) if existing: existing.mp = None existing.save() constituency.mp = person constituency.save()
def _migrate_billsponsor_normalized_names(): sponsors = BillSponsor.objects.all() for sponsor in sponsors: try: name = sponsor.name or sponsor.person.name except AttributeError: print(f"[{sponsor.id}] No name!") continue normalized_name = normalize_name(name) person = get_member_by_name(normalized_name) if sponsor.person is not None and person != sponsor.person: print( f"Resolved person {person} != existing person {sponsor.person} (name={normalized_name}, id={sponsor.id})" ) elif sponsor.person != person or name != normalized_name: print( f"Update {name} [{sponsor.person}] -> {normalized_name} [{person}]" ) existing = BillSponsor.objects.filter( bill_id=sponsor.bill_id, person=person, ) pre_existing = existing.count() if pre_existing > 0: print(f"Clash detected {name} | {person} --- {existing}") if pre_existing == 1: clash = existing.first() print(f"Deleting duplicate {clash}") clash.delete() sponsor.name = normalized_name sponsor.person = person sponsor.save()
def test_get_normalized_name__normalises_whitespace(self): self.assertEqual(normalize_name("Caroline Lucas"), "Caroline Lucas") self.assertEqual(normalize_name("Lucas, Caroline"), "Caroline Lucas") self.assertEqual(normalize_name(" Caroline Lucas "), "Caroline Lucas") self.assertEqual(normalize_name(" Lucas, Caroline "), "Caroline Lucas")
def test_get_normalized_name__normalizes_name_ordering(self): """Names in the format `Surname, Forename` should be rearranged to `Forename Surname`""" self.assertEqual(normalize_name("Caroline Lucas"), "Caroline Lucas") self.assertEqual(normalize_name("Lucas, Caroline"), "Caroline Lucas")