示例#1
0
    def authenticate(self, username=None, password="", need_check_password=True):
        if username:
            username = username.strip()

        if password:
            password = password.strip()

        if not username:
            return None

        portal_client = connection_pool.get_client(API_ADDRESS, API_USERNAME, API_PASSWORD)

        if need_check_password:
            try:
                reader_id = username.replace("\\", "\\\\").replace('"', '\\"')
                password = password.replace("\\", "\\\\").replace('"', '\\"')
                sru_response = portal_client.search(
                    query='@attrset bib-1 @attr 1=100 "%s"' % (reader_id,),
                    database=RUSLAN_USERS_DATABASE,
                    maximum_records=1,
                )
                sru_records = humanize.get_records(sru_response)

                if not sru_records:
                    return None

            except Exception as e:
                logger.exception(e)
                return None

        sru_reps = portal_client.get_user(username, database=RUSLAN_USERS_DATABASE)
        records = humanize.get_records(sru_reps)

        if not records:
            return None
        # 101 - фамилия
        # 102 - имя
        # 103 - отчество
        grs_record = humanize.grs_to_dict(humanize.get_record_content(records[0]).get("GRSTag", [{}]))
        user_password = password

        if need_check_password and user_password != password:
            return None

        return self.get_or_create_user(username, password, grs_record)
示例#2
0
def on_hand(request):
    now = datetime.datetime.now().date()
    ruslan_user = get_ruslan_user(request)

    if not ruslan_user:
        return HttpResponse(u'Вы не являетесь читателем')

    ruslan_client = client.HttpClient(API_ADDRESS, API_USERNAME, API_PASSWORD, auto_close=False)

    def make_request(start_record=1, maximum_records=20):
        return ruslan_client.search(
            database=ON_HAND_DB,
            query='@attrset bib-1 @attr 1=100 "%s"' % ruslan_user.username,
            maximum_records=maximum_records,
            start_record=start_record,
            accept='application/json'
        )

    responses = []

    per_request = 20
    errors = []
    orders = []
    fine = 0

    try:
        response = make_request(start_record=1, maximum_records=per_request)
        #print json.dumps(response, ensure_ascii=False)
    except Exception as e:
        errors.append(u'Сервер заказов недоступен. Пожалуйста, попробуйте позже.')
        logger.exception(e)
        pass

    if not errors:
        responses.append(response)

        while True:
            next_position = int(response.get('nextRecordPosition', 0))
            number_of_records = int(response.get('numberOfRecords', 0))

            if next_position and next_position < number_of_records:
                response = make_request(next_position, maximum_records=per_request)
                responses.append(response)
            else:
                break

        ruslan_client.close_session()

        for response in responses:
            for record in humanize.get_records(response):
                opac_record = humanize.get_record_content(record)
                # print json.dumps(opac_record, ensure_ascii=False)
                grs_record = humanize.grs_to_dict(opac_record['tag'])

                bib_record = grs_record.get('202', [{}])[0].get('value', {}).get('record', {})
                item_place = grs_record.get('148', [{}])[0].get('value', '')
                record = junimarc.json_schema.record_from_json(bib_record)
                libcard = junimarc.utils.beautify(
                    unicode(transformers['libcard'](junimarc.ruslan_xml.record_to_xml(record)))
                )
                org = grs_record.get('146', [{}])[0].get('value', '')
                branch = grs_record.get('147', [{}])[0].get('value', '')

                get_date_str = grs_record.get('142', [{}])[0].get('value', '')
                get_date = None

                if get_date_str:
                    get_date = datetime.datetime.strptime(get_date_str, '%Y%m%d').date()

                return_date_str = grs_record.get('143', [{}])[0].get('value', '')
                return_date = None

                if return_date_str:
                    return_date = datetime.datetime.strptime(return_date_str, '%Y%m%d').date()
                item_fine = 0

                if return_date and return_date < now and item_place not in PLACES_WITHOUT_FINE:
                    item_fine = (now - return_date).days * FINE_PER_DAY
                    if item_fine > MAX_FINE:
                        item_fine = MAX_FINE
                    fine += item_fine

                out_of_date = False
                if return_date and return_date < now:
                    out_of_date = True

                orders.append({
                    'libcard': libcard,
                    'org': org,
                    'branch': branch,
                    'item_place': {
                        'id': item_place,
                        'title': PLACES.get(item_place, u''),
                    },
                    'get_date': get_date,
                    'return_date': return_date,
                    'fine': item_fine,
                    'out_of_date': out_of_date,
                })
    ruslan_client.close_session()
    return render(request, 'ruslan_cabinet/frontend/on_hand_items.html', {
        'orders': orders,
        'fine': fine,
        'errors': errors
    })
