Esempio n. 1
0
def create_order_line(record):
    """Create an OrderLine."""
    try:
        item = get_item_by_barcode(record["barcode"])
        document_pid = item.get("document_pid")
        item_medium = item.get("medium")
    except ItemMigrationError:
        document_pid = get_migration_document_pid()
        item_medium = DEFAULT_ITEM_MEDIUM

    new_order_line = dict(
        document_pid=document_pid,
        patron_pid=get_patron_pid(record),
        recipient=get_recipient(record),
        medium=item_medium,
        payment_mode="MIGRATED_UNKNOWN",
        copies_ordered=1,  # default 1 because is required
    )

    total_price = get_cost(record)
    if total_price:
        new_order_line.update(total_price=total_price)

    if record.get("budget_code"):
        new_order_line.update(budget_code=record.get("budget_code"))

    return new_order_line
Esempio n. 2
0
def clean_record_json(record):
    """Create a record for ILS."""
    document_pid = None
    try:
        item = get_item_by_barcode(record["barcode"])
        document_pid = item.get("document_pid")
    except ItemMigrationError:
        document_pid = get_migration_document_pid()

    # library_pid
    library = get_library_by_legacy_id(record["id_crcLIBRARY"])
    library_pid = library.pid.pid_value

    new_record = dict(
        document_pid=document_pid,
        legacy_id=record.get("legacy_id"),
        library_pid=library_pid,
        patron_pid=get_patron_pid(record),
        status=get_status(record),
        type=get_type(record),
    )

    # Optional fields
    expected_delivery_date = record.get("expected_date")
    if expected_delivery_date:
        new_record.update(
            expected_delivery_date=get_date(expected_delivery_date)
        )

    received_date = record.get("arrival_date")
    if received_date:
        new_record.update(received_date=get_date(received_date))

    request_date = record.get("request_date")
    if request_date:
        new_record.update(request_date=get_date(request_date))

    due_date = record.get("due_date")
    if due_date:
        new_record.update(due_date=get_date(due_date))

    total = get_cost(record)
    if total:
        new_record.update(total=total)

    notes = get_acq_ill_notes(record)
    if notes:
        new_record.update(notes=notes)

    budget_code = record.get("budget_code")
    if budget_code:
        new_record.update(budget_code=budget_code)

    return new_record
Esempio n. 3
0
def create_order_line(record, order_status):
    """Create an OrderLine."""
    document_cls = current_app_ils.document_record_cls
    barcode = record.get("barcode").replace("No barcode associated", "")
    item_medium = DEFAULT_ITEM_MEDIUM

    try:
        if barcode:
            item = get_item_by_barcode(barcode)
            document_pid = item["document_pid"]
            item_medium = item.get("medium", DEFAULT_ITEM_MEDIUM)
        else:
            document_pid = find_correct_document_pid(record)
    except ItemMigrationError:
        document_pid = find_correct_document_pid(record)

    if document_pid != MIGRATION_DOCUMENT_PID:
        document = document_cls.get_record_by_pid(document_pid)
        if document["document_type"] == "BOOK":
            item_medium = "PAPER"

    if record["request_type"] == 'acq-book':
        item_medium = "PAPER"

    new_order_line = dict(
        document_pid=document_pid,
        patron_pid=get_patron_pid(record),
        recipient=get_recipient(record),
        medium=item_medium,
        payment_mode=get_payment_mode(record),
        copies_ordered=1,  # default 1 because is required
    )

    if order_status == "RECEIVED":
        new_order_line.update({"copies_received": 1})

    total_price = get_cost(record)
    if total_price:
        new_order_line.update(total_price=total_price)

    if record.get("budget_code"):
        new_order_line.update(payment_mode="BUDGET_CODE",
                              budget_code=record.get("budget_code"))

    return new_order_line
