Exemplo n.º 1
0
def post(order: Order):
    url = 'https://integration.cdek.ru/new_orders.php'
    date_first = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')

    delivery_data = {
        'secure': build_secure_hash(date_first),
        'account': settings.SDEK_ACCOUNT,
        'order': order,
        'date_first': date_first,
        'send_city_code': 1,
        'rec_city_code': get_rec_city_code(order),
        'send_city_post_code': '123123',
        'rec_city_post_code': get_rec_city_post_code(order),
        'street': order.address.street,
        'house': order.address.house,
        'flat': order.address.flat,
        'pvz_code': get_pvz_code(order),
        'height': order.height / 10,
        'width': order.width / 10,
        'length': order.length / 10,
        'items': order.orderarticle_set.all(),
    }

    xml = get_template('delivery/sdek/delivery.xml').render(delivery_data)
    xml = str(xml).encode('utf-8')

    response = requests.post(url, data={'xml_request': xml})
    data = response.text
    mongolog.log('sdek', {'response': data})
Exemplo n.º 2
0
def exec(method, path, query=None, data=None):
    query = query or dict()
    data = data or dict()
    base_query = {'type': 'json'}
    base_query.update(query)
    url = 'https://%s.amocrm.ru/api/v2/%s?%s' % (settings.AMOCRM_SUBDOMAIN,
                                                 path, urlencode(base_query))

    headers = {'Cookie': authorize(), 'Content-Type': 'application/json'}

    mongolog.log('crm', {
        'path': path,
        'query': query,
        'data': data,
        'headers': headers,
    })

    if method == 'get':
        resp = requests.get(url, headers=headers)
    elif method == 'post':
        resp = requests.post(url, json=data, headers=headers)
    elif method == 'put':
        resp = requests.put(url, json=data, headers=headers)
    else:
        raise ValueError

    # mongolog.log('crm', {
    #     'status_code': resp.status_code,
    #     'json': resp.json(),
    # })

    return resp
Exemplo n.º 3
0
def processing(request, name):
    logger.info(request.body.decode('utf-8'))
    data = parser.parse(request.POST.urlencode(), normalized=True)

    mongolog.log('processing', {'name': name, 'data': data})

    try:
        if name == 'tilda':
            order = processing_tilda(data)
        else:
            return HttpResponse(status=404)

        if not order.is_payed:
            send_sms(order.phone, 'unpaid',
                     {'total': order.total + order.delivery.cost})
            # TODO: send email

        order.amo_order_id = str(amo_create_order(order))
        order.save()

    except InvalidInputDataException as e:
        send_message(str(e))
    except BadDaDataBalanceException as e:
        send_message('Недостаточный баланс на https://dadata.ru')
        amo_create_order(e.order, str(e))
    except InvalidDeliveryException as e:
        amo_create_order(e.order, str(e))
    except ForeignDeliveryException as e:
        amo_create_order(e.order, str(e))
    except InvalidAddressException as e:
        amo_create_order(e.order, str(e))
    except InvalidArticlesException as e:
        amo_create_order(e.order, str(e))
    except ErrorPackException as e:
        amo_create_order(e.order, str(e))
    except AddressNormalizationException as e:
        amo_create_order(e.order, str(e))
    except SdekNotImplementedException as e:
        amo_create_order(e.order, str(e))
    except IntegrityError as e:
        return HttpResponse('ok', status=200)

    return HttpResponse('ok', status=200)
Exemplo n.º 4
0
def post(order: Order):
    if order.delivery.provider == Delivery.Providers.RUSSIAN_POST.value:
        response = russian_post.post(order)

        mongolog.log('delivery', {
            'name': "russian_post",
            'order_id': order.id,
            'data': response,
        })

        ship_id = response['result-ids'][0]

        return russian_post.request_barcode(ship_id)
    elif order.delivery.provider == Delivery.Providers.SDEK.value:
        response = sdek.post(order)

        return ''
    else:
        raise ValueError
