Ejemplo n.º 1
0
def add_sierra_ids_to_orders(source_fh, system_id):
    mlogger.debug(f'Linking IDs initiated system_id-{system_id}.')
    sids = get_sierra_ids(source_fh, system_id)
    try:
        unique_carts = set()
        with session_scope() as session:
            for sid in sids:
                wlo, oid, bid = sid
                ord_rec = retrieve_record(session, Order, wlo=wlo)
                if ord_rec:
                    # record affected cart_id
                    unique_carts.add(ord_rec.cart_id)
                    # update ord rec
                    update_record(session,
                                  Order,
                                  ord_rec.did,
                                  oid=oid,
                                  bid=bid)
                    mlogger.debug(f'Record updated: order_id={ord_rec.did}, '
                                  f'wlo={wlo}, oid={oid}, bid={bid}')

            session.flush()
            # check which carts are linked
            determine_carts_linked(session, unique_carts)

        mlogger.debug('Linking completed.')

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on linking IDs.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 2
0
def assign_blanketPO_to_cart(cart_id):
    try:

        with session_scope() as session:
            cart_rec = retrieve_record(session, Cart, did=cart_id)
            if cart_rec.blanketPO is None:
                res = retrieve_unique_vendor_codes_from_cart(
                    session, cart_id, cart_rec.system_id)
                vendor_codes = [code[0] for code in res]
                blanketPO = create_blanketPO(vendor_codes)
                unique = True
                n = 0
                while unique:
                    try:
                        update_record(session,
                                      Cart,
                                      cart_id,
                                      blanketPO=blanketPO)
                        session.flush()
                        unique = False
                    except IntegrityError:
                        session.rollback()
                        n += 1
                        blanketPO = create_blanketPO(vendor_codes, n)

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on assigning blanketPo to cart.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 3
0
def get_cart_data_for_order_sheet(cart_id):
    try:
        data_set = []
        with session_scope() as session:
            cart_rec = retrieve_record(session, Cart, did=cart_id)
            order_recs = retrieve_records(session, Order, cart_id=cart_id)
            for rec in order_recs:
                data = []
                data.append(rec.resource.other_no)
                data.append(rec.resource.isbn)
                data.append(rec.resource.title)
                data.append(rec.resource.author)
                total_cost = 0
                total_qty = 0
                for loc in rec.locations:
                    total_cost += loc.qty * rec.resource.price_disc
                    total_qty += loc.qty
                data.append(f'{rec.resource.price_disc:.2f}')
                data.append(total_qty)
                data.append(total_cost)
                data.append(rec.oid)
                data.append(cart_rec.blanketPO)
                data_set.append(data)
            session.expunge_all()

        return data_set

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error cart data retrieval.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 4
0
def update_resource(resource_id, **kwargs):
    try:
        with session_scope() as session:
            update_record(session, Resource, resource_id, **kwargs)
    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on updating resource.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 5
0
def apply_fund_to_cart(system_id, cart_id, fund_codes):

    try:
        with session_scope() as session:
            cart_rec = retrieve_record(session, Cart, did=cart_id)
            ord_recs = retrieve_records(session, Order, cart_id=cart_id)

            for code in fund_codes:
                fund_rec = retrieve_record(session,
                                           Fund,
                                           code=code,
                                           system_id=system_id)

                fund_audn, fund_mat, fund_branch, fund_lib = valid_fund_ids(
                    fund_rec)

                for orec in ord_recs:
                    audn_match = False
                    mat_match = False
                    library_match = False

                    if orec.audn_id in fund_audn:
                        audn_match = True

                    if orec.matType_id in fund_mat:
                        mat_match = True

                    if cart_rec.library_id in fund_lib:
                        library_match = True

                    for oloc in orec.locations:
                        if oloc.branch_id in fund_branch:
                            mlogger.debug('OrdRec-Fund branch {} match'.format(
                                oloc.branch_id))
                            if audn_match and library_match and mat_match:
                                # update
                                mlogger.debug(
                                    'Complete match. Updating OrderLocation.')
                                update_record(session,
                                              OrderLocation,
                                              oloc.did,
                                              fund_id=fund_rec.did)
                            else:
                                mlogger.debug(
                                    'Incomplete match: lib={}, audn={}, '
                                    'mat={}.'.format(library_match, audn_match,
                                                     mat_match))

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on applying funds to cart.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 6
0
def add_resource(cart_id, **kwargs):
    try:
        with session_scope() as session:
            orec = insert(session, Order, cart_id=cart_id)
            kwargs['order_id'] = orec.did
            insert(session, Resource, **kwargs)
    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on updating resource.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 7
