Skip to content

Instantly share code, notes, and snippets.

@cfc603
Created August 11, 2017 14:54
Show Gist options
  • Save cfc603/b2f7a58c3c059de7aaae0de5ef39a770 to your computer and use it in GitHub Desktop.
Save cfc603/b2f7a58c3c059de7aaae0de5ef39a770 to your computer and use it in GitHub Desktop.

Revisions

  1. cfc603 created this gist Aug 11, 2017.
    352 changes: 352 additions & 0 deletions shopify_import.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,352 @@
    import csv
    import re
    import unicodedata

    from unipath import Path

    DIR = Path.cwd()


    QB_FILE = Path(DIR, "from_qb.csv")
    WEBSITE_FILE = Path(DIR, "from_website.csv")

    SHOPIFY_FILE = Path(DIR, "shopify_import.csv")


    class QuickBooksItem(object):

    @classmethod
    def create_from_import(cls, row):
    instance = cls()
    instance.row = row
    return instance

    @property
    def inventory(self):
    if not hasattr(self, "_inventory"):
    self._inventory = int(self.row["Quantity On Hand"])
    return self._inventory

    @property
    def sku(self):
    if not hasattr(self, "_sku"):
    self._sku = self.row["Item"]
    return self._sku


    class WebsiteItem(object):

    @classmethod
    def create_from_import(cls, row):
    instance = cls()
    instance.row = row
    return instance

    @property
    def dimensions(self):
    if not hasattr(self, "_dimensions"):
    self._dimensions = self.row["dimensions"]
    return self._dimensions

    @property
    def finish(self):
    if not hasattr(self, "_finish"):
    self._finish = self.row["finish"]
    return self._finish

    @property
    def item_collection(self):
    if not hasattr(self, "_item_collection"):
    self._item_collection = self.row["item_collection"]
    return self._item_collection

    @property
    def image_link(self):
    if not hasattr(self, "_image_link"):
    self._image_link = self.row["image_link"]
    return self._image_link

    @property
    def manufactured_by(self):
    if not hasattr(self, "_manufactured_by"):
    self._manufactured_by = self.row["manufactured_by"]
    return self._manufactured_by

    @property
    def price(self):
    if not hasattr(self, "_price"):
    self._price = float(self.row["price"])
    return self._price

    @property
    def socket(self):
    if not hasattr(self, "_socket"):
    self._socket = self.row["socket"]
    return self._socket

    @property
    def title(self):
    if not hasattr(self, "_title"):
    self._title = "{} {}".format(self.manufactured_by, self.sku)
    return self._title

    @property
    def vendor_item_no(self):
    if not hasattr(self, "_vendor_item_no"):
    self._vendor_item_no = self.row["vendor_item_no"]
    return self._vendor_item_no


    class ShopifyItem(object):

    FIELDNAMES = [
    "Handle",
    "Title",
    "Body (HTML)",
    "Vendor",
    "Type",
    "Tags",
    "Published",
    "Option 1 Name",
    "Option 1 Value",
    "Option 2 Name",
    "Option 2 Value",
    "Option 3 Name",
    "Option 3 Value",
    "Variant SKU",
    "Variant Grams",
    "Variant Inventory Tracker",
    "Variant Inventory Quantity",
    "Variant Inventory Policy",
    "Variant Fulfillment Service",
    "Variant Price",
    "Variant Compare at Price",
    "Variant Requires Shipping",
    "Variant Taxable",
    "Variant Barcode",
    "Image Src",
    "Image Position",
    "Image Alt Text",
    "Gift Card",
    "Variant Image",
    "Variant Weight Unit",
    "SEO Title",
    "SEO Description",
    "Google Shopping / Google Product Category",
    "Google Shopping / Gender",
    "Google Shopping / Age Group",
    "Google Shopping / MPN",
    "Google Shopping / Adwords Grouping",
    "Collection",
    ]

    item_type = "Lighting"
    option_1_name = "Title"
    option_1_value = "Default Title"
    option_2_name = ""
    option_2_value = ""
    option_3_name = ""
    option_3_value = ""
    variant_grams = ""
    variant_inventory_tracker = "shopify"
    variant_inventory_policy = "deny"
    variant_fulfillment_service = "manual"
    variant_compare_at_price = ""
    variant_requires_shipping = "TRUE"
    variant_taxable = "TRUE"
    variant_barcode = ""
    image_position = 1
    image_alt_text = ""
    gift_card = "FALSE"
    variant_image = ""
    variant_weight_unit = "lb"
    seo_description = ""
    google_product_category = ""
    gender = ""
    age_group = ""
    mpn = ""
    adwords_grouping = ""
    collection = "Shop Lighting"

    @classmethod
    def create_from_import(cls, website_item, quickbooks_item):
    instance = cls()
    instance.website_item = website_item
    instance.quickbooks_item = quickbooks_item
    return instance

    @property
    def body(self):
    if not hasattr(self, "_body"):
    self._body = ""
    if self.website_item.item_collection:
    self._body += "<p>Item Collection: {}</p>\n".format(
    self.website_item.item_collection
    )

    if self.website_item.finish:
    self._body += "<p>Finish: {}</p>\n".format(
    self.website_item.finish
    )

    if self.website_item.dimensions:
    self._body += "<p>Dimensions: {}</p>\n".format(
    self.website_item.dimensions
    )

    if self.website_item.socket:
    self._body += "<p>Socket: {}</p>".format(
    self.website_item.socket
    )

    if self._body.endswith("\n"):
    self._body = self._body[:-1]

    return self._body

    @property
    def handle(self):
    if not hasattr(self, "_handle"):
    self._handle = unicodedata.normalize('NFKC', unicode(self.title))
    self._handle = re.sub(
    r'[^\w\s-]', '', self._handle
    ).strip().lower()
    self._handle = re.sub(r'[-\s]+', '-', self._handle)
    return self._handle

    @property
    def image_source(self):
    if not hasattr(self, "_image_source"):
    self._image_source = self.website_item.image_link
    return self._image_source

    @property
    def published(self):
    if not hasattr(self, "_published"):
    if self.variant_inventory_quantity > 0:
    self._published = "TRUE"
    else:
    self._published = "FALSE"
    return self._published

    @property
    def seo_title(self):
    if not hasattr(self, "_seo_title"):
    self._seo_title = self.title
    return self._seo_title

    @property
    def tags(self):
    if not hasattr(self, "_tags"):
    tags = []
    tag_categories = [
    self.website_item.manufactured_by,
    self.website_item.finish,
    self.website_item.item_collection
    ]

    for tag_category in tag_categories:
    if tag_category:
    for tag in tag_category.split(","):
    tags.append(tag)

    self._tags = ", ".join(tags)
    return self._tags

    @property
    def title(self):
    if not hasattr(self, "_title"):
    self._title = "{} {}".format(self.vendor, self.variant_sku)
    return self._title

    @property
    def variant_inventory_quantity(self):
    if not hasattr(self, "_variant_inventory_quantity"):
    self._variant_inventory_quantity = self.quickbooks_item.inventory
    return self._variant_inventory_quantity

    @property
    def variant_price(self):
    if not hasattr(self, "_variant_price"):
    self._variant_price = self.website_item.price
    return self._variant_price

    @property
    def variant_sku(self):
    if not hasattr(self, "_variant_sku"):
    self._variant_sku = self.website_item.vendor_item_no
    return self._variant_sku

    @property
    def vendor(self):
    if not hasattr(self, "_vendor"):
    self._vendor = self.website_item.manufactured_by
    return self._vendor

    def to_dict(self):
    return {
    "Handle": self.handle,
    "Title": self.title,
    "Body (HTML)": self.body,
    "Vendor": self.vendor,
    "Type": self.item_type,
    "Tags": self.tags,
    "Published": self.published,
    "Option 1 Name": self.option_1_name,
    "Option 1 Value": self.option_1_value,
    "Option 2 Name": self.option_2_name,
    "Option 2 Value": self.option_2_value,
    "Option 3 Name": self.option_3_name,
    "Option 3 Value": self.option_3_value,
    "Variant SKU": self.variant_sku,
    "Variant Grams": self.variant_grams,
    "Variant Inventory Tracker": self.variant_inventory_tracker,
    "Variant Inventory Quantity": self.variant_inventory_quantity,
    "Variant Inventory Policy": self.variant_inventory_policy,
    "Variant Fulfillment Service": self.variant_fulfillment_service,
    "Variant Price": self.variant_price,
    "Variant Compare at Price": self.variant_compare_at_price,
    "Variant Requires Shipping": self.variant_requires_shipping,
    "Variant Taxable": self.variant_taxable,
    "Variant Barcode": self.variant_barcode,
    "Image Src": self.image_source,
    "Image Position": self.image_position,
    "Image Alt Text": self.image_alt_text,
    "Gift Card": self.gift_card,
    "Variant Image": self.variant_image,
    "Variant Weight Unit": self.variant_weight_unit,
    "SEO Title": self.seo_title,
    "SEO Description": self.seo_description,
    "Google Shopping / Google Product Category": self.google_product_category,
    "Google Shopping / Gender": self.gender,
    "Google Shopping / Age Group": self.age_group,
    "Google Shopping / MPN": self.mpn,
    "Google Shopping / Adwords Grouping": self.adwords_grouping,
    "Collection": self.collection,
    }

    with open(SHOPIFY_FILE, "w") as shopify_file:
    writer = csv.DictWriter(shopify_file, ShopifyItem.FIELDNAMES)
    writer.writeheader()

    with open(WEBSITE_FILE) as website_file:
    website_file_reader = csv.DictReader(website_file)

    for website_file_row in website_file_reader:
    website_item = WebsiteItem.create_from_import(website_file_row)

    with open(QB_FILE) as quickbooks_file:
    quickbooks_file_reader = csv.DictReader(quickbooks_file)

    for quickbooks_file_row in quickbooks_file_reader:
    quickbooks_item = QuickBooksItem.create_from_import(
    quickbooks_file_row
    )

    if website_item.vendor_item_no == quickbooks_item.sku:
    # import pdb
    # pdb.set_trace()
    shopify_item = ShopifyItem.create_from_import(
    website_item, quickbooks_item
    )
    writer.writerow(shopify_item.to_dict())