def change_email(request): try: models.RuslanUser.objects.get(user=request.user) except models.RuslanUser.DoesNotExist: return HttpResponse(u'Вы не являетесь читателем') ruslan_user = models.get_ruslan_user(request) portal_client = connection_pool.get_client(API_ADDRESS, API_USERNAME, API_PASSWORD) sru_response = portal_client.get_user(ruslan_user.username, RUSLAN_USERS_DATABASE) sru_records = humanize.get_records(sru_response) if not sru_records: return HttpResponse(u'Не найден читатель') record_content = humanize.get_record_content(sru_records[0]) grs_record = grs.Record.from_dict(record_content) if request.method == 'POST': form = forms.ChangeEmailForm(request.POST) if form.is_valid(): email_fields = grs_record.get_field(EMAIL_FIELD_TAG) if email_fields: email_fields[0].content = form.cleaned_data['email'] portal_client.update_grs( grs_record, RUSLAN_USERS_DATABASE, grs_record.get_field_value(RECORD_ID_TAG)) else: form = forms.ChangeEmailForm() current_email = grs_record.get_field_value(EMAIL_FIELD_TAG, '') return render(request, 'sso_ruslan/change_email.html', { 'form': form, 'current_email': current_email, })
def holding_info(request): id = request.GET.get('id', None) database = request.GET.get('database', HOLDINGS_BASE) if not id: return HttpResponse(u'Не указан идентификатор записи') ruslan_client = client.HttpClient(API_ADDRESS, API_USERNAME, API_PASSWORD, auto_close=False) response = ruslan_client.get_records(id_list=[id], database=database, opac=True) ruslan_client.close_session() records = humanize.get_records(response) bib_record = None holding_groups = None if records: opac_content = humanize.get_record_content(records[0]) bib_record = humanize.get_bib_record_from_opac(opac_content) holding_data = humanize.get_holdings_data_from_opac(opac_content) if holding_data: holding_groups = holdings.group_by_locations(holding_data) return render(request, 'ruslan_cabinet/frontend/holding_info.html', { 'bib_record': bib_record, 'holding_groups': holding_groups })
def change_email(request): try: models.RuslanUser.objects.get(user=request.user) except models.RuslanUser.DoesNotExist: return HttpResponse(u'Вы не являетесь читателем') ruslan_user = models.get_ruslan_user(request) portal_client = connection_pool.get_client(API_ADDRESS, API_USERNAME, API_PASSWORD) sru_response = portal_client.get_user(ruslan_user.username, RUSLAN_USERS_DATABASE) sru_records = humanize.get_records(sru_response) if not sru_records: return HttpResponse(u'Не найден читатель') record_content = humanize.get_record_content(sru_records[0]) grs_record = grs.Record.from_dict(record_content) if request.method == 'POST': form = forms.ChangeEmailForm(request.POST) if form.is_valid(): email_fields = grs_record.get_field(EMAIL_FIELD_TAG) if email_fields: email_fields[0].content = form.cleaned_data['email'] portal_client.update_grs(grs_record, RUSLAN_USERS_DATABASE, grs_record.get_field_value(RECORD_ID_TAG)) else: form = forms.ChangeEmailForm() current_email = grs_record.get_field_value(EMAIL_FIELD_TAG, '') return render(request, 'sso_ruslan/change_email.html', { 'form': form, 'current_email': current_email, })
def handle(self, *args, **options): # sync_status = SyncStatus.get_or_create() # now = datetime.now() # # if sync_status.sync_started_at: # if now - timedelta(minutes=SYNC_TIMEOUT_MINUTES) < sync_status.sync_started_at: # return # # sync_status.sync_started_at = now # sync_status.last_sync = now # sync_status.record_processed = 0 # sync_status.save() ruslan_client = client.HttpClient(API_ADDRESS, API_USERNAME, API_PASSWORD, auto_close=False) maximum_records = 200 res = ruslan_client.extract_records( database='lusr_rt', query='@attrset bib-1 @attr 1=100 @attr 2=4 0', maximum_records=maximum_records, start_record=1, accept='application/json', result_set_ttl=60, limit=1) i = 1 for record in res: grs_record = grs.Record.from_dict( humanize.get_record_content(record)) user_id = grs_record.get_field_value('100') rusln_user = RuslanUser() rusln_user.user_id = user_id rusln_user.first_name = grs_record.get_field_value('101') rusln_user.patronymic = grs_record.get_field_value('103') rusln_user.last_name = grs_record.get_field_value('102') rusln_user.email = grs_record.get_field_value('122') birth_date_str = grs_record.get_field_value('234') if birth_date_str: rusln_user.birth_date = datetime.strptime( birth_date_str, '%Y%m%d') sex = grs_record.get_field_value('404') if sex == 'лю': rusln_user.sex = 'm' elif sex == 'лќ': rusln_user.sex = 'f' rusln_user.grs_json = json.dumps(grs_record.to_dict(), ensure_ascii=False) if i % 10 == 0: print i i += 1 ruslan_client.close_session()
def register_new_user(request, id): try: tatedu_user = models.TatEduUser.objects.get(id=id) except models.TatEduUser.DoesNotExist: return redirect("sso_tatedu:index") user_attrs = json.loads(tatedu_user.user_attrs) person_info = user_attrs.get("person_info", {}) portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'777' query = u'@attrset bib-1 @attr 1=%s "%s"' % (OID_FIELD, tatedu_user.oid.replace("\\", "\\\\")) sru_response = portal_client.search(database=RUSLAN_USERS_DATABASE, query=query, start_record=1, maximum_records=1) sru_records = humanize.get_records(sru_response) reader_id = "" password = "" if not sru_records: user_grs_record = _create_grs_from_user( oid=tatedu_user.oid, email=person_info.get("email", ""), user_attrs=user_attrs ) fields_115 = user_grs_record.get_field("115") if fields_115: password = fields_115[0].content user_grs_record = _create_or_update_ruslan_user(user_grs_record) else: user_grs_record = grs.Record.from_dict(humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field("100") if fields_100: reader_id = fields_100[0].content # tatedu_user.delete() user = authenticate(username=reader_id, password=password, need_check_password=False) if user: if user.is_active: login(request, user) request.session["logout_idp_url"] = LOGOUT_URL return render(request, "sso_tatedu/register_new_user.html", {"reader_id": reader_id, "password": password}) else: return _error_response( request=request, error="no_access_toke", state="", error_description=u"Ваша учетная запись не активна" ) else: return _error_response( request=request, error="no_user", state="", error_description=u"Система не может сопоставить вашу учетную запись ОЭ РТ", )
def handle(self, *args, **options): # sync_status = SyncStatus.get_or_create() # now = datetime.now() # # if sync_status.sync_started_at: # if now - timedelta(minutes=SYNC_TIMEOUT_MINUTES) < sync_status.sync_started_at: # return # # sync_status.sync_started_at = now # sync_status.last_sync = now # sync_status.record_processed = 0 # sync_status.save() ruslan_client = client.HttpClient(API_ADDRESS, API_USERNAME, API_PASSWORD, auto_close=False) maximum_records = 200 res = ruslan_client.extract_records( database='lusr_rt', query='@attrset bib-1 @attr 1=100 @attr 2=4 0', maximum_records=maximum_records, start_record=1, accept='application/json', result_set_ttl=60, limit=1 ) i = 1 for record in res: grs_record = grs.Record.from_dict(humanize.get_record_content(record)) user_id = grs_record.get_field_value('100') rusln_user = RuslanUser() rusln_user.user_id = user_id rusln_user.first_name = grs_record.get_field_value('101') rusln_user.patronymic = grs_record.get_field_value('103') rusln_user.last_name = grs_record.get_field_value('102') rusln_user.email = grs_record.get_field_value('122') birth_date_str = grs_record.get_field_value('234') if birth_date_str: rusln_user.birth_date = datetime.strptime(birth_date_str, '%Y%m%d') sex = grs_record.get_field_value('404') if sex == 'лю': rusln_user.sex = 'm' elif sex == 'лќ': rusln_user.sex = 'f' rusln_user.grs_json = json.dumps(grs_record.to_dict(), ensure_ascii=False) if i % 10 == 0: print i i += 1 ruslan_client.close_session()
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 register_new_user(request, id): try: esia_user = models.EsiaUser.objects.get(id=id) except models.EsiaUser.DoesNotExist: return redirect('sso_esia:index') user_attrs = json.loads(esia_user.user_attrs) person_contacts = user_attrs.get('person_contacts', []) portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'777' query = u'@attrset bib-1 @attr 1=403 "%s"' % (esia_user.oid.replace( '\\', '\\\\')) sru_response = portal_client.search(database=RUSLAN_USERS_DATABASE, query=query, start_record=1, maximum_records=1) sru_records = humanize.get_records(sru_response) reader_id = '' password = '' if not sru_records: user_grs_record = _create_grs_from_esia( oid=esia_user.oid, email=(_find_contacts_attr('EML', person_contacts) or [''])[0], user_attrs=user_attrs) fields_115 = user_grs_record.get_field('115') if fields_115: password = fields_115[0].content user_grs_record = _create_or_update_ruslan_user(user_grs_record) else: user_grs_record = grs.Record.from_dict( humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field('100') if fields_100: reader_id = fields_100[0].content esia_user.delete() user = authenticate(username=reader_id, password=password, need_check_password=False) if user: if user.is_active: login(request, user) return render(request, 'esia_sso/register_new_user.html', { 'reader_id': reader_id, 'password': password }) else: return _error_response( request=request, error='no_access_toke', state='', error_description=u'Ваша учетная запись не активна') else: return _error_response( request=request, error='no_user', state='', error_description= u'Система не может сопоставить вашу учетную запись ЕСИА')
def redirect_from_idp(request): error = request.GET.get("error") state = request.GET.get("state") code = request.GET.get("code") error_description = request.GET.get("error_description") if error: return _error_response(request=request, error=error, state=state, error_description=error_description) try: access_marker = _get_access_marker(code) except Exception as e: return _error_response( request=request, error="get_access_marker", state=state, error_description=u"При получении маркера возникла ошибка", exception=e, ) access_token = access_marker.get("access_token", "") if not access_token: return _error_response( request=request, error="no_access_toke", state=state, error_description=u"Авторизационный код доступа не был получен", ) try: person_info_resp = _get_person_info(access_token) # print person_info_resp # person_contacts = _get_person_contacts(oid, access_token) # person_addresses = _get_person_addresses(oid, access_token) # person_docs = _get_person_docs(oid, access_token) except Exception as e: return _error_response( request=request, error="user_info_error", error_description=u"Ошибка при получении информации из ЭО РТ", exception=e, ) if person_info_resp.get("status", "") != "success": return _error_response( request=request, error="user_info_error", error_description=u"Ошибка при получении информации из ЭО РТ " + person_info_resp.get("message"), ) # return HttpResponse(json.dumps(person_info_resp, ensure_ascii=False), content_type='application/json') person_info = person_info_resp.get("data", {}) if person_info.get("status", "") != "active": return _error_response( request=request, error="user_not_active", error_description=u"Учетная запись неактивна. Обратитесь к администратору портала ЭО", ) user_id = person_info.get("id") if not user_id: return _error_response( request=request, error="no_user_id", error_description=u"Ответ не содержит идентификатор пользователя" ) user_attrs = { "person_info": person_info, # 'person_contacts': person_contacts, # 'person_addresses': person_addresses, # 'person_docs': person_docs, } portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'erf' # state = '112313' # user_attrs = esia_response # person_info = user_attrs.get('person_info', {}) # person_contacts = user_attrs.get('person_contacts', []) sru_response = portal_client.search( query=u'@attrset bib-1 @attr 1=%s "%s"' % (OID_FIELD, unicode(user_id).replace("\\", "\\\\").replace('"', '\\"')), database=RUSLAN_USERS_DATABASE, maximum_records=1, ) sru_records = humanize.get_records(sru_response) if not sru_records: tatedu_user = models.create_or_update_user(user_id, user_attrs) return register_new_user(request, tatedu_user.id) else: user_grs_record = grs.Record.from_dict(humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field("100") if not fields_100: return _error_response( request=request, error="no_user", error_description=u"Система в данный момент не может произвести авторизацию", ) else: user = authenticate(username=fields_100[0].content, need_check_password=False) if user: if user.is_active: login(request, user) library_id = _get_library_id(user_grs_record) if library_id: request.session["org_id"] = library_id request.session["logout_idp_url"] = LOGOUT_URL request.session["auth_source"] = AUTH_SOURCE return redirect("index:frontend:index") else: return _error_response( request=request, error="no_access_token", state=state, error_description=u"Ваша учетная запись не активна", ) else: return _error_response( request=request, error="no_user", state=state, error_description=u"Система не может сопоставить вашу учетную запись ЭО РТ", )
def redirect_from_idp(request): error = request.GET.get('error') state = request.GET.get('state') code = request.GET.get('code') error_description = request.GET.get('error_description') if error: return _error_response( request=request, error=error, state=state, error_description=error_description ) try: access_marker = _get_access_marker(code) except Exception as e: return _error_response( request=request, error='get_access_marker', state=state, error_description=u'При получении маркера возникла ошибка', exception=e ) access_token = access_marker.get('access_token', '') if not access_token: return _error_response( request=request, error='no_access_toke', state=state, error_description=u'Авторизационный код доступа не был получен' ) try: person_info_resp = _get_person_info(access_token) # print person_info_resp # person_contacts = _get_person_contacts(oid, access_token) # person_addresses = _get_person_addresses(oid, access_token) # person_docs = _get_person_docs(oid, access_token) except Exception as e: return _error_response( request=request, error='user_info_error', error_description=u'Ошибка при получении информации из ЭО РТ', exception=e ) if person_info_resp.get('status', '') != 'success': return _error_response( request=request, error='user_info_error', error_description=u'Ошибка при получении информации из ЭО РТ ' + person_info_resp.get('message') ) # print json.dumps(person_info_resp, ensure_ascii=False) person_info = person_info_resp.get('data', {}) if person_info.get('status', '') != 'active': return _error_response( request=request, error='user_not_active', error_description=u'Учетная запись неактивна. Обратитесь к администратору портала ЭО' ) user_id = person_info.get('id') if not user_id: return _error_response( request=request, error='no_user_id', error_description=u'Ответ не содержит идентификатор пользователя' ) user_attrs = { 'person_info': person_info, # 'person_contacts': person_contacts, # 'person_addresses': person_addresses, # 'person_docs': person_docs, } portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'erf' # state = '112313' # user_attrs = esia_response # person_info = user_attrs.get('person_info', {}) # person_contacts = user_attrs.get('person_contacts', []) sru_response = portal_client.search( query=u'@attrset bib-1 @attr 1=%s "%s"' % ( OID_FIELD, unicode(user_id).replace('\\', '\\\\').replace('"', '\\"'),), database=RUSLAN_USERS_DATABASE, maximum_records=1 ) sru_records = humanize.get_records(sru_response) tatedu_user = models.create_or_update_user(user_id, user_attrs) if not sru_records: return register_new_user(request, tatedu_user.id) else: user_grs_record = grs.Record.from_dict(humanize.get_record_content(sru_records[0])) new_user_grs_record = _create_grs_from_user( oid=tatedu_user.oid, email=person_info.get('email', ''), user_attrs=user_attrs ) for field_value in ['505', '506', '508', '509', '510']: fields = new_user_grs_record.get_field(field_value) user_grs_record.set_field(field_value, fields) _update_ruslan_user(user_grs_record) fields_100 = user_grs_record.get_field('100') if not fields_100: return _error_response( request=request, error='no_user', state=state, error_description=u'Система в данный момент не может произвести авторизацию' ) else: user = authenticate(username=fields_100[0].content, need_check_password=False) if user: if user.is_active: login(request, user) library_id = _get_library_id(user_grs_record) if library_id: request.session['org_id'] = library_id request.session['logout_idp_url'] = LOGOUT_URL request.session['auth_source'] = AUTH_SOURCE return redirect('index:frontend:index') else: return _error_response( request=request, error='no_access_token', state=state, error_description=u'Ваша учетная запись не активна' ) else: return _error_response( request=request, error='no_user', state=state, error_description=u'Система не может сопоставить вашу учетную запись ЭО РТ' )
def register_new_user(request, id): try: esia_user = models.EsiaUser.objects.get(id=id) except models.EsiaUser.DoesNotExist: return redirect('sso_esia:index') user_attrs = json.loads(esia_user.user_attrs) person_contacts = user_attrs.get('person_contacts', []) portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'777' query = u'@attrset bib-1 @attr 1=403 "%s"' % (esia_user.oid.replace('\\', '\\\\')) sru_response = portal_client.search(database=RUSLAN_USERS_DATABASE, query=query, start_record=1, maximum_records=1) sru_records = humanize.get_records(sru_response) reader_id = '' password = '' if not sru_records: user_grs_record = _create_grs_from_esia( oid=esia_user.oid, email=(_find_contacts_attr('EML', person_contacts) or [''])[0], user_attrs=user_attrs ) fields_115 = user_grs_record.get_field('115') if fields_115: password = fields_115[0].content user_grs_record = _create_or_update_ruslan_user(user_grs_record) else: user_grs_record = grs.Record.from_dict(humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field('100') if fields_100: reader_id = fields_100[0].content esia_user.delete() user = authenticate(username=reader_id, password=password, need_check_password=False) if user: if user.is_active: login(request, user) return render(request, 'esia_sso/register_new_user.html', { 'reader_id': reader_id, 'password': password }) else: return _error_response( request=request, error='no_access_toke', state='', error_description=u'Ваша учетная запись не активна' ) else: return _error_response( request=request, error='no_user', state='', error_description=u'Система не может сопоставить вашу учетную запись ЕСИА' )
def ask_for_exist_reader(request, id): try: esia_user = models.EsiaUser.objects.get(id=id) except models.EsiaUser.DoesNotExist: return redirect('sso_esia:index') portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) if request.method == 'POST': ruslan_auth_form = forms.RuslanAuthForm(request.POST) if ruslan_auth_form.is_valid(): reader_id = ruslan_auth_form.cleaned_data['reader_id'].replace('\\', '\\\\').replace('"', '\\"') password = ruslan_auth_form.cleaned_data['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: ruslan_auth_form.add_error('reader_id', u'Идентификатор читателя не найден') else: sru_response = portal_client.search( query='@attrset bib-1 @and @attr 1=100 "%s" @attr 1=115 "%s"' % (reader_id, password), database=RUSLAN_USERS_DATABASE, maximum_records=1 ) sru_records = humanize.get_records(sru_response) if not sru_records: ruslan_auth_form.add_error('reader_id', u'Неверный пароль') else: user_record = humanize.get_record_content(sru_records[0]) user_grs_record = grs.Record.from_dict(user_record) fields_403 = user_grs_record.get_field('403') if fields_403: if fields_403[0].content != esia_user.oid: ruslan_auth_form.add_error( 'reader_id', u'Идентификатор читателя уже связан с учетной записью ЕСИА' ) else: user_grs_record.add_field(grs.Field('403', esia_user.oid)) portal_client.update_grs( grs_record=user_grs_record, database=RUSLAN_USERS_DATABASE, id=reader_id ) esia_user.delete() user = authenticate( username=ruslan_auth_form.cleaned_data['reader_id'], password=ruslan_auth_form.cleaned_data['password'] ) if user: if user.is_active: login(request, user) return redirect('index:frontend:index') else: return _error_response( request=request, error='no_access_toke', state='', error_description=u'Ваша учетная запись читателя не активна' ) else: return _error_response( request=request, error='no_user', state='', error_description=u'Система не может сопоставить вашу учетную запись ЕСИА' ) else: ruslan_auth_form = forms.RuslanAuthForm() return render(request, 'esia_sso/ask_for_exist_reader.html', { 'ruslan_auth_form': ruslan_auth_form, 'esia_id': id })
def register_new_user(request, id): try: tatedu_user = models.TatEduUser.objects.get(id=id) except models.TatEduUser.DoesNotExist: return redirect('sso_tatedu:index') user_attrs = json.loads(tatedu_user.user_attrs) person_info = user_attrs.get('person_info', {}) portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'777' query = u'@attrset bib-1 @attr 1=%s "%s"' % ( OID_FIELD, tatedu_user.oid.replace('\\', '\\\\')) sru_response = portal_client.search(database=RUSLAN_USERS_DATABASE, query=query, start_record=1, maximum_records=1) sru_records = humanize.get_records(sru_response) reader_id = '' password = '' if not sru_records: user_grs_record = _create_grs_from_user(oid=tatedu_user.oid, email=person_info.get( 'email', ''), user_attrs=user_attrs) fields_115 = user_grs_record.get_field('115') if fields_115: password = fields_115[0].content user_grs_record = _create_or_update_ruslan_user(user_grs_record) else: user_grs_record = grs.Record.from_dict( humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field('100') if fields_100: reader_id = fields_100[0].content # tatedu_user.delete() user = authenticate(username=reader_id, password=password, need_check_password=False) if user: if user.is_active: login(request, user) request.session['logout_idp_url'] = LOGOUT_URL return render(request, 'sso_tatedu/register_new_user.html', { 'reader_id': reader_id, 'password': password }) else: return _error_response( request=request, error='no_access_toke', state='', error_description=u'Ваша учетная запись не активна') else: return _error_response( request=request, error='no_user', state='', error_description= u'Система не может сопоставить вашу учетную запись ОЭ РТ')
def redirect_from_idp(request): error = request.GET.get('error') state = request.GET.get('state') error_description = request.GET.get('error_description') if error: return _error_response( request=request, error=error, state=state, error_description=error_description ) code = request.GET.get('code') state = request.GET.get('state') try: access_marker = _get_access_marker(code) except Exception as e: return _error_response( request=request, error='get_access_marker', state=state, error_description=u'При получении маркера возникла ошибка', exception=e ) access_token = access_marker.get('access_token', '') if not access_token: return _error_response( request=request, error='no_access_toke', state=state, error_description=u'Авторизационный код доступа не был получен' ) try: oid = _get_oid(access_token) except Exception as e: return _error_response( request=request, error='get_oid', state=state, error_description=u'Ошибка при получении oid', exception=e ) if not oid: return _error_response( request=request, error='no_oid', state=state, error_description=u'oid не был получен' ) try: person_info = _get_person_info(oid, access_token) person_contacts = _get_person_contacts(oid, access_token) person_addresses = _get_person_addresses(oid, access_token) except Exception as e: return _error_response( request=request, error='user_info_error', state=state, error_description=u'Ошибка при получении информации из ЕСИА', exception=e ) user_attrs = { 'person_info': person_info, 'person_contacts': person_contacts, 'person_addresses': person_addresses } portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) #oid = u'erf' #state = '112313' #user_attrs = esia_response # person_info = user_attrs.get('person_info', {}) # person_contacts = user_attrs.get('person_contacts', []) sru_response = portal_client.search( query='@attrset bib-1 @attr 1=403 "%s"' % (oid.replace('\\', '\\\\').replace('"', '\\"'),), database=RUSLAN_USERS_DATABASE, maximum_records=1 ) sru_records = humanize.get_records(sru_response) if not sru_records: esia_user = models.create_or_update_esia_user(oid, user_attrs) return redirect('sso_esia:ask_for_exist_reader', id=esia_user.id) else: user_grs_record = grs.Record.from_dict(humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field('100') if not fields_100: return _error_response( request=request, error='no_user', state=state, error_description=u'Система в данный момент не может произвести авторизацию' ) else: user = authenticate(username=fields_100[0].content, need_check_password=False) if user: if user.is_active: login(request, user) request.session['logout_idp_url'] = 'https://esia-portal1.test.gosuslugi.ru/profile/user/saml/Logout' return redirect('index:frontend:index') else: return _error_response( request=request, error='no_access_toke', state=state, error_description=u'Ваша учетная запись не активна' ) else: return _error_response( request=request, error='no_user', state=state, error_description=u'Система не может сопоставить вашу учетную запись ЕСИА' )
def remote_return(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=RCIRC, 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 = grs.Record.from_dict(opac_record) order_id = grs_record.get_field_value('1', '') receipt_date = grs_record.get_field_value('142', '') bib_card = grs_record.get_field_value('144', '') record_id = grs_record.get_field_value('145', '') owner_id = grs_record.get_field_value('146', '') receipter_id = grs_record.get_field_value('410', '') state = REMOTE_STATES.get(grs_record.get_field_value('148', ''), u'неизвестно') owner_sigla = grs_record.get_field_value('147', '') receipter_sigla = grs_record.get_field_value('411', '') owner_org = None try: owner_org = Library.objects.get(code=owner_id) if owner_sigla: owner_org = find_holders(owner_org, owner_sigla) except Library.DoesNotExist: pass receipter_org = None try: receipter_org = Library.objects.get(code=receipter_id) if receipter_sigla: receipter_org = find_holders(receipter_org, receipter_sigla) except Library.DoesNotExist: pass orders.append({ 'order_id': order_id, 'receipt_date': receipt_date, 'bib_card': bib_card, 'record_id': record_id, 'owner_id': owner_id, 'receipter_id': receipter_id, 'state': state, 'owner_org': owner_org, 'receipter_org': receipter_org, }) ruslan_client.close_session() return render(request, 'ruslan_cabinet/frontend/remote_items.html', { 'orders': orders, 'fine': fine, 'errors': errors })
def remote_return(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=RCIRC, 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 = grs.Record.from_dict(opac_record) order_id = grs_record.get_field_value('1', '') receipt_date = grs_record.get_field_value('142', '') bib_card = grs_record.get_field_value('144', '') record_id = grs_record.get_field_value('145', '') owner_id = grs_record.get_field_value('146', '') receipter_id = grs_record.get_field_value('410', '') state = REMOTE_STATES.get( grs_record.get_field_value('148', ''), u'неизвестно') owner_sigla = grs_record.get_field_value('147', '') receipter_sigla = grs_record.get_field_value('411', '') owner_org = None try: owner_org = Library.objects.get(code=owner_id) if owner_sigla: owner_org = find_holders(owner_org, owner_sigla) except Library.DoesNotExist: pass receipter_org = None try: receipter_org = Library.objects.get(code=receipter_id) if receipter_sigla: receipter_org = find_holders(receipter_org, receipter_sigla) except Library.DoesNotExist: pass orders.append({ 'order_id': order_id, 'receipt_date': receipt_date, 'bib_card': bib_card, 'record_id': record_id, 'owner_id': owner_id, 'receipter_id': receipter_id, 'state': state, 'owner_org': owner_org, 'receipter_org': receipter_org, }) ruslan_client.close_session() return render(request, 'ruslan_cabinet/frontend/remote_items.html', { 'orders': orders, 'fine': fine, 'errors': errors })
def redirect_from_idp(request): error = request.GET.get('error') state = request.GET.get('state') code = request.GET.get('code') error_description = request.GET.get('error_description') if error: return _error_response(request=request, error=error, state=state, error_description=error_description) try: access_marker = _get_access_marker(code) except Exception as e: return _error_response( request=request, error='get_access_marker', state=state, error_description=u'При получении маркера возникла ошибка', exception=e) access_token = access_marker.get('access_token', '') if not access_token: return _error_response( request=request, error='no_access_toke', state=state, error_description=u'Авторизационный код доступа не был получен') try: oid = _get_oid(access_token) except Exception as e: return _error_response(request=request, error='get_oid', state=state, error_description=u'Ошибка при получении oid', exception=e) if not oid: return _error_response(request=request, error='no_oid', state=state, error_description=u'oid не был получен') try: person_info = _get_person_info(oid, access_token) person_contacts = _get_person_contacts(oid, access_token) person_addresses = _get_person_addresses(oid, access_token) person_docs = _get_person_docs(oid, access_token) except Exception as e: return _error_response( request=request, error='user_info_error', state=state, error_description=u'Ошибка при получении информации из ЕСИА', exception=e) user_attrs = { 'person_info': person_info, 'person_contacts': person_contacts, 'person_addresses': person_addresses, 'person_docs': person_docs, } portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'erf' # state = '112313' # user_attrs = esia_response # person_info = user_attrs.get('person_info', {}) # person_contacts = user_attrs.get('person_contacts', []) sru_response = portal_client.search( query='@attrset bib-1 @attr 1=403 "%s"' % (oid.replace('\\', '\\\\').replace('"', '\\"'), ), database=RUSLAN_USERS_DATABASE, maximum_records=1) sru_records = humanize.get_records(sru_response) if not sru_records: esia_user = models.create_or_update_esia_user(oid, user_attrs) return redirect('sso_esia:ask_for_exist_reader', id=esia_user.id) else: user_grs_record = grs.Record.from_dict( humanize.get_record_content(sru_records[0])) fields_100 = user_grs_record.get_field('100') if not fields_100: return _error_response( request=request, error='no_user', state=state, error_description= u'Система в данный момент не может произвести авторизацию') else: user = authenticate(username=fields_100[0].content, need_check_password=False) if user: if user.is_active: login(request, user) request.session[ 'logout_idp_url'] = 'https://esia.gosuslugi.ru/idp/ext/Logout?client_id=%s&redirect_url=http://%s' % ( ESIA_SSO_CLIENT_ID, SITE_DOMAIN) return redirect('index:frontend:index') else: return _error_response( request=request, error='no_access_toke', state=state, error_description=u'Ваша учетная запись не активна') else: return _error_response( request=request, error='no_user', state=state, error_description= u'Система не может сопоставить вашу учетную запись ЕСИА')
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) reader_id = username.replace('\\', '\\\\').replace('"', '\\"') password = password.replace('\\', '\\\\').replace('"', '\\"') sru_response = portal_client.search( query='@attrset bib-1 @attr 1=132 "%s"' % (reader_id, ), database=RUSLAN_USERS_DATABASE, maximum_records=1) sru_records = humanize.get_records(sru_response) if sru_records: try: record_content = humanize.get_record_content(sru_records[0]) grs_record = grs.Record.from_dict(record_content) f100 = grs_record.get_field_value('100', '') if f100: reader_id = f100.replace('\\', '\\\\').replace('"', '\\"') except Exception as e: logger.exception(e) return None if need_check_password: user_client = client.HttpClient(API_ADDRESS, username=reader_id, password=password) try: user_principal = user_client.principal() user_client.close_session() except client.UnauthorizedError: return None except UnicodeEncodeError: return None try: # reader_id = username.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(reader_id, database=RUSLAN_USERS_DATABASE) records = humanize.get_records(sru_reps) if not records: return None # 101 - фамилия # 102 - имя # 103 - отчество grs_record = grs.Record.from_dict( humanize.get_record_content(records[0])) return self.get_or_create_user(reader_id, password, grs_record, need_check_password)
def _get_orders(ruslan_client, ruslan_user, database): errors = [] def make_request(start_record=1, maximum_records=20): return ruslan_client.search(database=database, query='@attrset ext-1 @attr 1=1 "%s"' % ruslan_user.username, maximum_records=maximum_records, start_record=start_record, accept='application/opac+json') responses = [] per_request = 20 response = make_request(start_record=1, maximum_records=per_request) diagnostics = response.get('diagnostics', {}).get('diagnostic', []) if diagnostics: json_diagnostics = '' try: json_diagnostics = json.dumps(diagnostics) except json.JSONEncoder: pass logger.error(u'Ошибка при получении списка заказов: %s' % (json_diagnostics, )) errors.append(u'Ошибка при получении списка заказов.') responses.append(response) next_position = int(response.get('nextRecordPosition', 1)) number_of_records = int(response.get('numberOfRecords', 0)) while next_position and next_position > number_of_records: next_position = int( response.get('nextRecordPosition', next_position + per_request)) response = make_request(next_position, maximum_records=per_request) responses.append(response) orders = [] for response in responses: for record in humanize.get_records(response): opac_record = humanize.get_record_content(record) bib_record_dict = opac_record \ .get('taskSpecificParameters', {}) \ .get('taskPackage', {}) \ .get('targetPart', {}) \ .get('itemRequest', {}) \ .get('bibliographicRecord', {}) \ .get('record', {}) libcard = '' if bib_record_dict: libcard = junimarc.utils.beautify( unicode(transformers['libcard']( junimarc.ruslan_xml.record_to_xml( junimarc.json_schema.record_from_json( bib_record_dict))))) orders.append({ 'libcard': libcard, 'opac': { 'statusOrErrorReport': opac_record.get('taskSpecificParameters', {}).get( 'taskPackage', {}).get('targetPart', {}).get('statusOrErrorReport', ''), 'taskStatus': opac_record.get('taskStatus', ''), 'creationDateTime': opac_record.get('creationDateTime', ''), 'targetReference': opac_record.get('targetReference', ''), }, }) orders.reverse() return { 'orders': orders, 'errors': errors, }
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) reader_id = username.replace('\\', '\\\\').replace('"', '\\"') password = password.replace('\\', '\\\\').replace('"', '\\"') sru_response = portal_client.search( query='@attrset bib-1 @attr 1=132 "%s"' % (reader_id,), database=RUSLAN_USERS_DATABASE, maximum_records=1 ) sru_records = humanize.get_records(sru_response) if sru_records: try: record_content = humanize.get_record_content(sru_records[0]) grs_record = grs.Record.from_dict(record_content) f100 = grs_record.get_field_value('100', '') if f100: reader_id = f100.replace('\\', '\\\\').replace('"', '\\"') except Exception as e: logger.exception(e) return None if need_check_password: user_client = client.HttpClient(API_ADDRESS, username=reader_id, password=password) try: user_principal = user_client.principal() user_client.close_session() except client.UnauthorizedError: return None except UnicodeEncodeError: return None try: # reader_id = username.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(reader_id, database=RUSLAN_USERS_DATABASE) records = humanize.get_records(sru_reps) if not records: return None # 101 - фамилия # 102 - имя # 103 - отчество grs_record = grs.Record.from_dict(humanize.get_record_content(records[0])) return self.get_or_create_user(reader_id, password, grs_record, need_check_password)
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 _get_orders(ruslan_client, ruslan_user, database): errors = [] def make_request(start_record=1, maximum_records=20): return ruslan_client.search( database=database, query='@attrset ext-1 @attr 1=1 "%s"' % ruslan_user.username, maximum_records=maximum_records, start_record=start_record, accept='application/opac+json' ) responses = [] per_request = 20 response = make_request(start_record=1, maximum_records=per_request) diagnostics = response.get('diagnostics', {}).get('diagnostic', []) if diagnostics: json_diagnostics = '' try: json_diagnostics = json.dumps(diagnostics) except json.JSONEncoder: pass logger.error(u'Ошибка при получении списка заказов: %s' % (json_diagnostics, )) errors.append(u'Ошибка при получении списка заказов.') responses.append(response) next_position = int(response.get('nextRecordPosition', 1)) number_of_records = int(response.get('numberOfRecords', 0)) while next_position and next_position > number_of_records: next_position = int(response.get('nextRecordPosition', next_position + per_request)) response = make_request(next_position, maximum_records=per_request) responses.append(response) orders = [] for response in responses: for record in humanize.get_records(response): opac_record = humanize.get_record_content(record) bib_record_dict = opac_record \ .get('taskSpecificParameters', {}) \ .get('taskPackage', {}) \ .get('targetPart', {}) \ .get('itemRequest', {}) \ .get('bibliographicRecord', {}) \ .get('record', {}) libcard = '' if bib_record_dict: libcard = junimarc.utils.beautify(unicode(transformers['libcard'](junimarc.ruslan_xml.record_to_xml( junimarc.json_schema.record_from_json(bib_record_dict))) )) orders.append({ 'libcard': libcard, 'opac': { 'statusOrErrorReport': opac_record .get('taskSpecificParameters', {}) .get('taskPackage', {}) .get('targetPart', {}) .get('statusOrErrorReport', ''), 'taskStatus': opac_record.get('taskStatus', ''), 'creationDateTime': opac_record.get('creationDateTime', ''), 'targetReference': opac_record.get('targetReference', ''), }, }) orders.reverse() return { 'orders': orders, 'errors': errors, }
def ask_for_exist_reader(request, id): try: esia_user = models.EsiaUser.objects.get(id=id) except models.EsiaUser.DoesNotExist: return redirect('sso_esia:index') portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) if request.method == 'POST': ruslan_auth_form = forms.RuslanAuthForm(request.POST) if ruslan_auth_form.is_valid(): reader_id = ruslan_auth_form.cleaned_data['reader_id'].replace( '\\', '\\\\').replace('"', '\\"') password = ruslan_auth_form.cleaned_data['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: ruslan_auth_form.add_error( 'reader_id', u'Идентификатор читателя не найден') else: sru_response = portal_client.search( query= '@attrset bib-1 @and @attr 1=100 "%s" @attr 1=115 "%s"' % (reader_id, password), database=RUSLAN_USERS_DATABASE, maximum_records=1) sru_records = humanize.get_records(sru_response) if not sru_records: ruslan_auth_form.add_error('reader_id', u'Неверный пароль') else: user_record = humanize.get_record_content(sru_records[0]) user_grs_record = grs.Record.from_dict(user_record) fields_403 = user_grs_record.get_field('403') if fields_403: if fields_403[0].content != esia_user.oid: ruslan_auth_form.add_error( 'reader_id', u'Идентификатор читателя уже связан с учетной записью ЕСИА' ) else: user_grs_record.add_field( grs.Field('403', esia_user.oid)) portal_client.update_grs( grs_record=user_grs_record, database=RUSLAN_USERS_DATABASE, id=reader_id) esia_user.delete() user = authenticate( username=ruslan_auth_form. cleaned_data['reader_id'], password=ruslan_auth_form.cleaned_data['password']) if user: if user.is_active: login(request, user) return redirect('index:frontend:index') else: return _error_response( request=request, error='no_access_toke', state='', error_description= u'Ваша учетная запись читателя не активна') else: return _error_response( request=request, error='no_user', state='', error_description= u'Система не может сопоставить вашу учетную запись ЕСИА' ) else: ruslan_auth_form = forms.RuslanAuthForm() return render(request, 'esia_sso/ask_for_exist_reader.html', { 'ruslan_auth_form': ruslan_auth_form, 'esia_id': id })
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 redirect_from_idp(request): error = request.GET.get('error') state = request.GET.get('state') code = request.GET.get('code') error_description = request.GET.get('error_description') if error: return _error_response(request=request, error=error, state=state, error_description=error_description) try: access_marker = _get_access_marker(code) except Exception as e: return _error_response( request=request, error='get_access_marker', state=state, error_description=u'При получении маркера возникла ошибка', exception=e) access_token = access_marker.get('access_token', '') if not access_token: return _error_response( request=request, error='no_access_toke', state=state, error_description=u'Авторизационный код доступа не был получен') try: person_info_resp = _get_person_info(access_token) # print person_info_resp # person_contacts = _get_person_contacts(oid, access_token) # person_addresses = _get_person_addresses(oid, access_token) # person_docs = _get_person_docs(oid, access_token) except Exception as e: return _error_response( request=request, error='user_info_error', error_description=u'Ошибка при получении информации из ЭО РТ', exception=e) if person_info_resp.get('status', '') != 'success': return _error_response( request=request, error='user_info_error', error_description=u'Ошибка при получении информации из ЭО РТ ' + person_info_resp.get('message')) # print json.dumps(person_info_resp, ensure_ascii=False) person_info = person_info_resp.get('data', {}) if person_info.get('status', '') != 'active': return _error_response( request=request, error='user_not_active', error_description= u'Учетная запись неактивна. Обратитесь к администратору портала ЭО' ) user_id = person_info.get('id') if not user_id: return _error_response( request=request, error='no_user_id', error_description=u'Ответ не содержит идентификатор пользователя') user_attrs = { 'person_info': person_info, # 'person_contacts': person_contacts, # 'person_addresses': person_addresses, # 'person_docs': person_docs, } portal_client = connection_pool.get_client(RUSLAN_API_ADDRESS, RUSLAN_API_USERNAME, RUSLAN_API_PASSWORD) # oid = u'erf' # state = '112313' # user_attrs = esia_response # person_info = user_attrs.get('person_info', {}) # person_contacts = user_attrs.get('person_contacts', []) sru_response = portal_client.search( query=u'@attrset bib-1 @attr 1=%s "%s"' % ( OID_FIELD, unicode(user_id).replace('\\', '\\\\').replace('"', '\\"'), ), database=RUSLAN_USERS_DATABASE, maximum_records=1) sru_records = humanize.get_records(sru_response) tatedu_user = models.create_or_update_user(user_id, user_attrs) if not sru_records: return register_new_user(request, tatedu_user.id) else: user_grs_record = grs.Record.from_dict( humanize.get_record_content(sru_records[0])) new_user_grs_record = _create_grs_from_user(oid=tatedu_user.oid, email=person_info.get( 'email', ''), user_attrs=user_attrs) for field_value in ['505', '506', '508', '509', '510']: fields = new_user_grs_record.get_field(field_value) user_grs_record.set_field(field_value, fields) _update_ruslan_user(user_grs_record) fields_100 = user_grs_record.get_field('100') if not fields_100: return _error_response( request=request, error='no_user', state=state, error_description= u'Система в данный момент не может произвести авторизацию') else: user = authenticate(username=fields_100[0].content, need_check_password=False) if user: if user.is_active: login(request, user) library_id = _get_library_id(user_grs_record) if library_id: request.session['org_id'] = library_id request.session['logout_idp_url'] = LOGOUT_URL request.session['auth_source'] = AUTH_SOURCE return redirect('index:frontend:index') else: return _error_response( request=request, error='no_access_token', state=state, error_description=u'Ваша учетная запись не активна') else: return _error_response( request=request, error='no_user', state=state, error_description= u'Система не может сопоставить вашу учетную запись ЭО РТ')