Exemple #1
0
def update_address(addr_id):
    """

    :param addr_id:
    :return:
    """
    address = Address.objects(id=addr_id).first_or_404()
    if address not in current_user.addresses:
        return jsonify(message='Failed',
                       error=gettext('invalid address id for current user'))

    data = request.json
    try:
        address.state = data['state']
        address.city = data['city']
        address.country = data['country']
        address.street = data['street']
        address.postcode = data['postcode']
        address.receiver = data['receiver']
        address.mobile_number = data['mobile_number']
    except KeyError:
        return jsonify(message='Failed', error=gettext('invalid data'))

    address.save()
    return jsonify(message='OK', address_id=str(address.id))
Exemple #2
0
def cal_entries_price():
    """
    计算价格
    :return:
    """
    data = request.json
    entries = data.get('entries')
    if not entries:
        return jsonify(message='Failed',
                       error=gettext('please select the item.'))

    address_id = data.get('address_id')
    if address_id:
        address = Address.objects(id=address_id).first_or_404()
    else:
        return jsonify(message='Failed',
                       error=gettext('please select the address.'))

    entries_info = entry_info_from_ids(entries)
    cart = FakeCart(entries_info=entries_info,
                    user=current_user._get_current_object(),
                    address=address)
    cart.logistic_provider = data.get('logistic_provider')
    cart.coupon_codes = data.get('coupon_codes', [])

    price = cal_entries_price(cart)
    result = json_templ.order_price_json(price)
    return jsonify(message='OK', order=result)
Exemple #3
0
def update_transfer_order():
    """
    更新运单
    :return:
    """
    data = request.json
    order_id = data.get('order_id')
    order = Order.objects(id=order_id).first_or_404()
    # 入库订单才能修改
    if order.status != 'WAREHOUSE_IN':
        return jsonify(
            message='Failed',
            error=gettext(
                'only when order status warehouse_in can be updated'))

    address_id = data.get('address_id')
    user = current_user._get_current_object()
    if address_id:
        address = Address.objects(id=address_id).first_or_404()
    elif user.addresses:
        address = user.addresses[0]
    else:
        return jsonify(message='Failed', error=gettext('no address'))

    order.logistic_provider = data.get('logistic_provider')
    order.coupon_codes = data.get('coupon_codes', [])
    order.address = address
    order.update_amount()
    order.reload()
    result = json_templ.transfer_order_price_json(order)
    return jsonify(message='OK', order=result)
Exemple #4
0
def add_address():
    """

    :return:
    """
    data = request.json
    address = Address(state=data['state'],
                      city=data['city'],
                      country=data['country'],
                      street=data['street'],
                      postcode=data['postcode'],
                      receiver=data['receiver'],
                      mobile_number=data['mobile_number'])
    address.save()
    current_user.addresses.insert(0, address)
    current_user.save()
    return jsonify(message='OK', address_id=str(address.id))
Exemple #5
0
    def logistics(self):
        """
        物流
        :return:
        """
        items_range = request.headers.get('Range', '0-9')
        start, end = items_range.split('-')
        per_page = int(end) - int(start) + 1
        query = restruct_query(request.args)
        tracking_no = query.pop('tracking_no', '')
        include_closed = query.get('include_closed') and query.pop(
            'include_closed')
        try:
            if include_closed:
                logistic = Logistic.objects(**query)
            else:
                logistic = Logistic.objects(is_closed=False, **query)
            if tracking_no:
                logistic = logistic.filter(
                    Q(detail__us_tracking_no=tracking_no)
                    | Q(detail__cn_tracking_no=tracking_no))

            if request.args.get('status'):
                logistic = logistic.order_by('detail__%s' %
                                             LogisticDetail.attr_by_log_status[
                                                 request.args.get('status')])
        except:
            pass

        if query.get('receiver'):
            address = Address.objects(
                receiver=query.get('receiver')).distinct('id')
            orders = Order.commodities(address__in=address)
            logistic = list(
                chain.from_iterable(order.logistics for order in orders))
        if query.get('order_id'):
            orders = Order.commodities(short_id=int(query.get('order_id')))
            logistic = list(
                chain.from_iterable(order.logistics for order in orders))

        try:
            logistic_size = logistic.count()
        except:
            logistic_size = len(logistic)

        data = logistic[int(start):int(end)]
        data = [to_json(l) for l in data]
        resp = make_response(json_util.dumps(data), 200)
        resp.headers['Accept_Range'] = 'items'
        resp.headers['Content_Range'] = '%s-%s/%s' % (start, end,
                                                      logistic_size)
        resp.headers['Content_Type'] = 'application/json'
        return resp
