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