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)
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 })
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 })