Exemple #6
0
def get_address(addr_id):
    """

    :param addr_id:
    :return:
    """
    address = Address.objects(id=addr_id).first()
    if address not in current_user.addresses:
        return jsonify(message='Failed',
                       error=gettext('invaild address id for current user'))

    return jsonify(message='OK', address=address.to_json())
Exemple #7
0
 def set_address(self, addr):
     if not isinstance(addr, Address):
         addr = Address.objects(id=addr).first()
     if not addr:
         return False
     addr_snapshot = deepcopy(addr)
     addr_snapshot.id = None
     addr_snapshot.order_id = self.id
     addr_snapshot.save()
     if self.address:
         self.address.delete(w=1)
     self.address = addr_snapshot
     self.save()
     return True
Exemple #8
0
def del_address(addr_id):
    """
    删除地址信息
    :param addr_id:
    :return:
    """
    address = Address.objects(id=addr_id).first_or_404()
    if address not in current_user.addresses:
        return jsonify(message='Failed',
                       error=gettext('invalid address id for current user'))

    current_user.update(pull__addresses=address)
    address.delete()
    return jsonify(message='OK')
Exemple #9
0
def create_order():
    """

    :return:
    """
    entries = request.json.get('entries')
    entries_info = entry_info_from_ids(entries)
    user = current_user._get_current_object()
    address_id = request.json.get('address_id')
    if address_id:
        address = Address.objects(id=address_id).first_or_404()
    elif user.addresses:
        address = user.addresses[0]
    else:
        return jsonify(message='Failed', error=gettext('no address'))

    logistic_provider = request.json.get('logistic_provider')
    if not logistic_provider:
        return jsonify(message='Failed', error=gettext('no logistic provider'))

    coin = 0
    cash = 0
    coupon_codes = request.json.get('coupon_codes', [])
    order = Order.create_from_skus(user.id,
                                   entries_info,
                                   logistic_provider,
                                   coupon_codes=coupon_codes,
                                   coin=coin,
                                   cash=cash,
                                   address=address,
                                   source=ORDER_SOURCES.WECHAT)
    if not isinstance(order, Order):
        return jsonify(message='Failed',
                       error='编号为{}的商品已售光, 请重新提交'.format(order['item_id']))

    if order.final == 0:
        order.set_paid()

    remove_from_cart([entry.item_spec_snapshot.sku for entry in order.entries],
                     user_id=str(current_user.id))
    return jsonify(message='OK',
                   order_id=str(order.id),
                   order=order.to_grouped_json())
Exemple #10
0
def create_transfer_order():
    """

    :return:
    """
    data = request.json
    entries = data.get('entries')
    user = current_user._get_current_object()
    address_id = data.get('address_id')
    if address_id:
        address = Address.objects(id=address_id).first_or_404()
    elif user.addresses:
        address = user.addresses[0]
    else:
        return jsonify(message='Failed', error=gettext('no address'))

    coin = 0
    cash = user.coin_wallet.cash if data.get('cash') else 0
    coupon_codes = data.get('coupon_codes', [])

    entries = import_entries(entries)
    order = Order.create_transfer(
        customer_id=str(user.id),
        final=0,
        entries=entries,
        address=address,
        source=ORDER_SOURCES.WECHAT,
        status=LOG_STATUS.PENDING_REVIEW,
        order_type=ORDER_TYPE.TRANSFER,
        logistic_provider=data.get('logistic_provider'),
        coupon_codes=coupon_codes,
        coin=coin,
        cash=cash)

    logistic_provider_dispatcher(order)
    return jsonify(message='OK',
                   order_id=str(order.id),
                   order=order.to_grouped_json())