Esempio n. 4
0
def import_loans_from_json(dump_file):
    """Imports loan objects from JSON."""
    dump_file = dump_file[0]
    document_class = current_app_ils.document_record_cls
    loans = []
    (
        default_location_pid_value,
        _,
    ) = current_app_ils.get_default_location_pid
    with click.progressbar(json.load(dump_file)) as bar:
        for record in bar:
            click.echo('Importing loan "{0}"...'.format(record["legacy_id"]))
            user = get_user_by_legacy_id(record["id_crcBORROWER"])
            if not user:
                # user was deleted, fallback to the AnonymousUser
                anonym = current_app.config["ILS_PATRON_ANONYMOUS_CLASS"]
                patron_pid = anonym.id
            else:
                patron_pid = user.pid
            try:
                item = get_item_by_barcode(record["item_barcode"])
            except ItemMigrationError:
                records_logger.error(
                    "LOAN: {0}, ERROR: barcode {1} not found.".format(
                        record["legacy_id"], record["item_barcode"]
                    )
                )
                continue
                # Todo uncomment when more data
                # raise LoanMigrationError(
                #    'no item found with the barcode {} for loan {}'.format(
                #        record['item_barcode'], record['legacy_id']))

            # additional check if the loan refers to the same document
            # as it is already attached to the item
            document_pid = item.get("document_pid")

            document = document_class.get_record_by_pid(document_pid)
            if record["legacy_document_id"] is None:
                records_logger.error(
                    "LOAN: {0}, ERROR: document_legacy_recid {1} not found."
                    .format(
                        record["legacy_id"], record["legacy_document_id"]
                    )
                )
                raise LoanMigrationError(
                    "no document id for loan {}".format(record["legacy_id"])
                )
            if (
                document.get("legacy_recid", None)
                != record["legacy_document_id"]
            ):
                # this might happen when record merged or migrated,
                # the already migrated document should take precedence
                click.secho(
                    "inconsistent document dependencies for loan {}".format(
                        record["legacy_id"]
                    ),
                    fg="blue",
                )
            # create a loan
            loan_dict = dict(
                patron_pid=str(patron_pid),
                transaction_location_pid=default_location_pid_value,
                transaction_user_pid=str(SystemAgent.id),
                document_pid=document_pid,
                item_pid={
                    "value": item.pid.pid_value,
                    "type": item.pid.pid_type,
                },
            )

            if record["status"] == "on loan":
                loan_dict.update(
                    dict(
                        start_date=record["start_date"],
                        end_date=record["end_date"],
                        state="ITEM_ON_LOAN",
                        transaction_date=record["start_date"],
                    )
                )
            elif record["status"] == "returned":
                loan_dict.update(
                    dict(
                        transaction_date=record["returned_on"],
                        start_date=record["start_date"],
                        end_date=record["returned_on"],
                        state="ITEM_RETURNED",
                    )
                )
            # loan request
            elif (
                record["status"] == "waiting" or record["status"] == "pending"
            ):
                loan_dict.update(
                    dict(
                        transaction_date=record["request_date"],
                        request_start_date=record["period_of_interest_from"],
                        request_expire_date=record["period_of_interest_to"],
                        state="PENDING",
                    )
                )
            # done loan requests became loans, and the rest we can ignore
            elif record["status"] in ["proposed", "cancelled", "done"]:
                continue
            else:
                raise LoanMigrationError(
                    "Unkown loan state for record {0}: {1}".format(
                        record["legacy_id"], record["state"]
                    )
                )
            model, provider = model_provider_by_rectype("loan")
            try:
                loan = import_record(
                    loan_dict, model, provider, legacy_id_key=None
                )
                db.session.commit()
                migrated_logger.warning(
                    "LOAN: {0} OK, new pid: {1}".format(
                        record["legacy_id"], loan["pid"]
                    )
                )
            except Exception as e:
                db.session.rollback()
                records_logger.error(
                    "LOAN: {0} ERROR: {1}".format(record["legacy_id"], str(e))
                )

    return loans
Esempio n. 5
0
def validate_item(record, raise_exception=True):
    """Validate loan item."""
    return get_item_by_barcode(record["item_barcode"].upper(),
                               raise_exception=raise_exception)
Esempio n. 6
0
def clean_record_json(record):
    """Create a record for ILS."""
    barcode = (record.get("barcode").replace("No barcode associated",
                                             "").replace(
                                                 "No barcode asociated", ""))
    status = get_status(record)
    try:
        if barcode:
            item = get_item_by_barcode(barcode)
            document_pid = item.get("document_pid")
        else:
            document_pid = find_correct_document_pid(record)
    except ItemMigrationError:
        document_pid = find_correct_document_pid(record)

    try:
        # library_pid
        provider = get_provider_by_legacy_id(record["id_crcLIBRARY"],
                                             provider_type="LIBRARY")
        provider_pid = provider.pid.pid_value
    except ProviderError as e:
        provider_pid = MIGRATION_PROVIDER_PID

    new_record = dict(
        document_pid=document_pid,
        legacy_id=record.get("legacy_id"),
        provider_pid=provider_pid,
        patron_pid=get_patron_pid(record),
        status=status,
        type=get_type(record),
    )

    # Optional fields
    if status == "CANCELLED":
        new_record.update(cancel_reason="MIGRATED/UNKNOWN")

    expected_delivery_date = record.get("expected_date")
    if expected_delivery_date:
        new_record.update(
            expected_delivery_date=get_date(expected_delivery_date))

    received_date = record.get("arrival_date")
    if received_date:
        new_record.update(received_date=get_date(received_date))

    request_date = record.get("request_date")
    if request_date:
        new_record.update(request_date=get_date(request_date))

    # former return date is the new due date of the borrowing request
    due_date = record.get("return_date")
    if due_date:
        new_record.update(due_date=get_date(due_date))

    total = get_cost(record)
    if total:
        new_record.update(total=total)

    notes = get_acq_ill_notes(record)
    if notes:
        new_record.update(notes=notes)

    budget_code = record.get("budget_code")
    if budget_code:
        new_record.update(budget_code=budget_code)

    validate_ill(new_record)

    vocabulary_validator.validate(VOCABULARIES_FIELDS, new_record)

    return new_record