0
def delete_data_by_did(model, did):
    try:

        with session_scope() as session:
            delete_record(session, model, did=did)
        mlogger.debug('Deleted {} record did={}'.format(model.__name__, did))

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error cart deletion.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 8
0
def get_ids_for_order_boxes_values(values_dict):
    try:

        kwargs = {}
        with session_scope() as session:
            if values_dict['langCbx'].get() not in ('', 'keep current'):
                rec = retrieve_record(session,
                                      Lang,
                                      name=values_dict['langCbx'].get())
                kwargs['lang_id'] = rec.did

            if values_dict['vendorCbx'].get() not in ('', 'keep current'):
                rec = retrieve_record(session,
                                      Vendor,
                                      name=values_dict['vendorCbx'].get())
                kwargs['vendor_id'] = rec.did

            if values_dict['mattypeCbx'].get() not in ('', 'keep current'):
                rec = retrieve_record(session,
                                      MatType,
                                      name=values_dict['mattypeCbx'].get())
                kwargs['matType_id'] = rec.did

            if values_dict['audnCbx'].get() not in ('', 'keep current'):
                rec = retrieve_record(session,
                                      Audn,
                                      name=values_dict['audnCbx'].get())
                kwargs['audn_id'] = rec.did

            if 'poEnt' in values_dict:
                if values_dict['poEnt'].get().strip() != '':
                    kwargs['poPerLine'] = values_dict['poEnt'].get().strip()

            if 'noteEnt' in values_dict:
                if values_dict['noteEnt'].get().strip() != '':
                    kwargs['note'] = values_dict['noteEnt'].get().strip()

            if 'commentEnt' in values_dict:
                if 'commentEnt' in values_dict:
                    if values_dict['commentEnt'].get().strip() != '':
                        kwargs['comment'] = values_dict['commentEnt'].get(
                        ).strip()

            return kwargs

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on getting ids in cart.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 9
0
def copy_distribution_data(distr_record, user_id):

    try:
        with session_scope() as session:
            # create new name
            # check if used and adjust
            exists = True
            n = 0
            while exists:
                new_name = f'{distr_record.name}-copy({n})'
                rec = retrieve_record(
                    session, DistSet,
                    name=new_name,
                    user_id=user_id,
                    system_id=distr_record.system_id)
                if not rec:
                    exists = False
                n += 1

            # prep copy of distrgrids & gridlocations
            grids = []
            for grid in distr_record.distgrids:
                locs = []
                for loc in grid.gridlocations:
                    locs.append(
                        GridLocation(
                            branch_id=loc.branch_id,
                            shelfcode_id=loc.shelfcode_id,
                            qty=loc.qty))
                grids.append(
                    DistGrid(
                        name=grid.name,
                        gridlocations=locs))

            rec = insert(
                session,
                DistSet,
                name=new_name,
                system_id=distr_record.system_id,
                user_id=user_id,
                distgrids=grids)

            mlogger.debug(f'Added new record: {rec}')
    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error(
            'Unhandled error in copy distribution.'
            f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 10
0
def delete_data(record):
    try:
        # check if can be deteled without consequences first

        with session_scope() as session:
            model = type(record)
            delete_record(session, model, did=record.did)
        mlogger.debug('Deleted {} record did={}'.format(
            model.__name__, record.did))

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error cart deletion.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 11
0
def update_fund(**kwargs):
    """
    Adds a new fund with all related data
    args:
        system_id: int, datastore did of NYPL or BPL
        fund_code: str, Sierra fund code
        describ: str, fund brief description
        libraries: list, 'branches', 'research' (NYPL only)
        audns: list, list of 'a', 'j', 'y' values applicable for the fund
        matTypes: list, material types applicable for the fund
    """
    try:
        for k, v in kwargs.items():
            if not v:
                if k == 'libraries':
                    kwargs[k] = []
                elif k == 'audns':
                    kwargs[k] = []
                elif k == 'branches':
                    kwargs[k] = []
                elif k == 'matTypes':
                    kwargs[k] = []
                else:
                    kwargs[k] = None

        mlogger.info('Existing fund new parameters: {}'.format(kwargs))

        with session_scope() as session:
            branches, libraries, audns, matTypes = create_fund_joiner_objs(
                session, **kwargs)
            update_record(session,
                          Fund,
                          kwargs['did'],
                          code=kwargs['code'],
                          describ=kwargs['describ'],
                          audns=audns,
                          branches=branches,
                          matTypes=matTypes,
                          libraries=libraries)

            fund_rec = retrieve_record(session, Fund, did=kwargs['did'])

            mlogger.info(f'Updated record {fund_rec}')
    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error in Fund update.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 12
0
def save_displayed_order_data(tracker_values):
    try:
        with session_scope() as session:
            for v in tracker_values:
                order = v['order']
                locs = v['grid']['locs']

                okwargs = {}
                locations = []
                for l in locs:
                    mlogger.debug('Saving orderLoc data: order_id:{}, '
                                  'loc_id:{}, frm_id:{}'.format(
                                      order['order_id'], l['loc_id'],
                                      l['unitFrm'].winfo_id()))
                    lkwargs = {}
                    if l['loc_id'] is not None:
                        lkwargs['did'] = l['loc_id']
                    if l['branchCbx'].get() != '':
                        rec_id = get_branch_rec_id(session,
                                                   l['branchCbx'].get())
                        lkwargs['branch_id'] = rec_id
                    if l['shelfCbx'].get() != '':
                        rec_id = get_shelf_rec_id(session, l['shelfCbx'].get())
                        lkwargs['shelfcode_id'] = rec_id
                    if l['qtyEnt'].get() != '':
                        lkwargs['qty'] = int(l['qtyEnt'].get())
                    if l['fundCbx'].get() != '':
                        rec_id = get_fund_rec_id(session, l['fundCbx'].get())
                        lkwargs['fund_id'] = rec_id
                        # validate here
                    if lkwargs:
                        locations.append(OrderLocation(**lkwargs))
                        mlogger.debug(
                            'Saving orderLoc data, params: {}'.format(lkwargs))

                okwargs = get_ids_for_order_boxes_values(order)
                okwargs['locations'] = locations
                mlogger.debug('Saving order data (id:{}), params: {}'.format(
                    order['order_id'], okwargs))

                update_record(session, Order, order['order_id'], **okwargs)

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on saving cart data.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 13
0
def create_resource_reader(template_record, sheet_fh):
    record = template_record

    # convert any empty strings back to None
    state = inspect(record)
    for attr in state.attrs:
        if attr.loaded_value == '':
            setattr(record, attr.key, None)

    mlogger.debug('Applying following sheet template: {}'.format(record))

    try:

        reader = ResourceDataReader(
            sheet_fh,
            header_row=record.header_row,
            title_col=record.title_col,
            add_title_col=record.add_title_col,
            author_col=record.author_col,
            series_col=record.series_col,
            publisher_col=record.publisher_col,
            pub_date_col=record.pub_date_col,
            pub_place_col=record.pub_place_col,
            summary_col=record.summary_col,
            isbn_col=record.isbn_col,
            upc_col=record.upc_col,
            other_no_col=record.other_no_col,
            price_list_col=record.price_list_col,
            price_disc_col=record.price_disc_col,
            desc_url_col=record.desc_url_col,
            comment_col=record.comment_col,
            misc_col=record.misc_col)

        return reader

    except AttributeError as e:
        mlogger.error(
            f'AttributeError on ResourceDataReader: {e}')
        raise BabelError(e)

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error(
            f'Unhandled error on ResourceDataReader. Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 14
0
def copy_grid_data(grid_record):
    mlogger.debug(
        f'Copying grid record did={grid_record.did}, name={grid_record.name}')
    try:
        with session_scope() as session:
            # create new name
            # check if used and adjust
            exists = True
            n = 0
            while exists:
                new_name = f'{grid_record.name}-copy({n})'
                rec = retrieve_record(
                    session, DistGrid,
                    distset_id=grid_record.distset_id,
                    name=new_name)
                if not rec:
                    exists = False
                n += 1

            # compile location data
            locs = []
            for loc in grid_record.gridlocations:
                locs.append(
                    GridLocation(
                        branch_id=loc.branch_id,
                        shelfcode_id=loc.shelfcode_id,
                        qty=loc.qty))

            # # insert to datastore
            rec = insert(
                session, DistGrid,
                distset_id=grid_record.distset_id,
                name=new_name,
                gridlocations=locs)

            mlogger.debug(
                f'Added new record {rec}')

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error(
            'Unhandled error in copy grid.'
            f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 15
0
def get_carts_data(system_id, user='******', status=''):
    data = []

    try:
        with session_scope() as session:
            recs = get_cart_data_view_records(session, system_id, user, status)
            for r in recs:
                data.append([
                    r.cart_id, r.cart_name, f'{r.cart_date:%y-%m-%d %H:%M}',
                    r.cart_status, r.cart_owner, r.linked
                ])
        return data

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on cart data retrieval.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 16
0
    def launch_update(self):
        user_data = shelve.open(USER_DATA)
        if 'update_dir' in user_data:
            update_dir = user_data['update_dir']
        else:
            update_dir = None
        user_data.close()

        if update_dir:
            try:
                args = '{} "{}" "{}"'.format('updater.exe', update_dir,
                                             APP_DIR)
                # subprocess.run(args, creationflags=subprocess.CREATE_NO_WINDOW)
                subprocess.run(args)

            except Exception as exc:
                _, _, exc_traceback = sys.exc_info()
                tb = format_traceback(exc, exc_traceback)
                mlogger.error('Unhandled error on Babel update.'
                              f'Traceback: {tb}')
Ejemplo n.º 17
0
def assign_wlo_to_cart(cart_id):
    try:

        with session_scope() as session:
            # determne how many wlo are needed and reserve them
            last_wlo_rec = retrieve_last_record(session, Wlos)
            order_count = count_records(session, Order, cart_id=cart_id)
            wlo_numbers = wlo_pool(last_wlo_rec.did, order_count)

            orders = retrieve_records(session, Order, cart_id=cart_id)
            for o in orders:
                if o.wlo is None:
                    wlo = wlo_numbers.__next__()
                    update_record(session, Order, o.did, wlo=wlo)
                    insert(session, Wlos, did=wlo)

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on assigning wlo to cart.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 18
0
def apply_globals_to_cart(cart_id, widgets):
    try:

        with session_scope() as session:
            # order data
            okwargs = get_ids_for_order_boxes_values(widgets)
            # locations
            dist_id, grid_name = widgets['globgrid']
            grid_rec = retrieve_record(session,
                                       DistGrid,
                                       distset_id=dist_id,
                                       name=grid_name)
            mlogger.debug(f'Applying globally grid {grid_rec}')

            # resource data
            rkwargs = {}

            discount = None
            if 'discEnt' in widgets:
                if widgets['discEnt'].get() != '':
                    discount = Decimal(widgets['discEnt'].get())

            if 'priceEnt' in widgets:
                if widgets['priceEnt'].get() != '':
                    list_price = Decimal(widgets['priceEnt'].get())
                    rkwargs['price_list'] = list_price
                    if discount:
                        rkwargs['price_disc'] = list_price - (
                            (list_price * discount) / Decimal(100))
                    else:
                        rkwargs['price_disc'] = list_price
            mlogger.debug('Global update to prices: {}, discount: {}'.format(
                rkwargs, discount))

            ord_recs = retrieve_records(session, Order, cart_id=cart_id)

            for rec in ord_recs:
                if grid_rec:
                    olocs = []
                    for l in grid_rec.gridlocations:
                        olocs.append(
                            OrderLocation(order_id=rec.did,
                                          branch_id=l.branch_id,
                                          shelfcode_id=l.shelfcode_id,
                                          qty=l.qty))
                    okwargs['locations'] = olocs
                update_record(session, Order, rec.did, **okwargs)

                if rkwargs:
                    update_record(session, Resource, rec.resource.did,
                                  **rkwargs)

                session.flush()

                if discount is not None:
                    rkwargs['price_disc'] = rec.resource.price_list - (
                        (rec.resource.price_list * discount) / Decimal(100))
                    update_record(session, Resource, rec.resource.did,
                                  **rkwargs)
                    rkwargs = {}

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on applying globals to cart.'
                      f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 19
0
def insert_fund(**kwargs):
    """
    Adds a new fund with all related data
    args:
        system_id: int, datastore did of NYPL or BPL
        fund_code: str, Sierra fund code
        describ: str, fund brief description
        libraries: list, 'branches', 'research' (NYPL only)
        audns: list, list of 'a', 'j', 'y' values applicable for the fund
        matTypes: list, material types applicable for the fund
    """
    try:
        for k, v in kwargs.items():
            if not v:
                if k == 'libraries':
                    kwargs[k] = ['']
                elif k == 'audns':
                    kwargs[k] = []
                elif k == 'branches':
                    kwargs[k] = []
                elif k == 'matTypes':
                    kwargs[k] = []
                else:
                    kwargs[k] = None

        mlogger.info('New fund record parameters: {}'.format(kwargs))

        with session_scope() as session:
            # check if exists first
            rec = retrieve_record(session,
                                  Fund,
                                  code=kwargs['code'],
                                  system_id=kwargs['system_id'])
            if rec:
                msg = 'Fund record with code: {} already exists.'.format(
                    kwargs['code'])
                mlogger.error(msg)
                raise BabelError('Database Error', msg)
            else:
                branches, libraries, audns, matTypes = create_fund_joiner_objs(
                    session, **kwargs)

                fund_rec = insert(session,
                                  Fund,
                                  code=kwargs['code'],
                                  describ=kwargs['describ'],
                                  system_id=kwargs['system_id'],
                                  audns=audns,
                                  branches=branches,
                                  matTypes=matTypes,
                                  libraries=libraries)

                mlogger.info(f'Added new record {fund_rec}')
            session.expunge_all()

        return fund_rec

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error in add Fund.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 20
0
def create_cart_copy(cart_id, system, user, profile_idx, cart_name, status):
    """
    Creates a copy of a cart
    args:
        cart_id: int, datastore cart did
        system: str, NYPL or BPL
        user: str, profile/user name
        profile_idx: dict, dictionary of user_id (key) and names
        cart_name: str, new cart name
        status: tkinter StringVar
    """
    valid = True
    if not cart_id:
        valid = False
        status.set('Invalid cart id')
    elif not system:
        valid = False
        status.set('Failed. Missing system parameter.')
    elif not user:
        valid = False
        status.set('Failed. Missing profile prameter.')
    elif not cart_name:
        valid = False
        status.set('Failed. Missing new cart name.')

    try:
        with session_scope() as session:
            if cart_id and system and user and cart_name:
                # verify name/user not used:
                if system == 'BPL':
                    system_id = 1
                elif system == 'NYPL':
                    system_id = 2

                rec = retrieve_record(session,
                                      Cart,
                                      system_id=system_id,
                                      user_id=get_id_from_index(
                                          user, profile_idx),
                                      name=cart_name)
                if rec:
                    valid = False
                    status.set('Failed. A cart with the same name'
                               'already exists.\nPlease change the name.')
            if valid:
                # create copy of the original cart
                old_orders = retrieve_records(session, Order, cart_id=cart_id)

                new_orders = []
                for order in old_orders:

                    resource = Resource(title=order.resource.title,
                                        add_title=order.resource.add_title,
                                        author=order.resource.author,
                                        series=order.resource.series,
                                        publisher=order.resource.publisher,
                                        pub_place=order.resource.pub_place,
                                        summary=order.resource.summary,
                                        isbn=order.resource.isbn,
                                        upc=order.resource.upc,
                                        other_no=order.resource.other_no,
                                        price_list=order.resource.price_list,
                                        price_disc=order.resource.price_disc,
                                        desc_url=order.resource.desc_url,
                                        misc=order.resource.misc)

                    new_orders.append(
                        Order(lang_id=order.lang_id,
                              audn_id=order.audn_id,
                              vendor_id=order.vendor_id,
                              matType_id=order.matType_id,
                              poPerLine=order.poPerLine,
                              note=order.note,
                              comment=order.comment,
                              resource=resource))

                insert(session,
                       Cart,
                       name=cart_name,
                       user_id=get_id_from_index(user, profile_idx),
                       system_id=system_id,
                       orders=new_orders)

                status.set('Cart copied successfully.')

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on cart copy.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 21
0
def save2spreadsheet(fh, saving_status, system, data):
    try:
        if os.path.isfile(fh):
            os.remove(fh)

        red_font = Font(color='CC0000')
        order_wb = Workbook()
        order_ws = order_wb.active
        address_line1 = f'BookOps {system}'
        address_line2 = '31-11 Thomson Avenue'
        address_line3 = 'Long Island City, NY 11101'

        # set columns width
        order_ws.column_dimensions['A'].width = 4
        order_ws.column_dimensions['C'].width = 16
        order_ws.column_dimensions['D'].width = 25
        order_ws.column_dimensions['E'].width = 20
        order_ws.column_dimensions['F'].width = 9
        order_ws.column_dimensions['G'].width = 8
        order_ws.column_dimensions['H'].width = 10
        order_ws.column_dimensions['I'].width = 12
        order_ws.column_dimensions['J'].width = 18

        order_ws.cell(row=2, column=1).value = address_line1
        order_ws.cell(row=2, column=1).font = FONT_BOLD
        order_ws.cell(row=3, column=1).value = address_line2
        order_ws.cell(row=3, column=1).font = FONT_BOLD
        order_ws.cell(row=4, column=1).value = address_line3
        order_ws.cell(row=4, column=1).font = FONT_BOLD

        # headers
        order_ws.cell(row=6, column=1).value = '#'
        order_ws.cell(row=6, column=1).fill = FILL_GRAY
        order_ws.cell(row=6, column=2).value = 'SKU'
        order_ws.cell(row=6, column=2).fill = FILL_GRAY
        order_ws.cell(row=6, column=3).value = 'ISBN'
        order_ws.cell(row=6, column=3).fill = FILL_GRAY
        order_ws.cell(row=6, column=4).value = 'Title'
        order_ws.cell(row=6, column=4).fill = FILL_GRAY
        order_ws.cell(row=6, column=5).value = 'Author'
        order_ws.cell(row=6, column=5).fill = FILL_GRAY
        order_ws.cell(row=6, column=6).value = 'Unit Price'
        order_ws.cell(row=6, column=6).fill = FILL_GRAY
        order_ws.cell(row=6, column=7).value = 'Copies'
        order_ws.cell(row=6, column=7).fill = FILL_GRAY
        order_ws.cell(row=6, column=8).value = 'Total Price'
        order_ws.cell(row=6, column=8).fill = FILL_GRAY
        order_ws.cell(row=6, column=9).value = 'o Number'
        order_ws.cell(row=6, column=9).fill = FILL_GRAY
        order_ws.cell(row=6, column=10).value = 'blanket PO'
        order_ws.cell(row=6, column=10).fill = FILL_GRAY

        r = 1
        for title in data:
            row = []
            row.append(r)
            row.extend(title)
            order_ws.append(row)
            order_ws.cell(row=6 + r, column=9).font = red_font
            order_ws.cell(row=6 + r, column=10).font = red_font
            r += 1
        last_r = 6 + r
        order_ws.cell(row=last_r + 2, column=3).value = 'total copies='
        order_ws.cell(row=last_r + 2, column=3).fill = FILL_GRAY
        order_ws.cell(row=last_r + 2, column=4).value = \
            '=SUM(G7:G' + str(last_r) + ')'
        order_ws.cell(row=last_r + 2, column=4).fill = FILL_GRAY
        order_ws.cell(row=last_r + 3, column=3).value = 'total cost='
        order_ws.cell(row=last_r + 3, column=3).fill = FILL_GRAY
        order_ws.cell(row=last_r + 3, column=4).value = \
            '=SUM(H7:H' + str(last_r) + ')'
        order_ws.cell(row=last_r + 3, column=4).fill = FILL_GRAY

        order_wb.save(filename=fh)
        saving_status.set('Data saved to spreadsheet successfuly.')

    except WindowsError as e:
        raise BabelError(e)

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error(
            'Unhandled error on saving to sheet.'
            f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 22
0
def create_cart(
        cart_name, system_id, profile_id,
        resource_data, progbar):

    try:
        with session_scope() as session:

            # create Cart record
            name_exists = True
            n = 0
            while name_exists and n < 10:
                name_exists = retrieve_record(
                    session, Cart, name=cart_name)
                if name_exists:
                    n += 1
                    if '(' in cart_name:
                        end = cart_name.index('(')
                        cart_name = cart_name[:end]
                    cart_name = f'{cart_name}({n})'

            if system_id == 1:
                library_id = 1
            else:
                library_id = None

            cart_rec = insert(
                session, Cart,
                name=cart_name,
                created=datetime.now(),
                updated=datetime.now(),
                library_id=library_id,
                system_id=system_id,
                user_id=profile_id)

            progbar['value'] += 1
            progbar.update()

            # create Resource records
            for d in resource_data:
                ord_rec = insert(
                    session, Order,
                    cart_id=cart_rec.did,
                    comment=d.comment)

                insert(
                    session, Resource,
                    order_id=ord_rec.did,
                    title=d.title,
                    add_title=d.add_title,
                    author=d.author,
                    series=d.series,
                    publisher=d.publisher,
                    pub_date=d.pub_date,
                    pub_place=d.pub_place,
                    summary=d.summary,
                    isbn=d.isbn,
                    upc=d.upc,
                    other_no=d.other_no,
                    price_list=d.price_list,
                    price_disc=d.price_disc,
                    desc_url=d.desc_url,
                    misc=d.misc)

                progbar['value'] += 1
                progbar.update()

            session.flush()

            created_cart_id = cart_rec.did
            return created_cart_id

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error(
            f'Unhandled on sheet ingest. Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 23
0
def export_orders_to_marc_file(fh, saving_status, cart_rec, progbar):
    # this has to be rewritten to make it more transparent
    # and easier to maintain

    try:
        progbar['value'] = 0

        # overwrite existing files
        if os.path.isfile(fh):
            try:
                os.remove(fh)
            except WindowsError as e:
                raise BabelError(f'File in use. Error: {e}')

        with session_scope() as session:
            rec_count = count_records(session, Order, cart_id=cart_rec.did)
            progbar['maximum'] = rec_count

            selector = retrieve_record(session, User, did=cart_rec.user_id)
            blanketPO = cart_rec.blanketPO
            # determine some global values
            if cart_rec.system_id == 1:
                oclc_code = 'BKL'
                selector_code = selector.bpl_code

            elif cart_rec.system_id == 2:
                oclc_code = 'NYP'
                selector_code = selector.nyp_code

            lib_rec = retrieve_record(session,
                                      Library,
                                      did=cart_rec.library_id)
            library_code = lib_rec.code

            ord_recs = retrieve_records(session, Order, cart_id=cart_rec.did)

            for order in ord_recs:
                mat_rec = retrieve_record(session,
                                          MatType,
                                          did=order.matType_id)
                ven_rec = retrieve_record(session, Vendor, did=order.vendor_id)

                if cart_rec.system_id == 1:
                    order.mat_bib = mat_rec.bpl_bib_code
                    order.mat_ord = mat_rec.bpl_ord_code
                    order.vendor = ven_rec.bpl_code
                elif cart_rec.system_id == 2:
                    order.mat_bib = mat_rec.nyp_bib_code
                    order.mat_ord = mat_rec.nyp_ord_code
                    order.vendor = ven_rec.nyp_code

                # retrieve joined values
                rec = retrieve_record(session, Audn, did=order.audn_id)
                order.audn = rec.code
                rec = retrieve_record(session, Lang, did=order.lang_id)
                order.lang = rec.code

                copies = 0
                locs = []
                funds = []
                for loc in order.locations:
                    rec = retrieve_record(session, Branch, did=loc.branch_id)
                    branch = rec.code
                    try:
                        rec = retrieve_record(session,
                                              ShelfCode,
                                              did=loc.shelfcode_id)
                        shelfcode = rec.code
                        shelf_with_audn = rec.includes_audn
                    except AttributeError:
                        shelfcode = ''
                        shelf_with_audn = False
                    try:
                        rec = retrieve_record(session, Fund, did=loc.fund_id)
                        fund = rec.code
                    except AttributeError:
                        fund = ''
                    copies += loc.qty

                    if shelf_with_audn:
                        loc_str = f'{branch}{order.audn}{shelfcode}/{loc.qty}'
                    else:
                        if shelfcode is None:
                            loc_str = f'{branch}/{loc.qty}'
                        else:
                            loc_str = f'{branch}{shelfcode}/{loc.qty}'
                    locs.append(loc_str)

                    fund_str = f'{fund}/{loc.qty}'
                    funds.append(fund_str)

                order.copies = str(copies)
                order.locs = ','.join(locs)
                order.funds = ','.join(funds)
                order.order_date = datetime.strftime(date.today(), '%m-%d-%Y')

                make_bib(fh, oclc_code, library_code, blanketPO, selector_code,
                         order)
                progbar['value'] += 1
                progbar.update()

        saving_status.set('Data saved to MARC file successfully.')

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error on saving to MARC.' f'Traceback: {tb}')
        raise BabelError(exc)
Ejemplo n.º 24
0
def get_data_by_identifier(keyword, keyword_type):
    if keyword_type == 'bib #':
        param = Order.bid
    elif keyword_type == 'order #':
        param = Order.oid
    elif keyword_type == 'wlo #':
        param = Order.wlo
    elif keyword_type == 'ISBN':
        param = Resource.isbn
    elif keyword_type == 'UPC':
        param = Resource.upc
    elif keyword_type == 'other #':
        param = Resource.other_no
    elif keyword_type == 'blanketPO':
        param = Cart.blanketPO
    else:
        raise AttributeError('Invalid keyword_type passed')
    mlogger.debug(f'Basic search params: {keyword}, type {param}')

    try:
        with session_scope() as session:
            recs = (session.query(Cart, Order, Resource).join(
                Order, Cart.did == Order.cart_id).join(
                    Resource, Order.did == Resource.order_id).filter(
                        param == keyword).all())

            results = []
            for cart_rec, ord_rec, res_rec in recs:
                # cart
                cart = cart_rec.name
                owner = get_owner(session, cart_rec.user_id)
                system = get_system_name(session, cart_rec.system_id)
                library = get_library_name(session, cart_rec.library_id)
                status = get_status_name(session, cart_rec.status_id)
                created = cart_rec.created
                blanketPO = cart_rec.blanketPO

                # order
                oid = ord_rec.oid
                bid = ord_rec.bid
                wlo = ord_rec.wlo
                po = ord_rec.poPerLine

                lang = get_lang_name(session, ord_rec.lang_id)
                audn_name, audn_code = get_audn_name_and_code(
                    session, ord_rec.audn_id)
                vendor = get_vendor_code(session, ord_rec.vendor_id, system)
                mattype = get_mattype_name(session, ord_rec.matType_id)

                locs = []
                for loc in ord_rec.locations:
                    branch = get_branch_code(session, loc.branch_id)
                    shelfcode = get_shelfcode(session, loc.shelfcode_id,
                                              audn_code)
                    qty = loc.qty
                    fund = get_fund_code(session, loc.fund_id)
                    locs.append(f'{branch}{shelfcode}({qty})/{fund}')

                # resouce
                title = res_rec.title
                author = res_rec.author
                isbn = res_rec.isbn
                upc = res_rec.upc
                other_no = res_rec.other_no

                unit = dict(title=title,
                            author=author,
                            isbn=isbn,
                            upc=upc,
                            other_no=other_no,
                            bid=bid,
                            oid=oid,
                            wlo=wlo,
                            owner=owner,
                            cart=cart,
                            created=created,
                            system=system,
                            library=library,
                            status=status,
                            vendor=vendor,
                            lang=lang,
                            audn_name=audn_name,
                            mattype=mattype,
                            po=po,
                            locs=', '.join(locs))
                results.append(unit)
            session.expunge_all()

        return results

    except Exception as exc:
        _, _, exc_traceback = sys.exc_info()
        tb = format_traceback(exc, exc_traceback)
        mlogger.error('Unhandled error during Basic search.'
                      f'Traceback: {tb}')
        raise BabelError('Unable to retrieve records.')