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