Exemple #11
0
def cal_order_price():
    """
    计算订单价格
    :return:
    """
    data = request.json
    order_id = data.get('order_id')
    address_id = data.get('address_id')
    user = current_user._get_current_object()
    if address_id:
        address = Address.objects(id=address_id).first_or_404()
    elif user.addresses:
        address = user.addresses[0]
    else:
        return jsonify(message='Failed', error=gettext('no address'))

    order = Order.objects(id=order_id).first_or_404()
    order.logistic_provider = data.get('logistic_provider')
    order.coupon_codes = data.get('coupon_codes')
    order.address = address

    price = cal_order_price(order)
    result = json_templ.transfer_order_price_json(price)
    return jsonify(message='OK', order=result)
Exemple #12
0
    def download(self):
        """

        :return:
        """
        FIELDS = [
            '包裹ID', 'IMG NO', 'CTN', '下单日期', '订单ID', '订单短号', '收件人', '手机号',
            '合作物流商', 'remark', '下单备注', '估重', '渠道'
        ]

        now = datetime.datetime.now()

        status = request.args.get('status')
        query = restruct_query(request.args)
        delay_export = query.get('delay_export') and query.pop('delay_export')
        delay_type = query.get('delay_type') and query.pop('delay_type')

        try:
            logistics = Logistic.objects(is_closed=False, **query)
            if status:
                logistics = logistics.order_by(
                    'detail__%s' % LogisticDetail.attr_by_log_status[status])
        except:
            pass

        if delay_export:
            date_field = LogisticDetail.attr_by_log_status[status]
            delay_days = datetime.timedelta(days=delay_status_by_date[status])
            query = {
                'detail__%s__lt' % date_field:
                datetime.datetime.utcnow() - delay_days,
                'detail__status': status,
            }
            logistics = logistics.filter(**query).order_by('detail__%s' %
                                                           date_field)
            if delay_type:
                logistics = logistics.filter(
                    detail__delay_details__reason__contains=delay_type)

        if query.get('receiver'):
            addresses = Address.objects(
                receiver=query.get('receiver')).distince('id')
            orders = Order.commodities(address__in=addresses)
            logistics = list(
                chain.from_iterable(order.logistics for order in orders))

        if query.get('order_id'):
            orders = Order.commodities(short_id=int(query.get('order_id')))
            logistics = list(
                chain.from_iterable(order.logistics for order in orders))

        def generate():
            yield ','.join(st for st in FIELDS) + '\n'
            for logistic in logistics:
                yield ','.join([
                    str(logistic.id),
                    logistic.detail.partner_tracking_no,
                    logistic.detail.carrier_tracking_no,
                    logistic.detail.cn_tracking_no,
                    logistic.detail.cn_logistic_name,
                    format_date(logistic.detail_payment_received_date),
                    str(logistic.order.id),
                    str(logistic.order.short_id),
                    logistic.order.address.receiver,
                    logistic.order.address.mobile_number,
                    format_date(logistic.detail.processing_date),
                    format_date(logistic.detail.shipping_date),
                    format_date(logistic.detail.port_arrived_date),
                    format_date(logistic.detail.received_date),
                    format_date(logistic.detail.modified),
                    logistic.detail.partner.name
                    if logistic.detail.partner else '',
                    ';'.join([r.content for r in logistic.detail.remarks]),
                    logistic.detail.extra or '',
                    str(logistic.estimated_weight),
                    logistic.detail.channel,
                ]) + '\n'

        return Response(generate(),
                        minetype='text/csv',
                        headers={
                            'Content_Disposition':
                            'attachment;filename=%s %s.csv' %
                            (format_date(now, '%Y-%m-%d'), 'dumps_file')
                        })