Ejemplo n.º 1
0
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!")
Ejemplo n.º 2
0
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))
Ejemplo n.º 3
0
    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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
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())