Пример #1
0
def order(request, order_type='', org_id=''):
    """
        order_type document || copy || reserve
    """
    #zgate_cookie = request.session.get('zgate_cookie', '')
    #zworker = ZWorker(zgate_cookie)
    #zworker.xml_name = catalogs['1']['xml']
    #zworker.xsl_name = catalogs['1']['xsl']
    #zworker.entry_point = reverse("zgate_index", args=['1'])

    #заменяем F на X чтобы cgi вернул XML. О как!

    if 'zstate' in request.GET:
        zgate_url = catalogs[catalog_id]['url']
        zstate = request.GET['zstate'].replace(' ', '+')
        (xml_record, cookies) = zworker.request(zgate_url + '?' + zstate.replace('1+F', '1+X'), cookies=request.COOKIES)
        #xml_record = zworker.make_get_request(request.GET['zstate'].replace(' F ', ' X '))

    try:
        tree = ET.XML(xml_record.encode('UTF-8'))
    except SyntaxError as e:
        # Если zgate вернул html страницу, то печатаем ее как ошибку ыыы


        compiled_regx = re.compile(r".*<body>(?P<section>.*).*</body>", re.IGNORECASE | re.MULTILINE)
        xml_record = xml_record.replace("\n",
            '|||') #временно меняем символы новой строки, чтобы сработала регулярка ыыы
        xml_record = re.match(compiled_regx, xml_record).group('section')
        xml_record = xml_record.replace("|||", '\n')
        response = render(request, 'orders/orders_done.html',
                {'error': xml_record})
        return set_cookies_to_response(cookies, response)

    order_manager = OrderManager(settings.ORDERS['db_catalog'], settings.ORDERS['rdx_path'])
    #return HttpResponse(u'Заказ сделан '+ order_type +'<br/>'+ org_id +'<br/>'+xml_record.decode('utf-8'))


    sender_id = 'belav' #id отправителя
    reciver_id = '19017901' #id получателя (огранизации)
    reserve_reciver_id = ''  #id конечного получателя (огранизации) при бронировании
    if order_type == 'reserve':
        reserve_reciver_id = org_id
    try:
        result = order_manager.order_document(
            order_type=order_type,
            sender_id=sender_id,
            reciver_id=reciver_id,
            xml_record=xml_record,
            reserve_reciver_id=reserve_reciver_id,
            comments=u'Сделать как можно скорее!'
        )
    except Exception as e:
        if settings.DEBUG == True:
            raise e
        else:
            raise RuntimeError(u'Ошибка при обработке заказа')
            #result = u'Заказ сделан '+ order_type +'<br/>'+xml_record.decode('utf-8')
    return render(request, 'orders/orders_done.html',
            {'result': result})
Пример #2
0
def zorder(request, library_id):
    record_id = request.GET.get('id', None)
    if not record_id:
        raise Http404()
    library = get_object_or_404(Library, id=library_id)

    # проверяем, привязан ли zgate к библиотеке чтобы можно было перенаправить на него
    try:
        zcatalog = ZCatalog.objects.get(latin_title=library.code)
    except ZCatalog.DoesNotExist:
        return HttpResponse(u'Библиотека не может принимать электронные заказы')

    # ищем связь пользователя с библиотекой, чтобы автоматически авторизовать для заказа
    # иначе перенаправляем для установления связи

    # try:
    #     lib_reader = LibReader.objects.get(user=request.user, library=library)
    # except LibReader.DoesNotExist:
    #     back = request.get_full_path()
    #     return redirect(urlresolvers.reverse('urt:frontend:auth', args=[library_id]) + '?back=' + back)
    try:
        ruslan_user = sso_ruslan_models.RuslanUser.objects.get(user=request.user)
    except sso_ruslan_models.RuslanUser.DoesNotExist:
        return HttpResponse(u'Необходимо войти под учетной записью читателя')

    (zgate_form, cookies) = zworker.get_zgate_form(
        zgate_url=zcatalog.url,
        xml=zcatalog.xml,
        xsl=zcatalog.xsl,
        cookies=request.COOKIES,
        username=ruslan_user.username,
        password=ruslan_user.password,
    )
    session_id = zworker.get_zgate_session_id(zgate_form)
    form_params = zworker.get_form_dict(zgate_form)
    if form_params.has_key('scan'):
        del (form_params['scan'])  # удаляем, иначе происходит сканирование :-)
    form_params['use_1'] = '12:1.2.840.10003.3.1'
    form_params['term_1'] = record_id
    (result, cookies) = zworker.request(zcatalog.url, data=form_params, cookies=cookies)
    print(zcatalog.url)
    # анализируем полученный html на содержание текса с идентификатором записи - значит нашли
    if result.decode('utf-8').find(u'id="%s' % (record_id,)) >= 0:
        #        link = reverse('zgate_index', args=(catalog.id,)) + '?zstate=preorder+%s+1+default+1+1.2.840.10003.5.28+rus' % session_id
        link = zcatalog.url + '?preorder+%s+1+default+1+1.2.840.10003.5.28+rus' % session_id
        resp = redirect(link)
        set_cookies_to_response(cookies, resp, domain='.kitap.tatar.ru')
        return resp
    return HttpResponse(u'Zgate order')