def request_barcode(shipment_id):
    # properties
    base_url = settings.RUSS_POST_BASE_URL
    path = '/1.0/backlog/%s' % (shipment_id, )

    url = base_url + path
    mongolog.log('delivery', {
        'name': 'russian_post_get_barcode',
        'order_id': shipment_id,
    })
    response = requests.get(url, headers=build_headers())
    status = response.status_code
    data = response.json()
    mongolog.log(
        'delivery', {
            'name': 'russian_post_get_barcode.response',
            'status': response.status_code,
            'data': response.json(),
        })

    if status >= 400:
        raise RuntimeError('Error exec request ' + response.reason)

    return data.get('barcode')
def post(order: Order):
    # properties
    base_url = settings.RUSS_POST_BASE_URL
    path = '/1.0/user/backlog'

    if order.delivery.id == 1:

        # define mail properties
        if order.has_geometry(Article.Geometries.TUBE.value):
            mail_type = 'POSTAL_PARCEL'
            mail_category = 'ORDINARY'
            payment_method = 'CASHLESS'
        else:
            mail_type = 'BANDEROL'
            mail_category = 'ORDERED'
            payment_method = 'STAMP'

        parcel_data = {
            'address-type-to': 'DEFAULT',
            'given-name': order.first_name,
            'middle-name': order.middle_name,
            'surname': order.last_name,
            'recipient-name': order.full_name,
            'sms-notice-recipient': 0,
            'mail-category': mail_category,
            'mail-direct': 643,
            'mail-type': mail_type,
            'payment-method': payment_method,
            'mass': order.weight,
            'order-num': str(order.payment_id),
            # 'postoffice-code': '101000',
            # 'tel-address': order.phone,
            'transport-type': 'AVIA',
            'str-index-to': order.address.postal_code,
            'fragile': False,
            'courier': False,
            'wo-mail-rank': True,
            'manual-address-input': False,
        }

        if mail_type != 'BANDEROL':
            parcel_data['dimension'] = {
                'height': order.height,
                'length': order.length,
                'width': order.width
            }

    elif order.delivery.id == 2:
        # define mail properties
        if order.has_geometry(Article.Geometries.TUBE.value):
            mail_type = 'PARCEL_CLASS_1'
            mail_category = 'ORDINARY'
            payment_method = 'CASHLESS'
        else:
            mail_type = 'BANDEROL_CLASS_1'
            mail_category = 'ORDERED'
            payment_method = 'STAMP'

        parcel_data = {
            'address-type-to': 'DEFAULT',
            'given-name': order.first_name,
            'middle-name': order.middle_name,
            'surname': order.last_name,
            'recipient-name': order.full_name,
            'sms-notice-recipient': 0,
            'mail-category': mail_category,
            'mail-direct': 643,
            'mail-type': mail_type,
            'payment-method': payment_method,
            'mass': order.weight,
            'order-num': str(order.payment_id),
            # 'postoffice-code': '101000',
            # 'tel-address': order.phone,
            'transport-type': 'AVIA',
            'str-index-to': order.address.postal_code,
            'fragile': False,
            'courier': False,
            'wo-mail-rank': True,
            'manual-address-input': False,
        }

        if mail_type != 'BANDEROL_CLASS_1':
            parcel_data['dimension'] = {
                'height': order.height,
                'length': order.length,
                'width': order.width
            }

    elif order.delivery.id == 6:
        # TODO: implement foreign delivery
        raise ForeignDeliveryException(order)

    # get address data
    try:
        parcel_data.update(normalize_address(order.address.result))
    except ValueError:
        raise AddressNormalizationException(order)

    order_data = [parcel_data]

    url = base_url + path
    mongolog.log('delivery', {
        'name': 'russian_post',
        'order_id': order.id,
        'data': order_data,
    })
    response = requests.put(url,
                            headers=build_headers(),
                            data=json.dumps(order_data))
    return response.json()
Exemplo n.º 7
0
def web_hook(request):
    data = parser.parse(request.POST.urlencode(), normalized=True)
    mongolog.log('webhook', {'raw_data': request.POST, 'data': data})

    return HttpResponse()