示例#3
0
def on_hand(request):
    now = datetime.datetime.now().date()
    ruslan_user = get_ruslan_user(request)

    if not ruslan_user:
        return HttpResponse(u'Вы не являетесь читателем')

    ruslan_client = client.HttpClient(API_ADDRESS,
                                      API_USERNAME,
                                      API_PASSWORD,
                                      auto_close=False)

    def make_request(start_record=1, maximum_records=20):
        return ruslan_client.search(database=ON_HAND_DB,
                                    query='@attrset bib-1 @attr 1=100 "%s"' %
                                    ruslan_user.username,
                                    maximum_records=maximum_records,
                                    start_record=start_record,
                                    accept='application/json')

    responses = []

    per_request = 20
    errors = []
    orders = []
    fine = 0

    try:
        response = make_request(start_record=1, maximum_records=per_request)
        # print json.dumps(response, ensure_ascii=False)
    except Exception as e:
        errors.append(
            u'Сервер заказов недоступен. Пожалуйста, попробуйте позже.')
        logger.exception(e)
        pass

    if not errors:
        responses.append(response)

        while True:
            next_position = int(response.get('nextRecordPosition', 0))
            number_of_records = int(response.get('numberOfRecords', 0))

            if next_position and next_position < number_of_records:
                response = make_request(next_position,
                                        maximum_records=per_request)
                responses.append(response)
            else:
                break

        ruslan_client.close_session()

        for response in responses:
            for record in humanize.get_records(response):
                opac_record = humanize.get_record_content(record)
                # print json.dumps(opac_record, ensure_ascii=False)
                grs_record = humanize.grs_to_dict(opac_record['tag'])

                bib_record = grs_record.get('202',
                                            [{}])[0].get('value',
                                                         {}).get('record', {})
                item_place = grs_record.get('148', [{}])[0].get('value', '')
                record = junimarc.json_schema.record_from_json(bib_record)
                libcard = junimarc.utils.beautify(
                    unicode(transformers['libcard'](
                        junimarc.ruslan_xml.record_to_xml(record))))
                org = grs_record.get('146', [{}])[0].get('value', '')
                branch = grs_record.get('147', [{}])[0].get('value', '')

                get_date_str = grs_record.get('142', [{}])[0].get('value', '')
                get_date = None

                if get_date_str:
                    get_date = datetime.datetime.strptime(
                        get_date_str, '%Y%m%d').date()

                return_date_str = grs_record.get('143',
                                                 [{}])[0].get('value', '')
                return_date = None

                if return_date_str:
                    return_date = datetime.datetime.strptime(
                        return_date_str, '%Y%m%d').date()
                item_fine = 0

                if return_date and return_date < now and item_place not in PLACES_WITHOUT_FINE:
                    item_fine = (now - return_date).days * FINE_PER_DAY
                    if item_fine > MAX_FINE:
                        item_fine = MAX_FINE
                    fine += item_fine

                out_of_date = False
                if return_date and return_date < now:
                    out_of_date = True

                orders.append({
                    'libcard': libcard,
                    'org': org,
                    'branch': branch,
                    'item_place': {
                        'id': item_place,
                        'title': PLACES.get(item_place, u''),
                    },
                    'get_date': get_date,
                    'return_date': return_date,
                    'fine': item_fine,
                    'out_of_date': out_of_date,
                })
    ruslan_client.close_session()
    return render(request, 'ruslan_cabinet/frontend/on_hand_items.html', {
        'orders': orders,
        'fine': fine,
        'errors': errors
    })