Пример #3
0
def make_order(request):
    if not request.user.is_authenticated():
        return HttpResponse(u'Вы должны быть войти на портал', status=401)
    if request.method != 'POST':
        return HttpResponse('Only post requests');
    order_type = request.POST.get('type')
    order_manager_id = request.POST.get('org_id')  # организация, которая получит заказ
    order_time = datetime.datetime.now()

    order_copy_limit = 5
    order_document_limit = 5
    order_reserve_limit = 5

    # user_order_times = UserOrderTimes.objects.filter(
    #     user=request.user,
    #     order_manager_id=order_manager_id,
    #     order_type=order_type,
    #     order_time__year=order_time.year,
    #     order_time__month=order_time.month,
    #     order_time__day=order_time.day
    # ).count()
    user_order_times = 0
    if order_type == 'document':
        if user_order_times >= order_document_limit:
            return HttpResponse(simplejson.dumps(
                {'status': 'error', 'error': 'На сегодня Ваш лимит заказов на доставку в эту библиотеку исчерпан'},
                ensure_ascii=False))
    elif order_type == 'copy':
        if user_order_times >= order_copy_limit:
            return HttpResponse(simplejson.dumps(
                {'status': 'error', 'error': 'На сегодня Ваш лимит заказов на копию в эту библиотеку исчерпан'},
                ensure_ascii=False))
    elif order_type == 'reserve':
        if user_order_times >= order_reserve_limit:
            return HttpResponse(simplejson.dumps({'status': 'error',
                                                  'error': 'На сегодня Ваш лимит заказов на бронирование в эту библиотеку исчерпан'}
                                                 ,
                                                 ensure_ascii=False))

    else:
        return HttpResponse(simplejson.dumps({'status': 'error', 'error': 'Неизвестный тип заказа'},
                                             ensure_ascii=False))

    catalog = get_object_or_404(ZCatalog, latin_title=request.POST['catalog_id'])
    zgate_url = catalog.url

    zstate = 'present+' + request.POST['zsession'] + \
             '+default+' + request.POST['zoffset'] + \
             '+1+X+1.2.840.10003.5.28+' + catalog.default_lang

    (xml_record, cookies) = zworker.request(zgate_url + '?' + zstate, cookies=request.COOKIES)

    #определяем, сколько раз пользователь сдлела заказ за сегодня


    try:
        tree = ET.XML(xml_record)
    except SyntaxError as e:
        return HttpResponse(json_error(u'Заказ не выполнен. Возможно, время сессии истекло'))

    order_manager = OrderManager(settings.ORDERS['db_catalog'], settings.ORDERS['rdx_path'])

    library = None
    try:
        library = Library.objects.get(code=order_manager_id)
    except Library.DoesNotExist:
        return HttpResponse(simplejson.dumps({'status': 'error', 'error': 'Организация не найдена'}))

    def get_first_recivier_code(library):
        ancestors = library.get_ancestors()
        for ancestor in ancestors:
            if ancestor.ill_service and ancestor.ill_service.strip():
                return ancestor.code
        return None

    # если у библиотеки указан ill адрес доставки, то пересылаем заказ ей
    if library.ill_service and library.ill_service.strip():
        manager_id = ''
        reciver_id = library.code

    # иначе ищем родителя, у которого есть адрес доставки
    else:
        manager_id = library.code
        reciver_id = get_first_recivier_code(library)

        if not reciver_id:
            return HttpResponse(simplejson.dumps({'status': 'error', 'error': 'Организация не может получать заявки'}))

    sender_id = request.user.username  #id отправителя
    copy_info = request.POST.get('copy_info', '')

    # try:
    order_manager.order_document(
        order_type=order_type,
        sender_id=sender_id,
        reciver_id=reciver_id,
        manager_id=manager_id,
        xml_record=xml_record,
        comments=request.POST.get('comments', ''),
        copy_info=copy_info
    )
    user_order_times = UserOrderTimes(user=request.user, order_type=order_type, order_manager_id=order_manager_id)
    user_order_times.save()
    # except Exception as e:
    #     if settings.DEBUG == True:
    #         return HttpResponse(simplejson.dumps({'status': 'error', 'error': 'Ошибка при обработке заказа' + str(e)},
    #                                              ensure_ascii=False))
    #     else:
    #         return HttpResponse(simplejson.dumps({'status': 'error', 'error': 'Ошибка при обработке заказа'},
    #                                              ensure_ascii=False))
            #result = u'Заказ сделан '+ order_type +'<br/>'+xml_record.decode('utf-8')

    return HttpResponse(simplejson.dumps({'status': 'ok'}, ensure_ascii=False));