def get_masterrecords_related_to_person(
    jtrace: Session,
    person_id: int,
    user: UKRDCUser,
    nationalid_type: Optional[str] = None,
) -> Query:
    """Get a query of MasterRecords related via the LinkRecord network to a given Person

    Args:
        jtrace (Session): JTRACE SQLAlchemy session
        person_id (int): Person ID
        user (UKRDCUser): Logged-in user
        nationalid_type (str, optional): National ID type to filter by. E.g. "UKRDC"

    Returns:
        Query: SQLAlchemy query
    """
    person = get_person(jtrace, person_id, user)

    # Get a set of related link record (id, person_id, master_id) tuples
    related_person_master_links: set[
        PersonMasterLink] = find_related_link_records(jtrace,
                                                      person_id=person.id)

    # Find all related master records within the UKRDC
    master_with_ukrdc = jtrace.query(MasterRecord).filter(
        MasterRecord.id.in_(
            [link.master_id for link in related_person_master_links]))

    if nationalid_type:
        master_with_ukrdc = master_with_ukrdc.filter(
            MasterRecord.nationalid_type == nationalid_type)

    return master_with_ukrdc
Beispiel #2
0
async def unlink_person_from_master_record(
    person_id: int,
    master_id: int,
    comment: Optional[str],
    user: UKRDCUser,
    jtrace: Session,
    mirth: MirthAPI,
    redis: Redis,
) -> LinkRecordSchema:
    """Unlink a particular Person record from a Master Record"""
    # Get records to assert user permission
    person = get_person(jtrace, person_id, user)
    master = get_masterrecord(jtrace, master_id, user)

    # Build and send the unlink message
    await safe_send_mirth_message_to_name(
        "Unlink",
        build_unlink_message(master.id,
                             person.id,
                             user.email,
                             description=comment),
        mirth,
        redis,
    )

    await sleep(0.5)  # Wait for the message to be processed (complete guess)

    # Find the new Master Record
    first_link_related_to_person = (jtrace.query(LinkRecord).filter(
        LinkRecord.person_id == person.id).first())

    return LinkRecordSchema.from_orm(first_link_related_to_person)
Beispiel #3
0
def person_detail(
        person_id: int,
        user: UKRDCUser = Security(auth.get_user()),
        jtrace: Session = Depends(get_jtrace),
        audit: Auditer = Depends(get_auditer),
):
    """Retreive a particular Person record from the EMPI"""
    person = get_person(jtrace, person_id, user)
    audit.add_event(Resource.PERSON, person.id, AuditOperation.READ)
    return person
Beispiel #4
0
def person_masterrecords(
        person_id: int,
        user: UKRDCUser = Security(auth.get_user()),
        jtrace: Session = Depends(get_jtrace),
        audit: Auditer = Depends(get_auditer),
):
    """Retreive MasterRecords directly linked to a particular Person record"""
    person: Person = get_person(jtrace, person_id, user)
    related_master_ids = [link.master_id for link in person.link_records]
    records = (get_masterrecords(jtrace, user).filter(
        MasterRecord.id.in_(related_master_ids)).all())

    for record in records:
        audit.add_event(Resource.MASTER_RECORD, record.id, AuditOperation.READ)

    return records
Beispiel #5
0
def test_get_person_denied(jtrace_session, test_user):
    with pytest.raises(PermissionsError):
        persons.get_person(jtrace_session, 2, test_user)
Beispiel #6
0
def test_get_person_user(jtrace_session, test_user):
    record = persons.get_person(jtrace_session, 1, test_user)
    assert record
    assert record.id == 1