Beispiel #1
0
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
    })
Beispiel #2
0
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
    })
Beispiel #3
0
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,
    })
Beispiel #4
0
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,
    })
Beispiel #5
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)
Beispiel #6
0
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"Система не может сопоставить вашу учетную запись ОЭ РТ",
        )
Beispiel #7
0
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'Система не может сопоставить вашу учетную запись ЕСИА')
Beispiel #8
0
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'Система не может сопоставить вашу учетную запись ЭО РТ'
                )
Beispiel #9
0
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
    })
Beispiel #10
0
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'Система не может сопоставить вашу учетную запись ЕСИА'
        )
Beispiel #11
0
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
    })
Beispiel #12
0
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,
    }
Beispiel #13
0
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'Система не может сопоставить вашу учетную запись ОЭ РТ')
Beispiel #14
0
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
    })
Beispiel #15
0
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"Система не может сопоставить вашу учетную запись ЭО РТ",
                )
Beispiel #16
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)
        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)
Beispiel #17
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
    })
Beispiel #18
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)
        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)
Beispiel #19
0
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'Система не может сопоставить вашу учетную запись ЕСИА')
Beispiel #20
0
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
    })
Beispiel #21
0
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,
    }
Beispiel #22
0
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'Система не может сопоставить вашу учетную запись ЕСИА'
                )
Beispiel #23
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
    })
Beispiel #24
0
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'Система не может сопоставить вашу учетную запись ЭО РТ')