def new_order(request): logger.info("Receiving new order from woocommerce...") data = json.loads(request.body.decode()) o = data["order"] logger.info(" -> order is: %s - %s (%s)", o["order_number"], o["order_key"], o["created_at"]) try: with transaction.atomic(): order, created = C2OOrder.objects.get_or_create(store_platform = 'woo', store_order_id = o["order_key"]) if created: logger.info("found new order with woo key id '%s', saving...", o["order_key"]) order.luma_id = C2OOrder.get_new_luma_id() order.notes = blank_if_none(o.get('note', '')) cust = o['customer'] addr = o.get("shipping_address", {}) order.customer_name = cust['first_name'] + " " + cust['last_name'] order.customer_email = cust.get("email", "") order.customer_telephone = o['customer'].get("billing_address", {}).get("phone", "") order.address_delivery_name = addr['first_name'] + " " + addr['last_name'] order.address_company_name = addr.get('company', '') order.address_address_line_1 = blank_if_none(addr.get('address_1', '')) order.address_address_line_2 = blank_if_none(addr.get('address_2', '')) order.address_city = blank_if_none(addr.get('city', '')) order.address_county = blank_if_none(addr.get('state', '')) order.address_postcode = blank_if_none(addr.get('postcode', '')) country = pycountry.countries.get(alpha2=addr.get('country', '')) order.address_country = country.name order.save() link = settings.HOST + '/orders/new_c2o_orders/' for item in o['line_items']: product = safe_get(C2OProduct.objects.filter(woo_variants__sku = item['sku'])) if not product: logger.warning("Can't find a WooCommerce product for %s, title: '%s' - listing_id: '%s'" % (order, item['name'], item['sku'])) send_admin_email("Order #%s - product missing!" % order.luma_id, "Can't find a WooCommerce product for order #%s, title: '%s' - listing_id: '%s'" % (order.luma_id, item['name'], item['sku'])) continue size_info = safe_get(list(filter(lambda m: m['key'] == 'pa_size', item['meta']))) if not size_info: raise Exception("Can't find size meta in WooCommerce order item! (%s - %s)" % (item['name'], item['sku'])) size = size_info['value'] C2OOrderItem.objects.create(order = order, product_id = product.unique_id, size = convert_to_c2o_size(size), quantity = item['quantity']) send_admin_email("New order from WooCommerce", "Your new WooCommerce order can be found here: %s" % link) else: logger.warning("order with woo key '%s' already exists!", o["order_key"]) send_admin_email("Order duplicated from WooCommerce", "Order with woo key '%s' already exists!" % o["order_key"]) except: logger.error(get_exception_trace()) return HttpResponseServerError() return HttpResponse("ok!")
def update_order_status(order): logger.info("checking status for %s...", order) api = C2OApi(settings.C2O_API_KEY) success, messages = api.check_order_status(order) if success: if order.c2o_status == 'Dispatched': try: order.status = C2OOrder.STATUS_DISPATCHED logger.info("%s c2o status is now %s!", order, order.c2o_status) send_admin_email("Order #%s dispatched" % order.luma_id, "C2O service has dispatched order #%s.\nTracking link is: %s" % (order.luma_id, order.tracking_link)) order.save() if order.store_platform == 'etsy': logger.info("marking Etsy order status as shipped...") etsy = EtsyAPI(settings.ETSY_SHOP_ID, settings.ETSY_CLIENT_KEY, settings.ETSY_CLIENT_SECRET, settings.ETSY_RESOURCE_OWNER_KEY, settings.ETSY_RESOURCE_OWNER_SECRET) etsy.mark_order_as_shipped(order.store_order_id) except: logger.error("Can't update order dispatch status: %s", get_exception_trace()) else: logger.info("could not fetch status: %s", '\n'.join(messages))
def check_order_status(self, order): data = {"api_key": self.api_key, "order": {"your_order_id": order.luma_id}} try: json_data = json.dumps(data) req = urllib.request.Request( "https://www.clothes2order.com/api/fetch-order/", data=json_data.encode("utf8"), headers={"Content-Type": "application/json", "Accept": "application/json"}, ) response = urllib.request.urlopen(req) order.response_body = response.read() messages = self._process_fetch_response(order, order.response_body) return True, messages except HTTPError as he: error = he.read() logger.error(error) messages = [error] except Exception as e: logger.error(get_exception_trace()) messages = [str(e)] return False, messages
# consumer_secret=settings.WOO_CONSUMER_SECRET, # timeout=60 #) #data = wcapi.get("products?filter[limit]=1000") #f = open('woo_products.json', 'wt') #f.write(data.text) #sys.exit(0) data = open('woo_products.json', 'rt').read() data_json = json.loads(data) items = data_json['products'] logger.info("Found %d items", len(items)) saved = 0 for i in items: slug_title = snake_string(i['title']) product, created = C2OProduct.objects.get_or_create(unique_id=slug_title) if created: product.sku_name = "Gildan Men's Ring Spun, SoftStyle T-Shirt" product.woo_listing_id = i['sku'] product.title = i['title'] product.description = i['description'] product.save() product.woo_variants.all().delete() for var in i['variations']: WooVariantSku.objects.create(product = product, sku = var['sku']) saved += 1 logger.info("Saved %d products", saved) except: err = get_exception_trace() logger.error(err)
def send_order(self, order): data = { "api_key": self.api_key, "order": {"order_id": order.luma_id, "order_notes": order.notes, "delivery_method": order.delivery_method}, "customer": { "name": order.customer_name, "email": order.customer_email, "telephone": order.customer_telephone, }, "address": { "delivery_name": order.address_delivery_name, "company_name": order.address_company_name, "address_line_1": order.address_address_line_1, "address_line_2": order.address_address_line_2, "city": order.address_city, "postcode": order.address_postcode, "county": order.address_county, "country": order.address_country, }, "products": {"product": []}, } items = [] for item in order.items.all(): product = item.get_product() item_data = { "sku": item.c2o_sku, "quantity": "%s" % item.quantity, "logos": { "logo": [ { "unique_id": product.unique_id, "file": product.file_url, "position": product.print_position, "width": "%s" % product.print_width, "type": product.print_type, } ] }, } items.append(item_data) data["products"]["product"] = items try: logger.debug(data) json_data = json.dumps(data) order.request_json = json_data order.save() req = urllib.request.Request( "https://www.clothes2order.com/api/post-order/", data=json_data.encode("utf8"), headers={"Content-Type": "application/json", "Accept": "application/json"}, ) response = urllib.request.urlopen(req) order.response_body = response.read() logger.debug(order.response_body) messages = self._process_send_response(order, order.response_body) return True, messages except HTTPError as he: error = he.read() if he.code == 400: messages = self._process_send_response(order, error) else: messages = [error] logger.error(error) except Exception as e: logger.error(get_exception_trace()) messages = [str(e)] logger.error("messages:\n%s" % messages) order.status = order.STATUS_ERROR order.save() return False, messages
def send_admin_email(subj, text): try: send_mail(settings.EMAIL_SUBJECT_PREFIX + subj, text, settings.EMAIL_SENDER, [settings.ADMIN_EMAIL], fail_silently=False) except Exception as e: logger.error(get_exception_trace())